778 lines
22 KiB
C
778 lines
22 KiB
C
// SPDX-License-Identifier: GPL-2.0
|
|
/*
|
|
* Copyright (C) 2019 - 2021
|
|
*
|
|
* Richard van Schagen <vschagen@icloud.com>
|
|
*/
|
|
|
|
#include <linux/version.h>
|
|
#include <linux/iversion.h>
|
|
|
|
#include <crypto/aead.h>
|
|
#include <crypto/aes.h>
|
|
#include <crypto/authenc.h>
|
|
#include <crypto/ctr.h>
|
|
#include <crypto/hmac.h>
|
|
#include <crypto/internal/aead.h>
|
|
#include <crypto/md5.h>
|
|
#include <crypto/null.h>
|
|
#if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 11, 0)
|
|
#include <crypto/sha1.h>
|
|
#include <crypto/sha2.h>
|
|
#else
|
|
#include <crypto/sha.h>
|
|
#endif
|
|
|
|
#if IS_ENABLED(CONFIG_CRYPTO_DEV_EIP93_DES)
|
|
#include <crypto/internal/des.h>
|
|
#endif
|
|
|
|
#include <linux/crypto.h>
|
|
#include <linux/dma-mapping.h>
|
|
|
|
#include "eip93-aead.h"
|
|
#include "eip93-cipher.h"
|
|
#include "eip93-common.h"
|
|
#include "eip93-regs.h"
|
|
|
|
void mtk_aead_handle_result(struct crypto_async_request *async, int err)
|
|
{
|
|
struct mtk_crypto_ctx *ctx = crypto_tfm_ctx(async->tfm);
|
|
struct mtk_device *mtk = ctx->mtk;
|
|
struct aead_request *req = aead_request_cast(async);
|
|
struct mtk_cipher_reqctx *rctx = aead_request_ctx(req);
|
|
|
|
mtk_unmap_dma(mtk, rctx, req->src, req->dst);
|
|
mtk_handle_result(mtk, rctx, req->iv);
|
|
|
|
if (err == 1)
|
|
err = -EBADMSG;
|
|
/* let software handle anti-replay errors */
|
|
if (err == 4)
|
|
err = 0;
|
|
|
|
aead_request_complete(req, err);
|
|
}
|
|
|
|
static int mtk_aead_send_req(struct crypto_async_request *async)
|
|
{
|
|
struct aead_request *req = aead_request_cast(async);
|
|
struct mtk_cipher_reqctx *rctx = aead_request_ctx(req);
|
|
int err;
|
|
|
|
err = check_valid_request(rctx);
|
|
if (err) {
|
|
aead_request_complete(req, err);
|
|
return err;
|
|
}
|
|
|
|
return mtk_send_req(async, req->iv, rctx);
|
|
}
|
|
|
|
/* Crypto aead API functions */
|
|
static int mtk_aead_cra_init(struct crypto_tfm *tfm)
|
|
{
|
|
struct mtk_crypto_ctx *ctx = crypto_tfm_ctx(tfm);
|
|
struct mtk_alg_template *tmpl = container_of(tfm->__crt_alg,
|
|
struct mtk_alg_template, alg.aead.base);
|
|
u32 flags = tmpl->flags;
|
|
char *alg_base;
|
|
|
|
memset(ctx, 0, sizeof(*ctx));
|
|
|
|
crypto_aead_set_reqsize(__crypto_aead_cast(tfm),
|
|
sizeof(struct mtk_cipher_reqctx));
|
|
|
|
ctx->mtk = tmpl->mtk;
|
|
ctx->in_first = true;
|
|
ctx->out_first = true;
|
|
|
|
ctx->sa_in = kzalloc(sizeof(struct saRecord_s), GFP_KERNEL);
|
|
if (!ctx->sa_in)
|
|
return -ENOMEM;
|
|
|
|
ctx->sa_base_in = dma_map_single(ctx->mtk->dev, ctx->sa_in,
|
|
sizeof(struct saRecord_s), DMA_TO_DEVICE);
|
|
|
|
ctx->sa_out = kzalloc(sizeof(struct saRecord_s), GFP_KERNEL);
|
|
if (!ctx->sa_out)
|
|
return -ENOMEM;
|
|
|
|
ctx->sa_base_out = dma_map_single(ctx->mtk->dev, ctx->sa_out,
|
|
sizeof(struct saRecord_s), DMA_TO_DEVICE);
|
|
|
|
/* software workaround for now */
|
|
if (IS_HASH_MD5(flags))
|
|
alg_base = "md5";
|
|
if (IS_HASH_SHA1(flags))
|
|
alg_base = "sha1";
|
|
if (IS_HASH_SHA224(flags))
|
|
alg_base = "sha224";
|
|
if (IS_HASH_SHA256(flags))
|
|
alg_base = "sha256";
|
|
|
|
ctx->shash = crypto_alloc_shash(alg_base, 0, CRYPTO_ALG_NEED_FALLBACK);
|
|
|
|
if (IS_ERR(ctx->shash)) {
|
|
dev_err(ctx->mtk->dev, "base driver %s could not be loaded.\n",
|
|
alg_base);
|
|
return PTR_ERR(ctx->shash);
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
static void mtk_aead_cra_exit(struct crypto_tfm *tfm)
|
|
{
|
|
struct mtk_crypto_ctx *ctx = crypto_tfm_ctx(tfm);
|
|
|
|
if (ctx->shash)
|
|
crypto_free_shash(ctx->shash);
|
|
|
|
dma_unmap_single(ctx->mtk->dev, ctx->sa_base_in,
|
|
sizeof(struct saRecord_s), DMA_TO_DEVICE);
|
|
dma_unmap_single(ctx->mtk->dev, ctx->sa_base_out,
|
|
sizeof(struct saRecord_s), DMA_TO_DEVICE);
|
|
kfree(ctx->sa_in);
|
|
kfree(ctx->sa_out);
|
|
}
|
|
|
|
static int mtk_aead_setkey(struct crypto_aead *ctfm, const u8 *key,
|
|
unsigned int len)
|
|
{
|
|
struct crypto_tfm *tfm = crypto_aead_tfm(ctfm);
|
|
struct mtk_crypto_ctx *ctx = crypto_tfm_ctx(tfm);
|
|
struct mtk_alg_template *tmpl = container_of(tfm->__crt_alg,
|
|
struct mtk_alg_template, alg.skcipher.base);
|
|
u32 flags = tmpl->flags;
|
|
u32 nonce = 0;
|
|
struct crypto_authenc_keys keys;
|
|
struct crypto_aes_ctx aes;
|
|
struct saRecord_s *saRecord = ctx->sa_out;
|
|
int sa_size = sizeof(struct saRecord_s);
|
|
int err = -EINVAL;
|
|
|
|
|
|
if (crypto_authenc_extractkeys(&keys, key, len))
|
|
return err;
|
|
|
|
if (IS_RFC3686(flags)) {
|
|
if (keys.enckeylen < CTR_RFC3686_NONCE_SIZE)
|
|
return err;
|
|
|
|
keys.enckeylen -= CTR_RFC3686_NONCE_SIZE;
|
|
memcpy(&nonce, keys.enckey + keys.enckeylen,
|
|
CTR_RFC3686_NONCE_SIZE);
|
|
}
|
|
|
|
switch ((flags & MTK_ALG_MASK)) {
|
|
#if IS_ENABLED(CONFIG_CRYPTO_DEV_EIP93_DES)
|
|
case MTK_ALG_DES:
|
|
err = verify_aead_des_key(ctfm, keys.enckey, keys.enckeylen);
|
|
break;
|
|
case MTK_ALG_3DES:
|
|
if (keys.enckeylen != DES3_EDE_KEY_SIZE)
|
|
return -EINVAL;
|
|
|
|
err = verify_aead_des3_key(ctfm, keys.enckey, keys.enckeylen);
|
|
break;
|
|
#endif
|
|
case MTK_ALG_AES:
|
|
err = aes_expandkey(&aes, keys.enckey, keys.enckeylen);
|
|
}
|
|
if (err)
|
|
return err;
|
|
|
|
ctx->blksize = crypto_aead_blocksize(ctfm);
|
|
dma_unmap_single(ctx->mtk->dev, ctx->sa_base_in, sa_size,
|
|
DMA_TO_DEVICE);
|
|
|
|
dma_unmap_single(ctx->mtk->dev, ctx->sa_base_out, sa_size,
|
|
DMA_TO_DEVICE);
|
|
/* Encryption key */
|
|
mtk_set_saRecord(saRecord, keys.enckeylen, flags);
|
|
saRecord->saCmd0.bits.opCode = 1;
|
|
saRecord->saCmd0.bits.digestLength = ctx->authsize >> 2;
|
|
|
|
memcpy(saRecord->saKey, keys.enckey, keys.enckeylen);
|
|
ctx->saNonce = nonce;
|
|
saRecord->saNonce = nonce;
|
|
|
|
/* authentication key */
|
|
err = mtk_authenc_setkey(ctx->shash, saRecord, keys.authkey,
|
|
keys.authkeylen);
|
|
|
|
saRecord->saCmd0.bits.direction = 0;
|
|
memcpy(ctx->sa_in, saRecord, sa_size);
|
|
ctx->sa_in->saCmd0.bits.direction = 1;
|
|
ctx->sa_in->saCmd1.bits.copyDigest = 0;
|
|
|
|
ctx->sa_base_out = dma_map_single(ctx->mtk->dev, ctx->sa_out, sa_size,
|
|
DMA_TO_DEVICE);
|
|
ctx->sa_base_in = dma_map_single(ctx->mtk->dev, ctx->sa_in, sa_size,
|
|
DMA_TO_DEVICE);
|
|
ctx->in_first = true;
|
|
ctx->out_first = true;
|
|
|
|
return err;
|
|
}
|
|
|
|
static int mtk_aead_setauthsize(struct crypto_aead *ctfm,
|
|
unsigned int authsize)
|
|
{
|
|
struct crypto_tfm *tfm = crypto_aead_tfm(ctfm);
|
|
struct mtk_crypto_ctx *ctx = crypto_tfm_ctx(tfm);
|
|
|
|
dma_unmap_single(ctx->mtk->dev, ctx->sa_base_in,
|
|
sizeof(struct saRecord_s), DMA_TO_DEVICE);
|
|
|
|
dma_unmap_single(ctx->mtk->dev, ctx->sa_base_out,
|
|
sizeof(struct saRecord_s), DMA_TO_DEVICE);
|
|
|
|
ctx->authsize = authsize;
|
|
ctx->sa_in->saCmd0.bits.digestLength = ctx->authsize >> 2;
|
|
ctx->sa_out->saCmd0.bits.digestLength = ctx->authsize >> 2;
|
|
|
|
ctx->sa_base_out = dma_map_single(ctx->mtk->dev, ctx->sa_out,
|
|
sizeof(struct saRecord_s), DMA_TO_DEVICE);
|
|
ctx->sa_base_in = dma_map_single(ctx->mtk->dev, ctx->sa_in,
|
|
sizeof(struct saRecord_s), DMA_TO_DEVICE);
|
|
return 0;
|
|
}
|
|
|
|
static void mtk_aead_setassoc(struct mtk_crypto_ctx *ctx,
|
|
struct aead_request *req, bool in)
|
|
{
|
|
struct saRecord_s *saRecord;
|
|
|
|
if (in) {
|
|
dma_unmap_single(ctx->mtk->dev, ctx->sa_base_in,
|
|
sizeof(struct saRecord_s), DMA_TO_DEVICE);
|
|
saRecord = ctx->sa_in;
|
|
saRecord->saCmd1.bits.hashCryptOffset = req->assoclen >> 2;
|
|
|
|
ctx->sa_base_in = dma_map_single(ctx->mtk->dev, ctx->sa_in,
|
|
sizeof(struct saRecord_s), DMA_TO_DEVICE);
|
|
ctx->assoclen_in = req->assoclen;
|
|
} else {
|
|
dma_unmap_single(ctx->mtk->dev, ctx->sa_base_out,
|
|
sizeof(struct saRecord_s), DMA_TO_DEVICE);
|
|
saRecord = ctx->sa_out;
|
|
saRecord->saCmd1.bits.hashCryptOffset = req->assoclen >> 2;
|
|
|
|
ctx->sa_base_out = dma_map_single(ctx->mtk->dev, ctx->sa_out,
|
|
sizeof(struct saRecord_s), DMA_TO_DEVICE);
|
|
ctx->assoclen_out = req->assoclen;
|
|
}
|
|
}
|
|
|
|
static int mtk_aead_crypt(struct aead_request *req)
|
|
{
|
|
struct mtk_cipher_reqctx *rctx = aead_request_ctx(req);
|
|
struct crypto_async_request *async = &req->base;
|
|
struct mtk_crypto_ctx *ctx = crypto_tfm_ctx(req->base.tfm);
|
|
struct crypto_aead *aead = crypto_aead_reqtfm(req);
|
|
|
|
rctx->textsize = req->cryptlen;
|
|
rctx->blksize = ctx->blksize;
|
|
rctx->assoclen = req->assoclen;
|
|
rctx->authsize = ctx->authsize;
|
|
rctx->sg_src = req->src;
|
|
rctx->sg_dst = req->dst;
|
|
rctx->ivsize = crypto_aead_ivsize(aead);
|
|
rctx->flags |= MTK_DESC_AEAD;
|
|
|
|
if IS_DECRYPT(rctx->flags)
|
|
rctx->textsize -= rctx->authsize;
|
|
|
|
return mtk_aead_send_req(async);
|
|
}
|
|
|
|
static int mtk_aead_encrypt(struct aead_request *req)
|
|
{
|
|
struct mtk_crypto_ctx *ctx = crypto_tfm_ctx(req->base.tfm);
|
|
struct mtk_cipher_reqctx *rctx = aead_request_ctx(req);
|
|
struct mtk_alg_template *tmpl = container_of(req->base.tfm->__crt_alg,
|
|
struct mtk_alg_template, alg.aead.base);
|
|
|
|
rctx->flags = tmpl->flags;
|
|
rctx->flags |= MTK_ENCRYPT;
|
|
if (ctx->out_first) {
|
|
mtk_aead_setassoc(ctx, req, false);
|
|
ctx->out_first = false;
|
|
}
|
|
|
|
if (req->assoclen != ctx->assoclen_out) {
|
|
dev_err(ctx->mtk->dev, "Request AAD length error\n");
|
|
return -EINVAL;
|
|
}
|
|
|
|
rctx->saRecord_base = ctx->sa_base_out;
|
|
|
|
return mtk_aead_crypt(req);
|
|
}
|
|
|
|
static int mtk_aead_decrypt(struct aead_request *req)
|
|
{
|
|
struct mtk_crypto_ctx *ctx = crypto_tfm_ctx(req->base.tfm);
|
|
struct mtk_cipher_reqctx *rctx = aead_request_ctx(req);
|
|
struct mtk_alg_template *tmpl = container_of(req->base.tfm->__crt_alg,
|
|
struct mtk_alg_template, alg.aead.base);
|
|
|
|
rctx->flags = tmpl->flags;
|
|
rctx->flags |= MTK_DECRYPT;
|
|
if (ctx->in_first) {
|
|
mtk_aead_setassoc(ctx, req, true);
|
|
ctx->in_first = false;
|
|
}
|
|
|
|
if (req->assoclen != ctx->assoclen_in) {
|
|
dev_err(ctx->mtk->dev, "Request AAD length error\n");
|
|
return -EINVAL;
|
|
}
|
|
|
|
rctx->saRecord_base = ctx->sa_base_in;
|
|
|
|
return mtk_aead_crypt(req);
|
|
}
|
|
|
|
/* Available authenc algorithms in this module */
|
|
#if IS_ENABLED(CONFIG_CRYPTO_DEV_EIP93_AES)
|
|
struct mtk_alg_template mtk_alg_authenc_hmac_md5_cbc_aes = {
|
|
.type = MTK_ALG_TYPE_AEAD,
|
|
.flags = MTK_HASH_HMAC | MTK_HASH_MD5 | MTK_MODE_CBC | MTK_ALG_AES,
|
|
.alg.aead = {
|
|
.setkey = mtk_aead_setkey,
|
|
.encrypt = mtk_aead_encrypt,
|
|
.decrypt = mtk_aead_decrypt,
|
|
.ivsize = AES_BLOCK_SIZE,
|
|
.setauthsize = mtk_aead_setauthsize,
|
|
.maxauthsize = MD5_DIGEST_SIZE,
|
|
.base = {
|
|
.cra_name = "authenc(hmac(md5),cbc(aes))",
|
|
.cra_driver_name =
|
|
"authenc(hmac(md5-eip93), cbc(aes-eip93))",
|
|
.cra_priority = MTK_CRA_PRIORITY,
|
|
.cra_flags = CRYPTO_ALG_ASYNC |
|
|
CRYPTO_ALG_KERN_DRIVER_ONLY,
|
|
.cra_blocksize = AES_BLOCK_SIZE,
|
|
.cra_ctxsize = sizeof(struct mtk_crypto_ctx),
|
|
.cra_alignmask = 0,
|
|
.cra_init = mtk_aead_cra_init,
|
|
.cra_exit = mtk_aead_cra_exit,
|
|
.cra_module = THIS_MODULE,
|
|
},
|
|
},
|
|
};
|
|
|
|
struct mtk_alg_template mtk_alg_authenc_hmac_sha1_cbc_aes = {
|
|
.type = MTK_ALG_TYPE_AEAD,
|
|
.flags = MTK_HASH_HMAC | MTK_HASH_SHA1 | MTK_MODE_CBC | MTK_ALG_AES,
|
|
.alg.aead = {
|
|
.setkey = mtk_aead_setkey,
|
|
.encrypt = mtk_aead_encrypt,
|
|
.decrypt = mtk_aead_decrypt,
|
|
.ivsize = AES_BLOCK_SIZE,
|
|
.setauthsize = mtk_aead_setauthsize,
|
|
.maxauthsize = SHA1_DIGEST_SIZE,
|
|
.base = {
|
|
.cra_name = "authenc(hmac(sha1),cbc(aes))",
|
|
.cra_driver_name =
|
|
"authenc(hmac(sha1-eip93),cbc(aes-eip93))",
|
|
.cra_priority = MTK_CRA_PRIORITY,
|
|
.cra_flags = CRYPTO_ALG_ASYNC |
|
|
CRYPTO_ALG_KERN_DRIVER_ONLY,
|
|
.cra_blocksize = AES_BLOCK_SIZE,
|
|
.cra_ctxsize = sizeof(struct mtk_crypto_ctx),
|
|
.cra_alignmask = 0,
|
|
.cra_init = mtk_aead_cra_init,
|
|
.cra_exit = mtk_aead_cra_exit,
|
|
.cra_module = THIS_MODULE,
|
|
},
|
|
},
|
|
};
|
|
|
|
struct mtk_alg_template mtk_alg_authenc_hmac_sha224_cbc_aes = {
|
|
.type = MTK_ALG_TYPE_AEAD,
|
|
.flags = MTK_HASH_HMAC | MTK_HASH_SHA224 | MTK_MODE_CBC | MTK_ALG_AES,
|
|
.alg.aead = {
|
|
.setkey = mtk_aead_setkey,
|
|
.encrypt = mtk_aead_encrypt,
|
|
.decrypt = mtk_aead_decrypt,
|
|
.ivsize = AES_BLOCK_SIZE,
|
|
.setauthsize = mtk_aead_setauthsize,
|
|
.maxauthsize = SHA224_DIGEST_SIZE,
|
|
.base = {
|
|
.cra_name = "authenc(hmac(sha224),cbc(aes))",
|
|
.cra_driver_name =
|
|
"authenc(hmac(sha224-eip93),cbc(aes-eip93))",
|
|
.cra_priority = MTK_CRA_PRIORITY,
|
|
.cra_flags = CRYPTO_ALG_ASYNC |
|
|
CRYPTO_ALG_KERN_DRIVER_ONLY,
|
|
.cra_blocksize = AES_BLOCK_SIZE,
|
|
.cra_ctxsize = sizeof(struct mtk_crypto_ctx),
|
|
.cra_alignmask = 0,
|
|
.cra_init = mtk_aead_cra_init,
|
|
.cra_exit = mtk_aead_cra_exit,
|
|
.cra_module = THIS_MODULE,
|
|
},
|
|
},
|
|
};
|
|
|
|
struct mtk_alg_template mtk_alg_authenc_hmac_sha256_cbc_aes = {
|
|
.type = MTK_ALG_TYPE_AEAD,
|
|
.flags = MTK_HASH_HMAC | MTK_HASH_SHA256 | MTK_MODE_CBC | MTK_ALG_AES,
|
|
.alg.aead = {
|
|
.setkey = mtk_aead_setkey,
|
|
.encrypt = mtk_aead_encrypt,
|
|
.decrypt = mtk_aead_decrypt,
|
|
.ivsize = AES_BLOCK_SIZE,
|
|
.setauthsize = mtk_aead_setauthsize,
|
|
.maxauthsize = SHA256_DIGEST_SIZE,
|
|
.base = {
|
|
.cra_name = "authenc(hmac(sha256),cbc(aes))",
|
|
.cra_driver_name =
|
|
"authenc(hmac(sha256-eip93),cbc(aes-eip93))",
|
|
.cra_priority = MTK_CRA_PRIORITY,
|
|
.cra_flags = CRYPTO_ALG_ASYNC |
|
|
CRYPTO_ALG_KERN_DRIVER_ONLY,
|
|
.cra_blocksize = AES_BLOCK_SIZE,
|
|
.cra_ctxsize = sizeof(struct mtk_crypto_ctx),
|
|
.cra_alignmask = 0,
|
|
.cra_init = mtk_aead_cra_init,
|
|
.cra_exit = mtk_aead_cra_exit,
|
|
.cra_module = THIS_MODULE,
|
|
},
|
|
},
|
|
};
|
|
|
|
struct mtk_alg_template mtk_alg_authenc_hmac_md5_rfc3686_aes = {
|
|
.type = MTK_ALG_TYPE_AEAD,
|
|
.flags = MTK_HASH_HMAC | MTK_HASH_MD5 |
|
|
MTK_MODE_CTR | MTK_MODE_RFC3686 | MTK_ALG_AES,
|
|
.alg.aead = {
|
|
.setkey = mtk_aead_setkey,
|
|
.encrypt = mtk_aead_encrypt,
|
|
.decrypt = mtk_aead_decrypt,
|
|
.ivsize = CTR_RFC3686_IV_SIZE,
|
|
.setauthsize = mtk_aead_setauthsize,
|
|
.maxauthsize = MD5_DIGEST_SIZE,
|
|
.base = {
|
|
.cra_name = "authenc(hmac(md5),rfc3686(ctr(aes)))",
|
|
.cra_driver_name =
|
|
"authenc(hmac(md5-eip93),rfc3686(ctr(aes-eip93)))",
|
|
.cra_priority = MTK_CRA_PRIORITY,
|
|
.cra_flags = CRYPTO_ALG_ASYNC |
|
|
CRYPTO_ALG_KERN_DRIVER_ONLY,
|
|
.cra_blocksize = 1,
|
|
.cra_ctxsize = sizeof(struct mtk_crypto_ctx),
|
|
.cra_alignmask = 0,
|
|
.cra_init = mtk_aead_cra_init,
|
|
.cra_exit = mtk_aead_cra_exit,
|
|
.cra_module = THIS_MODULE,
|
|
},
|
|
},
|
|
};
|
|
|
|
struct mtk_alg_template mtk_alg_authenc_hmac_sha1_rfc3686_aes = {
|
|
.type = MTK_ALG_TYPE_AEAD,
|
|
.flags = MTK_HASH_HMAC | MTK_HASH_SHA1 |
|
|
MTK_MODE_CTR | MTK_MODE_RFC3686 | MTK_ALG_AES,
|
|
.alg.aead = {
|
|
.setkey = mtk_aead_setkey,
|
|
.encrypt = mtk_aead_encrypt,
|
|
.decrypt = mtk_aead_decrypt,
|
|
.ivsize = CTR_RFC3686_IV_SIZE,
|
|
.setauthsize = mtk_aead_setauthsize,
|
|
.maxauthsize = SHA1_DIGEST_SIZE,
|
|
.base = {
|
|
.cra_name = "authenc(hmac(sha1),rfc3686(ctr(aes)))",
|
|
.cra_driver_name =
|
|
"authenc(hmac(sha1-eip93),rfc3686(ctr(aes-eip93)))",
|
|
.cra_priority = MTK_CRA_PRIORITY,
|
|
.cra_flags = CRYPTO_ALG_ASYNC |
|
|
CRYPTO_ALG_KERN_DRIVER_ONLY,
|
|
.cra_blocksize = 1,
|
|
.cra_ctxsize = sizeof(struct mtk_crypto_ctx),
|
|
.cra_alignmask = 0,
|
|
.cra_init = mtk_aead_cra_init,
|
|
.cra_exit = mtk_aead_cra_exit,
|
|
.cra_module = THIS_MODULE,
|
|
},
|
|
},
|
|
};
|
|
|
|
struct mtk_alg_template mtk_alg_authenc_hmac_sha224_rfc3686_aes = {
|
|
.type = MTK_ALG_TYPE_AEAD,
|
|
.flags = MTK_HASH_HMAC | MTK_HASH_SHA224 |
|
|
MTK_MODE_CTR | MTK_MODE_RFC3686 | MTK_ALG_AES,
|
|
.alg.aead = {
|
|
.setkey = mtk_aead_setkey,
|
|
.encrypt = mtk_aead_encrypt,
|
|
.decrypt = mtk_aead_decrypt,
|
|
.ivsize = CTR_RFC3686_IV_SIZE,
|
|
.setauthsize = mtk_aead_setauthsize,
|
|
.maxauthsize = SHA224_DIGEST_SIZE,
|
|
.base = {
|
|
.cra_name = "authenc(hmac(sha224),rfc3686(ctr(aes)))",
|
|
.cra_driver_name =
|
|
"authenc(hmac(sha224-eip93),rfc3686(ctr(aes-eip93)))",
|
|
.cra_priority = MTK_CRA_PRIORITY,
|
|
.cra_flags = CRYPTO_ALG_ASYNC |
|
|
CRYPTO_ALG_KERN_DRIVER_ONLY,
|
|
.cra_blocksize = 1,
|
|
.cra_ctxsize = sizeof(struct mtk_crypto_ctx),
|
|
.cra_alignmask = 0,
|
|
.cra_init = mtk_aead_cra_init,
|
|
.cra_exit = mtk_aead_cra_exit,
|
|
.cra_module = THIS_MODULE,
|
|
},
|
|
},
|
|
};
|
|
|
|
struct mtk_alg_template mtk_alg_authenc_hmac_sha256_rfc3686_aes = {
|
|
.type = MTK_ALG_TYPE_AEAD,
|
|
.flags = MTK_HASH_HMAC | MTK_HASH_SHA256 |
|
|
MTK_MODE_CTR | MTK_MODE_RFC3686 | MTK_ALG_AES,
|
|
.alg.aead = {
|
|
.setkey = mtk_aead_setkey,
|
|
.encrypt = mtk_aead_encrypt,
|
|
.decrypt = mtk_aead_decrypt,
|
|
.ivsize = CTR_RFC3686_IV_SIZE,
|
|
.setauthsize = mtk_aead_setauthsize,
|
|
.maxauthsize = SHA256_DIGEST_SIZE,
|
|
.base = {
|
|
.cra_name = "authenc(hmac(sha256),rfc3686(ctr(aes)))",
|
|
.cra_driver_name =
|
|
"authenc(hmac(sha256-eip93),rfc3686(ctr(aes-eip93)))",
|
|
.cra_priority = MTK_CRA_PRIORITY,
|
|
.cra_flags = CRYPTO_ALG_ASYNC |
|
|
CRYPTO_ALG_KERN_DRIVER_ONLY,
|
|
.cra_blocksize = 1,
|
|
.cra_ctxsize = sizeof(struct mtk_crypto_ctx),
|
|
.cra_alignmask = 0,
|
|
.cra_init = mtk_aead_cra_init,
|
|
.cra_exit = mtk_aead_cra_exit,
|
|
.cra_module = THIS_MODULE,
|
|
},
|
|
},
|
|
};
|
|
#endif
|
|
#if IS_ENABLED(CONFIG_CRYPTO_DEV_EIP93_DES)
|
|
struct mtk_alg_template mtk_alg_authenc_hmac_md5_cbc_des = {
|
|
.type = MTK_ALG_TYPE_AEAD,
|
|
.flags = MTK_HASH_HMAC | MTK_HASH_MD5 | MTK_MODE_CBC | MTK_ALG_DES,
|
|
.alg.aead = {
|
|
.setkey = mtk_aead_setkey,
|
|
.encrypt = mtk_aead_encrypt,
|
|
.decrypt = mtk_aead_decrypt,
|
|
.ivsize = DES_BLOCK_SIZE,
|
|
.setauthsize = mtk_aead_setauthsize,
|
|
.maxauthsize = MD5_DIGEST_SIZE,
|
|
.base = {
|
|
.cra_name = "authenc(hmac(md5),cbc(des))",
|
|
.cra_driver_name =
|
|
"authenc(hmac(md5-eip93),cbc(des-eip93))",
|
|
.cra_priority = MTK_CRA_PRIORITY,
|
|
.cra_flags = CRYPTO_ALG_ASYNC |
|
|
CRYPTO_ALG_KERN_DRIVER_ONLY,
|
|
.cra_blocksize = DES_BLOCK_SIZE,
|
|
.cra_ctxsize = sizeof(struct mtk_crypto_ctx),
|
|
.cra_alignmask = 0,
|
|
.cra_init = mtk_aead_cra_init,
|
|
.cra_exit = mtk_aead_cra_exit,
|
|
.cra_module = THIS_MODULE,
|
|
},
|
|
},
|
|
};
|
|
|
|
struct mtk_alg_template mtk_alg_authenc_hmac_sha1_cbc_des = {
|
|
.type = MTK_ALG_TYPE_AEAD,
|
|
.flags = MTK_HASH_HMAC | MTK_HASH_SHA1 | MTK_MODE_CBC | MTK_ALG_DES,
|
|
.alg.aead = {
|
|
.setkey = mtk_aead_setkey,
|
|
.encrypt = mtk_aead_encrypt,
|
|
.decrypt = mtk_aead_decrypt,
|
|
.ivsize = DES_BLOCK_SIZE,
|
|
.setauthsize = mtk_aead_setauthsize,
|
|
.maxauthsize = SHA1_DIGEST_SIZE,
|
|
.base = {
|
|
.cra_name = "authenc(hmac(sha1),cbc(des))",
|
|
.cra_driver_name =
|
|
"authenc(hmac(sha1-eip93),cbc(des-eip93))",
|
|
.cra_priority = MTK_CRA_PRIORITY,
|
|
.cra_flags = CRYPTO_ALG_ASYNC |
|
|
CRYPTO_ALG_KERN_DRIVER_ONLY,
|
|
.cra_blocksize = DES_BLOCK_SIZE,
|
|
.cra_ctxsize = sizeof(struct mtk_crypto_ctx),
|
|
.cra_alignmask = 0,
|
|
.cra_init = mtk_aead_cra_init,
|
|
.cra_exit = mtk_aead_cra_exit,
|
|
.cra_module = THIS_MODULE,
|
|
},
|
|
},
|
|
};
|
|
|
|
struct mtk_alg_template mtk_alg_authenc_hmac_sha224_cbc_des = {
|
|
.type = MTK_ALG_TYPE_AEAD,
|
|
.flags = MTK_HASH_HMAC | MTK_HASH_SHA224 | MTK_MODE_CBC | MTK_ALG_DES,
|
|
.alg.aead = {
|
|
.setkey = mtk_aead_setkey,
|
|
.encrypt = mtk_aead_encrypt,
|
|
.decrypt = mtk_aead_decrypt,
|
|
.ivsize = DES_BLOCK_SIZE,
|
|
.setauthsize = mtk_aead_setauthsize,
|
|
.maxauthsize = SHA224_DIGEST_SIZE,
|
|
.base = {
|
|
.cra_name = "authenc(hmac(sha224),cbc(des))",
|
|
.cra_driver_name =
|
|
"authenc(hmac(sha224-eip93),cbc(des-eip93))",
|
|
.cra_priority = MTK_CRA_PRIORITY,
|
|
.cra_flags = CRYPTO_ALG_ASYNC |
|
|
CRYPTO_ALG_KERN_DRIVER_ONLY,
|
|
.cra_blocksize = DES_BLOCK_SIZE,
|
|
.cra_ctxsize = sizeof(struct mtk_crypto_ctx),
|
|
.cra_alignmask = 0,
|
|
.cra_init = mtk_aead_cra_init,
|
|
.cra_exit = mtk_aead_cra_exit,
|
|
.cra_module = THIS_MODULE,
|
|
},
|
|
},
|
|
};
|
|
|
|
struct mtk_alg_template mtk_alg_authenc_hmac_sha256_cbc_des = {
|
|
.type = MTK_ALG_TYPE_AEAD,
|
|
.flags = MTK_HASH_HMAC | MTK_HASH_SHA256 | MTK_MODE_CBC | MTK_ALG_DES,
|
|
.alg.aead = {
|
|
.setkey = mtk_aead_setkey,
|
|
.encrypt = mtk_aead_encrypt,
|
|
.decrypt = mtk_aead_decrypt,
|
|
.ivsize = DES_BLOCK_SIZE,
|
|
.setauthsize = mtk_aead_setauthsize,
|
|
.maxauthsize = SHA256_DIGEST_SIZE,
|
|
.base = {
|
|
.cra_name = "authenc(hmac(sha256),cbc(des))",
|
|
.cra_driver_name =
|
|
"authenc(hmac(sha256-eip93),cbc(des-eip93))",
|
|
.cra_priority = MTK_CRA_PRIORITY,
|
|
.cra_flags = CRYPTO_ALG_ASYNC |
|
|
CRYPTO_ALG_KERN_DRIVER_ONLY,
|
|
.cra_blocksize = DES_BLOCK_SIZE,
|
|
.cra_ctxsize = sizeof(struct mtk_crypto_ctx),
|
|
.cra_alignmask = 0,
|
|
.cra_init = mtk_aead_cra_init,
|
|
.cra_exit = mtk_aead_cra_exit,
|
|
.cra_module = THIS_MODULE,
|
|
},
|
|
},
|
|
};
|
|
|
|
struct mtk_alg_template mtk_alg_authenc_hmac_md5_cbc_des3_ede = {
|
|
.type = MTK_ALG_TYPE_AEAD,
|
|
.flags = MTK_HASH_HMAC | MTK_HASH_MD5 | MTK_MODE_CBC | MTK_ALG_3DES,
|
|
.alg.aead = {
|
|
.setkey = mtk_aead_setkey,
|
|
.encrypt = mtk_aead_encrypt,
|
|
.decrypt = mtk_aead_decrypt,
|
|
.ivsize = DES3_EDE_BLOCK_SIZE,
|
|
.setauthsize = mtk_aead_setauthsize,
|
|
.maxauthsize = MD5_DIGEST_SIZE,
|
|
.base = {
|
|
.cra_name = "authenc(hmac(md5),cbc(des3_ede))",
|
|
.cra_driver_name =
|
|
"authenc(hmac(md5-eip93),cbc(des3_ede-eip93))",
|
|
.cra_priority = MTK_CRA_PRIORITY,
|
|
.cra_flags = CRYPTO_ALG_ASYNC |
|
|
CRYPTO_ALG_KERN_DRIVER_ONLY,
|
|
.cra_blocksize = DES3_EDE_BLOCK_SIZE,
|
|
.cra_ctxsize = sizeof(struct mtk_crypto_ctx),
|
|
.cra_alignmask = 0x0,
|
|
.cra_init = mtk_aead_cra_init,
|
|
.cra_exit = mtk_aead_cra_exit,
|
|
.cra_module = THIS_MODULE,
|
|
},
|
|
},
|
|
};
|
|
|
|
struct mtk_alg_template mtk_alg_authenc_hmac_sha1_cbc_des3_ede = {
|
|
.type = MTK_ALG_TYPE_AEAD,
|
|
.flags = MTK_HASH_HMAC | MTK_HASH_SHA1 | MTK_MODE_CBC | MTK_ALG_3DES,
|
|
.alg.aead = {
|
|
.setkey = mtk_aead_setkey,
|
|
.encrypt = mtk_aead_encrypt,
|
|
.decrypt = mtk_aead_decrypt,
|
|
.ivsize = DES3_EDE_BLOCK_SIZE,
|
|
.setauthsize = mtk_aead_setauthsize,
|
|
.maxauthsize = SHA1_DIGEST_SIZE,
|
|
.base = {
|
|
.cra_name = "authenc(hmac(sha1),cbc(des3_ede))",
|
|
.cra_driver_name =
|
|
"authenc(hmac(sha1-eip93),cbc(des3_ede-eip93))",
|
|
.cra_priority = MTK_CRA_PRIORITY,
|
|
.cra_flags = CRYPTO_ALG_ASYNC |
|
|
CRYPTO_ALG_KERN_DRIVER_ONLY,
|
|
.cra_blocksize = DES3_EDE_BLOCK_SIZE,
|
|
.cra_ctxsize = sizeof(struct mtk_crypto_ctx),
|
|
.cra_alignmask = 0x0,
|
|
.cra_init = mtk_aead_cra_init,
|
|
.cra_exit = mtk_aead_cra_exit,
|
|
.cra_module = THIS_MODULE,
|
|
},
|
|
},
|
|
};
|
|
|
|
struct mtk_alg_template mtk_alg_authenc_hmac_sha224_cbc_des3_ede = {
|
|
.type = MTK_ALG_TYPE_AEAD,
|
|
.flags = MTK_HASH_HMAC | MTK_HASH_SHA224 | MTK_MODE_CBC | MTK_ALG_3DES,
|
|
.alg.aead = {
|
|
.setkey = mtk_aead_setkey,
|
|
.encrypt = mtk_aead_encrypt,
|
|
.decrypt = mtk_aead_decrypt,
|
|
.ivsize = DES3_EDE_BLOCK_SIZE,
|
|
.setauthsize = mtk_aead_setauthsize,
|
|
.maxauthsize = SHA224_DIGEST_SIZE,
|
|
.base = {
|
|
.cra_name = "authenc(hmac(sha224),cbc(des3_ede))",
|
|
.cra_driver_name =
|
|
"authenc(hmac(sha224-eip93),cbc(des3_ede-eip93))",
|
|
.cra_priority = MTK_CRA_PRIORITY,
|
|
.cra_flags = CRYPTO_ALG_ASYNC |
|
|
CRYPTO_ALG_KERN_DRIVER_ONLY,
|
|
.cra_blocksize = DES3_EDE_BLOCK_SIZE,
|
|
.cra_ctxsize = sizeof(struct mtk_crypto_ctx),
|
|
.cra_alignmask = 0x0,
|
|
.cra_init = mtk_aead_cra_init,
|
|
.cra_exit = mtk_aead_cra_exit,
|
|
.cra_module = THIS_MODULE,
|
|
},
|
|
},
|
|
};
|
|
|
|
struct mtk_alg_template mtk_alg_authenc_hmac_sha256_cbc_des3_ede = {
|
|
.type = MTK_ALG_TYPE_AEAD,
|
|
.flags = MTK_HASH_HMAC | MTK_HASH_SHA256 | MTK_MODE_CBC | MTK_ALG_3DES,
|
|
.alg.aead = {
|
|
.setkey = mtk_aead_setkey,
|
|
.encrypt = mtk_aead_encrypt,
|
|
.decrypt = mtk_aead_decrypt,
|
|
.ivsize = DES3_EDE_BLOCK_SIZE,
|
|
.setauthsize = mtk_aead_setauthsize,
|
|
.maxauthsize = SHA256_DIGEST_SIZE,
|
|
.base = {
|
|
.cra_name = "authenc(hmac(sha256),cbc(des3_ede))",
|
|
.cra_driver_name =
|
|
"authenc(hmac(sha256-eip93),cbc(des3_ede-eip93))",
|
|
.cra_priority = MTK_CRA_PRIORITY,
|
|
.cra_flags = CRYPTO_ALG_ASYNC |
|
|
CRYPTO_ALG_KERN_DRIVER_ONLY,
|
|
.cra_blocksize = DES3_EDE_BLOCK_SIZE,
|
|
.cra_ctxsize = sizeof(struct mtk_crypto_ctx),
|
|
.cra_alignmask = 0x0,
|
|
.cra_init = mtk_aead_cra_init,
|
|
.cra_exit = mtk_aead_cra_exit,
|
|
.cra_module = THIS_MODULE,
|
|
},
|
|
},
|
|
};
|
|
#endif
|