X.690 es un estándar ITU-T que especifica varios formatos de codificación ASN.1 :
Las reglas básicas de codificación (BER) fueron las reglas originales establecidas por el estándar ASN.1 para codificar datos en formato binario. Las reglas, denominadas colectivamente sintaxis de transferencia en el lenguaje ASN.1, especifican los octetos exactos (bytes de 8 bits) que se utilizan para codificar 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.
Las BER, junto con dos subconjuntos de BER (las reglas de codificación canónica y las reglas de codificación distinguida ), están definidas por el documento de estándares X.690 de la UIT-T , que es parte de la serie de documentos ASN.1.
Las reglas básicas de codificación especifican, en términos generales, un protocolo parcialmente autodescriptivo y autodelimitador para codificar estructuras de datos ASN.1. Cada elemento de datos debe codificarse como un identificador de tipo, una descripción de longitud, los elementos de datos reales y, cuando sea necesario, un marcador de fin de contenido. Estos tipos de codificaciones se denominan comúnmente codificaciones de tipo-longitud-valor (TLV). Sin embargo, en la terminología de BER, es identifier-length-contents .
Este tipo de formato permitiría a un receptor decodificar la información ASN.1 de un flujo incompleto, sin requerir ningún conocimiento previo del tamaño, contenido o significado semántico de los datos, aunque sería necesario proporcionar algunos detalles específicos del protocolo o aplicar ingeniería inversa 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 una longitud es cero, no hay octetos de contenido, por ejemplo, el tipo NULL. Los octetos de fin de contenido solo se utilizan para la forma indefinida de longitud.
Los octetos de identificador BER codifican las etiquetas ASN.1 . La lista de etiquetas de clase universal se puede encontrar en la Rec. ITU-T X.680, cláusula 8, tabla 1. [2] Las siguientes etiquetas son nativas de ASN.1:
Los octetos de identificador codifican el número de clase y el número de tipo de la etiqueta ASN.1. También codifican si los octetos de 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. Son posibles los siguientes valores:
Si el tipo de la etiqueta cabe en los 5 bits (0-30 10 ), entonces el identificador abarca solo un byte: formato corto . Si el tipo de la etiqueta es demasiado grande para el campo de etiqueta de 5 bits (> 30 10 ), debe codificarse en más octetos: formato largo .
El octeto inicial codifica la clase y la primitiva/construida como antes, y los bits 1 a 5 son 1. El número de etiqueta se codifica en los siguientes octetos, 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 de número de etiqueta combinados, big-endian, codifican el número de etiqueta. Se debe codificar el menor número de octetos siguientes; es decir, los bits 1 a 7 no deben ser todos 0 en el primer octeto siguiente.
Hay dos formas de los octetos de longitud: la forma definida y la forma indefinida.
Esto codifica la cantidad de octetos de contenido y siempre se utiliza si el tipo es 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 longitudes. Los datos numéricos se codifican como números enteros sin signo con el bit menos significativo siempre primero (a la derecha).
La forma corta consta de 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 un octeto inicial seguido de uno o más octetos posteriores, que contienen la longitud. En el octeto inicial, el bit 8 es 1, y los bits 1 a 7 (excluidos los valores 0 y 127) codifican la cantidad de octetos que siguen. [1] Los octetos siguientes codifican, como big-endian, la longitud (que puede ser 0) como una cantidad de octetos.
Esto no codifica la longitud en absoluto, sino que los octetos de contenido terminan en los octetos marcadores. Esto se aplica a los tipos construidos y se utiliza normalmente si el contenido no está disponible inmediatamente en el momento de la codificación.
Consiste en un solo octeto, en el que el bit 8 es 1 y los bits 1 a 7 son 0. Luego, dos octetos de fin de contenido deben terminar los octetos de contenido.
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 debe notar la existencia del objeto ASN.1 o su ausencia. Por ejemplo, este es el caso de un valor NULL de ASN.1.
CER (Canonical Encoding Rules) es una variante restringida de BER para producir 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 los datos, CER (junto con DER) selecciona solo una codificación de las permitidas por las reglas de codificación básicas, eliminando el resto de las opciones. CER es útil cuando se deben preservar las codificaciones; por ejemplo, en los intercambios de seguridad.
DER (Distinguished Encoding Rules) es una variante restringida de BER para producir 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 se eliminan todas las opciones del remitente excepto una.
DER es un subconjunto de BER que proporciona exactamente una forma de codificar un valor ASN.1. DER está pensado para situaciones en las que se necesita 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 de verdadero puede codificarse como cualquiera de los 255 valores de bytes distintos de cero, mientras que en DER hay una forma de codificar un valor booleano de verdadero.
Las restricciones de codificación DER más significativas son:
DER se utiliza ampliamente para certificados digitales como X.509 .
La diferencia clave entre el formato BER y los formatos CER o DER es la flexibilidad que proporcionan las reglas básicas de codificación. Como se explicó anteriormente, BER es el conjunto básico de reglas de codificación que establece 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 deja algunas 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 afirmen 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 única opción. Como tales, CER y DER son formas restringidas de BER y sirven para desambiguar la norma BER.
CER y DER difieren en el conjunto de restricciones que imponen al remitente. La diferencia básica entre CER y DER es que DER utiliza el formato de longitud definitiva y CER utiliza el formato de longitud indefinida en algunos casos definidos con precisión. Es decir, DER siempre tiene información de longitud inicial, mientras que CER utiliza octetos de fin de contenido en lugar de proporcionar la longitud de los datos codificados. Debido a esto, CER requiere menos metadatos para valores codificados grandes, mientras que DER lo hace para los pequeños.
Para facilitar la elección entre las reglas de codificación, el documento de estándares X.690 proporciona la siguiente orientación:
Las reglas de codificación distinguida son más adecuadas que las reglas de codificación canónica si el valor codificado es lo suficientemente pequeño como para caber en la memoria disponible y existe la necesidad de omitir rápidamente algunos valores anidados. Las reglas de codificación canónica son más adecuadas que las reglas de codificación distinguida si existe la necesidad de codificar valores que son tan grandes que no caben fácilmente en la memoria disponible o es necesario codificar y transmitir una parte de un valor antes de que el valor completo esté disponible. Las reglas de codificación básica son más adecuadas que las reglas de codificación canónica o distinguida si la codificación contiene un valor de conjunto o un conjunto de valores y no hay necesidad de las restricciones que imponen las reglas de codificación canónica y distinguida.
Existe una percepción común de que la BER es "ineficiente" en comparación con las reglas de codificación alternativas. Algunos han argumentado que esta percepción se debe principalmente a implementaciones deficientes, no necesariamente a un defecto inherente en las reglas de codificación. [3] Estas implementaciones se basan en la flexibilidad que proporciona la BER para utilizar una lógica de codificación que es más fácil de implementar, pero que da como resultado un flujo de datos codificados más grande de lo necesario. Ya sea que esta ineficiencia sea una realidad o una percepción, ha dado lugar a una serie de esquemas de codificación alternativos, como las Reglas de codificación empaquetadas , que intentan mejorar el rendimiento y el tamaño de la BER.
También se están desarrollando otras reglas de formato alternativas que aún ofrecen la flexibilidad de BER pero utilizan esquemas de codificación alternativos. Las más populares son 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 en un esquema ASN.1, que luego se puede codificar utilizando BER. [5]
A pesar de sus problemas percibidos, BER es un formato popular para transmitir datos, particularmente en sistemas con diferentes codificaciones de datos nativas.
En comparación, la codificación DER, más definida, se utiliza ampliamente para transferir certificados digitales como X.509 .