Basic Encoding Rules

Algorithme utilisé par Up ! Abstract Syntax Notation One

Le standard Basic Encoding Rules (BER) de l'International Telecommunication Union (ITU) permet d'encoder et de décoder un flux Abstract Syntax Notation One (ASN.1) en un flux binaire.

Une valeur est encodée de deux manières possibles :

Préambule

Le préambule est codé sur un octet. Il sert à définir :

Voici comment est codé le contexte :

Code binaire.Sémantique.
00xx xxxxUniversel.
01xx xxxxApplication.
10xx xxxxSpécifique.
11xx xxxxPrivé.

Voici comment est codé l'indicateur de construction :

Code binaire.Sémantique.
xx0x xxxxType primitif.
xx1x xxxxType construit.

Voici comment est codée le numéro de l'étiquette :

Par exemple :

Les types de données primitifs d'ASN.1 sont tous de classe universelle. Leur étiquettage est le suivant :

Code binaire.Type Asn.1.
0Réservé pour EXPLICIT.
1BOOLEAN
2INTEGER
3BIT STRING
4OCTET STRING
5NULL
6OBJECT IDENTIFIER
7ObjectDescriptor
8EXTERNAL
9REAL
10ENUMERATED
11EMBEDDED-PDV
12UTF8String
13RELATIVE-OID
16SEQUENCE ou SEQUENCE OF
17SET ou SET OF
18NumericString
19PrintableString
20TeletexString ou T61String
21VideotextString
22IA5String
23UTCTime
24GeneralizedTime
25GraphicString
26VisibleString ou ISO646String
27GeneralString
28UniversalString
29CHARACTER STRING
30BMPString

Taille

Quand la taille de la valeur est connue à l'avance et inferieure à 2^127, voici comment elle est codée :

Par exemple :

Quand la taille de la valeur n'est pas connue à l'avance ou est supérieure ou égale à 2^127, un codage dynamique est utilisé :

En ce cas, nous n'utilisons plus le triplet (Préambule, Taille, Valeur) mais le quadruplet (Préambule, Taille, Valeur, Marque fin de contenu).

Valeur

BIT STRING

Les valeurs du type Asn.1 BIT STRING se codent de deux manières :

BOOLEAN

Les valeurs du type Asn.1 BOOLEAN se codent en statique de la manière suivante :

Chaînes de caractèress

Les valeurs du type Asn.1 IA5String se codent de deux manières :

Les valeurs des types BMPString, ISO646String, GeneralizedTime, GeneralString, GraphicString, NumericString, PrintableString, TeletexString, UTF8String, VideotextString, UniversalString, UTCTime et VisibleString se codent de la même manière si ce n'est qu'il faut mettre le numéro du type correspondant à la place de celui de IA5String.

CHARACTER STRING

Les valeurs du type Asn.1 CHARACTER STRING se codent comme la séquence correspondant incluant le codage de la chaîne de caractères stricto sensus comme une valeur du type OCTET STRING.

CHOICE

Les choix se codent au travers de la propriété choisie. Ainsi, le codage complet de :
MaValeur CHOICE ::= TRUE
est 0x01 0x01 0xFF.

EMBEDDED-PDV

Les valeurs du type Asn.1 EMBEDDED-PDV se codent comme la séquence qui la définit.

ENUMERATED

Les valeurs du type Asn.1 ENUMERATED se codent en statique dans l'ordre poids fort puis poids faible.

Ainsi, le codage complet de :

EXTERNAL

Les valeurs du type Asn.1 EXTERNAL se codent comme la séquence qui la définit dans la norme 1990 et non ans la norme de 1994. L'objectif est de rester compatible ascendant.

INTEGER

Les valeurs du type Asn.1 INTEGER se codent en statique dans l'ordre poids fort puis poids faible.

Ainsi, le codage complet de :

NULL

La valeur du type Asn.1 NULL se code en statique sans octet de valeur. Le codage complet est donc 0x05 0x00.

OBJECT IDENTIFIER

Chaque arc de l'identifiant de l'objet est un nombre entier encodé en binaire dans l'ordre poids fort puis poids faible avec quelques particularités pour :

Ainsi, le codage complet de { iso(1) member-body(2) us(840) rsadsi(113549) pkcs(1) pkcs-1(1) modules(0) pkcs-1(1) } est 0x06 0x0A 0x2A 0x86 0x48 0x86 0xF7 0x0D 0x01 0x01 0x00 0x01.

OCTET STRING

Les valeurs du type Asn.1 OCTET STRING se codent de deux manières :

REAL

Même si les valeurs du type Asn.1 REAL sont modélisés par des séquences, leurs codage est spécifique.

Ainsi, le codage complet de 3.14159 est :

RELATIVE-OID

Chaque arc de l'identifiant de l'objet est un nombre entier encodé en binaire dans l'ordre poids fort puis poids faible de la manière suivante :

Ainsi, le codage complet de { us(840) rsadsi(113549) pkcs(1) pkcs-1(1) modules(0) pkcs-1(1) } est 0x06 0x09 0x48 0x86 0xF7 0x0D 0x01 0x01 0x00 0x01.

SEQUENCE

Les séquences se codent comme des types construits en respectant l'ordre des propriétés. Ainsi, le codage complet de :
MaValeur SEQUENCE ::=
est 0x30 0x0E

Selon une option du protocole, les valeurs par défaut peuvent encodées ou non.

Les valeurs du type SEQUENCE OF se codent de la même manière si ce n'est qu'il faut mettre le numéro du type correspondant à la place de celui de SEQUENCE.

SET

Les ensembles se codent comme des types construits en prenant un ordre quelconque pour les propriétés. Ainsi, le codage complet de :
MaValeur SET ::=
est 0x31 0x0E

Selon une option du protocole, les valeurs par défaut peuvent encodées ou non.

Les valeurs du type SET OF se codent de la même manière si ce n'est qu'il faut mettre le numéro du type correspondant à la place de celui de SET.

Codage des étiquettes

L'algorithme de codage précédent ne tient pas compte des instructions IMPLICIT et EXPLICIT. Il lui faut donc ajouter les règles suivantes.

Etiquettage implicite

L'étiquettage est implicite si soit :

En ce cas, le contexte est codé comme un type non construit xx0x xxxx, en spécifique 10xx xxxx, sauf si un autre contexte est précisé. Le numéro de l'étiquette est celui fourni entre caractères crochet ouvrant [ et crochet fermant ] et non le code universel du type.

Par exemple :

Etiquettage explicite

L'étiquettage est explicite si soit :

En ce cas, le contexte est codé comme un type construit xx1x xxxx, en spécifique 10xx xxxx, sauf si un autre contexte est précisé, et la valeur est :

Par exemple :

Variantes du standard Basic Encoding Rules

Il existe deux variantes du standard Basic Encoding Rules (BER) permettant d'optimiser la taille du flux binaire :

En comparaison, le codage Basic Encoding Rules (BER) est plus généraliste.

Canonical Encoding Rules

Voici les règles supplémentaires à appliquer au codage Basic Encoding Rules (BER) pour le transformer en codage Canonical Encoding Rules (CER) :

Le mode canonique a la particularité de ne permettre qu'un seul choix d'encodage pour chaque typologie de valeurs.

Distinguished Encoding Rules

Voici les règles supplémentaires à appliquer au codage Basic Encoding Rules (BER) pour le transformer en codage Distinguished Encoding Rules (DER) :