c++ - los - Openssl: consultas de extensiones en certificados X509
pki (2)
El segundo parámetro (nid) determina el tipo devuelto.
Mirando este código:
Parece que para el uso de clave NID, devuelve un ASN1_BIT_STRING. (línea 361).
Estoy trabajando con la clase de certificado X509 de la biblioteca de openSSL y necesito consultar la extensión de "uso de clave".
Después de abandonar la "documentación" de vapourware de openSSL, una búsqueda web en la oscuridad reveló que necesitaba llamar
X509_get_ext_d2i(X509 *x, int nid, int *crit, int *idx)
y la búsqueda a través del encabezado objects.h reveló el NID apropiado.
El problema es que esta llamada devuelve un puntero a vacío, que aparentemente puede apuntar a una variedad de estructuras, dependiendo de qué extensión haya pedido.
Dado que ninguno de estos parece estar documentado, uno queda sin una forma de averiguar cómo analizar qué devuelve la función.
¿Puede alguien señalarme un documento que realmente habla de esto, en lugar de solo enumerar cosas que puedo descubrir por mí mismo (el perfil de la función, de qué archivo proviene, etc.)?
Las soluciones más sencillas para leer el uso de la clave parece ser
X509* x509_cert = ...
// without X509_check_ca x509_cert->ex_kusage always returns 0 (no idea why)
int ca = X509_check_ca(x509_cert);
unsigned long usage = x509_cert->ex_kusage;
Los valores resultantes se definen en opensc / pkcs15-init.h
SC_PKCS15INIT_X509_DIGITAL_SIGNATURE 0x0080UL
SC_PKCS15INIT_X509_NON_REPUDIATION 0x0040UL
SC_PKCS15INIT_X509_KEY_ENCIPHERMENT 0x0020UL
SC_PKCS15INIT_X509_DATA_ENCIPHERMENT 0x0010UL
SC_PKCS15INIT_X509_KEY_AGREEMENT 0x0008UL
SC_PKCS15INIT_X509_KEY_CERT_SIGN 0x0004UL
SC_PKCS15INIT_X509_CRL_SIGN 0x0002UL
Llegué a esa esencia encontrando el siguiente código de un archivo fuente de openssl
/* Handle key usage */
if((usage=X509_get_ext_d2i(x, NID_key_usage, NULL, NULL))) {
if(usage->length > 0) {
x->ex_kusage = usage->data[0];
if(usage->length > 1)
x->ex_kusage |= usage->data[1] << 8;
} else x->ex_kusage = 0;
x->ex_flags |= EXFLAG_KUSAGE;
ASN1_BIT_STRING_free(usage);
}