2011-09-07 18 views
8

Uso de la API OpenSSL, he extraído una extensión personalizada de un certificado X.509v3 con:Decodificar un DER OCTET STRING ASN.1 con OpenSSL

X509_EXTENSION* ex = X509_get_ext(x509, 4); 

El objeto X509_EXTENSION contiene un valor (ex- > value) que es un ASN.1 OCTET STRING. OCTET STRING contiene una cadena UTF-8 codificada DER. Estoy intentando descifrar OCTET STRING para obtener la cadena UTF-8.

he intentado un par de cosas, tales como:

ASN1_STRING_to_UTF8(&buf, ex->value); 

y

M_ASN1_OCTET_STRING_print(bio, ex->value); 
int len = BIO_read(bio, buf, buf_size); 
buf[len] = '\0'; 

Estos dos me dan la cadena de codificación DER. ¿Cómo obtengo la cadena UTF-8 simple?

+0

he usado 'asn1_get_object' para hacer esto hace un tiempo, siguiendo el ejemplo de código de OpenSSL (alrededor de cifrado/asn1/asn1_par.c: 135). Es muy doloroso decodificar una gran estructura de esta manera que recomiendo usar un analizador asn1 alternativo como SNACC o libtasn1. – Francois

+0

@Francois: Gracias por el consejo. Como no intento decodificar una gran estructura, solo una cadena, ASN1_get_object() podría ser adecuada. Sin embargo, hice un intento de usarlo, en función de cómo se usa en asn1_par.c, pero no pude hacerlo funcionar. ¿Serías capaz de dar un ejemplo? –

+0

@Francois: descubrí cómo usar la función y publiqué una respuesta basada en eso. Gracias de nuevo. –

Respuesta

5

@Francois me indicó la función ASN1_get_object(). Esa función es apropiada para este escenario donde la extensión de certificado contiene solo un valor único.

ASN1_get_object() toma un puntero a un puntero a un búfer C que contiene un objeto codificado DER. Devuelve los datos en sí (ajustando el puntero), la longitud de los datos, el valor de la etiqueta ASN.1 y la clase de objeto ASN.1.

ASN1_OCTET_STRING* octet_str = X509_EXTENSION_get_data(extension); 
const unsigned char* octet_str_data = octet_str->data; 
long xlen; 
int tag, xclass; 
int ret = ASN1_get_object(&octet_str_data, &xlen, &tag, &xclass, octet_str->length); 
printf("value: %s\n", octet_str_data); 
+0

Estaba tratando de hacer exactamente lo mismo, pero al aplicar su solución, obtengo la misma cadena que antes de la llamada a la función ASN1_get_object. ¿Estás seguro de que esta función derdecodifica? – Maggie

+0

@Maggie: para el tipo ASN.1 que estaba manejando, 'OCTET STRING', funciona. Pero podría ser que funcione porque lo único que hace la codificación DER para un 'OCTET STRING' es resumirlo con un encabezado. Los bytes en sí permanecen iguales. ASN1_get_object() elimina el encabezado, pero tal vez sea * all * it does? –

+0

como dije, estoy haciendo lo mismo, es decir. tratando de obtener el valor legible para humanos de la extensión del certificado der-codificado usando openssl. la solución que proporcionó no funciona. – Maggie

Cuestiones relacionadas