1*4882a593Smuzhiyun // SPDX-License-Identifier: GPL-2.0-only
2*4882a593Smuzhiyun /*
3*4882a593Smuzhiyun * AMD Cryptographic Coprocessor (CCP) AES crypto API support
4*4882a593Smuzhiyun *
5*4882a593Smuzhiyun * Copyright (C) 2013-2019 Advanced Micro Devices, Inc.
6*4882a593Smuzhiyun *
7*4882a593Smuzhiyun * Author: Tom Lendacky <thomas.lendacky@amd.com>
8*4882a593Smuzhiyun */
9*4882a593Smuzhiyun
10*4882a593Smuzhiyun #include <linux/module.h>
11*4882a593Smuzhiyun #include <linux/sched.h>
12*4882a593Smuzhiyun #include <linux/delay.h>
13*4882a593Smuzhiyun #include <linux/scatterlist.h>
14*4882a593Smuzhiyun #include <linux/crypto.h>
15*4882a593Smuzhiyun #include <crypto/algapi.h>
16*4882a593Smuzhiyun #include <crypto/aes.h>
17*4882a593Smuzhiyun #include <crypto/ctr.h>
18*4882a593Smuzhiyun #include <crypto/scatterwalk.h>
19*4882a593Smuzhiyun
20*4882a593Smuzhiyun #include "ccp-crypto.h"
21*4882a593Smuzhiyun
ccp_aes_complete(struct crypto_async_request * async_req,int ret)22*4882a593Smuzhiyun static int ccp_aes_complete(struct crypto_async_request *async_req, int ret)
23*4882a593Smuzhiyun {
24*4882a593Smuzhiyun struct skcipher_request *req = skcipher_request_cast(async_req);
25*4882a593Smuzhiyun struct ccp_ctx *ctx = crypto_tfm_ctx(req->base.tfm);
26*4882a593Smuzhiyun struct ccp_aes_req_ctx *rctx = skcipher_request_ctx(req);
27*4882a593Smuzhiyun
28*4882a593Smuzhiyun if (ret)
29*4882a593Smuzhiyun return ret;
30*4882a593Smuzhiyun
31*4882a593Smuzhiyun if (ctx->u.aes.mode != CCP_AES_MODE_ECB)
32*4882a593Smuzhiyun memcpy(req->iv, rctx->iv, AES_BLOCK_SIZE);
33*4882a593Smuzhiyun
34*4882a593Smuzhiyun return 0;
35*4882a593Smuzhiyun }
36*4882a593Smuzhiyun
ccp_aes_setkey(struct crypto_skcipher * tfm,const u8 * key,unsigned int key_len)37*4882a593Smuzhiyun static int ccp_aes_setkey(struct crypto_skcipher *tfm, const u8 *key,
38*4882a593Smuzhiyun unsigned int key_len)
39*4882a593Smuzhiyun {
40*4882a593Smuzhiyun struct ccp_crypto_skcipher_alg *alg = ccp_crypto_skcipher_alg(tfm);
41*4882a593Smuzhiyun struct ccp_ctx *ctx = crypto_skcipher_ctx(tfm);
42*4882a593Smuzhiyun
43*4882a593Smuzhiyun switch (key_len) {
44*4882a593Smuzhiyun case AES_KEYSIZE_128:
45*4882a593Smuzhiyun ctx->u.aes.type = CCP_AES_TYPE_128;
46*4882a593Smuzhiyun break;
47*4882a593Smuzhiyun case AES_KEYSIZE_192:
48*4882a593Smuzhiyun ctx->u.aes.type = CCP_AES_TYPE_192;
49*4882a593Smuzhiyun break;
50*4882a593Smuzhiyun case AES_KEYSIZE_256:
51*4882a593Smuzhiyun ctx->u.aes.type = CCP_AES_TYPE_256;
52*4882a593Smuzhiyun break;
53*4882a593Smuzhiyun default:
54*4882a593Smuzhiyun return -EINVAL;
55*4882a593Smuzhiyun }
56*4882a593Smuzhiyun ctx->u.aes.mode = alg->mode;
57*4882a593Smuzhiyun ctx->u.aes.key_len = key_len;
58*4882a593Smuzhiyun
59*4882a593Smuzhiyun memcpy(ctx->u.aes.key, key, key_len);
60*4882a593Smuzhiyun sg_init_one(&ctx->u.aes.key_sg, ctx->u.aes.key, key_len);
61*4882a593Smuzhiyun
62*4882a593Smuzhiyun return 0;
63*4882a593Smuzhiyun }
64*4882a593Smuzhiyun
ccp_aes_crypt(struct skcipher_request * req,bool encrypt)65*4882a593Smuzhiyun static int ccp_aes_crypt(struct skcipher_request *req, bool encrypt)
66*4882a593Smuzhiyun {
67*4882a593Smuzhiyun struct crypto_skcipher *tfm = crypto_skcipher_reqtfm(req);
68*4882a593Smuzhiyun struct ccp_ctx *ctx = crypto_skcipher_ctx(tfm);
69*4882a593Smuzhiyun struct ccp_aes_req_ctx *rctx = skcipher_request_ctx(req);
70*4882a593Smuzhiyun struct scatterlist *iv_sg = NULL;
71*4882a593Smuzhiyun unsigned int iv_len = 0;
72*4882a593Smuzhiyun int ret;
73*4882a593Smuzhiyun
74*4882a593Smuzhiyun if (!ctx->u.aes.key_len)
75*4882a593Smuzhiyun return -EINVAL;
76*4882a593Smuzhiyun
77*4882a593Smuzhiyun if (((ctx->u.aes.mode == CCP_AES_MODE_ECB) ||
78*4882a593Smuzhiyun (ctx->u.aes.mode == CCP_AES_MODE_CBC)) &&
79*4882a593Smuzhiyun (req->cryptlen & (AES_BLOCK_SIZE - 1)))
80*4882a593Smuzhiyun return -EINVAL;
81*4882a593Smuzhiyun
82*4882a593Smuzhiyun if (ctx->u.aes.mode != CCP_AES_MODE_ECB) {
83*4882a593Smuzhiyun if (!req->iv)
84*4882a593Smuzhiyun return -EINVAL;
85*4882a593Smuzhiyun
86*4882a593Smuzhiyun memcpy(rctx->iv, req->iv, AES_BLOCK_SIZE);
87*4882a593Smuzhiyun iv_sg = &rctx->iv_sg;
88*4882a593Smuzhiyun iv_len = AES_BLOCK_SIZE;
89*4882a593Smuzhiyun sg_init_one(iv_sg, rctx->iv, iv_len);
90*4882a593Smuzhiyun }
91*4882a593Smuzhiyun
92*4882a593Smuzhiyun memset(&rctx->cmd, 0, sizeof(rctx->cmd));
93*4882a593Smuzhiyun INIT_LIST_HEAD(&rctx->cmd.entry);
94*4882a593Smuzhiyun rctx->cmd.engine = CCP_ENGINE_AES;
95*4882a593Smuzhiyun rctx->cmd.u.aes.type = ctx->u.aes.type;
96*4882a593Smuzhiyun rctx->cmd.u.aes.mode = ctx->u.aes.mode;
97*4882a593Smuzhiyun rctx->cmd.u.aes.action =
98*4882a593Smuzhiyun (encrypt) ? CCP_AES_ACTION_ENCRYPT : CCP_AES_ACTION_DECRYPT;
99*4882a593Smuzhiyun rctx->cmd.u.aes.key = &ctx->u.aes.key_sg;
100*4882a593Smuzhiyun rctx->cmd.u.aes.key_len = ctx->u.aes.key_len;
101*4882a593Smuzhiyun rctx->cmd.u.aes.iv = iv_sg;
102*4882a593Smuzhiyun rctx->cmd.u.aes.iv_len = iv_len;
103*4882a593Smuzhiyun rctx->cmd.u.aes.src = req->src;
104*4882a593Smuzhiyun rctx->cmd.u.aes.src_len = req->cryptlen;
105*4882a593Smuzhiyun rctx->cmd.u.aes.dst = req->dst;
106*4882a593Smuzhiyun
107*4882a593Smuzhiyun ret = ccp_crypto_enqueue_request(&req->base, &rctx->cmd);
108*4882a593Smuzhiyun
109*4882a593Smuzhiyun return ret;
110*4882a593Smuzhiyun }
111*4882a593Smuzhiyun
ccp_aes_encrypt(struct skcipher_request * req)112*4882a593Smuzhiyun static int ccp_aes_encrypt(struct skcipher_request *req)
113*4882a593Smuzhiyun {
114*4882a593Smuzhiyun return ccp_aes_crypt(req, true);
115*4882a593Smuzhiyun }
116*4882a593Smuzhiyun
ccp_aes_decrypt(struct skcipher_request * req)117*4882a593Smuzhiyun static int ccp_aes_decrypt(struct skcipher_request *req)
118*4882a593Smuzhiyun {
119*4882a593Smuzhiyun return ccp_aes_crypt(req, false);
120*4882a593Smuzhiyun }
121*4882a593Smuzhiyun
ccp_aes_init_tfm(struct crypto_skcipher * tfm)122*4882a593Smuzhiyun static int ccp_aes_init_tfm(struct crypto_skcipher *tfm)
123*4882a593Smuzhiyun {
124*4882a593Smuzhiyun struct ccp_ctx *ctx = crypto_skcipher_ctx(tfm);
125*4882a593Smuzhiyun
126*4882a593Smuzhiyun ctx->complete = ccp_aes_complete;
127*4882a593Smuzhiyun ctx->u.aes.key_len = 0;
128*4882a593Smuzhiyun
129*4882a593Smuzhiyun crypto_skcipher_set_reqsize(tfm, sizeof(struct ccp_aes_req_ctx));
130*4882a593Smuzhiyun
131*4882a593Smuzhiyun return 0;
132*4882a593Smuzhiyun }
133*4882a593Smuzhiyun
ccp_aes_rfc3686_complete(struct crypto_async_request * async_req,int ret)134*4882a593Smuzhiyun static int ccp_aes_rfc3686_complete(struct crypto_async_request *async_req,
135*4882a593Smuzhiyun int ret)
136*4882a593Smuzhiyun {
137*4882a593Smuzhiyun struct skcipher_request *req = skcipher_request_cast(async_req);
138*4882a593Smuzhiyun struct ccp_aes_req_ctx *rctx = skcipher_request_ctx(req);
139*4882a593Smuzhiyun
140*4882a593Smuzhiyun /* Restore the original pointer */
141*4882a593Smuzhiyun req->iv = rctx->rfc3686_info;
142*4882a593Smuzhiyun
143*4882a593Smuzhiyun return ccp_aes_complete(async_req, ret);
144*4882a593Smuzhiyun }
145*4882a593Smuzhiyun
ccp_aes_rfc3686_setkey(struct crypto_skcipher * tfm,const u8 * key,unsigned int key_len)146*4882a593Smuzhiyun static int ccp_aes_rfc3686_setkey(struct crypto_skcipher *tfm, const u8 *key,
147*4882a593Smuzhiyun unsigned int key_len)
148*4882a593Smuzhiyun {
149*4882a593Smuzhiyun struct ccp_ctx *ctx = crypto_skcipher_ctx(tfm);
150*4882a593Smuzhiyun
151*4882a593Smuzhiyun if (key_len < CTR_RFC3686_NONCE_SIZE)
152*4882a593Smuzhiyun return -EINVAL;
153*4882a593Smuzhiyun
154*4882a593Smuzhiyun key_len -= CTR_RFC3686_NONCE_SIZE;
155*4882a593Smuzhiyun memcpy(ctx->u.aes.nonce, key + key_len, CTR_RFC3686_NONCE_SIZE);
156*4882a593Smuzhiyun
157*4882a593Smuzhiyun return ccp_aes_setkey(tfm, key, key_len);
158*4882a593Smuzhiyun }
159*4882a593Smuzhiyun
ccp_aes_rfc3686_crypt(struct skcipher_request * req,bool encrypt)160*4882a593Smuzhiyun static int ccp_aes_rfc3686_crypt(struct skcipher_request *req, bool encrypt)
161*4882a593Smuzhiyun {
162*4882a593Smuzhiyun struct crypto_skcipher *tfm = crypto_skcipher_reqtfm(req);
163*4882a593Smuzhiyun struct ccp_ctx *ctx = crypto_skcipher_ctx(tfm);
164*4882a593Smuzhiyun struct ccp_aes_req_ctx *rctx = skcipher_request_ctx(req);
165*4882a593Smuzhiyun u8 *iv;
166*4882a593Smuzhiyun
167*4882a593Smuzhiyun /* Initialize the CTR block */
168*4882a593Smuzhiyun iv = rctx->rfc3686_iv;
169*4882a593Smuzhiyun memcpy(iv, ctx->u.aes.nonce, CTR_RFC3686_NONCE_SIZE);
170*4882a593Smuzhiyun
171*4882a593Smuzhiyun iv += CTR_RFC3686_NONCE_SIZE;
172*4882a593Smuzhiyun memcpy(iv, req->iv, CTR_RFC3686_IV_SIZE);
173*4882a593Smuzhiyun
174*4882a593Smuzhiyun iv += CTR_RFC3686_IV_SIZE;
175*4882a593Smuzhiyun *(__be32 *)iv = cpu_to_be32(1);
176*4882a593Smuzhiyun
177*4882a593Smuzhiyun /* Point to the new IV */
178*4882a593Smuzhiyun rctx->rfc3686_info = req->iv;
179*4882a593Smuzhiyun req->iv = rctx->rfc3686_iv;
180*4882a593Smuzhiyun
181*4882a593Smuzhiyun return ccp_aes_crypt(req, encrypt);
182*4882a593Smuzhiyun }
183*4882a593Smuzhiyun
ccp_aes_rfc3686_encrypt(struct skcipher_request * req)184*4882a593Smuzhiyun static int ccp_aes_rfc3686_encrypt(struct skcipher_request *req)
185*4882a593Smuzhiyun {
186*4882a593Smuzhiyun return ccp_aes_rfc3686_crypt(req, true);
187*4882a593Smuzhiyun }
188*4882a593Smuzhiyun
ccp_aes_rfc3686_decrypt(struct skcipher_request * req)189*4882a593Smuzhiyun static int ccp_aes_rfc3686_decrypt(struct skcipher_request *req)
190*4882a593Smuzhiyun {
191*4882a593Smuzhiyun return ccp_aes_rfc3686_crypt(req, false);
192*4882a593Smuzhiyun }
193*4882a593Smuzhiyun
ccp_aes_rfc3686_init_tfm(struct crypto_skcipher * tfm)194*4882a593Smuzhiyun static int ccp_aes_rfc3686_init_tfm(struct crypto_skcipher *tfm)
195*4882a593Smuzhiyun {
196*4882a593Smuzhiyun struct ccp_ctx *ctx = crypto_skcipher_ctx(tfm);
197*4882a593Smuzhiyun
198*4882a593Smuzhiyun ctx->complete = ccp_aes_rfc3686_complete;
199*4882a593Smuzhiyun ctx->u.aes.key_len = 0;
200*4882a593Smuzhiyun
201*4882a593Smuzhiyun crypto_skcipher_set_reqsize(tfm, sizeof(struct ccp_aes_req_ctx));
202*4882a593Smuzhiyun
203*4882a593Smuzhiyun return 0;
204*4882a593Smuzhiyun }
205*4882a593Smuzhiyun
206*4882a593Smuzhiyun static const struct skcipher_alg ccp_aes_defaults = {
207*4882a593Smuzhiyun .setkey = ccp_aes_setkey,
208*4882a593Smuzhiyun .encrypt = ccp_aes_encrypt,
209*4882a593Smuzhiyun .decrypt = ccp_aes_decrypt,
210*4882a593Smuzhiyun .min_keysize = AES_MIN_KEY_SIZE,
211*4882a593Smuzhiyun .max_keysize = AES_MAX_KEY_SIZE,
212*4882a593Smuzhiyun .init = ccp_aes_init_tfm,
213*4882a593Smuzhiyun
214*4882a593Smuzhiyun .base.cra_flags = CRYPTO_ALG_ASYNC |
215*4882a593Smuzhiyun CRYPTO_ALG_ALLOCATES_MEMORY |
216*4882a593Smuzhiyun CRYPTO_ALG_KERN_DRIVER_ONLY |
217*4882a593Smuzhiyun CRYPTO_ALG_NEED_FALLBACK,
218*4882a593Smuzhiyun .base.cra_blocksize = AES_BLOCK_SIZE,
219*4882a593Smuzhiyun .base.cra_ctxsize = sizeof(struct ccp_ctx),
220*4882a593Smuzhiyun .base.cra_priority = CCP_CRA_PRIORITY,
221*4882a593Smuzhiyun .base.cra_module = THIS_MODULE,
222*4882a593Smuzhiyun };
223*4882a593Smuzhiyun
224*4882a593Smuzhiyun static const struct skcipher_alg ccp_aes_rfc3686_defaults = {
225*4882a593Smuzhiyun .setkey = ccp_aes_rfc3686_setkey,
226*4882a593Smuzhiyun .encrypt = ccp_aes_rfc3686_encrypt,
227*4882a593Smuzhiyun .decrypt = ccp_aes_rfc3686_decrypt,
228*4882a593Smuzhiyun .min_keysize = AES_MIN_KEY_SIZE + CTR_RFC3686_NONCE_SIZE,
229*4882a593Smuzhiyun .max_keysize = AES_MAX_KEY_SIZE + CTR_RFC3686_NONCE_SIZE,
230*4882a593Smuzhiyun .init = ccp_aes_rfc3686_init_tfm,
231*4882a593Smuzhiyun
232*4882a593Smuzhiyun .base.cra_flags = CRYPTO_ALG_ASYNC |
233*4882a593Smuzhiyun CRYPTO_ALG_ALLOCATES_MEMORY |
234*4882a593Smuzhiyun CRYPTO_ALG_KERN_DRIVER_ONLY |
235*4882a593Smuzhiyun CRYPTO_ALG_NEED_FALLBACK,
236*4882a593Smuzhiyun .base.cra_blocksize = CTR_RFC3686_BLOCK_SIZE,
237*4882a593Smuzhiyun .base.cra_ctxsize = sizeof(struct ccp_ctx),
238*4882a593Smuzhiyun .base.cra_priority = CCP_CRA_PRIORITY,
239*4882a593Smuzhiyun .base.cra_module = THIS_MODULE,
240*4882a593Smuzhiyun };
241*4882a593Smuzhiyun
242*4882a593Smuzhiyun struct ccp_aes_def {
243*4882a593Smuzhiyun enum ccp_aes_mode mode;
244*4882a593Smuzhiyun unsigned int version;
245*4882a593Smuzhiyun const char *name;
246*4882a593Smuzhiyun const char *driver_name;
247*4882a593Smuzhiyun unsigned int blocksize;
248*4882a593Smuzhiyun unsigned int ivsize;
249*4882a593Smuzhiyun const struct skcipher_alg *alg_defaults;
250*4882a593Smuzhiyun };
251*4882a593Smuzhiyun
252*4882a593Smuzhiyun static struct ccp_aes_def aes_algs[] = {
253*4882a593Smuzhiyun {
254*4882a593Smuzhiyun .mode = CCP_AES_MODE_ECB,
255*4882a593Smuzhiyun .version = CCP_VERSION(3, 0),
256*4882a593Smuzhiyun .name = "ecb(aes)",
257*4882a593Smuzhiyun .driver_name = "ecb-aes-ccp",
258*4882a593Smuzhiyun .blocksize = AES_BLOCK_SIZE,
259*4882a593Smuzhiyun .ivsize = 0,
260*4882a593Smuzhiyun .alg_defaults = &ccp_aes_defaults,
261*4882a593Smuzhiyun },
262*4882a593Smuzhiyun {
263*4882a593Smuzhiyun .mode = CCP_AES_MODE_CBC,
264*4882a593Smuzhiyun .version = CCP_VERSION(3, 0),
265*4882a593Smuzhiyun .name = "cbc(aes)",
266*4882a593Smuzhiyun .driver_name = "cbc-aes-ccp",
267*4882a593Smuzhiyun .blocksize = AES_BLOCK_SIZE,
268*4882a593Smuzhiyun .ivsize = AES_BLOCK_SIZE,
269*4882a593Smuzhiyun .alg_defaults = &ccp_aes_defaults,
270*4882a593Smuzhiyun },
271*4882a593Smuzhiyun {
272*4882a593Smuzhiyun .mode = CCP_AES_MODE_CFB,
273*4882a593Smuzhiyun .version = CCP_VERSION(3, 0),
274*4882a593Smuzhiyun .name = "cfb(aes)",
275*4882a593Smuzhiyun .driver_name = "cfb-aes-ccp",
276*4882a593Smuzhiyun .blocksize = 1,
277*4882a593Smuzhiyun .ivsize = AES_BLOCK_SIZE,
278*4882a593Smuzhiyun .alg_defaults = &ccp_aes_defaults,
279*4882a593Smuzhiyun },
280*4882a593Smuzhiyun {
281*4882a593Smuzhiyun .mode = CCP_AES_MODE_OFB,
282*4882a593Smuzhiyun .version = CCP_VERSION(3, 0),
283*4882a593Smuzhiyun .name = "ofb(aes)",
284*4882a593Smuzhiyun .driver_name = "ofb-aes-ccp",
285*4882a593Smuzhiyun .blocksize = 1,
286*4882a593Smuzhiyun .ivsize = AES_BLOCK_SIZE,
287*4882a593Smuzhiyun .alg_defaults = &ccp_aes_defaults,
288*4882a593Smuzhiyun },
289*4882a593Smuzhiyun {
290*4882a593Smuzhiyun .mode = CCP_AES_MODE_CTR,
291*4882a593Smuzhiyun .version = CCP_VERSION(3, 0),
292*4882a593Smuzhiyun .name = "ctr(aes)",
293*4882a593Smuzhiyun .driver_name = "ctr-aes-ccp",
294*4882a593Smuzhiyun .blocksize = 1,
295*4882a593Smuzhiyun .ivsize = AES_BLOCK_SIZE,
296*4882a593Smuzhiyun .alg_defaults = &ccp_aes_defaults,
297*4882a593Smuzhiyun },
298*4882a593Smuzhiyun {
299*4882a593Smuzhiyun .mode = CCP_AES_MODE_CTR,
300*4882a593Smuzhiyun .version = CCP_VERSION(3, 0),
301*4882a593Smuzhiyun .name = "rfc3686(ctr(aes))",
302*4882a593Smuzhiyun .driver_name = "rfc3686-ctr-aes-ccp",
303*4882a593Smuzhiyun .blocksize = 1,
304*4882a593Smuzhiyun .ivsize = CTR_RFC3686_IV_SIZE,
305*4882a593Smuzhiyun .alg_defaults = &ccp_aes_rfc3686_defaults,
306*4882a593Smuzhiyun },
307*4882a593Smuzhiyun };
308*4882a593Smuzhiyun
ccp_register_aes_alg(struct list_head * head,const struct ccp_aes_def * def)309*4882a593Smuzhiyun static int ccp_register_aes_alg(struct list_head *head,
310*4882a593Smuzhiyun const struct ccp_aes_def *def)
311*4882a593Smuzhiyun {
312*4882a593Smuzhiyun struct ccp_crypto_skcipher_alg *ccp_alg;
313*4882a593Smuzhiyun struct skcipher_alg *alg;
314*4882a593Smuzhiyun int ret;
315*4882a593Smuzhiyun
316*4882a593Smuzhiyun ccp_alg = kzalloc(sizeof(*ccp_alg), GFP_KERNEL);
317*4882a593Smuzhiyun if (!ccp_alg)
318*4882a593Smuzhiyun return -ENOMEM;
319*4882a593Smuzhiyun
320*4882a593Smuzhiyun INIT_LIST_HEAD(&ccp_alg->entry);
321*4882a593Smuzhiyun
322*4882a593Smuzhiyun ccp_alg->mode = def->mode;
323*4882a593Smuzhiyun
324*4882a593Smuzhiyun /* Copy the defaults and override as necessary */
325*4882a593Smuzhiyun alg = &ccp_alg->alg;
326*4882a593Smuzhiyun *alg = *def->alg_defaults;
327*4882a593Smuzhiyun snprintf(alg->base.cra_name, CRYPTO_MAX_ALG_NAME, "%s", def->name);
328*4882a593Smuzhiyun snprintf(alg->base.cra_driver_name, CRYPTO_MAX_ALG_NAME, "%s",
329*4882a593Smuzhiyun def->driver_name);
330*4882a593Smuzhiyun alg->base.cra_blocksize = def->blocksize;
331*4882a593Smuzhiyun alg->ivsize = def->ivsize;
332*4882a593Smuzhiyun
333*4882a593Smuzhiyun ret = crypto_register_skcipher(alg);
334*4882a593Smuzhiyun if (ret) {
335*4882a593Smuzhiyun pr_err("%s skcipher algorithm registration error (%d)\n",
336*4882a593Smuzhiyun alg->base.cra_name, ret);
337*4882a593Smuzhiyun kfree(ccp_alg);
338*4882a593Smuzhiyun return ret;
339*4882a593Smuzhiyun }
340*4882a593Smuzhiyun
341*4882a593Smuzhiyun list_add(&ccp_alg->entry, head);
342*4882a593Smuzhiyun
343*4882a593Smuzhiyun return 0;
344*4882a593Smuzhiyun }
345*4882a593Smuzhiyun
ccp_register_aes_algs(struct list_head * head)346*4882a593Smuzhiyun int ccp_register_aes_algs(struct list_head *head)
347*4882a593Smuzhiyun {
348*4882a593Smuzhiyun int i, ret;
349*4882a593Smuzhiyun unsigned int ccpversion = ccp_version();
350*4882a593Smuzhiyun
351*4882a593Smuzhiyun for (i = 0; i < ARRAY_SIZE(aes_algs); i++) {
352*4882a593Smuzhiyun if (aes_algs[i].version > ccpversion)
353*4882a593Smuzhiyun continue;
354*4882a593Smuzhiyun ret = ccp_register_aes_alg(head, &aes_algs[i]);
355*4882a593Smuzhiyun if (ret)
356*4882a593Smuzhiyun return ret;
357*4882a593Smuzhiyun }
358*4882a593Smuzhiyun
359*4882a593Smuzhiyun return 0;
360*4882a593Smuzhiyun }
361