1 From 73629969c6fe54529441530674b061ce31a41d93 Mon Sep 17 00:00:00 2001
2 From: Hou Zhiqiang <B48286@freescale.com>
3 Date: Wed, 2 Apr 2014 16:10:43 +0800
4 Subject: [PATCH 08/48] Add RSA keygen operation and support gendsa command
7 Upstream-status: Pending
9 Signed-off-by: Hou Zhiqiang <B48286@freescale.com>
10 Tested-by: Cristian Stoica <cristian.stoica@freescale.com>
12 crypto/engine/eng_cryptodev.c | 120 ++++++++++++++++++++++++++++++++++++++++++
13 1 file changed, 120 insertions(+)
15 diff --git a/crypto/engine/eng_cryptodev.c b/crypto/engine/eng_cryptodev.c
16 index 90fe9b8..8c9ad5c 100644
17 --- a/crypto/engine/eng_cryptodev.c
18 +++ b/crypto/engine/eng_cryptodev.c
19 @@ -2022,6 +2022,124 @@ cryptodev_dsa_verify(const unsigned char *dgst, int dlen,
23 +/* Cryptodev RSA Key Gen routine */
24 +static int cryptodev_rsa_keygen(RSA *rsa, int bits, BIGNUM *e, BN_GENCB *cb)
26 + struct crypt_kop kop;
31 + if ((fd = get_asym_dev_crypto()) < 0)
34 + if (!rsa->n && ((rsa->n = BN_new()) == NULL))
36 + if (!rsa->d && ((rsa->d = BN_new()) == NULL))
38 + if (!rsa->e && ((rsa->e = BN_new()) == NULL))
40 + if (!rsa->p && ((rsa->p = BN_new()) == NULL))
42 + if (!rsa->q && ((rsa->q = BN_new()) == NULL))
44 + if (!rsa->dmp1 && ((rsa->dmp1 = BN_new()) == NULL))
46 + if (!rsa->dmq1 && ((rsa->dmq1 = BN_new()) == NULL))
48 + if (!rsa->iqmp && ((rsa->iqmp = BN_new()) == NULL))
53 + p_len = (bits + 1) / (2 * 8);
54 + q_len = (bits - p_len * 8) / 8;
55 + memset(&kop, 0, sizeof kop);
56 + kop.crk_op = CRK_RSA_GENERATE_KEY;
59 + kop.crk_param[kop.crk_iparams].crp_p = calloc(p_len + 1, sizeof(char));
60 + if (!kop.crk_param[kop.crk_iparams].crp_p)
62 + kop.crk_param[kop.crk_iparams].crp_nbits = p_len * 8;
63 + memset(kop.crk_param[kop.crk_iparams].crp_p, 0xff, p_len + 1);
67 + kop.crk_param[kop.crk_iparams].crp_p = calloc(q_len + 1, sizeof(char));
68 + if (!kop.crk_param[kop.crk_iparams].crp_p)
70 + kop.crk_param[kop.crk_iparams].crp_nbits = q_len * 8;
71 + memset(kop.crk_param[kop.crk_iparams].crp_p, 0xff, q_len + 1);
75 + kop.crk_param[kop.crk_iparams].crp_p =
76 + calloc(p_len + q_len + 1, sizeof(char));
77 + if (!kop.crk_param[kop.crk_iparams].crp_p)
79 + kop.crk_param[kop.crk_iparams].crp_nbits = bits;
80 + memset(kop.crk_param[kop.crk_iparams].crp_p, 0x00, p_len + q_len + 1);
84 + kop.crk_param[kop.crk_iparams].crp_p =
85 + calloc(p_len + q_len + 1, sizeof(char));
86 + if (!kop.crk_param[kop.crk_iparams].crp_p)
88 + kop.crk_param[kop.crk_iparams].crp_nbits = bits;
89 + memset(kop.crk_param[kop.crk_iparams].crp_p, 0xff, p_len + q_len + 1);
93 + kop.crk_param[kop.crk_iparams].crp_p = calloc(p_len + 1, sizeof(char));
94 + if (!kop.crk_param[kop.crk_iparams].crp_p)
96 + kop.crk_param[kop.crk_iparams].crp_nbits = p_len * 8;
97 + memset(kop.crk_param[kop.crk_iparams].crp_p, 0xff, p_len + 1);
101 + kop.crk_param[kop.crk_iparams].crp_p = calloc(q_len + 1, sizeof(char));
102 + if (!kop.crk_param[kop.crk_iparams].crp_p)
104 + kop.crk_param[kop.crk_iparams].crp_nbits = q_len * 8;
105 + memset(kop.crk_param[kop.crk_iparams].crp_p, 0xff, q_len + 1);
109 + kop.crk_param[kop.crk_iparams].crp_p = calloc(p_len + 1, sizeof(char));
110 + if (!kop.crk_param[kop.crk_iparams].crp_p)
112 + kop.crk_param[kop.crk_iparams].crp_nbits = p_len * 8;
113 + memset(kop.crk_param[kop.crk_iparams].crp_p, 0xff, p_len + 1);
117 + if (ioctl(fd, CIOCKEY, &kop) == 0) {
118 + BN_bin2bn(kop.crk_param[0].crp_p, p_len, rsa->p);
119 + BN_bin2bn(kop.crk_param[1].crp_p, q_len, rsa->q);
120 + BN_bin2bn(kop.crk_param[2].crp_p, bits / 8, rsa->n);
121 + BN_bin2bn(kop.crk_param[3].crp_p, bits / 8, rsa->d);
122 + BN_bin2bn(kop.crk_param[4].crp_p, p_len, rsa->dmp1);
123 + BN_bin2bn(kop.crk_param[5].crp_p, q_len, rsa->dmq1);
124 + BN_bin2bn(kop.crk_param[6].crp_p, p_len, rsa->iqmp);
129 + const RSA_METHOD *meth = RSA_PKCS1_SSLeay();
130 + ret = (meth->rsa_keygen) (rsa, bits, e, cb);
135 + for (i = 0; i < CRK_MAXPARAM; i++)
136 + free(kop.crk_param[i].crp_p);
141 /* Cryptodev DSA Key Gen routine */
142 static int cryptodev_dsa_keygen(DSA *dsa)
144 @@ -4048,6 +4166,8 @@ void ENGINE_load_cryptodev(void)
145 cryptodev_rsa.rsa_mod_exp_async =
146 cryptodev_rsa_nocrt_mod_exp_async;
148 + if (cryptodev_asymfeat & CRF_RSA_GENERATE_KEY)
149 + cryptodev_rsa.rsa_keygen = cryptodev_rsa_keygen;