Это область, которая не очень хорошо документирована.
Есть функции, которые вы все можете выделить и бесплатно подписать:
- 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);
Я думаю этого вам достаточно, чтобы делать то, что вы хотите?