1.2 Tipi di dati ASN.1
1.2.7 Notazione e Codifica
Presentiamo una rapida carrellata delle regole di codifica BER e DER per qualcuno dei tipi di dato incontrati. Dove necessario saranno anche riportate le regole della notazione ASN.1.
Tipi con tagging implicito
Ricordiamo che un tipo taggato implicitamente è un tipo derivato da un altro tipo cambiando il tag del tipo sottostante.
Notazione ASN.1. [[class] number] IMPLICIT Type
dove Type è un tipo, class è un nome di classe (opzionale), e number rappresenta il tag number all’interno della classe prescelta. Se il nome della classe è assente, allora il tag è context-specific. Questi ultimi possono solo apparire in un componente di un tipo CHOICE o strutturato.
Codifica BER. metodo primitivo o costruito, a seconda del tipo sottostante. I content octets sono come per la codifica BER del tipo sottostante. Ad esempio la codifica BER del campo thesis del tipo Students avrà 80 per id octet (sarebbe stato a0 se il tipo sottostante avesse avuto bisogno di metodo costruito per la codifica) mentre gli altri ottetti saranno gli stessi della codifica del tipo sottostante (il BOOLEAN).
Codifica DER. primitivo o costruito a seconda del tipo sottostante. I content octets sono come per la codifica BER del tipo sottostante.
Tipi con tagging esplicito
Ricordiamo che un tipo taggato esplicitamente è un tipo derivato da un altro tipo aggiungendo un tag esterno al tipo sottostante.
Notazione ASN.1. [[class] number] EXPLICIT Type
dove Type è un tipo, class è un nome di classe (opzionale), e number rappresenta il tag number all’interno della classe prescelta (un intero non negativo). Se il nome della classe è assente, allora il tag è context-specific. Questi ultimi possono solo apparire in un componente di un tipo SEQUENCE, SET o CHOICE.
Codifica BER. metodo costruito. I content octets sono la codifica BER del tipo sottostante.
Ad esempio la codifica BER del campo thesis del tipo StudentsExp sarà a1 per id octet (il metodo è costruito e il tag number vale 1), i length octet rappresenteranno la lunghezza della codifica BER del tipo sottostante (il BOOLEAN), i content octet sono la codifica BER del tipo sottostante
Codifica DER. costruito. I content octets sono la codifica DER del tipo sottostante.
Tipo ANY
Ricordiamo che il tipo ANY denota un valore arbitrario di un tipo arbitrario, dove il tipo arbitrario è possibilmente definito nella registrazione di un object identifier o associato con un indice intero.
Notazione ASN.1. ANY [DEFINED BY identifier] dove identifier è un identificatore opzionale.
Nella forma ANY il tipo attuale è indeterminato.
La forma ANY DEFINED BY identifier può solo apparire in un componente di una
SEQUENCE o di una SET per le quali identifier identifica qualche altro componente di tipo INTEGER o OBJECT IDENTIFIER (o derivati da quest’ultimi mediante tagging).
In questa forma il tipo attuale è determinato dal valore identificato da identifier.
Codifica BER. come la codifica BER del valore attuale. Codifica DER. come la codifica DER del valore attuale.
Tipo BIT STRING
Ricordiamo che il tipo BIT STRING denota una stringa arbitraria di bits. Un valore BIT STRING può avere ogni lunghezza incluso zero. Questo è ovviamente un tipo stringa.
Codifica BER. primitivo o costruito. In una codifica primitiva, il primo content octet comunica il numero di bit per i quali la lunghezza della stringa è minore del prossimo multiplo di 8 (questo content octet è chiamato il numero di bit non usati). I successivi content octet contengono il valore della stringa di bit convertita a octet string. Il processo di conversione avviene come segue:
1. Viene fatto il pad della stringa di bit dopo l’ultimo bit con da zero a sette bit di valore qualsiasi così da portare la lunghezza della stringa ad un multiplo di otto.
2. La stringa con il pad è divisa in ottetti.
Nella codifica costruita, i content octets danno la concatenazione della codifica BER di sottostringhe consecutive di bit, ognuna delle quali di lunghezza multipla di otto (eccetto l’ultima). Le regole di codifica saranno illustrate nell’esempio che segue.
Esempio: La codifica BER di ’011011100101110111’ può essere ognuna delle seguenti a seconda delle scelte circa bit di padding, forma di length octet e tipo di codifica (primitiva o costruita):
03 04 06 6e 5d c0 codifica DER
03 04 06 6e 5d e0 pad con ’100000’
03 81 04 06 6e 5d c0 forma lunga di length octet
23 09 codifica costruita: ’0110111001011101’ + ’11’ 03 03 00 6e 5d
03 02 06 c0
Nell’ultimo caso la stringa viene divisa in due sottostringhe la prima di lunghezza multipla di 8 e la seconda (e ultima) ’11’ codificata dopo il pad con ’000000’.
Codifica DER. metodo primitivo. I content octet sono gli stessi della codifica BER eccetto per il fatto che i bit di pad sono tutti zero.
Tipo INTEGER
Il tipo INTEGER denota un intero arbitrario. I valori INTEGER possono essere positivi, negativi o nulli.
Codifica BER. primitivo. I content octets danno il valore dell’intero, base 256, nella forma complemento a due, MSD, con il minimo numero di ottetti. Il valore 0 è codificato con un ottetto 00.
Codifica DER. primitivo. I content octet sono gli stessi della codifica BER.
Tipo OBJECT IDENTIFIER
Il tipo OBJECT IDENTIFIER denota un identificatore di oggetto, una sequenza di componenti interi che identificano un oggetto come un algoritmo o un attributo. Un valore OBJECT IDENTIFIER può avere un numero qualsiasi di componenti e i componenti stessi possono avere ogni valore non negativo.
Il significato ai valori di un OBJECT IDENTIFIER è dato dalle registration authority. Ogni registration authority è responsabile per tutte le sequenze di componenti che cominciano con una dato prefisso. La tabella mostra qualche object identifier con il rispettivo significato.
Object identifier Value Significato
{ 1 2 840 } US (ANSI)
{ 1 2 840 113549 } RSA Data Security, Inc.
{ 1 2 840 113549 1 } RSA Data Security, Inc. PKCS
{ 2 5 } directory service (X.500)
{ 2 5 8 } directory service – algorithms
Tabella 1 Object identifier e il loro significato
Notazione ASN.1. { [identifier] component1 . . . componentn} componenti = identifieri | identifieri (valuei) | valuei
dove identifier, identifier1, . . . , identifiern sono identificatori e value1, . . . , valuen
sono interi opzionali.
Codifica BER. primitivo. I content octets seguono le regole seguenti (value1, . . . , valuen identificano i valori interi delle componenti dell’OBJECT IDENTIFIER):
1. Il primo ottetto ha il valore 40 × value1 + value2. Questo non è ambiguo, visto che value1 è limitato al valore 0, 1 e 2; value2 è limitato al range da 0 a 39 quando value1 è 0 oppure 1 e, in accordo a X.208, n è almeno 2.
2. Gli ottetti seguenti codificano i valori value3, . . . , valuen. Ogni valore è codificato base 128 con il bit più significativo posto a 1 eccetto per l’ultimo.
Codifica DER. metodo primitivo. I content octet sono gli stessi della codifica BER.
Ricordiamo che il tipo OCTET STRING denota una stringa arbitraria di ottetti (valori ad otto bit). Un OCTET STRING può avere lunghezza qualsiasi compreso 0. Questo è, ovviamente, un tipo stringa.
Notazione ASN.1. OCTET STRING ({size | size1 . . . size2 }) dove size, size1, size2 sono taglie costanti opzionali.
Nella forma OCTET STRING size il valore octet string dovr´a avere esattamente size ottetti, nella forma con size1 . . . size2 la stringa dovr´a avere tra size1 e size2 ottetti. La forma OCTET STRING può avere un numero qualsiasi di ottetti.
Codifica BER. primitivo o costruito. Nella codifica primitiva , i content octets danno il valore dell’octet string dal primo all’ultimo ottetto. Nella codifica costruita, invece, i content octets danno la concatenazione della codifica BER di sottostringhe di OCTET STRING.