Asn 1 Intro
Asn 1 Intro
June 3, 1991
Abstract. This note gives a layman's introduction to a subset of OSI's Abstract Syntax
Notation One (ASN.1), Basic Encoding Rules (BER), and Distinguished Encoding Rules
(DER). The particular purpose of this note is to provide background material sufficient
for understanding and implementing the PKCS family of standards.
Contents
1. Introduction.............................................................................................2
1
A LAYMAN'S GUIDE TO A SUBSET OF ASN.1, BER, AND DER 2
6. An example ............................................................................................41
6.1 Abstract notation ....................................................................................... 41
6.2 DER encoding ............................................................................................ 42
References .................................................................................................45
1. Introduction
One of the most complex systems today, and one that also involves a great deal of
abstraction, is Open Systems Interconnection (OSI) [1]. OSI is an internationally
standardized architecture that governs the interconnection of computers from the physical
layer up to the user application layer. Objects at higher layers are defined abstractly and
intended to be implemented with objects at lower layers. For instance, a service at one
layer may require transfer of certain abstract objects between computers; a lower layer
may provide transfer services for strings of ones and zeroes, using encoding rules to
transform the abstract objects into such strings. OSI is called an open system because it
supports many different implementations of the services at each layer.
OSI's method of specifying abstract objects is called Abstract Syntax Notation One
(ASN.1) [2], and one set of rules for representing such objects as strings of ones and
zeros is called the Basic Encoding Rules (BER) [3]. ASN.1 is a flexible notation that
allows one to define a variety data types, from simple types such as integers and bit
strings to structured types such as sets and sequences, as well as complex types defined in
terms of others. BER describes how to represent or encode values of each ASN.1 type as
a string of eight-bit octets. There is generally more than one way to BER-encode a given
A LAYMAN'S GUIDE TO A SUBSET OF ASN.1, BER, AND DER 3
value. Another set of rules, called the Distinguished Encoding Rules (DER), which is a
subset of BER, gives a unique encoding to each ASN.1 value.
The purpose of this note is to describe a subset of ASN.1, BER and DER sufficient to
understand and implement one OSI-based application, RSA Data Security, Inc.'s Public-
Key Cryptography Standards. The features described include an overview of ASN.1,
BER, and DER and an abridged list of ASN.1 types and their BER and DER encodings.
Sections 2–4 give an overview of ASN.1, BER, and DER, in that order. Section 5 lists
some ASN.1 types, giving their notation, specific encoding rules, examples, and
comments about their application to PKCS. Section 6 concludes with an example, X.500
distinguished names.
Advanced features of ASN.1, such as macros, are not described in this note, as they are
not needed to implement PKCS. For information on the other features, and for more
detail generally, the reader is referred to CCITT Recommendations X.208 and X.209
[2,3], which define ASN.1 and BER.
Terminology and notation. In this note, an octet is an eight-bit unsigned integer. Bit 8
of the octet is the most significant and bit 1 is the least significant.
BIT monospace denotes literal characters in the type and value notation; in
examples, it denotes an octet value in hexadecimal
Abstract Syntax Notation One, abbreviated ASN.1, is a notation for describing abstract
types and values.
In ASN.1, a type is a set of values, possibly infinite in size; a value of a given ASN.1
type is an element of that type's set of values. ASN.1 has four kinds of type: simple
types, which are "atomic" and have no components; structured types, which have
A LAYMAN'S GUIDE TO A SUBSET OF ASN.1, BER, AND DER 4
components; tagged types, which are derived from other types; and other types, which
include the CHOICE type and the ANY type. Types and values can be given names with
the ASN.1 assignment operator (::=) , and those names can be used in defining other
types and values.
Every ASN.1 type other than CHOICE and ANY has a tag, which consists of a class and a
nonnegative tag number. ASN.1 types are abstractly the same if and only if their tag
numbers are the same. In other words, the name of an ASN.1 type does not affect its
abstract meaning, only the tag does. There are four classes of tag:
universal — for types whose meaning is the same in all applications; these types
are only defined in X.208
The types with universal tags are defined in X.208 [2], which also gives the types'
universal tag numbers. Types with other tags are defined in many places, and are always
obtained by implicit or explicit tagging (see Section 2.3). Table 1 lists some ASN.1 types
and their universal-class tags.
• layout is not significant; multiple spaces and line breaks can be considered
as a single space
The following four subsections give an overview simple types, structured types,
implicitly and explicitly tagged types, and other types. Section 5 describes specific types
in more detail.
Simple types are those not consisting of components; they are the "atomic" types. ASN.1
defines several; the types that are relevant to the PKCS standards are the following:
Simple types fall into two categories: string types and non-string types. BIT STRING,
IA5String, OCTET STRING, PrintableString, and UTCTime are string types.
String types can be viewed, for the purposes of encoding, as consisting of components,
where the components are substrings. This view allows one to encode a value whose
A LAYMAN'S GUIDE TO A SUBSET OF ASN.1, BER, AND DER 6
length is not known in advance (e.g., an octet string value input from a file stream) with
a constructed, indefinite-length encoding (see Section 3).
The string types can be given size constraints limiting the length of values.
Structured types are those consisting of components. ASN.1 defines four, all of which
are relevant to the PKCS standards:
The structured types can have optional components, possibly with default values.
Implicitly tagged types are those derived from other types by changing the tag of the
underlying type. Implicit tagging is denoted by the ASN.1 keywords [class number]
IMPLICIT (see Section 5.1).
Explicitly tagged types are those derived from other types by adding an outer tag to the
underlying type. In effect, explicitly tagged types are structured types consisting of one
component, the underlying type. Explicit tagging is denoted by the ASN.1 keywords
[class number] EXPLICIT (see Section 5.2).
For purposes of encoding, an implicitly tagged type is considered the same as the
underlying type, except that the tag is different. An explicitly tagged type is considered
like a structured type with one component, the underlying type. Implicit tags result in
shorter encodings, but explicit tags may be necessary to avoid ambiguity if the tag of the
underlying type is indeterminate (e.g., the underlying type is CHOICE or ANY).
A LAYMAN'S GUIDE TO A SUBSET OF ASN.1, BER, AND DER 7
Other types in ASN.1 include the CHOICE and ANY types. The CHOICE type denotes a
union of one or more alternatives; the ANY type denotes an arbitrary value of an arbitrary
type, where the arbitrary type is possibly defined in the registration of an object identifier
or integer value.
The Basic Encoding Rules for ASN.1, abbreviated BER, give one or more ways to
represent any ASN.1 value as an octet string.
There are three methods to encode an ASN.1 value under BER, the choice of which
depends on the type of value and whether the length of the value is known. The three
methods are primitive, definite-length encoding; constructed, definite-length encoding;
and constructed, indefinite-length encoding. Simple non-string types employ the
primitive, definite-length method; structured types employ either of the constructed
methods; and simple string types employ any of the methods, depending on whether the
length of the value is known. Types derived by implicit tagging employ the method of
the underlying type and types derived by explicit tagging employ the constructed
methods.
Identifier octets. These identify the class and tag number of the ASN.1 value, and
indicate whether the method is primitive or constructed.
Length octets. For the definite-length methods, these give the number of contents
octets. For the constructed, indefinite-length method, these indicate that
the length is indefinite.
Contents octets. For the primitive, definite-length method, these give a concrete
representation of the value. For the constructed methods, these give the
concatenation of the BER encodings of the components of the value.
This method applies to simple types and types derived from simple types by implicit
tagging. It requires that the length of the value be known in advance. The parts of the
BER encoding are as follows:
Identifier octets. There are two forms: low tag number (for tag numbers between 0 and
30) and high tag number (for tag numbers 31 and greater).
Low-tag-number form. One octet. Bits 8 and 7 specify the class (see Table 2), bit
6 has value "0," indicating that the encoding is primitive, and bits 5–1 give
the tag number.
Length octets. There are two forms: short (for lengths between 0 and 127), and long
definite (for lengths between 0 and 21008−1).
Short form. One octet. Bit 8 has value "0" and bits 7–1 give the length.
Long form. Two to 127 octets. Bit 8 of first octet has value "1" and bits 7–1 give
the number of additional length octets. Second and following octets give
the length, base 256, most significant digit first.
Contents octets. These give a concrete representation of the value (or the value of the
underlying type, if the type is derived by implicit tagging). Details for particular types
are given in Section 5.
This method applies to simple string types, structured types, types derived simple string
types and structured types by implicit tagging, and types derived from anything by
A LAYMAN'S GUIDE TO A SUBSET OF ASN.1, BER, AND DER 9
explicit tagging. It requires that the length of the value be known in advance. The parts of
the BER encoding are as follows:
Identifier octets. As described in Section 3.1, except that bit 6 has value "1," indicating
that the encoding is constructed.
Contents octets. The concatenation of the BER encodings of the components of the
value:
• For simple string types and types derived from them by implicit tagging,
the concatenation of the BER encodings of consecutive substrings of the
value (underlying value for implicit tagging).
• For structured types and types derived from them by implicit tagging, the
concatenation of the BER encodings of components of the value
(underlying value for implicit tagging).
• For types derived from anything by explicit tagging, the BER encoding of
the underlying value.
This method applies to simple string types, structured types, types derived simple string
types and structured types by implicit tagging, and types derived from anything by
explicit tagging. It does not require that the length of the value be known in advance. The
parts of the BER encoding are as follows:
Since the end-of-contents octets appear where an ordinary BER encoding might be
expected (e.g., in the contents octets of a sequence value), the 00 and 00 appear as
identifier and length octets, respectively. Thus the end-of-contents octets is really the
primitive, definite-length encoding of a value with universal class, tag number 0, and
length 0.
A LAYMAN'S GUIDE TO A SUBSET OF ASN.1, BER, AND DER 10
The Distinguished Encoding Rules for ASN.1, abbreviated DER, are a subset of BER,
and give exactly one way to represent any ASN.1 value as an octet string. DER is
intended for applications in which a unique octet string encoding is needed, as is the case
when a digital signature is computed on an ASN.1 value. DER is defined in Section 8.7
of X.509 [4].
1. When the length is between 0 and 127, the short form of length must be
used
2. When the length is 128 or greater, the long form of length must be used,
and the length must be encoded in the minimum number of octets.
3. For simple string types and implicitly tagged types derived from simple
string types, the primitive, definite-length method must be employed.
Other restrictions are defined for particular types (such as BIT STRING, SEQUENCE,
SET, and SET OF), and can be found in Section 5.
This section gives the notation for some ASN.1 types and describes how to encode values
of those types under both BER and DER.
The types described are those presented in Section 2. They are listed alphabetically here.
Each description includes ASN.1 notation, BER encoding, and DER encoding. The
descriptions also explain where each type is used in PKCS and related standards. ASN.1
notation is generally only for types, although for the type OBJECT IDENTIFIER,
value notation is given as well.
A LAYMAN'S GUIDE TO A SUBSET OF ASN.1, BER, AND DER 11
An implicitly tagged type is a type derived from another type by changing the tag of the
underlying type.
Implicit tagging is used for optional SEQUENCE components with underlying type other
than ANY throughout PKCS, and for the extendedCertificate alternative of
PKCS #7's ExtendedCertificateOrCertificate type.
where Type is a type, class is an optional class name, and number is the tag number
within the class, a nonnegative integer.
In ASN.1 "modules" whose default tagging method is implicit tagging, the notation
[[class] number] Type is also acceptable, and the keyword IMPLICIT is implied. For
definitions stated outside a module, the explicit inclusion of the keyword IMPLICIT is
preferable to prevent ambiguity.
If the class name is absent, then the tag is context-specific. Context-specific tags can only
appear in a component of a structured or CHOICE type.
For example, PKCS #8's PrivateKeyInfo type [5] has an optional attributes
component with an implicit, context-specific tag:
Here the underlying type is Attributes, the class is absent (i.e., context-specific), and
the tag number within the class is 0.
A LAYMAN'S GUIDE TO A SUBSET OF ASN.1, BER, AND DER 12
The BER encoding of an implicitly tagged value can be either primitive or constructed,
depending on the underlying type. The contents octets are as for the BER encoding of the
underlying value.
• the length and contents octets are the same as the length and contents
octets of the BER encoding of the underlying Attributes value
The DER encoding of an implicitly tagged value can be either primitive or constructed,
depending on the underlying type. The contents octets are as for the DER encoding of the
underlying value.
A LAYMAN'S GUIDE TO A SUBSET OF ASN.1, BER, AND DER 13
Explicit tagging denotes a type derived from another type by adding an outer tag to the
underlying type.
Explicit tagging is used for optional SEQUENCE components with underlying type ANY
throughout PKCS, and for the version component of X.509's Certificate type [4]
as revised by RFC 1114 [6].
where Type is a type, class is an optional class name, and number is the tag number
within the class, a nonnegative integer.
If the class name is absent, then the tag is context-specific. Context-specific tags can only
appear in a component of a SEQUENCE, SET or CHOICE type.
In ASN.1 "modules" whose default tagging method is explicit tagging, the notation
[[class] number] Type is also acceptable, and the keyword EXPLICIT is implied. For
definitions stated outside a module, the explicit inclusion of the keyword EXPLICIT is
preferable to prevent ambiguity.
For example, PKCS #7's ContentInfo type [7] has an optional content component
with an explicit, context-specific tag:
Here the underlying type is ANY DEFINED BY contentType, the class is absent
(i.e., context-specific), and the tag number within the class is 0.
As another example, X.509's Certificate type [4] (as updated by RFC 1114 [6]) has
a version component with an explicit, context-specific tag, where the EXPLICIT
keyword is omitted:
A LAYMAN'S GUIDE TO A SUBSET OF ASN.1, BER, AND DER 14
The tag is explicit because the default tagging method for the ASN.1 "module" that
defines the Certificate type is explicit tagging.
The BER encoding of an explicitly tagged value is always constructed. The contents
octets are the BER encoding of the underlying value.
For example, the BER encoding of the content component of a ContentInfo value
is as follows:
• the length octets represent the length of the BER encoding of the
underlying ANY DEFINED BY contentType value
• the contents octets are the BER encoding of the underlying ANY
DEFINED BY contentType value
The DER encoding of an explicitly tagged value is always constructed. The contents
octets are the DER encoding of the underlying value.
A LAYMAN'S GUIDE TO A SUBSET OF ASN.1, BER, AND DER 15
5.3 ANY
The ANY type denotes an arbitrary value of an arbitrary type, where the arbitrary type is
possibly defined in the registration of an object identifier or associated with an integer
index.
The ANY type is used for content of a particular content type in PKCS #7's
ContentInfo type [7], for parameters of a particular algorithm in X.509's
AlgorithmIdentifier type [4], and for attribute values in X.501's Attribute
and AttributeValueAssertion types [8]. The Attribute type is used by
PKCS #6 [9], PKCS #7 [7], and PKCS #8 [5], and the AttributeValueAssertion
type is used in X.501 distinguished names.
Here the actual type of the parameter component depends on the value of the
algorithm component. The actual type would be defined in the registration of object
identifier values for the algorithm component.
A LAYMAN'S GUIDE TO A SUBSET OF ASN.1, BER, AND DER 16
The BER encoding of an ANY value is the BER encoding of the actual value.
For example, the BER encoding of the value of the parameter component is the BER
encoding of the value of the actual type as defined in the registration of object identifier
values for the algorithm component.
The DER encoding of an ANY value is the DER encoding of the actual value.
A LAYMAN'S GUIDE TO A SUBSET OF ASN.1, BER, AND DER 17
The BIT STRING type denotes an arbitrary string of bits (ones and zeroes). A BIT
STRING value can have any length, including zero. This type is a string type.
The BIT STRING type is used for digital signatures on extended certificates in PKCS
#6's ExtendedCertificate type [9], for digital signatures on certificates in X.509's
Certificate type [4], and for public keys in certificates in X.509's
SubjectPublicKeyInfo type.
BIT STRING
The BER encoding of a BIT STRING value can be either primitive or constructed. In a
primitive encoding, the first contents octet gives the number of bits by which the length
of the bit string is less than the next multiple of eight (this is called the "number of
unused bits"). The second and following contents octets give the value of the bit string,
converted to an octet string. The conversion process is as follows:
1. The bit string is padded after the last bit with zero to seven bits of any
value to make the length of the bit string a multiple of eight. If the length
of the bit string is a multiple of eight already, no padding is done.
2. The padded bit string is divided into octets. The first eight bits of the
padded bit string become the first octet, bit 8 to bit 1, and so on through
the last eight bits of the padded bit string.
In a constructed encoding, the contents octets give the concatenation of the BER
encodings of consecutive substrings of the bit string, where each substring except the last
has a length that is a multiple of eight bits.
A LAYMAN'S GUIDE TO A SUBSET OF ASN.1, BER, AND DER 18
For example, the BER encoding of the BIT STRING value "011011100101110111" can
be any of the following, among others, depending on the choice of padding bits, the form
of length octets, and whether the encoding is primitive or constructed:
03 04 06 6e 5d c0 DER encoding
The DER encoding of a BIT STRING value is always primitive. The contents octects
are as for a primitive BER encoding, except that the bit string is padded with zero-valued
bits.
For example, the DER encoding of the BIT STRING value "011011100101110111" is
03 04 06 6e 5d c0
A LAYMAN'S GUIDE TO A SUBSET OF ASN.1, BER, AND DER 19
5.5 CHOICE
The CHOICE type is used to represent the union of an extended certificate and an X.509
certificate in PKCS #7's ExtendedCertificateOrCertificate type [7].
CHOICE {
[identifier1] Type1,
…,
[identifiern] Typen }
where identifier1 , …, identifiern are optional, distinct identifiers for the alternatives, and
Type1, …, Typen are the types of the alternatives. The identifiers are primarily for
documentation; they do not affect values of the type or their encodings in any way.
The types must have distinct tags. This requirement is typically satisfied with explicit or
implicit tagging on some of the alternatives.
The BER encoding of a CHOICE value is the BER encoding of the chosen alternative.
The fact that the alternatives have distinct tags makes it possible to distinguish between
their BER encodings. For example, the identifier octets for the BER encoding are 30 if
the chosen alternative is certificate, and a0 if the chosen alternative is
extendedCertificate.
A LAYMAN'S GUIDE TO A SUBSET OF ASN.1, BER, AND DER 20
The DER encoding of a CHOICE value is the DER encoding of the chosen alternative.
A LAYMAN'S GUIDE TO A SUBSET OF ASN.1, BER, AND DER 21
5.6 IA5String
The IA5String type denotes an arbtrary string of IA5 characters. IA5 stands for
International Alphabet 5, which is the same as ASCII. An IA5String value can have
any length, including zero. This type is a string type.
The IA5String type is used for electronic-mail addresses and unstructured names in
PKCS #9 [10].
IA5String
For example, the BER encoding of the IA5String value "[email protected]" can be any
of the following, among others, depending on the form of length octets and whether the
encoding is primitive or constructed:
12 0d 74 65 73 74 31 40 72 73 61 2e 63 6f 6d DER encoding
The DER encoding of an IA5String value is always primitive. The contents octets are
as for a primitive BER encoding.
12 0d 74 65 73 74 31 40 72 73 61 2e 63 6f 6d
A LAYMAN'S GUIDE TO A SUBSET OF ASN.1, BER, AND DER 23
5.7 INTEGER
The INTEGER type denotes an arbitrary integer. INTEGER values can be positive,
negative, or zero, and can have any magnitude.
The INTEGER type is used for version numbers throughout PKCS, cryptographic values
such as modulus, exponent, and primes in PKCS #1's RSAPublicKey and
RSAPrivateKey types [11] and PKCS #3's DHParameter type [12], a message-
digest iteration count in PKCS #5's PBEParameter type, and version numbers and
serial numbers in X.509's Certificate type [4].
where identifier1, …, identifiern are optional distinct identifiers and value1, …, valuen
are optional integer values. The identifiers, when present, are associated with values of
the type.
For example, RFC 1114's Version type [6] is an INTEGER type with identified values:
The identifier v1988 is associated with the value 0. RFC 1114's Certificate type
uses the identifier v1988 to give a default value of 0 for the version component:
The BER encoding of an INTEGER value is always primitive. The contents octets give
the value of the integer, base 256, in two's complement form, most significant digit first,
with the minimum number of octets. The value 0 is encoded as a single 00 octet.
Some example BER encodings (which also happen to be DER encodings) are given in
Table 3.
A LAYMAN'S GUIDE TO A SUBSET OF ASN.1, BER, AND DER 24
The DER encoding of an INTEGER value is always primitive. The contents octets are as
for a primitive BER encoding.
A LAYMAN'S GUIDE TO A SUBSET OF ASN.1, BER, AND DER 25
5.8 NULL
The NULL type is used for algorithm parameters in several places in PKCS.
NULL
The BER encoding of a NULL value is always primitive. The contents octets are empty.
For example, the BER encoding of a NULL value can be either of the following, as well
as others, depending on the form of the length octets:
05 00
05 81 00
The DER encoding of a NULL value is always primitive. The contents octets are empty.
OBJECT IDENTIFIER
where identifier, identifier1, …, identifiern are identifiers, and value1, …, valuen are
optional integer values.
The form without identifier is the "complete" value with all its components; the form
with identifier abbreviates the beginning components with another object identifier
value. The identifiers identifier1, …, identifiern are intended primarily for
documentation, but they must correspond to the integer value when both are present.
These identifiers can appear without integer values only if they are among a small set of
identifiers defined in X.208 [2].
A LAYMAN'S GUIDE TO A SUBSET OF ASN.1, BER, AND DER 27
For example, the following values both refer to the object identifier assigned to RSA
Data Security, Inc.:
Table 4 gives some other object identifier values and their meanings.
For example, the subidentifiers of RSA Data Security, Inc.'s object identifier are 42 = 40
× 1 + 2, 840, 113549, and 1. The encoding of 42 is 2A, the encoding of 840 is 86 48,
the encoding of 113549 is 86 F7 0D, and the encoding of 1 is 01, which leads to the
following BER encoding:
06 07 2A 86 48 86 F7 0D 01
A LAYMAN'S GUIDE TO A SUBSET OF ASN.1, BER, AND DER 28
The OCTET STRING type denotes an arbitrary string of octets (eight-bit values). An
OCTET STRING value can have any length, including zero. This type is a string type.
The OCTET STRING type is used for salt values in PKCS #5's PBEParameter type
[13], for message digests, encrypted message digests, and encrypted content in PKCS #7
[7], and for private keys and encrypted private keys in PKCS #8 [5].
where size, size1, and size2 are optional size constraints. In the OCTET STRING SIZE
(size) form, the octet string must have size octets. In the OCTET STRING SIZE
(size1..size2) form, the octet string must have between size1 and size2 octets. In the
OCTET STRING form, the octet string can have any size.
For example, PKCS #5's PBEParameter type [13] has a component of type OCTET
STRING:
The BER encoding of an OCTET STRING value can be either primitive or constructed.
In a primitive encoding, the contents octets give the value of the octet string, first octet to
last octet. In a constructed encoding, the contents octets give the concatenation of the
BER encodings of substrings of the OCTET STRING value.
04 08 01 23 45 67 89 ab cd ef DER encoding
24 0c constructed encoding: 01 23 45 67 + 89 ab cd ef
04 04 01 23 45 67
04 04 89 ab cd ef
The DER encoding of an OCTET STRING value is always primitive. The contents
octets are as for a primitive BER encoding.
04 08 01 23 45 67 89 ab cd ef
A LAYMAN'S GUIDE TO A SUBSET OF ASN.1, BER, AND DER 31
5.10 PrintableString
A, B, …, Z
a, b, …, z
0, 1, …, 9
(space) ' ( ) + , - . / : = ?
PrintableString
For example, the BER encoding of the PrintableString value "Test User 1" can be
any of the following, among others, depending on the form of length octets and whether
the encoding is primitive or constructed:
13 0b 54 65 73 74 20 55 73 65 72 20 31 DER encoding
For example, the DER encoding of the PrintableString value "Test User 1" is
13 0b 54 65 73 74 20 55 73 65 72 20 31
A LAYMAN'S GUIDE TO A SUBSET OF ASN.1, BER, AND DER 33
5.11 SEQUENCE
SEQUENCE {
[identifier1] Type1 [{OPTIONAL | DEFAULT value1}],
…,
[identifiern] Typen [{OPTIONAL | DEFAULT valuen}]}
where identifier1 , …, identifiern are optional, distinct identifiers for the components,
Type1, …, Typen are the types of the components, and value1, …, valuen are optional
default values for the components. The identifiers are primarily for documentation; they
do not affect values of the type or their encodings in any way.
The OPTIONAL qualifier indicates that the value of a component is optional and need
not be present in the sequence. The DEFAULT qualifier also indicates that the value of a
component is optional, and assigns a default value to the component when the component
is absent.
The types of any consecutive series of components with the OPTIONAL or DEFAULT
qualifier, as well as of any component immediately following that series, must have
distinct tags. This requirement is typically satisfied with explicit or implicit tagging on
some of the components.
For example, the X.509's Validity type [4] is a SEQUENCE type with two
components:
Here the identifiers for the components are start and end, and the types of the
components are both UTCTime.
A LAYMAN'S GUIDE TO A SUBSET OF ASN.1, BER, AND DER 34
The BER encoding of a SEQUENCE value is always constructed. The contents octets are
the concatenation of the BER encodings of the values of the components of the sequence,
in order of definition, with the following rules for components with the OPTIONAL and
DEFAULT qualifiers:
The DER encoding of a SEQUENCE value is always constructed. The contents octets are
the same as the BER encoding, except that if the value of a component with the
DEFAULT qualifier is the default value, the encoding of that component is not included
in the contents octets.
A LAYMAN'S GUIDE TO A SUBSET OF ASN.1, BER, AND DER 35
5.12 SEQUENCE OF
SEQUENCE OF Type
For example, X.501's RDNSequence type [8] consists of zero or more occurences of
the RelativeDistinguishedName type, most significant occurrence first:
The BER encoding of a SEQUENCE OF value is always constructed. The contents octets
are the concatenation of the BER encodings of the values of the occurrences in the
collection, in order of occurence.
The DER encoding of a SEQUENCE OF value is always constructed. The contents octets
are the concatenation of the DER encodings of the values of the occurrences in the
collection, in order of occurence.
A LAYMAN'S GUIDE TO A SUBSET OF ASN.1, BER, AND DER 36
5.13 SET
SET {
[identifier1] Type1 [{OPTIONAL | DEFAULT value1}],
…,
[identifiern] Typen [{OPTIONAL | DEFAULT valuen}]}
where identifier1 , …, identifiern are optional, distinct identifiers for the components,
Type1, …, Typen are the types of the components, and value1, …, valuen are optional
default values for the components. The identifiers are primarily for documentation; they
do not affect values of the type or their encodings in any way.
The OPTIONAL qualifier indicates that the value of a component is optional and need
not be present in the set. The DEFAULT qualifier also indicates that the value of a
component is optional, and assigns a default value to the component when the component
is absent.
The types must have distinct tags. This requirement is typically satisfied with explicit or
implicit tagging on some of the components.
The BER encoding of a SET value is always constructed. The contents octets are the
concatenation of the BER encodings of the values of the components of the set, in any
order, with the following rules for components with the OPTIONAL and DEFAULT
qualifiers:
The DER encoding of a SET value is always constructed. The contents octets are the
same as for the BER encoding, except that:
5.14 SET OF
The SET OF type is used for sets of attributes in PKCS #6 [9], PKCS #7 [7], and PKCS
#8 [5], for sets of message-digest algorithm identifiers, signer information, and recipient
information in PKCS #7 [7], and in X.501 distinguished names [8].
SET OF Type
The BER encoding of a SET OF value is always constructed. The contents octets are the
concatenation of the BER encodings of the values of the occurrences in the collection, in
any order.
The DER encoding of a SET OF value is always constructed. The contents octets are the
same as for the BER encoding, except that there is an order, namely ascending
lexicographic order of BER encoding. Lexicographic comparison of two different BER
encodings is done as follows: Logically pad the shorter BER encoding after the last octet
with dummy octets that are smaller in value than any normal octet. Scan the BER
encodings from left to right until a difference is found. The smaller-valued BER
encoding is the one with the smaller-valued octet at the point of difference.
A LAYMAN'S GUIDE TO A SUBSET OF ASN.1, BER, AND DER 39
5.15 UTCTime
The UTCTime type denotes a "coordinated universal time" or Greenwich Mean Time
(GMT) value. A UTCTime value includes the local time precise to either minutes or
seconds, and an offset from GMT in hours and minutes. It takes any of the following
forms:
YYMMDDhhmmZ
YYMMDDhhmm+hh'mm'
YYMMDDhhmm-hh'mm'
YYMMDDhhmmssZ
YYMMDDhhmmss+hh'mm'
YYMMDDhhmmss-hh'mm'
where:
Z indicates that local time is GMT, + indicates that local time is later than GMT,
and - indicates that local time is earlier than GMT
The UTCTime type is used for signing times in PKCS #9's signing-time attribute [10]
and for certificate validity periods in X.509's Validity type [4].
UTCTime
A LAYMAN'S GUIDE TO A SUBSET OF ASN.1, BER, AND DER 40
For example, the time this sentence was written was 4:45:40 p.m. Pacific Daylight Time
on May 6, 1991, which can be represented with either of the following UTCTime values,
among others:
"910506164540-0700"
"910506234540Z"
17 0d 39 31 30 35 30 36 32 33 34 35 34 30 5A
17 11 39 31 30 35 30 36 31 36 34 35 34 30 2D 30 37 30 30
The DER encoding of a UTCTime value is always primitive. The contents octets are as
for a primitive BER encoding.
A LAYMAN'S GUIDE TO A SUBSET OF ASN.1, BER, AND DER 41
6. An example
This section gives an example of ASN.1 notation and DER encoding: the X.501 type
Name [8].
This section gives the ASN.1 notation for the X.501 type Name.
The Name type identifies an object in an X.500 directory [15]. Name is a CHOICE type
consisting of one alternative: RDNSequence.
The RDNSequence type gives a path through an X.500 directory tree starting at the
root. RDNSequence is a SEQUENCE OF type consisting of zero or more occurences of
RelativeDistinguishedName.
The AttributeValue type gives an arbitrary attribute value. (The actual type of the
attribute value is intended to be determined by the attribute type, even though ANY
DEFINED BY is not employed.)
This section gives an example of a DER encoding of a value of type Name, working
from the bottom up.
The name is that of RSA Data Security, Inc.'s "NOTARY" unit for Internet Privacy-
Enhanced Mail [16,17], which is represented by the following path:
(root)
|
countryName = "US"
|
organizationName = "RSA Data Security, Inc."
|
organizationalUnitName = "NOTARY"
6.2.1 AttributeType
The DER encodings of the three AttributeType values follow the primitive,
definite-length method, resulting in the following octet strings:
06 03 55 04 06 countryName
06 03 55 04 0a organizationName
06 03 55 04 0b organizationalUnitName
The identifier octets follow the low-tag form, since the tag is 6 for OBJECT
IDENTIFIER. Bits 8 and 7 have value "0," indicating universal class, and bit 6 has
value "0," indicating that the encoding is primitive. The length octets follow the short
form. The contents octets are the concatenation of three octet strings derived from
subidentifiers: 85 = 40 × 2 + 5; 4; and 6, 10, or 11.
6.2.2 AttributeValue
The DER encodings of the three AttributeValue values follow the primitive,
definite-length method, resulting in the following octet strings:
13 02 55 53 "US"
13 06 4e 4f 54 41 52 59 "NOTARY"
The identifier octets follow the low-octet form, since the tag is 19 for
PrintableString. Bits 8 and 7 have value "0," indicating universal class, and bit 6
has value "0," indicating that the encoding is primitive. The length octets follow the short
form, and the contents octets are the ASCII representation of the attribute value.
6.2.3 AttributeValueAssertion
30 09 countryName = "US"
06 03 55 04 06
13 02 55 53
30 0d organizationalUnitName = "NOTARY"
06 03 55 04 0b
13 06 ... 52 59
A LAYMAN'S GUIDE TO A SUBSET OF ASN.1, BER, AND DER 44
The identifier octets follow the low-octet form, since the tag is 16 for SEQUENCE. Bits
8 and 7 have value "0," indicating universal class, and bit 6 has value "1," indicating that
the encoding is constructed. The length octets follow the short form, and the contents
octets are the concatenation of the DER encodings of the attributeType and
attributeValue components.
6.2.4 RelativeDistinguishedName
31 0b
30 09 ... 55 53
31 20
30 1e ... 63 2e
31 0f
30 0d ... 52 59
The identifier octets follow the low-octet form, since the tag is 17 for SET OF. Bits 8
and 7 have value "0," indicating universal class, and bit 6 has value "1," indicating that
the encoding is constructed. The lengths octets follow the short form, and the contents
octets are the DER encodings of the respective AttributeValueAssertion values,
since there is only one value in each set.
6.2.5 RDNSequence
The DER encoding of the RDNSequence value follows the constructed, definite-length
method, resulting in the following abbreviated octet string:
30 40
31 0b ... 55 53
31 20 ... 63 2e
31 0f ... 52 59
The identifier octets follow the low-octet form, since the tag is 16 for SEQUENCE OF.
Bits 8 and 7 have value "0," indicating universal class, and bit 6 has value "1," indicating
that the encoding is constructed. The lengths octets follow the short form, and the
contents octets are the concatenation of the DER encodings of the three
RelativeDistinguishedName values, in order of occurrence.
A LAYMAN'S GUIDE TO A SUBSET OF ASN.1, BER, AND DER 45
6.2.6 Name
The DER encoding of the Name value is the same as the DER encoding of the
RDNSequence value. The final encoding is the following:
30 40
31 0b
30 09
06 03 55 04 06
13 02 55 53
31 20
30 1e
06 03 55 04 0a
13 17 52 53 41 20 44 61 74 61 20 53 65 63 75 72 69
74 79 2c 20 49 6e 63 2e
31 0f
30 0d
06 03 55 04 0b
13 06 4e 4f 54 41 52 59
References
[1] CCITT. Recommendation X.200: Reference Model of Open Systems Interconnection for CCITT
Applications. 1984.
[2] CCITT. Recommendation X.208: Specification of Abstract Syntax Notation One (ASN.1). 1988.
[3] CCITT. Recommendation X.209: Specification of Basic Encoding Rules for Abstract Syntax
Notation One (ASN.1). 1988.
[5] RSA Data Security, Inc. PKCS #8: Private-Key Information Syntax Standard. Version 1.1, June
1991.
[6] S. Kent and J. Linn. RFC 1114: Privacy Enhancement for Internet Electronic Mail: Part II --
Certificate-Based Key Management. August 1989. See also [16].
[7] RSA Data Security, Inc. PKCS #7: Cryptographic Message Syntax Standard. Version 1.4, June
1991.
[9] RSA Data Security, Inc. PKCS #6: Extended-Certificate Syntax Standard. Version 1.4, June
1991.
[10] RSA Data Security, Inc. PKCS #9: Selected Attribute Types. Version 1.0, June 1991.
A LAYMAN'S GUIDE TO A SUBSET OF ASN.1, BER, AND DER 46
[11] RSA Data Security, Inc. PKCS #1: RSA Encryption Standard. Version 1.4, June 1991.
[12] RSA Data Security, Inc. PKCS #3: Diffie-Hellman Key-Agreement Standard. Version 1.3, June
1991.
[13] RSA Data Security, Inc. PKCS #5: Password-Based Encryption Standard. Version 1.4, June
1991.
[15] CCITT. Recommendation X.500: The Directory—Overview of Concepts, Models and Services.
1988.
[16] S. Kent. RFC [1114B]: Privacy Enhancement for Internet Electronic Mail: Part II: Certificate-
Based Key Management. Draft, February 1991.
[17] B. Kaliski. RFC [FORMS-B]: Privacy Enhancement for Internet Electronic Mail: Part IV --
Notary, Co-Issuer, CRL-Storing, and CRL-Retrieving Services. Draft, May 1991.