[][src]Crate red_asn1

Red ASN1

A little library to build/parse ASN1 DER

Examples

Parsing and building bool:

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:

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:

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:

/*
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

ASN1red_asn1 typeRust type
BOOLEANBooleanbool
INTEGERIntegeri128, i64, i32, i16, u32
BIT STRINGBitSring
OCTET STRINGOctetStringVec<u8>
GeneralStringGeneralStringString
IA5StringIA5Stringascii::AsciiString
GeneralizedTimeGeneralizedTime
SEQUENCE OFSequenceOfVec<T: Asn1Object>
SEQUENCEstruct with #[derive(Sequence, Default)]
OPTIONALOptionalOption

Structs

BitString

Class to build/parse BitSring ASN1

Enumerated
GeneralizedTime

Class to build/parse GeneralizedTime ASN1

Oid

Class to build/parse Object Identifiers

Tag

Class to represent DER-ASN1 tags of the different types.

Enums

Error

Error in ASN1-DER parse/build operations

TagClass

Enum with the different tag classes

TagType

Enum with the different tag types

Statics

BIT_STRING_TAG_NUMBER
BOOLEAN_TAG_NUMBER
ENUMERATED_TAG_NUMBER
GENERALIZED_TIME_TAG_NUMBER
GENERALSTRING_TAG_NUMBER
IA5STRING_TAG_NUMBER
INTEGER_TAG_NUMBER
OCTET_STRING_TAG_NUMBER
SEQUENCE_TAG_NUMBER

Traits

Asn1Int

A trait to identify types that are ASN.1 integers

Asn1Object

A trait to allow objects to be built/parsed from ASN1-DER

Functions

build_length
parse_length

To parse the object value length from DER, should not be overwritten

Type Definitions

Boolean

Class to build/parse Boolean ASN1

GeneralString

Class to build/parse GeneralString ASN1

IA5String

Class to build/parse IA5String ASN1

Integer

Class to build/parse Integer ASN1

OctetString

Class to build/parse OctetString ASN1

Optional

Class to build/parse SequenceOf ASN1

Result

Result that encapsulates the Error type of this library

SequenceOf

Class to build/parse SequenceOf ASN1