int CA_set_key(const EAC_CTX *ctx, const unsigned char *priv, size_t priv_len, const unsigned char *pub, size_t pub_len) { int r = 0; const unsigned char *p = priv; EVP_PKEY *key = NULL; check(ctx && ctx->ca_ctx && ctx->ca_ctx->ka_ctx, "Invalid arguments"); /* always try d2i_AutoPrivateKey as priv may contain domain parameters */ if (priv && d2i_AutoPrivateKey(&key, &p, priv_len)) { EVP_PKEY_free(ctx->ca_ctx->ka_ctx->key); ctx->ca_ctx->ka_ctx->key = key; if (pub) { /* it's OK if import of public key fails */ EVP_PKEY_set_keys(key, NULL, 0, pub, pub_len, ctx->bn_ctx); } } else { /* wipe errors from d2i_AutoPrivateKey() */ ERR_clear_error(); check(EVP_PKEY_set_keys(ctx->ca_ctx->ka_ctx->key, priv, priv_len, pub, pub_len, ctx->bn_ctx), "no valid keys given"); } r = 1; err: return r; }
static EVP_PKEY * EVP_PKEY_from_pubkey(EVP_PKEY *key, const BUF_MEM *pub, BN_CTX *bn_ctx) { EVP_PKEY *out = NULL; check(pub, "Invalid arguments"); out = EVP_PKEY_dup(key); check(out, ""); if (!EVP_PKEY_set_keys(out, NULL, 0, (const unsigned char *) pub->data, pub->length, bn_ctx)) { EVP_PKEY_free(out); out = NULL; goto err; } err: return out; }