Décodage ASN.1 DER OCTUOR à CORDES avec OpenSSL
À l'aide d'OpenSSL API, j'ai extrait une extension personnalisée à partir d'un X. 509v3 certificat:
X509_EXTENSION* ex = X509_get_ext(x509, 4);
La X509_EXTENSION objet contient une valeur (ex->valeur), qui est une ASN.1 OCTET STRING. La CHAÎNE d'OCTET contient codé DER chaîne UTF-8. Je suis en train de décoder la CHAÎNE d'OCTET pour obtenir la plaine chaîne UTF-8.
J'ai essayé quelques petites choses, telles que:
ASN1_STRING_to_UTF8(&buf, ex->value);
et
M_ASN1_OCTET_STRING_print(bio, ex->value);
int len = BIO_read(bio, buf, buf_size);
buf[len] = 'M_ASN1_OCTET_STRING_print(bio, ex->value);
int len = BIO_read(bio, buf, buf_size);
buf[len] = '\0';
';
Ces deux me donner la DER chaîne codée. Comment puis-je obtenir la plaine chaîne UTF-8?
J'ai utilisé "asn1_get_object" de le faire il y a longtemps, à la suite de l'exemple de code d'openssl (autour de crypto/asn1/asn1_par.c:135). C'est tellement douloureux pour décoder une grosse structure de cette façon que je vous recommande d'utiliser un autre asn1 analyseur tels que SNACC ou libtasn1.
Merci pour l'astuce. Depuis que je ne suis pas en train de décoder une grosse structure, juste une seule chaîne, ASN1_get_object() peut être suffisant. Cependant, j'ai fait une tentative de l'utiliser, basé sur la façon dont il est utilisé dans asn1_par.c, mais je ne pouvais pas le faire fonctionner. Seriez-vous en mesure de fournir un exemple?
J'ai trouvé comment utiliser la fonction et posté une réponse sur cette base. Merci encore.
Merci pour l'astuce. Depuis que je ne suis pas en train de décoder une grosse structure, juste une seule chaîne, ASN1_get_object() peut être suffisant. Cependant, j'ai fait une tentative de l'utiliser, basé sur la façon dont il est utilisé dans asn1_par.c, mais je ne pouvais pas le faire fonctionner. Seriez-vous en mesure de fournir un exemple?
J'ai trouvé comment utiliser la fonction et posté une réponse sur cette base. Merci encore.
OriginalL'auteur Roger Dahl | 2011-09-07
Vous devez vous connecter pour publier un commentaire.
@François m'a indiqué le ASN1_get_object() fonction. Cette fonction est appropriée pour ce scénario, où l'extension de certificat ne contient qu'une seule valeur.
ASN1_get_object() prend un pointeur vers un pointeur vers une mémoire tampon C qui contient codé DER objet. Il renvoie les données elle-même (en ajustant le pointeur), la longueur des données, de l'ASN.1 tag de la valeur et de l'ASN.1 objet de la classe.
Pour l'ASN.1 type que j'ai été à traiter,
OCTET STRING
, il fonctionne. Mais il se pourrait que cela fonctionne parce que la seule chose DER codage d'unOCTET STRING
est de l'envelopper avec un en-tête. Les octets eux-mêmes restent les mêmes. ASN1_get_object() supprime l'en-tête, mais peut-être que c'est tous?Oui, l'ASN.1 les types simples sont
BOOLEAN
,INTEGER
,BIT STRING
,OCTET STRING
,NULL
,OBJECT IDENTIFIER
,REAL
,ENUMERATED
etCHARACTER STRING
.Il semble que vous êtes à la recherche d'une solution générale sur la façon d'extraire l'information contenue dans un x509v3 extension. Comme le titre de cette question, c'est uniquement sur le cas particulier de décodage d'un seul
OCTET STRING
. Au-delà, je ne peux point vous à la suggestion de @François, qui consiste à utiliser un externe de l'ASN.1 analyseur, comme SNACC ou libtasn1 et de regarder le code source d'OpenSSL (autour de crypto/asn1/asn1_par.c:135).Merci pour le lien. Les chevaux sauvages ne pouvait pas me ramener à la OpenSSL API 🙂
OriginalL'auteur Roger Dahl