Struct bsn1::Der

source · []
pub struct Der { /* private fields */ }
Expand description

Der owns DerRef and represents ASN.1 DER.

The structure of Der is similar to that of Vec<u8>.

User can access to the DerRef via the Deref implementation, and to the inner slice via the DerRef.

Implementations

Creates a new instance from id and contents.

Warnings

ASN.1 does not allow some universal identifier for DER, however, this function accepts such identifiers. For example, ‘Octet String’ must be primitive in DER, but this function will construct a new instance even if id represenets constructed ‘Octet String.’

Examples
use bsn1::{ContentsRef, Der, IdRef};

let id = IdRef::octet_string();
let contents = ContentsRef::from_bytes(&[10, 20, 30]);

let der = Der::new(id, contents);

assert_eq!(id, der.id());
assert_eq!(contents, der.contents());

Parses bytes starting with DER octets and builds a new instance.

This function ignores extra octet(s) at the end of bytes if any.

This function is same to TryFrom::try_from .

Warnings

ASN.1 does not allow some universal identifier for DER, however, this function accepts such an identifier. For example, ‘Octet String’ must be primitive in DER, but this function returns Ok for constructed Octet String DER.

Examples
use bsn1::Der;

let bytes: &[u8] = &[0x02, 0x01, 0x0a];  // Represents '10' as Integer.
let der0 = Der::from_bytes(bytes).unwrap();

// Extra octets at the end does not affect the result.
let bytes: &[u8] = &[0x02, 0x01, 0x0a, 0x01, 0x02];
let der1 = Der::from_bytes(bytes).unwrap();

assert_eq!(der0, der1);

Builds a new instance holding bytes without any check.

bytes must not include any extra octet.

If it is not sure whether bytes are valid octets as an ‘DER’ or not, use TryFrom implementation or from_bytes.

Safety

The behavior is undefined if bytes is not formatted as a DER.

Examples
use bsn1::Der;

let bytes: &[u8] = &[0x02, 0x01, 0x0a];  // Represents '10' as Integer.
let der = unsafe { Der::from_bytes_unchecked(bytes) };
assert_eq!(bytes, der.as_bytes());

Creates a new instance from id and the iterator of contents.

Warnings

ASN.1 does not allow some universal identifier for DER, however, this function accepts such an identifier. For example, ‘Octet String’ must be primitive in DER, but this function will construct a new instance even if id represenets constructed ‘Octet String.’

Examples
use bsn1::{ContentsRef, Der, IdRef};

let id = IdRef::sequence();

// Build instance using function 'from_id_iterator()'.
let contents: &[Der] = &[Der::utf8_string("foo"), Der::integer(29_i32)];
let der = Der::from_id_iterator(id, contents.iter());

// Build instance using function 'new()'.
let contents: Vec<u8> = contents.iter()
                        .map(|i| Vec::from(i.as_ref() as &[u8]))
                        .flatten().collect();
let contents = ContentsRef::from_bytes(&contents);
let expected = Der::new(id, contents);

// The result are same.
assert_eq!(expected, der);

Returns a new instance representing boolean.

Examples
use bsn1::{Der, IdRef};

let val = true;
let der = Der::boolean(val);

assert_eq!(IdRef::boolean(), der.id());
assert_eq!(val, der.contents().to_bool_der().unwrap());

Returns a new instance representing integer.

Type T should be the builtin primitive integer types (e.g., u8, u32, isize, i128, …)

Examples
use bsn1::{Der, IdRef};

let val = 39;
let der = Der::integer(val);

assert_eq!(IdRef::integer(), der.id());
assert_eq!(val, der.contents().to_integer().unwrap());

Returns a new instance representing utf8_string.

Examples
use bsn1::{Der, IdRef};

let val = "foo";
let der = Der::utf8_string(val);

assert_eq!(IdRef::utf8_string(), der.id());
assert_eq!(val.as_bytes(), der.contents().as_ref());

Returns a new instance representing octet_string.

Examples
use bsn1::{Der, IdRef};

let val = &[1, 2, 3];
let der = Der::octet_string(val);

assert_eq!(IdRef::octet_string(), der.id());
assert_eq!(val, der.contents().as_ref());

Consumes self, returning Vec.

Examples
use bsn1::Der;

let der = Der::octet_string(&[0, 1, 2, 3, 4]);
let v = der.clone().into_vec();

assert_eq!(der.as_ref() as &[u8], v.as_ref() as &[u8]);

Methods from Deref<Target = DerRef>

Returns a reference to the IdRef of self .

Examples
use bsn1::{DerRef, IdRef};

let bytes: &[u8] = &[0x02, 0x01, 0x04];  // Represents '4' as Integer.
let der = DerRef::from_bytes(bytes).unwrap();

assert_eq!(IdRef::integer(), der.id());

Returns Length to represent the length of contents.

Note that DER does not allow indefinite Length. The return value must be Length::Definite.

Warnings

Length stands for the length octets in DER; i.e. the length of the contents. The total byte count of the DER is greater than the value.

Examples
use bsn1::{DerRef, Length};

let bytes: &[u8] = &[0x04, 0x02, 0x00, 0xff];  // Represents '[0x00, 0xff]' as Octet String
let der = DerRef::from_bytes(bytes).unwrap();

assert_eq!(Length::Definite(2), der.length());

Returns a reference to the contents octets of self .

Examples
use bsn1::{ContentsRef, DerRef};

let bytes: &[u8] = &[0x04, 0x02, 0x00, 0xff];  // Represents '[0x00, 0xff]' as Octet String
let der = DerRef::from_bytes(bytes).unwrap();
let contents = ContentsRef::from_bytes(&bytes[2..]);

assert_eq!(contents, der.contents());

Provides a reference to the inner slice.

Example
use bsn1::DerRef;

// This octets represents `3` as integer.
let bytes = vec![0x02, 0x01, 0x03];

let der = DerRef::from_bytes(&bytes).unwrap();
assert_eq!(&bytes, der.as_bytes());

Trait Implementations

Converts this type into a shared reference of the (usually inferred) input type.
Immutably borrows from an owned value. Read more
Immutably borrows from an owned value. Read more
Returns a copy of the value. Read more
Performs copy-assignment from source. Read more
Formats the value using the given formatter. Read more
The resulting type after dereferencing.
Dereferences the value.
Converts to this type from the input type.
Converts to this type from the input type.
Feeds this value into the given Hasher. Read more
Feeds a slice of this type into the given Hasher. Read more
This method tests for self and other values to be equal, and is used by ==. Read more
This method tests for !=. The default implementation is almost always sufficient, and should not be overridden without very good reason. Read more
This method tests for self and other values to be equal, and is used by ==. Read more
This method tests for !=. The default implementation is almost always sufficient, and should not be overridden without very good reason. Read more
This method tests for self and other values to be equal, and is used by ==. Read more
This method tests for !=. The default implementation is almost always sufficient, and should not be overridden without very good reason. Read more

Parses bytes starting with DER octets and creates a new instance.

This function ignores extra octet(s) at the end of bytes if any.

This function is same to from_bytes .

Warnings

ASN.1 does not allow some universal identifier for DER, however, this function accepts such an identifier. For example, ‘Octet String’ must be primitive in DER, but this function returns Ok for constructed Octet String DER.

The type returned in the event of a conversion error.

Auto Trait Implementations

Blanket Implementations

Gets the TypeId of self. Read more
Immutably borrows from an owned value. Read more
Mutably borrows from an owned value. Read more

Returns the argument unchanged.

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

The resulting type after obtaining ownership.
Creates owned data from borrowed data, usually by cloning. Read more
Uses borrowed data to replace owned data, usually by cloning. Read more
The type returned in the event of a conversion error.
Performs the conversion.
The type returned in the event of a conversion error.
Performs the conversion.