aboutsummaryrefslogtreecommitdiff
path: root/openssl/src
diff options
context:
space:
mode:
authorSteven Fackler <[email protected]>2017-02-11 09:34:24 -0800
committerGitHub <[email protected]>2017-02-11 09:34:24 -0800
commit3a0d24f7292213df1420eb8f4c1791fd714e8d98 (patch)
treecb8f230cd1cc07dfa6c26bb609cab6e3a49673ca /openssl/src
parentMerge pull request #579 from sfackler/x509-signature (diff)
parentRe-add reexport (diff)
downloadrust-openssl-3a0d24f7292213df1420eb8f4c1791fd714e8d98.tar.xz
rust-openssl-3a0d24f7292213df1420eb8f4c1791fd714e8d98.zip
Merge pull request #568 from mredlek/x509_req_version_subject
X509 request information
Diffstat (limited to 'openssl/src')
-rw-r--r--openssl/src/asn1.rs23
-rw-r--r--openssl/src/x509/mod.rs40
-rw-r--r--openssl/src/x509/tests.rs9
3 files changed, 70 insertions, 2 deletions
diff --git a/openssl/src/asn1.rs b/openssl/src/asn1.rs
index 2c38e14d..a74f22e8 100644
--- a/openssl/src/asn1.rs
+++ b/openssl/src/asn1.rs
@@ -95,6 +95,29 @@ impl Asn1StringRef {
}
foreign_type! {
+ type CType = ffi::ASN1_INTEGER;
+ fn drop = ffi::ASN1_INTEGER_free;
+
+ pub struct Asn1Integer;
+ pub struct Asn1IntegerRef;
+}
+
+impl Asn1IntegerRef {
+ pub fn get(&self) -> i64 {
+ unsafe {
+ ::ffi::ASN1_INTEGER_get(self.as_ptr()) as i64
+ }
+ }
+
+ pub fn set(&mut self, value: i32) -> Result<(), ErrorStack>
+ {
+ unsafe {
+ cvt(::ffi::ASN1_INTEGER_set(self.as_ptr(), value as c_long)).map(|_| ())
+ }
+ }
+}
+
+foreign_type! {
type CType = ffi::ASN1_BIT_STRING;
fn drop = ffi::ASN1_BIT_STRING_free;
diff --git a/openssl/src/x509/mod.rs b/openssl/src/x509/mod.rs
index de7aece7..0d329da4 100644
--- a/openssl/src/x509/mod.rs
+++ b/openssl/src/x509/mod.rs
@@ -649,6 +649,34 @@ impl X509Req {
impl X509ReqRef {
to_pem!(ffi::PEM_write_bio_X509_REQ);
to_der!(ffi::i2d_X509_REQ);
+
+ pub fn version(&self) -> i32
+ {
+ unsafe {
+ compat::X509_REQ_get_version(self.as_ptr()) as i32
+ }
+ }
+
+ pub fn set_version(&mut self, value: i32) -> Result<(), ErrorStack>
+ {
+ unsafe {
+ cvt(ffi::X509_REQ_set_version(self.as_ptr(), value as c_long)).map(|_| ())
+ }
+ }
+
+ pub fn subject_name(&self) -> &X509NameRef {
+ unsafe {
+ let name = compat::X509_REQ_get_subject_name(self.as_ptr());
+ assert!(!name.is_null());
+ X509NameRef::from_ptr(name)
+ }
+ }
+
+ pub fn set_subject_name(&mut self, value: &X509NameRef) -> Result<(), ErrorStack> {
+ unsafe {
+ cvt(ffi::X509_REQ_set_subject_name(self.as_ptr(), value.as_ptr())).map(|_| ())
+ }
+ }
}
/// A collection of X.509 extensions.
@@ -846,6 +874,8 @@ mod compat {
pub use ffi::X509_getm_notBefore as X509_get_notBefore;
pub use ffi::X509_up_ref;
pub use ffi::X509_get0_extensions;
+ pub use ffi::X509_REQ_get_version;
+ pub use ffi::X509_REQ_get_subject_name;
pub use ffi::X509_get0_signature;
pub use ffi::X509_ALGOR_get0;
}
@@ -882,6 +912,16 @@ mod compat {
}
}
+ pub unsafe fn X509_REQ_get_version(x: *mut ffi::X509_REQ) -> ::libc::c_long
+ {
+ ::ffi::ASN1_INTEGER_get((*(*x).req_info).version)
+ }
+
+ pub unsafe fn X509_REQ_get_subject_name(x: *mut ffi::X509_REQ) -> *mut ::ffi::X509_NAME
+ {
+ (*(*x).req_info).subject
+ }
+
pub unsafe fn X509_get0_signature(psig: *mut *const ffi::ASN1_BIT_STRING,
palg: *mut *const ffi::X509_ALGOR,
x: *const ffi::X509) {
diff --git a/openssl/src/x509/tests.rs b/openssl/src/x509/tests.rs
index d6ec7beb..58db3a8b 100644
--- a/openssl/src/x509/tests.rs
+++ b/openssl/src/x509/tests.rs
@@ -6,7 +6,7 @@ use nid::X9_62_PRIME256V1;
use pkey::PKey;
use rsa::Rsa;
use ssl::{SslMethod, SslContextBuilder};
-use x509::{X509, X509Generator};
+use x509::{X509, X509Generator, X509Req};
use x509::extension::Extension::{KeyUsage, ExtKeyUsage, SubjectAltName, OtherNid, OtherStr};
use x509::extension::AltNameOption as SAN;
use x509::extension::KeyUsageOption::{DigitalSignature, KeyEncipherment};
@@ -75,7 +75,12 @@ fn test_req_gen() {
let pkey = pkey();
let req = get_generator().request(&pkey).unwrap();
- req.to_pem().unwrap();
+ let reqpem = req.to_pem().unwrap();
+
+ let req = X509Req::from_pem(&reqpem).ok().expect("Failed to load PEM");
+ let cn = (*req).subject_name().entries_by_nid(nid::COMMONNAME).next().unwrap();
+ assert_eq!(0, (*req).version());
+ assert_eq!(cn.data().as_slice(), b"test_me");
// FIXME: check data in result to be correct, needs implementation
// of X509_REQ getters