Une valeur est encodée de deux manières possibles :
Voici comment est codé le contexte :
Code binaire. | Sémantique. |
00xx xxxx | Universel. |
01xx xxxx | Application. |
10xx xxxx | Spécifique. |
11xx xxxx | Privé. |
Voici comment est codé l'indicateur de construction :
Code binaire. | Sémantique. |
xx0x xxxx | Type primitif. |
xx1x xxxx | Type construit. |
Voici comment est codée le numéro de l'étiquette :
xxx1 1111
.
1xxx xxxx
.
0xxx xxxx
.
Par exemple :
xxx0 1101
.
xxx1 1111 1000 0001 0000 0001
.
Les types de données primitifs d'ASN.1 sont tous de classe universelle. Leur étiquettage est le suivant :
Code binaire. | Type Asn.1. |
0 | Réservé pour EXPLICIT . |
1 | BOOLEAN |
2 | INTEGER |
3 | BIT STRING |
4 | OCTET STRING |
5 | NULL |
6 | OBJECT IDENTIFIER |
7 | ObjectDescriptor |
8 | EXTERNAL |
9 | REAL |
10 | ENUMERATED |
11 | EMBEDDED-PDV |
12 | UTF8String |
13 | RELATIVE-OID |
16 | SEQUENCE ou SEQUENCE OF |
17 | SET ou SET OF |
18 | NumericString |
19 | PrintableString |
20 | TeletexString ou T61String |
21 | VideotextString |
22 | IA5String |
23 | UTCTime |
24 | GeneralizedTime |
25 | GraphicString |
26 | VisibleString ou ISO646String |
27 | GeneralString |
28 | UniversalString |
29 | CHARACTER STRING |
30 | BMPString |
0xxx xxxx
.
1xxx xxxx
.
Par exemple :
0000 1101
.
1000 0001 1000 0001
.
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é :
1000 0000
.
0000 0000 0000 0000
.
En ce cas, nous n'utilisons plus le triplet (Préambule, Taille, Valeur) mais le quadruplet (Préambule, Taille, Valeur, Marque fin de contenu).
BIT STRING
se codent de deux manières :
Ainsi, le codage complet de 0101 0011 0001 11
est donc 0x03 0x03 0x02 0x53 0x1C
.
1000 0000
.
BIT STRING
.0000 0000 0000 0000
.
Ainsi, le codage complet de 0101 0011 0001 11
est donc 0x23 0x80 0x03 0x02 0x00 0x53 0x03 0x02 0x02 0x1C 0x00 0x00
.
BOOLEAN
se codent en statique de la manière suivante :
TRUE
.1111 1111
soit 0xFF
. Le codage complet est donc 0x01 0x01 0xFF
.
FALSE
.0000 0000
soit 0x00
. Le codage complet est donc 0x01 0x01 0x00
.
IA5String
se codent de deux manières :
Ainsi, le codage complet de AB"
est donc 0x16 0x02 0x41 0x42
.
1000 0000
.
IA5String
.0000 0000 0000 0000
.
Ainsi, le codage complet de AB"
est donc 0x16 0x80 0x16 0x01 0x41 0x16 0x01 0x42 0x00 0x00
.
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
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
.
MaValeur CHOICE
{
MaProprieteA [0] BOOLEAN,
MaProprieteB [1] INTEGER,
MaProprieteC [2] CHARACTER STRING
}
::= TRUE
0x01 0x01 0xFF
.
EMBEDDED-PDV
se codent comme la séquence qui la définit.
ENUMERATED
se codent en statique dans l'ordre poids fort puis poids faible.
Ainsi, le codage complet de :
0x02 0x01 0x0D
.
0x02 0x02 0xFF 0xFE
.
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
se codent en statique dans l'ordre poids fort puis poids faible.
Ainsi, le codage complet de :
0x02 0x01 0x0D
.
0x02 0x02 0xFF 0xFE
.
NULL
se code en statique sans octet de valeur. Le codage complet est donc 0x05 0x00
.
itu-t
, iso
ou joint-iso-itu-t
et celle ValeurArc2 du second est comprise entre 0 et 39, aussi le codage est le suivant :
Arc. | Valeur. |
itu-t | ValeurArc2 |
iso | 40+ValeurArc2 |
joint-iso-itu-t | 80+ValeurArc2 |
1xxx xxxx
.
0xxx xxxx
.
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
se codent de deux manières :
Ainsi, le codage complet de 0xAB 0xCD
est donc 0x04 0x02 0xAB 0xCD
.
1000 0000
.
OCTET STRING
.0000 0000 0000 0000
.
Ainsi, le codage complet de 0xAB 0xCD
est donc 0x24 0x80 0x04 0x01 0xAB 0x04 0x01 0xCD 0x00 0x00
.
REAL
sont modélisés par des séquences, leurs codage est spécifique.
PLUS-INFINITY
se code en 0100 0000
soit en codage complet 0x09 0x01 0x40
.
MINUS-INFINITY
se code en 0100 0001
soit en codage complet 0x09 0x01 0x41
.
0000 0001
pour la forme ISO 6093 NR1.[Signe][Chiffre]+
. Par exemple -10, -1, 1, 10, +1, +10.
0000 0010
pour la forme ISO 6093 NR2.[Signe][Chiffre]+.[Chiffre]*
. Par exemple -10., -10.0, -1., -1.0, 1., 1.0, +1., +1.0, 10., 10., 10.0, +10., +10.0.
0000 0011
pour la forme ISO 6093 NR3.[Signe][Chiffre]+.[Chiffre]*E[Signe][Exposant]
. Par exemple -1.E01, -1.0E+01, -1.E00, -1.0E+00, 1.E00, 1.0E+00, +1.E00, +1.0E+00, 1.E01, 1.0E+01, +1.E01, +1.0E+01.
1xxx xxxx
est une marque pour se distinguer du codage décimal.
Code binaire. | Sémantique. |
x0xx xxxx | Positif. |
x1xx xxxx | Négatif. |
Code binaire. | Sémantique. |
xx00 xxxx | Base 2. |
xx01 xxxx | Base 8. |
xx10 xxxx | Base 16. |
Code binaire. | Sémantique. |
xxxx 00xx | Echelle 0. |
xxxx 01xx | Echelle 1. |
xxxx 10xx | Echelle 2. |
xxxx 11xx | Echelle 3. |
Code binaire. | Sémantique. |
xxxx xx00 | Sur un octet. |
xxxx xx01 | Sur deux octets. |
xxxx xx10 | Sur trois octets. |
xxxx xx11 | Sur un nombre variable d'octets. |
Les octets de la valeur du codage binaire sont :
La valeur de la mantisse est Mantisse=Signe*PseudoMantisse*2^Echelle
.
La valeur du réel est donc Reel=Signe*PseudoMantisse*2^Echelle*Base^Exposant
.
Ainsi, le codage complet de 3.14159 est :
0x09 0x0x08 0x02 0x33 0x2E 0x31 0x34 0x31 0x35 0x39
en décimal forme 2.
0x09 0x0x0C 0x03 0x33 0x2E 0x31 0x34 0x31 0x35 0x39 0x45 0x2B 0x30 0x30
en décimal forme 3.
0x09 0x0x05 0x80 0x00 0x04 0xCB 0x2F
en base 2 avec un exposant sur un octet.
1xxx xxxx
.
0xxx xxxx
.
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
.
MaValeur SEQUENCE
{
MaProprieteA BOOLEAN,
MaProprieteB INTEGER,
MaProprieteC CHARACTER STRING
}
::=
{
MaProprieteA TRUE,
MaProprieteB 13,
MaProprieteC "COUCOU"
}
0x30 0x0E
0x01 0x01 0xFF
0x02 0x01 0x0D
0x1D 0x06 0x43 0x4F 0x55 0x43 0x4F 0x55
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
.
MaValeur SET
{
MaProprieteA BOOLEAN,
MaProprieteB INTEGER,
MaProprieteC CHARACTER STRING
}
::=
{
MaProprieteA TRUE,
MaProprieteB 13,
MaProprieteC "COUCOU"
}
0x31 0x0E
0x01 0x01 0xFF
0x02 0x01 0x0D
0x1D 0x06 0x43 0x4F 0x55 0x43 0x4F 0x55
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
.
IMPLICIT
et EXPLICIT
. Il lui faut donc ajouter les règles suivantes.
IMPLICIT TAGS
.
IMPLICIT
.
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 :
MaValeur [4] IMPLICIT INTEGER = 5
a pour codage complet 0x84 0x01 0x05
.
MaValeur [APPLICATION 4] IMPLICIT INTEGER = 5
a pour codage complet 0x44 0x01 0x05
.
MonType := [4] IMPLICIT INTEGER
MaValeur [APPLICATION 6] IMPLICIT MonType = 5
0x84 0x01 0x05
.
EXPLICIT TAGS
.
EXPLICIT
.
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 :
MaValeur [4] EXPLICIT INTEGER = 5
a pour codage complet 0xA4 0x03 0x02 0x01 0x05
.
MaValeur [APPLICATION 4] EXPLICIT INTEGER = 5
a pour codage complet 0x64 0x03 0x02 0x01 0x05
.
MonType := [4] EXPLICIT INTEGER
MaValeur [APPLICATION 6] EXPLICIT MonType = 5
0x64 0x05 0xA4 0x03 0x02 0x01 0x05
.
En comparaison, le codage Basic Encoding Rules (BER) est plus généraliste.
Le mode canonique a la particularité de ne permettre qu'un seul choix d'encodage pour chaque typologie de valeurs.