# ASN.1

Il termine ASN.1 sta per Abstract Syntax Notation One e indica un linguaggio astratto che può essere usato per descrivere una notazione, le relative procedure di encoding e il software che viene utilizzato per maneggiare il codice. È stato definito nel 1990 nello standard ISO 8824 e ripreso nel 2000 all'interno della raccomandazione CCITT X.208.

## Descrizione

Le particolarità che rendono l'ASN.1 importante sono:
* è una notazione internazionalmente standardizzata indipendente dall'implementazione, dalla piattaforma e dal linguaggio, per specificare strutture dati ad alto livello di astrazione.
* è supportato da regole che determinano la precisa organizzazione dei bit, per rappresentare i valori della struttura dati, quando questi devono essere trasferiti su una rete di computer, utilizzando codifiche non necessariamente verbose.
* è supportato da strumenti disponibili per numerose piattaforme e diversi linguaggi di programmazione che mappano la notazione ASN.1 in definizioni di strutture dati nel linguaggio di programmazione scelto e che supportano la conversione automatica tra i valori delle strutture dati nella memoria e l'organizzazione dei bit definita per il trasferimento sulla linea di comunicazione.
* gestisce la coesistenza di sistemi di versione 1 e versione 2 sviluppati e costituiti anche a diversi anni di distanza. Questo avviene grazie ai tipi estensione che permettono di "lasciare aperto" il codice, non richiedendo la presenza di determinati dati o l'assenza degli stessi.
* gestisce un gran numero di strutture dati che sono generalmente molto più complete rispetto a quelle dei normali linguaggi di programmazione, come la dimensione degli interi, la nomenclatura delle strutture e la specifica del tipo di carattere.

## Sintassi

La semantica e la sintassi di ASN.1 è varia, ma non complicata. Ogni struttura è definita secondo un preciso schema, le variabili o le altre strutture sono definite man mano che il codice viene scritto. Si parte dalla struttura base e la si amplia legando sequenze diverse che specificano le variabili usate.
I dati sono contraddistinti da un tipo ("data type") e da un valore ("data value"):
* un tipo è una classe che descrive una collezione di valori.
* un valore è un particolare elemento di informazione, ovvero una particolare istanza di un tipo.
Una dichiarazione in questa notazione consta di quattro tipi differenti di unità lessicali:
* parole, costituite da lettere maiuscole e minuscole, cifre e trattini, che differenziano i tipi di variabili e le sequenze.
* numeri, costituiti da cifre.
* stringhe di caratteri, esadecimali e binarie.
* punteggiatura.
Per individuare immediatamente il tipo di oggetto al quale la parola si riferisce, usa la seguente convenzione:
* nome di un tipo, la parola inizia con una lettera maiuscola (es. Nameoftype), per i tipi di base si usano le asn1_dat, che come tali vanno interamente in maiuscolo (es. INTEGER).
* nome di un valore (un'istanza di un tipo), la parola inizia con una lettera minuscola (es. nameofvalue).
* nome di un modulo, la parola inizia con la lettera maiuscola (es. Module).
* valori, non esistono particolari convenzioni.
Le assegnazioni di tipi avvengono tramite produzione, utilizzando il simbolo "::=".
I moduli indicano una collezione di descrizioni ASN.1:
Il campo tags è opzionale e indica se i tags nel modulo sono impliciti o espliciti. I tags sono utili, qualora più elementi componenti la struttura complessiva appartengano allo stesso tipo semplice, in quanto permettono a un ricevente di riconoscere univocamente il tipo cui appartiene il valore ricevuto. Non viene praticamente più utilizzato, ma si sfrutta l'assegnazione automatica.
Il termine linkage indica quali tipi, valori e macro sono esportati e quali importati da altri moduli.
Declarations contiene tutte le dichiarazioni relative al modulo.
Quello che rende veramente utile questo tipo di linguaggio è la sua maneggevolezza dovuta al fatto che è studiato per funzionare come la pila ISO/OSI, ovvero all'interno del codice le sequenze sono create lasciando degli "holes". Gli "holes" non sono nient'altro che strutture non definite direttamente dal programmatore, ma che vengono riempite, man mano che il codice viene eseguito, dal livello superiore o inferiore della pila. Si può quindi scrivere una specifica generica con all'interno "holes" che verranno riempiti da utenti che a loro volta inseriranno "holes", creando quindi un codice che si adatta alle caratteristiche dell'utente e al suo tipo di utilizzo.
Il linguaggio ASN.1 è utilizzato in diversi standard e in diversi ambiti, normalmente viene utilizzata una codifica base (BER) che non tiene conto della ridondanza dei bit e della presenza di bit non utilizzati. ASN.1 è incentrato sullo sfruttamento di questa notazione nel campo delle telecomunicazioni, lavorando con un tipo di codifica a pacchetto (PER).

## La codifica PER Packed Encoding Rules

La codifica PER è separata dalla specifica di un protocollo, è quello che viene creato dal compilatore ASN.1. Dopo aver scritto la specifica in linguaggio ASN.1 questa viene passata al compilatore. Il compilatore può creare un'uscita con diversi tipi di codifica (BER, XER, DER, PER) in base alle richieste di utilizzo. Quindi nella codifica PER vengono utilizzate regole da applicare all'organizzazione dei bit, per creare una struttura dati il più possibile concreta senza campi inutili, che permetta la pacchettizzazione per trasmettere l'informazione più velocemente. Non utilizza tags impostati manualmente, perché occuperebbero spazio sulla PDU, ma tags automatici.
Ci sono due varianti di questa codifica:
* ALIGNED: la struttura dei bit è organizzata in modo che ci sia allineamento tra i byte inserendo bit ridondanti.
* UNALIGNED: è un tipo di struttura più pacchettizzata in quanto ogni bit utilizzato è un bit utile, d'informazione.