Add additional function so that x509 name with specific type can be added
Originally added in https://github.com/sfackler/rust-openssl/pull/1371
This commit is contained in:
parent
4ce9c50b63
commit
f8e225e6a4
|
|
@ -78,6 +78,79 @@ impl fmt::Display for Asn1GeneralizedTimeRef {
|
|||
}
|
||||
}
|
||||
|
||||
/// The type of an ASN.1 value.
|
||||
#[derive(Debug, Copy, Clone, PartialEq, Eq)]
|
||||
pub struct Asn1Type(c_int);
|
||||
|
||||
#[allow(missing_docs)] // no need to document the constants
|
||||
impl Asn1Type {
|
||||
pub const EOC: Asn1Type = Asn1Type(ffi::V_ASN1_EOC);
|
||||
|
||||
pub const BOOLEAN: Asn1Type = Asn1Type(ffi::V_ASN1_BOOLEAN);
|
||||
|
||||
pub const INTEGER: Asn1Type = Asn1Type(ffi::V_ASN1_INTEGER);
|
||||
|
||||
pub const BIT_STRING: Asn1Type = Asn1Type(ffi::V_ASN1_BIT_STRING);
|
||||
|
||||
pub const OCTET_STRING: Asn1Type = Asn1Type(ffi::V_ASN1_OCTET_STRING);
|
||||
|
||||
pub const NULL: Asn1Type = Asn1Type(ffi::V_ASN1_NULL);
|
||||
|
||||
pub const OBJECT: Asn1Type = Asn1Type(ffi::V_ASN1_OBJECT);
|
||||
|
||||
pub const OBJECT_DESCRIPTOR: Asn1Type = Asn1Type(ffi::V_ASN1_OBJECT_DESCRIPTOR);
|
||||
|
||||
pub const EXTERNAL: Asn1Type = Asn1Type(ffi::V_ASN1_EXTERNAL);
|
||||
|
||||
pub const REAL: Asn1Type = Asn1Type(ffi::V_ASN1_REAL);
|
||||
|
||||
pub const ENUMERATED: Asn1Type = Asn1Type(ffi::V_ASN1_ENUMERATED);
|
||||
|
||||
pub const UTF8STRING: Asn1Type = Asn1Type(ffi::V_ASN1_UTF8STRING);
|
||||
|
||||
pub const SEQUENCE: Asn1Type = Asn1Type(ffi::V_ASN1_SEQUENCE);
|
||||
|
||||
pub const SET: Asn1Type = Asn1Type(ffi::V_ASN1_SET);
|
||||
|
||||
pub const NUMERICSTRING: Asn1Type = Asn1Type(ffi::V_ASN1_NUMERICSTRING);
|
||||
|
||||
pub const PRINTABLESTRING: Asn1Type = Asn1Type(ffi::V_ASN1_PRINTABLESTRING);
|
||||
|
||||
pub const T61STRING: Asn1Type = Asn1Type(ffi::V_ASN1_T61STRING);
|
||||
|
||||
pub const TELETEXSTRING: Asn1Type = Asn1Type(ffi::V_ASN1_TELETEXSTRING);
|
||||
|
||||
pub const VIDEOTEXSTRING: Asn1Type = Asn1Type(ffi::V_ASN1_VIDEOTEXSTRING);
|
||||
|
||||
pub const IA5STRING: Asn1Type = Asn1Type(ffi::V_ASN1_IA5STRING);
|
||||
|
||||
pub const UTCTIME: Asn1Type = Asn1Type(ffi::V_ASN1_UTCTIME);
|
||||
|
||||
pub const GENERALIZEDTIME: Asn1Type = Asn1Type(ffi::V_ASN1_GENERALIZEDTIME);
|
||||
|
||||
pub const GRAPHICSTRING: Asn1Type = Asn1Type(ffi::V_ASN1_GRAPHICSTRING);
|
||||
|
||||
pub const ISO64STRING: Asn1Type = Asn1Type(ffi::V_ASN1_ISO64STRING);
|
||||
|
||||
pub const VISIBLESTRING: Asn1Type = Asn1Type(ffi::V_ASN1_VISIBLESTRING);
|
||||
|
||||
pub const GENERALSTRING: Asn1Type = Asn1Type(ffi::V_ASN1_GENERALSTRING);
|
||||
|
||||
pub const UNIVERSALSTRING: Asn1Type = Asn1Type(ffi::V_ASN1_UNIVERSALSTRING);
|
||||
|
||||
pub const BMPSTRING: Asn1Type = Asn1Type(ffi::V_ASN1_BMPSTRING);
|
||||
|
||||
/// Constructs an `Asn1Type` from a raw OpenSSL value.
|
||||
pub fn from_raw(value: c_int) -> Self {
|
||||
Asn1Type(value)
|
||||
}
|
||||
|
||||
/// Returns the raw OpenSSL value represented by this type.
|
||||
pub fn as_raw(&self) -> c_int {
|
||||
self.0
|
||||
}
|
||||
}
|
||||
|
||||
/// Difference between two ASN1 times.
|
||||
///
|
||||
/// This `struct` is created by the [`diff`] method on [`Asn1TimeRef`]. See its
|
||||
|
|
|
|||
|
|
@ -21,7 +21,9 @@ use std::ptr;
|
|||
use std::slice;
|
||||
use std::str;
|
||||
|
||||
use crate::asn1::{Asn1BitStringRef, Asn1IntegerRef, Asn1ObjectRef, Asn1StringRef, Asn1TimeRef};
|
||||
use crate::asn1::{
|
||||
Asn1BitStringRef, Asn1IntegerRef, Asn1ObjectRef, Asn1StringRef, Asn1TimeRef, Asn1Type,
|
||||
};
|
||||
use crate::bio::MemBioSlice;
|
||||
use crate::conf::ConfRef;
|
||||
use crate::error::ErrorStack;
|
||||
|
|
@ -826,6 +828,33 @@ impl X509NameBuilder {
|
|||
}
|
||||
}
|
||||
|
||||
/// Add a field entry by str with a specific type.
|
||||
///
|
||||
/// This corresponds to [`X509_NAME_add_entry_by_txt`].
|
||||
///
|
||||
/// [`X509_NAME_add_entry_by_txt`]: https://www.openssl.org/docs/man1.1.0/crypto/X509_NAME_add_entry_by_txt.html
|
||||
pub fn append_entry_by_text_with_type(
|
||||
&mut self,
|
||||
field: &str,
|
||||
value: &str,
|
||||
ty: Asn1Type,
|
||||
) -> Result<(), ErrorStack> {
|
||||
unsafe {
|
||||
let field = CString::new(field).unwrap();
|
||||
assert!(value.len() <= c_int::max_value() as usize);
|
||||
cvt(ffi::X509_NAME_add_entry_by_txt(
|
||||
self.0.as_ptr(),
|
||||
field.as_ptr() as *mut _,
|
||||
ty.as_raw(),
|
||||
value.as_ptr(),
|
||||
value.len() as c_int,
|
||||
-1,
|
||||
0,
|
||||
))
|
||||
.map(|_| ())
|
||||
}
|
||||
}
|
||||
|
||||
/// Add a field entry by NID.
|
||||
///
|
||||
/// This corresponds to [`X509_NAME_add_entry_by_NID`].
|
||||
|
|
@ -847,6 +876,32 @@ impl X509NameBuilder {
|
|||
}
|
||||
}
|
||||
|
||||
/// Add a field entry by NID with a specific type.
|
||||
///
|
||||
/// This corresponds to [`X509_NAME_add_entry_by_NID`].
|
||||
///
|
||||
/// [`X509_NAME_add_entry_by_NID`]: https://www.openssl.org/docs/man1.1.0/crypto/X509_NAME_add_entry_by_NID.html
|
||||
pub fn append_entry_by_nid_with_type(
|
||||
&mut self,
|
||||
field: Nid,
|
||||
value: &str,
|
||||
ty: Asn1Type,
|
||||
) -> Result<(), ErrorStack> {
|
||||
unsafe {
|
||||
assert!(value.len() <= c_int::max_value() as usize);
|
||||
cvt(ffi::X509_NAME_add_entry_by_NID(
|
||||
self.0.as_ptr(),
|
||||
field.as_raw(),
|
||||
ty.as_raw(),
|
||||
value.as_ptr() as *mut _,
|
||||
value.len() as c_int,
|
||||
-1,
|
||||
0,
|
||||
))
|
||||
.map(|_| ())
|
||||
}
|
||||
}
|
||||
|
||||
/// Return an `X509Name`.
|
||||
pub fn build(self) -> X509Name {
|
||||
self.0
|
||||
|
|
|
|||
Loading…
Reference in New Issue