Как получить поле алгоритма из подписанного блока PE PKCS # 7 - PullRequest
0 голосов
/ 08 ноября 2018

У меня есть PKCS#7 содержимое, извлеченное из файла PE.

Первая часть перед цепочкой сертификатов (идет от начала до метки cert:), содержит информацию о целостности файла.

В частности, хеш, который соответствует хешу файла, и алгоритм, который использует для генерации этого хеша (стоит FA0FE65F973A5709DC04EE18ABEF353EBEFEA669 и sha1 соответственно в приведенном ниже примере).

Я использую openssl, и я хотел бы извлечь тип алгоритма хеширования из формата X509. Я попробовал что-то вроде печати структуры md_algs из отладчика и, надеюсь, нашел поле algorithm ценность 1.3.14.3.2.26, но это то, что я увидел ..

p *(Pkcs7->d.sign->md_algs)
(stack_st_X509_ALGOR) $6 = {
  stack = {
     num = 1
     data = 0x00000001024457f0
     sorted = 0
     num_alloc = 4
     comp = 0x0000000000000000
  }
}

Где я могу увидеть поле алгоритма?

P.s. вот соответствующая часть структуры pkcs7:

PKCS7: 
   type: pkcs7-signedData (1.2.840.113549.1.7.2)
   d.sign: 
     version: 1
     md_algs:
       algorithm: sha1 (1.3.14.3.2.26)
       parameter: NULL
     contents: 
       type: undefined (1.3.6.1.4.1.311.2.1.4)
     d.other: SEQUENCE:
        0:d=0  hl=2 l=  60 cons: SEQUENCE          
        2:d=1  hl=2 l=  23 cons:  SEQUENCE          
        4:d=2  hl=2 l=  10 prim:   OBJECT            :1.3.6.1.4.1.311.2.1.15
       16:d=2  hl=2 l=   9 cons:   SEQUENCE          
       18:d=3  hl=2 l=   1 prim:    BIT STRING        
       21:d=3  hl=2 l=   4 cons:    cont [ 0 ]        
       23:d=4  hl=2 l=   2 cons:     cont [ 2 ]        
       25:d=5  hl=2 l=   0 prim:      cont [ 0 ]        
       27:d=1  hl=2 l=  33 cons:  SEQUENCE          
       29:d=2  hl=2 l=   9 cons:   SEQUENCE          
       31:d=3  hl=2 l=   5 prim:    OBJECT            :sha1
       38:d=3  hl=2 l=   0 prim:    NULL              
       40:d=2  hl=2 l=  20 prim:   OCTET STRING      [HEX DUMP]:FA0FE65F973A5709DC04EE18ABEF353EBEFEA669
     cert:
      cert_info: 
      ...

спасибо

1 Ответ

0 голосов
/ 08 ноября 2018

Определено в 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.

...