summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorVitaly Chikunov <vt@altlinux.org>2019-04-11 11:51:14 -0400
committerHerbert Xu <herbert@gondor.apana.org.au>2019-04-18 10:15:02 -0400
commit3ecc97259934489e7e03cbeb1d70f6a23cccb3ae (patch)
tree8456773371fd5ec9fb048f91a42bc02fd7887ed5
parent78a0324f4a5328088fea9426cfe1d1851276c475 (diff)
crypto: rsa - unimplement sign/verify for raw RSA backends
In preparation for new akcipher verify call remove sign/verify callbacks from RSA backends and make PKCS1 driver call encrypt/decrypt instead. This also complies with the well-known idea that raw RSA should never be used for sign/verify. It only should be used with proper padding scheme such as PKCS1 driver provides. Cc: Giovanni Cabiddu <giovanni.cabiddu@intel.com> Cc: qat-linux@intel.com Cc: Tom Lendacky <thomas.lendacky@amd.com> Cc: Gary Hook <gary.hook@amd.com> Cc: Horia Geantă <horia.geanta@nxp.com> Cc: Aymen Sghaier <aymen.sghaier@nxp.com> Signed-off-by: Vitaly Chikunov <vt@altlinux.org> Reviewed-by: Horia Geantă <horia.geanta@nxp.com> Acked-by: Gary R Hook <gary.hook@amd.com> Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
-rw-r--r--crypto/rsa-pkcs1pad.c4
-rw-r--r--crypto/rsa.c109
-rw-r--r--drivers/crypto/caam/caampkc.c2
-rw-r--r--drivers/crypto/ccp/ccp-crypto-rsa.c2
-rw-r--r--drivers/crypto/qat/qat_common/qat_asym_algs.c2
5 files changed, 2 insertions, 117 deletions
diff --git a/crypto/rsa-pkcs1pad.c b/crypto/rsa-pkcs1pad.c
index 0a6680ca8cb6..94382fa2c6ac 100644
--- a/crypto/rsa-pkcs1pad.c
+++ b/crypto/rsa-pkcs1pad.c
@@ -429,7 +429,7 @@ static int pkcs1pad_sign(struct akcipher_request *req)
429 akcipher_request_set_crypt(&req_ctx->child_req, req_ctx->in_sg, 429 akcipher_request_set_crypt(&req_ctx->child_req, req_ctx->in_sg,
430 req->dst, ctx->key_size - 1, req->dst_len); 430 req->dst, ctx->key_size - 1, req->dst_len);
431 431
432 err = crypto_akcipher_sign(&req_ctx->child_req); 432 err = crypto_akcipher_decrypt(&req_ctx->child_req);
433 if (err != -EINPROGRESS && err != -EBUSY) 433 if (err != -EINPROGRESS && err != -EBUSY)
434 return pkcs1pad_encrypt_sign_complete(req, err); 434 return pkcs1pad_encrypt_sign_complete(req, err);
435 435
@@ -551,7 +551,7 @@ static int pkcs1pad_verify(struct akcipher_request *req)
551 req_ctx->out_sg, req->src_len, 551 req_ctx->out_sg, req->src_len,
552 ctx->key_size); 552 ctx->key_size);
553 553
554 err = crypto_akcipher_verify(&req_ctx->child_req); 554 err = crypto_akcipher_encrypt(&req_ctx->child_req);
555 if (err != -EINPROGRESS && err != -EBUSY) 555 if (err != -EINPROGRESS && err != -EBUSY)
556 return pkcs1pad_verify_complete(req, err); 556 return pkcs1pad_verify_complete(req, err);
557 557
diff --git a/crypto/rsa.c b/crypto/rsa.c
index 4167980c243d..5d427c1100d6 100644
--- a/crypto/rsa.c
+++ b/crypto/rsa.c
@@ -50,34 +50,6 @@ static int _rsa_dec(const struct rsa_mpi_key *key, MPI m, MPI c)
50 return mpi_powm(m, c, key->d, key->n); 50 return mpi_powm(m, c, key->d, key->n);
51} 51}
52 52
53/*
54 * RSASP1 function [RFC3447 sec 5.2.1]
55 * s = m^d mod n
56 */
57static int _rsa_sign(const struct rsa_mpi_key *key, MPI s, MPI m)
58{
59 /* (1) Validate 0 <= m < n */
60 if (mpi_cmp_ui(m, 0) < 0 || mpi_cmp(m, key->n) >= 0)
61 return -EINVAL;
62
63 /* (2) s = m^d mod n */
64 return mpi_powm(s, m, key->d, key->n);
65}
66
67/*
68 * RSAVP1 function [RFC3447 sec 5.2.2]
69 * m = s^e mod n;
70 */
71static int _rsa_verify(const struct rsa_mpi_key *key, MPI m, MPI s)
72{
73 /* (1) Validate 0 <= s < n */
74 if (mpi_cmp_ui(s, 0) < 0 || mpi_cmp(s, key->n) >= 0)
75 return -EINVAL;
76
77 /* (2) m = s^e mod n */
78 return mpi_powm(m, s, key->e, key->n);
79}
80
81static inline struct rsa_mpi_key *rsa_get_key(struct crypto_akcipher *tfm) 53static inline struct rsa_mpi_key *rsa_get_key(struct crypto_akcipher *tfm)
82{ 54{
83 return akcipher_tfm_ctx(tfm); 55 return akcipher_tfm_ctx(tfm);
@@ -160,85 +132,6 @@ err_free_m:
160 return ret; 132 return ret;
161} 133}
162 134
163static int rsa_sign(struct akcipher_request *req)
164{
165 struct crypto_akcipher *tfm = crypto_akcipher_reqtfm(req);
166 const struct rsa_mpi_key *pkey = rsa_get_key(tfm);
167 MPI m, s = mpi_alloc(0);
168 int ret = 0;
169 int sign;
170
171 if (!s)
172 return -ENOMEM;
173
174 if (unlikely(!pkey->n || !pkey->d)) {
175 ret = -EINVAL;
176 goto err_free_s;
177 }
178
179 ret = -ENOMEM;
180 m = mpi_read_raw_from_sgl(req->src, req->src_len);
181 if (!m)
182 goto err_free_s;
183
184 ret = _rsa_sign(pkey, s, m);
185 if (ret)
186 goto err_free_m;
187
188 ret = mpi_write_to_sgl(s, req->dst, req->dst_len, &sign);
189 if (ret)
190 goto err_free_m;
191
192 if (sign < 0)
193 ret = -EBADMSG;
194
195err_free_m:
196 mpi_free(m);
197err_free_s:
198 mpi_free(s);
199 return ret;
200}
201
202static int rsa_verify(struct akcipher_request *req)
203{
204 struct crypto_akcipher *tfm = crypto_akcipher_reqtfm(req);
205 const struct rsa_mpi_key *pkey = rsa_get_key(tfm);
206 MPI s, m = mpi_alloc(0);
207 int ret = 0;
208 int sign;
209
210 if (!m)
211 return -ENOMEM;
212
213 if (unlikely(!pkey->n || !pkey->e)) {
214 ret = -EINVAL;
215 goto err_free_m;
216 }
217
218 s = mpi_read_raw_from_sgl(req->src, req->src_len);
219 if (!s) {
220 ret = -ENOMEM;
221 goto err_free_m;
222 }
223
224 ret = _rsa_verify(pkey, m, s);
225 if (ret)
226 goto err_free_s;
227
228 ret = mpi_write_to_sgl(m, req->dst, req->dst_len, &sign);
229 if (ret)
230 goto err_free_s;
231
232 if (sign < 0)
233 ret = -EBADMSG;
234
235err_free_s:
236 mpi_free(s);
237err_free_m:
238 mpi_free(m);
239 return ret;
240}
241
242static void rsa_free_mpi_key(struct rsa_mpi_key *key) 135static void rsa_free_mpi_key(struct rsa_mpi_key *key)
243{ 136{
244 mpi_free(key->d); 137 mpi_free(key->d);
@@ -353,8 +246,6 @@ static void rsa_exit_tfm(struct crypto_akcipher *tfm)
353static struct akcipher_alg rsa = { 246static struct akcipher_alg rsa = {
354 .encrypt = rsa_enc, 247 .encrypt = rsa_enc,
355 .decrypt = rsa_dec, 248 .decrypt = rsa_dec,
356 .sign = rsa_sign,
357 .verify = rsa_verify,
358 .set_priv_key = rsa_set_priv_key, 249 .set_priv_key = rsa_set_priv_key,
359 .set_pub_key = rsa_set_pub_key, 250 .set_pub_key = rsa_set_pub_key,
360 .max_size = rsa_max_size, 251 .max_size = rsa_max_size,
diff --git a/drivers/crypto/caam/caampkc.c b/drivers/crypto/caam/caampkc.c
index 58285642306e..fe24485274e1 100644
--- a/drivers/crypto/caam/caampkc.c
+++ b/drivers/crypto/caam/caampkc.c
@@ -994,8 +994,6 @@ static void caam_rsa_exit_tfm(struct crypto_akcipher *tfm)
994static struct akcipher_alg caam_rsa = { 994static struct akcipher_alg caam_rsa = {
995 .encrypt = caam_rsa_enc, 995 .encrypt = caam_rsa_enc,
996 .decrypt = caam_rsa_dec, 996 .decrypt = caam_rsa_dec,
997 .sign = caam_rsa_dec,
998 .verify = caam_rsa_enc,
999 .set_pub_key = caam_rsa_set_pub_key, 997 .set_pub_key = caam_rsa_set_pub_key,
1000 .set_priv_key = caam_rsa_set_priv_key, 998 .set_priv_key = caam_rsa_set_priv_key,
1001 .max_size = caam_rsa_max_size, 999 .max_size = caam_rsa_max_size,
diff --git a/drivers/crypto/ccp/ccp-crypto-rsa.c b/drivers/crypto/ccp/ccp-crypto-rsa.c
index 841acdffbc3c..a2570c0c8cdc 100644
--- a/drivers/crypto/ccp/ccp-crypto-rsa.c
+++ b/drivers/crypto/ccp/ccp-crypto-rsa.c
@@ -213,8 +213,6 @@ static void ccp_rsa_exit_tfm(struct crypto_akcipher *tfm)
213static struct akcipher_alg ccp_rsa_defaults = { 213static struct akcipher_alg ccp_rsa_defaults = {
214 .encrypt = ccp_rsa_encrypt, 214 .encrypt = ccp_rsa_encrypt,
215 .decrypt = ccp_rsa_decrypt, 215 .decrypt = ccp_rsa_decrypt,
216 .sign = ccp_rsa_decrypt,
217 .verify = ccp_rsa_encrypt,
218 .set_pub_key = ccp_rsa_setpubkey, 216 .set_pub_key = ccp_rsa_setpubkey,
219 .set_priv_key = ccp_rsa_setprivkey, 217 .set_priv_key = ccp_rsa_setprivkey,
220 .max_size = ccp_rsa_maxsize, 218 .max_size = ccp_rsa_maxsize,
diff --git a/drivers/crypto/qat/qat_common/qat_asym_algs.c b/drivers/crypto/qat/qat_common/qat_asym_algs.c
index c9f324730d71..692a7aaee749 100644
--- a/drivers/crypto/qat/qat_common/qat_asym_algs.c
+++ b/drivers/crypto/qat/qat_common/qat_asym_algs.c
@@ -1300,8 +1300,6 @@ static void qat_rsa_exit_tfm(struct crypto_akcipher *tfm)
1300static struct akcipher_alg rsa = { 1300static struct akcipher_alg rsa = {
1301 .encrypt = qat_rsa_enc, 1301 .encrypt = qat_rsa_enc,
1302 .decrypt = qat_rsa_dec, 1302 .decrypt = qat_rsa_dec,
1303 .sign = qat_rsa_dec,
1304 .verify = qat_rsa_enc,
1305 .set_pub_key = qat_rsa_setpubkey, 1303 .set_pub_key = qat_rsa_setpubkey,
1306 .set_priv_key = qat_rsa_setprivkey, 1304 .set_priv_key = qat_rsa_setprivkey,
1307 .max_size = qat_rsa_max_size, 1305 .max_size = qat_rsa_max_size,