# ASN.1

Abstract Syntax Notation One (notación sintáctica abstracta 1, ASN.1) es una norma para representar datos independientemente de la máquina que se esté usando y sus formas de representación internas Es un protocolo de nivel de presentación en el modelo OSI El protocolo SNMP usa el ASN para representar sus objetos gestionables.

## Descripción de la información

ASN.1 utiliza la notación de Backus-Naur (BNF) para describir la forma en que la información es almacenada.

### Tipos de datos

Los tipos de datos se clasifican según si son simples (primitivos), compuestos (construidos a partir de otros, simples o compuestos) o definidos, con una etiqueta de nombre para identificarlos.

#### Tipos primitivos

Los tipos primitivos son escalares, es decir, almacenan un único valor, como por ejemplo una cadena de texto o un entero. Los tipos primitivos más importantes son:
* El tipo INTEGER se usa para representar números enteros.
* El tipo OCTET STRING almacena una secuencia de bytes. De él se derivan tres subtipos:
** DisplayString (para cadenas de caracteres ASCII)
** OctetBitString (para cadenas de bits mayores de 32)
** PhysAddress (para representar direcciones del nivel de enlace).
* El tipo OBJECT IDENTIFIER para representar los identificadores de los objetos, es decir, la posición de un objeto dentro del árbol de la MIB.
* El tipo BOOLEAN para valores que solo pueden ser verdadero o falso.
* El tipo NULL para representar la ausencia de valor.

#### Tipos construidos

Los tipos construidos son tipos compuestos. Se usan para crear arrays y tablas. Los más importantes son:
* El tipo SEQUENCE es una estructura de datos, es decir, una lista ordenada de tipos de datos diferentes. Es el tipo que se usa para almacenar una fila de una tabla.
* El tipo SEQUENCE OF es una lista ordenada de tipos de datos iguales. Es similar al tipo "SEQUENCE", excepto que todos los tipos han de ser iguales. Es el tipo usado en tablas para almacenar todas las filas.
* El tipo SET es equivalente al "SEQUENCE", pero la lista no está ordenada. Hay que notar que todos los componentes de la lista SET deben ser diferentes si no la definición sería ambigua.
* El tipo SET OF es equivalente al "SEQUENCE OF" pero la lista no está ordenada.
* El tipo CHOICE es un tipo de datos en el que hay que elegir uno de entre los tipos disponibles en una lista. Por ejemplo, un tipo "Animal" podría ser una "CHOICE" entre los tipos "Perro", "Gato" o "Pez".

#### Tipos Definidos

Son tipos derivados de los anteriores pero con un nombre más descriptivo. Los más importantes son:
* IpAddress sirve para almacenar una dirección IP. Son 4 bytes y se define como "OCTET STRING (SIZE (4))".
* Counter representa un contador que únicamente puede incrementar su valor y que cuando llega a su valor máximo, vuelve a cero. Se define como un entero sin signo, que solo puede tomar valores positivos y el cero.
* Gauge es como un indicador de nivel. Es un valor que puede incrementar o decrementar. Puede llevar asociadas acciones a tomar en caso de que se superen unos umbrales. Un ejemplo es un medidor del ancho de banda medido en un determinado interfaz. Está definido como un entero de 32 bits.
* TimeTicks es un tipo de datos usado para medir tiempos. Indica el número de centésimas de segundo que han transcurrido desde un determinado evento temporal. Es un entero de 32 bits.
* Opaque define datos arbitrarios codificados como OCTET STRING.
* NetworkAddress es un CHOICE que permite seleccionar varios formatos de direcciones. Actualmente solo IpAddress.

#### Macros de ASN.1

Podemos crear nuevos tipos de ASN.1 usando macros.
La definición de macros aportan una mayor flexibilidad a la sintaxis.
Los símbolos no terminales empiezan por una letra mayúscula.

### Clases de datos

Cada tipo de dato mencionado anteriormente a excepción de CHOICE , está asociado a una clase. Existen cuatro clases de datos, que etiquetan al resto de tipos de datos. Cada clase está identificada por un nombre y un número entero positivo
* Universal: Para tipos de datos generales.
| Clase | Tipo de Dato |
| UNIVERSAL 1 | Bolean |
| UNIVERSAL 2 | Integer |
| UNIVERSAL 4 | Octet String |
| UNIVERSAL 5 | Null |
| UNIVERSAL 6 | Object Identifer |
| UNIVERSAL 16 | Sequence, Sequence Of |
| UNIVERSAL 17 | Set, Set Of |
* Aplicación: Definidos para la aplicación específica.
| Clase | Tipo de Dato |
| APLICACION 0 | Ip Address |
| APLICACION 1 | Counter |
| APLICACION 2 | Gauge |
| APLICACION 3 | Time Ticks |
| APLICACION 4 | Opaque |
* Específica al contexto: Definidos para el contexto local en que se usan estos tipos.
| Clase | Tipo de Dato |
| CONTEXTO 0 | GetRequest |
| CONTEXTO 1 | GetNextRequest |
| CONTEXTO 2 | GetResponse |
| CONTEXTO 3 | SetRequest |
| CONTEXTO 4 | Trap |
* Privada: Definidos por el usuario.

## Codificación

La sintaxis de transferencia específica cómo se codifican los distintos tipos de datos. Define la forma de codificar en el transmisor y decodificar en el receptor los valores expresados con ASN.1.
Este estándar no define cómo se han de codificar esos datos, sino que es una sintaxis abstracta para indicar el significado de los datos. Para la codificación de los datos se usan otras normas como: BER (Reglas de codificación básicas) (BER - X.209), CER (canonical encoding rules), DER (distinguished encoding rules), PER (packed encoding rules) y XER (XML encoding rules).

### BER

Las Reglas de codificación básicas, o BER (Basic Encoding Rules), es uno de los formatos de codificación definidos como parte del estándar ASN.1. Las reglas, denominadas sintaxis de transferencia en el contexto de ASN.1, especifican las secuencias de octetos exactas para codificar un elemento de datos dado. La sintaxis BER, junto con dos subconjuntos de BER: Canonical Encoding Rules (CER) y Distinguished Encoding Rules (DER), están definidas por el documento de estándares X.690 de la UIT-T, el cual es parte de las series de documentos ASN.1. Cada elemento de datos está codificado usando la codificación tipo-longitud-valor, es decir, por un identificador de tipos, una descripción longitud, los elementos de datos actuales, y donde sea necesario, un marcador de fin-de-contenido. Por ejemplo, cuando codificamos un valor construido (esto es, un valor que está compuesto de múltiples valores ya codificados más pequeños), el emisor puede usar una de las tres formas diferentes para especificar la longitud de los datos. Estas implementaciones confían en la flexibilidad que BER suministra para usar lógica de codificación que es más fácil de implementar, pero redunda en una corriente de datos mayor de lo necesario.

## Estándares

* Estándares que describen la notación ASN.1:
** ITU-T Rec. X.680 | ISO/IEC 8824-1
** ITU-T Rec. X.681 | ISO/IEC 8824-2
** ITU-T Rec. X.682 | ISO/IEC 8824-3
** ITU-T Rec. X.683 | ISO/IEC 8824-4
* Estándares que describen las reglas de codificación de ASN.1:
** ITU-T Rec. X.690 | ISO/IEC 8825-1 (BER, CER y DER)
** ITU-T Rec. X.691 | ISO/IEC 8825-2 (PER)
** ITU-T Rec. X.693 | ISO/IEC 8825-4 (XER)
** ITU-T Rec. X.694 | ISO/IEC 8825-5 (mapeado XSD)
** RFC 3641 (GSER)