diff options
| author | Steven Fackler <[email protected]> | 2016-11-06 23:19:58 -0800 |
|---|---|---|
| committer | Steven Fackler <[email protected]> | 2016-11-06 23:19:58 -0800 |
| commit | 8f7df7b2057bc31dfc3d6a2b83ee83116a8eb93a (patch) | |
| tree | b8fb935fe784fc1b7a14c23308309d09c3c206ba /openssl/src/x509/extension.rs | |
| parent | More extension progress (diff) | |
| download | rust-openssl-8f7df7b2057bc31dfc3d6a2b83ee83116a8eb93a.tar.xz rust-openssl-8f7df7b2057bc31dfc3d6a2b83ee83116a8eb93a.zip | |
Add SubjectAlternativeName
Diffstat (limited to 'openssl/src/x509/extension.rs')
| -rw-r--r-- | openssl/src/x509/extension.rs | 64 |
1 files changed, 64 insertions, 0 deletions
diff --git a/openssl/src/x509/extension.rs b/openssl/src/x509/extension.rs index 0af8ec11..7a09ddbc 100644 --- a/openssl/src/x509/extension.rs +++ b/openssl/src/x509/extension.rs @@ -556,6 +556,70 @@ impl AuthorityKeyIdentifier { } } +pub struct SubjectAlternativeName { + critical: bool, + names: Vec<String>, +} + +impl SubjectAlternativeName { + pub fn new() -> SubjectAlternativeName { + SubjectAlternativeName { + critical: false, + names: vec![], + } + } + + pub fn critical(&mut self) -> &mut SubjectAlternativeName { + self.critical = true; + self + } + + pub fn email(&mut self, email: &str) -> &mut SubjectAlternativeName { + self.names.push(format!("email:{}", email)); + self + } + + pub fn uri(&mut self, uri: &str) -> &mut SubjectAlternativeName { + self.names.push(format!("URI:{}", uri)); + self + } + + pub fn dns(&mut self, dns: &str) -> &mut SubjectAlternativeName { + self.names.push(format!("DNS:{}", dns)); + self + } + + pub fn rid(&mut self, rid: &str) -> &mut SubjectAlternativeName { + self.names.push(format!("RID:{}", rid)); + self + } + + pub fn ip(&mut self, ip: &str) -> &mut SubjectAlternativeName { + self.names.push(format!("IP:{}", ip)); + self + } + + pub fn dir_name(&mut self, dir_name: &str) -> &mut SubjectAlternativeName { + self.names.push(format!("dirName:{}", dir_name)); + self + } + + pub fn other_name(&mut self, other_name: &str) -> &mut SubjectAlternativeName { + self.names.push(format!("otherName:{}", other_name)); + self + } + + pub fn build(&self, ctx: &X509v3Context) -> Result<X509Extension, ErrorStack> { + let mut value = String::new(); + let mut first = true; + append(&mut value, &mut first, self.critical, "critical"); + for name in &self.names { + append(&mut value, &mut first, true, name); + } + X509Extension::new_nid(None, Some(ctx), nid::SUBJECT_ALT_NAME, &value) + } +} + fn append(value: &mut String, first: &mut bool, should: bool, element: &str) { if !should { return; |