summaryrefslogtreecommitdiffstats
path: root/crypto
diff options
context:
space:
mode:
authorAlexander Boyko <alexander_boyko@xyratex.com>2013-01-10 09:54:59 -0500
committerHerbert Xu <herbert@gondor.apana.org.au>2013-01-19 18:16:45 -0500
commit78c37d191dd6899d8c219fee597a17d6e3c5d288 (patch)
tree123ed7322996e4e4a6922791d6e3a674ffc05cba /crypto
parent5c22ba6619796da82ea0aa18c72caf4fe003a329 (diff)
crypto: crc32 - add crc32 pclmulqdq implementation and wrappers for table implementation
This patch adds crc32 algorithms to shash crypto api. One is wrapper to gerneric crc32_le function. Second is crc32 pclmulqdq implementation. It use hardware provided PCLMULQDQ instruction to accelerate the CRC32 disposal. This instruction present from Intel Westmere and AMD Bulldozer CPUs. For intel core i5 I got 450MB/s for table implementation and 2100MB/s for pclmulqdq implementation. Signed-off-by: Alexander Boyko <alexander_boyko@xyratex.com> Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
Diffstat (limited to 'crypto')
-rw-r--r--crypto/Kconfig21
-rw-r--r--crypto/Makefile1
-rw-r--r--crypto/crc32.c158
3 files changed, 180 insertions, 0 deletions
diff --git a/crypto/Kconfig b/crypto/Kconfig
index 4641d95651d3..e8b51e068179 100644
--- a/crypto/Kconfig
+++ b/crypto/Kconfig
@@ -355,6 +355,27 @@ config CRYPTO_CRC32C_SPARC64
355 CRC32c CRC algorithm implemented using sparc64 crypto instructions, 355 CRC32c CRC algorithm implemented using sparc64 crypto instructions,
356 when available. 356 when available.
357 357
358config CRYPTO_CRC32
359 tristate "CRC32 CRC algorithm"
360 select CRYPTO_HASH
361 select CRC32
362 help
363 CRC-32-IEEE 802.3 cyclic redundancy-check algorithm.
364 Shash crypto api wrappers to crc32_le function.
365
366config CRYPTO_CRC32_PCLMUL
367 tristate "CRC32 PCLMULQDQ hardware acceleration"
368 depends on X86
369 select CRYPTO_HASH
370 select CRC32
371 help
372 From Intel Westmere and AMD Bulldozer processor with SSE4.2
373 and PCLMULQDQ supported, the processor will support
374 CRC32 PCLMULQDQ implementation using hardware accelerated PCLMULQDQ
375 instruction. This option will create 'crc32-plcmul' module,
376 which will enable any routine to use the CRC-32-IEEE 802.3 checksum
377 and gain better performance as compared with the table implementation.
378
358config CRYPTO_GHASH 379config CRYPTO_GHASH
359 tristate "GHASH digest algorithm" 380 tristate "GHASH digest algorithm"
360 select CRYPTO_GF128MUL 381 select CRYPTO_GF128MUL
diff --git a/crypto/Makefile b/crypto/Makefile
index d59dec749804..be1a1bebbb86 100644
--- a/crypto/Makefile
+++ b/crypto/Makefile
@@ -81,6 +81,7 @@ obj-$(CONFIG_CRYPTO_DEFLATE) += deflate.o
81obj-$(CONFIG_CRYPTO_ZLIB) += zlib.o 81obj-$(CONFIG_CRYPTO_ZLIB) += zlib.o
82obj-$(CONFIG_CRYPTO_MICHAEL_MIC) += michael_mic.o 82obj-$(CONFIG_CRYPTO_MICHAEL_MIC) += michael_mic.o
83obj-$(CONFIG_CRYPTO_CRC32C) += crc32c.o 83obj-$(CONFIG_CRYPTO_CRC32C) += crc32c.o
84obj-$(CONFIG_CRYPTO_CRC32) += crc32.o
84obj-$(CONFIG_CRYPTO_AUTHENC) += authenc.o authencesn.o 85obj-$(CONFIG_CRYPTO_AUTHENC) += authenc.o authencesn.o
85obj-$(CONFIG_CRYPTO_LZO) += lzo.o 86obj-$(CONFIG_CRYPTO_LZO) += lzo.o
86obj-$(CONFIG_CRYPTO_842) += 842.o 87obj-$(CONFIG_CRYPTO_842) += 842.o
diff --git a/crypto/crc32.c b/crypto/crc32.c
new file mode 100644
index 000000000000..9d1c41569898
--- /dev/null
+++ b/crypto/crc32.c
@@ -0,0 +1,158 @@
1/* GPL HEADER START
2 *
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4 *
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License version 2 only,
7 * as published by the Free Software Foundation.
8 *
9 * This program is distributed in the hope that it will be useful, but
10 * WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 * General Public License version 2 for more details (a copy is included
13 * in the LICENSE file that accompanied this code).
14 *
15 * You should have received a copy of the GNU General Public License
16 * version 2 along with this program; If not, see http://www.gnu.org/licenses
17 *
18 * Please visit http://www.xyratex.com/contact if you need additional
19 * information or have any questions.
20 *
21 * GPL HEADER END
22 */
23
24/*
25 * Copyright 2012 Xyratex Technology Limited
26 */
27
28/*
29 * This is crypto api shash wrappers to crc32_le.
30 */
31
32#include <linux/crc32.h>
33#include <crypto/internal/hash.h>
34#include <linux/init.h>
35#include <linux/module.h>
36#include <linux/string.h>
37#include <linux/kernel.h>
38
39#define CHKSUM_BLOCK_SIZE 1
40#define CHKSUM_DIGEST_SIZE 4
41
42static u32 __crc32_le(u32 crc, unsigned char const *p, size_t len)
43{
44 return crc32_le(crc, p, len);
45}
46
47/** No default init with ~0 */
48static int crc32_cra_init(struct crypto_tfm *tfm)
49{
50 u32 *key = crypto_tfm_ctx(tfm);
51
52 *key = 0;
53
54 return 0;
55}
56
57
58/*
59 * Setting the seed allows arbitrary accumulators and flexible XOR policy
60 * If your algorithm starts with ~0, then XOR with ~0 before you set
61 * the seed.
62 */
63static int crc32_setkey(struct crypto_shash *hash, const u8 *key,
64 unsigned int keylen)
65{
66 u32 *mctx = crypto_shash_ctx(hash);
67
68 if (keylen != sizeof(u32)) {
69 crypto_shash_set_flags(hash, CRYPTO_TFM_RES_BAD_KEY_LEN);
70 return -EINVAL;
71 }
72 *mctx = le32_to_cpup((__le32 *)key);
73 return 0;
74}
75
76static int crc32_init(struct shash_desc *desc)
77{
78 u32 *mctx = crypto_shash_ctx(desc->tfm);
79 u32 *crcp = shash_desc_ctx(desc);
80
81 *crcp = *mctx;
82
83 return 0;
84}
85
86static int crc32_update(struct shash_desc *desc, const u8 *data,
87 unsigned int len)
88{
89 u32 *crcp = shash_desc_ctx(desc);
90
91 *crcp = __crc32_le(*crcp, data, len);
92 return 0;
93}
94
95/* No final XOR 0xFFFFFFFF, like crc32_le */
96static int __crc32_finup(u32 *crcp, const u8 *data, unsigned int len,
97 u8 *out)
98{
99 *(__le32 *)out = cpu_to_le32(__crc32_le(*crcp, data, len));
100 return 0;
101}
102
103static int crc32_finup(struct shash_desc *desc, const u8 *data,
104 unsigned int len, u8 *out)
105{
106 return __crc32_finup(shash_desc_ctx(desc), data, len, out);
107}
108
109static int crc32_final(struct shash_desc *desc, u8 *out)
110{
111 u32 *crcp = shash_desc_ctx(desc);
112
113 *(__le32 *)out = cpu_to_le32p(crcp);
114 return 0;
115}
116
117static int crc32_digest(struct shash_desc *desc, const u8 *data,
118 unsigned int len, u8 *out)
119{
120 return __crc32_finup(crypto_shash_ctx(desc->tfm), data, len,
121 out);
122}
123static struct shash_alg alg = {
124 .setkey = crc32_setkey,
125 .init = crc32_init,
126 .update = crc32_update,
127 .final = crc32_final,
128 .finup = crc32_finup,
129 .digest = crc32_digest,
130 .descsize = sizeof(u32),
131 .digestsize = CHKSUM_DIGEST_SIZE,
132 .base = {
133 .cra_name = "crc32",
134 .cra_driver_name = "crc32-table",
135 .cra_priority = 100,
136 .cra_blocksize = CHKSUM_BLOCK_SIZE,
137 .cra_ctxsize = sizeof(u32),
138 .cra_module = THIS_MODULE,
139 .cra_init = crc32_cra_init,
140 }
141};
142
143static int __init crc32_mod_init(void)
144{
145 return crypto_register_shash(&alg);
146}
147
148static void __exit crc32_mod_fini(void)
149{
150 crypto_unregister_shash(&alg);
151}
152
153module_init(crc32_mod_init);
154module_exit(crc32_mod_fini);
155
156MODULE_AUTHOR("Alexander Boyko <alexander_boyko@xyratex.com>");
157MODULE_DESCRIPTION("CRC32 calculations wrapper for lib/crc32");
158MODULE_LICENSE("GPL");