Pregunta

Saludos,

¿Cómo puedo codificar simplemente algunos datos binarios en una mancha con codificación DER ASN.1? Estoy usando C / C ++, y Calculo que debería ser posible prefijar simplemente el blob binario con algunos apropiada bytes que significar que los datos es de tipo cadena de octetos y es de una longitud dada (y en una secuencia de longitud 1 I supongo).

Antecedentes si está interesado:

¿Por qué quiero abusar ASN.1 de esta manera? Para un proyecto de investigación, que necesito para incrustar algunos datos de una firma digital que tiene un asociado un certificado X.509. (Estoy usando createSignatureEx en la biblioteca cryptlib de Peter Gutmann para crear CMS / S / MIME-2/3 / PKcs- nº 7 firmas que cumplen si importa. No voy a firmar los datos que desea codificar, sólo añadir que como metadatos a la firma de enriquecerla.) Según mi entendimiento, firmas serias con los datos de extensión arbitrarias requieren los datos de extensión a codificar utilizando DER ASN.1. Mi datos es un blob binario y sólo es útil a mi solicitud, por lo que no hay ningún valor real en hacer ASN.1 adecuada codificación de cada parte de mis datos. Me figura con un poco de trabajo que podría aprender a usar asn1c para hacer esto, pero se ve bastante complicado y estoy en la fecha límite. Igualmente importante, no parece necesario y parece que esta información podría ser útil para otros desarrolladores que quieren evitar el dolor de codificación ASN.1 adecuada.

Gracias!

¿Fue útil?

Solución

Yo usaría el ASN.1 Compilador .

Las personas abusan de ASN.1, ya que es una manera de codificar las estructuras de datos. Cada vez que tienes un programa en C ++ C / trabajar con una estructura de datos que los problemas atacante controla como; desbordamiento de memoria intermedia y número entero desbordamientos, entran en juego. ASN.1 no es más inseguro que permite por ejemplo XML o JSON o bencode, ya que estos son todos los puntos probables de fracaso. No puede haber problemas con la biblioteca de codificación de su auto, como éste vulnerabilidad de Microsoft desagradable . Pero esta afirmación es cierta, independientemente del método de codificación que utiliza. ASN.1 es una gran opción ya que el mensaje resultante es extremadamente pequeño y es el uso más eficiente del espacio de cualquier método de codificación, que yo sepa.

Otros consejos

Puede no sólo añadir una gota de ASN.1 a un certificado X.509 y esperan que se convierta en parte del certificado. El certificado es una secuencia ASN.1 de los valores, y, como tal, se inicia con una etiqueta de secuencia y una longitud, que abarca todo del certificado.

Si desea agregar un campo a la estructura de certificado (que probablemente significa que ya no es un certificado válido, pero todavía podría ser una estructura ASN.1 válido), entonces usted tendrá que cambiar la longitud de ese adjuntando secuencia, así como anexar los datos.

Sí, 04 08 01 23 45 67 89 ab cd ef es una codificación DER válida de una cadena de octetos. El 04 al comienzo es la etiqueta para octeto cadena y el 08 es la longitud de la cadena. Nota que longitudes de hasta 127 se codifican en un byte y que las longitudes más grandes utilizan una codificación más tiempo.

Para una buena introducción a ASN.1 - y sobre todo para su uso en los mensajes criptográficos - ver "una guía de divulgación a un subconjunto de ASN.1, BER y DER", que debe ser capaz de encontrar en el rsa.com sitio.

Yo sugeriría usar rápida DER , y alimentar a su rutina der_pack() con una descripción de la estructura que se puede compilar con su compilador asn2quickder. Si se trata de una cuestión de usar una estructura estándar probablemente puede #include <quick-der/rfc5280> y utilizar sus datos predefinidos.

Se puede utilizar para descomprimir der_unpack() con la misma descripción estructural. Se validará aspectos estructurales, aunque no las restricciones que sintaxis ASN.1 pueden incorporar. rangos de números enteros se comprueban cuando se utilizan las funciones de utilidad que puso a buscarlos.

Lo siento por ser empujando mi biblioteca onw; pero en realidad fue escrito con el propósito de ASN.1 fácilmente accesible para (open source) C / C ++ y desarrolladores de Python.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top