Path: blob/master/drivers/crypto/inside-secure/eip93/eip93-cipher.c
26285 views
// SPDX-License-Identifier: GPL-2.01/*2* Copyright (C) 2019 - 20213*4* Richard van Schagen <[email protected]>5* Christian Marangi <[email protected]6*/78#include <crypto/aes.h>9#include <crypto/ctr.h>10#include <crypto/internal/des.h>11#include <linux/dma-mapping.h>1213#include "eip93-aes.h"14#include "eip93-cipher.h"15#include "eip93-common.h"16#include "eip93-des.h"17#include "eip93-regs.h"1819void eip93_skcipher_handle_result(struct crypto_async_request *async, int err)20{21struct eip93_crypto_ctx *ctx = crypto_tfm_ctx(async->tfm);22struct eip93_device *eip93 = ctx->eip93;23struct skcipher_request *req = skcipher_request_cast(async);24struct eip93_cipher_reqctx *rctx = skcipher_request_ctx(req);2526eip93_unmap_dma(eip93, rctx, req->src, req->dst);27eip93_handle_result(eip93, rctx, req->iv);2829skcipher_request_complete(req, err);30}3132static int eip93_skcipher_send_req(struct crypto_async_request *async)33{34struct skcipher_request *req = skcipher_request_cast(async);35struct eip93_cipher_reqctx *rctx = skcipher_request_ctx(req);36int err;3738err = check_valid_request(rctx);3940if (err) {41skcipher_request_complete(req, err);42return err;43}4445return eip93_send_req(async, req->iv, rctx);46}4748/* Crypto skcipher API functions */49static int eip93_skcipher_cra_init(struct crypto_tfm *tfm)50{51struct eip93_crypto_ctx *ctx = crypto_tfm_ctx(tfm);52struct eip93_alg_template *tmpl = container_of(tfm->__crt_alg,53struct eip93_alg_template, alg.skcipher.base);5455crypto_skcipher_set_reqsize(__crypto_skcipher_cast(tfm),56sizeof(struct eip93_cipher_reqctx));5758memset(ctx, 0, sizeof(*ctx));5960ctx->eip93 = tmpl->eip93;61ctx->type = tmpl->type;6263ctx->sa_record = kzalloc(sizeof(*ctx->sa_record), GFP_KERNEL);64if (!ctx->sa_record)65return -ENOMEM;6667return 0;68}6970static void eip93_skcipher_cra_exit(struct crypto_tfm *tfm)71{72struct eip93_crypto_ctx *ctx = crypto_tfm_ctx(tfm);7374dma_unmap_single(ctx->eip93->dev, ctx->sa_record_base,75sizeof(*ctx->sa_record), DMA_TO_DEVICE);76kfree(ctx->sa_record);77}7879static int eip93_skcipher_setkey(struct crypto_skcipher *ctfm, const u8 *key,80unsigned int len)81{82struct crypto_tfm *tfm = crypto_skcipher_tfm(ctfm);83struct eip93_crypto_ctx *ctx = crypto_tfm_ctx(tfm);84struct eip93_alg_template *tmpl = container_of(tfm->__crt_alg,85struct eip93_alg_template,86alg.skcipher.base);87struct sa_record *sa_record = ctx->sa_record;88unsigned int keylen = len;89u32 flags = tmpl->flags;90u32 nonce = 0;91int ret;9293if (!key || !keylen)94return -EINVAL;9596if (IS_RFC3686(flags)) {97if (len < CTR_RFC3686_NONCE_SIZE)98return -EINVAL;99100keylen = len - CTR_RFC3686_NONCE_SIZE;101memcpy(&nonce, key + keylen, CTR_RFC3686_NONCE_SIZE);102}103104if (flags & EIP93_ALG_DES) {105ctx->blksize = DES_BLOCK_SIZE;106ret = verify_skcipher_des_key(ctfm, key);107if (ret)108return ret;109}110if (flags & EIP93_ALG_3DES) {111ctx->blksize = DES3_EDE_BLOCK_SIZE;112ret = verify_skcipher_des3_key(ctfm, key);113if (ret)114return ret;115}116117if (flags & EIP93_ALG_AES) {118struct crypto_aes_ctx aes;119120ctx->blksize = AES_BLOCK_SIZE;121ret = aes_expandkey(&aes, key, keylen);122if (ret)123return ret;124}125126eip93_set_sa_record(sa_record, keylen, flags);127128memcpy(sa_record->sa_key, key, keylen);129ctx->sa_nonce = nonce;130sa_record->sa_nonce = nonce;131132return 0;133}134135static int eip93_skcipher_crypt(struct skcipher_request *req)136{137struct eip93_cipher_reqctx *rctx = skcipher_request_ctx(req);138struct crypto_async_request *async = &req->base;139struct eip93_crypto_ctx *ctx = crypto_tfm_ctx(req->base.tfm);140struct crypto_skcipher *skcipher = crypto_skcipher_reqtfm(req);141int ret;142143if (!req->cryptlen)144return 0;145146/*147* ECB and CBC algorithms require message lengths to be148* multiples of block size.149*/150if (IS_ECB(rctx->flags) || IS_CBC(rctx->flags))151if (!IS_ALIGNED(req->cryptlen,152crypto_skcipher_blocksize(skcipher)))153return -EINVAL;154155ctx->sa_record_base = dma_map_single(ctx->eip93->dev, ctx->sa_record,156sizeof(*ctx->sa_record), DMA_TO_DEVICE);157ret = dma_mapping_error(ctx->eip93->dev, ctx->sa_record_base);158if (ret)159return ret;160161rctx->assoclen = 0;162rctx->textsize = req->cryptlen;163rctx->authsize = 0;164rctx->sg_src = req->src;165rctx->sg_dst = req->dst;166rctx->ivsize = crypto_skcipher_ivsize(skcipher);167rctx->blksize = ctx->blksize;168rctx->desc_flags = EIP93_DESC_SKCIPHER;169rctx->sa_record_base = ctx->sa_record_base;170171return eip93_skcipher_send_req(async);172}173174static int eip93_skcipher_encrypt(struct skcipher_request *req)175{176struct eip93_cipher_reqctx *rctx = skcipher_request_ctx(req);177struct eip93_alg_template *tmpl = container_of(req->base.tfm->__crt_alg,178struct eip93_alg_template, alg.skcipher.base);179180rctx->flags = tmpl->flags;181rctx->flags |= EIP93_ENCRYPT;182183return eip93_skcipher_crypt(req);184}185186static int eip93_skcipher_decrypt(struct skcipher_request *req)187{188struct eip93_crypto_ctx *ctx = crypto_tfm_ctx(req->base.tfm);189struct eip93_cipher_reqctx *rctx = skcipher_request_ctx(req);190struct eip93_alg_template *tmpl = container_of(req->base.tfm->__crt_alg,191struct eip93_alg_template, alg.skcipher.base);192193ctx->sa_record->sa_cmd0_word |= EIP93_SA_CMD_DIRECTION_IN;194195rctx->flags = tmpl->flags;196rctx->flags |= EIP93_DECRYPT;197198return eip93_skcipher_crypt(req);199}200201/* Available algorithms in this module */202struct eip93_alg_template eip93_alg_ecb_aes = {203.type = EIP93_ALG_TYPE_SKCIPHER,204.flags = EIP93_MODE_ECB | EIP93_ALG_AES,205.alg.skcipher = {206.setkey = eip93_skcipher_setkey,207.encrypt = eip93_skcipher_encrypt,208.decrypt = eip93_skcipher_decrypt,209.min_keysize = AES_MIN_KEY_SIZE,210.max_keysize = AES_MAX_KEY_SIZE,211.ivsize = 0,212.base = {213.cra_name = "ecb(aes)",214.cra_driver_name = "ecb(aes-eip93)",215.cra_priority = EIP93_CRA_PRIORITY,216.cra_flags = CRYPTO_ALG_ASYNC |217CRYPTO_ALG_NEED_FALLBACK |218CRYPTO_ALG_KERN_DRIVER_ONLY,219.cra_blocksize = AES_BLOCK_SIZE,220.cra_ctxsize = sizeof(struct eip93_crypto_ctx),221.cra_alignmask = 0xf,222.cra_init = eip93_skcipher_cra_init,223.cra_exit = eip93_skcipher_cra_exit,224.cra_module = THIS_MODULE,225},226},227};228229struct eip93_alg_template eip93_alg_cbc_aes = {230.type = EIP93_ALG_TYPE_SKCIPHER,231.flags = EIP93_MODE_CBC | EIP93_ALG_AES,232.alg.skcipher = {233.setkey = eip93_skcipher_setkey,234.encrypt = eip93_skcipher_encrypt,235.decrypt = eip93_skcipher_decrypt,236.min_keysize = AES_MIN_KEY_SIZE,237.max_keysize = AES_MAX_KEY_SIZE,238.ivsize = AES_BLOCK_SIZE,239.base = {240.cra_name = "cbc(aes)",241.cra_driver_name = "cbc(aes-eip93)",242.cra_priority = EIP93_CRA_PRIORITY,243.cra_flags = CRYPTO_ALG_ASYNC |244CRYPTO_ALG_NEED_FALLBACK |245CRYPTO_ALG_KERN_DRIVER_ONLY,246.cra_blocksize = AES_BLOCK_SIZE,247.cra_ctxsize = sizeof(struct eip93_crypto_ctx),248.cra_alignmask = 0xf,249.cra_init = eip93_skcipher_cra_init,250.cra_exit = eip93_skcipher_cra_exit,251.cra_module = THIS_MODULE,252},253},254};255256struct eip93_alg_template eip93_alg_ctr_aes = {257.type = EIP93_ALG_TYPE_SKCIPHER,258.flags = EIP93_MODE_CTR | EIP93_ALG_AES,259.alg.skcipher = {260.setkey = eip93_skcipher_setkey,261.encrypt = eip93_skcipher_encrypt,262.decrypt = eip93_skcipher_decrypt,263.min_keysize = AES_MIN_KEY_SIZE,264.max_keysize = AES_MAX_KEY_SIZE,265.ivsize = AES_BLOCK_SIZE,266.base = {267.cra_name = "ctr(aes)",268.cra_driver_name = "ctr(aes-eip93)",269.cra_priority = EIP93_CRA_PRIORITY,270.cra_flags = CRYPTO_ALG_ASYNC |271CRYPTO_ALG_NEED_FALLBACK |272CRYPTO_ALG_KERN_DRIVER_ONLY,273.cra_blocksize = 1,274.cra_ctxsize = sizeof(struct eip93_crypto_ctx),275.cra_alignmask = 0xf,276.cra_init = eip93_skcipher_cra_init,277.cra_exit = eip93_skcipher_cra_exit,278.cra_module = THIS_MODULE,279},280},281};282283struct eip93_alg_template eip93_alg_rfc3686_aes = {284.type = EIP93_ALG_TYPE_SKCIPHER,285.flags = EIP93_MODE_CTR | EIP93_MODE_RFC3686 | EIP93_ALG_AES,286.alg.skcipher = {287.setkey = eip93_skcipher_setkey,288.encrypt = eip93_skcipher_encrypt,289.decrypt = eip93_skcipher_decrypt,290.min_keysize = AES_MIN_KEY_SIZE + CTR_RFC3686_NONCE_SIZE,291.max_keysize = AES_MAX_KEY_SIZE + CTR_RFC3686_NONCE_SIZE,292.ivsize = CTR_RFC3686_IV_SIZE,293.base = {294.cra_name = "rfc3686(ctr(aes))",295.cra_driver_name = "rfc3686(ctr(aes-eip93))",296.cra_priority = EIP93_CRA_PRIORITY,297.cra_flags = CRYPTO_ALG_ASYNC |298CRYPTO_ALG_NEED_FALLBACK |299CRYPTO_ALG_KERN_DRIVER_ONLY,300.cra_blocksize = 1,301.cra_ctxsize = sizeof(struct eip93_crypto_ctx),302.cra_alignmask = 0xf,303.cra_init = eip93_skcipher_cra_init,304.cra_exit = eip93_skcipher_cra_exit,305.cra_module = THIS_MODULE,306},307},308};309310struct eip93_alg_template eip93_alg_ecb_des = {311.type = EIP93_ALG_TYPE_SKCIPHER,312.flags = EIP93_MODE_ECB | EIP93_ALG_DES,313.alg.skcipher = {314.setkey = eip93_skcipher_setkey,315.encrypt = eip93_skcipher_encrypt,316.decrypt = eip93_skcipher_decrypt,317.min_keysize = DES_KEY_SIZE,318.max_keysize = DES_KEY_SIZE,319.ivsize = 0,320.base = {321.cra_name = "ecb(des)",322.cra_driver_name = "ebc(des-eip93)",323.cra_priority = EIP93_CRA_PRIORITY,324.cra_flags = CRYPTO_ALG_ASYNC |325CRYPTO_ALG_KERN_DRIVER_ONLY,326.cra_blocksize = DES_BLOCK_SIZE,327.cra_ctxsize = sizeof(struct eip93_crypto_ctx),328.cra_alignmask = 0,329.cra_init = eip93_skcipher_cra_init,330.cra_exit = eip93_skcipher_cra_exit,331.cra_module = THIS_MODULE,332},333},334};335336struct eip93_alg_template eip93_alg_cbc_des = {337.type = EIP93_ALG_TYPE_SKCIPHER,338.flags = EIP93_MODE_CBC | EIP93_ALG_DES,339.alg.skcipher = {340.setkey = eip93_skcipher_setkey,341.encrypt = eip93_skcipher_encrypt,342.decrypt = eip93_skcipher_decrypt,343.min_keysize = DES_KEY_SIZE,344.max_keysize = DES_KEY_SIZE,345.ivsize = DES_BLOCK_SIZE,346.base = {347.cra_name = "cbc(des)",348.cra_driver_name = "cbc(des-eip93)",349.cra_priority = EIP93_CRA_PRIORITY,350.cra_flags = CRYPTO_ALG_ASYNC |351CRYPTO_ALG_KERN_DRIVER_ONLY,352.cra_blocksize = DES_BLOCK_SIZE,353.cra_ctxsize = sizeof(struct eip93_crypto_ctx),354.cra_alignmask = 0,355.cra_init = eip93_skcipher_cra_init,356.cra_exit = eip93_skcipher_cra_exit,357.cra_module = THIS_MODULE,358},359},360};361362struct eip93_alg_template eip93_alg_ecb_des3_ede = {363.type = EIP93_ALG_TYPE_SKCIPHER,364.flags = EIP93_MODE_ECB | EIP93_ALG_3DES,365.alg.skcipher = {366.setkey = eip93_skcipher_setkey,367.encrypt = eip93_skcipher_encrypt,368.decrypt = eip93_skcipher_decrypt,369.min_keysize = DES3_EDE_KEY_SIZE,370.max_keysize = DES3_EDE_KEY_SIZE,371.ivsize = 0,372.base = {373.cra_name = "ecb(des3_ede)",374.cra_driver_name = "ecb(des3_ede-eip93)",375.cra_priority = EIP93_CRA_PRIORITY,376.cra_flags = CRYPTO_ALG_ASYNC |377CRYPTO_ALG_KERN_DRIVER_ONLY,378.cra_blocksize = DES3_EDE_BLOCK_SIZE,379.cra_ctxsize = sizeof(struct eip93_crypto_ctx),380.cra_alignmask = 0,381.cra_init = eip93_skcipher_cra_init,382.cra_exit = eip93_skcipher_cra_exit,383.cra_module = THIS_MODULE,384},385},386};387388struct eip93_alg_template eip93_alg_cbc_des3_ede = {389.type = EIP93_ALG_TYPE_SKCIPHER,390.flags = EIP93_MODE_CBC | EIP93_ALG_3DES,391.alg.skcipher = {392.setkey = eip93_skcipher_setkey,393.encrypt = eip93_skcipher_encrypt,394.decrypt = eip93_skcipher_decrypt,395.min_keysize = DES3_EDE_KEY_SIZE,396.max_keysize = DES3_EDE_KEY_SIZE,397.ivsize = DES3_EDE_BLOCK_SIZE,398.base = {399.cra_name = "cbc(des3_ede)",400.cra_driver_name = "cbc(des3_ede-eip93)",401.cra_priority = EIP93_CRA_PRIORITY,402.cra_flags = CRYPTO_ALG_ASYNC |403CRYPTO_ALG_KERN_DRIVER_ONLY,404.cra_blocksize = DES3_EDE_BLOCK_SIZE,405.cra_ctxsize = sizeof(struct eip93_crypto_ctx),406.cra_alignmask = 0,407.cra_init = eip93_skcipher_cra_init,408.cra_exit = eip93_skcipher_cra_exit,409.cra_module = THIS_MODULE,410},411},412};413414415