at master 30 kB view raw
1// SPDX-License-Identifier: GPL-2.0-or-later 2/* 3 * Software async crypto daemon. 4 * 5 * Copyright (c) 2006 Herbert Xu <herbert@gondor.apana.org.au> 6 * 7 * Added AEAD support to cryptd. 8 * Authors: Tadeusz Struk (tadeusz.struk@intel.com) 9 * Adrian Hoban <adrian.hoban@intel.com> 10 * Gabriele Paoloni <gabriele.paoloni@intel.com> 11 * Aidan O'Mahony (aidan.o.mahony@intel.com) 12 * Copyright (c) 2010, Intel Corporation. 13 */ 14 15#include <crypto/internal/hash.h> 16#include <crypto/internal/aead.h> 17#include <crypto/internal/skcipher.h> 18#include <crypto/cryptd.h> 19#include <linux/refcount.h> 20#include <linux/err.h> 21#include <linux/init.h> 22#include <linux/kernel.h> 23#include <linux/list.h> 24#include <linux/module.h> 25#include <linux/scatterlist.h> 26#include <linux/sched.h> 27#include <linux/slab.h> 28#include <linux/workqueue.h> 29 30static unsigned int cryptd_max_cpu_qlen = 1000; 31module_param(cryptd_max_cpu_qlen, uint, 0); 32MODULE_PARM_DESC(cryptd_max_cpu_qlen, "Set cryptd Max queue depth"); 33 34static struct workqueue_struct *cryptd_wq; 35 36struct cryptd_cpu_queue { 37 local_lock_t bh_lock; 38 struct crypto_queue queue; 39 struct work_struct work; 40}; 41 42struct cryptd_queue { 43 /* 44 * Protected by disabling BH to allow enqueueing from softinterrupt and 45 * dequeuing from kworker (cryptd_queue_worker()). 46 */ 47 struct cryptd_cpu_queue __percpu *cpu_queue; 48}; 49 50struct cryptd_instance_ctx { 51 struct crypto_spawn spawn; 52 struct cryptd_queue *queue; 53}; 54 55struct skcipherd_instance_ctx { 56 struct crypto_skcipher_spawn spawn; 57 struct cryptd_queue *queue; 58}; 59 60struct hashd_instance_ctx { 61 struct crypto_shash_spawn spawn; 62 struct cryptd_queue *queue; 63}; 64 65struct aead_instance_ctx { 66 struct crypto_aead_spawn aead_spawn; 67 struct cryptd_queue *queue; 68}; 69 70struct cryptd_skcipher_ctx { 71 refcount_t refcnt; 72 struct crypto_skcipher *child; 73}; 74 75struct cryptd_skcipher_request_ctx { 76 struct skcipher_request req; 77}; 78 79struct cryptd_hash_ctx { 80 refcount_t refcnt; 81 struct crypto_shash *child; 82}; 83 84struct cryptd_hash_request_ctx { 85 crypto_completion_t complete; 86 void *data; 87 struct shash_desc desc; 88}; 89 90struct cryptd_aead_ctx { 91 refcount_t refcnt; 92 struct crypto_aead *child; 93}; 94 95struct cryptd_aead_request_ctx { 96 struct aead_request req; 97}; 98 99static void cryptd_queue_worker(struct work_struct *work); 100 101static int cryptd_init_queue(struct cryptd_queue *queue, 102 unsigned int max_cpu_qlen) 103{ 104 int cpu; 105 struct cryptd_cpu_queue *cpu_queue; 106 107 queue->cpu_queue = alloc_percpu(struct cryptd_cpu_queue); 108 if (!queue->cpu_queue) 109 return -ENOMEM; 110 for_each_possible_cpu(cpu) { 111 cpu_queue = per_cpu_ptr(queue->cpu_queue, cpu); 112 crypto_init_queue(&cpu_queue->queue, max_cpu_qlen); 113 INIT_WORK(&cpu_queue->work, cryptd_queue_worker); 114 local_lock_init(&cpu_queue->bh_lock); 115 } 116 pr_info("cryptd: max_cpu_qlen set to %d\n", max_cpu_qlen); 117 return 0; 118} 119 120static void cryptd_fini_queue(struct cryptd_queue *queue) 121{ 122 int cpu; 123 struct cryptd_cpu_queue *cpu_queue; 124 125 for_each_possible_cpu(cpu) { 126 cpu_queue = per_cpu_ptr(queue->cpu_queue, cpu); 127 BUG_ON(cpu_queue->queue.qlen); 128 } 129 free_percpu(queue->cpu_queue); 130} 131 132static int cryptd_enqueue_request(struct cryptd_queue *queue, 133 struct crypto_async_request *request) 134{ 135 int err; 136 struct cryptd_cpu_queue *cpu_queue; 137 refcount_t *refcnt; 138 139 local_bh_disable(); 140 local_lock_nested_bh(&queue->cpu_queue->bh_lock); 141 cpu_queue = this_cpu_ptr(queue->cpu_queue); 142 err = crypto_enqueue_request(&cpu_queue->queue, request); 143 144 refcnt = crypto_tfm_ctx(request->tfm); 145 146 if (err == -ENOSPC) 147 goto out; 148 149 queue_work_on(smp_processor_id(), cryptd_wq, &cpu_queue->work); 150 151 if (!refcount_read(refcnt)) 152 goto out; 153 154 refcount_inc(refcnt); 155 156out: 157 local_unlock_nested_bh(&queue->cpu_queue->bh_lock); 158 local_bh_enable(); 159 160 return err; 161} 162 163/* Called in workqueue context, do one real cryption work (via 164 * req->complete) and reschedule itself if there are more work to 165 * do. */ 166static void cryptd_queue_worker(struct work_struct *work) 167{ 168 struct cryptd_cpu_queue *cpu_queue; 169 struct crypto_async_request *req, *backlog; 170 171 cpu_queue = container_of(work, struct cryptd_cpu_queue, work); 172 /* 173 * Only handle one request at a time to avoid hogging crypto workqueue. 174 */ 175 local_bh_disable(); 176 __local_lock_nested_bh(&cpu_queue->bh_lock); 177 backlog = crypto_get_backlog(&cpu_queue->queue); 178 req = crypto_dequeue_request(&cpu_queue->queue); 179 __local_unlock_nested_bh(&cpu_queue->bh_lock); 180 local_bh_enable(); 181 182 if (!req) 183 return; 184 185 if (backlog) 186 crypto_request_complete(backlog, -EINPROGRESS); 187 crypto_request_complete(req, 0); 188 189 if (cpu_queue->queue.qlen) 190 queue_work(cryptd_wq, &cpu_queue->work); 191} 192 193static inline struct cryptd_queue *cryptd_get_queue(struct crypto_tfm *tfm) 194{ 195 struct crypto_instance *inst = crypto_tfm_alg_instance(tfm); 196 struct cryptd_instance_ctx *ictx = crypto_instance_ctx(inst); 197 return ictx->queue; 198} 199 200static void cryptd_type_and_mask(struct crypto_attr_type *algt, 201 u32 *type, u32 *mask) 202{ 203 /* 204 * cryptd is allowed to wrap internal algorithms, but in that case the 205 * resulting cryptd instance will be marked as internal as well. 206 */ 207 *type = algt->type & CRYPTO_ALG_INTERNAL; 208 *mask = algt->mask & CRYPTO_ALG_INTERNAL; 209 210 /* No point in cryptd wrapping an algorithm that's already async. */ 211 *mask |= CRYPTO_ALG_ASYNC; 212 213 *mask |= crypto_algt_inherited_mask(algt); 214} 215 216static int cryptd_init_instance(struct crypto_instance *inst, 217 struct crypto_alg *alg) 218{ 219 if (snprintf(inst->alg.cra_driver_name, CRYPTO_MAX_ALG_NAME, 220 "cryptd(%s)", 221 alg->cra_driver_name) >= CRYPTO_MAX_ALG_NAME) 222 return -ENAMETOOLONG; 223 224 memcpy(inst->alg.cra_name, alg->cra_name, CRYPTO_MAX_ALG_NAME); 225 226 inst->alg.cra_priority = alg->cra_priority + 50; 227 inst->alg.cra_blocksize = alg->cra_blocksize; 228 inst->alg.cra_alignmask = alg->cra_alignmask; 229 230 return 0; 231} 232 233static int cryptd_skcipher_setkey(struct crypto_skcipher *parent, 234 const u8 *key, unsigned int keylen) 235{ 236 struct cryptd_skcipher_ctx *ctx = crypto_skcipher_ctx(parent); 237 struct crypto_skcipher *child = ctx->child; 238 239 crypto_skcipher_clear_flags(child, CRYPTO_TFM_REQ_MASK); 240 crypto_skcipher_set_flags(child, 241 crypto_skcipher_get_flags(parent) & 242 CRYPTO_TFM_REQ_MASK); 243 return crypto_skcipher_setkey(child, key, keylen); 244} 245 246static struct skcipher_request *cryptd_skcipher_prepare( 247 struct skcipher_request *req, int err) 248{ 249 struct cryptd_skcipher_request_ctx *rctx = skcipher_request_ctx(req); 250 struct skcipher_request *subreq = &rctx->req; 251 struct cryptd_skcipher_ctx *ctx; 252 struct crypto_skcipher *child; 253 254 req->base.complete = subreq->base.complete; 255 req->base.data = subreq->base.data; 256 257 if (unlikely(err == -EINPROGRESS)) 258 return NULL; 259 260 ctx = crypto_skcipher_ctx(crypto_skcipher_reqtfm(req)); 261 child = ctx->child; 262 263 skcipher_request_set_tfm(subreq, child); 264 skcipher_request_set_callback(subreq, CRYPTO_TFM_REQ_MAY_SLEEP, 265 NULL, NULL); 266 skcipher_request_set_crypt(subreq, req->src, req->dst, req->cryptlen, 267 req->iv); 268 269 return subreq; 270} 271 272static void cryptd_skcipher_complete(struct skcipher_request *req, int err, 273 crypto_completion_t complete) 274{ 275 struct cryptd_skcipher_request_ctx *rctx = skcipher_request_ctx(req); 276 struct crypto_skcipher *tfm = crypto_skcipher_reqtfm(req); 277 struct cryptd_skcipher_ctx *ctx = crypto_skcipher_ctx(tfm); 278 struct skcipher_request *subreq = &rctx->req; 279 int refcnt = refcount_read(&ctx->refcnt); 280 281 local_bh_disable(); 282 skcipher_request_complete(req, err); 283 local_bh_enable(); 284 285 if (unlikely(err == -EINPROGRESS)) { 286 subreq->base.complete = req->base.complete; 287 subreq->base.data = req->base.data; 288 req->base.complete = complete; 289 req->base.data = req; 290 } else if (refcnt && refcount_dec_and_test(&ctx->refcnt)) 291 crypto_free_skcipher(tfm); 292} 293 294static void cryptd_skcipher_encrypt(void *data, int err) 295{ 296 struct skcipher_request *req = data; 297 struct skcipher_request *subreq; 298 299 subreq = cryptd_skcipher_prepare(req, err); 300 if (likely(subreq)) 301 err = crypto_skcipher_encrypt(subreq); 302 303 cryptd_skcipher_complete(req, err, cryptd_skcipher_encrypt); 304} 305 306static void cryptd_skcipher_decrypt(void *data, int err) 307{ 308 struct skcipher_request *req = data; 309 struct skcipher_request *subreq; 310 311 subreq = cryptd_skcipher_prepare(req, err); 312 if (likely(subreq)) 313 err = crypto_skcipher_decrypt(subreq); 314 315 cryptd_skcipher_complete(req, err, cryptd_skcipher_decrypt); 316} 317 318static int cryptd_skcipher_enqueue(struct skcipher_request *req, 319 crypto_completion_t compl) 320{ 321 struct cryptd_skcipher_request_ctx *rctx = skcipher_request_ctx(req); 322 struct crypto_skcipher *tfm = crypto_skcipher_reqtfm(req); 323 struct skcipher_request *subreq = &rctx->req; 324 struct cryptd_queue *queue; 325 326 queue = cryptd_get_queue(crypto_skcipher_tfm(tfm)); 327 subreq->base.complete = req->base.complete; 328 subreq->base.data = req->base.data; 329 req->base.complete = compl; 330 req->base.data = req; 331 332 return cryptd_enqueue_request(queue, &req->base); 333} 334 335static int cryptd_skcipher_encrypt_enqueue(struct skcipher_request *req) 336{ 337 return cryptd_skcipher_enqueue(req, cryptd_skcipher_encrypt); 338} 339 340static int cryptd_skcipher_decrypt_enqueue(struct skcipher_request *req) 341{ 342 return cryptd_skcipher_enqueue(req, cryptd_skcipher_decrypt); 343} 344 345static int cryptd_skcipher_init_tfm(struct crypto_skcipher *tfm) 346{ 347 struct skcipher_instance *inst = skcipher_alg_instance(tfm); 348 struct skcipherd_instance_ctx *ictx = skcipher_instance_ctx(inst); 349 struct crypto_skcipher_spawn *spawn = &ictx->spawn; 350 struct cryptd_skcipher_ctx *ctx = crypto_skcipher_ctx(tfm); 351 struct crypto_skcipher *cipher; 352 353 cipher = crypto_spawn_skcipher(spawn); 354 if (IS_ERR(cipher)) 355 return PTR_ERR(cipher); 356 357 ctx->child = cipher; 358 crypto_skcipher_set_reqsize( 359 tfm, sizeof(struct cryptd_skcipher_request_ctx) + 360 crypto_skcipher_reqsize(cipher)); 361 return 0; 362} 363 364static void cryptd_skcipher_exit_tfm(struct crypto_skcipher *tfm) 365{ 366 struct cryptd_skcipher_ctx *ctx = crypto_skcipher_ctx(tfm); 367 368 crypto_free_skcipher(ctx->child); 369} 370 371static void cryptd_skcipher_free(struct skcipher_instance *inst) 372{ 373 struct skcipherd_instance_ctx *ctx = skcipher_instance_ctx(inst); 374 375 crypto_drop_skcipher(&ctx->spawn); 376 kfree(inst); 377} 378 379static int cryptd_create_skcipher(struct crypto_template *tmpl, 380 struct rtattr **tb, 381 struct crypto_attr_type *algt, 382 struct cryptd_queue *queue) 383{ 384 struct skcipherd_instance_ctx *ctx; 385 struct skcipher_instance *inst; 386 struct skcipher_alg_common *alg; 387 u32 type; 388 u32 mask; 389 int err; 390 391 cryptd_type_and_mask(algt, &type, &mask); 392 393 inst = kzalloc(sizeof(*inst) + sizeof(*ctx), GFP_KERNEL); 394 if (!inst) 395 return -ENOMEM; 396 397 ctx = skcipher_instance_ctx(inst); 398 ctx->queue = queue; 399 400 err = crypto_grab_skcipher(&ctx->spawn, skcipher_crypto_instance(inst), 401 crypto_attr_alg_name(tb[1]), type, mask); 402 if (err) 403 goto err_free_inst; 404 405 alg = crypto_spawn_skcipher_alg_common(&ctx->spawn); 406 err = cryptd_init_instance(skcipher_crypto_instance(inst), &alg->base); 407 if (err) 408 goto err_free_inst; 409 410 inst->alg.base.cra_flags |= CRYPTO_ALG_ASYNC | 411 (alg->base.cra_flags & CRYPTO_ALG_INTERNAL); 412 inst->alg.ivsize = alg->ivsize; 413 inst->alg.chunksize = alg->chunksize; 414 inst->alg.min_keysize = alg->min_keysize; 415 inst->alg.max_keysize = alg->max_keysize; 416 417 inst->alg.base.cra_ctxsize = sizeof(struct cryptd_skcipher_ctx); 418 419 inst->alg.init = cryptd_skcipher_init_tfm; 420 inst->alg.exit = cryptd_skcipher_exit_tfm; 421 422 inst->alg.setkey = cryptd_skcipher_setkey; 423 inst->alg.encrypt = cryptd_skcipher_encrypt_enqueue; 424 inst->alg.decrypt = cryptd_skcipher_decrypt_enqueue; 425 426 inst->free = cryptd_skcipher_free; 427 428 err = skcipher_register_instance(tmpl, inst); 429 if (err) { 430err_free_inst: 431 cryptd_skcipher_free(inst); 432 } 433 return err; 434} 435 436static int cryptd_hash_init_tfm(struct crypto_ahash *tfm) 437{ 438 struct ahash_instance *inst = ahash_alg_instance(tfm); 439 struct hashd_instance_ctx *ictx = ahash_instance_ctx(inst); 440 struct crypto_shash_spawn *spawn = &ictx->spawn; 441 struct cryptd_hash_ctx *ctx = crypto_ahash_ctx(tfm); 442 struct crypto_shash *hash; 443 444 hash = crypto_spawn_shash(spawn); 445 if (IS_ERR(hash)) 446 return PTR_ERR(hash); 447 448 ctx->child = hash; 449 crypto_ahash_set_reqsize(tfm, 450 sizeof(struct cryptd_hash_request_ctx) + 451 crypto_shash_descsize(hash)); 452 return 0; 453} 454 455static int cryptd_hash_clone_tfm(struct crypto_ahash *ntfm, 456 struct crypto_ahash *tfm) 457{ 458 struct cryptd_hash_ctx *nctx = crypto_ahash_ctx(ntfm); 459 struct cryptd_hash_ctx *ctx = crypto_ahash_ctx(tfm); 460 struct crypto_shash *hash; 461 462 hash = crypto_clone_shash(ctx->child); 463 if (IS_ERR(hash)) 464 return PTR_ERR(hash); 465 466 nctx->child = hash; 467 return 0; 468} 469 470static void cryptd_hash_exit_tfm(struct crypto_ahash *tfm) 471{ 472 struct cryptd_hash_ctx *ctx = crypto_ahash_ctx(tfm); 473 474 crypto_free_shash(ctx->child); 475} 476 477static int cryptd_hash_setkey(struct crypto_ahash *parent, 478 const u8 *key, unsigned int keylen) 479{ 480 struct cryptd_hash_ctx *ctx = crypto_ahash_ctx(parent); 481 struct crypto_shash *child = ctx->child; 482 483 crypto_shash_clear_flags(child, CRYPTO_TFM_REQ_MASK); 484 crypto_shash_set_flags(child, crypto_ahash_get_flags(parent) & 485 CRYPTO_TFM_REQ_MASK); 486 return crypto_shash_setkey(child, key, keylen); 487} 488 489static int cryptd_hash_enqueue(struct ahash_request *req, 490 crypto_completion_t compl) 491{ 492 struct cryptd_hash_request_ctx *rctx = ahash_request_ctx(req); 493 struct crypto_ahash *tfm = crypto_ahash_reqtfm(req); 494 struct cryptd_queue *queue = 495 cryptd_get_queue(crypto_ahash_tfm(tfm)); 496 497 rctx->complete = req->base.complete; 498 rctx->data = req->base.data; 499 req->base.complete = compl; 500 req->base.data = req; 501 502 return cryptd_enqueue_request(queue, &req->base); 503} 504 505static struct shash_desc *cryptd_hash_prepare(struct ahash_request *req, 506 int err) 507{ 508 struct cryptd_hash_request_ctx *rctx = ahash_request_ctx(req); 509 510 req->base.complete = rctx->complete; 511 req->base.data = rctx->data; 512 513 if (unlikely(err == -EINPROGRESS)) 514 return NULL; 515 516 return &rctx->desc; 517} 518 519static void cryptd_hash_complete(struct ahash_request *req, int err, 520 crypto_completion_t complete) 521{ 522 struct crypto_ahash *tfm = crypto_ahash_reqtfm(req); 523 struct cryptd_hash_ctx *ctx = crypto_ahash_ctx(tfm); 524 int refcnt = refcount_read(&ctx->refcnt); 525 526 local_bh_disable(); 527 ahash_request_complete(req, err); 528 local_bh_enable(); 529 530 if (err == -EINPROGRESS) { 531 req->base.complete = complete; 532 req->base.data = req; 533 } else if (refcnt && refcount_dec_and_test(&ctx->refcnt)) 534 crypto_free_ahash(tfm); 535} 536 537static void cryptd_hash_init(void *data, int err) 538{ 539 struct ahash_request *req = data; 540 struct crypto_ahash *tfm = crypto_ahash_reqtfm(req); 541 struct cryptd_hash_ctx *ctx = crypto_ahash_ctx(tfm); 542 struct crypto_shash *child = ctx->child; 543 struct shash_desc *desc; 544 545 desc = cryptd_hash_prepare(req, err); 546 if (unlikely(!desc)) 547 goto out; 548 549 desc->tfm = child; 550 551 err = crypto_shash_init(desc); 552 553out: 554 cryptd_hash_complete(req, err, cryptd_hash_init); 555} 556 557static int cryptd_hash_init_enqueue(struct ahash_request *req) 558{ 559 return cryptd_hash_enqueue(req, cryptd_hash_init); 560} 561 562static void cryptd_hash_update(void *data, int err) 563{ 564 struct ahash_request *req = data; 565 struct shash_desc *desc; 566 567 desc = cryptd_hash_prepare(req, err); 568 if (likely(desc)) 569 err = shash_ahash_update(req, desc); 570 571 cryptd_hash_complete(req, err, cryptd_hash_update); 572} 573 574static int cryptd_hash_update_enqueue(struct ahash_request *req) 575{ 576 return cryptd_hash_enqueue(req, cryptd_hash_update); 577} 578 579static void cryptd_hash_final(void *data, int err) 580{ 581 struct ahash_request *req = data; 582 struct shash_desc *desc; 583 584 desc = cryptd_hash_prepare(req, err); 585 if (likely(desc)) 586 err = crypto_shash_final(desc, req->result); 587 588 cryptd_hash_complete(req, err, cryptd_hash_final); 589} 590 591static int cryptd_hash_final_enqueue(struct ahash_request *req) 592{ 593 return cryptd_hash_enqueue(req, cryptd_hash_final); 594} 595 596static void cryptd_hash_finup(void *data, int err) 597{ 598 struct ahash_request *req = data; 599 struct shash_desc *desc; 600 601 desc = cryptd_hash_prepare(req, err); 602 if (likely(desc)) 603 err = shash_ahash_finup(req, desc); 604 605 cryptd_hash_complete(req, err, cryptd_hash_finup); 606} 607 608static int cryptd_hash_finup_enqueue(struct ahash_request *req) 609{ 610 return cryptd_hash_enqueue(req, cryptd_hash_finup); 611} 612 613static void cryptd_hash_digest(void *data, int err) 614{ 615 struct ahash_request *req = data; 616 struct crypto_ahash *tfm = crypto_ahash_reqtfm(req); 617 struct cryptd_hash_ctx *ctx = crypto_ahash_ctx(tfm); 618 struct crypto_shash *child = ctx->child; 619 struct shash_desc *desc; 620 621 desc = cryptd_hash_prepare(req, err); 622 if (unlikely(!desc)) 623 goto out; 624 625 desc->tfm = child; 626 627 err = shash_ahash_digest(req, desc); 628 629out: 630 cryptd_hash_complete(req, err, cryptd_hash_digest); 631} 632 633static int cryptd_hash_digest_enqueue(struct ahash_request *req) 634{ 635 return cryptd_hash_enqueue(req, cryptd_hash_digest); 636} 637 638static int cryptd_hash_export(struct ahash_request *req, void *out) 639{ 640 struct cryptd_hash_request_ctx *rctx = ahash_request_ctx(req); 641 642 return crypto_shash_export(&rctx->desc, out); 643} 644 645static int cryptd_hash_import(struct ahash_request *req, const void *in) 646{ 647 struct crypto_ahash *tfm = crypto_ahash_reqtfm(req); 648 struct cryptd_hash_ctx *ctx = crypto_ahash_ctx(tfm); 649 struct shash_desc *desc = cryptd_shash_desc(req); 650 651 desc->tfm = ctx->child; 652 653 return crypto_shash_import(desc, in); 654} 655 656static void cryptd_hash_free(struct ahash_instance *inst) 657{ 658 struct hashd_instance_ctx *ctx = ahash_instance_ctx(inst); 659 660 crypto_drop_shash(&ctx->spawn); 661 kfree(inst); 662} 663 664static int cryptd_create_hash(struct crypto_template *tmpl, struct rtattr **tb, 665 struct crypto_attr_type *algt, 666 struct cryptd_queue *queue) 667{ 668 struct hashd_instance_ctx *ctx; 669 struct ahash_instance *inst; 670 struct shash_alg *alg; 671 u32 type; 672 u32 mask; 673 int err; 674 675 cryptd_type_and_mask(algt, &type, &mask); 676 677 inst = kzalloc(sizeof(*inst) + sizeof(*ctx), GFP_KERNEL); 678 if (!inst) 679 return -ENOMEM; 680 681 ctx = ahash_instance_ctx(inst); 682 ctx->queue = queue; 683 684 err = crypto_grab_shash(&ctx->spawn, ahash_crypto_instance(inst), 685 crypto_attr_alg_name(tb[1]), type, mask); 686 if (err) 687 goto err_free_inst; 688 alg = crypto_spawn_shash_alg(&ctx->spawn); 689 690 err = cryptd_init_instance(ahash_crypto_instance(inst), &alg->base); 691 if (err) 692 goto err_free_inst; 693 694 inst->alg.halg.base.cra_flags |= CRYPTO_ALG_ASYNC | 695 (alg->base.cra_flags & (CRYPTO_ALG_INTERNAL| 696 CRYPTO_ALG_OPTIONAL_KEY)); 697 inst->alg.halg.digestsize = alg->digestsize; 698 inst->alg.halg.statesize = alg->statesize; 699 inst->alg.halg.base.cra_ctxsize = sizeof(struct cryptd_hash_ctx); 700 701 inst->alg.init_tfm = cryptd_hash_init_tfm; 702 inst->alg.clone_tfm = cryptd_hash_clone_tfm; 703 inst->alg.exit_tfm = cryptd_hash_exit_tfm; 704 705 inst->alg.init = cryptd_hash_init_enqueue; 706 inst->alg.update = cryptd_hash_update_enqueue; 707 inst->alg.final = cryptd_hash_final_enqueue; 708 inst->alg.finup = cryptd_hash_finup_enqueue; 709 inst->alg.export = cryptd_hash_export; 710 inst->alg.import = cryptd_hash_import; 711 if (crypto_shash_alg_has_setkey(alg)) 712 inst->alg.setkey = cryptd_hash_setkey; 713 inst->alg.digest = cryptd_hash_digest_enqueue; 714 715 inst->free = cryptd_hash_free; 716 717 err = ahash_register_instance(tmpl, inst); 718 if (err) { 719err_free_inst: 720 cryptd_hash_free(inst); 721 } 722 return err; 723} 724 725static int cryptd_aead_setkey(struct crypto_aead *parent, 726 const u8 *key, unsigned int keylen) 727{ 728 struct cryptd_aead_ctx *ctx = crypto_aead_ctx(parent); 729 struct crypto_aead *child = ctx->child; 730 731 return crypto_aead_setkey(child, key, keylen); 732} 733 734static int cryptd_aead_setauthsize(struct crypto_aead *parent, 735 unsigned int authsize) 736{ 737 struct cryptd_aead_ctx *ctx = crypto_aead_ctx(parent); 738 struct crypto_aead *child = ctx->child; 739 740 return crypto_aead_setauthsize(child, authsize); 741} 742 743static void cryptd_aead_crypt(struct aead_request *req, 744 struct crypto_aead *child, int err, 745 int (*crypt)(struct aead_request *req), 746 crypto_completion_t compl) 747{ 748 struct cryptd_aead_request_ctx *rctx; 749 struct aead_request *subreq; 750 struct cryptd_aead_ctx *ctx; 751 struct crypto_aead *tfm; 752 int refcnt; 753 754 rctx = aead_request_ctx(req); 755 subreq = &rctx->req; 756 req->base.complete = subreq->base.complete; 757 req->base.data = subreq->base.data; 758 759 tfm = crypto_aead_reqtfm(req); 760 761 if (unlikely(err == -EINPROGRESS)) 762 goto out; 763 764 aead_request_set_tfm(subreq, child); 765 aead_request_set_callback(subreq, CRYPTO_TFM_REQ_MAY_SLEEP, 766 NULL, NULL); 767 aead_request_set_crypt(subreq, req->src, req->dst, req->cryptlen, 768 req->iv); 769 aead_request_set_ad(subreq, req->assoclen); 770 771 err = crypt(subreq); 772 773out: 774 ctx = crypto_aead_ctx(tfm); 775 refcnt = refcount_read(&ctx->refcnt); 776 777 local_bh_disable(); 778 aead_request_complete(req, err); 779 local_bh_enable(); 780 781 if (err == -EINPROGRESS) { 782 subreq->base.complete = req->base.complete; 783 subreq->base.data = req->base.data; 784 req->base.complete = compl; 785 req->base.data = req; 786 } else if (refcnt && refcount_dec_and_test(&ctx->refcnt)) 787 crypto_free_aead(tfm); 788} 789 790static void cryptd_aead_encrypt(void *data, int err) 791{ 792 struct aead_request *req = data; 793 struct cryptd_aead_ctx *ctx; 794 struct crypto_aead *child; 795 796 ctx = crypto_aead_ctx(crypto_aead_reqtfm(req)); 797 child = ctx->child; 798 cryptd_aead_crypt(req, child, err, crypto_aead_alg(child)->encrypt, 799 cryptd_aead_encrypt); 800} 801 802static void cryptd_aead_decrypt(void *data, int err) 803{ 804 struct aead_request *req = data; 805 struct cryptd_aead_ctx *ctx; 806 struct crypto_aead *child; 807 808 ctx = crypto_aead_ctx(crypto_aead_reqtfm(req)); 809 child = ctx->child; 810 cryptd_aead_crypt(req, child, err, crypto_aead_alg(child)->decrypt, 811 cryptd_aead_decrypt); 812} 813 814static int cryptd_aead_enqueue(struct aead_request *req, 815 crypto_completion_t compl) 816{ 817 struct cryptd_aead_request_ctx *rctx = aead_request_ctx(req); 818 struct crypto_aead *tfm = crypto_aead_reqtfm(req); 819 struct cryptd_queue *queue = cryptd_get_queue(crypto_aead_tfm(tfm)); 820 struct aead_request *subreq = &rctx->req; 821 822 subreq->base.complete = req->base.complete; 823 subreq->base.data = req->base.data; 824 req->base.complete = compl; 825 req->base.data = req; 826 return cryptd_enqueue_request(queue, &req->base); 827} 828 829static int cryptd_aead_encrypt_enqueue(struct aead_request *req) 830{ 831 return cryptd_aead_enqueue(req, cryptd_aead_encrypt ); 832} 833 834static int cryptd_aead_decrypt_enqueue(struct aead_request *req) 835{ 836 return cryptd_aead_enqueue(req, cryptd_aead_decrypt ); 837} 838 839static int cryptd_aead_init_tfm(struct crypto_aead *tfm) 840{ 841 struct aead_instance *inst = aead_alg_instance(tfm); 842 struct aead_instance_ctx *ictx = aead_instance_ctx(inst); 843 struct crypto_aead_spawn *spawn = &ictx->aead_spawn; 844 struct cryptd_aead_ctx *ctx = crypto_aead_ctx(tfm); 845 struct crypto_aead *cipher; 846 847 cipher = crypto_spawn_aead(spawn); 848 if (IS_ERR(cipher)) 849 return PTR_ERR(cipher); 850 851 ctx->child = cipher; 852 crypto_aead_set_reqsize( 853 tfm, sizeof(struct cryptd_aead_request_ctx) + 854 crypto_aead_reqsize(cipher)); 855 return 0; 856} 857 858static void cryptd_aead_exit_tfm(struct crypto_aead *tfm) 859{ 860 struct cryptd_aead_ctx *ctx = crypto_aead_ctx(tfm); 861 crypto_free_aead(ctx->child); 862} 863 864static void cryptd_aead_free(struct aead_instance *inst) 865{ 866 struct aead_instance_ctx *ctx = aead_instance_ctx(inst); 867 868 crypto_drop_aead(&ctx->aead_spawn); 869 kfree(inst); 870} 871 872static int cryptd_create_aead(struct crypto_template *tmpl, 873 struct rtattr **tb, 874 struct crypto_attr_type *algt, 875 struct cryptd_queue *queue) 876{ 877 struct aead_instance_ctx *ctx; 878 struct aead_instance *inst; 879 struct aead_alg *alg; 880 u32 type; 881 u32 mask; 882 int err; 883 884 cryptd_type_and_mask(algt, &type, &mask); 885 886 inst = kzalloc(sizeof(*inst) + sizeof(*ctx), GFP_KERNEL); 887 if (!inst) 888 return -ENOMEM; 889 890 ctx = aead_instance_ctx(inst); 891 ctx->queue = queue; 892 893 err = crypto_grab_aead(&ctx->aead_spawn, aead_crypto_instance(inst), 894 crypto_attr_alg_name(tb[1]), type, mask); 895 if (err) 896 goto err_free_inst; 897 898 alg = crypto_spawn_aead_alg(&ctx->aead_spawn); 899 err = cryptd_init_instance(aead_crypto_instance(inst), &alg->base); 900 if (err) 901 goto err_free_inst; 902 903 inst->alg.base.cra_flags |= CRYPTO_ALG_ASYNC | 904 (alg->base.cra_flags & CRYPTO_ALG_INTERNAL); 905 inst->alg.base.cra_ctxsize = sizeof(struct cryptd_aead_ctx); 906 907 inst->alg.ivsize = crypto_aead_alg_ivsize(alg); 908 inst->alg.maxauthsize = crypto_aead_alg_maxauthsize(alg); 909 910 inst->alg.init = cryptd_aead_init_tfm; 911 inst->alg.exit = cryptd_aead_exit_tfm; 912 inst->alg.setkey = cryptd_aead_setkey; 913 inst->alg.setauthsize = cryptd_aead_setauthsize; 914 inst->alg.encrypt = cryptd_aead_encrypt_enqueue; 915 inst->alg.decrypt = cryptd_aead_decrypt_enqueue; 916 917 inst->free = cryptd_aead_free; 918 919 err = aead_register_instance(tmpl, inst); 920 if (err) { 921err_free_inst: 922 cryptd_aead_free(inst); 923 } 924 return err; 925} 926 927static struct cryptd_queue queue; 928 929static int cryptd_create(struct crypto_template *tmpl, struct rtattr **tb) 930{ 931 struct crypto_attr_type *algt; 932 933 algt = crypto_get_attr_type(tb); 934 if (IS_ERR(algt)) 935 return PTR_ERR(algt); 936 937 switch (algt->type & algt->mask & CRYPTO_ALG_TYPE_MASK) { 938 case CRYPTO_ALG_TYPE_LSKCIPHER: 939 return cryptd_create_skcipher(tmpl, tb, algt, &queue); 940 case CRYPTO_ALG_TYPE_HASH: 941 return cryptd_create_hash(tmpl, tb, algt, &queue); 942 case CRYPTO_ALG_TYPE_AEAD: 943 return cryptd_create_aead(tmpl, tb, algt, &queue); 944 } 945 946 return -EINVAL; 947} 948 949static struct crypto_template cryptd_tmpl = { 950 .name = "cryptd", 951 .create = cryptd_create, 952 .module = THIS_MODULE, 953}; 954 955struct cryptd_skcipher *cryptd_alloc_skcipher(const char *alg_name, 956 u32 type, u32 mask) 957{ 958 char cryptd_alg_name[CRYPTO_MAX_ALG_NAME]; 959 struct cryptd_skcipher_ctx *ctx; 960 struct crypto_skcipher *tfm; 961 962 if (snprintf(cryptd_alg_name, CRYPTO_MAX_ALG_NAME, 963 "cryptd(%s)", alg_name) >= CRYPTO_MAX_ALG_NAME) 964 return ERR_PTR(-EINVAL); 965 966 tfm = crypto_alloc_skcipher(cryptd_alg_name, type, mask); 967 if (IS_ERR(tfm)) 968 return ERR_CAST(tfm); 969 970 if (tfm->base.__crt_alg->cra_module != THIS_MODULE) { 971 crypto_free_skcipher(tfm); 972 return ERR_PTR(-EINVAL); 973 } 974 975 ctx = crypto_skcipher_ctx(tfm); 976 refcount_set(&ctx->refcnt, 1); 977 978 return container_of(tfm, struct cryptd_skcipher, base); 979} 980EXPORT_SYMBOL_GPL(cryptd_alloc_skcipher); 981 982struct crypto_skcipher *cryptd_skcipher_child(struct cryptd_skcipher *tfm) 983{ 984 struct cryptd_skcipher_ctx *ctx = crypto_skcipher_ctx(&tfm->base); 985 986 return ctx->child; 987} 988EXPORT_SYMBOL_GPL(cryptd_skcipher_child); 989 990bool cryptd_skcipher_queued(struct cryptd_skcipher *tfm) 991{ 992 struct cryptd_skcipher_ctx *ctx = crypto_skcipher_ctx(&tfm->base); 993 994 return refcount_read(&ctx->refcnt) - 1; 995} 996EXPORT_SYMBOL_GPL(cryptd_skcipher_queued); 997 998void cryptd_free_skcipher(struct cryptd_skcipher *tfm) 999{ 1000 struct cryptd_skcipher_ctx *ctx = crypto_skcipher_ctx(&tfm->base); 1001 1002 if (refcount_dec_and_test(&ctx->refcnt)) 1003 crypto_free_skcipher(&tfm->base); 1004} 1005EXPORT_SYMBOL_GPL(cryptd_free_skcipher); 1006 1007struct cryptd_ahash *cryptd_alloc_ahash(const char *alg_name, 1008 u32 type, u32 mask) 1009{ 1010 char cryptd_alg_name[CRYPTO_MAX_ALG_NAME]; 1011 struct cryptd_hash_ctx *ctx; 1012 struct crypto_ahash *tfm; 1013 1014 if (snprintf(cryptd_alg_name, CRYPTO_MAX_ALG_NAME, 1015 "cryptd(%s)", alg_name) >= CRYPTO_MAX_ALG_NAME) 1016 return ERR_PTR(-EINVAL); 1017 tfm = crypto_alloc_ahash(cryptd_alg_name, type, mask); 1018 if (IS_ERR(tfm)) 1019 return ERR_CAST(tfm); 1020 if (tfm->base.__crt_alg->cra_module != THIS_MODULE) { 1021 crypto_free_ahash(tfm); 1022 return ERR_PTR(-EINVAL); 1023 } 1024 1025 ctx = crypto_ahash_ctx(tfm); 1026 refcount_set(&ctx->refcnt, 1); 1027 1028 return __cryptd_ahash_cast(tfm); 1029} 1030EXPORT_SYMBOL_GPL(cryptd_alloc_ahash); 1031 1032struct crypto_shash *cryptd_ahash_child(struct cryptd_ahash *tfm) 1033{ 1034 struct cryptd_hash_ctx *ctx = crypto_ahash_ctx(&tfm->base); 1035 1036 return ctx->child; 1037} 1038EXPORT_SYMBOL_GPL(cryptd_ahash_child); 1039 1040struct shash_desc *cryptd_shash_desc(struct ahash_request *req) 1041{ 1042 struct cryptd_hash_request_ctx *rctx = ahash_request_ctx(req); 1043 return &rctx->desc; 1044} 1045EXPORT_SYMBOL_GPL(cryptd_shash_desc); 1046 1047bool cryptd_ahash_queued(struct cryptd_ahash *tfm) 1048{ 1049 struct cryptd_hash_ctx *ctx = crypto_ahash_ctx(&tfm->base); 1050 1051 return refcount_read(&ctx->refcnt) - 1; 1052} 1053EXPORT_SYMBOL_GPL(cryptd_ahash_queued); 1054 1055void cryptd_free_ahash(struct cryptd_ahash *tfm) 1056{ 1057 struct cryptd_hash_ctx *ctx = crypto_ahash_ctx(&tfm->base); 1058 1059 if (refcount_dec_and_test(&ctx->refcnt)) 1060 crypto_free_ahash(&tfm->base); 1061} 1062EXPORT_SYMBOL_GPL(cryptd_free_ahash); 1063 1064struct cryptd_aead *cryptd_alloc_aead(const char *alg_name, 1065 u32 type, u32 mask) 1066{ 1067 char cryptd_alg_name[CRYPTO_MAX_ALG_NAME]; 1068 struct cryptd_aead_ctx *ctx; 1069 struct crypto_aead *tfm; 1070 1071 if (snprintf(cryptd_alg_name, CRYPTO_MAX_ALG_NAME, 1072 "cryptd(%s)", alg_name) >= CRYPTO_MAX_ALG_NAME) 1073 return ERR_PTR(-EINVAL); 1074 tfm = crypto_alloc_aead(cryptd_alg_name, type, mask); 1075 if (IS_ERR(tfm)) 1076 return ERR_CAST(tfm); 1077 if (tfm->base.__crt_alg->cra_module != THIS_MODULE) { 1078 crypto_free_aead(tfm); 1079 return ERR_PTR(-EINVAL); 1080 } 1081 1082 ctx = crypto_aead_ctx(tfm); 1083 refcount_set(&ctx->refcnt, 1); 1084 1085 return __cryptd_aead_cast(tfm); 1086} 1087EXPORT_SYMBOL_GPL(cryptd_alloc_aead); 1088 1089struct crypto_aead *cryptd_aead_child(struct cryptd_aead *tfm) 1090{ 1091 struct cryptd_aead_ctx *ctx; 1092 ctx = crypto_aead_ctx(&tfm->base); 1093 return ctx->child; 1094} 1095EXPORT_SYMBOL_GPL(cryptd_aead_child); 1096 1097bool cryptd_aead_queued(struct cryptd_aead *tfm) 1098{ 1099 struct cryptd_aead_ctx *ctx = crypto_aead_ctx(&tfm->base); 1100 1101 return refcount_read(&ctx->refcnt) - 1; 1102} 1103EXPORT_SYMBOL_GPL(cryptd_aead_queued); 1104 1105void cryptd_free_aead(struct cryptd_aead *tfm) 1106{ 1107 struct cryptd_aead_ctx *ctx = crypto_aead_ctx(&tfm->base); 1108 1109 if (refcount_dec_and_test(&ctx->refcnt)) 1110 crypto_free_aead(&tfm->base); 1111} 1112EXPORT_SYMBOL_GPL(cryptd_free_aead); 1113 1114static int __init cryptd_init(void) 1115{ 1116 int err; 1117 1118 cryptd_wq = alloc_workqueue("cryptd", 1119 WQ_MEM_RECLAIM | WQ_CPU_INTENSIVE | WQ_PERCPU, 1120 1); 1121 if (!cryptd_wq) 1122 return -ENOMEM; 1123 1124 err = cryptd_init_queue(&queue, cryptd_max_cpu_qlen); 1125 if (err) 1126 goto err_destroy_wq; 1127 1128 err = crypto_register_template(&cryptd_tmpl); 1129 if (err) 1130 goto err_fini_queue; 1131 1132 return 0; 1133 1134err_fini_queue: 1135 cryptd_fini_queue(&queue); 1136err_destroy_wq: 1137 destroy_workqueue(cryptd_wq); 1138 return err; 1139} 1140 1141static void __exit cryptd_exit(void) 1142{ 1143 destroy_workqueue(cryptd_wq); 1144 cryptd_fini_queue(&queue); 1145 crypto_unregister_template(&cryptd_tmpl); 1146} 1147 1148module_init(cryptd_init); 1149module_exit(cryptd_exit); 1150 1151MODULE_LICENSE("GPL"); 1152MODULE_DESCRIPTION("Software async crypto daemon"); 1153MODULE_ALIAS_CRYPTO("cryptd");