R: Functions for handling ASN.1 format (typically DER)

ASN1 {PKI} | R Documentation

## Functions for handling ASN.1 format (typically DER)

### Description

`ASN1.decode` decodes `ASN.1` binary format into raw format chunks tagged with class types.

`ASN1.encode` converts structured objects into `ASN.1` binary format.

`ASN1.item` creates an item - basic object in structures that can be encoded using `ASN1.encode`.

`ASN1.type` extracts the class type from an `ASN.1` item

### Usage

    ASN1.decode(what)
    ASN1.encode(what)
    ASN1.item(what, type)
    ASN1.type(what)

### Arguments

`what` | object to decode/encode/query
`type` | class type of the item (integer value)

### Details

This is a suite of low-level tools to deal with ASN.1 (Abstract Syntax Notation One) binary formats DER, BER and CER. The tools were written specifically to handle the various DER-encoded key structures so it provides only a subset of the ASN.1 specification. They are used internally by the `PKI` poackage.

`ASN1.decode` decodes the binary representation (as raw vector) into individual items. Sequences are convered into lists, all other objects are retained in their binary form and tagged with the integer class type - which can be obtained using `ASN1.type` function.

`ASN1.encode` expects item (or a list of items) either created using `ASN1.decode` or `ASN1.item` and converts them into `DER` binary format.

The result of `ASN1.encode(ASN1.decode(x))` will be `x` if `x` was in `DER` format.

### Value

`ASN1.decode` returns either one item or a list.

`ASN1.encode` returns a raw vector in DER format.

`ASN1.type` returns an integer class type

`ASN1.item` returns an ASN.1 item object

### Note

`ASN1.encode` uses a fixed buffer for encoding which currently limits the total size of the resulting structure to 1MB.

Only definite length forms are supported. The validity of individual items is not checked.

### Author(s)

Simon Urbanek

### Examples

    # generate a small key
    key <- PKI.genRSAkey(bits = 512L)

    # extract private and public parts in DER format
    prv <- PKI.save.key(key, format="DER")
    pub <- PKI.save.key(key, private=FALSE, format="DER")

    # parse the public key
    x <- ASN1.decode(pub)
    x
    # the second element is the actual key
    # as a bit string that's itself in DER
    # two integers - modulus and exponent
    # Note that this is in fact the pure PKCS#1 key format
    ASN1.decode(x[[2]])

    # encoding it back should yield the same representation since it is DER
    stopifnot(identical(ASN1.encode(x), as.raw(pub)))

[Package PKI version 0.1-3 Index]