diff options
author | Dr. Stephen Henson <steve@openssl.org> | 2006-04-11 13:28:52 +0000 |
---|---|---|
committer | Dr. Stephen Henson <steve@openssl.org> | 2006-04-11 13:28:52 +0000 |
commit | f5cda4cbb17c908ceef33f4f52d94e8e04b7c1ab (patch) | |
tree | 851abcd3b7178040056cbb1ce397bbc526774041 /crypto/rsa/rsa_pmeth.c | |
parent | f9a6348a537290f65fd76d945419a4c9bafff012 (diff) |
Initial keygen support.
Diffstat (limited to 'crypto/rsa/rsa_pmeth.c')
-rw-r--r-- | crypto/rsa/rsa_pmeth.c | 37 |
1 files changed, 36 insertions, 1 deletions
diff --git a/crypto/rsa/rsa_pmeth.c b/crypto/rsa/rsa_pmeth.c index 378bfe4b4e..56759b5285 100644 --- a/crypto/rsa/rsa_pmeth.c +++ b/crypto/rsa/rsa_pmeth.c @@ -75,6 +75,8 @@ typedef struct /* Key gen parameters */ int nbits; BIGNUM *pub_exp; + /* Keygen callback info */ + int gentmp[2]; /* RSA padding mode */ int pad_mode; /* message digest */ @@ -100,6 +102,8 @@ static int pkey_rsa_init(EVP_PKEY_CTX *ctx) rctx->saltlen = -2; ctx->data = rctx; + ctx->keygen_info = rctx->gentmp; + ctx->keygen_info_count = 2; return 1; } @@ -427,6 +431,36 @@ static int pkey_rsa_ctrl_str(EVP_PKEY_CTX *ctx, return -2; } +static int pkey_rsa_keygen(EVP_PKEY_CTX *ctx, EVP_PKEY *pkey) + { + RSA *rsa = NULL; + RSA_PKEY_CTX *rctx = ctx->data; + BN_GENCB *pcb, cb; + int ret; + if (!rctx->pub_exp) + { + rctx->pub_exp = BN_new(); + if (!rctx->pub_exp || !BN_set_word(rctx->pub_exp, RSA_F4)) + return 0; + } + rsa = RSA_new(); + if (!rsa) + return 0; + if (ctx->pkey_gencb) + { + pcb = &cb; + evp_pkey_set_cb_translate(pcb, ctx); + } + else + pcb = NULL; + ret = RSA_generate_key_ex(rsa, rctx->nbits, rctx->pub_exp, pcb); + if (ret > 0) + EVP_PKEY_assign_RSA(pkey, rsa); + else + RSA_free(rsa); + return ret; + } + const EVP_PKEY_METHOD rsa_pkey_meth = { EVP_PKEY_RSA, @@ -436,7 +470,8 @@ const EVP_PKEY_METHOD rsa_pkey_meth = 0,0, - 0,0, + 0, + pkey_rsa_keygen, 0, pkey_rsa_sign, |