Использование X509_SIG с более ранним openssl - PullRequest
1 голос
/ 24 мая 2019

У меня есть код, использующий структуры X509_SIG, которые не работают не с OpenSSL 1.1.1, потому что структура теперь непрозрачна. Целью кода является получение контента PKCS # 1 от X509_SIG. Но с изменением OpenSSL я не могу построить буфер X509_SIG.

Мой код аналогичен функции OpenSSL encode_pkcs1 () из crypto \ rsa \ rsa_sign.c [https://github.com/openssl/openssl/blob/master/crypto/rsa/rsa_sign.c]:

X509_SIG sig;
X509_ALGOR algor;
ASN1_TYPE parameter;
ASN1_OCTET_STRING digest;
uint8_t *der = NULL;
int len;

sig.algor = &algor;
sig.algor->algorithm = OBJ_nid2obj(type);
parameter.type = V_ASN1_NULL;
parameter.value.ptr = NULL;
sig.algor->parameter = &parameter;

sig.digest = &digest;
sig.digest->data = (unsigned char *)m;
sig.digest->length = m_len;

len = i2d_X509_SIG(&sig, &der);

Я изменил несколько вещей, например, используя X509_SIG * вместо X509_SIG. Я сделал другие изменения, и теперь он компилируется. Но это не будет работать, потому что X509_SIG не был выделен и не инициализирован. type, m и m_len являются аргументами функции.

Есть ли способ простой генерации буфера DER со структурой дайджеста (ASN1_OCTET_STRING) и структурой алгоритма (X509_ALGOR и ASN1_TYPE)?

Я могу жестко закодировать поколение. Но я ищу простой API, который я не нашел.

1 Ответ

1 голос
/ 24 мая 2019

Это область, которая не очень хорошо документирована.

Есть функции, которые вы все можете выделить и бесплатно подписать:

  • X509_SIG_new
  • X509_SIG_free

Вы можете читать / записывать SIG в / из формата ASN1, используя

  • d2i_PKCS8_bio / _fp
  • i2d_PKCS8_bio / _fp

И, скорее всего, что вы ищете, вы можете зашифровать и расшифровать в / из SIG из структуры PKCS8_PRIV_KEY_INFO.

X509_SIG *PKCS8_encrypt(int pbe_nid, const EVP_CIPHER *cipher,
                        const char *pass, int passlen,
                        unsigned char *salt, int saltlen, int iter,
                        PKCS8_PRIV_KEY_INFO *p8inf);

PKCS8_PRIV_KEY_INFO *PKCS8_decrypt(const X509_SIG *p8, const char *pass,
                                   int passlen);

PKCS8_PRIV_KEY_INFO APIS:

PKCS8_PRIV_KEY_INFO_new
PKCS8_PRIV_KEY_INFO_free
EVP_PKEY *EVP_PKCS82PKEY(const PKCS8_PRIV_KEY_INFO *p8);
PKCS8_PRIV_KEY_INFO *EVP_PKEY2PKCS8(EVP_PKEY *pkey);
int PKCS8_pkey_set0(PKCS8_PRIV_KEY_INFO *priv, ASN1_OBJECT *aobj,
                    int version, int ptype, void *pval,
                    unsigned char *penc, int penclen);
int PKCS8_pkey_get0(const ASN1_OBJECT **ppkalg,
                    const unsigned char **pk, int *ppklen,
                    const X509_ALGOR **pa, const PKCS8_PRIV_KEY_INFO *p8);

const STACK_OF(X509_ATTRIBUTE) *
PKCS8_pkey_get0_attrs(const PKCS8_PRIV_KEY_INFO *p8);
int PKCS8_pkey_add1_attr_by_NID(PKCS8_PRIV_KEY_INFO *p8, int nid, int type,
                                const unsigned char *bytes, int len);

Я думаю этого вам достаточно, чтобы делать то, что вы хотите?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...