2011-09-07 13 views
8

Utilizzando l'API OpenSSL, ho estratto un'estensione personalizzata da un certificato X.509v3 con:Decodifica di un DER OCTET STRING ASN.1 con OpenSSL

X509_EXTENSION* ex = X509_get_ext(x509, 4); 

L'oggetto X509_EXTENSION contiene un valore (ex > value) che è una STRINGA OCTET ASN.1. OCTET STRING contiene una stringa UTF-8 codificata DER. Sto cercando di decodificare l'OCTET STRING per ottenere la semplice stringa UTF-8.

ho provato un paio di cose, come ad esempio:

ASN1_STRING_to_UTF8(&buf, ex->value); 

e

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

Questi entrambi mi danno la stringa codificato DER. Come ottengo la semplice stringa UTF-8?

+0

ho usato 'asn1_get_object' per fare questo qualche tempo fa, seguendo l'esempio di codice in OpenSSL (circa crypto/ASN1/asn1_par.c: 135). È così doloroso decodificare una grande struttura in questo modo che consiglio di utilizzare un parser asn1 alternativo come SNACC o libtasn1. – Francois

+0

@Francois: Grazie per il suggerimento. Poiché non sto cercando di decodificare una struttura grande, solo una singola stringa, ASN1_get_object() potrebbe essere adeguata. Tuttavia, ho fatto un tentativo di usarlo, in base a come è usato in asn1_par.c, ma non riuscivo a farlo funzionare. Sareste in grado di fornire un esempio? –

+0

@Francois: ho scoperto come utilizzare la funzione e ho postato una risposta basata su questo. Grazie ancora. –

risposta

5

@Francois mi ha indicato la funzione ASN1_get_object(). Questa funzione è appropriata per questo scenario in cui l'estensione del certificato contiene solo un singolo valore.

ASN1_get_object() accetta un puntatore a un puntatore a un buffer C che contiene un oggetto codificato DER. Restituisce i dati stessi (regolando il puntatore), la lunghezza dei dati, il valore del tag ASN.1 e la classe di oggetti 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

Stavo cercando di fare la stessa identica cosa, ma quando si applica la soluzione, ottengo la stessa stringa di prima della chiamata alla funzione ASN1_get_object. Sei sicuro che questa funzione der decodifica? – Maggie

+0

@Maggie: per il tipo ASN.1 che gestivo, 'OCTET STRING', funziona. Ma potrebbe essere che funzioni perché l'unica cosa che la codifica DER fa ad un 'OCTET STRING' è di avvolgerlo con un'intestazione. I byte stessi rimangono gli stessi. ASN1_get_object() rimuove l'intestazione, ma forse è tutto * fa *? –

+0

come ho detto, sto facendo la stessa cosa ESATTA, vale a dire. cercando di ottenere il valore leggibile dall'estensione del certificato der-encoded usando openssl. la soluzione che hai fornito non funziona. – Maggie

Problemi correlati