caamalg.c (0ea8a56de21be24cb79abb03dee79aabcd60a316) | caamalg.c (9d9b14dbe077c8704d8c3546e38820d35aff2d35) |
---|---|
1// SPDX-License-Identifier: GPL-2.0+ 2/* 3 * caam - Freescale FSL CAAM support for crypto API 4 * 5 * Copyright 2008-2011 Freescale Semiconductor, Inc. 6 * Copyright 2016-2019 NXP 7 * 8 * Based on talitos crypto API driver. --- 43 unchanged lines hidden (view full) --- 52#include "intern.h" 53#include "desc_constr.h" 54#include "jr.h" 55#include "error.h" 56#include "sg_sw_sec4.h" 57#include "key_gen.h" 58#include "caamalg_desc.h" 59#include <crypto/engine.h> | 1// SPDX-License-Identifier: GPL-2.0+ 2/* 3 * caam - Freescale FSL CAAM support for crypto API 4 * 5 * Copyright 2008-2011 Freescale Semiconductor, Inc. 6 * Copyright 2016-2019 NXP 7 * 8 * Based on talitos crypto API driver. --- 43 unchanged lines hidden (view full) --- 52#include "intern.h" 53#include "desc_constr.h" 54#include "jr.h" 55#include "error.h" 56#include "sg_sw_sec4.h" 57#include "key_gen.h" 58#include "caamalg_desc.h" 59#include <crypto/engine.h> |
60#include <asm/unaligned.h> |
|
60 61/* 62 * crypto alg 63 */ 64#define CAAM_CRA_PRIORITY 3000 65/* max key is sum of AES_MAX_KEY_SIZE, max split key size */ 66#define CAAM_MAX_KEY_SIZE (AES_MAX_KEY_SIZE + \ 67 CTR_RFC3686_NONCE_SIZE + \ --- 41 unchanged lines hidden (view full) --- 109 dma_addr_t sh_desc_enc_dma; 110 dma_addr_t sh_desc_dec_dma; 111 dma_addr_t key_dma; 112 enum dma_data_direction dir; 113 struct device *jrdev; 114 struct alginfo adata; 115 struct alginfo cdata; 116 unsigned int authsize; | 61 62/* 63 * crypto alg 64 */ 65#define CAAM_CRA_PRIORITY 3000 66/* max key is sum of AES_MAX_KEY_SIZE, max split key size */ 67#define CAAM_MAX_KEY_SIZE (AES_MAX_KEY_SIZE + \ 68 CTR_RFC3686_NONCE_SIZE + \ --- 41 unchanged lines hidden (view full) --- 110 dma_addr_t sh_desc_enc_dma; 111 dma_addr_t sh_desc_dec_dma; 112 dma_addr_t key_dma; 113 enum dma_data_direction dir; 114 struct device *jrdev; 115 struct alginfo adata; 116 struct alginfo cdata; 117 unsigned int authsize; |
118 struct crypto_skcipher *fallback; |
|
117}; 118 119struct caam_skcipher_req_ctx { 120 struct skcipher_edesc *edesc; | 119}; 120 121struct caam_skcipher_req_ctx { 122 struct skcipher_edesc *edesc; |
123 struct skcipher_request fallback_req; |
|
121}; 122 123struct caam_aead_req_ctx { 124 struct aead_edesc *edesc; 125}; 126 127static int aead_null_set_sh_desc(struct crypto_aead *aead) 128{ --- 696 unchanged lines hidden (view full) --- 825} 826 827static int xts_skcipher_setkey(struct crypto_skcipher *skcipher, const u8 *key, 828 unsigned int keylen) 829{ 830 struct caam_ctx *ctx = crypto_skcipher_ctx(skcipher); 831 struct device *jrdev = ctx->jrdev; 832 u32 *desc; | 124}; 125 126struct caam_aead_req_ctx { 127 struct aead_edesc *edesc; 128}; 129 130static int aead_null_set_sh_desc(struct crypto_aead *aead) 131{ --- 696 unchanged lines hidden (view full) --- 828} 829 830static int xts_skcipher_setkey(struct crypto_skcipher *skcipher, const u8 *key, 831 unsigned int keylen) 832{ 833 struct caam_ctx *ctx = crypto_skcipher_ctx(skcipher); 834 struct device *jrdev = ctx->jrdev; 835 u32 *desc; |
836 int err; |
|
833 834 if (keylen != 2 * AES_MIN_KEY_SIZE && keylen != 2 * AES_MAX_KEY_SIZE) { 835 dev_dbg(jrdev, "key size mismatch\n"); 836 return -EINVAL; 837 } 838 | 837 838 if (keylen != 2 * AES_MIN_KEY_SIZE && keylen != 2 * AES_MAX_KEY_SIZE) { 839 dev_dbg(jrdev, "key size mismatch\n"); 840 return -EINVAL; 841 } 842 |
843 err = crypto_skcipher_setkey(ctx->fallback, key, keylen); 844 if (err) 845 return err; 846 |
|
839 ctx->cdata.keylen = keylen; 840 ctx->cdata.key_virt = key; 841 ctx->cdata.key_inline = true; 842 843 /* xts_skcipher_encrypt shared descriptor */ 844 desc = ctx->sh_desc_enc; 845 cnstr_shdsc_xts_skcipher_encap(desc, &ctx->cdata); 846 dma_sync_single_for_device(jrdev, ctx->sh_desc_enc_dma, --- 903 unchanged lines hidden (view full) --- 1750 kfree(rctx->edesc); 1751 } else { 1752 ret = 0; 1753 } 1754 1755 return ret; 1756} 1757 | 847 ctx->cdata.keylen = keylen; 848 ctx->cdata.key_virt = key; 849 ctx->cdata.key_inline = true; 850 851 /* xts_skcipher_encrypt shared descriptor */ 852 desc = ctx->sh_desc_enc; 853 cnstr_shdsc_xts_skcipher_encap(desc, &ctx->cdata); 854 dma_sync_single_for_device(jrdev, ctx->sh_desc_enc_dma, --- 903 unchanged lines hidden (view full) --- 1758 kfree(rctx->edesc); 1759 } else { 1760 ret = 0; 1761 } 1762 1763 return ret; 1764} 1765 |
1766static inline bool xts_skcipher_ivsize(struct skcipher_request *req) 1767{ 1768 struct crypto_skcipher *skcipher = crypto_skcipher_reqtfm(req); 1769 unsigned int ivsize = crypto_skcipher_ivsize(skcipher); 1770 1771 return !!get_unaligned((u64 *)(req->iv + (ivsize / 2))); 1772} 1773 |
|
1758static inline int skcipher_crypt(struct skcipher_request *req, bool encrypt) 1759{ 1760 struct skcipher_edesc *edesc; 1761 struct crypto_skcipher *skcipher = crypto_skcipher_reqtfm(req); 1762 struct caam_ctx *ctx = crypto_skcipher_ctx(skcipher); 1763 struct device *jrdev = ctx->jrdev; 1764 struct caam_drv_private_jr *jrpriv = dev_get_drvdata(jrdev); 1765 u32 *desc; 1766 int ret = 0; 1767 1768 if (!req->cryptlen) 1769 return 0; 1770 | 1774static inline int skcipher_crypt(struct skcipher_request *req, bool encrypt) 1775{ 1776 struct skcipher_edesc *edesc; 1777 struct crypto_skcipher *skcipher = crypto_skcipher_reqtfm(req); 1778 struct caam_ctx *ctx = crypto_skcipher_ctx(skcipher); 1779 struct device *jrdev = ctx->jrdev; 1780 struct caam_drv_private_jr *jrpriv = dev_get_drvdata(jrdev); 1781 u32 *desc; 1782 int ret = 0; 1783 1784 if (!req->cryptlen) 1785 return 0; 1786 |
1787 if (ctx->fallback && xts_skcipher_ivsize(req)) { 1788 struct caam_skcipher_req_ctx *rctx = skcipher_request_ctx(req); 1789 1790 skcipher_request_set_tfm(&rctx->fallback_req, ctx->fallback); 1791 skcipher_request_set_callback(&rctx->fallback_req, 1792 req->base.flags, 1793 req->base.complete, 1794 req->base.data); 1795 skcipher_request_set_crypt(&rctx->fallback_req, req->src, 1796 req->dst, req->cryptlen, req->iv); 1797 1798 return encrypt ? crypto_skcipher_encrypt(&rctx->fallback_req) : 1799 crypto_skcipher_decrypt(&rctx->fallback_req); 1800 } 1801 |
|
1771 /* allocate extended descriptor */ 1772 edesc = skcipher_edesc_alloc(req, DESC_JOB_IO_LEN * CAAM_CMD_SZ); 1773 if (IS_ERR(edesc)) 1774 return PTR_ERR(edesc); 1775 1776 /* Create and submit job descriptor*/ 1777 init_skcipher_job(req, edesc, encrypt); 1778 --- 121 unchanged lines hidden (view full) --- 1900 .rfc3686 = true, 1901 }, 1902 }, 1903 { 1904 .skcipher = { 1905 .base = { 1906 .cra_name = "xts(aes)", 1907 .cra_driver_name = "xts-aes-caam", | 1802 /* allocate extended descriptor */ 1803 edesc = skcipher_edesc_alloc(req, DESC_JOB_IO_LEN * CAAM_CMD_SZ); 1804 if (IS_ERR(edesc)) 1805 return PTR_ERR(edesc); 1806 1807 /* Create and submit job descriptor*/ 1808 init_skcipher_job(req, edesc, encrypt); 1809 --- 121 unchanged lines hidden (view full) --- 1931 .rfc3686 = true, 1932 }, 1933 }, 1934 { 1935 .skcipher = { 1936 .base = { 1937 .cra_name = "xts(aes)", 1938 .cra_driver_name = "xts-aes-caam", |
1939 .cra_flags = CRYPTO_ALG_NEED_FALLBACK, |
|
1908 .cra_blocksize = AES_BLOCK_SIZE, 1909 }, 1910 .setkey = xts_skcipher_setkey, 1911 .encrypt = skcipher_encrypt, 1912 .decrypt = skcipher_decrypt, 1913 .min_keysize = 2 * AES_MIN_KEY_SIZE, 1914 .max_keysize = 2 * AES_MAX_KEY_SIZE, 1915 .ivsize = AES_BLOCK_SIZE, --- 1423 unchanged lines hidden (view full) --- 3339} 3340 3341static int caam_cra_init(struct crypto_skcipher *tfm) 3342{ 3343 struct skcipher_alg *alg = crypto_skcipher_alg(tfm); 3344 struct caam_skcipher_alg *caam_alg = 3345 container_of(alg, typeof(*caam_alg), skcipher); 3346 struct caam_ctx *ctx = crypto_skcipher_ctx(tfm); | 1940 .cra_blocksize = AES_BLOCK_SIZE, 1941 }, 1942 .setkey = xts_skcipher_setkey, 1943 .encrypt = skcipher_encrypt, 1944 .decrypt = skcipher_decrypt, 1945 .min_keysize = 2 * AES_MIN_KEY_SIZE, 1946 .max_keysize = 2 * AES_MAX_KEY_SIZE, 1947 .ivsize = AES_BLOCK_SIZE, --- 1423 unchanged lines hidden (view full) --- 3371} 3372 3373static int caam_cra_init(struct crypto_skcipher *tfm) 3374{ 3375 struct skcipher_alg *alg = crypto_skcipher_alg(tfm); 3376 struct caam_skcipher_alg *caam_alg = 3377 container_of(alg, typeof(*caam_alg), skcipher); 3378 struct caam_ctx *ctx = crypto_skcipher_ctx(tfm); |
3379 u32 alg_aai = caam_alg->caam.class1_alg_type & OP_ALG_AAI_MASK; 3380 int ret = 0; |
|
3347 | 3381 |
3348 crypto_skcipher_set_reqsize(tfm, sizeof(struct caam_skcipher_req_ctx)); 3349 | |
3350 ctx->enginectx.op.do_one_request = skcipher_do_one_req; 3351 | 3382 ctx->enginectx.op.do_one_request = skcipher_do_one_req; 3383 |
3352 return caam_init_common(crypto_skcipher_ctx(tfm), &caam_alg->caam, 3353 false); | 3384 if (alg_aai == OP_ALG_AAI_XTS) { 3385 const char *tfm_name = crypto_tfm_alg_name(&tfm->base); 3386 struct crypto_skcipher *fallback; 3387 3388 fallback = crypto_alloc_skcipher(tfm_name, 0, 3389 CRYPTO_ALG_NEED_FALLBACK); 3390 if (IS_ERR(fallback)) { 3391 dev_err(ctx->jrdev, "Failed to allocate %s fallback: %ld\n", 3392 tfm_name, PTR_ERR(fallback)); 3393 return PTR_ERR(fallback); 3394 } 3395 3396 ctx->fallback = fallback; 3397 crypto_skcipher_set_reqsize(tfm, sizeof(struct caam_skcipher_req_ctx) + 3398 crypto_skcipher_reqsize(fallback)); 3399 } else { 3400 crypto_skcipher_set_reqsize(tfm, sizeof(struct caam_skcipher_req_ctx)); 3401 } 3402 3403 ret = caam_init_common(ctx, &caam_alg->caam, false); 3404 if (ret && ctx->fallback) 3405 crypto_free_skcipher(ctx->fallback); 3406 3407 return ret; |
3354} 3355 3356static int caam_aead_init(struct crypto_aead *tfm) 3357{ 3358 struct aead_alg *alg = crypto_aead_alg(tfm); 3359 struct caam_aead_alg *caam_alg = 3360 container_of(alg, struct caam_aead_alg, aead); 3361 struct caam_ctx *ctx = crypto_aead_ctx(tfm); --- 11 unchanged lines hidden (view full) --- 3373 offsetof(struct caam_ctx, sh_desc_enc_dma) - 3374 offsetof(struct caam_ctx, sh_desc_enc), 3375 ctx->dir, DMA_ATTR_SKIP_CPU_SYNC); 3376 caam_jr_free(ctx->jrdev); 3377} 3378 3379static void caam_cra_exit(struct crypto_skcipher *tfm) 3380{ | 3408} 3409 3410static int caam_aead_init(struct crypto_aead *tfm) 3411{ 3412 struct aead_alg *alg = crypto_aead_alg(tfm); 3413 struct caam_aead_alg *caam_alg = 3414 container_of(alg, struct caam_aead_alg, aead); 3415 struct caam_ctx *ctx = crypto_aead_ctx(tfm); --- 11 unchanged lines hidden (view full) --- 3427 offsetof(struct caam_ctx, sh_desc_enc_dma) - 3428 offsetof(struct caam_ctx, sh_desc_enc), 3429 ctx->dir, DMA_ATTR_SKIP_CPU_SYNC); 3430 caam_jr_free(ctx->jrdev); 3431} 3432 3433static void caam_cra_exit(struct crypto_skcipher *tfm) 3434{ |
3381 caam_exit_common(crypto_skcipher_ctx(tfm)); | 3435 struct caam_ctx *ctx = crypto_skcipher_ctx(tfm); 3436 3437 if (ctx->fallback) 3438 crypto_free_skcipher(ctx->fallback); 3439 caam_exit_common(ctx); |
3382} 3383 3384static void caam_aead_exit(struct crypto_aead *tfm) 3385{ 3386 caam_exit_common(crypto_aead_ctx(tfm)); 3387} 3388 3389void caam_algapi_exit(void) --- 17 unchanged lines hidden (view full) --- 3407 3408static void caam_skcipher_alg_init(struct caam_skcipher_alg *t_alg) 3409{ 3410 struct skcipher_alg *alg = &t_alg->skcipher; 3411 3412 alg->base.cra_module = THIS_MODULE; 3413 alg->base.cra_priority = CAAM_CRA_PRIORITY; 3414 alg->base.cra_ctxsize = sizeof(struct caam_ctx); | 3440} 3441 3442static void caam_aead_exit(struct crypto_aead *tfm) 3443{ 3444 caam_exit_common(crypto_aead_ctx(tfm)); 3445} 3446 3447void caam_algapi_exit(void) --- 17 unchanged lines hidden (view full) --- 3465 3466static void caam_skcipher_alg_init(struct caam_skcipher_alg *t_alg) 3467{ 3468 struct skcipher_alg *alg = &t_alg->skcipher; 3469 3470 alg->base.cra_module = THIS_MODULE; 3471 alg->base.cra_priority = CAAM_CRA_PRIORITY; 3472 alg->base.cra_ctxsize = sizeof(struct caam_ctx); |
3415 alg->base.cra_flags = CRYPTO_ALG_ASYNC | CRYPTO_ALG_ALLOCATES_MEMORY | 3416 CRYPTO_ALG_KERN_DRIVER_ONLY; | 3473 alg->base.cra_flags |= (CRYPTO_ALG_ASYNC | CRYPTO_ALG_ALLOCATES_MEMORY | 3474 CRYPTO_ALG_KERN_DRIVER_ONLY); |
3417 3418 alg->init = caam_cra_init; 3419 alg->exit = caam_cra_exit; 3420} 3421 3422static void caam_aead_alg_init(struct caam_aead_alg *t_alg) 3423{ 3424 struct aead_alg *alg = &t_alg->aead; --- 156 unchanged lines hidden --- | 3475 3476 alg->init = caam_cra_init; 3477 alg->exit = caam_cra_exit; 3478} 3479 3480static void caam_aead_alg_init(struct caam_aead_alg *t_alg) 3481{ 3482 struct aead_alg *alg = &t_alg->aead; --- 156 unchanged lines hidden --- |