Исходный код OpenSSL - ваша лучшая документация ...
В качестве примера конструкции, подобной той, которую вы пытаетесь построить, посмотрите определение PKCS7_SIGNED
ASN1 в crypto/pkcs7/pk7_asn1.c
:
ASN1_NDEF_SEQUENCE(PKCS7_SIGNED) = {
ASN1_SIMPLE(PKCS7_SIGNED, version, ASN1_INTEGER),
ASN1_SET_OF(PKCS7_SIGNED, md_algs, X509_ALGOR),
ASN1_SIMPLE(PKCS7_SIGNED, contents, PKCS7),
ASN1_IMP_SEQUENCE_OF_OPT(PKCS7_SIGNED, cert, X509, 0),
ASN1_IMP_SET_OF_OPT(PKCS7_SIGNED, crl, X509_CRL, 1),
ASN1_SET_OF(PKCS7_SIGNED, signer_info, PKCS7_SIGNER_INFO)
} ASN1_NDEF_SEQUENCE_END(PKCS7_SIGNED)
Его второй член, md_algs
, представляет собой набор X509_ALGOR
, который сам по себе является последовательностью, определенной в crypto/asn1/x_algor.c
:
ASN1_SEQUENCE(X509_ALGOR) = {
ASN1_SIMPLE(X509_ALGOR, algorithm, ASN1_OBJECT),
ASN1_OPT(X509_ALGOR, parameter, ASN1_ANY)
} ASN1_SEQUENCE_END(X509_ALGOR)
Так что это поле md_algs
представляет собой набор последовательностей, как вы и просили.Эквивалентные определения C-структуры можно найти в include/openssl/pkcs7.h
:
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;
Поле md_algs
показывает, что для захвата конструкции множества вам необходимо использовать STACK API , который предназначен для обработки коллекций.В вашем случае это будет STACK_OF(StringSequence)
.