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 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127
//! # Red ASN1 //! A little library to build/parse ASN1 DER //! //! ## Examples //! Parsing and building `bool`: //! ```rust //! use red_asn1::Asn1Object; //! //! assert_eq!(true, bool::parse(&[0x1, 0x1, 0xff]).unwrap().1); //! assert_eq!(false, bool::parse(&[0x1, 0x1, 0x0]).unwrap().1); //! //! assert_eq!(true.build(), vec![0x1, 0x1, 0xff]); //! assert_eq!(false.build(), vec![0x1, 0x1, 0x0]); //! ``` //! //! //! Parsing and building `Integer`: //! ```rust //! use red_asn1::{Integer, Asn1Object}; //! //! assert_eq!(2, Integer::parse(&[0x2, 0x1, 0x2]).unwrap().1); //! assert_eq!(2.build(), vec![0x2, 0x1, 0x2]); //! ``` //! //! Parsing and building `String`: //! ```rust //! use red_asn1::Asn1Object; //! //! assert_eq!( //! "John".to_string(), //! String::parse(&[0x1b, 0x4, 0x4a, 0x6f, 0x68, 0x6e]).unwrap().1 //! ); //! //! assert_eq!( //! "John".to_string().build(), //! vec![0x1b, 0x4, 0x4a, 0x6f, 0x68, 0x6e] //! ); //! ``` //! //! //! Creating custom sequences: //! //! ```rust //! /* //! Person ::= [APPLICATION 1] SEQUENCE { //! name: [0] GeneralString, //! age: [1] Integer, //! address: [2] GeneralString OPTIONAL, //! } //! */ //! //! use red_asn1::*; //! use red_asn1_derive::Sequence; //! //! #[derive(Sequence, Default)] //! #[seq(application_tag = 1)] //! struct Person { //! #[seq_field(context_tag = 0)] //! pub name: GeneralString, //! #[seq_field(context_tag = 1)] //! pub age: Integer, //! #[seq_field(context_tag = 2)] //! pub address: Option<GeneralString> //! } //! //! let john = Person{ //! name: GeneralString::from("John").into(), //! age: Integer::from(18).into(), //! address: None //! }; //! //! assert_eq!( //! vec![ //! 0x61, 0xf, 0x30, 0xd, //! 0xa0, 0x6, 0x1b, 0x4, 0x4a, 0x6f, 0x68, 0x6e, // "John" //! 0xa1, 0x3, 0x2, 0x1, 0x12 // 18 //! ] //! , john.build() //! ); //! //! let (_, rachel) = Person::parse(&[ //! 0x61, 0x1b, 0x30, 0x19, //! 0xa0, 0x8, 0x1b, 0x6, 0x52, 0x61, 0x63, 0x68, 0x65, 0x6c, // "Rachel" //! 0xa1, 0x3, 0x2, 0x1, 0x1e, // 30 //! 0xa2, 0x8, 0x1b, 0x6, 0x48, 0x61, 0x77, 0x61, 0x69, 0x69 // "Hawaii" //! ]).unwrap(); //! //! assert_eq!("Rachel", rachel.name); //! assert_eq!(30, rachel.age); //! assert_eq!(Some("Hawaii".to_string()), rachel.address); //! //! ``` //! //! ## Implemented types //! //! | ASN1 | red_asn1 type | Rust type | //! |-----------------|-----------------|------------------------------------------| //! | BOOLEAN | Boolean | bool | //! | INTEGER | Integer | i128, i64, i32, i16, u32 | //! | BIT STRING | BitSring | | //! | OCTET STRING | OctetString | Vec\<u8\> | //! | GeneralString | GeneralString | String | //! | IA5String | IA5String | ascii::AsciiString | //! | GeneralizedTime | GeneralizedTime | | //! | SEQUENCE OF | SequenceOf | Vec<T: Asn1Object> | //! | SEQUENCE | | struct with #[derive(Sequence, Default)] | //! | OPTIONAL | Optional | Option | //! | | | | mod error; pub use error::*; pub use error::Error; mod tag; pub use tag::*; mod traits; pub use traits::*; mod types; pub use types::*; mod length; pub use length::{build_length, parse_length};