2 * AMD Cryptographic Coprocessor (CCP) AES CMAC crypto API support
4 * Copyright (C) 2013 Advanced Micro Devices, Inc.
6 * Author: Tom Lendacky <thomas.lendacky@amd.com>
8 * This program is free software; you can redistribute it and/or modify
9 * it under the terms of the GNU General Public License version 2 as
10 * published by the Free Software Foundation.
13 #include <linux/module.h>
14 #include <linux/sched.h>
15 #include <linux/delay.h>
16 #include <linux/scatterlist.h>
17 #include <linux/crypto.h>
18 #include <crypto/algapi.h>
19 #include <crypto/aes.h>
20 #include <crypto/hash.h>
21 #include <crypto/internal/hash.h>
22 #include <crypto/scatterwalk.h>
24 #include "ccp-crypto.h"
26 static int ccp_aes_cmac_complete(struct crypto_async_request
*async_req
,
29 struct ahash_request
*req
= ahash_request_cast(async_req
);
30 struct crypto_ahash
*tfm
= crypto_ahash_reqtfm(req
);
31 struct ccp_aes_cmac_req_ctx
*rctx
= ahash_request_ctx(req
);
32 unsigned int digest_size
= crypto_ahash_digestsize(tfm
);
38 /* Save remaining data to buffer */
39 unsigned int offset
= rctx
->nbytes
- rctx
->hash_rem
;
41 scatterwalk_map_and_copy(rctx
->buf
, rctx
->src
,
42 offset
, rctx
->hash_rem
, 0);
43 rctx
->buf_count
= rctx
->hash_rem
;
48 /* Update result area if supplied */
50 memcpy(req
->result
, rctx
->iv
, digest_size
);
53 sg_free_table(&rctx
->data_sg
);
58 static int ccp_do_cmac_update(struct ahash_request
*req
, unsigned int nbytes
,
61 struct crypto_ahash
*tfm
= crypto_ahash_reqtfm(req
);
62 struct ccp_ctx
*ctx
= crypto_ahash_ctx(tfm
);
63 struct ccp_aes_cmac_req_ctx
*rctx
= ahash_request_ctx(req
);
64 struct scatterlist
*sg
, *cmac_key_sg
= NULL
;
65 unsigned int block_size
=
66 crypto_tfm_alg_blocksize(crypto_ahash_tfm(tfm
));
67 unsigned int need_pad
, sg_count
;
72 if (!ctx
->u
.aes
.key_len
)
78 len
= (u64
)rctx
->buf_count
+ (u64
)nbytes
;
80 if (!final
&& (len
<= block_size
)) {
81 scatterwalk_map_and_copy(rctx
->buf
+ rctx
->buf_count
, req
->src
,
83 rctx
->buf_count
+= nbytes
;
89 rctx
->nbytes
= nbytes
;
92 rctx
->hash_rem
= final
? 0 : len
& (block_size
- 1);
93 rctx
->hash_cnt
= len
- rctx
->hash_rem
;
94 if (!final
&& !rctx
->hash_rem
) {
95 /* CCP can't do zero length final, so keep some data around */
96 rctx
->hash_cnt
-= block_size
;
97 rctx
->hash_rem
= block_size
;
100 if (final
&& (rctx
->null_msg
|| (len
& (block_size
- 1))))
105 sg_init_one(&rctx
->iv_sg
, rctx
->iv
, sizeof(rctx
->iv
));
107 /* Build the data scatterlist table - allocate enough entries for all
108 * possible data pieces (buffer, input data, padding)
110 sg_count
= (nbytes
) ? sg_nents(req
->src
) + 2 : 2;
111 gfp
= req
->base
.flags
& CRYPTO_TFM_REQ_MAY_SLEEP
?
112 GFP_KERNEL
: GFP_ATOMIC
;
113 ret
= sg_alloc_table(&rctx
->data_sg
, sg_count
, gfp
);
118 if (rctx
->buf_count
) {
119 sg_init_one(&rctx
->buf_sg
, rctx
->buf
, rctx
->buf_count
);
120 sg
= ccp_crypto_sg_table_add(&rctx
->data_sg
, &rctx
->buf_sg
);
128 sg
= ccp_crypto_sg_table_add(&rctx
->data_sg
, req
->src
);
136 int pad_length
= block_size
- (len
& (block_size
- 1));
138 rctx
->hash_cnt
+= pad_length
;
140 memset(rctx
->pad
, 0, sizeof(rctx
->pad
));
142 sg_init_one(&rctx
->pad_sg
, rctx
->pad
, pad_length
);
143 sg
= ccp_crypto_sg_table_add(&rctx
->data_sg
, &rctx
->pad_sg
);
151 sg
= rctx
->data_sg
.sgl
;
154 /* Initialize the K1/K2 scatterlist */
156 cmac_key_sg
= (need_pad
) ? &ctx
->u
.aes
.k2_sg
159 memset(&rctx
->cmd
, 0, sizeof(rctx
->cmd
));
160 INIT_LIST_HEAD(&rctx
->cmd
.entry
);
161 rctx
->cmd
.engine
= CCP_ENGINE_AES
;
162 rctx
->cmd
.u
.aes
.type
= ctx
->u
.aes
.type
;
163 rctx
->cmd
.u
.aes
.mode
= ctx
->u
.aes
.mode
;
164 rctx
->cmd
.u
.aes
.action
= CCP_AES_ACTION_ENCRYPT
;
165 rctx
->cmd
.u
.aes
.key
= &ctx
->u
.aes
.key_sg
;
166 rctx
->cmd
.u
.aes
.key_len
= ctx
->u
.aes
.key_len
;
167 rctx
->cmd
.u
.aes
.iv
= &rctx
->iv_sg
;
168 rctx
->cmd
.u
.aes
.iv_len
= AES_BLOCK_SIZE
;
169 rctx
->cmd
.u
.aes
.src
= sg
;
170 rctx
->cmd
.u
.aes
.src_len
= rctx
->hash_cnt
;
171 rctx
->cmd
.u
.aes
.dst
= NULL
;
172 rctx
->cmd
.u
.aes
.cmac_key
= cmac_key_sg
;
173 rctx
->cmd
.u
.aes
.cmac_key_len
= ctx
->u
.aes
.kn_len
;
174 rctx
->cmd
.u
.aes
.cmac_final
= final
;
176 ret
= ccp_crypto_enqueue_request(&req
->base
, &rctx
->cmd
);
181 sg_free_table(&rctx
->data_sg
);
186 static int ccp_aes_cmac_init(struct ahash_request
*req
)
188 struct ccp_aes_cmac_req_ctx
*rctx
= ahash_request_ctx(req
);
190 memset(rctx
, 0, sizeof(*rctx
));
197 static int ccp_aes_cmac_update(struct ahash_request
*req
)
199 return ccp_do_cmac_update(req
, req
->nbytes
, 0);
202 static int ccp_aes_cmac_final(struct ahash_request
*req
)
204 return ccp_do_cmac_update(req
, 0, 1);
207 static int ccp_aes_cmac_finup(struct ahash_request
*req
)
209 return ccp_do_cmac_update(req
, req
->nbytes
, 1);
212 static int ccp_aes_cmac_digest(struct ahash_request
*req
)
216 ret
= ccp_aes_cmac_init(req
);
220 return ccp_aes_cmac_finup(req
);
223 static int ccp_aes_cmac_setkey(struct crypto_ahash
*tfm
, const u8
*key
,
224 unsigned int key_len
)
226 struct ccp_ctx
*ctx
= crypto_tfm_ctx(crypto_ahash_tfm(tfm
));
227 struct ccp_crypto_ahash_alg
*alg
=
228 ccp_crypto_ahash_alg(crypto_ahash_tfm(tfm
));
229 u64 k0_hi
, k0_lo
, k1_hi
, k1_lo
, k2_hi
, k2_lo
;
230 u64 rb_hi
= 0x00, rb_lo
= 0x87;
235 case AES_KEYSIZE_128
:
236 ctx
->u
.aes
.type
= CCP_AES_TYPE_128
;
238 case AES_KEYSIZE_192
:
239 ctx
->u
.aes
.type
= CCP_AES_TYPE_192
;
241 case AES_KEYSIZE_256
:
242 ctx
->u
.aes
.type
= CCP_AES_TYPE_256
;
245 crypto_ahash_set_flags(tfm
, CRYPTO_TFM_RES_BAD_KEY_LEN
);
248 ctx
->u
.aes
.mode
= alg
->mode
;
250 /* Set to zero until complete */
251 ctx
->u
.aes
.key_len
= 0;
253 /* Set the key for the AES cipher used to generate the keys */
254 ret
= crypto_cipher_setkey(ctx
->u
.aes
.tfm_cipher
, key
, key_len
);
258 /* Encrypt a block of zeroes - use key area in context */
259 memset(ctx
->u
.aes
.key
, 0, sizeof(ctx
->u
.aes
.key
));
260 crypto_cipher_encrypt_one(ctx
->u
.aes
.tfm_cipher
, ctx
->u
.aes
.key
,
263 /* Generate K1 and K2 */
264 k0_hi
= be64_to_cpu(*((__be64
*)ctx
->u
.aes
.key
));
265 k0_lo
= be64_to_cpu(*((__be64
*)ctx
->u
.aes
.key
+ 1));
267 k1_hi
= (k0_hi
<< 1) | (k0_lo
>> 63);
269 if (ctx
->u
.aes
.key
[0] & 0x80) {
273 gk
= (__be64
*)ctx
->u
.aes
.k1
;
274 *gk
= cpu_to_be64(k1_hi
);
276 *gk
= cpu_to_be64(k1_lo
);
278 k2_hi
= (k1_hi
<< 1) | (k1_lo
>> 63);
280 if (ctx
->u
.aes
.k1
[0] & 0x80) {
284 gk
= (__be64
*)ctx
->u
.aes
.k2
;
285 *gk
= cpu_to_be64(k2_hi
);
287 *gk
= cpu_to_be64(k2_lo
);
289 ctx
->u
.aes
.kn_len
= sizeof(ctx
->u
.aes
.k1
);
290 sg_init_one(&ctx
->u
.aes
.k1_sg
, ctx
->u
.aes
.k1
, sizeof(ctx
->u
.aes
.k1
));
291 sg_init_one(&ctx
->u
.aes
.k2_sg
, ctx
->u
.aes
.k2
, sizeof(ctx
->u
.aes
.k2
));
293 /* Save the supplied key */
294 memset(ctx
->u
.aes
.key
, 0, sizeof(ctx
->u
.aes
.key
));
295 memcpy(ctx
->u
.aes
.key
, key
, key_len
);
296 ctx
->u
.aes
.key_len
= key_len
;
297 sg_init_one(&ctx
->u
.aes
.key_sg
, ctx
->u
.aes
.key
, key_len
);
302 static int ccp_aes_cmac_cra_init(struct crypto_tfm
*tfm
)
304 struct ccp_ctx
*ctx
= crypto_tfm_ctx(tfm
);
305 struct crypto_ahash
*ahash
= __crypto_ahash_cast(tfm
);
306 struct crypto_cipher
*cipher_tfm
;
308 ctx
->complete
= ccp_aes_cmac_complete
;
309 ctx
->u
.aes
.key_len
= 0;
311 crypto_ahash_set_reqsize(ahash
, sizeof(struct ccp_aes_cmac_req_ctx
));
313 cipher_tfm
= crypto_alloc_cipher("aes", 0,
315 CRYPTO_ALG_NEED_FALLBACK
);
316 if (IS_ERR(cipher_tfm
)) {
317 pr_warn("could not load aes cipher driver\n");
318 return PTR_ERR(cipher_tfm
);
320 ctx
->u
.aes
.tfm_cipher
= cipher_tfm
;
325 static void ccp_aes_cmac_cra_exit(struct crypto_tfm
*tfm
)
327 struct ccp_ctx
*ctx
= crypto_tfm_ctx(tfm
);
329 if (ctx
->u
.aes
.tfm_cipher
)
330 crypto_free_cipher(ctx
->u
.aes
.tfm_cipher
);
331 ctx
->u
.aes
.tfm_cipher
= NULL
;
334 int ccp_register_aes_cmac_algs(struct list_head
*head
)
336 struct ccp_crypto_ahash_alg
*ccp_alg
;
337 struct ahash_alg
*alg
;
338 struct hash_alg_common
*halg
;
339 struct crypto_alg
*base
;
342 ccp_alg
= kzalloc(sizeof(*ccp_alg
), GFP_KERNEL
);
346 INIT_LIST_HEAD(&ccp_alg
->entry
);
347 ccp_alg
->mode
= CCP_AES_MODE_CMAC
;
350 alg
->init
= ccp_aes_cmac_init
;
351 alg
->update
= ccp_aes_cmac_update
;
352 alg
->final
= ccp_aes_cmac_final
;
353 alg
->finup
= ccp_aes_cmac_finup
;
354 alg
->digest
= ccp_aes_cmac_digest
;
355 alg
->setkey
= ccp_aes_cmac_setkey
;
358 halg
->digestsize
= AES_BLOCK_SIZE
;
361 snprintf(base
->cra_name
, CRYPTO_MAX_ALG_NAME
, "cmac(aes)");
362 snprintf(base
->cra_driver_name
, CRYPTO_MAX_ALG_NAME
, "cmac-aes-ccp");
363 base
->cra_flags
= CRYPTO_ALG_TYPE_AHASH
| CRYPTO_ALG_ASYNC
|
364 CRYPTO_ALG_KERN_DRIVER_ONLY
|
365 CRYPTO_ALG_NEED_FALLBACK
;
366 base
->cra_blocksize
= AES_BLOCK_SIZE
;
367 base
->cra_ctxsize
= sizeof(struct ccp_ctx
);
368 base
->cra_priority
= CCP_CRA_PRIORITY
;
369 base
->cra_type
= &crypto_ahash_type
;
370 base
->cra_init
= ccp_aes_cmac_cra_init
;
371 base
->cra_exit
= ccp_aes_cmac_cra_exit
;
372 base
->cra_module
= THIS_MODULE
;
374 ret
= crypto_register_ahash(alg
);
376 pr_err("%s ahash algorithm registration error (%d)\n",
377 base
->cra_name
, ret
);
382 list_add(&ccp_alg
->entry
, head
);