X.690 es un estándar de la UIT-T que especifica varios formatos de codificación ASN.1 :
- Reglas básicas de codificación (BER)
- Reglas de codificación canónica (CER)
- Reglas de codificación distinguidas (DER)
Las Reglas Básicas de Codificación (BER, por sus siglas en inglés) fueron las reglas originales establecidas por el estándar ASN.1 para codificar datos en formato binario. Estas reglas, conocidas colectivamente como sintaxis de transferencia en la jerga de ASN.1, especifican los octetos exactos (bytes de 8 bits) que se utilizan para codificar los datos.
X.680 define una sintaxis para declarar tipos de datos, por ejemplo: booleanos, números, cadenas y estructuras compuestas. Cada definición de tipo también incluye un número de identificación. X.680 define varios tipos de datos primitivos , por ejemplo: BooleanType, IntegerType, OctetStringType. (ASN.1 también prevé tipos construidos a partir de otros tipos). Los tipos están asociados a una clase . Por ejemplo, los tipos primitivos forman parte de la clase universal . Las otras tres clases ( application , private y context-specific ) son esencialmente ámbitos diferentes para admitir la personalización para aplicaciones específicas. Combinados, la clase y el tipo forman una etiqueta , que por lo tanto corresponde a una definición de datos única. X.690 incluye reglas para codificar esas etiquetas, valores de datos (contenido) y las longitudes de esos datos codificados.
La BER, junto con dos subconjuntos de la BER (las Reglas de Codificación Canónica y las Reglas de Codificación Distinguida ), están definidas por el documento de normas X.690 de la UIT-T , que forma parte de la serie de documentos ASN.1.
Codificación BER
Las Reglas Básicas de Codificación (BER, por sus siglas en inglés) especifican, en términos generales, un protocolo parcialmente autodescriptivo y autolimitante para codificar estructuras de datos ASN.1. Cada elemento de datos se codifica como un identificador de tipo, una descripción de longitud, los elementos de datos propiamente dichos y, cuando sea necesario, un marcador de fin de contenido. Este tipo de codificaciones se conocen comúnmente como codificaciones tipo-longitud-valor (TLV). Sin embargo, en la terminología de BER, se denomina identificador-longitud-contenido .
Este tipo de formato permitiría a un receptor decodificar la información ASN.1 de un flujo incompleto, sin necesidad de conocer previamente el tamaño, el contenido o el significado semántico de los datos, aunque sería necesario proporcionar o deducir mediante ingeniería inversa algunos detalles del protocolo a partir de muestras representativas de tráfico o software. [ 1 ]
La codificación de datos consta de tres o cuatro componentes, en el siguiente orden:
Tenga en cuenta que si Length es cero, no hay octetos de Contents, por ejemplo, el tipo NULL. Los octetos End-of-Contents solo se utilizan para la forma indefinida de Length.
Octetos de identificador
Los octetos del identificador BER codifican las etiquetas ASN.1 . La lista de etiquetas de Clase Universal se puede encontrar en la Recomendación ITU-T X.680, cláusula 8, tabla 1. [ 2 ] Las siguientes etiquetas son nativas de ASN.1:
Codificación
Los octetos del identificador codifican el número de clase y el número de tipo de la etiqueta ASN.1. También indican si los octetos del contenido representan un valor construido o primitivo. El identificador abarca uno o más octetos.
En el octeto inicial, el bit 6 codifica si el tipo es primitivo o construido, los bits 7 y 8 codifican la clase de la etiqueta, y los bits 1 a 5 codifican el tipo de la etiqueta. Los siguientes valores son posibles:
Si el tipo de etiqueta cabe en los 5 bits (0-30 10 ), entonces el identificador ocupa solo un byte: Forma corta . Si el tipo de etiqueta es demasiado grande para el campo de etiqueta de 5 bits (> 30 10 ), debe codificarse en octetos adicionales: Forma larga .
El octeto inicial codifica la clase y el tipo (primitivo/construido) como antes, y los bits 1 a 5 son 1. El número de etiqueta se codifica en los octetos siguientes, donde el bit 8 de cada uno es 1 si hay más octetos, y los bits 1 a 7 codifican el número de etiqueta. Los bits del número de etiqueta combinados, en formato big-endian , codifican dicho número. Se debe codificar el menor número posible de octetos siguientes; es decir, los bits 1 a 7 no deben ser todos 0 en el primer octeto siguiente.
Octetos de longitud
Existen dos formas de octetos de longitud: la forma definida y la forma indefinida.
Forma definida
Esto codifica el número de octetos de contenido y se usa siempre que el tipo sea primitivo o construido y los datos estén disponibles de inmediato. Hay una forma corta y una forma larga, que pueden codificar diferentes rangos de longitud. Los datos numéricos se codifican como enteros sin signo, con el bit menos significativo siempre primero (a la derecha).
La forma abreviada consiste en un solo octeto en el que el bit 8 es 0, y los bits 1 a 7 codifican la longitud (que puede ser 0) como un número de octetos.
La forma larga consta de 1 octeto inicial seguido de 1 o más octetos subsiguientes, que contienen la longitud. En el octeto inicial, el bit 8 es 1, y los bits 1–7 (excluyendo los valores 0 y 127) codifican el número de octetos que siguen. [ 1 ] Los siguientes octetos codifican, como big-endian, la longitud (que puede ser 0) como un número de octetos.
Forma indefinida
Esto no codifica la longitud en absoluto, sino que los octetos de contenido finalizan en los octetos marcadores. Esto se aplica a los tipos construidos y se usa normalmente si el contenido no está disponible de inmediato en el momento de la codificación.
Consta de un único octeto, en el que el bit 8 es 1 y los bits 1 a 7 son 0. A continuación, dos octetos de fin de contenido deben finalizar los octetos de contenido.
Contenido octetos
Los octetos de contenido codifican el valor de los datos del elemento. [ 1 ]
Tenga en cuenta que puede que no haya octetos de contenido (por lo tanto, el elemento tiene una longitud de 0) si solo se desea indicar la existencia del objeto ASN.1 o su ausencia. Por ejemplo, este es el caso de un valor NULL en ASN.1.
Codificación CER
CER (Reglas de Codificación Canónica) es una variante restringida de BER para generar una sintaxis de transferencia inequívoca para las estructuras de datos descritas por ASN.1 . Mientras que BER ofrece opciones sobre cómo se pueden codificar los valores de datos, CER (junto con DER ) selecciona solo una codificación de entre las permitidas por las reglas de codificación básicas, eliminando el resto de las opciones. CER es útil cuando es necesario preservar las codificaciones; por ejemplo, en intercambios de valores.
Codificación DER
DER (Distinguished Encoding Rules) es una variante restringida de BER para generar una sintaxis de transferencia inequívoca para las estructuras de datos descritas por ASN.1 . Al igual que CER , las codificaciones DER son codificaciones BER válidas. DER es lo mismo que BER, pero sin las opciones del remitente, excepto una.
DER es un subconjunto de BER que proporciona una única forma de codificar un valor ASN.1. DER está diseñado para situaciones en las que se requiere una codificación única, como en criptografía , y garantiza que una estructura de datos que necesita ser firmada digitalmente produzca una representación serializada única. DER puede considerarse una forma canónica de BER. Por ejemplo, en BER, un valor booleano verdadero puede codificarse como cualquiera de los 255 valores de byte distintos de cero, mientras que en DER solo hay una forma de codificar un valor booleano verdadero.
Las restricciones de codificación DER más significativas son:
- La codificación de longitud debe utilizar la forma definida.
- Además, debe utilizarse la codificación de longitud más corta posible.
- Las cadenas de bits, las cadenas de octetos y las cadenas de caracteres restringidas deben usar la codificación primitiva.
- Los elementos de un conjunto se codifican en orden ordenado, según su valor de etiqueta.
DER se utiliza ampliamente para certificados digitales como X.509 .
Comparación de BER, CER y DER
La principal diferencia entre el formato BER y los formatos CER o DER radica en la flexibilidad que ofrecen las Reglas Básicas de Codificación. BER, como se explicó anteriormente, es el conjunto básico de reglas de codificación establecido por la norma ITU-T X.690 para la transferencia de estructuras de datos ASN.1. Proporciona a los emisores reglas claras para codificar las estructuras de datos que desean enviar, pero también les ofrece ciertas opciones de codificación. Como se indica en la norma X.690: «Las reglas básicas de codificación permiten codificaciones alternativas como opción del emisor. Los receptores que declaren su conformidad con las reglas básicas de codificación deberán admitir todas las alternativas». [ 1 ]
Un receptor debe estar preparado para aceptar todas las codificaciones legales para poder afirmar legítimamente que cumple con la norma BER. Por el contrario, tanto CER como DER restringen las especificaciones de longitud disponibles a una sola opción. Por lo tanto, CER y DER son formas restringidas de BER y sirven para aclarar la norma BER.
CER y DER se diferencian en el conjunto de restricciones que imponen al remitente. La diferencia fundamental entre CER y DER radica en que DER utiliza un formato de longitud definida, mientras que CER utiliza un formato de longitud indefinida en algunos casos específicos. Es decir, DER siempre incluye información de longitud inicial, mientras que CER utiliza octetos al final del contenido en lugar de proporcionar la longitud de los datos codificados. Por este motivo, CER requiere menos metadatos para valores codificados grandes, mientras que DER lo hace para valores pequeños.
Para facilitar la elección entre las reglas de codificación, el documento de estándares X.690 proporciona la siguiente guía:
Las reglas de codificación distinguidas son más adecuadas que las reglas de codificación canónicas si el valor codificado es lo suficientemente pequeño como para caber en la memoria disponible y es necesario omitir rápidamente algunos valores anidados. Las reglas de codificación canónicas son más adecuadas que las reglas de codificación distinguidas si es necesario codificar valores tan grandes que no caben fácilmente en la memoria disponible o si es necesario codificar y transmitir una parte de un valor antes de que esté disponible el valor completo. Las reglas de codificación básicas son más adecuadas que las reglas de codificación canónicas o distinguidas si la codificación contiene un valor fijo o un conjunto de valores y no se requieren las restricciones que imponen las reglas de codificación canónicas y distinguidas.
Críticas a la codificación BER
Existe la percepción generalizada de que BER es "ineficiente" en comparación con otras reglas de codificación. Algunos argumentan que esta percepción se debe principalmente a implementaciones deficientes, y no necesariamente a un defecto inherente en las reglas de codificación. [ 3 ] Estas implementaciones se basan en la flexibilidad que BER proporciona para usar una lógica de codificación más fácil de implementar, pero que resulta en un flujo de datos codificados mayor de lo necesario. Ya sea que esta ineficiencia sea real o percibida, ha dado lugar a varios esquemas de codificación alternativos, como las Reglas de Codificación Empaquetada , que intentan mejorar el rendimiento y el tamaño de BER.
También se están desarrollando otras reglas de formato alternativas que, si bien ofrecen la flexibilidad de BER, utilizan esquemas de codificación alternativos. Las más populares son las alternativas basadas en XML, como las Reglas de Codificación XML y ASN.1 SOAP . [ 4 ] Además, existe una asignación estándar para convertir un esquema XML a un esquema ASN.1, que posteriormente puede codificarse mediante BER. [ 5 ]
Uso
A pesar de los problemas que se le atribuyen, BER es un formato popular para la transmisión de datos, especialmente en sistemas con diferentes codificaciones de datos nativas.
- Los protocolos SNMP y LDAP especifican ASN.1 con BER como esquema de codificación requerido.
- El estándar EMV para tarjetas de crédito y débito utiliza BER para codificar los datos en la tarjeta.
- El estándar de firma digital PKCS #7 también especifica ASN.1 con BER para codificar mensajes cifrados y su firma digital o sobre digital .
- Muchos sistemas de telecomunicaciones, como ISDN , el enrutamiento de llamadas gratuitas y la mayoría de los servicios de telefonía celular , utilizan ASN.1 con BER en cierta medida para transmitir mensajes de control a través de la red.
- Los archivos GSM TAP (Transferred Account Procedures) y NRTRDE (Near Real Time Roaming Data Exchange) se codifican utilizando BER.
En comparación, la codificación DER, más precisa, se utiliza ampliamente para transferir certificados digitales como X.509 .
Véase también
- Kerberos
- Reglas de codificación empaquetada (PER, X.691)
- Capa de presentación
- Formato de intercambio de datos estructurados ( SDXF )
- Publicación por entregas
Referencias
- 1 2 3 4 Tecnología de la información – Reglas de codificación ASN.1: Especificación de las reglas básicas de codificación (BER), las reglas canónicas de codificación (CER) y las reglas de codificación distinguidas (DER) , ITU-T X.690, 07/2002
- ↑ "Base de datos de recomendaciones de la UIT-T" .
- ↑ Lin, Huai-An. “Estimación del rendimiento óptimo de la sintaxis de transferencia ASN.1/BER”. ACM Computer Communication Review. Julio de 1993, 45-58.
- ↑ Recomendación ITU-T X.892, ISO/IEC 24824-2
- ↑ ITU-T X.694, ISO/IEC ISO/IEC 8825-5
Enlaces externos
- La guía de RSA para principiantes sobre un subconjunto de ASN.1, BER y DER se archivó el 15 de mayo de 2025 en Wayback Machine.
- ITU-T X.690, ISO/IEC 8825-1
- ITU-T X.892, ISO/IEC 24824-2
- ITU-T X.694, ISO/IEC 8825-5
- PKCS #7
- jASN1 Biblioteca de codificación Java ASN.1 BER/DER de código abierto desarrollada por beanit
- Biblioteca JavaScript ASN1js para codificación/decodificación ASN.1 BER en GitHub, con licencia GPL.
- La "Guía de estilo X.509" de Peter Gutmann
- Recomendaciones de la UIT-T
- Recomendaciones de la serie X de la UIT-T
- formatos de serialización de datos
- Codificaciones
- ASN.1