RSA *RSAPrivateKey_dup(const RSA *rsa) { uint8_t *der; size_t der_len; if (!RSA_private_key_to_bytes(&der, &der_len, rsa)) { return NULL; } RSA *ret = RSA_private_key_from_bytes(der, der_len); OPENSSL_free(der); return ret; }
int mono_btls_key_assign_rsa_private_key (EVP_PKEY *pkey, uint8_t *der_data, int der_length) { RSA *rsa; rsa = RSA_private_key_from_bytes (der_data, der_length); if (!rsa) return 0; return EVP_PKEY_assign_RSA (pkey, rsa); }
int SSL_use_RSAPrivateKey_ASN1(SSL *ssl, const uint8_t *der, size_t der_len) { RSA *rsa = RSA_private_key_from_bytes(der, der_len); if (rsa == NULL) { OPENSSL_PUT_ERROR(SSL, ERR_R_ASN1_LIB); return 0; } int ret = SSL_use_RSAPrivateKey(ssl, rsa); RSA_free(rsa); return ret; }
static int rsa_priv_decode(EVP_PKEY *pkey, PKCS8_PRIV_KEY_INFO *p8) { const uint8_t *p; int pklen; if (!PKCS8_pkey_get0(NULL, &p, &pklen, NULL, p8)) { OPENSSL_PUT_ERROR(EVP, ERR_R_MALLOC_FAILURE); return 0; } RSA *rsa = RSA_private_key_from_bytes(p, pklen); if (rsa == NULL) { OPENSSL_PUT_ERROR(EVP, ERR_R_RSA_LIB); return 0; } EVP_PKEY_assign_RSA(pkey, rsa); return 1; }