Skip to content

Commit 22287b0

Browse files
tstrukherbertx
authored andcommitted
crypto: akcipher - Changes to asymmetric key API
Setkey function has been split into set_priv_key and set_pub_key. Akcipher requests takes sgl for src and dst instead of void *. Users of the API i.e. two existing RSA implementation and test mgr code have been updated accordingly. Signed-off-by: Tadeusz Struk <[email protected]> Signed-off-by: Herbert Xu <[email protected]>
1 parent 2d4d1ee commit 22287b0

File tree

15 files changed

+407
-164
lines changed

15 files changed

+407
-164
lines changed

crypto/Makefile

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -31,10 +31,13 @@ obj-$(CONFIG_CRYPTO_HASH2) += crypto_hash.o
3131
obj-$(CONFIG_CRYPTO_PCOMP2) += pcompress.o
3232
obj-$(CONFIG_CRYPTO_AKCIPHER2) += akcipher.o
3333

34-
$(obj)/rsakey-asn1.o: $(obj)/rsakey-asn1.c $(obj)/rsakey-asn1.h
35-
clean-files += rsakey-asn1.c rsakey-asn1.h
34+
$(obj)/rsapubkey-asn1.o: $(obj)/rsapubkey-asn1.c $(obj)/rsapubkey-asn1.h
35+
$(obj)/rsaprivkey-asn1.o: $(obj)/rsaprivkey-asn1.c $(obj)/rsaprivkey-asn1.h
36+
clean-files += rsapubkey-asn1.c rsapubkey-asn1.h
37+
clean-files += rsaprivkey-asn1.c rsaprivkey-asn1.h
3638

37-
rsa_generic-y := rsakey-asn1.o
39+
rsa_generic-y := rsapubkey-asn1.o
40+
rsa_generic-y += rsaprivkey-asn1.o
3841
rsa_generic-y += rsa.o
3942
rsa_generic-y += rsa_helper.o
4043
obj-$(CONFIG_CRYPTO_RSA) += rsa_generic.o

crypto/rsa.c

Lines changed: 49 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -97,24 +97,21 @@ static int rsa_enc(struct akcipher_request *req)
9797
goto err_free_c;
9898
}
9999

100-
m = mpi_read_raw_data(req->src, req->src_len);
101-
if (!m) {
102-
ret = -ENOMEM;
100+
ret = -ENOMEM;
101+
m = mpi_read_raw_from_sgl(req->src, req->src_len);
102+
if (!m)
103103
goto err_free_c;
104-
}
105104

106105
ret = _rsa_enc(pkey, c, m);
107106
if (ret)
108107
goto err_free_m;
109108

110-
ret = mpi_read_buffer(c, req->dst, req->dst_len, &req->dst_len, &sign);
109+
ret = mpi_write_to_sgl(c, req->dst, &req->dst_len, &sign);
111110
if (ret)
112111
goto err_free_m;
113112

114-
if (sign < 0) {
113+
if (sign < 0)
115114
ret = -EBADMSG;
116-
goto err_free_m;
117-
}
118115

119116
err_free_m:
120117
mpi_free(m);
@@ -145,25 +142,21 @@ static int rsa_dec(struct akcipher_request *req)
145142
goto err_free_m;
146143
}
147144

148-
c = mpi_read_raw_data(req->src, req->src_len);
149-
if (!c) {
150-
ret = -ENOMEM;
145+
ret = -ENOMEM;
146+
c = mpi_read_raw_from_sgl(req->src, req->src_len);
147+
if (!c)
151148
goto err_free_m;
152-
}
153149

154150
ret = _rsa_dec(pkey, m, c);
155151
if (ret)
156152
goto err_free_c;
157153

158-
ret = mpi_read_buffer(m, req->dst, req->dst_len, &req->dst_len, &sign);
154+
ret = mpi_write_to_sgl(m, req->dst, &req->dst_len, &sign);
159155
if (ret)
160156
goto err_free_c;
161157

162-
if (sign < 0) {
158+
if (sign < 0)
163159
ret = -EBADMSG;
164-
goto err_free_c;
165-
}
166-
167160
err_free_c:
168161
mpi_free(c);
169162
err_free_m:
@@ -193,24 +186,21 @@ static int rsa_sign(struct akcipher_request *req)
193186
goto err_free_s;
194187
}
195188

196-
m = mpi_read_raw_data(req->src, req->src_len);
197-
if (!m) {
198-
ret = -ENOMEM;
189+
ret = -ENOMEM;
190+
m = mpi_read_raw_from_sgl(req->src, req->src_len);
191+
if (!m)
199192
goto err_free_s;
200-
}
201193

202194
ret = _rsa_sign(pkey, s, m);
203195
if (ret)
204196
goto err_free_m;
205197

206-
ret = mpi_read_buffer(s, req->dst, req->dst_len, &req->dst_len, &sign);
198+
ret = mpi_write_to_sgl(s, req->dst, &req->dst_len, &sign);
207199
if (ret)
208200
goto err_free_m;
209201

210-
if (sign < 0) {
202+
if (sign < 0)
211203
ret = -EBADMSG;
212-
goto err_free_m;
213-
}
214204

215205
err_free_m:
216206
mpi_free(m);
@@ -241,7 +231,8 @@ static int rsa_verify(struct akcipher_request *req)
241231
goto err_free_m;
242232
}
243233

244-
s = mpi_read_raw_data(req->src, req->src_len);
234+
ret = -ENOMEM;
235+
s = mpi_read_raw_from_sgl(req->src, req->src_len);
245236
if (!s) {
246237
ret = -ENOMEM;
247238
goto err_free_m;
@@ -251,14 +242,12 @@ static int rsa_verify(struct akcipher_request *req)
251242
if (ret)
252243
goto err_free_s;
253244

254-
ret = mpi_read_buffer(m, req->dst, req->dst_len, &req->dst_len, &sign);
245+
ret = mpi_write_to_sgl(m, req->dst, &req->dst_len, &sign);
255246
if (ret)
256247
goto err_free_s;
257248

258-
if (sign < 0) {
249+
if (sign < 0)
259250
ret = -EBADMSG;
260-
goto err_free_s;
261-
}
262251

263252
err_free_s:
264253
mpi_free(s);
@@ -282,13 +271,13 @@ static int rsa_check_key_length(unsigned int len)
282271
return -EINVAL;
283272
}
284273

285-
static int rsa_setkey(struct crypto_akcipher *tfm, const void *key,
286-
unsigned int keylen)
274+
static int rsa_set_pub_key(struct crypto_akcipher *tfm, const void *key,
275+
unsigned int keylen)
287276
{
288277
struct rsa_key *pkey = akcipher_tfm_ctx(tfm);
289278
int ret;
290279

291-
ret = rsa_parse_key(pkey, key, keylen);
280+
ret = rsa_parse_pub_key(pkey, key, keylen);
292281
if (ret)
293282
return ret;
294283

@@ -299,6 +288,30 @@ static int rsa_setkey(struct crypto_akcipher *tfm, const void *key,
299288
return ret;
300289
}
301290

291+
static int rsa_set_priv_key(struct crypto_akcipher *tfm, const void *key,
292+
unsigned int keylen)
293+
{
294+
struct rsa_key *pkey = akcipher_tfm_ctx(tfm);
295+
int ret;
296+
297+
ret = rsa_parse_priv_key(pkey, key, keylen);
298+
if (ret)
299+
return ret;
300+
301+
if (rsa_check_key_length(mpi_get_size(pkey->n) << 3)) {
302+
rsa_free_key(pkey);
303+
ret = -EINVAL;
304+
}
305+
return ret;
306+
}
307+
308+
static int rsa_max_size(struct crypto_akcipher *tfm)
309+
{
310+
struct rsa_key *pkey = akcipher_tfm_ctx(tfm);
311+
312+
return pkey->n ? mpi_get_size(pkey->n) : -EINVAL;
313+
}
314+
302315
static void rsa_exit_tfm(struct crypto_akcipher *tfm)
303316
{
304317
struct rsa_key *pkey = akcipher_tfm_ctx(tfm);
@@ -311,7 +324,9 @@ static struct akcipher_alg rsa = {
311324
.decrypt = rsa_dec,
312325
.sign = rsa_sign,
313326
.verify = rsa_verify,
314-
.setkey = rsa_setkey,
327+
.set_priv_key = rsa_set_priv_key,
328+
.set_pub_key = rsa_set_pub_key,
329+
.max_size = rsa_max_size,
315330
.exit = rsa_exit_tfm,
316331
.base = {
317332
.cra_name = "rsa",

crypto/rsa_helper.c

Lines changed: 35 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,8 @@
1515
#include <linux/err.h>
1616
#include <linux/fips.h>
1717
#include <crypto/internal/rsa.h>
18-
#include "rsakey-asn1.h"
18+
#include "rsapubkey-asn1.h"
19+
#include "rsaprivkey-asn1.h"
1920

2021
int rsa_get_n(void *context, size_t hdrlen, unsigned char tag,
2122
const void *value, size_t vlen)
@@ -94,22 +95,22 @@ void rsa_free_key(struct rsa_key *key)
9495
EXPORT_SYMBOL_GPL(rsa_free_key);
9596

9697
/**
97-
* rsa_parse_key() - extracts an rsa key from BER encoded buffer
98-
* and stores it in the provided struct rsa_key
98+
* rsa_parse_pub_key() - extracts an rsa public key from BER encoded buffer
99+
* and stores it in the provided struct rsa_key
99100
*
100101
* @rsa_key: struct rsa_key key representation
101102
* @key: key in BER format
102103
* @key_len: length of key
103104
*
104105
* Return: 0 on success or error code in case of error
105106
*/
106-
int rsa_parse_key(struct rsa_key *rsa_key, const void *key,
107-
unsigned int key_len)
107+
int rsa_parse_pub_key(struct rsa_key *rsa_key, const void *key,
108+
unsigned int key_len)
108109
{
109110
int ret;
110111

111112
free_mpis(rsa_key);
112-
ret = asn1_ber_decoder(&rsakey_decoder, rsa_key, key, key_len);
113+
ret = asn1_ber_decoder(&rsapubkey_decoder, rsa_key, key, key_len);
113114
if (ret < 0)
114115
goto error;
115116

@@ -118,4 +119,31 @@ int rsa_parse_key(struct rsa_key *rsa_key, const void *key,
118119
free_mpis(rsa_key);
119120
return ret;
120121
}
121-
EXPORT_SYMBOL_GPL(rsa_parse_key);
122+
EXPORT_SYMBOL_GPL(rsa_parse_pub_key);
123+
124+
/**
125+
* rsa_parse_pub_key() - extracts an rsa private key from BER encoded buffer
126+
* and stores it in the provided struct rsa_key
127+
*
128+
* @rsa_key: struct rsa_key key representation
129+
* @key: key in BER format
130+
* @key_len: length of key
131+
*
132+
* Return: 0 on success or error code in case of error
133+
*/
134+
int rsa_parse_priv_key(struct rsa_key *rsa_key, const void *key,
135+
unsigned int key_len)
136+
{
137+
int ret;
138+
139+
free_mpis(rsa_key);
140+
ret = asn1_ber_decoder(&rsaprivkey_decoder, rsa_key, key, key_len);
141+
if (ret < 0)
142+
goto error;
143+
144+
return 0;
145+
error:
146+
free_mpis(rsa_key);
147+
return ret;
148+
}
149+
EXPORT_SYMBOL_GPL(rsa_parse_priv_key);

crypto/rsakey.asn1

Lines changed: 0 additions & 5 deletions
This file was deleted.

crypto/rsaprivkey.asn1

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
RsaPrivKey ::= SEQUENCE {
2+
version INTEGER,
3+
n INTEGER ({ rsa_get_n }),
4+
e INTEGER ({ rsa_get_e }),
5+
d INTEGER ({ rsa_get_d }),
6+
prime1 INTEGER,
7+
prime2 INTEGER,
8+
exponent1 INTEGER,
9+
exponent2 INTEGER,
10+
coefficient INTEGER
11+
}

crypto/rsapubkey.asn1

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
RsaPubKey ::= SEQUENCE {
2+
n INTEGER ({ rsa_get_n }),
3+
e INTEGER ({ rsa_get_e })
4+
}

crypto/testmgr.c

Lines changed: 20 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1845,34 +1845,34 @@ static int do_test_rsa(struct crypto_akcipher *tfm,
18451845
struct tcrypt_result result;
18461846
unsigned int out_len_max, out_len = 0;
18471847
int err = -ENOMEM;
1848+
struct scatterlist src, dst, src_tab[2];
18481849

18491850
req = akcipher_request_alloc(tfm, GFP_KERNEL);
18501851
if (!req)
18511852
return err;
18521853

18531854
init_completion(&result.completion);
1854-
err = crypto_akcipher_setkey(tfm, vecs->key, vecs->key_len);
1855-
if (err)
1856-
goto free_req;
18571855

1858-
akcipher_request_set_crypt(req, vecs->m, outbuf_enc, vecs->m_size,
1859-
out_len);
1860-
/* expect this to fail, and update the required buf len */
1861-
crypto_akcipher_encrypt(req);
1862-
out_len = req->dst_len;
1863-
if (!out_len) {
1864-
err = -EINVAL;
1856+
if (vecs->public_key_vec)
1857+
err = crypto_akcipher_set_pub_key(tfm, vecs->key,
1858+
vecs->key_len);
1859+
else
1860+
err = crypto_akcipher_set_priv_key(tfm, vecs->key,
1861+
vecs->key_len);
1862+
if (err)
18651863
goto free_req;
1866-
}
18671864

1868-
out_len_max = out_len;
1869-
err = -ENOMEM;
1865+
out_len_max = crypto_akcipher_maxsize(tfm);
18701866
outbuf_enc = kzalloc(out_len_max, GFP_KERNEL);
18711867
if (!outbuf_enc)
18721868
goto free_req;
18731869

1874-
akcipher_request_set_crypt(req, vecs->m, outbuf_enc, vecs->m_size,
1875-
out_len);
1870+
sg_init_table(src_tab, 2);
1871+
sg_set_buf(&src_tab[0], vecs->m, 8);
1872+
sg_set_buf(&src_tab[1], vecs->m + 8, vecs->m_size - 8);
1873+
sg_init_one(&dst, outbuf_enc, out_len_max);
1874+
akcipher_request_set_crypt(req, src_tab, &dst, vecs->m_size,
1875+
out_len_max);
18761876
akcipher_request_set_callback(req, CRYPTO_TFM_REQ_MAY_BACKLOG,
18771877
tcrypt_complete, &result);
18781878

@@ -1882,13 +1882,13 @@ static int do_test_rsa(struct crypto_akcipher *tfm,
18821882
pr_err("alg: rsa: encrypt test failed. err %d\n", err);
18831883
goto free_all;
18841884
}
1885-
if (out_len != vecs->c_size) {
1885+
if (req->dst_len != vecs->c_size) {
18861886
pr_err("alg: rsa: encrypt test failed. Invalid output len\n");
18871887
err = -EINVAL;
18881888
goto free_all;
18891889
}
18901890
/* verify that encrypted message is equal to expected */
1891-
if (memcmp(vecs->c, outbuf_enc, vecs->c_size)) {
1891+
if (memcmp(vecs->c, sg_virt(req->dst), vecs->c_size)) {
18921892
pr_err("alg: rsa: encrypt test failed. Invalid output\n");
18931893
err = -EINVAL;
18941894
goto free_all;
@@ -1903,9 +1903,10 @@ static int do_test_rsa(struct crypto_akcipher *tfm,
19031903
err = -ENOMEM;
19041904
goto free_all;
19051905
}
1906+
sg_init_one(&src, vecs->c, vecs->c_size);
1907+
sg_init_one(&dst, outbuf_dec, out_len_max);
19061908
init_completion(&result.completion);
1907-
akcipher_request_set_crypt(req, outbuf_enc, outbuf_dec, vecs->c_size,
1908-
out_len);
1909+
akcipher_request_set_crypt(req, &src, &dst, vecs->c_size, out_len_max);
19091910

19101911
/* Run RSA decrypt - m = c^d mod n;*/
19111912
err = wait_async_op(&result, crypto_akcipher_decrypt(req));

0 commit comments

Comments
 (0)