Basic Encoding Rules
Introduzione
Basic Encoding Rules, abbreviata BER è una codifica rappresentante una serie di regole per la conversione di dati eterogenei in flussi di bytes.
La codifica BER è associata allo standard ASN.1 ed è utilizzata per le comunicazioni SNMP e LDAP.
Il sistema di codifica è basato sul concetto di tripla <T,L,V> (Type o Tag, Length, Value) dove:
- Type o Tag : indica il tipo del dato codificato
- Length : indica la lunghezza in byte di "Value"
- Value : E' il dato codificato vero e proprio
Quindi ad esempio per codificare il dato 7 come INTERO occorreranno 3 bytes:
- il primo che indica il tipo (INTERO = 0x02)
- il secondo che indica la lunghezza di v (in questo caso = 0x01)
- il terzo è la codifica di un dato intero secondo BER (in questo caso 0x07)
In definitiva INTEGER 7 in BER diviene 0x020107 dove si distinguono chiaramente T,L e V
BER e ASN.1
BER è strettamente legata ad ASN.1 soprattutto per quanto riguarda i tipi di dati. Come si puo' immaginare la codifica di V dipende dal tipo T. Ci sono alcuni tipi predefiniti in ASN.1 (si dice che sono Tag appartenenti alla Class UNIVERSAL). Per maggiori info a tal proposito consultare [1] o [2]
Codifica BER
In generale quando si deve effettuare la codifica BER di un dato si procede ne seguente modo:
- si codifica T
- si codifica V
- dalla lunghezza di V si passa alla codifica di L
Vediamo ora la codifica di ogni campo.
Codifica di T
La codifica del campo T di solito chiede un unico Byte. La codifica dipende dai seguenti fattori:
- la classe di appartenenza del Tag
- il tipo è PRIMITIVE o CONSTRUCTED
- l'identificativo del Tag nella classe di appartenenza
Se l'identificativo del tipo allora la codifica di T richiede un unico byte, altrimenti il numero di byte di T dipenderà dal valore di ID
Primo byte di T
Vediamo qui sotto come si presenta il primo byte di T:
La codifica di CLASS segue la seguente tabella:
bit 7 bit 6 CLASS ----------------------------------- 0 0 UNIVERSAL 0 1 APPLICATION 1 0 context-specific 1 1 PRIVATE
Il bit P\C = 0 indica il tipo PRIMITIVE (cioè un tipo semplice come INTEGER o OID)
Il bit P\C = 0 indica il tipo CONSTRUCTED (cioè un tipo composto da più tipi semplici come ad es. SEQUENCE)
I 5 byte di TAG invece:
- contengono il valore binario di ID se
- contengono 11111 se
Nel primo caso, come è stato già detto, il T è composto da un unico byte. Nel secondo caso vanno invece codificati gli altri bytes di T
Altri bytes di T
Per codificare gli altri bytes si procede nel seguente modo:
- si converte ID in binario
- si aggiunge un 1 ogni 7 bit
- si completa il byte con un 1 in testa
Ad es. se ID = 250 in base 10, allora:
- 250 = 0xFA = 11111010
- 11111010 -> 1 11111010
- 1 11111010 -> 10000001 11111010
In definitiva ID = 250 viene codificato con 0x81FA
Esempio 1 di codifica di T
Codifica di INTEGER. Questo è di classe UNIVERSAL ed è PRIMITIVE. Il suo ID nella classe UNIVERSAL è 2. e quindi basterà 1 solo byte per T
Quindi: CLASS = 00 P\C = 0 Tag = 00010
da cui se segue: T = 0x02
Esempio 2 di codifica di T
Supponiamo di voler codificare un tipo PRIVATE e PRIMITIVEcon ID = 250 e quindi serviranno più bytes per T
Primo byte: CLASS = 11 P\C = 0 Tag = 11111 --> primobyte = 0b11011111= 0xDF
Altri byte (come abbiamo visto in precedenza) sono pari a 0x81FA perchè
In definitiva in questo caso T = 0xDF81FA ed è di 3 bytes
Codifica di L
La codifica di L è strettamente legata alla lunghezza del dato codificato V. Infatti indicando con 'Len(V)' il numero di bytes di V<\small>:
- se allora L viene codificato in 1 byte
- se allora L viene codificato in più byte
Codifica di V
Collegamenti esterni
- (EN) Olivier Dubuisson - ASN.1: Communication Between Heterogeneous Systems - Free PDF book
- (EN) Professor John Larmouth - ASN.1 Complete - Free PDF book