2 * GHASH: digest algorithm for GCM (Galois/Counter Mode).
4 * Copyright (c) 2007 Nokia Siemens Networks - Mikko Herranen <mh1@iki.fi>
5 * Copyright (c) 2009 Intel Corp.
6 * Author: Huang Ying <ying.huang@intel.com>
8 * The algorithm implementation is copied from gcm.c.
10 * This program is free software; you can redistribute it and/or modify it
11 * under the terms of the GNU General Public License version 2 as published
12 * by the Free Software Foundation.
15 #include <crypto/algapi.h>
16 #include <crypto/gf128mul.h>
17 #include <crypto/internal/hash.h>
18 #include <linux/crypto.h>
19 #include <linux/init.h>
20 #include <linux/kernel.h>
21 #include <linux/module.h>
23 #define GHASH_BLOCK_SIZE 16
24 #define GHASH_DIGEST_SIZE 16
27 struct gf128mul_4k
*gf128
;
30 struct ghash_desc_ctx
{
31 u8 buffer
[GHASH_BLOCK_SIZE
];
35 static int ghash_init(struct shash_desc
*desc
)
37 struct ghash_desc_ctx
*dctx
= shash_desc_ctx(desc
);
39 memset(dctx
, 0, sizeof(*dctx
));
44 static int ghash_setkey(struct crypto_shash
*tfm
,
45 const u8
*key
, unsigned int keylen
)
47 struct ghash_ctx
*ctx
= crypto_shash_ctx(tfm
);
49 if (keylen
!= GHASH_BLOCK_SIZE
) {
50 crypto_shash_set_flags(tfm
, CRYPTO_TFM_RES_BAD_KEY_LEN
);
55 gf128mul_free_4k(ctx
->gf128
);
56 ctx
->gf128
= gf128mul_init_4k_lle((be128
*)key
);
63 static int ghash_update(struct shash_desc
*desc
,
64 const u8
*src
, unsigned int srclen
)
66 struct ghash_desc_ctx
*dctx
= shash_desc_ctx(desc
);
67 struct ghash_ctx
*ctx
= crypto_shash_ctx(desc
->tfm
);
68 u8
*dst
= dctx
->buffer
;
71 int n
= min(srclen
, dctx
->bytes
);
72 u8
*pos
= dst
+ (GHASH_BLOCK_SIZE
- dctx
->bytes
);
81 gf128mul_4k_lle((be128
*)dst
, ctx
->gf128
);
84 while (srclen
>= GHASH_BLOCK_SIZE
) {
85 crypto_xor(dst
, src
, GHASH_BLOCK_SIZE
);
86 gf128mul_4k_lle((be128
*)dst
, ctx
->gf128
);
87 src
+= GHASH_BLOCK_SIZE
;
88 srclen
-= GHASH_BLOCK_SIZE
;
92 dctx
->bytes
= GHASH_BLOCK_SIZE
- srclen
;
100 static void ghash_flush(struct ghash_ctx
*ctx
, struct ghash_desc_ctx
*dctx
)
102 u8
*dst
= dctx
->buffer
;
105 u8
*tmp
= dst
+ (GHASH_BLOCK_SIZE
- dctx
->bytes
);
107 while (dctx
->bytes
--)
110 gf128mul_4k_lle((be128
*)dst
, ctx
->gf128
);
116 static int ghash_final(struct shash_desc
*desc
, u8
*dst
)
118 struct ghash_desc_ctx
*dctx
= shash_desc_ctx(desc
);
119 struct ghash_ctx
*ctx
= crypto_shash_ctx(desc
->tfm
);
120 u8
*buf
= dctx
->buffer
;
122 ghash_flush(ctx
, dctx
);
123 memcpy(dst
, buf
, GHASH_BLOCK_SIZE
);
128 static void ghash_exit_tfm(struct crypto_tfm
*tfm
)
130 struct ghash_ctx
*ctx
= crypto_tfm_ctx(tfm
);
132 gf128mul_free_4k(ctx
->gf128
);
135 static struct shash_alg ghash_alg
= {
136 .digestsize
= GHASH_DIGEST_SIZE
,
138 .update
= ghash_update
,
139 .final
= ghash_final
,
140 .setkey
= ghash_setkey
,
141 .descsize
= sizeof(struct ghash_desc_ctx
),
144 .cra_driver_name
= "ghash-generic",
146 .cra_flags
= CRYPTO_ALG_TYPE_SHASH
,
147 .cra_blocksize
= GHASH_BLOCK_SIZE
,
148 .cra_ctxsize
= sizeof(struct ghash_ctx
),
149 .cra_module
= THIS_MODULE
,
150 .cra_list
= LIST_HEAD_INIT(ghash_alg
.base
.cra_list
),
151 .cra_exit
= ghash_exit_tfm
,
155 static int __init
ghash_mod_init(void)
157 return crypto_register_shash(&ghash_alg
);
160 static void __exit
ghash_mod_exit(void)
162 crypto_unregister_shash(&ghash_alg
);
165 module_init(ghash_mod_init
);
166 module_exit(ghash_mod_exit
);
168 MODULE_LICENSE("GPL");
169 MODULE_DESCRIPTION("GHASH Message Digest Algorithm");
170 MODULE_ALIAS("ghash");