Das Dekodieren einer ASN.1 DER OKTETT-STRING mit OpenSSL
Mithilfe der OpenSSL-API, die ich entpackt habe eine benutzerdefinierte Erweiterung von einem X. 509v3-Zertifikat mit:
X509_EXTENSION* ex = X509_get_ext(x509, 4);
Den X509_EXTENSION-Objekt enthält einen Wert, der (ex->Wert), dass ist ein ASN.1-OKTETT-STRING. Die OKTETT-STRING enthält ein DER-codiertes UTF-8-string. Ich bin versucht zu entschlüsseln, die OKTETT-STRING zu erhalten, der plain UTF-8-string.
Habe ich versucht, ein paar Dinge, wie zum Beispiel:
ASN1_STRING_to_UTF8(&buf, ex->value);
und
M_ASN1_OCTET_STRING_print(bio, ex->value);
int len = BIO_read(bio, buf, buf_size);
buf[len] = '\0';
Diese beiden geben mir das DER kodierte string. Wie bekomme ich die plain UTF-8-string?
- Ich benutzt 'asn1_get_object' zu tun, dieses vor einer Weile, nach dem Vorbild in der openssl-code (etwa crypto/asn1/asn1_par.c:135). Es ist so schmerzhaft zu Dekodieren, die eine große Struktur, die auf diese Weise empfehle ich die Verwendung eines alternativen asn1-parser wie SNACC oder libtasn1.
- Danke für den Tipp. Da bin ich nicht versuchen zu entschlüsseln, einen großen Aufbau, nur ein einziger string, ASN1_get_object() kann angemessen sein. Allerdings machte ich den Versuch, es zu verwenden, basiert auf, wie es verwendet wird in asn1_par.c, aber konnte es nicht funktioniert. Könnten Sie ein Beispiel geben?
- Ich fand heraus, wie man die Funktion und verfasst eine Antwort, die Grundlage. Nochmals vielen Dank.
Du musst angemeldet sein, um einen Kommentar abzugeben.
@Francois wies mich auf die ASN1_get_object () - Funktion. Diese Funktion ist für dieses Szenario, wo die Zertifikat-Erweiterung enthält nur einen einzigen Wert.
ASN1_get_object() nimmt einen Zeiger auf einen Zeiger auf eine C-Puffer, enthält ein DER-codiertes Objekt. Es gibt die Daten selbst (durch verstellen der Zeiger), die Länge der Daten, die ASN.1 tag-Wertes und der ASN.1-Objekt-Klasse.
OCTET STRING
es funktioniert. Aber es könnte sein, dass es funktioniert, weil das nur Sache DER Codierung nicht zu einerOCTET STRING
ist, wickeln Sie es mit einem header. Die bytes selbst bleiben die gleichen. ASN1_get_object() wird die Kopfzeile entfernen, aber vielleicht ist alle es funktioniert?OCTET STRING
?BOOLEAN
,INTEGER
,BIT STRING
,OCTET STRING
,NULL
,OBJECT IDENTIFIER
,REAL
,ENUMERATED
undCHARACTER STRING
.OCTET STRING
. Darüber hinaus kann ich nur verweisen Sie auf den ursprünglichen Vorschlag von @Francois, das ist die Verwendung eines externen ASN.1-parser, wie SNACC oder libtasn1 und zu sehen, das OpenSSL-Quell-code (etwa crypto/asn1/asn1_par.c:135).