From 14a2f5c5e9541d30b825bd7e2dc6961bc11e6200 Mon Sep 17 00:00:00 2001 From: Jethro Beekman Date: Tue, 30 Jun 2015 17:23:57 -0700 Subject: Move X509 extensions to seperate module, implement ToString instead of custom AsStr --- openssl/src/x509/extension.rs | 69 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 69 insertions(+) create mode 100644 openssl/src/x509/extension.rs (limited to 'openssl/src/x509/extension.rs') diff --git a/openssl/src/x509/extension.rs b/openssl/src/x509/extension.rs new file mode 100644 index 00000000..b7f5fc52 --- /dev/null +++ b/openssl/src/x509/extension.rs @@ -0,0 +1,69 @@ +use std::fmt; + +#[derive(Clone)] +pub enum Extension { + KeyUsage(Vec), + ExtKeyUsage(Vec), +} + +#[derive(Clone,Copy)] +pub enum KeyUsageOption { + DigitalSignature, + NonRepudiation, + KeyEncipherment, + DataEncipherment, + KeyAgreement, + KeyCertSign, + CRLSign, + EncipherOnly, + DecipherOnly, +} + +impl fmt::Display for KeyUsageOption { + fn fmt(&self, f: &mut fmt::Formatter) -> Result<(), fmt::Error> { + f.pad(match self { + &KeyUsageOption::DigitalSignature => "digitalSignature", + &KeyUsageOption::NonRepudiation => "nonRepudiation", + &KeyUsageOption::KeyEncipherment => "keyEncipherment", + &KeyUsageOption::DataEncipherment => "dataEncipherment", + &KeyUsageOption::KeyAgreement => "keyAgreement", + &KeyUsageOption::KeyCertSign => "keyCertSign", + &KeyUsageOption::CRLSign => "cRLSign", + &KeyUsageOption::EncipherOnly => "encipherOnly", + &KeyUsageOption::DecipherOnly => "decipherOnly", + }) + } +} + +#[derive(Clone,Copy)] +pub enum ExtKeyUsageOption { + ServerAuth, + ClientAuth, + CodeSigning, + EmailProtection, + TimeStamping, + MsCodeInd, + MsCodeCom, + MsCtlSign, + MsSgc, + MsEfs, + NsSgc, +} + +impl fmt::Display for ExtKeyUsageOption { + fn fmt(&self, f: &mut fmt::Formatter) -> Result<(), fmt::Error> { + f.pad(match self { + &ExtKeyUsageOption::ServerAuth => "serverAuth", + &ExtKeyUsageOption::ClientAuth => "clientAuth", + &ExtKeyUsageOption::CodeSigning => "codeSigning", + &ExtKeyUsageOption::EmailProtection => "emailProtection", + &ExtKeyUsageOption::TimeStamping => "timeStamping", + &ExtKeyUsageOption::MsCodeInd => "msCodeInd", + &ExtKeyUsageOption::MsCodeCom => "msCodeCom", + &ExtKeyUsageOption::MsCtlSign => "msCTLSign", + &ExtKeyUsageOption::MsSgc => "msSGC", + &ExtKeyUsageOption::MsEfs => "msEFS", + &ExtKeyUsageOption::NsSgc =>"nsSGC", + }) + } +} -- cgit v1.2.3 From 8d1abf5156840cb718f637959a1f98f499a64519 Mon Sep 17 00:00:00 2001 From: Jethro Beekman Date: Tue, 30 Jun 2015 18:54:48 -0700 Subject: Implement "extensions" field in X509generator, and change existing extensions to use that --- openssl/src/x509/extension.rs | 42 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 42 insertions(+) (limited to 'openssl/src/x509/extension.rs') diff --git a/openssl/src/x509/extension.rs b/openssl/src/x509/extension.rs index b7f5fc52..4f8a3c3b 100644 --- a/openssl/src/x509/extension.rs +++ b/openssl/src/x509/extension.rs @@ -1,4 +1,11 @@ use std::fmt; +use nid::Nid; + +#[derive(Clone,Copy,Hash,PartialEq,Eq)] +pub enum ExtensionType { + KeyUsage, + ExtKeyUsage, +} #[derive(Clone)] pub enum Extension { @@ -6,6 +13,41 @@ pub enum Extension { ExtKeyUsage(Vec), } +impl Extension { + pub fn get_type(&self) -> ExtensionType { + match self { + &Extension::KeyUsage(_) => ExtensionType::KeyUsage, + &Extension::ExtKeyUsage(_) => ExtensionType::ExtKeyUsage, + } + } + + pub fn get_nid(&self) -> Nid { + match self { + &Extension::KeyUsage(_) => Nid::KeyUsage, + &Extension::ExtKeyUsage(_) => Nid::ExtendedKeyUsage, + } + } +} + +// FIXME: This would be nicer as a method on Iterator. This can +// eventually be replaced by the successor to std::slice::SliceConcatExt.connect +fn join,T: ToString>(iter: I, sep: &str) -> String { + iter.enumerate().fold(String::new(), |mut acc, (idx, v)| { + if idx > 0 { acc.push_str(sep) }; + acc.push_str(&v.to_string()); + acc + }) +} + +impl ToString for Extension { + fn to_string(&self) -> String { + match self { + &Extension::KeyUsage(ref purposes) => join(purposes.iter(),","), + &Extension::ExtKeyUsage(ref purposes) => join(purposes.iter(),","), + } + } +} + #[derive(Clone,Copy)] pub enum KeyUsageOption { DigitalSignature, -- cgit v1.2.3 From 53b868697a754229ba457908f29af5e8fd83404a Mon Sep 17 00:00:00 2001 From: Jethro Beekman Date: Tue, 30 Jun 2015 22:25:00 -0700 Subject: Implement arbitrary X509 Extended Key Usage values --- openssl/src/x509/extension.rs | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) (limited to 'openssl/src/x509/extension.rs') diff --git a/openssl/src/x509/extension.rs b/openssl/src/x509/extension.rs index 4f8a3c3b..66b218ad 100644 --- a/openssl/src/x509/extension.rs +++ b/openssl/src/x509/extension.rs @@ -77,7 +77,7 @@ impl fmt::Display for KeyUsageOption { } } -#[derive(Clone,Copy)] +#[derive(Clone)] pub enum ExtKeyUsageOption { ServerAuth, ClientAuth, @@ -90,6 +90,8 @@ pub enum ExtKeyUsageOption { MsSgc, MsEfs, NsSgc, + /// An arbitrary key usage by OID. + Other(String), } impl fmt::Display for ExtKeyUsageOption { @@ -106,6 +108,7 @@ impl fmt::Display for ExtKeyUsageOption { &ExtKeyUsageOption::MsSgc => "msSGC", &ExtKeyUsageOption::MsEfs => "msEFS", &ExtKeyUsageOption::NsSgc =>"nsSGC", + &ExtKeyUsageOption::Other(ref s) => &s[..], }) } } -- cgit v1.2.3 From e367567d00cdbd6b12906a424971146f6c3eea28 Mon Sep 17 00:00:00 2001 From: Jethro Beekman Date: Tue, 30 Jun 2015 22:37:49 -0700 Subject: Add arbitrary X509 extensions by NID --- openssl/src/x509/extension.rs | 5 +++++ 1 file changed, 5 insertions(+) (limited to 'openssl/src/x509/extension.rs') diff --git a/openssl/src/x509/extension.rs b/openssl/src/x509/extension.rs index 66b218ad..4576ad1a 100644 --- a/openssl/src/x509/extension.rs +++ b/openssl/src/x509/extension.rs @@ -5,12 +5,14 @@ use nid::Nid; pub enum ExtensionType { KeyUsage, ExtKeyUsage, + OtherNid(Nid), } #[derive(Clone)] pub enum Extension { KeyUsage(Vec), ExtKeyUsage(Vec), + OtherNid(Nid,String), } impl Extension { @@ -18,6 +20,7 @@ impl Extension { match self { &Extension::KeyUsage(_) => ExtensionType::KeyUsage, &Extension::ExtKeyUsage(_) => ExtensionType::ExtKeyUsage, + &Extension::OtherNid(nid,_) => ExtensionType::OtherNid(nid), } } @@ -25,6 +28,7 @@ impl Extension { match self { &Extension::KeyUsage(_) => Nid::KeyUsage, &Extension::ExtKeyUsage(_) => Nid::ExtendedKeyUsage, + &Extension::OtherNid(nid,_) => nid, } } } @@ -44,6 +48,7 @@ impl ToString for Extension { match self { &Extension::KeyUsage(ref purposes) => join(purposes.iter(),","), &Extension::ExtKeyUsage(ref purposes) => join(purposes.iter(),","), + &Extension::OtherNid(_,ref value) => value.clone(), } } } -- cgit v1.2.3 From b46574b63587dab26eb46aa8f45b2dc830053988 Mon Sep 17 00:00:00 2001 From: Jethro Beekman Date: Tue, 30 Jun 2015 23:00:48 -0700 Subject: Add arbitrary X509 extensions by OID string --- openssl/src/x509/extension.rs | 24 +++++++++++++++++++----- 1 file changed, 19 insertions(+), 5 deletions(-) (limited to 'openssl/src/x509/extension.rs') diff --git a/openssl/src/x509/extension.rs b/openssl/src/x509/extension.rs index 4576ad1a..78058b72 100644 --- a/openssl/src/x509/extension.rs +++ b/openssl/src/x509/extension.rs @@ -1,11 +1,12 @@ use std::fmt; use nid::Nid; -#[derive(Clone,Copy,Hash,PartialEq,Eq)] +#[derive(Clone,Hash,PartialEq,Eq)] pub enum ExtensionType { KeyUsage, ExtKeyUsage, OtherNid(Nid), + OtherStr(String), } #[derive(Clone)] @@ -13,6 +14,7 @@ pub enum Extension { KeyUsage(Vec), ExtKeyUsage(Vec), OtherNid(Nid,String), + OtherStr(String,String), } impl Extension { @@ -21,14 +23,25 @@ impl Extension { &Extension::KeyUsage(_) => ExtensionType::KeyUsage, &Extension::ExtKeyUsage(_) => ExtensionType::ExtKeyUsage, &Extension::OtherNid(nid,_) => ExtensionType::OtherNid(nid), + &Extension::OtherStr(ref s,_) => ExtensionType::OtherStr(s.clone()), + } + } +} + +impl ExtensionType { + pub fn get_nid(&self) -> Option { + match self { + &ExtensionType::KeyUsage => Some(Nid::KeyUsage), + &ExtensionType::ExtKeyUsage => Some(Nid::ExtendedKeyUsage), + &ExtensionType::OtherNid(nid) => Some(nid), + &ExtensionType::OtherStr(_) => None, } } - pub fn get_nid(&self) -> Nid { + pub fn get_name<'a>(&'a self) -> Option<&'a str> { match self { - &Extension::KeyUsage(_) => Nid::KeyUsage, - &Extension::ExtKeyUsage(_) => Nid::ExtendedKeyUsage, - &Extension::OtherNid(nid,_) => nid, + &ExtensionType::OtherStr(ref s) => Some(s), + _ => None, } } } @@ -49,6 +62,7 @@ impl ToString for Extension { &Extension::KeyUsage(ref purposes) => join(purposes.iter(),","), &Extension::ExtKeyUsage(ref purposes) => join(purposes.iter(),","), &Extension::OtherNid(_,ref value) => value.clone(), + &Extension::OtherStr(_,ref value) => value.clone(), } } } -- cgit v1.2.3 From f4168b1161081523705657adc4a324e533483ca3 Mon Sep 17 00:00:00 2001 From: Jethro Beekman Date: Tue, 30 Jun 2015 23:11:42 -0700 Subject: Add Subject Alternate Name extension --- openssl/src/x509/extension.rs | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) (limited to 'openssl/src/x509/extension.rs') diff --git a/openssl/src/x509/extension.rs b/openssl/src/x509/extension.rs index 78058b72..8091d058 100644 --- a/openssl/src/x509/extension.rs +++ b/openssl/src/x509/extension.rs @@ -5,6 +5,7 @@ use nid::Nid; pub enum ExtensionType { KeyUsage, ExtKeyUsage, + SubjectAltName, OtherNid(Nid), OtherStr(String), } @@ -13,6 +14,7 @@ pub enum ExtensionType { pub enum Extension { KeyUsage(Vec), ExtKeyUsage(Vec), + SubjectAltName(Vec<(AltNameOption,String)>), OtherNid(Nid,String), OtherStr(String,String), } @@ -22,6 +24,7 @@ impl Extension { match self { &Extension::KeyUsage(_) => ExtensionType::KeyUsage, &Extension::ExtKeyUsage(_) => ExtensionType::ExtKeyUsage, + &Extension::SubjectAltName(_) => ExtensionType::SubjectAltName, &Extension::OtherNid(nid,_) => ExtensionType::OtherNid(nid), &Extension::OtherStr(ref s,_) => ExtensionType::OtherStr(s.clone()), } @@ -33,6 +36,7 @@ impl ExtensionType { match self { &ExtensionType::KeyUsage => Some(Nid::KeyUsage), &ExtensionType::ExtKeyUsage => Some(Nid::ExtendedKeyUsage), + &ExtensionType::SubjectAltName => Some(Nid::SubjectAltName), &ExtensionType::OtherNid(nid) => Some(nid), &ExtensionType::OtherStr(_) => None, } @@ -61,6 +65,7 @@ impl ToString for Extension { match self { &Extension::KeyUsage(ref purposes) => join(purposes.iter(),","), &Extension::ExtKeyUsage(ref purposes) => join(purposes.iter(),","), + &Extension::SubjectAltName(ref names) => join(names.iter().map(|&(ref opt,ref val)|opt.to_string()+":"+&val),","), &Extension::OtherNid(_,ref value) => value.clone(), &Extension::OtherStr(_,ref value) => value.clone(), } @@ -131,3 +136,30 @@ impl fmt::Display for ExtKeyUsageOption { }) } } + +#[derive(Clone, Copy)] +pub enum AltNameOption { + Other, + Email, + DNS, + //X400, // Not supported by OpenSSL + Directory, + //EDIParty, // Not supported by OpenSSL + URI, + IPAddress, + RegisteredID, +} + +impl fmt::Display for AltNameOption { + fn fmt(&self, f: &mut fmt::Formatter) -> Result<(), fmt::Error> { + f.pad(match self { + &AltNameOption::Other => "otherName", + &AltNameOption::Email => "email", + &AltNameOption::DNS => "DNS", + &AltNameOption::Directory => "dirName", + &AltNameOption::URI => "URI", + &AltNameOption::IPAddress => "IP", + &AltNameOption::RegisteredID => "RID", + }) + } +} -- cgit v1.2.3 From e9cc8cb121b027a9f5faa46339820e573f2efdcf Mon Sep 17 00:00:00 2001 From: Jethro Beekman Date: Tue, 30 Jun 2015 23:13:30 -0700 Subject: Add Issuer Alternative Name extension --- openssl/src/x509/extension.rs | 5 +++++ 1 file changed, 5 insertions(+) (limited to 'openssl/src/x509/extension.rs') diff --git a/openssl/src/x509/extension.rs b/openssl/src/x509/extension.rs index 8091d058..0b050b34 100644 --- a/openssl/src/x509/extension.rs +++ b/openssl/src/x509/extension.rs @@ -6,6 +6,7 @@ pub enum ExtensionType { KeyUsage, ExtKeyUsage, SubjectAltName, + IssuerAltName, OtherNid(Nid), OtherStr(String), } @@ -15,6 +16,7 @@ pub enum Extension { KeyUsage(Vec), ExtKeyUsage(Vec), SubjectAltName(Vec<(AltNameOption,String)>), + IssuerAltName(Vec<(AltNameOption,String)>), OtherNid(Nid,String), OtherStr(String,String), } @@ -25,6 +27,7 @@ impl Extension { &Extension::KeyUsage(_) => ExtensionType::KeyUsage, &Extension::ExtKeyUsage(_) => ExtensionType::ExtKeyUsage, &Extension::SubjectAltName(_) => ExtensionType::SubjectAltName, + &Extension::IssuerAltName(_) => ExtensionType::IssuerAltName, &Extension::OtherNid(nid,_) => ExtensionType::OtherNid(nid), &Extension::OtherStr(ref s,_) => ExtensionType::OtherStr(s.clone()), } @@ -37,6 +40,7 @@ impl ExtensionType { &ExtensionType::KeyUsage => Some(Nid::KeyUsage), &ExtensionType::ExtKeyUsage => Some(Nid::ExtendedKeyUsage), &ExtensionType::SubjectAltName => Some(Nid::SubjectAltName), + &ExtensionType::IssuerAltName => Some(Nid::IssuerAltName), &ExtensionType::OtherNid(nid) => Some(nid), &ExtensionType::OtherStr(_) => None, } @@ -66,6 +70,7 @@ impl ToString for Extension { &Extension::KeyUsage(ref purposes) => join(purposes.iter(),","), &Extension::ExtKeyUsage(ref purposes) => join(purposes.iter(),","), &Extension::SubjectAltName(ref names) => join(names.iter().map(|&(ref opt,ref val)|opt.to_string()+":"+&val),","), + &Extension::IssuerAltName(ref names) => join(names.iter().map(|&(ref opt,ref val)|opt.to_string()+":"+&val),","), &Extension::OtherNid(_,ref value) => value.clone(), &Extension::OtherStr(_,ref value) => value.clone(), } -- cgit v1.2.3 From 93eb0cfa2d4f7fe2c1091ad972c48e18b140807d Mon Sep 17 00:00:00 2001 From: Jethro Beekman Date: Tue, 30 Jun 2015 23:30:15 -0700 Subject: Add documentation on X509 Extensions --- openssl/src/x509/extension.rs | 42 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 42 insertions(+) (limited to 'openssl/src/x509/extension.rs') diff --git a/openssl/src/x509/extension.rs b/openssl/src/x509/extension.rs index 0b050b34..e6d992a1 100644 --- a/openssl/src/x509/extension.rs +++ b/openssl/src/x509/extension.rs @@ -1,6 +1,10 @@ use std::fmt; use nid::Nid; +/// Type-only version of the `Extension` enum. +/// +/// See the `Extension` documentation for more information on the different +/// variants. #[derive(Clone,Hash,PartialEq,Eq)] pub enum ExtensionType { KeyUsage, @@ -11,13 +15,42 @@ pub enum ExtensionType { OtherStr(String), } +/// A X.509 v3 certificate extension. +/// +/// Only one extension of each type is allow in a certificate. +/// See RFC 3280 for more information about extensions. #[derive(Clone)] pub enum Extension { + /// The purposes of the key contained in the certificate KeyUsage(Vec), + /// The extended purposes of the key contained in the certificate ExtKeyUsage(Vec), + /// Subject Alternative Names SubjectAltName(Vec<(AltNameOption,String)>), + /// Issuer Alternative Names IssuerAltName(Vec<(AltNameOption,String)>), + /// Arbitrary extensions by NID. See `man x509v3_config` for value syntax. + /// + /// You must not use this to add extensions which this enum can express directly. + /// + /// ``` + /// use openssl::x509::extension::Extension::*; + /// use openssl::nid::Nid; + /// + /// # let generator = openssl::x509::X509Generator::new(); + /// generator.add_extension(OtherNid(Nid::BasicConstraints,"critical,CA:TRUE".to_owned())); + /// ``` OtherNid(Nid,String), + /// Arbitrary extensions by OID string. See `man ASN1_generate_nconf` for value syntax. + /// + /// You must not use this to add extensions which this enum can express directly. + /// + /// ``` + /// use openssl::x509::extension::Extension::*; + /// + /// # let generator = openssl::x509::X509Generator::new(); + /// generator.add_extension(OtherStr("2.999.2".to_owned(),"ASN1:UTF8:example value".to_owned())); + /// ``` OtherStr(String,String), } @@ -144,6 +177,15 @@ impl fmt::Display for ExtKeyUsageOption { #[derive(Clone, Copy)] pub enum AltNameOption { + /// The value is specified as OID;content. See `man ASN1_generate_nconf` for more information on the content syntax. + /// + /// ``` + /// use openssl::x509::extension::Extension::*; + /// use openssl::x509::extension::AltNameOption::Other as OtherName; + /// + /// # let generator = openssl::x509::X509Generator::new(); + /// generator.add_extension(SubjectAltName(vec![(OtherName,"2.999.3;ASN1:UTF8:some other name".to_owned())])); + /// ``` Other, Email, DNS, -- cgit v1.2.3 From f9a836fae9a8b58513e4e0de6e27bf363bc88740 Mon Sep 17 00:00:00 2001 From: Jethro Beekman Date: Tue, 30 Jun 2015 23:30:45 -0700 Subject: tabs to spaces --- openssl/src/x509/extension.rs | 152 +++++++++++++++++++++--------------------- 1 file changed, 76 insertions(+), 76 deletions(-) (limited to 'openssl/src/x509/extension.rs') diff --git a/openssl/src/x509/extension.rs b/openssl/src/x509/extension.rs index e6d992a1..3faa0996 100644 --- a/openssl/src/x509/extension.rs +++ b/openssl/src/x509/extension.rs @@ -7,12 +7,12 @@ use nid::Nid; /// variants. #[derive(Clone,Hash,PartialEq,Eq)] pub enum ExtensionType { - KeyUsage, - ExtKeyUsage, - SubjectAltName, - IssuerAltName, - OtherNid(Nid), - OtherStr(String), + KeyUsage, + ExtKeyUsage, + SubjectAltName, + IssuerAltName, + OtherNid(Nid), + OtherStr(String), } /// A X.509 v3 certificate extension. @@ -21,70 +21,70 @@ pub enum ExtensionType { /// See RFC 3280 for more information about extensions. #[derive(Clone)] pub enum Extension { - /// The purposes of the key contained in the certificate - KeyUsage(Vec), - /// The extended purposes of the key contained in the certificate - ExtKeyUsage(Vec), - /// Subject Alternative Names - SubjectAltName(Vec<(AltNameOption,String)>), - /// Issuer Alternative Names - IssuerAltName(Vec<(AltNameOption,String)>), - /// Arbitrary extensions by NID. See `man x509v3_config` for value syntax. - /// - /// You must not use this to add extensions which this enum can express directly. - /// + /// The purposes of the key contained in the certificate + KeyUsage(Vec), + /// The extended purposes of the key contained in the certificate + ExtKeyUsage(Vec), + /// Subject Alternative Names + SubjectAltName(Vec<(AltNameOption,String)>), + /// Issuer Alternative Names + IssuerAltName(Vec<(AltNameOption,String)>), + /// Arbitrary extensions by NID. See `man x509v3_config` for value syntax. + /// + /// You must not use this to add extensions which this enum can express directly. + /// /// ``` /// use openssl::x509::extension::Extension::*; - /// use openssl::nid::Nid; + /// use openssl::nid::Nid; /// /// # let generator = openssl::x509::X509Generator::new(); /// generator.add_extension(OtherNid(Nid::BasicConstraints,"critical,CA:TRUE".to_owned())); /// ``` - OtherNid(Nid,String), - /// Arbitrary extensions by OID string. See `man ASN1_generate_nconf` for value syntax. - /// - /// You must not use this to add extensions which this enum can express directly. - /// + OtherNid(Nid,String), + /// Arbitrary extensions by OID string. See `man ASN1_generate_nconf` for value syntax. + /// + /// You must not use this to add extensions which this enum can express directly. + /// /// ``` /// use openssl::x509::extension::Extension::*; /// /// # let generator = openssl::x509::X509Generator::new(); /// generator.add_extension(OtherStr("2.999.2".to_owned(),"ASN1:UTF8:example value".to_owned())); /// ``` - OtherStr(String,String), + OtherStr(String,String), } impl Extension { - pub fn get_type(&self) -> ExtensionType { - match self { - &Extension::KeyUsage(_) => ExtensionType::KeyUsage, - &Extension::ExtKeyUsage(_) => ExtensionType::ExtKeyUsage, - &Extension::SubjectAltName(_) => ExtensionType::SubjectAltName, - &Extension::IssuerAltName(_) => ExtensionType::IssuerAltName, - &Extension::OtherNid(nid,_) => ExtensionType::OtherNid(nid), - &Extension::OtherStr(ref s,_) => ExtensionType::OtherStr(s.clone()), - } - } + pub fn get_type(&self) -> ExtensionType { + match self { + &Extension::KeyUsage(_) => ExtensionType::KeyUsage, + &Extension::ExtKeyUsage(_) => ExtensionType::ExtKeyUsage, + &Extension::SubjectAltName(_) => ExtensionType::SubjectAltName, + &Extension::IssuerAltName(_) => ExtensionType::IssuerAltName, + &Extension::OtherNid(nid,_) => ExtensionType::OtherNid(nid), + &Extension::OtherStr(ref s,_) => ExtensionType::OtherStr(s.clone()), + } + } } impl ExtensionType { - pub fn get_nid(&self) -> Option { - match self { - &ExtensionType::KeyUsage => Some(Nid::KeyUsage), - &ExtensionType::ExtKeyUsage => Some(Nid::ExtendedKeyUsage), - &ExtensionType::SubjectAltName => Some(Nid::SubjectAltName), - &ExtensionType::IssuerAltName => Some(Nid::IssuerAltName), - &ExtensionType::OtherNid(nid) => Some(nid), - &ExtensionType::OtherStr(_) => None, - } - } + pub fn get_nid(&self) -> Option { + match self { + &ExtensionType::KeyUsage => Some(Nid::KeyUsage), + &ExtensionType::ExtKeyUsage => Some(Nid::ExtendedKeyUsage), + &ExtensionType::SubjectAltName => Some(Nid::SubjectAltName), + &ExtensionType::IssuerAltName => Some(Nid::IssuerAltName), + &ExtensionType::OtherNid(nid) => Some(nid), + &ExtensionType::OtherStr(_) => None, + } + } - pub fn get_name<'a>(&'a self) -> Option<&'a str> { - match self { - &ExtensionType::OtherStr(ref s) => Some(s), - _ => None, - } - } + pub fn get_name<'a>(&'a self) -> Option<&'a str> { + match self { + &ExtensionType::OtherStr(ref s) => Some(s), + _ => None, + } + } } // FIXME: This would be nicer as a method on Iterator. This can @@ -99,14 +99,14 @@ fn join,T: ToString>(iter: I, sep: &str) -> String { impl ToString for Extension { fn to_string(&self) -> String { - match self { - &Extension::KeyUsage(ref purposes) => join(purposes.iter(),","), - &Extension::ExtKeyUsage(ref purposes) => join(purposes.iter(),","), - &Extension::SubjectAltName(ref names) => join(names.iter().map(|&(ref opt,ref val)|opt.to_string()+":"+&val),","), - &Extension::IssuerAltName(ref names) => join(names.iter().map(|&(ref opt,ref val)|opt.to_string()+":"+&val),","), - &Extension::OtherNid(_,ref value) => value.clone(), - &Extension::OtherStr(_,ref value) => value.clone(), - } + match self { + &Extension::KeyUsage(ref purposes) => join(purposes.iter(),","), + &Extension::ExtKeyUsage(ref purposes) => join(purposes.iter(),","), + &Extension::SubjectAltName(ref names) => join(names.iter().map(|&(ref opt,ref val)|opt.to_string()+":"+&val),","), + &Extension::IssuerAltName(ref names) => join(names.iter().map(|&(ref opt,ref val)|opt.to_string()+":"+&val),","), + &Extension::OtherNid(_,ref value) => value.clone(), + &Extension::OtherStr(_,ref value) => value.clone(), + } } } @@ -178,7 +178,7 @@ impl fmt::Display for ExtKeyUsageOption { #[derive(Clone, Copy)] pub enum AltNameOption { /// The value is specified as OID;content. See `man ASN1_generate_nconf` for more information on the content syntax. - /// + /// /// ``` /// use openssl::x509::extension::Extension::*; /// use openssl::x509::extension::AltNameOption::Other as OtherName; @@ -186,27 +186,27 @@ pub enum AltNameOption { /// # let generator = openssl::x509::X509Generator::new(); /// generator.add_extension(SubjectAltName(vec![(OtherName,"2.999.3;ASN1:UTF8:some other name".to_owned())])); /// ``` - Other, - Email, - DNS, - //X400, // Not supported by OpenSSL - Directory, - //EDIParty, // Not supported by OpenSSL - URI, - IPAddress, - RegisteredID, + Other, + Email, + DNS, + //X400, // Not supported by OpenSSL + Directory, + //EDIParty, // Not supported by OpenSSL + URI, + IPAddress, + RegisteredID, } impl fmt::Display for AltNameOption { fn fmt(&self, f: &mut fmt::Formatter) -> Result<(), fmt::Error> { f.pad(match self { - &AltNameOption::Other => "otherName", - &AltNameOption::Email => "email", - &AltNameOption::DNS => "DNS", - &AltNameOption::Directory => "dirName", - &AltNameOption::URI => "URI", - &AltNameOption::IPAddress => "IP", - &AltNameOption::RegisteredID => "RID", + &AltNameOption::Other => "otherName", + &AltNameOption::Email => "email", + &AltNameOption::DNS => "DNS", + &AltNameOption::Directory => "dirName", + &AltNameOption::URI => "URI", + &AltNameOption::IPAddress => "IP", + &AltNameOption::RegisteredID => "RID", }) } } -- cgit v1.2.3