1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85
//! This crate helps you to DER-(de-)serialize various types. It provides some traits to convert //! between encoded data, DER-objects and native types as well and implements them for some common //! types. If you build it with the `derive`-feature (enabled by default), you can use //! `#[derive(Asn1Der)]` to derive the traits for your named structs. //! //! The following types have built-in support: //! - `DerObject`: A generic DER-object-wrapper that can hold any object //! (`DerObject{ tag: u8, payload: Vec<u8> }`) //! - `()`: The ASN.1-NULL-type //! - `bool`: The ASN.1-BOOLEAN-type //! - `Vec<u8>`: The ASN.1-OctetString-type //! - `String`: The ASN.1-UTF8String-type //! - `u128`: The ASN.1-INTEGER-type (within `[0, 2^128)`) //! - `Vec<T>`: The ASN.1-SEQUENCE-type for any type `T` that implements `FromDerObject` and //! `IntoDerObject` //! //! With the `derive`-feature you can automatically derive `FromDerObject` and `IntoDerObject`: //! ```rust //! #[macro_use] extern crate asn1_der; //! # #[cfg(feature = "derive")] //! # { //! use ::asn1_der::{ FromDerObject, IntoDerObject }; //! //! #[derive(Asn1Der, Default)] // Now our struct supports all DER-conversion-traits //! struct Address { //! street: String, //! house_number: u128, //! postal_code: u128, //! state: String, //! country: String //! } //! //! #[derive(Asn1Der, Default)] //! struct Customer { //! name: String, //! e_mail_address: String, //! postal_address: Address //! } //! //! let my_customer = Customer::default(); //! //! // Serialization: //! let mut serialized = vec![0u8; my_customer.serialized_len()]; //! my_customer.serialize(serialized.iter_mut()).unwrap(); //! //! // Deserialization (this returns our customer if the data is valid): //! let my_customer = Customer::deserialize(serialized.iter()).unwrap(); //! # } //! ``` #[cfg(feature = "derive")] #[allow(unused_imports)] #[macro_use] extern crate asn1_der_derive; /// Contains a generic ASN.1-DER-object-implementation mod der; /// Implements some DER types and their conversion from/to native types mod types; pub use ::{ der::{ DerObject, DerTag, DerLength, DerValue }, types::{ FromDerObject, IntoDerObject, U128Ext } }; #[cfg(feature = "derive")] #[doc(hidden)] pub use asn1_der_derive::*; /// An `asn1_der`-related error #[derive(Debug, Copy, Clone, Eq, PartialEq)] pub enum Asn1DerError { /// Not enough or too much bytes/objects/space left LengthMismatch, /// The serialized tag does not match the type InvalidTag, /// The encoding does not conform to the DER standard InvalidEncoding, /// The element is not supported by this implementation Unsupported } impl ::std::fmt::Display for Asn1DerError { fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { write!(f, "{:#?}", self) } } impl ::std::error::Error for Asn1DerError {}