summaryrefslogtreecommitdiffstats
path: root/crypto/rsa/rsa_pmeth.c
diff options
context:
space:
mode:
authorDr. Stephen Henson <steve@openssl.org>2006-04-11 13:28:52 +0000
committerDr. Stephen Henson <steve@openssl.org>2006-04-11 13:28:52 +0000
commitf5cda4cbb17c908ceef33f4f52d94e8e04b7c1ab (patch)
tree851abcd3b7178040056cbb1ce397bbc526774041 /crypto/rsa/rsa_pmeth.c
parentf9a6348a537290f65fd76d945419a4c9bafff012 (diff)
Initial keygen support.
Diffstat (limited to 'crypto/rsa/rsa_pmeth.c')
-rw-r--r--crypto/rsa/rsa_pmeth.c37
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,