1 From e4fc051f8ae1c093b25ca346c2ec351ff3b700d1 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 11/17] 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 | 118 ++++++++++++++++++++++++++++++++++++++++++
13 1 file changed, 118 insertions(+)
15 diff --git a/crypto/engine/eng_cryptodev.c b/crypto/engine/eng_cryptodev.c
16 index 9f2416e..b2919a8 100644
17 --- a/crypto/engine/eng_cryptodev.c
18 +++ b/crypto/engine/eng_cryptodev.c
19 @@ -1906,6 +1906,121 @@ err:
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)) goto err;
35 + if(!rsa->d && ((rsa->d=BN_new()) == NULL)) goto err;
36 + if(!rsa->e && ((rsa->e=BN_new()) == NULL)) goto err;
37 + if(!rsa->p && ((rsa->p=BN_new()) == NULL)) goto err;
38 + if(!rsa->q && ((rsa->q=BN_new()) == NULL)) goto err;
39 + if(!rsa->dmp1 && ((rsa->dmp1=BN_new()) == NULL)) goto err;
40 + if(!rsa->dmq1 && ((rsa->dmq1=BN_new()) == NULL)) goto err;
41 + if(!rsa->iqmp && ((rsa->iqmp=BN_new()) == NULL)) goto err;
45 + p_len = (bits+1) / (2 * 8);
46 + q_len = (bits - p_len * 8) / 8;
47 + memset(&kop, 0, sizeof kop);
48 + kop.crk_op = CRK_RSA_GENERATE_KEY;
51 + kop.crk_param[kop.crk_iparams].crp_p = calloc(p_len + 1, sizeof(char));
52 + if (!kop.crk_param[kop.crk_iparams].crp_p)
54 + kop.crk_param[kop.crk_iparams].crp_nbits = p_len * 8;
55 + memset(kop.crk_param[kop.crk_iparams].crp_p, 0xff, p_len + 1);
59 + kop.crk_param[kop.crk_iparams].crp_p = calloc(q_len + 1, sizeof(char));
60 + if (!kop.crk_param[kop.crk_iparams].crp_p)
62 + kop.crk_param[kop.crk_iparams].crp_nbits = q_len * 8;
63 + memset(kop.crk_param[kop.crk_iparams].crp_p, 0xff, q_len + 1);
67 + kop.crk_param[kop.crk_iparams].crp_p = calloc(p_len + q_len + 1, sizeof(char));
68 + if (!kop.crk_param[kop.crk_iparams].crp_p)
70 + kop.crk_param[kop.crk_iparams].crp_nbits = bits;
71 + memset(kop.crk_param[kop.crk_iparams].crp_p, 0x00, p_len + q_len + 1);
75 + kop.crk_param[kop.crk_iparams].crp_p = calloc(p_len + q_len + 1, sizeof(char));
76 + if (!kop.crk_param[kop.crk_iparams].crp_p)
78 + kop.crk_param[kop.crk_iparams].crp_nbits = bits;
79 + memset(kop.crk_param[kop.crk_iparams].crp_p, 0xff, p_len + q_len + 1);
83 + kop.crk_param[kop.crk_iparams].crp_p = calloc(p_len + 1, sizeof(char));
84 + if (!kop.crk_param[kop.crk_iparams].crp_p)
86 + kop.crk_param[kop.crk_iparams].crp_nbits = p_len * 8;
87 + memset(kop.crk_param[kop.crk_iparams].crp_p, 0xff, p_len + 1);
91 + kop.crk_param[kop.crk_iparams].crp_p = calloc(q_len + 1, sizeof(char));
92 + if (!kop.crk_param[kop.crk_iparams].crp_p)
94 + kop.crk_param[kop.crk_iparams].crp_nbits = q_len * 8;
95 + memset(kop.crk_param[kop.crk_iparams].crp_p, 0xff, q_len + 1);
99 + kop.crk_param[kop.crk_iparams].crp_p = calloc(p_len + 1, sizeof(char));
100 + if (!kop.crk_param[kop.crk_iparams].crp_p)
102 + kop.crk_param[kop.crk_iparams].crp_nbits = p_len * 8;
103 + memset(kop.crk_param[kop.crk_iparams].crp_p, 0xff, p_len + 1);
107 + if (ioctl(fd, CIOCKEY, &kop) == 0) {
108 + BN_bin2bn(kop.crk_param[0].crp_p,
110 + BN_bin2bn(kop.crk_param[1].crp_p,
112 + BN_bin2bn(kop.crk_param[2].crp_p,
114 + BN_bin2bn(kop.crk_param[3].crp_p,
116 + BN_bin2bn(kop.crk_param[4].crp_p,
118 + BN_bin2bn(kop.crk_param[5].crp_p,
120 + BN_bin2bn(kop.crk_param[6].crp_p,
126 + const RSA_METHOD *meth = RSA_PKCS1_SSLeay();
127 + ret = (meth->rsa_keygen)(rsa, bits, e, cb);
132 + for (i = 0; i < CRK_MAXPARAM; i++)
133 + free(kop.crk_param[i].crp_p);
138 /* Cryptodev DSA Key Gen routine */
139 static int cryptodev_dsa_keygen(DSA *dsa)
141 @@ -3896,6 +4011,9 @@ ENGINE_load_cryptodev(void)
142 cryptodev_rsa.rsa_mod_exp_async =
143 cryptodev_rsa_nocrt_mod_exp_async;
145 + if (cryptodev_asymfeat & CRF_RSA_GENERATE_KEY)
146 + cryptodev_rsa.rsa_keygen =
147 + cryptodev_rsa_keygen;