Articulo de referencia

ASN.1

La Notación Sintáctica Abstracta Uno ( ASN.1 ) es un lenguaje de descripción de interfaz (IDL) estándar para definir estructuras de datos que pueden serializarse y deserializars...

La Notación Sintáctica Abstracta Uno ( ASN.1 ) es un lenguaje de descripción de interfaz (IDL) estándar para definir estructuras de datos que pueden serializarse y deserializarse de forma multiplataforma. Se utiliza ampliamente en telecomunicaciones y redes informáticas , y especialmente en criptografía . [ 1 ]

Los desarrolladores de protocolos definen las estructuras de datos en módulos ASN.1, que generalmente forman parte de un documento de estándares más amplio escrito en el lenguaje ASN.1. La ventaja radica en que la descripción ASN.1 de la codificación de datos es independiente de un ordenador o lenguaje de programación específico. Dado que ASN.1 es legible tanto para humanos como para máquinas , un compilador ASN.1 puede compilar módulos en bibliotecas de código (códecs ) que decodifican o codifican las estructuras de datos. Algunos compiladores ASN.1 pueden generar código para codificar o decodificar diversas codificaciones, como empaquetada, BER o XML .

ASN.1 es una norma conjunta del Sector de Normalización de las Telecomunicaciones de la Unión Internacional de Telecomunicaciones (UIT-T) en el Grupo de Estudio 17 de la UIT-T y la Organización Internacional de Normalización / Comisión Electrotécnica Internacional (ISO/IEC), definida originalmente en 1984 como parte de CCITT X.409 :1984. [ 2 ] En 1988, ASN.1 pasó a ser su propia norma, X.208 , debido a su amplia aplicabilidad. La versión de 1995, sustancialmente revisada, está cubierta por la serie X.680 X.683 . [ 3 ] La última revisión de la serie de recomendaciones X.680 es la Edición 6.0, publicada en 2021. [ 4 ]

Estructura

  • X.680 define los elementos léxicos básicos del lenguaje ASN.1 (tokens especiales, formato de valores literales básicos, etc.). Define la sintaxis de una "definición de módulo", es decir, la definición de un módulo dentro de un protocolo. Una definición de módulo puede contener tipos de datos, objetos de información predefinidos escritos en esos tipos de datos (sintaxis detallada en X.681), elementos de restricción (sintaxis detallada en X.682), entre otros.
  • X.681 define la sintaxis de un objeto de información , lo que permite representar objetos con tipos de datos personalizados en el lenguaje (de forma similar a los literales de objeto en otros lenguajes). También define una manera de referenciar un valor específico de un objeto mediante la notación de punto, como si se tratara de una tabla.
  • X.682 define elementos de restricción que pueden utilizarse para aplicar restricciones más avanzadas en un módulo.
  • La norma X.683, Parametrización de las especificaciones ASN.1 , permite que las asignaciones y definiciones varíen según los parámetros.

Soporte de idiomas

ASN.1 es una notación para la declaración de tipos de datos. No define cómo manipular una variable de dicho tipo. La manipulación de variables se define en otros lenguajes, como SDL (Specification and Description Language) para el modelado ejecutable o TTCN-3 (Testing and Test Control Notation) para las pruebas de conformidad. Ambos lenguajes admiten declaraciones ASN.1 de forma nativa. Es posible importar un módulo ASN.1 y declarar una variable de cualquiera de los tipos ASN.1 declarados en el módulo.

Aplicaciones

ASN.1 se utiliza para definir un gran número de protocolos. Sus usos más extendidos siguen siendo las telecomunicaciones, la criptografía y la biometría.

Codificaciones

ASN.1 está estrechamente relacionado con un conjunto de reglas de codificación que especifican cómo representar una estructura de datos como una serie de bytes. Las reglas de codificación estándar de ASN.1 incluyen:

Notación de control de codificación

Las recomendaciones ASN.1 proporcionan una serie de reglas de codificación predefinidas. Si ninguna de las reglas de codificación existentes resulta adecuada, la Notación de Control de Codificación (ECN, X.692) permite al usuario definir sus propias reglas de codificación personalizadas.

Relación con la codificación de correo electrónico con privacidad mejorada (PEM).

La codificación Privacy-Enhanced Mail (PEM) no guarda ninguna relación con ASN.1 ni con sus códecs, pero los datos ASN.1 codificados, que a menudo son binarios, suelen codificarse en PEM para que puedan transmitirse como datos de texto, por ejemplo, a través de relés SMTP o mediante búferes de copiar y pegar.

Como archivos informáticos

Las especificaciones de lenguaje y codificación ASN.1 no especifican detalles como la extensión de archivo que se debe usar cuando un fragmento de datos se almacena como un archivo en una computadora. Sin embargo, han surgido algunas convenciones:

  • Texto en lenguaje ASN.1: las extensiones de .asn1[ 19 ] y .allse han utilizado para archivos generales. .asnse ha utilizado para archivos que solo contienen definiciones de módulos y .prtpara archivos que solo contienen definiciones de valores. [ 20 ]
  • Datos codificados en BER: .berse han utilizado. [ 21 ] También hay un tipo MIMEapplication/ber-stream propuesto que incluye un protocolparámetro que especifica un OID asociado. [ 22 ]
  • Datos codificados en DER: . Para certificados X.509.der codificados en DER , y además de . El tipo MIME es específicamente para certificados codificados en DER, no para datos DER generales..cer.crt.derapplication/x-x509-ca-cert
  • Otros datos codificados: asn1carchivos de muestra utilizados .xerpara XER, .perpara PER y .coerpara COER.

Ejemplo

Módulo y restricción

Este es un ejemplo de módulo ASN.1 que define los mensajes (estructuras de datos) de un protocolo Foo ficticio:

FooProtocol DEFINICIONES ::= INICIOFooQuestion ::= SEQUENCE { trackingNumber INTEGER , question IA5String }FooAnswer ::= SEQUENCE { questionNumber INTEGER , answer BOOLEAN }FIN

Podría tratarse de una especificación publicada por los creadores del Protocolo Foo. Los flujos de conversación, los intercambios de transacciones y los estados no están definidos en ASN.1, sino que se dejan a otras notaciones y a la descripción textual del protocolo.

ASN.1 admite restricciones en valores y tamaños, así como extensibilidad. La especificación anterior se puede modificar a:

FooProtocol DEFINICIONES ::= INICIOFooQuestion ::= SEQUENCE { trackingNumber INTEGER ( 0. . 199 ), question IA5String }FooAnswer ::= SEQUENCE { questionNumber INTEGER ( 10. . 20 ), answer BOOLEAN }FooHistory ::= SECUENCIA { preguntas SECUENCIA ( TAMAÑO ( 0. . 10 )) DE FooQuestion , respuestas SECUENCIA ( TAMAÑO ( 1. . 10 )) DE FooAnswer , unArray SECUENCIA ( TAMAÑO ( 100 )) DE ENTERO ( 0. . 1000 ), ... }FIN

Este cambio restringe que trackingNumbers tenga un valor entre 0 y 199 inclusive, y questionNumbers un valor entre 10 y 20 inclusive. El tamaño del array questions puede estar entre 0 y 10 elementos, y el array answers entre 1 y 10 elementos. El campo anArray es un array fijo de 100 elementos enteros que debe estar en el rango de 0 a 1000. El marcador de extensibilidad '...' significa que la especificación del mensaje FooHistory puede tener campos adicionales en futuras versiones de la especificación; los sistemas compatibles con una versión deberían poder recibir y transmitir transacciones de una versión posterior, aunque solo podrán procesar los campos especificados en la versión anterior. Los buenos compiladores ASN.1 generarán (en C, C++, Java, etc.) código fuente que comprobará automáticamente que las transacciones se ajusten a estas restricciones. Las transacciones que infrinjan las restricciones no deben aceptarse ni presentarse a la aplicación. La gestión de restricciones en esta capa simplifica significativamente la especificación del protocolo, ya que las aplicaciones estarán protegidas contra violaciones de restricciones, lo que reduce el riesgo y el coste.

Los ejemplos anteriores solo utilizan la sintaxis de X.680. No se utilizan las restricciones más avanzadas de X.682.

Ejemplo de PDU

Suponiendo que se trata de un mensaje que cumple con el Protocolo Foo y que se enviará a la parte receptora, este mensaje en particular ( unidad de datos de protocolo (PDU)) es:

miPreguntaFooQuestion ::= { trackingNumber 5 , question "¿Hay alguien ahí? " }

Para enviar el mensaje myQuestion a través de la red, este se serializa (codifica) como una serie de bytes utilizando una de las reglas de codificación . La especificación del protocolo Foo debería indicar explícitamente un conjunto de reglas de codificación para que los usuarios sepan cuál deben usar y qué esperar.

Lo anterior es un ejemplo de X.681, específicamente de la construcción ObjectAssignment .

Ejemplo codificado en DER

A continuación se muestra la estructura de datos que aparece arriba como myQuestion codificada en formato DER (todos los números están en hexadecimal):

30 13 02 01 05 16 0e 41 6e 79 62 6f 64 79 20 74 68 65 72 65 3f

DER es una codificación de tipo-longitud-valor , por lo que la secuencia anterior puede interpretarse, con referencia a los tipos estándar SEQUENCE, INTEGER e IA5String, de la siguiente manera:

30 — etiqueta de tipo que indica SECUENCIA 13 — longitud en octetos del valor que sigue 02 — etiqueta de tipo que indica ENTERO 01 — longitud en octetos del valor que sigue 05 — valor (5) 16 — etiqueta de tipo que indica IA5String (IA5 significa el conjunto completo de 7 bits ISO 646, incluidas las variantes, pero generalmente es US-ASCII) 0e — longitud en octetos del valor que sigue 41 6e 79 62 6f 64 79 20 74 68 65 72 65 3f — valor ("¿Hay alguien ahí?")

Ejemplo codificado en XER

Como alternativa, es posible codificar la misma estructura de datos ASN.1 con las Reglas de Codificación XML (XER) para lograr una mayor legibilidad humana en la transmisión. En ese caso, aparecería como los siguientes 108 octetos (el recuento de espacios incluye los espacios utilizados para la indentación):

<FooQuestion> <trackingNumber> 5 </trackingNumber> <question> ¿Hay alguien ahí? </question> </FooQuestion>

Ejemplo codificado en PER, alineado o no alineado.

Alternativamente, si se emplean las reglas de codificación empaquetada no alineadas, se producirán los siguientes 122 bits (16 octetos equivalen a 128 bits, pero aquí solo 122 bits contienen información y los últimos 6 bits son simplemente relleno):

01 05 0e 83 bb ce 2d f9 3c a0 e9 a3 2f 2c af c0

En este formato, las etiquetas de tipo para los elementos requeridos no están codificadas, por lo que no se puede analizar sin conocer los esquemas esperados utilizados para la codificación. Además, los bytes para el valor de IA5String se empaquetan usando unidades de 7 bits en lugar de unidades de 8 bits, porque el codificador sabe que codificar un valor de byte IA5String requiere solo 7 bits. Sin embargo, los bytes de longitud todavía están codificados aquí, incluso para la primera etiqueta entera 01 (pero un empaquetador PER también podría omitirlo si sabe que el rango de valores permitidos cabe en 8 bits, e incluso podría compactar el byte de valor único 05 con menos de 8 bits, si sabe que los valores permitidos solo pueden caber en un rango más pequeño).

Los últimos 6 bits en el PER codificado se rellenan con bits nulos en los 6 bits menos significativos del último byte c0  : estos bits adicionales no se pueden transmitir ni utilizar para codificar otra cosa si esta secuencia se inserta como parte de una secuencia PER no alineada más larga.

Esto significa que los datos PER no alineados son esencialmente una secuencia ordenada de bits, y no una secuencia ordenada de bytes como con los datos PER alineados, y que su decodificación por software en procesadores convencionales será algo más compleja, ya que requerirá desplazamiento y enmascaramiento de bits contextuales adicionales, y no direccionamiento directo de bytes (aunque lo mismo se aplica a los procesadores modernos y a las unidades de memoria/almacenamiento cuya unidad mínima direccionable es mayor que 1 octeto). Sin embargo, los procesadores modernos y los procesadores de señales incluyen soporte de hardware para la decodificación interna rápida de secuencias de bits con manejo automático de unidades de cómputo que cruzan los límites de las unidades de almacenamiento direccionables (esto es necesario para un procesamiento eficiente en códecs de datos para compresión/descompresión o con algunos algoritmos de cifrado/descifrado).

En comparación, Packed Encoding Rules Aligned produce en su lugar:

01 05 0e 41 6e 79 62 6f 64 79 20 74 68 65 72 65 3f

Este formato está alineado a octetos. En este caso, cada octeto se rellena individualmente con bits nulos en sus bits más significativos no utilizados.

Herramientas

La mayoría de las herramientas compatibles con ASN.1 hacen lo siguiente:

  • analizar los archivos ASN.1,
  • genera la declaración equivalente en un lenguaje de programación (como C o C++),
  • Genera las funciones de codificación y decodificación basándose en las declaraciones anteriores.

En la página web de herramientas de la UIT-T se puede encontrar una lista de herramientas compatibles con ASN.1 .

Herramientas en línea

  • Juego ASN1
  • Herramienta web ASN1 (muy limitada)
  • Zona de juegos ASN1 (sandbox)
  • Decodificador JavaScript ASN.1

Comparación con esquemas similares

ASN.1 es similar en propósito y uso a Google Protocol Buffers y Apache Thrift , que también son lenguajes de descripción de interfaz para la serialización de datos multiplataforma. Al igual que estos lenguajes, tiene un esquema (en ASN.1, llamado "módulo") y un conjunto de codificaciones, generalmente de tipo-longitud-valor. A diferencia de ellos, ASN.1 no proporciona una implementación de código abierto única y fácilmente utilizable, y se publica como una especificación para ser implementada por proveedores externos. Sin embargo, ASN.1, definido en 1984, es anterior a ellos por muchos años. También incluye una mayor variedad de tipos de datos básicos, algunos de los cuales están obsoletos, y ofrece más opciones de extensibilidad. Un solo mensaje ASN.1 puede incluir datos de múltiples módulos definidos en múltiples estándares, incluso estándares definidos con años de diferencia.

ASN.1 también incluye soporte integrado para restricciones de valores y tamaños. Por ejemplo, un módulo puede especificar un campo entero que debe estar en el rango de 0 a 100. También se puede especificar la longitud de una secuencia de valores (una matriz), ya sea como una longitud fija o un rango de longitudes permitidas. Las restricciones también se pueden especificar como combinaciones lógicas de conjuntos de restricciones básicas.

Los valores utilizados como restricciones pueden ser literales en la especificación de la PDU o valores ASN.1 especificados en otra parte del archivo de esquema. Algunas herramientas ASN.1 ponen estos valores a disposición de los programadores en el código fuente generado. Al usarse como constantes para el protocolo que se está definiendo, los desarrolladores pueden utilizarlas en la implementación lógica del protocolo. De esta forma, todas las PDU y constantes del protocolo se pueden definir en el esquema, y ​​todas las implementaciones del protocolo en cualquier lenguaje compatible utilizan esos valores. Esto evita que los desarrolladores tengan que codificar manualmente las constantes del protocolo en el código fuente de su implementación. Esto facilita significativamente el desarrollo del protocolo; las constantes del protocolo se pueden modificar en el esquema ASN.1 y todas las implementaciones se actualizan simplemente recompilando, lo que promueve un ciclo de desarrollo rápido y de bajo riesgo.

Si las herramientas ASN.1 implementan correctamente la comprobación de restricciones en el código fuente generado, esto valida automáticamente los datos del protocolo durante la ejecución del programa. Generalmente, las herramientas ASN.1 incluyen la comprobación de restricciones en las rutinas de serialización/deserialización generadas, generando errores o excepciones si se encuentran datos fuera de rango. Es complejo implementar todos los aspectos de las restricciones ASN.1 en un compilador ASN.1. No todas las herramientas admiten la gama completa de expresiones de restricciones posibles. Tanto el esquema XML como el esquema JSON admiten conceptos de restricciones similares. La compatibilidad de las herramientas con las restricciones varía. El compilador xsd.exe de Microsoft las ignora.

Traducción de esquemas

Algunas herramientas ASN.1 permiten la traducción entre ASN.1 y esquemas XML (XSD). Esta traducción está estandarizada por la UIT. Esto posibilita definir un protocolo en ASN.1 y, automáticamente, también en XSD. Por lo tanto, es posible (aunque quizás no recomendable) tener en un proyecto un esquema XSD compilado por herramientas ASN.1 que generen código fuente que serialice objetos a/desde formato JSON. Un uso más práctico consiste en permitir que otros subproyectos utilicen un esquema XSD en lugar de un esquema ASN.1, según la disponibilidad de herramientas para el lenguaje elegido por los subproyectos, utilizando XER como formato de protocolo.

OSS Nokalva ofrece una herramienta para convertir un objeto de datos JSON o un esquema JSON en una definición ASN.1. [ 23 ] Todavía no existe una herramienta para generar un esquema JSON que describa la estructura codificada en JER de una estructura de datos ASN.1.

OSS Nokalva también ofrece una herramienta para convertir un esquema de Protocol Buffers en una definición ASN.1. [ 24 ]

Formatos con esquema opcional

Muchos lenguajes de programación definen formatos de serialización específicos. Por ejemplo, el módulo "pickle" de Python y el módulo "Marshal" de Ruby. Estos formatos no requieren un esquema. Generalmente son específicos del lenguaje, lo que facilita su uso en escenarios de almacenamiento ad hoc, pero los hace inadecuados para protocolos de comunicación.

JSON y XML tampoco requieren un esquema, lo que facilita su uso. Además, ambos son estándares multiplataforma muy populares para protocolos de comunicación, especialmente cuando se combinan con un esquema JSON o XML .

Definiciones de protocolo en diferentes niveles

ASN.1 es visualmente similar a la forma aumentada de Backus-Naur (ABNF), que se utiliza para definir muchos protocolos de Internet como HTTP y SMTP . Sin embargo, en la práctica son bastante diferentes: ASN.1 define una estructura de datos que puede codificarse de diversas maneras (por ejemplo, JSON, XML, binario). ABNF, en cambio, define la codificación ("sintaxis") al mismo tiempo que define la estructura de datos ("semántica"). ABNF tiende a usarse con mayor frecuencia para definir protocolos textuales legibles por humanos y, por lo general, no se utiliza para definir codificaciones de tipo-longitud-valor.

ASN.1 también es visualmente similar a CSN.1 . Sin embargo, CSN.1 también define la codificación de un objeto, específicamente a nivel de bits.

Véase también

Referencias

  1. "Introducción a ASN.1" . UIT . Archivado del original el 9 de abril de 2021. Consultado el 9 de abril de 2021 .
  2. «Base de datos de Recomendaciones UIT-T» . UIT . Consultado el 6 de marzo de 2017 .
  3. ITU-T X.680 - Especificación de la notación básica
  4. Este artículo se basa en material tomado de ASN.1 en el Diccionario en línea gratuito de informática antes del 1 de noviembre de 2008 e incorporado bajo los términos de "relicencia" de la GFDL , versión 1.3 o posterior.
  5. ITU-T X.690 - Reglas básicas de codificación (BER)
  6. ITU-T X.690 - Reglas de codificación distinguidas (DER)
  7. ITU-T X.690 - Reglas de codificación canónica (CER)
  8. 1 2 3 4 ITU-T X.691 - Reglas de codificación empaquetada (PER)
  9. 1 2 3 ITU-T X.693 - Reglas de codificación XML (XER)
  10. ^ ITU -T X.696 - Reglas de codificación de octetos (OER)
  11. NTCIP 1102:2004 Protocolo nacional de comunicaciones de transporte para sistemas de transporte inteligentes (ITS) Reglas de codificación de octetos (OER) Protocolo base (PDF) .
  12. ITU-T X.697 - Reglas de codificación de notación de objetos JavaScript (JER)
  13. RFC 3641 - Reglas genéricas de codificación de cadenas (GSER) 
  14. Karg, S (2012). "Understanding BACnet MS/TP Encoding" (PDF) .
  15. "bacnet-stack/bacnet-stack" . Pila BACnet. 14 de junio de 2025.
  16. Huitema, C.; Doghri, A. (octubre de 1989). "Definición de sintaxis de transferencia más rápidas para el protocolo de presentación OSI". ACM SIGCOMM Computer Communication Review . 19 (5): 44– 55. doi : 10.1145/74681.74685 .
  17. 1 2 Larmouth, John (1999). ASN.1 Completo . Soluciones de sistemas abiertos. ISBN 9780122334351.
  18. Bever, Martin; Schäffer, Ulrich (1 de junio de 1992). «Reglas de codificación para redes de alta velocidad» . Actas de la Conferencia Internacional IFIP TC6/WG6.5 sobre Protocolos, Arquitecturas y Aplicaciones de Capa Superior . Elsevier Science Publishers BV: 119–132 . ISBN 978-0-444-89766-4.
  19. "Capítulo 7. Formato de datos de archivo ASN.1 | Referencia de componentes de Apache Camel | Red Hat Fuse | 7.2 | Documentación de Red Hat" . docs.redhat.com .
  20. "AsnLib: Procesamiento de ASN.1" . www.ncbi.nlm.nih.gov .
  21. "Ubuntu Manpage: unber -- el decodificador BER ASN.1" . manpages.ubuntu.com .
  22. Wahl, Mark (13 de marzo de 1996). "Un tipo de contenido MIME para PDU ASN.1" . Grupo de trabajo de ingeniería de Internet.
  23. "JSON2ASN" . asn1.io .
  24. "Proto2ASN" . asn1.io .
  • Una guía para principiantes sobre un subconjunto de ASN.1, BER y DER. Una buena introducción para principiantes.
  • Sitio web de la UIT-T - Introducción a ASN.1
  • Introducción en vídeo a ASN.1
  • Tutorial de ASN.1 Tutorial sobre conceptos básicos de ASN.1
  • Tutorial de ASN.1 Tutorial sobre ASN.1
  • Un compilador ASN.1->C++ de código abierto; incluye algunas especificaciones de ASN.1. , Un compilador ASN.1->C++ en línea
  • El decodificador ASN.1 permite decodificar mensajes codificados en ASN.1 y generar una salida XML.
  • Verificador de sintaxis y codificador/decodificador ASN.1. Comprueba la sintaxis de un esquema ASN.1 y codifica/decodifica mensajes.
  • Codificador/decodificador ASN.1 de mensajes 3GPP. Codifica/decodifica mensajes 3GPP ASN.1 y permite editarlos fácilmente.
  • Libros gratuitos sobre ASN.1
  • Lista de herramientas ASN.1 en el proyecto IvmaiAsn
  • Descripción general de las reglas de codificación de octetos (OER)
  • Descripción general de las reglas de codificación JSON (JER)
  • Una utilidad de Node.js en TypeScript para analizar y validar mensajes ASN.1.