A Layman's Guide To A Subset of ASN.1, BER, A Layman's Guide To A Subset of ASN.1, BER, and DER and DER
A Layman's Guide To A Subset of ASN.1, BER, A Layman's Guide To A Subset of ASN.1, BER, and DER and DER
Supersedes June 3, 1991 version, which was also published as NI ST/OSI Implementors' Workshop
document SEC-SIG-91-17. PKCS documents are available by electronic mail to .
Copyright (C) 1991-1993 RSA Laboratories, a division of RSA Data Security, Inc. License to copy
this document is granted provided that it is identified as "RSA Data Security, Inc. Public-Key
Cryptography Standards (PKCS)" in all material mentioning or referencing
refe rencing this document.
003-903015-110-000-000
Abstract. This
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.
1. Introduction
It is a generally accepted design principle that abstraction is a key to managing software development.
With abstraction, a designer can specify a part of a system without concern forf or how the part is actually
implemented or represented. Such a practice leaves the implementation open; it simplifies the
specification; and it makes it possible to state "axioms" about the part that can be proved when the
part is implemented, and assumed when the part is employed in another, higher-level part. Abstraction
is the hallmark of most modern software specifications.
One of the most complex systems today, and one that also involves a great deal of abstraction, is Open
Systems Interconnection (OSI, described in X.200). 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 ASN.1 (Abstract Syntax Notation One, defined
in X.208), and one set of rules for representing such objects as strings of ones and zeros is called the
BER (Basic Encoding Rules, defined in X.209). 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 value. Another set of rules, called the Distinguished Encoding Rules
(DER), which is a subset of BER, gives a unique encoding to each ASN.1A SN.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
DE R and an abridged list
of ASN.1 types and their BER and DER encodings. Sections 2-4 give an overview of ASN.1, BER,
http://luca.ntop.org/Teaching/Appunti/asn1.html 1/26
2/26/2016 A Layman's Guide to a Subset of ASN.1, BER, and DER
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, which define ASN.1 and BER. Terminology
and notation. In
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.
In ASN.1, a type is a set of values. For some types, there are a finite number of values, and for other
types there are an infinite number. A value of a given ASN.1 type is an element of the type's set.
ASN.1 has four kinds of type: simple types, which are "atomic" and have no components; structured
types, which have 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
aff ect 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, 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.
BIT STRING 3 03
OCTET STRING 4 04
NULL 5 05
OBJECT IDENTIFIER 6 06
SET and SET OF 17 11
PrintableString 19 13
T61String 20 14
IA5String 22 16
UTCTime 23 17
ASN.1 types and values are expressed in a flexible, programming-language-like notation, with the
following special rules:
Layout is not significant; multiple spaces and line breaks can be considered as a
single space.
Comments are delimited by pairs of hyphens (--), or a pair of hyphens and a line
break.
Identifiers (names of values and fields) and type references (names of types)
consist of upper- and lower-case letters, digits, hyphens, and spaces; identifiers
begin with lower-case letters; type references begin with upper-case letters.
The following four subsections give an overview of 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:
http://luca.ntop.org/Teaching/Appunti/asn1.html 3/26
2/26/2016 A Layman's Guide to a Subset of ASN.1, BER, and DER
OBJECT IDENTIFIER, an object identifier, which is a sequence of integer components that
identify an object such as an algorithm or attribute type.
Simple types fall into two categories: string types and non- string types. BIT STRING, IA5String,
OCTET STRING, PrintableString, T61String, 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 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 f our, all of which are relevant to
the PKCS standards:
SEQUENCE OF, an ordered collection of zero or more occurrences of a given type.
SET OF, an unordered collection of zero or more occurrences of a given type.
The structured types can have optional components, possibly with default values.
Tagging is useful to distinguish types within an application; it is also commonly used to distinguish
component types within a structured type. For instance, optional components of a SET or SEQUENCE
type are typically given distinct context-specific tags to avoid ambiguity.
Implicitly tagged types are 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 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).
The keyword [class number ] alone is the same as explicit tagging, except when the "module" in
which the ASN.1 type is defined has implicit tagging by default. ("Modules" are among the advanced
features not described in this note.)
http://luca.ntop.org/Teaching/Appunti/asn1.html 4/26
2/26/2016 A Layman's Guide to a Subset of ASN.1, BER, and DER
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).
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.
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 le ngth is indefinite.
End-of-contents octets. For the constructed, indefinite- length method, these denote the
end of the contents. For the other methods, these are absent.
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.
http://luca.ntop.org/Teaching/Appunti/asn1.html 5/26
2/26/2016 A Layman's Guide to a Subset of ASN.1, BER, and DER
Length octets. There are two forms: short (for lengths between 0 and 127), and long definite (for
lengths between 0 and 2^1008 -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 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.
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.
4. For structured types, implicitly tagged types derived from structured types, and
explicitly tagged types derived from anything, the constructed, 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.
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 focus of the
encodings is primarily on the contents octets; the tag and length octets follow Sections 3 and 4. 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.
http://luca.ntop.org/Teaching/Appunti/asn1.html 7/26
2/26/2016 A Layman's Guide to a Subset of ASN.1, BER, and DER
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.
ASN.1 notation:
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. (See Section 2.3.) 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.
Example: PKCS #8's PrivateKeyInfo type 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.
BER encoding. Primitive or constructed, depending on the underlying type. Contents octets are as for
the BER encoding of the underlying value.
Example: The BER encoding of the attributes component of a PrivateKeyInfo value is as follows:
the identifier octets are 80 if the underlying Attributes value has a primitive BER
encoding and a0 if the underlying Attributes value has a constructed BER
encoding
the length and contents octets are the same as the length and contents octets of the
BER encoding of the underlying Attributes value
DER encoding. Primitive or constructed, depending on the underlying type. Contents octets are as for
the DER encoding of the underlying value.
Explicit tagging denotes a type derived from another type by adding an outer tag to the underlying
http://luca.ntop.org/Teaching/Appunti/asn1.html 8/26
2/26/2016 A Layman's Guide to a Subset of ASN.1, BER, and DER
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.
ASN.1 notation:
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. (See Section 2.3.) For definitions
stated outside a module, the explicit inclusion of the keyword EXPLICIT is preferable to prevent
ambiguity.
Example 1: PKCS #7's ContentInfo type 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.
Example 2: X.509's Certificate type has a version component with an explicit, context-specific tag,
where the EXPLICIT keyword is omitted:
The tag is explicit because the default tagging method for the ASN.1 "module" in X.509 that defines
the Certificate type is explicit tagging.
BER encoding. Constructed. Contents octets are the BER encoding of the underlying value.
Example: the BER encoding of the content component of a ContentInfo value is as follows:
length octets represent the length of the BER encoding of the underlying ANY
DEFINED BY contentType value
contents octets are the BER encoding of the underlying ANY DEFINED BY
contentType value
DER encoding. Constructed. Contents octets are the DER encoding of the underlying value.
http://luca.ntop.org/Teaching/Appunti/asn1.html 9/26
2/26/2016 A Layman's Guide to a Subset of ASN.1, BER, and DER
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, for
parameters of a particular algorithm in X.509's AlgorithmIdentifier type, and for attribute values in
X.501's Attribute and AttributeValueAssertion types. The Attribute type is used by PKCS #6,
#7, #8, #9 and #10, and the AttributeValueAssertion type is used in X.501 distinguished names.
ASN.1 notation:
The ANY DEFINED BY identifier form can only appear in a component of a SEQUENCE or SET type for
which identifier identifies some other component, and that other component has type INTEGER or
OBJECT IDENTIFIER (or a type derived from either of those by tagging). In that form, the actual type
is determined by the value of the other component, either in the registration of the object identifier
value, or in a table of integer values.
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.
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 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, for digital signatures on certificates in X.509's Certificate type, and
for public keys in certificates in X.509's SubjectPublicKeyInfo type.
ASN.1 notation:
BIT STRING
BER encoding. 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.
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
03 04 06 6e 5d e0 padded with "100000"
03 81 04 06 6e 5d c0 long form of length octets
23 09 constructed encoding: "0110111001011101" + "11"
03 03 00 6e 5d
03 02 06 c0
DER encoding. Primitive. The contents octects are as for a primitive BER encoding, except that the
bit string is padded with zero-valued bits.
03 04 06 6e 5d c0
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.
ASN.1 notation:
CHOICE {
[identifier1] Type1,
...,
[identifiern] Typen }
where identifier1 , ..., identifiern are optional, distinct identifiers for the alternatives, and Type1, ...,
http://luca.ntop.org/Teaching/Appunti/asn1.html 11/26
2/26/2016 A Layman's Guide to a Subset of ASN.1, BER, and DER
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.
Here the identifiers for the alternatives are certificate and extendedCertificate , and the types of
the alternatives are Certificate and [0] IMPLICIT ExtendedCertificate .
BER encoding. Same as the BER encoding of the chosen alternative. The fact that the alternatives
have distinct tags makes it possible to distinguish between their BER encodings.
Example: The identifier octets for the BER encoding are 30 if the chosen alternative is certificate, and
a0 if the chosen alternative is extendedCertificate.
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. The character set includes non- printing control characters.
An IA5String value can have any length, including zero. This type is a string type.
The IA5String type is used in PKCS #9's electronic-mail address, unstructured-name, and
unstructured-address attributes.
ASN.1 notation:
IA5String
BER encoding. Primitive or constructed. In a primitive encoding, the contents octets give the
characters in the IA5 string, encoded in ASCII. In a constructed encoding, the contents octets give the
concatenation of the BER encodings of consecutive substrings of the IA5 string.
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:
16 0d 74 65 73 74 31 40 72 73 61 2e 63 6f 6d DER encoding
16 81 0d long form of length octets
74 65 73 74 31 40 72 73 61 2e 63 6f 6d
36 13 constructed encoding: "test1" + "@" +
16 05 74 65 73 74 31 "rsa.com"
16 01 40
16 07 72 73 61 2e 63 6f 6d
http://luca.ntop.org/Teaching/Appunti/asn1.html 12/26
2/26/2016 A Layman's Guide to a Subset of ASN.1, BER, and DER
16 0d 74 65 73 74 31 40 72 73 61 2e 63 6f 6d
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 and PKCS
#3's DHParameter type, a message-digest iteration count in PKCS #5's PBEParameter type, and
version numbers and serial numbers in X.509's Certificate type.
ASN.1 notation:
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.
The identifier v1988 is associated with the value 0. X.509's Certificate type uses the identifier
v1988 to give a default value of 0 for the version component:
BER encoding. Primitive. 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.
5.8 NULL
http://luca.ntop.org/Teaching/Appunti/asn1.html 13/26
2/26/2016 A Layman's Guide to a Subset of ASN.1, BER, and DER
ASN.1 notation:
NULL
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
DER encoding. Primitive. Contents octets are empty; the DER encoding of a NULL value is always
05 00.
The OBJECT IDENTIFIER type denotes an object identifier, a sequence of integer components that
identifies an object such as an algorithm, an attribute type, or perhaps a registration authority that
defines other object identifiers. An OBJECT IDENTIFIER value can have any number of components,
and components can generally have any nonnegative value. This type is a non-string type.
OBJECT IDENTIFIER values are given meanings by registration authorities. Each registration authority
is responsible for all sequences of components beginning with a given sequence. A registration
authority typically delegates responsibility for subsets of the sequences in its domain to other
registration authorities, or for particular types of object. There are always at least two components.
The OBJECT IDENTIFIER type is used to identify content in PKCS #7's ContentInfo type, to identify
algorithms in X.509's AlgorithmIdentifier type, and to identify attributes in X.501's Attribute and
AttributeValueAssertion types. The Attribute type is used by PKCS #6, #7, #8, #9, and #10, and
the AttributeValueAssertion type is used in X.501 distinguished names. OBJECT IDENTIFIER
values are defined throughout PKCS.
ASN.1 notation:
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.
Example: The following values both refer to the object identifier assigned to RSA Data Security, Inc.:
http://luca.ntop.org/Teaching/Appunti/asn1.html 14/26
2/26/2016 A Layman's Guide to a Subset of ASN.1, BER, and DER
(In this example, which gives ASN.1 value notation, the object identifier values are decimal, not
hexadecimal.) Table 4 gives some other object identifier values and their meanings.
BER encoding. Primitive. Contents octets are as follows, where value1, ..., valuen denote the integer
values of the components in the complete object identifier:
1. The first octet has value 40 * value1 + value2. (This is unambiguous, since value1
is limited to values 0, 1, and 2; value2 is limited to the range 0 to 39 when value1
is 0 or 1; and, according to X.208, n is always at least 2.)
2. The following octets, if any, encode value3, ..., valuen. Each value is encoded base
128, most significant digit first, with as few digits as possible, and the most
significant bit of each octet except the last in the value's encoding set to "1."
Example: The first octet of the BER encoding of RSA Data Security, Inc.'s object identifier is 40 * 1 +
2 = 42 = 2a16. The encoding of 840 = 6 * 128 + 4816 is 86 48 and the encoding of 113549 = 6 *
1282 + 7716 * 128 + d16 is 86 f7 0d. This leads to the following BER encoding:
06 06 2a 86 48 86 f7 0d
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, for message digests,
encrypted message digests, and encrypted content in PKCS #7, and f or private keys and encrypted
private keys in PKCS #8.
ASN.1 notation:
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.
Example: PKCS #5's PBEParameter type has a component of type OCTET STRING :
http://luca.ntop.org/Teaching/Appunti/asn1.html 15/26
2/26/2016 A Layman's Guide to a Subset of ASN.1, BER, and DER
BER encoding. 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.
Example: The BER encoding of the OCTET STRING value 01 23 45 67 89 ab cd ef can be any of
the following, among others, depending on the form of length octets and whether the encoding is
primitive or constructed:
04 08 01 23 45 67 89 ab cd ef DER encoding
04 81 08 01 23 45 67 89 ab cd ef long form of length octets
04 08 01 23 45 67 89 ab cd ef
5.11 PrintableString
The PrintableString type denotes an arbitrary string of printable characters from the following
character set:
A, B, ..., Z
a, b, ..., z
0, 1, ..., 9
(space) ' ( ) + , - . / : = ?
The PrintableString type is used in PKCS #9's challenge- password and unstructured-address
attributes, and in several X.521 distinguished names attributes.
ASN.1 notation:
PrintableString
BER encoding. Primitive or constructed. In a primitive encoding, the contents octets give the
characters in the printable string, encoded in ASCII. In a constructed encoding, the contents octets
give the concatenation of the BER encodings of consecutive substrings of the string.
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
13 81 0b
http://luca.ntop.org/Teaching/Appunti/asn1.html 16/26
2/26/2016 A Layman's Guide to a Subset of ASN.1, BER, and DER
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
5.12 SEQUENCE
ASN.1 notation:
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. T his requirement is
typically satisfied with explicit or implicit tagging on some of the components.
Here the identifiers for the components are start and end, and the types of the components are both
UTCTime .
BER encoding. Constructed. 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:
if the value of a component with the OPTIONAL or DEFAULT qualifier is absent from the sequence,
then the encoding of that component is not included in the contents octets
if the value of a component with the DEFAULT qualifier is the default value, then the encoding of
that component may or may not be included in the contents octets
http://luca.ntop.org/Teaching/Appunti/asn1.html 17/26
2/26/2016 A Layman's Guide to a Subset of ASN.1, BER, and DER
DER encoding. Constructed. 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.
5.13 SEQUENCE OF
The SEQUENCE OF type denotes an ordered collection of zero or more occurrences of a given type.
ASN.1 notation:
SEQUENCE OF Type
BER encoding. Constructed. Contents octets are the concatenation of the BER encodings of the
values of the occurrences in the collection, in order of occurence.
DER encoding. Constructed. Contents octets are the concatenation of the DER encodings of the
values of the occurrences in the collection, in order of occurence.
5.14 SET
ASN.1 notation:
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.
BER encoding. Constructed. 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:
http://luca.ntop.org/Teaching/Appunti/asn1.html 18/26
2/26/2016 A Layman's Guide to a Subset of ASN.1, BER, and DER
if the value of a component with the OPTIONAL or DEFAULT qualifier is absent from the set, then
the encoding of that component is not included in the contents octets
if the value of a component with the DEFAULT qualifier is the default value, then the encoding of
that component may or may not be included in the contents octets
DER encoding. Constructed. Contents octets are the same as for the BER encoding, except that:
1. If the value of a component with the DEFAULT qualifier is the default value, the encoding of that
component is not included.
5.15 SET OF
The SET OF type denotes an unordered collection of zero or more occurrences of a given type.
The SET OF type is used for sets of attributes in PKCS #6, #7, #8, #9 and #10, for sets of message-
digest algorithm identifiers, signer information, and recipient information in PKCS #7, and in X.501
distinguished names.
ASN.1 notation:
SET OF Type
RelativeDistinguishedName ::=
SET OF AttributeValueAssertion
BER encoding. Constructed. Contents octets are the concatenation of the BER encodings of the
values of the occurrences in the collection, in any order.
DER encoding. Constructed. 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.
5.16 T61String
The T61String type denotes an arbtrary string of T.61 characters. T.61 is an eight-bit extension to the
ASCII character set. Special "escape" sequences specify the interpretation of subsequent character
values as, for example, Japanese; the initial interpretation is Latin. The character set includes non-
printing control characters. The T61String type allows only the Latin and Japanese character
interepretations, and implementors' agreements for directory names exclude control characters
[NIST92]. A T61String value can have any length, including zero. This type is a string type.
The T61String type is used in PKCS #9's unstructured-address and challenge-password attributes,
and in several X.521 attributes.
http://luca.ntop.org/Teaching/Appunti/asn1.html 19/26
2/26/2016 A Layman's Guide to a Subset of ASN.1, BER, and DER
ASN.1 notation:
T61String
BER encoding. Primitive or constructed. In a primitive encoding, the contents octets give the
characters in the T.61 string, encoded in ASCII. In a constructed encoding, the contents octets give the
concatenation of the BER encodings of consecutive substrings of the T.61 string.
Example: The BER encoding of the T61String value "cl'es publiques" (French for "public keys") can
be any of the following, among others, depending on the form of length octets and whether the
encoding is primitive or constructed:
14 0f DER encoding
63 6c c2 65 73 20 70 75 62 6c 69 71 75 65 73
14 81 0f long form of length octets
63 6c c2 65 73 20 70 75 62 6c 69 71 75 65 73
34 15 constructed encoding: "cl'es" + " " +
14 05 63 6c c2 65 73 "publiques"
14 01 20
14 09 70 75 62 6c 69 71 75 65 73
The eight-bit character c2 is a T.61 prefix that adds an acute accent (') to the next character.
14 0f 63 6c c2 65 73 20 70 75 62 6c 69 71 75 65 73
5.17 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:
http://luca.ntop.org/Teaching/Appunti/asn1.html 20/26
2/26/2016 A Layman's Guide to a Subset of ASN.1, BER, and DER
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 and for certificate
validity periods in X.509's Validity type.
ASN.1 notation:
UTCTime
BER encoding. Primitive or constructed. In a primitive encoding, the contents octets give the
characters in the string, encoded in ASCII. In a constructed encoding, the contents octets give the
concatenation of the BER encodings of consecutive substrings of the string. (The constructed
encoding is not particularly interesting, since UTCTime values are so short, but the constructed
encoding is permitted.)
Example: The time this sentence was originally 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
6. An example
This section gives an example of ASN.1 notation and DER encoding: the X.501 type Name.
This section gives the ASN.1 notation for the X.501 type Name.
RelativeDistinguishedName ::=
SET OF AttributeValueAssertion
http://luca.ntop.org/Teaching/Appunti/asn1.html 21/26
2/26/2016 A Layman's Guide to a Subset of ASN.1, BER, and DER
The Name type identifies an object in an X.500 directory. Name is a CHOICE type consisting of one
alternative: RDNSequence . (Future revisions of X.500 may have other alternatives.)
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 RelativeDistinguishedName type gives a unique name to an object relative to the object
superior to it in the directory tree. RelativeDistinguishedName SET OF type consisting of zero or
more occurrences of AttributeValueAssertion .
The AttributeType type identifies an attribute by object identifier. The AttributeValue type gives
an arbitrary attribute value. The actual type of the attribute value is determined by the attribute type.
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 the Test User 1 from the PKCS examples [Kal93]. The name is represented by the
following path:
(root)
|
countryName = "US"
|
organizationName = "Example Organization"
|
commonName = "Test User 1"
Each level corresponds to one RelativeDistinguishedName value, each of which happens for this
name to consist of one AttributeValueAssertion value. The AttributeType value is before the
equals sign, and the AttributeValue value (a printable string for the given attribute types) is after the
equals sign.
The countryName , organizationName , and commonUnitName are attribute types defined in X.520 as:
6.2.1 AttributeType
http://luca.ntop.org/Teaching/Appunti/asn1.html 22/26
2/26/2016 A Layman's Guide to a Subset of ASN.1, BER, and DER
The three AttributeType values are OCTET STRING values, so their DER encoding follows the
primitive, definite-length method:
06 03 55 04 06 countryName
06 03 55 04 0a organizationName
06 03 55 04 03 commonName
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 (in decimal): 40 * 2 + 5 = 85 = 5516; 4; and 6, 10, or 3.
6.2.2 AttributeValue
The three AttributeValue values are PrintableString values, so their encodings follow the
primitive, definite-length method:
13 02 55 53 "US"
13 14 "Example Organization"
45 78 61 6d 70 6c 65 20 4f 72 67 61 6e 69 7a 61
74 69 6f 6e
13 0b "Test User 1"
54 65 73 74 20 55 73 65 72 20 31
The identifier octets follow the low-tag-number form, since the tag for PrintableString , 19
(decimal), is between 0 and 30. Bits 8 and 7 have value "0" since PrintableString is in the universal
class. Bit 6 has value "0" since 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
The three AttributeValueAssertion values are SEQUENCE values, so their DER encodings follow the
constructed, definite-length method:
30 09 countryName = "US"
06 03 55 04 06
13 02 55 53
30 1b organizationName = "Example Organization"
06 03 55 04 0a
13 14 ... 6f 6e
30 12 commonName = "Test User 1"
06 03 55 04 0b
13 0b ... 20 31
The identifier octets follow the low-tag-number form, since the tag for SEQUENCE , 16 (decimal), is
between 0 and 30. Bits 8 and 7 have value "0" since SEQUENCE is in the universal class. Bit 6 has value
"1" since 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
http://luca.ntop.org/Teaching/Appunti/asn1.html 23/26
2/26/2016 A Layman's Guide to a Subset of ASN.1, BER, and DER
The three RelativeDistinguishedName values are SET OF values, so their DER encodings follow the
constructed, definite-length method:
31 0b
30 09 ... 55 53
31 1d
30 1b ... 6f 6e
31 14
30 12 ... 20 31
The identifier octets follow the low-tag-number form, since the tag for SET OF, 17 (decimal), is
between 0 and 30. Bits 8 and 7 have value "0" since SET OF is in the universal class Bit 6 has value
"1" since 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 RDNSequence value is a SEQUENCE OF value, so its DER encoding follows the constructed,
definite-length method:
30 42
31 0b ... 55 53
31 1d ... 6f 6e
31 14 ... 20 31
The identifier octets follow the low-tag-number form, since the tag for SEQUENCE OF , 16 (decimal), is
between 0 and 30. Bits 8 and 7 have value "0" since SEQUENCE OF is in the universal class. Bit 6 has
value "1" since 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.
6.2.6 Name
The Name value is a CHOICE value, so its DER encoding is the same as that of the RDNSequence value:
30 42
31 0b
30 09
06 03 55 04 06 attributeType = countryName
13 02 55 53 attributeValue = "US"
31 1d
30 1b attributeType = organizationName
06 03 55 04 0a
attributeValue = "Example
13 14
45 78 61 6d 70 6c 65 20 4f 72 67 Organization"
67 61 6e 69 7a 61 74 69 6f 6e
31 14
30 12
06 03 55 04 03
13 0b attributeType = commonName
54 65 73 74 20 55 73 65 72 20 31 attributeValue = "Test User 1"
References
http://luca.ntop.org/Teaching/Appunti/asn1.html 24/26
2/26/2016 A Layman's Guide to a Subset of ASN.1, BER, and DER
PKCS #1 RSA Laboratories. PKCS #1: RSA Encryption Standard. Version 1.5, November 1993.
PKCS #3 RSA Laboratories. PKCS #3: Diffie-Hellman Key- Agreement Standard. Version 1.4,
November 1993.
PKCS #5 RSA Laboratories. PKCS #5: Password-Based Encryption Standard. Version 1.5,
November 1993.
PKCS #6 RSA Laboratories. PKCS #6: Extended-Certificate Syntax Standard. Version 1.5,
November 1993.
PKCS #7 RSA Laboratories. PKCS #7: Cryptographic Message Syntax Standard. Version 1.5,
November 1993.
PKCS #8 RSA Laboratories. PKCS #8: Private-Key Information Syntax Standard. Version 1.2,
November 1993.
PKCS #9 RSA Laboratories. PKCS #9: Selected Attribute Types. Version 1.1, November 1993.
PKCS #10 RSA Laboratories. PKCS #10: Certification Request Syntax Standard. Version 1.0,
November 1993.
X.200 CCITT. Recommendation X.200: Reference Model of Open Systems Interconnection for CCITT
Applications. 1984.
X.208 CCITT. Recommendation X.208: Specification of Abstract Syntax Notation One (ASN.1). 1988.
X.209 CCITT. Recommendation X.209: Specification of Basic Encoding Rules for Abstract Syntax
Notation One (ASN.1). 1988.
[Kal93] Burton S. Kaliski Jr. Some Examples of the PKCS Standards. RSA Laboratories, November
1993.
[NIST92] NIST. Special Publication 500-202: Stable Implementation Agreements for Open Systems
Interconnection Protocols. Part 11 (Directory Services Protocols). December 1992.
Revision history
June 3, 1991 version
The June 3, 1991 version is part of the initial public release of PKCS. It was published as NIST/OSI
Implementors' Workshop document SEC-SIG-91-17.
The November 1, 1993 version incorporates several editorial changes, including the addition of a
http://luca.ntop.org/Teaching/Appunti/asn1.html 25/26
2/26/2016 A Layman's Guide to a Subset of ASN.1, BER, and DER
revision history. It is updated to be consistent with the following versions of the PKCS documents:
PKCS #7: Cryptographic Message Syntax Standard. Version 1.5, November 1993.
PKCS #8: Private-Key Information Syntax Standard. Version 1.2, November 1993.
PKCS #10: Certification Request Syntax Standard. Version 1.0, N ovember 1993.
Author's address
Burton S. Kaliski Jr., Ph.D.
Chief Scientist
RSA Laboratories (415) 595-7703
100 Marine Parkway (415) 595-4126 (fax)
Redwood City, CA 94065 USA [email protected]
http://luca.ntop.org/Teaching/Appunti/asn1.html 26/26