1 // SPDX-License-Identifier: GPL-2.0-or-later
3 * RSA padding templates.
5 * Copyright (c) 2015 Intel Corporation
8 #include <crypto/algapi.h>
9 #include <crypto/akcipher.h>
10 #include <crypto/internal/akcipher.h>
11 #include <crypto/internal/rsa.h>
12 #include <linux/err.h>
13 #include <linux/init.h>
14 #include <linux/kernel.h>
15 #include <linux/module.h>
16 #include <linux/random.h>
17 #include <linux/scatterlist.h>
20 struct crypto_akcipher
*child
;
21 unsigned int key_size
;
24 struct pkcs1pad_inst_ctx
{
25 struct crypto_akcipher_spawn spawn
;
28 struct pkcs1pad_request
{
29 struct scatterlist in_sg
[2], out_sg
[1];
30 uint8_t *in_buf
, *out_buf
;
31 struct akcipher_request child_req
;
34 static int pkcs1pad_set_pub_key(struct crypto_akcipher
*tfm
, const void *key
,
37 struct pkcs1pad_ctx
*ctx
= akcipher_tfm_ctx(tfm
);
39 return rsa_set_key(ctx
->child
, &ctx
->key_size
, RSA_PUB
, key
, keylen
);
42 static int pkcs1pad_set_priv_key(struct crypto_akcipher
*tfm
, const void *key
,
45 struct pkcs1pad_ctx
*ctx
= akcipher_tfm_ctx(tfm
);
47 return rsa_set_key(ctx
->child
, &ctx
->key_size
, RSA_PRIV
, key
, keylen
);
50 static unsigned int pkcs1pad_get_max_size(struct crypto_akcipher
*tfm
)
52 struct pkcs1pad_ctx
*ctx
= akcipher_tfm_ctx(tfm
);
55 * The maximum destination buffer size for the encrypt operation
56 * will be the same as for RSA, even though it's smaller for
63 static void pkcs1pad_sg_set_buf(struct scatterlist
*sg
, void *buf
, size_t len
,
64 struct scatterlist
*next
)
66 int nsegs
= next
? 2 : 1;
68 sg_init_table(sg
, nsegs
);
69 sg_set_buf(sg
, buf
, len
);
72 sg_chain(sg
, nsegs
, next
);
75 static int pkcs1pad_encrypt_complete(struct akcipher_request
*req
, int err
)
77 struct crypto_akcipher
*tfm
= crypto_akcipher_reqtfm(req
);
78 struct pkcs1pad_ctx
*ctx
= akcipher_tfm_ctx(tfm
);
79 struct pkcs1pad_request
*req_ctx
= akcipher_request_ctx(req
);
87 len
= req_ctx
->child_req
.dst_len
;
88 pad_len
= ctx
->key_size
- len
;
90 /* Four billion to one */
94 out_buf
= kzalloc(ctx
->key_size
, GFP_ATOMIC
);
99 sg_copy_to_buffer(req
->dst
, sg_nents_for_len(req
->dst
, len
),
100 out_buf
+ pad_len
, len
);
101 sg_copy_from_buffer(req
->dst
,
102 sg_nents_for_len(req
->dst
, ctx
->key_size
),
103 out_buf
, ctx
->key_size
);
104 kfree_sensitive(out_buf
);
107 req
->dst_len
= ctx
->key_size
;
109 kfree(req_ctx
->in_buf
);
114 static void pkcs1pad_encrypt_complete_cb(void *data
, int err
)
116 struct akcipher_request
*req
= data
;
118 if (err
== -EINPROGRESS
)
121 err
= pkcs1pad_encrypt_complete(req
, err
);
124 akcipher_request_complete(req
, err
);
127 static int pkcs1pad_encrypt(struct akcipher_request
*req
)
129 struct crypto_akcipher
*tfm
= crypto_akcipher_reqtfm(req
);
130 struct pkcs1pad_ctx
*ctx
= akcipher_tfm_ctx(tfm
);
131 struct pkcs1pad_request
*req_ctx
= akcipher_request_ctx(req
);
133 unsigned int i
, ps_end
;
138 if (req
->src_len
> ctx
->key_size
- 11)
141 if (req
->dst_len
< ctx
->key_size
) {
142 req
->dst_len
= ctx
->key_size
;
146 req_ctx
->in_buf
= kmalloc(ctx
->key_size
- 1 - req
->src_len
,
148 if (!req_ctx
->in_buf
)
151 ps_end
= ctx
->key_size
- req
->src_len
- 2;
152 req_ctx
->in_buf
[0] = 0x02;
153 for (i
= 1; i
< ps_end
; i
++)
154 req_ctx
->in_buf
[i
] = get_random_u32_inclusive(1, 255);
155 req_ctx
->in_buf
[ps_end
] = 0x00;
157 pkcs1pad_sg_set_buf(req_ctx
->in_sg
, req_ctx
->in_buf
,
158 ctx
->key_size
- 1 - req
->src_len
, req
->src
);
160 akcipher_request_set_tfm(&req_ctx
->child_req
, ctx
->child
);
161 akcipher_request_set_callback(&req_ctx
->child_req
, req
->base
.flags
,
162 pkcs1pad_encrypt_complete_cb
, req
);
164 /* Reuse output buffer */
165 akcipher_request_set_crypt(&req_ctx
->child_req
, req_ctx
->in_sg
,
166 req
->dst
, ctx
->key_size
- 1, req
->dst_len
);
168 err
= crypto_akcipher_encrypt(&req_ctx
->child_req
);
169 if (err
!= -EINPROGRESS
&& err
!= -EBUSY
)
170 return pkcs1pad_encrypt_complete(req
, err
);
175 static int pkcs1pad_decrypt_complete(struct akcipher_request
*req
, int err
)
177 struct crypto_akcipher
*tfm
= crypto_akcipher_reqtfm(req
);
178 struct pkcs1pad_ctx
*ctx
= akcipher_tfm_ctx(tfm
);
179 struct pkcs1pad_request
*req_ctx
= akcipher_request_ctx(req
);
180 unsigned int dst_len
;
188 dst_len
= req_ctx
->child_req
.dst_len
;
189 if (dst_len
< ctx
->key_size
- 1)
192 out_buf
= req_ctx
->out_buf
;
193 if (dst_len
== ctx
->key_size
) {
194 if (out_buf
[0] != 0x00)
195 /* Decrypted value had no leading 0 byte */
202 if (out_buf
[0] != 0x02)
205 for (pos
= 1; pos
< dst_len
; pos
++)
206 if (out_buf
[pos
] == 0x00)
208 if (pos
< 9 || pos
== dst_len
)
214 if (req
->dst_len
< dst_len
- pos
)
216 req
->dst_len
= dst_len
- pos
;
219 sg_copy_from_buffer(req
->dst
,
220 sg_nents_for_len(req
->dst
, req
->dst_len
),
221 out_buf
+ pos
, req
->dst_len
);
224 kfree_sensitive(req_ctx
->out_buf
);
229 static void pkcs1pad_decrypt_complete_cb(void *data
, int err
)
231 struct akcipher_request
*req
= data
;
233 if (err
== -EINPROGRESS
)
236 err
= pkcs1pad_decrypt_complete(req
, err
);
239 akcipher_request_complete(req
, err
);
242 static int pkcs1pad_decrypt(struct akcipher_request
*req
)
244 struct crypto_akcipher
*tfm
= crypto_akcipher_reqtfm(req
);
245 struct pkcs1pad_ctx
*ctx
= akcipher_tfm_ctx(tfm
);
246 struct pkcs1pad_request
*req_ctx
= akcipher_request_ctx(req
);
249 if (!ctx
->key_size
|| req
->src_len
!= ctx
->key_size
)
252 req_ctx
->out_buf
= kmalloc(ctx
->key_size
, GFP_KERNEL
);
253 if (!req_ctx
->out_buf
)
256 pkcs1pad_sg_set_buf(req_ctx
->out_sg
, req_ctx
->out_buf
,
257 ctx
->key_size
, NULL
);
259 akcipher_request_set_tfm(&req_ctx
->child_req
, ctx
->child
);
260 akcipher_request_set_callback(&req_ctx
->child_req
, req
->base
.flags
,
261 pkcs1pad_decrypt_complete_cb
, req
);
263 /* Reuse input buffer, output to a new buffer */
264 akcipher_request_set_crypt(&req_ctx
->child_req
, req
->src
,
265 req_ctx
->out_sg
, req
->src_len
,
268 err
= crypto_akcipher_decrypt(&req_ctx
->child_req
);
269 if (err
!= -EINPROGRESS
&& err
!= -EBUSY
)
270 return pkcs1pad_decrypt_complete(req
, err
);
275 static int pkcs1pad_init_tfm(struct crypto_akcipher
*tfm
)
277 struct akcipher_instance
*inst
= akcipher_alg_instance(tfm
);
278 struct pkcs1pad_inst_ctx
*ictx
= akcipher_instance_ctx(inst
);
279 struct pkcs1pad_ctx
*ctx
= akcipher_tfm_ctx(tfm
);
280 struct crypto_akcipher
*child_tfm
;
282 child_tfm
= crypto_spawn_akcipher(&ictx
->spawn
);
283 if (IS_ERR(child_tfm
))
284 return PTR_ERR(child_tfm
);
286 ctx
->child
= child_tfm
;
288 akcipher_set_reqsize(tfm
, sizeof(struct pkcs1pad_request
) +
289 crypto_akcipher_reqsize(child_tfm
));
294 static void pkcs1pad_exit_tfm(struct crypto_akcipher
*tfm
)
296 struct pkcs1pad_ctx
*ctx
= akcipher_tfm_ctx(tfm
);
298 crypto_free_akcipher(ctx
->child
);
301 static void pkcs1pad_free(struct akcipher_instance
*inst
)
303 struct pkcs1pad_inst_ctx
*ctx
= akcipher_instance_ctx(inst
);
304 struct crypto_akcipher_spawn
*spawn
= &ctx
->spawn
;
306 crypto_drop_akcipher(spawn
);
310 static int pkcs1pad_create(struct crypto_template
*tmpl
, struct rtattr
**tb
)
313 struct akcipher_instance
*inst
;
314 struct pkcs1pad_inst_ctx
*ctx
;
315 struct akcipher_alg
*rsa_alg
;
318 err
= crypto_check_attr_type(tb
, CRYPTO_ALG_TYPE_AKCIPHER
, &mask
);
322 inst
= kzalloc(sizeof(*inst
) + sizeof(*ctx
), GFP_KERNEL
);
326 ctx
= akcipher_instance_ctx(inst
);
328 err
= crypto_grab_akcipher(&ctx
->spawn
, akcipher_crypto_instance(inst
),
329 crypto_attr_alg_name(tb
[1]), 0, mask
);
333 rsa_alg
= crypto_spawn_akcipher_alg(&ctx
->spawn
);
335 if (strcmp(rsa_alg
->base
.cra_name
, "rsa") != 0) {
341 if (snprintf(inst
->alg
.base
.cra_name
,
342 CRYPTO_MAX_ALG_NAME
, "pkcs1pad(%s)",
343 rsa_alg
->base
.cra_name
) >= CRYPTO_MAX_ALG_NAME
)
346 if (snprintf(inst
->alg
.base
.cra_driver_name
,
347 CRYPTO_MAX_ALG_NAME
, "pkcs1pad(%s)",
348 rsa_alg
->base
.cra_driver_name
) >= CRYPTO_MAX_ALG_NAME
)
351 inst
->alg
.base
.cra_priority
= rsa_alg
->base
.cra_priority
;
352 inst
->alg
.base
.cra_ctxsize
= sizeof(struct pkcs1pad_ctx
);
354 inst
->alg
.init
= pkcs1pad_init_tfm
;
355 inst
->alg
.exit
= pkcs1pad_exit_tfm
;
357 inst
->alg
.encrypt
= pkcs1pad_encrypt
;
358 inst
->alg
.decrypt
= pkcs1pad_decrypt
;
359 inst
->alg
.set_pub_key
= pkcs1pad_set_pub_key
;
360 inst
->alg
.set_priv_key
= pkcs1pad_set_priv_key
;
361 inst
->alg
.max_size
= pkcs1pad_get_max_size
;
363 inst
->free
= pkcs1pad_free
;
365 err
= akcipher_register_instance(tmpl
, inst
);
373 struct crypto_template rsa_pkcs1pad_tmpl
= {
375 .create
= pkcs1pad_create
,
376 .module
= THIS_MODULE
,
379 MODULE_ALIAS_CRYPTO("pkcs1pad");