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:

  1. si codifica T
  2. si codifica V
  3. 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:

 
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:

  1. si converte ID in binario
  2. si aggiunge un 1 ogni 7 bit
  3. si completa il byte con un 1 in testa
 
Altri bytes di T

Ad es. se ID = 250 in base 10, allora:

  1. 250 = 0xFA = 11111010
  2. 11111010 -> 1 11111010
  3. 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>:

  1. se Errore del parser (SVG (MathML può essere abilitato tramite plug-in del browser): risposta non valida ("Math extension cannot connect to Restbase.") dal server "http://localhost:6011/it.wikipedia.org/v1/":): {\displaystyle Len(V)<127 \,\!} allora L viene codificato in 1 byte
  2. se   allora L viene codificato in più byte

Codifica di V

Collegamenti esterni

  1. (EN) Olivier Dubuisson - ASN.1: Communication Between Heterogeneous Systems - Free PDF book
  2. (EN) Professor John Larmouth - ASN.1 Complete - Free PDF book