diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2013-07-24 14:05:18 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2013-07-24 14:05:18 -0400 |
commit | b48a97be8e6c2afdba2f3b61fd88c3c7743fbd73 (patch) | |
tree | c5b9258be43d7f4e2ec1d91e4b83820562fbaebb /lib | |
parent | 04012e3076943f17c8cfc77a196701c8f0b8964f (diff) | |
parent | e70308ec0e4bff344fcfdf160de40e1150552c5f (diff) |
Merge git://git.kernel.org/pub/scm/linux/kernel/git/herbert/crypto-2.6
Pull crypto fixes from Herbert Xu:
"This push fixes a memory corruption issue in caam, as well as
reverting the new optimised crct10dif implementation as it breaks boot
on initrd systems.
Hopefully crct10dif will be reinstated once the supporting code is
added so that it doesn't break boot"
* git://git.kernel.org/pub/scm/linux/kernel/git/herbert/crypto-2.6:
Revert "crypto: crct10dif - Wrap crc_t10dif function all to use crypto transform framework"
crypto: caam - Fixed the memory out of bound overwrite issue
Diffstat (limited to 'lib')
-rw-r--r-- | lib/Kconfig | 2 | ||||
-rw-r--r-- | lib/crc-t10dif.c | 73 |
2 files changed, 43 insertions, 32 deletions
diff --git a/lib/Kconfig b/lib/Kconfig index 35da51359d40..71d9f81f6eed 100644 --- a/lib/Kconfig +++ b/lib/Kconfig | |||
@@ -66,8 +66,6 @@ config CRC16 | |||
66 | 66 | ||
67 | config CRC_T10DIF | 67 | config CRC_T10DIF |
68 | tristate "CRC calculation for the T10 Data Integrity Field" | 68 | tristate "CRC calculation for the T10 Data Integrity Field" |
69 | select CRYPTO | ||
70 | select CRYPTO_CRCT10DIF | ||
71 | help | 69 | help |
72 | This option is only needed if a module that's not in the | 70 | This option is only needed if a module that's not in the |
73 | kernel tree needs to calculate CRC checks for use with the | 71 | kernel tree needs to calculate CRC checks for use with the |
diff --git a/lib/crc-t10dif.c b/lib/crc-t10dif.c index fe3428c07b47..fbbd66ed86cd 100644 --- a/lib/crc-t10dif.c +++ b/lib/crc-t10dif.c | |||
@@ -11,44 +11,57 @@ | |||
11 | #include <linux/types.h> | 11 | #include <linux/types.h> |
12 | #include <linux/module.h> | 12 | #include <linux/module.h> |
13 | #include <linux/crc-t10dif.h> | 13 | #include <linux/crc-t10dif.h> |
14 | #include <linux/err.h> | ||
15 | #include <linux/init.h> | ||
16 | #include <crypto/hash.h> | ||
17 | 14 | ||
18 | static struct crypto_shash *crct10dif_tfm; | 15 | /* Table generated using the following polynomium: |
16 | * x^16 + x^15 + x^11 + x^9 + x^8 + x^7 + x^5 + x^4 + x^2 + x + 1 | ||
17 | * gt: 0x8bb7 | ||
18 | */ | ||
19 | static const __u16 t10_dif_crc_table[256] = { | ||
20 | 0x0000, 0x8BB7, 0x9CD9, 0x176E, 0xB205, 0x39B2, 0x2EDC, 0xA56B, | ||
21 | 0xEFBD, 0x640A, 0x7364, 0xF8D3, 0x5DB8, 0xD60F, 0xC161, 0x4AD6, | ||
22 | 0x54CD, 0xDF7A, 0xC814, 0x43A3, 0xE6C8, 0x6D7F, 0x7A11, 0xF1A6, | ||
23 | 0xBB70, 0x30C7, 0x27A9, 0xAC1E, 0x0975, 0x82C2, 0x95AC, 0x1E1B, | ||
24 | 0xA99A, 0x222D, 0x3543, 0xBEF4, 0x1B9F, 0x9028, 0x8746, 0x0CF1, | ||
25 | 0x4627, 0xCD90, 0xDAFE, 0x5149, 0xF422, 0x7F95, 0x68FB, 0xE34C, | ||
26 | 0xFD57, 0x76E0, 0x618E, 0xEA39, 0x4F52, 0xC4E5, 0xD38B, 0x583C, | ||
27 | 0x12EA, 0x995D, 0x8E33, 0x0584, 0xA0EF, 0x2B58, 0x3C36, 0xB781, | ||
28 | 0xD883, 0x5334, 0x445A, 0xCFED, 0x6A86, 0xE131, 0xF65F, 0x7DE8, | ||
29 | 0x373E, 0xBC89, 0xABE7, 0x2050, 0x853B, 0x0E8C, 0x19E2, 0x9255, | ||
30 | 0x8C4E, 0x07F9, 0x1097, 0x9B20, 0x3E4B, 0xB5FC, 0xA292, 0x2925, | ||
31 | 0x63F3, 0xE844, 0xFF2A, 0x749D, 0xD1F6, 0x5A41, 0x4D2F, 0xC698, | ||
32 | 0x7119, 0xFAAE, 0xEDC0, 0x6677, 0xC31C, 0x48AB, 0x5FC5, 0xD472, | ||
33 | 0x9EA4, 0x1513, 0x027D, 0x89CA, 0x2CA1, 0xA716, 0xB078, 0x3BCF, | ||
34 | 0x25D4, 0xAE63, 0xB90D, 0x32BA, 0x97D1, 0x1C66, 0x0B08, 0x80BF, | ||
35 | 0xCA69, 0x41DE, 0x56B0, 0xDD07, 0x786C, 0xF3DB, 0xE4B5, 0x6F02, | ||
36 | 0x3AB1, 0xB106, 0xA668, 0x2DDF, 0x88B4, 0x0303, 0x146D, 0x9FDA, | ||
37 | 0xD50C, 0x5EBB, 0x49D5, 0xC262, 0x6709, 0xECBE, 0xFBD0, 0x7067, | ||
38 | 0x6E7C, 0xE5CB, 0xF2A5, 0x7912, 0xDC79, 0x57CE, 0x40A0, 0xCB17, | ||
39 | 0x81C1, 0x0A76, 0x1D18, 0x96AF, 0x33C4, 0xB873, 0xAF1D, 0x24AA, | ||
40 | 0x932B, 0x189C, 0x0FF2, 0x8445, 0x212E, 0xAA99, 0xBDF7, 0x3640, | ||
41 | 0x7C96, 0xF721, 0xE04F, 0x6BF8, 0xCE93, 0x4524, 0x524A, 0xD9FD, | ||
42 | 0xC7E6, 0x4C51, 0x5B3F, 0xD088, 0x75E3, 0xFE54, 0xE93A, 0x628D, | ||
43 | 0x285B, 0xA3EC, 0xB482, 0x3F35, 0x9A5E, 0x11E9, 0x0687, 0x8D30, | ||
44 | 0xE232, 0x6985, 0x7EEB, 0xF55C, 0x5037, 0xDB80, 0xCCEE, 0x4759, | ||
45 | 0x0D8F, 0x8638, 0x9156, 0x1AE1, 0xBF8A, 0x343D, 0x2353, 0xA8E4, | ||
46 | 0xB6FF, 0x3D48, 0x2A26, 0xA191, 0x04FA, 0x8F4D, 0x9823, 0x1394, | ||
47 | 0x5942, 0xD2F5, 0xC59B, 0x4E2C, 0xEB47, 0x60F0, 0x779E, 0xFC29, | ||
48 | 0x4BA8, 0xC01F, 0xD771, 0x5CC6, 0xF9AD, 0x721A, 0x6574, 0xEEC3, | ||
49 | 0xA415, 0x2FA2, 0x38CC, 0xB37B, 0x1610, 0x9DA7, 0x8AC9, 0x017E, | ||
50 | 0x1F65, 0x94D2, 0x83BC, 0x080B, 0xAD60, 0x26D7, 0x31B9, 0xBA0E, | ||
51 | 0xF0D8, 0x7B6F, 0x6C01, 0xE7B6, 0x42DD, 0xC96A, 0xDE04, 0x55B3 | ||
52 | }; | ||
19 | 53 | ||
20 | __u16 crc_t10dif(const unsigned char *buffer, size_t len) | 54 | __u16 crc_t10dif(const unsigned char *buffer, size_t len) |
21 | { | 55 | { |
22 | struct { | 56 | __u16 crc = 0; |
23 | struct shash_desc shash; | 57 | unsigned int i; |
24 | char ctx[2]; | ||
25 | } desc; | ||
26 | int err; | ||
27 | |||
28 | desc.shash.tfm = crct10dif_tfm; | ||
29 | desc.shash.flags = 0; | ||
30 | *(__u16 *)desc.ctx = 0; | ||
31 | 58 | ||
32 | err = crypto_shash_update(&desc.shash, buffer, len); | 59 | for (i = 0 ; i < len ; i++) |
33 | BUG_ON(err); | 60 | crc = (crc << 8) ^ t10_dif_crc_table[((crc >> 8) ^ buffer[i]) & 0xff]; |
34 | 61 | ||
35 | return *(__u16 *)desc.ctx; | 62 | return crc; |
36 | } | 63 | } |
37 | EXPORT_SYMBOL(crc_t10dif); | 64 | EXPORT_SYMBOL(crc_t10dif); |
38 | 65 | ||
39 | static int __init crc_t10dif_mod_init(void) | ||
40 | { | ||
41 | crct10dif_tfm = crypto_alloc_shash("crct10dif", 0, 0); | ||
42 | return PTR_RET(crct10dif_tfm); | ||
43 | } | ||
44 | |||
45 | static void __exit crc_t10dif_mod_fini(void) | ||
46 | { | ||
47 | crypto_free_shash(crct10dif_tfm); | ||
48 | } | ||
49 | |||
50 | module_init(crc_t10dif_mod_init); | ||
51 | module_exit(crc_t10dif_mod_fini); | ||
52 | |||
53 | MODULE_DESCRIPTION("T10 DIF CRC calculation"); | 66 | MODULE_DESCRIPTION("T10 DIF CRC calculation"); |
54 | MODULE_LICENSE("GPL"); | 67 | MODULE_LICENSE("GPL"); |