在早期的openssl中使用X509_SIG

时间:2019-05-24 16:39:07

标签: c openssl cryptography

我有使用X509_SIG结构的代码,这些代码不适用于OpenSSL 1.1.1,因为该结构现在是不透明的。该代码的目的包括从X509_SIG获取PKCS#1内容。但是随着OpenSSL的更改,我无法构建X509_SIG缓冲区。

我的代码类似于crypto \ rsa \ rsa_sign.c [https://github.com/openssl/openssl/blob/master/crypto/rsa/rsa_sign.c]中的OpenSSL encode_pkcs1()函数:

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未分配且未初始化,因此无法使用。类型,m和m_len是该函数的参数。

有没有一种方法可以简单地生成具有摘要结构(ASN1_OCTET_STRING)和算法结构(X509_ALGOR和ASN1_TYPE)的DER缓冲区?

我可以对世代进行硬编码。但是,我正在寻找一个找不到的简单API。

1 个答案:

答案 0 :(得分:1)

这是一个没有充分记录的领域。

有些功能可以分配和免费提供信号:

  • X509_SIG_new
  • X509_SIG_free

您可以使用以下方式从ASN1格式读/写SIG

  • d2i_PKCS8_bio / _fp
  • i2d_PKCS8_bio / _fp

最有可能的是,您可以从PKCS8_PRIV_KEY_INFO结构向SIG加密或从SIG解密。

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);

认为这足以让您做自己想做的事?