int mono_btls_key_get_bytes (EVP_PKEY *pkey, uint8_t **buffer, int *size, int include_private_bits) { size_t len; RSA *rsa; int ret; *size = 0; *buffer = NULL; if (pkey->type != EVP_PKEY_RSA) return 0; rsa = EVP_PKEY_get1_RSA (pkey); if (!rsa) return 0; if (include_private_bits) ret = RSA_private_key_to_bytes (buffer, &len, rsa); else ret = RSA_public_key_to_bytes (buffer, &len, rsa); RSA_free (rsa); if (ret != 1) return 0; *size = (int)len; return 1; }
RSA *RSAPublicKey_dup(const RSA *rsa) { uint8_t *der; size_t der_len; if (!RSA_public_key_to_bytes(&der, &der_len, rsa)) { return NULL; } RSA *ret = RSA_public_key_from_bytes(der, der_len); OPENSSL_free(der); return ret; }
static int rsa_pub_encode(X509_PUBKEY *pk, const EVP_PKEY *pkey) { uint8_t *encoded; size_t encoded_len; if (!RSA_public_key_to_bytes(&encoded, &encoded_len, pkey->pkey.rsa)) { return 0; } if (!X509_PUBKEY_set0_param(pk, OBJ_nid2obj(EVP_PKEY_RSA), V_ASN1_NULL, NULL, encoded, encoded_len)) { OPENSSL_free(encoded); return 0; } return 1; }