1*9739f5f9SChristian Marangi // SPDX-License-Identifier: GPL-2.0 2*9739f5f9SChristian Marangi /* 3*9739f5f9SChristian Marangi * Copyright (C) 2019 - 2021 4*9739f5f9SChristian Marangi * 5*9739f5f9SChristian Marangi * Richard van Schagen <vschagen@icloud.com> 6*9739f5f9SChristian Marangi * Christian Marangi <ansuelsmth@gmail.com 7*9739f5f9SChristian Marangi */ 8*9739f5f9SChristian Marangi 9*9739f5f9SChristian Marangi #include <crypto/aes.h> 10*9739f5f9SChristian Marangi #include <crypto/ctr.h> 11*9739f5f9SChristian Marangi #include <crypto/internal/des.h> 12*9739f5f9SChristian Marangi #include <linux/dma-mapping.h> 13*9739f5f9SChristian Marangi 14*9739f5f9SChristian Marangi #include "eip93-aes.h" 15*9739f5f9SChristian Marangi #include "eip93-cipher.h" 16*9739f5f9SChristian Marangi #include "eip93-common.h" 17*9739f5f9SChristian Marangi #include "eip93-des.h" 18*9739f5f9SChristian Marangi #include "eip93-regs.h" 19*9739f5f9SChristian Marangi 20*9739f5f9SChristian Marangi void eip93_skcipher_handle_result(struct crypto_async_request *async, int err) 21*9739f5f9SChristian Marangi { 22*9739f5f9SChristian Marangi struct eip93_crypto_ctx *ctx = crypto_tfm_ctx(async->tfm); 23*9739f5f9SChristian Marangi struct eip93_device *eip93 = ctx->eip93; 24*9739f5f9SChristian Marangi struct skcipher_request *req = skcipher_request_cast(async); 25*9739f5f9SChristian Marangi struct eip93_cipher_reqctx *rctx = skcipher_request_ctx(req); 26*9739f5f9SChristian Marangi 27*9739f5f9SChristian Marangi eip93_unmap_dma(eip93, rctx, req->src, req->dst); 28*9739f5f9SChristian Marangi eip93_handle_result(eip93, rctx, req->iv); 29*9739f5f9SChristian Marangi 30*9739f5f9SChristian Marangi skcipher_request_complete(req, err); 31*9739f5f9SChristian Marangi } 32*9739f5f9SChristian Marangi 33*9739f5f9SChristian Marangi static int eip93_skcipher_send_req(struct crypto_async_request *async) 34*9739f5f9SChristian Marangi { 35*9739f5f9SChristian Marangi struct skcipher_request *req = skcipher_request_cast(async); 36*9739f5f9SChristian Marangi struct eip93_cipher_reqctx *rctx = skcipher_request_ctx(req); 37*9739f5f9SChristian Marangi int err; 38*9739f5f9SChristian Marangi 39*9739f5f9SChristian Marangi err = check_valid_request(rctx); 40*9739f5f9SChristian Marangi 41*9739f5f9SChristian Marangi if (err) { 42*9739f5f9SChristian Marangi skcipher_request_complete(req, err); 43*9739f5f9SChristian Marangi return err; 44*9739f5f9SChristian Marangi } 45*9739f5f9SChristian Marangi 46*9739f5f9SChristian Marangi return eip93_send_req(async, req->iv, rctx); 47*9739f5f9SChristian Marangi } 48*9739f5f9SChristian Marangi 49*9739f5f9SChristian Marangi /* Crypto skcipher API functions */ 50*9739f5f9SChristian Marangi static int eip93_skcipher_cra_init(struct crypto_tfm *tfm) 51*9739f5f9SChristian Marangi { 52*9739f5f9SChristian Marangi struct eip93_crypto_ctx *ctx = crypto_tfm_ctx(tfm); 53*9739f5f9SChristian Marangi struct eip93_alg_template *tmpl = container_of(tfm->__crt_alg, 54*9739f5f9SChristian Marangi struct eip93_alg_template, alg.skcipher.base); 55*9739f5f9SChristian Marangi 56*9739f5f9SChristian Marangi crypto_skcipher_set_reqsize(__crypto_skcipher_cast(tfm), 57*9739f5f9SChristian Marangi sizeof(struct eip93_cipher_reqctx)); 58*9739f5f9SChristian Marangi 59*9739f5f9SChristian Marangi memset(ctx, 0, sizeof(*ctx)); 60*9739f5f9SChristian Marangi 61*9739f5f9SChristian Marangi ctx->eip93 = tmpl->eip93; 62*9739f5f9SChristian Marangi ctx->type = tmpl->type; 63*9739f5f9SChristian Marangi 64*9739f5f9SChristian Marangi ctx->sa_record = kzalloc(sizeof(*ctx->sa_record), GFP_KERNEL); 65*9739f5f9SChristian Marangi if (!ctx->sa_record) 66*9739f5f9SChristian Marangi return -ENOMEM; 67*9739f5f9SChristian Marangi 68*9739f5f9SChristian Marangi return 0; 69*9739f5f9SChristian Marangi } 70*9739f5f9SChristian Marangi 71*9739f5f9SChristian Marangi static void eip93_skcipher_cra_exit(struct crypto_tfm *tfm) 72*9739f5f9SChristian Marangi { 73*9739f5f9SChristian Marangi struct eip93_crypto_ctx *ctx = crypto_tfm_ctx(tfm); 74*9739f5f9SChristian Marangi 75*9739f5f9SChristian Marangi dma_unmap_single(ctx->eip93->dev, ctx->sa_record_base, 76*9739f5f9SChristian Marangi sizeof(*ctx->sa_record), DMA_TO_DEVICE); 77*9739f5f9SChristian Marangi kfree(ctx->sa_record); 78*9739f5f9SChristian Marangi } 79*9739f5f9SChristian Marangi 80*9739f5f9SChristian Marangi static int eip93_skcipher_setkey(struct crypto_skcipher *ctfm, const u8 *key, 81*9739f5f9SChristian Marangi unsigned int len) 82*9739f5f9SChristian Marangi { 83*9739f5f9SChristian Marangi struct crypto_tfm *tfm = crypto_skcipher_tfm(ctfm); 84*9739f5f9SChristian Marangi struct eip93_crypto_ctx *ctx = crypto_tfm_ctx(tfm); 85*9739f5f9SChristian Marangi struct eip93_alg_template *tmpl = container_of(tfm->__crt_alg, 86*9739f5f9SChristian Marangi struct eip93_alg_template, 87*9739f5f9SChristian Marangi alg.skcipher.base); 88*9739f5f9SChristian Marangi struct sa_record *sa_record = ctx->sa_record; 89*9739f5f9SChristian Marangi unsigned int keylen = len; 90*9739f5f9SChristian Marangi u32 flags = tmpl->flags; 91*9739f5f9SChristian Marangi u32 nonce = 0; 92*9739f5f9SChristian Marangi int ret; 93*9739f5f9SChristian Marangi 94*9739f5f9SChristian Marangi if (!key || !keylen) 95*9739f5f9SChristian Marangi return -EINVAL; 96*9739f5f9SChristian Marangi 97*9739f5f9SChristian Marangi if (IS_RFC3686(flags)) { 98*9739f5f9SChristian Marangi if (len < CTR_RFC3686_NONCE_SIZE) 99*9739f5f9SChristian Marangi return -EINVAL; 100*9739f5f9SChristian Marangi 101*9739f5f9SChristian Marangi keylen = len - CTR_RFC3686_NONCE_SIZE; 102*9739f5f9SChristian Marangi memcpy(&nonce, key + keylen, CTR_RFC3686_NONCE_SIZE); 103*9739f5f9SChristian Marangi } 104*9739f5f9SChristian Marangi 105*9739f5f9SChristian Marangi if (flags & EIP93_ALG_DES) { 106*9739f5f9SChristian Marangi ctx->blksize = DES_BLOCK_SIZE; 107*9739f5f9SChristian Marangi ret = verify_skcipher_des_key(ctfm, key); 108*9739f5f9SChristian Marangi if (ret) 109*9739f5f9SChristian Marangi return ret; 110*9739f5f9SChristian Marangi } 111*9739f5f9SChristian Marangi if (flags & EIP93_ALG_3DES) { 112*9739f5f9SChristian Marangi ctx->blksize = DES3_EDE_BLOCK_SIZE; 113*9739f5f9SChristian Marangi ret = verify_skcipher_des3_key(ctfm, key); 114*9739f5f9SChristian Marangi if (ret) 115*9739f5f9SChristian Marangi return ret; 116*9739f5f9SChristian Marangi } 117*9739f5f9SChristian Marangi 118*9739f5f9SChristian Marangi if (flags & EIP93_ALG_AES) { 119*9739f5f9SChristian Marangi struct crypto_aes_ctx aes; 120*9739f5f9SChristian Marangi 121*9739f5f9SChristian Marangi ctx->blksize = AES_BLOCK_SIZE; 122*9739f5f9SChristian Marangi ret = aes_expandkey(&aes, key, keylen); 123*9739f5f9SChristian Marangi if (ret) 124*9739f5f9SChristian Marangi return ret; 125*9739f5f9SChristian Marangi } 126*9739f5f9SChristian Marangi 127*9739f5f9SChristian Marangi eip93_set_sa_record(sa_record, keylen, flags); 128*9739f5f9SChristian Marangi 129*9739f5f9SChristian Marangi memcpy(sa_record->sa_key, key, keylen); 130*9739f5f9SChristian Marangi ctx->sa_nonce = nonce; 131*9739f5f9SChristian Marangi sa_record->sa_nonce = nonce; 132*9739f5f9SChristian Marangi 133*9739f5f9SChristian Marangi return 0; 134*9739f5f9SChristian Marangi } 135*9739f5f9SChristian Marangi 136*9739f5f9SChristian Marangi static int eip93_skcipher_crypt(struct skcipher_request *req) 137*9739f5f9SChristian Marangi { 138*9739f5f9SChristian Marangi struct eip93_cipher_reqctx *rctx = skcipher_request_ctx(req); 139*9739f5f9SChristian Marangi struct crypto_async_request *async = &req->base; 140*9739f5f9SChristian Marangi struct eip93_crypto_ctx *ctx = crypto_tfm_ctx(req->base.tfm); 141*9739f5f9SChristian Marangi struct crypto_skcipher *skcipher = crypto_skcipher_reqtfm(req); 142*9739f5f9SChristian Marangi int ret; 143*9739f5f9SChristian Marangi 144*9739f5f9SChristian Marangi if (!req->cryptlen) 145*9739f5f9SChristian Marangi return 0; 146*9739f5f9SChristian Marangi 147*9739f5f9SChristian Marangi /* 148*9739f5f9SChristian Marangi * ECB and CBC algorithms require message lengths to be 149*9739f5f9SChristian Marangi * multiples of block size. 150*9739f5f9SChristian Marangi */ 151*9739f5f9SChristian Marangi if (IS_ECB(rctx->flags) || IS_CBC(rctx->flags)) 152*9739f5f9SChristian Marangi if (!IS_ALIGNED(req->cryptlen, 153*9739f5f9SChristian Marangi crypto_skcipher_blocksize(skcipher))) 154*9739f5f9SChristian Marangi return -EINVAL; 155*9739f5f9SChristian Marangi 156*9739f5f9SChristian Marangi ctx->sa_record_base = dma_map_single(ctx->eip93->dev, ctx->sa_record, 157*9739f5f9SChristian Marangi sizeof(*ctx->sa_record), DMA_TO_DEVICE); 158*9739f5f9SChristian Marangi ret = dma_mapping_error(ctx->eip93->dev, ctx->sa_record_base); 159*9739f5f9SChristian Marangi if (ret) 160*9739f5f9SChristian Marangi return ret; 161*9739f5f9SChristian Marangi 162*9739f5f9SChristian Marangi rctx->assoclen = 0; 163*9739f5f9SChristian Marangi rctx->textsize = req->cryptlen; 164*9739f5f9SChristian Marangi rctx->authsize = 0; 165*9739f5f9SChristian Marangi rctx->sg_src = req->src; 166*9739f5f9SChristian Marangi rctx->sg_dst = req->dst; 167*9739f5f9SChristian Marangi rctx->ivsize = crypto_skcipher_ivsize(skcipher); 168*9739f5f9SChristian Marangi rctx->blksize = ctx->blksize; 169*9739f5f9SChristian Marangi rctx->desc_flags = EIP93_DESC_SKCIPHER; 170*9739f5f9SChristian Marangi rctx->sa_record_base = ctx->sa_record_base; 171*9739f5f9SChristian Marangi 172*9739f5f9SChristian Marangi return eip93_skcipher_send_req(async); 173*9739f5f9SChristian Marangi } 174*9739f5f9SChristian Marangi 175*9739f5f9SChristian Marangi static int eip93_skcipher_encrypt(struct skcipher_request *req) 176*9739f5f9SChristian Marangi { 177*9739f5f9SChristian Marangi struct eip93_cipher_reqctx *rctx = skcipher_request_ctx(req); 178*9739f5f9SChristian Marangi struct eip93_alg_template *tmpl = container_of(req->base.tfm->__crt_alg, 179*9739f5f9SChristian Marangi struct eip93_alg_template, alg.skcipher.base); 180*9739f5f9SChristian Marangi 181*9739f5f9SChristian Marangi rctx->flags = tmpl->flags; 182*9739f5f9SChristian Marangi rctx->flags |= EIP93_ENCRYPT; 183*9739f5f9SChristian Marangi 184*9739f5f9SChristian Marangi return eip93_skcipher_crypt(req); 185*9739f5f9SChristian Marangi } 186*9739f5f9SChristian Marangi 187*9739f5f9SChristian Marangi static int eip93_skcipher_decrypt(struct skcipher_request *req) 188*9739f5f9SChristian Marangi { 189*9739f5f9SChristian Marangi struct eip93_crypto_ctx *ctx = crypto_tfm_ctx(req->base.tfm); 190*9739f5f9SChristian Marangi struct eip93_cipher_reqctx *rctx = skcipher_request_ctx(req); 191*9739f5f9SChristian Marangi struct eip93_alg_template *tmpl = container_of(req->base.tfm->__crt_alg, 192*9739f5f9SChristian Marangi struct eip93_alg_template, alg.skcipher.base); 193*9739f5f9SChristian Marangi 194*9739f5f9SChristian Marangi ctx->sa_record->sa_cmd0_word |= EIP93_SA_CMD_DIRECTION_IN; 195*9739f5f9SChristian Marangi 196*9739f5f9SChristian Marangi rctx->flags = tmpl->flags; 197*9739f5f9SChristian Marangi rctx->flags |= EIP93_DECRYPT; 198*9739f5f9SChristian Marangi 199*9739f5f9SChristian Marangi return eip93_skcipher_crypt(req); 200*9739f5f9SChristian Marangi } 201*9739f5f9SChristian Marangi 202*9739f5f9SChristian Marangi /* Available algorithms in this module */ 203*9739f5f9SChristian Marangi struct eip93_alg_template eip93_alg_ecb_aes = { 204*9739f5f9SChristian Marangi .type = EIP93_ALG_TYPE_SKCIPHER, 205*9739f5f9SChristian Marangi .flags = EIP93_MODE_ECB | EIP93_ALG_AES, 206*9739f5f9SChristian Marangi .alg.skcipher = { 207*9739f5f9SChristian Marangi .setkey = eip93_skcipher_setkey, 208*9739f5f9SChristian Marangi .encrypt = eip93_skcipher_encrypt, 209*9739f5f9SChristian Marangi .decrypt = eip93_skcipher_decrypt, 210*9739f5f9SChristian Marangi .min_keysize = AES_MIN_KEY_SIZE, 211*9739f5f9SChristian Marangi .max_keysize = AES_MAX_KEY_SIZE, 212*9739f5f9SChristian Marangi .ivsize = 0, 213*9739f5f9SChristian Marangi .base = { 214*9739f5f9SChristian Marangi .cra_name = "ecb(aes)", 215*9739f5f9SChristian Marangi .cra_driver_name = "ecb(aes-eip93)", 216*9739f5f9SChristian Marangi .cra_priority = EIP93_CRA_PRIORITY, 217*9739f5f9SChristian Marangi .cra_flags = CRYPTO_ALG_ASYNC | 218*9739f5f9SChristian Marangi CRYPTO_ALG_NEED_FALLBACK | 219*9739f5f9SChristian Marangi CRYPTO_ALG_KERN_DRIVER_ONLY, 220*9739f5f9SChristian Marangi .cra_blocksize = AES_BLOCK_SIZE, 221*9739f5f9SChristian Marangi .cra_ctxsize = sizeof(struct eip93_crypto_ctx), 222*9739f5f9SChristian Marangi .cra_alignmask = 0xf, 223*9739f5f9SChristian Marangi .cra_init = eip93_skcipher_cra_init, 224*9739f5f9SChristian Marangi .cra_exit = eip93_skcipher_cra_exit, 225*9739f5f9SChristian Marangi .cra_module = THIS_MODULE, 226*9739f5f9SChristian Marangi }, 227*9739f5f9SChristian Marangi }, 228*9739f5f9SChristian Marangi }; 229*9739f5f9SChristian Marangi 230*9739f5f9SChristian Marangi struct eip93_alg_template eip93_alg_cbc_aes = { 231*9739f5f9SChristian Marangi .type = EIP93_ALG_TYPE_SKCIPHER, 232*9739f5f9SChristian Marangi .flags = EIP93_MODE_CBC | EIP93_ALG_AES, 233*9739f5f9SChristian Marangi .alg.skcipher = { 234*9739f5f9SChristian Marangi .setkey = eip93_skcipher_setkey, 235*9739f5f9SChristian Marangi .encrypt = eip93_skcipher_encrypt, 236*9739f5f9SChristian Marangi .decrypt = eip93_skcipher_decrypt, 237*9739f5f9SChristian Marangi .min_keysize = AES_MIN_KEY_SIZE, 238*9739f5f9SChristian Marangi .max_keysize = AES_MAX_KEY_SIZE, 239*9739f5f9SChristian Marangi .ivsize = AES_BLOCK_SIZE, 240*9739f5f9SChristian Marangi .base = { 241*9739f5f9SChristian Marangi .cra_name = "cbc(aes)", 242*9739f5f9SChristian Marangi .cra_driver_name = "cbc(aes-eip93)", 243*9739f5f9SChristian Marangi .cra_priority = EIP93_CRA_PRIORITY, 244*9739f5f9SChristian Marangi .cra_flags = CRYPTO_ALG_ASYNC | 245*9739f5f9SChristian Marangi CRYPTO_ALG_NEED_FALLBACK | 246*9739f5f9SChristian Marangi CRYPTO_ALG_KERN_DRIVER_ONLY, 247*9739f5f9SChristian Marangi .cra_blocksize = AES_BLOCK_SIZE, 248*9739f5f9SChristian Marangi .cra_ctxsize = sizeof(struct eip93_crypto_ctx), 249*9739f5f9SChristian Marangi .cra_alignmask = 0xf, 250*9739f5f9SChristian Marangi .cra_init = eip93_skcipher_cra_init, 251*9739f5f9SChristian Marangi .cra_exit = eip93_skcipher_cra_exit, 252*9739f5f9SChristian Marangi .cra_module = THIS_MODULE, 253*9739f5f9SChristian Marangi }, 254*9739f5f9SChristian Marangi }, 255*9739f5f9SChristian Marangi }; 256*9739f5f9SChristian Marangi 257*9739f5f9SChristian Marangi struct eip93_alg_template eip93_alg_ctr_aes = { 258*9739f5f9SChristian Marangi .type = EIP93_ALG_TYPE_SKCIPHER, 259*9739f5f9SChristian Marangi .flags = EIP93_MODE_CTR | EIP93_ALG_AES, 260*9739f5f9SChristian Marangi .alg.skcipher = { 261*9739f5f9SChristian Marangi .setkey = eip93_skcipher_setkey, 262*9739f5f9SChristian Marangi .encrypt = eip93_skcipher_encrypt, 263*9739f5f9SChristian Marangi .decrypt = eip93_skcipher_decrypt, 264*9739f5f9SChristian Marangi .min_keysize = AES_MIN_KEY_SIZE, 265*9739f5f9SChristian Marangi .max_keysize = AES_MAX_KEY_SIZE, 266*9739f5f9SChristian Marangi .ivsize = AES_BLOCK_SIZE, 267*9739f5f9SChristian Marangi .base = { 268*9739f5f9SChristian Marangi .cra_name = "ctr(aes)", 269*9739f5f9SChristian Marangi .cra_driver_name = "ctr(aes-eip93)", 270*9739f5f9SChristian Marangi .cra_priority = EIP93_CRA_PRIORITY, 271*9739f5f9SChristian Marangi .cra_flags = CRYPTO_ALG_ASYNC | 272*9739f5f9SChristian Marangi CRYPTO_ALG_NEED_FALLBACK | 273*9739f5f9SChristian Marangi CRYPTO_ALG_KERN_DRIVER_ONLY, 274*9739f5f9SChristian Marangi .cra_blocksize = 1, 275*9739f5f9SChristian Marangi .cra_ctxsize = sizeof(struct eip93_crypto_ctx), 276*9739f5f9SChristian Marangi .cra_alignmask = 0xf, 277*9739f5f9SChristian Marangi .cra_init = eip93_skcipher_cra_init, 278*9739f5f9SChristian Marangi .cra_exit = eip93_skcipher_cra_exit, 279*9739f5f9SChristian Marangi .cra_module = THIS_MODULE, 280*9739f5f9SChristian Marangi }, 281*9739f5f9SChristian Marangi }, 282*9739f5f9SChristian Marangi }; 283*9739f5f9SChristian Marangi 284*9739f5f9SChristian Marangi struct eip93_alg_template eip93_alg_rfc3686_aes = { 285*9739f5f9SChristian Marangi .type = EIP93_ALG_TYPE_SKCIPHER, 286*9739f5f9SChristian Marangi .flags = EIP93_MODE_CTR | EIP93_MODE_RFC3686 | EIP93_ALG_AES, 287*9739f5f9SChristian Marangi .alg.skcipher = { 288*9739f5f9SChristian Marangi .setkey = eip93_skcipher_setkey, 289*9739f5f9SChristian Marangi .encrypt = eip93_skcipher_encrypt, 290*9739f5f9SChristian Marangi .decrypt = eip93_skcipher_decrypt, 291*9739f5f9SChristian Marangi .min_keysize = AES_MIN_KEY_SIZE + CTR_RFC3686_NONCE_SIZE, 292*9739f5f9SChristian Marangi .max_keysize = AES_MAX_KEY_SIZE + CTR_RFC3686_NONCE_SIZE, 293*9739f5f9SChristian Marangi .ivsize = CTR_RFC3686_IV_SIZE, 294*9739f5f9SChristian Marangi .base = { 295*9739f5f9SChristian Marangi .cra_name = "rfc3686(ctr(aes))", 296*9739f5f9SChristian Marangi .cra_driver_name = "rfc3686(ctr(aes-eip93))", 297*9739f5f9SChristian Marangi .cra_priority = EIP93_CRA_PRIORITY, 298*9739f5f9SChristian Marangi .cra_flags = CRYPTO_ALG_ASYNC | 299*9739f5f9SChristian Marangi CRYPTO_ALG_NEED_FALLBACK | 300*9739f5f9SChristian Marangi CRYPTO_ALG_KERN_DRIVER_ONLY, 301*9739f5f9SChristian Marangi .cra_blocksize = 1, 302*9739f5f9SChristian Marangi .cra_ctxsize = sizeof(struct eip93_crypto_ctx), 303*9739f5f9SChristian Marangi .cra_alignmask = 0xf, 304*9739f5f9SChristian Marangi .cra_init = eip93_skcipher_cra_init, 305*9739f5f9SChristian Marangi .cra_exit = eip93_skcipher_cra_exit, 306*9739f5f9SChristian Marangi .cra_module = THIS_MODULE, 307*9739f5f9SChristian Marangi }, 308*9739f5f9SChristian Marangi }, 309*9739f5f9SChristian Marangi }; 310*9739f5f9SChristian Marangi 311*9739f5f9SChristian Marangi struct eip93_alg_template eip93_alg_ecb_des = { 312*9739f5f9SChristian Marangi .type = EIP93_ALG_TYPE_SKCIPHER, 313*9739f5f9SChristian Marangi .flags = EIP93_MODE_ECB | EIP93_ALG_DES, 314*9739f5f9SChristian Marangi .alg.skcipher = { 315*9739f5f9SChristian Marangi .setkey = eip93_skcipher_setkey, 316*9739f5f9SChristian Marangi .encrypt = eip93_skcipher_encrypt, 317*9739f5f9SChristian Marangi .decrypt = eip93_skcipher_decrypt, 318*9739f5f9SChristian Marangi .min_keysize = DES_KEY_SIZE, 319*9739f5f9SChristian Marangi .max_keysize = DES_KEY_SIZE, 320*9739f5f9SChristian Marangi .ivsize = 0, 321*9739f5f9SChristian Marangi .base = { 322*9739f5f9SChristian Marangi .cra_name = "ecb(des)", 323*9739f5f9SChristian Marangi .cra_driver_name = "ebc(des-eip93)", 324*9739f5f9SChristian Marangi .cra_priority = EIP93_CRA_PRIORITY, 325*9739f5f9SChristian Marangi .cra_flags = CRYPTO_ALG_ASYNC | 326*9739f5f9SChristian Marangi CRYPTO_ALG_KERN_DRIVER_ONLY, 327*9739f5f9SChristian Marangi .cra_blocksize = DES_BLOCK_SIZE, 328*9739f5f9SChristian Marangi .cra_ctxsize = sizeof(struct eip93_crypto_ctx), 329*9739f5f9SChristian Marangi .cra_alignmask = 0, 330*9739f5f9SChristian Marangi .cra_init = eip93_skcipher_cra_init, 331*9739f5f9SChristian Marangi .cra_exit = eip93_skcipher_cra_exit, 332*9739f5f9SChristian Marangi .cra_module = THIS_MODULE, 333*9739f5f9SChristian Marangi }, 334*9739f5f9SChristian Marangi }, 335*9739f5f9SChristian Marangi }; 336*9739f5f9SChristian Marangi 337*9739f5f9SChristian Marangi struct eip93_alg_template eip93_alg_cbc_des = { 338*9739f5f9SChristian Marangi .type = EIP93_ALG_TYPE_SKCIPHER, 339*9739f5f9SChristian Marangi .flags = EIP93_MODE_CBC | EIP93_ALG_DES, 340*9739f5f9SChristian Marangi .alg.skcipher = { 341*9739f5f9SChristian Marangi .setkey = eip93_skcipher_setkey, 342*9739f5f9SChristian Marangi .encrypt = eip93_skcipher_encrypt, 343*9739f5f9SChristian Marangi .decrypt = eip93_skcipher_decrypt, 344*9739f5f9SChristian Marangi .min_keysize = DES_KEY_SIZE, 345*9739f5f9SChristian Marangi .max_keysize = DES_KEY_SIZE, 346*9739f5f9SChristian Marangi .ivsize = DES_BLOCK_SIZE, 347*9739f5f9SChristian Marangi .base = { 348*9739f5f9SChristian Marangi .cra_name = "cbc(des)", 349*9739f5f9SChristian Marangi .cra_driver_name = "cbc(des-eip93)", 350*9739f5f9SChristian Marangi .cra_priority = EIP93_CRA_PRIORITY, 351*9739f5f9SChristian Marangi .cra_flags = CRYPTO_ALG_ASYNC | 352*9739f5f9SChristian Marangi CRYPTO_ALG_KERN_DRIVER_ONLY, 353*9739f5f9SChristian Marangi .cra_blocksize = DES_BLOCK_SIZE, 354*9739f5f9SChristian Marangi .cra_ctxsize = sizeof(struct eip93_crypto_ctx), 355*9739f5f9SChristian Marangi .cra_alignmask = 0, 356*9739f5f9SChristian Marangi .cra_init = eip93_skcipher_cra_init, 357*9739f5f9SChristian Marangi .cra_exit = eip93_skcipher_cra_exit, 358*9739f5f9SChristian Marangi .cra_module = THIS_MODULE, 359*9739f5f9SChristian Marangi }, 360*9739f5f9SChristian Marangi }, 361*9739f5f9SChristian Marangi }; 362*9739f5f9SChristian Marangi 363*9739f5f9SChristian Marangi struct eip93_alg_template eip93_alg_ecb_des3_ede = { 364*9739f5f9SChristian Marangi .type = EIP93_ALG_TYPE_SKCIPHER, 365*9739f5f9SChristian Marangi .flags = EIP93_MODE_ECB | EIP93_ALG_3DES, 366*9739f5f9SChristian Marangi .alg.skcipher = { 367*9739f5f9SChristian Marangi .setkey = eip93_skcipher_setkey, 368*9739f5f9SChristian Marangi .encrypt = eip93_skcipher_encrypt, 369*9739f5f9SChristian Marangi .decrypt = eip93_skcipher_decrypt, 370*9739f5f9SChristian Marangi .min_keysize = DES3_EDE_KEY_SIZE, 371*9739f5f9SChristian Marangi .max_keysize = DES3_EDE_KEY_SIZE, 372*9739f5f9SChristian Marangi .ivsize = 0, 373*9739f5f9SChristian Marangi .base = { 374*9739f5f9SChristian Marangi .cra_name = "ecb(des3_ede)", 375*9739f5f9SChristian Marangi .cra_driver_name = "ecb(des3_ede-eip93)", 376*9739f5f9SChristian Marangi .cra_priority = EIP93_CRA_PRIORITY, 377*9739f5f9SChristian Marangi .cra_flags = CRYPTO_ALG_ASYNC | 378*9739f5f9SChristian Marangi CRYPTO_ALG_KERN_DRIVER_ONLY, 379*9739f5f9SChristian Marangi .cra_blocksize = DES3_EDE_BLOCK_SIZE, 380*9739f5f9SChristian Marangi .cra_ctxsize = sizeof(struct eip93_crypto_ctx), 381*9739f5f9SChristian Marangi .cra_alignmask = 0, 382*9739f5f9SChristian Marangi .cra_init = eip93_skcipher_cra_init, 383*9739f5f9SChristian Marangi .cra_exit = eip93_skcipher_cra_exit, 384*9739f5f9SChristian Marangi .cra_module = THIS_MODULE, 385*9739f5f9SChristian Marangi }, 386*9739f5f9SChristian Marangi }, 387*9739f5f9SChristian Marangi }; 388*9739f5f9SChristian Marangi 389*9739f5f9SChristian Marangi struct eip93_alg_template eip93_alg_cbc_des3_ede = { 390*9739f5f9SChristian Marangi .type = EIP93_ALG_TYPE_SKCIPHER, 391*9739f5f9SChristian Marangi .flags = EIP93_MODE_CBC | EIP93_ALG_3DES, 392*9739f5f9SChristian Marangi .alg.skcipher = { 393*9739f5f9SChristian Marangi .setkey = eip93_skcipher_setkey, 394*9739f5f9SChristian Marangi .encrypt = eip93_skcipher_encrypt, 395*9739f5f9SChristian Marangi .decrypt = eip93_skcipher_decrypt, 396*9739f5f9SChristian Marangi .min_keysize = DES3_EDE_KEY_SIZE, 397*9739f5f9SChristian Marangi .max_keysize = DES3_EDE_KEY_SIZE, 398*9739f5f9SChristian Marangi .ivsize = DES3_EDE_BLOCK_SIZE, 399*9739f5f9SChristian Marangi .base = { 400*9739f5f9SChristian Marangi .cra_name = "cbc(des3_ede)", 401*9739f5f9SChristian Marangi .cra_driver_name = "cbc(des3_ede-eip93)", 402*9739f5f9SChristian Marangi .cra_priority = EIP93_CRA_PRIORITY, 403*9739f5f9SChristian Marangi .cra_flags = CRYPTO_ALG_ASYNC | 404*9739f5f9SChristian Marangi CRYPTO_ALG_KERN_DRIVER_ONLY, 405*9739f5f9SChristian Marangi .cra_blocksize = DES3_EDE_BLOCK_SIZE, 406*9739f5f9SChristian Marangi .cra_ctxsize = sizeof(struct eip93_crypto_ctx), 407*9739f5f9SChristian Marangi .cra_alignmask = 0, 408*9739f5f9SChristian Marangi .cra_init = eip93_skcipher_cra_init, 409*9739f5f9SChristian Marangi .cra_exit = eip93_skcipher_cra_exit, 410*9739f5f9SChristian Marangi .cra_module = THIS_MODULE, 411*9739f5f9SChristian Marangi }, 412*9739f5f9SChristian Marangi }, 413*9739f5f9SChristian Marangi }; 414