2 * CMAC: Cipher Block Mode for Authentication
4 * Copyright © 2013 Jussi Kivilinna <jussi.kivilinna@iki.fi>
7 * Copyright © 2013 Tom St Denis <tstdenis@elliptictech.com>
8 * Based on crypto/xcbc.c:
9 * Copyright © 2006 USAGI/WIDE Project,
10 * Author: Kazunori Miyazawa <miyazawa@linux-ipv6.org>
12 * This program is free software; you can redistribute it and/or modify
13 * it under the terms of the GNU General Public License as published by
14 * the Free Software Foundation; either version 2 of the License, or
15 * (at your option) any later version.
19 #include <crypto/internal/hash.h>
20 #include <linux/err.h>
21 #include <linux/kernel.h>
22 #include <linux/module.h>
25 * +------------------------
27 * +------------------------
29 * +------------------------
30 * | consts (block size * 2)
31 * +------------------------
34 struct crypto_cipher
*child
;
39 * +------------------------
41 * +------------------------
43 * +------------------------
45 * +------------------------
47 * +------------------------
49 struct cmac_desc_ctx
{
54 static int crypto_cmac_digest_setkey(struct crypto_shash
*parent
,
55 const u8
*inkey
, unsigned int keylen
)
57 unsigned long alignmask
= crypto_shash_alignmask(parent
);
58 struct cmac_tfm_ctx
*ctx
= crypto_shash_ctx(parent
);
59 unsigned int bs
= crypto_shash_blocksize(parent
);
60 __be64
*consts
= PTR_ALIGN((void *)ctx
->ctx
,
61 (alignmask
| (__alignof__(__be64
) - 1)) + 1);
66 err
= crypto_cipher_setkey(ctx
->child
, inkey
, keylen
);
70 /* encrypt the zero block */
71 memset(consts
, 0, bs
);
72 crypto_cipher_encrypt_one(ctx
->child
, (u8
*)consts
, (u8
*)consts
);
77 _const
[0] = be64_to_cpu(consts
[1]);
78 _const
[1] = be64_to_cpu(consts
[0]);
80 /* gf(2^128) multiply zero-ciphertext with u and u^2 */
81 for (i
= 0; i
< 4; i
+= 2) {
82 msb_mask
= ((s64
)_const
[1] >> 63) & gfmask
;
83 _const
[1] = (_const
[1] << 1) | (_const
[0] >> 63);
84 _const
[0] = (_const
[0] << 1) ^ msb_mask
;
86 consts
[i
+ 0] = cpu_to_be64(_const
[1]);
87 consts
[i
+ 1] = cpu_to_be64(_const
[0]);
93 _const
[0] = be64_to_cpu(consts
[0]);
95 /* gf(2^64) multiply zero-ciphertext with u and u^2 */
96 for (i
= 0; i
< 2; i
++) {
97 msb_mask
= ((s64
)_const
[0] >> 63) & gfmask
;
98 _const
[0] = (_const
[0] << 1) ^ msb_mask
;
100 consts
[i
] = cpu_to_be64(_const
[0]);
109 static int crypto_cmac_digest_init(struct shash_desc
*pdesc
)
111 unsigned long alignmask
= crypto_shash_alignmask(pdesc
->tfm
);
112 struct cmac_desc_ctx
*ctx
= shash_desc_ctx(pdesc
);
113 int bs
= crypto_shash_blocksize(pdesc
->tfm
);
114 u8
*prev
= PTR_ALIGN((void *)ctx
->ctx
, alignmask
+ 1) + bs
;
122 static int crypto_cmac_digest_update(struct shash_desc
*pdesc
, const u8
*p
,
125 struct crypto_shash
*parent
= pdesc
->tfm
;
126 unsigned long alignmask
= crypto_shash_alignmask(parent
);
127 struct cmac_tfm_ctx
*tctx
= crypto_shash_ctx(parent
);
128 struct cmac_desc_ctx
*ctx
= shash_desc_ctx(pdesc
);
129 struct crypto_cipher
*tfm
= tctx
->child
;
130 int bs
= crypto_shash_blocksize(parent
);
131 u8
*odds
= PTR_ALIGN((void *)ctx
->ctx
, alignmask
+ 1);
132 u8
*prev
= odds
+ bs
;
134 /* checking the data can fill the block */
135 if ((ctx
->len
+ len
) <= bs
) {
136 memcpy(odds
+ ctx
->len
, p
, len
);
141 /* filling odds with new data and encrypting it */
142 memcpy(odds
+ ctx
->len
, p
, bs
- ctx
->len
);
143 len
-= bs
- ctx
->len
;
146 crypto_xor(prev
, odds
, bs
);
147 crypto_cipher_encrypt_one(tfm
, prev
, prev
);
149 /* clearing the length */
152 /* encrypting the rest of data */
154 crypto_xor(prev
, p
, bs
);
155 crypto_cipher_encrypt_one(tfm
, prev
, prev
);
160 /* keeping the surplus of blocksize */
162 memcpy(odds
, p
, len
);
169 static int crypto_cmac_digest_final(struct shash_desc
*pdesc
, u8
*out
)
171 struct crypto_shash
*parent
= pdesc
->tfm
;
172 unsigned long alignmask
= crypto_shash_alignmask(parent
);
173 struct cmac_tfm_ctx
*tctx
= crypto_shash_ctx(parent
);
174 struct cmac_desc_ctx
*ctx
= shash_desc_ctx(pdesc
);
175 struct crypto_cipher
*tfm
= tctx
->child
;
176 int bs
= crypto_shash_blocksize(parent
);
177 u8
*consts
= PTR_ALIGN((void *)tctx
->ctx
,
178 (alignmask
| (__alignof__(__be64
) - 1)) + 1);
179 u8
*odds
= PTR_ALIGN((void *)ctx
->ctx
, alignmask
+ 1);
180 u8
*prev
= odds
+ bs
;
181 unsigned int offset
= 0;
183 if (ctx
->len
!= bs
) {
185 u8
*p
= odds
+ ctx
->len
;
190 rlen
= bs
- ctx
->len
- 1;
197 crypto_xor(prev
, odds
, bs
);
198 crypto_xor(prev
, consts
+ offset
, bs
);
200 crypto_cipher_encrypt_one(tfm
, out
, prev
);
205 static int cmac_init_tfm(struct crypto_tfm
*tfm
)
207 struct crypto_cipher
*cipher
;
208 struct crypto_instance
*inst
= (void *)tfm
->__crt_alg
;
209 struct crypto_spawn
*spawn
= crypto_instance_ctx(inst
);
210 struct cmac_tfm_ctx
*ctx
= crypto_tfm_ctx(tfm
);
212 cipher
= crypto_spawn_cipher(spawn
);
214 return PTR_ERR(cipher
);
221 static void cmac_exit_tfm(struct crypto_tfm
*tfm
)
223 struct cmac_tfm_ctx
*ctx
= crypto_tfm_ctx(tfm
);
224 crypto_free_cipher(ctx
->child
);
227 static int cmac_create(struct crypto_template
*tmpl
, struct rtattr
**tb
)
229 struct shash_instance
*inst
;
230 struct crypto_alg
*alg
;
231 unsigned long alignmask
;
234 err
= crypto_check_attr_type(tb
, CRYPTO_ALG_TYPE_SHASH
);
238 alg
= crypto_get_attr_alg(tb
, CRYPTO_ALG_TYPE_CIPHER
,
239 CRYPTO_ALG_TYPE_MASK
);
243 switch (alg
->cra_blocksize
) {
252 inst
= shash_alloc_instance("cmac", alg
);
257 err
= crypto_init_spawn(shash_instance_ctx(inst
), alg
,
258 shash_crypto_instance(inst
),
259 CRYPTO_ALG_TYPE_MASK
);
263 alignmask
= alg
->cra_alignmask
;
264 inst
->alg
.base
.cra_alignmask
= alignmask
;
265 inst
->alg
.base
.cra_priority
= alg
->cra_priority
;
266 inst
->alg
.base
.cra_blocksize
= alg
->cra_blocksize
;
268 inst
->alg
.digestsize
= alg
->cra_blocksize
;
270 ALIGN(sizeof(struct cmac_desc_ctx
), crypto_tfm_ctx_alignment())
271 + (alignmask
& ~(crypto_tfm_ctx_alignment() - 1))
272 + alg
->cra_blocksize
* 2;
274 inst
->alg
.base
.cra_ctxsize
=
275 ALIGN(sizeof(struct cmac_tfm_ctx
), crypto_tfm_ctx_alignment())
276 + ((alignmask
| (__alignof__(__be64
) - 1)) &
277 ~(crypto_tfm_ctx_alignment() - 1))
278 + alg
->cra_blocksize
* 2;
280 inst
->alg
.base
.cra_init
= cmac_init_tfm
;
281 inst
->alg
.base
.cra_exit
= cmac_exit_tfm
;
283 inst
->alg
.init
= crypto_cmac_digest_init
;
284 inst
->alg
.update
= crypto_cmac_digest_update
;
285 inst
->alg
.final
= crypto_cmac_digest_final
;
286 inst
->alg
.setkey
= crypto_cmac_digest_setkey
;
288 err
= shash_register_instance(tmpl
, inst
);
291 shash_free_instance(shash_crypto_instance(inst
));
299 static struct crypto_template crypto_cmac_tmpl
= {
301 .create
= cmac_create
,
302 .free
= shash_free_instance
,
303 .module
= THIS_MODULE
,
306 static int __init
crypto_cmac_module_init(void)
308 return crypto_register_template(&crypto_cmac_tmpl
);
311 static void __exit
crypto_cmac_module_exit(void)
313 crypto_unregister_template(&crypto_cmac_tmpl
);
316 module_init(crypto_cmac_module_init
);
317 module_exit(crypto_cmac_module_exit
);
319 MODULE_LICENSE("GPL");
320 MODULE_DESCRIPTION("CMAC keyed hash algorithm");
321 MODULE_ALIAS_CRYPTO("cmac");