Определено в pkcs7.h
, проверяемый атрибут md_algs
является стеком X509_ALGOR
экземпляров:
typedef struct pkcs7_signed_st {
ASN1_INTEGER *version; /* version 1 */
STACK_OF(X509_ALGOR) *md_algs; /* md used */
STACK_OF(X509) *cert; /* [ 0 ] */
STACK_OF(X509_CRL) *crl; /* [ 1 ] */
STACK_OF(PKCS7_SIGNER_INFO) *signer_info;
struct pkcs7_st *contents;
} PKCS7_SIGNED;
Доступ к нему можно безопасно выполнить через API стека OpenSSL , например, с помощью функции sk_X509_ALGOR_value()
для проверки его элементов.
X509_ALGOR
само определено в x509.h
:
struct X509_algor_st {
ASN1_OBJECT *algorithm;
ASN1_TYPE *parameter;
} /* X509_ALGOR */ ;
Информация, которую вы ищете, хранится в свойстве algorithm
, которое вы можете просмотреть, например, OBJ_obj2txt()
.
Связав это вместе, чтобы получить текстовое представление первого алгоритма в стеке, вы можете сделать что-то вроде этого:
char tbuf[20];
X509_ALGOR *algor = sk_X509_ALGOR_value(Pkcs7->d.sign->md_algs, 0);
int res = OBJ_obj2txt(tbuf, sizeof tbuf, algor->algorithm, 0);
После этого tbuf
должен содержать значение типа "sha1"
, а res
- длину этой строки. Для программных целей такая функция, как OBJ_obj2nid()
, возможно, более полезна.
Отладчик не предоставил вам эту информацию, потому что поле data
в элементе stack
не является строго типизированным. Вы должны были бы привести его самостоятельно, чтобы указать, что это массив указателей на X509_ALGOR
структур. OpenSSL Stack API предоставляет вам набор макросов, которые выполняют преобразование и получают доступ к массиву таким образом. И затем, ASN1_OBJECT
, с которым вы в конечном итоге сталкиваетесь, трудно осмотреть или интерпретировать в отладчике, поскольку это просто набор байтов, представляющих идентификатор объекта в формате ASN.1
.