Merge tag 'trace-printf-v6.13' of git://git.kernel.org/pub/scm/linux/kernel/git/trace...
[drm/drm-misc.git] / crypto / rsa-pkcs1pad.c
blob50bdb18e7b48375d1640c69725f72350db889b8b
1 // SPDX-License-Identifier: GPL-2.0-or-later
2 /*
3 * RSA padding templates.
5 * Copyright (c) 2015 Intel Corporation
6 */
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>
19 struct pkcs1pad_ctx {
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,
35 unsigned int keylen)
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,
43 unsigned int keylen)
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
57 * decrypt.
60 return ctx->key_size;
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);
71 if (next)
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);
80 unsigned int pad_len;
81 unsigned int len;
82 u8 *out_buf;
84 if (err)
85 goto out;
87 len = req_ctx->child_req.dst_len;
88 pad_len = ctx->key_size - len;
90 /* Four billion to one */
91 if (likely(!pad_len))
92 goto out;
94 out_buf = kzalloc(ctx->key_size, GFP_ATOMIC);
95 err = -ENOMEM;
96 if (!out_buf)
97 goto out;
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);
106 out:
107 req->dst_len = ctx->key_size;
109 kfree(req_ctx->in_buf);
111 return err;
114 static void pkcs1pad_encrypt_complete_cb(void *data, int err)
116 struct akcipher_request *req = data;
118 if (err == -EINPROGRESS)
119 goto out;
121 err = pkcs1pad_encrypt_complete(req, err);
123 out:
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);
132 int err;
133 unsigned int i, ps_end;
135 if (!ctx->key_size)
136 return -EINVAL;
138 if (req->src_len > ctx->key_size - 11)
139 return -EOVERFLOW;
141 if (req->dst_len < ctx->key_size) {
142 req->dst_len = ctx->key_size;
143 return -EOVERFLOW;
146 req_ctx->in_buf = kmalloc(ctx->key_size - 1 - req->src_len,
147 GFP_KERNEL);
148 if (!req_ctx->in_buf)
149 return -ENOMEM;
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);
172 return 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;
181 unsigned int pos;
182 u8 *out_buf;
184 if (err)
185 goto done;
187 err = -EINVAL;
188 dst_len = req_ctx->child_req.dst_len;
189 if (dst_len < ctx->key_size - 1)
190 goto done;
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 */
196 goto done;
198 dst_len--;
199 out_buf++;
202 if (out_buf[0] != 0x02)
203 goto done;
205 for (pos = 1; pos < dst_len; pos++)
206 if (out_buf[pos] == 0x00)
207 break;
208 if (pos < 9 || pos == dst_len)
209 goto done;
210 pos++;
212 err = 0;
214 if (req->dst_len < dst_len - pos)
215 err = -EOVERFLOW;
216 req->dst_len = dst_len - pos;
218 if (!err)
219 sg_copy_from_buffer(req->dst,
220 sg_nents_for_len(req->dst, req->dst_len),
221 out_buf + pos, req->dst_len);
223 done:
224 kfree_sensitive(req_ctx->out_buf);
226 return err;
229 static void pkcs1pad_decrypt_complete_cb(void *data, int err)
231 struct akcipher_request *req = data;
233 if (err == -EINPROGRESS)
234 goto out;
236 err = pkcs1pad_decrypt_complete(req, err);
238 out:
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);
247 int err;
249 if (!ctx->key_size || req->src_len != ctx->key_size)
250 return -EINVAL;
252 req_ctx->out_buf = kmalloc(ctx->key_size, GFP_KERNEL);
253 if (!req_ctx->out_buf)
254 return -ENOMEM;
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,
266 ctx->key_size);
268 err = crypto_akcipher_decrypt(&req_ctx->child_req);
269 if (err != -EINPROGRESS && err != -EBUSY)
270 return pkcs1pad_decrypt_complete(req, err);
272 return 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));
291 return 0;
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);
307 kfree(inst);
310 static int pkcs1pad_create(struct crypto_template *tmpl, struct rtattr **tb)
312 u32 mask;
313 struct akcipher_instance *inst;
314 struct pkcs1pad_inst_ctx *ctx;
315 struct akcipher_alg *rsa_alg;
316 int err;
318 err = crypto_check_attr_type(tb, CRYPTO_ALG_TYPE_AKCIPHER, &mask);
319 if (err)
320 return err;
322 inst = kzalloc(sizeof(*inst) + sizeof(*ctx), GFP_KERNEL);
323 if (!inst)
324 return -ENOMEM;
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);
330 if (err)
331 goto err_free_inst;
333 rsa_alg = crypto_spawn_akcipher_alg(&ctx->spawn);
335 if (strcmp(rsa_alg->base.cra_name, "rsa") != 0) {
336 err = -EINVAL;
337 goto err_free_inst;
340 err = -ENAMETOOLONG;
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)
344 goto err_free_inst;
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)
349 goto err_free_inst;
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);
366 if (err) {
367 err_free_inst:
368 pkcs1pad_free(inst);
370 return err;
373 struct crypto_template rsa_pkcs1pad_tmpl = {
374 .name = "pkcs1pad",
375 .create = pkcs1pad_create,
376 .module = THIS_MODULE,
379 MODULE_ALIAS_CRYPTO("pkcs1pad");