Декодирование строки данных ASN.1 DER OCTET с помощью OpenSSL - PullRequest
8 голосов
/ 07 сентября 2011

Используя API OpenSSL, я извлек пользовательское расширение из сертификата X.509v3 с помощью:

X509_EXTENSION* ex = X509_get_ext(x509, 4);

Объект X509_EXTENSION содержит значение (ex-> value), которое является OCTET ASN.1STRING.OCTET STRING содержит кодированную DER строку UTF-8.Я пытаюсь декодировать строку OCTET, чтобы получить простую строку UTF-8.

Я пробовал несколько вещей, таких как:

ASN1_STRING_to_UTF8(&buf, ex->value);

и

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

Они оба дают мне строку в кодировке DER.Как получить простую строку UTF-8?

1 Ответ

7 голосов
/ 08 сентября 2011

@ Франсуа указал мне на функцию ASN1_get_object (). Эта функция подходит для этого сценария, где расширение сертификата содержит только одно значение.

ASN1_get_object () получает указатель на указатель на буфер C, который содержит кодированный объект DER. Он возвращает сами данные (путем настройки указателя), длину данных, значение тега ASN.1 и класс объектов 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);
...