diff options
55 files changed, 3208 insertions, 462 deletions
diff --git a/Documentation/networking/00-INDEX b/Documentation/networking/00-INDEX index b1181ce232d9..e06b6e3c1db5 100644 --- a/Documentation/networking/00-INDEX +++ b/Documentation/networking/00-INDEX | |||
@@ -58,6 +58,8 @@ fore200e.txt | |||
58 | - FORE Systems PCA-200E/SBA-200E ATM NIC driver info. | 58 | - FORE Systems PCA-200E/SBA-200E ATM NIC driver info. |
59 | framerelay.txt | 59 | framerelay.txt |
60 | - info on using Frame Relay/Data Link Connection Identifier (DLCI). | 60 | - info on using Frame Relay/Data Link Connection Identifier (DLCI). |
61 | generic_netlink.txt | ||
62 | - info on Generic Netlink | ||
61 | ip-sysctl.txt | 63 | ip-sysctl.txt |
62 | - /proc/sys/net/ipv4/* variables | 64 | - /proc/sys/net/ipv4/* variables |
63 | ip_dynaddr.txt | 65 | ip_dynaddr.txt |
diff --git a/Documentation/networking/generic_netlink.txt b/Documentation/networking/generic_netlink.txt new file mode 100644 index 000000000000..d4f8b8b9b53c --- /dev/null +++ b/Documentation/networking/generic_netlink.txt | |||
@@ -0,0 +1,3 @@ | |||
1 | A wiki document on how to use Generic Netlink can be found here: | ||
2 | |||
3 | * http://linux-net.osdl.org/index.php/Generic_Netlink_HOWTO | ||
diff --git a/crypto/Kconfig b/crypto/Kconfig index cbae8392ce11..92ba249f3a5b 100644 --- a/crypto/Kconfig +++ b/crypto/Kconfig | |||
@@ -39,6 +39,17 @@ config CRYPTO_HMAC | |||
39 | HMAC: Keyed-Hashing for Message Authentication (RFC2104). | 39 | HMAC: Keyed-Hashing for Message Authentication (RFC2104). |
40 | This is required for IPSec. | 40 | This is required for IPSec. |
41 | 41 | ||
42 | config CRYPTO_XCBC | ||
43 | tristate "XCBC support" | ||
44 | depends on EXPERIMENTAL | ||
45 | select CRYPTO_HASH | ||
46 | select CRYPTO_MANAGER | ||
47 | help | ||
48 | XCBC: Keyed-Hashing with encryption algorithm | ||
49 | http://www.ietf.org/rfc/rfc3566.txt | ||
50 | http://csrc.nist.gov/encryption/modes/proposedmodes/ | ||
51 | xcbc-mac/xcbc-mac-spec.pdf | ||
52 | |||
42 | config CRYPTO_NULL | 53 | config CRYPTO_NULL |
43 | tristate "Null algorithms" | 54 | tristate "Null algorithms" |
44 | select CRYPTO_ALGAPI | 55 | select CRYPTO_ALGAPI |
@@ -128,6 +139,16 @@ config CRYPTO_TGR192 | |||
128 | See also: | 139 | See also: |
129 | <http://www.cs.technion.ac.il/~biham/Reports/Tiger/>. | 140 | <http://www.cs.technion.ac.il/~biham/Reports/Tiger/>. |
130 | 141 | ||
142 | config CRYPTO_GF128MUL | ||
143 | tristate "GF(2^128) multiplication functions (EXPERIMENTAL)" | ||
144 | depends on EXPERIMENTAL | ||
145 | help | ||
146 | Efficient table driven implementation of multiplications in the | ||
147 | field GF(2^128). This is needed by some cypher modes. This | ||
148 | option will be selected automatically if you select such a | ||
149 | cipher mode. Only select this option by hand if you expect to load | ||
150 | an external module that requires these functions. | ||
151 | |||
131 | config CRYPTO_ECB | 152 | config CRYPTO_ECB |
132 | tristate "ECB support" | 153 | tristate "ECB support" |
133 | select CRYPTO_BLKCIPHER | 154 | select CRYPTO_BLKCIPHER |
@@ -147,6 +168,19 @@ config CRYPTO_CBC | |||
147 | CBC: Cipher Block Chaining mode | 168 | CBC: Cipher Block Chaining mode |
148 | This block cipher algorithm is required for IPSec. | 169 | This block cipher algorithm is required for IPSec. |
149 | 170 | ||
171 | config CRYPTO_LRW | ||
172 | tristate "LRW support (EXPERIMENTAL)" | ||
173 | depends on EXPERIMENTAL | ||
174 | select CRYPTO_BLKCIPHER | ||
175 | select CRYPTO_MANAGER | ||
176 | select CRYPTO_GF128MUL | ||
177 | help | ||
178 | LRW: Liskov Rivest Wagner, a tweakable, non malleable, non movable | ||
179 | narrow block cipher mode for dm-crypt. Use it with cipher | ||
180 | specification string aes-lrw-benbi, the key must be 256, 320 or 384. | ||
181 | The first 128, 192 or 256 bits in the key are used for AES and the | ||
182 | rest is used to tie each cipher block to its logical position. | ||
183 | |||
150 | config CRYPTO_DES | 184 | config CRYPTO_DES |
151 | tristate "DES and Triple DES EDE cipher algorithms" | 185 | tristate "DES and Triple DES EDE cipher algorithms" |
152 | select CRYPTO_ALGAPI | 186 | select CRYPTO_ALGAPI |
diff --git a/crypto/Makefile b/crypto/Makefile index 72366208e291..60e3d24f61f5 100644 --- a/crypto/Makefile +++ b/crypto/Makefile | |||
@@ -15,6 +15,7 @@ obj-$(CONFIG_CRYPTO_HASH) += crypto_hash.o | |||
15 | 15 | ||
16 | obj-$(CONFIG_CRYPTO_MANAGER) += cryptomgr.o | 16 | obj-$(CONFIG_CRYPTO_MANAGER) += cryptomgr.o |
17 | obj-$(CONFIG_CRYPTO_HMAC) += hmac.o | 17 | obj-$(CONFIG_CRYPTO_HMAC) += hmac.o |
18 | obj-$(CONFIG_CRYPTO_XCBC) += xcbc.o | ||
18 | obj-$(CONFIG_CRYPTO_NULL) += crypto_null.o | 19 | obj-$(CONFIG_CRYPTO_NULL) += crypto_null.o |
19 | obj-$(CONFIG_CRYPTO_MD4) += md4.o | 20 | obj-$(CONFIG_CRYPTO_MD4) += md4.o |
20 | obj-$(CONFIG_CRYPTO_MD5) += md5.o | 21 | obj-$(CONFIG_CRYPTO_MD5) += md5.o |
@@ -23,8 +24,10 @@ obj-$(CONFIG_CRYPTO_SHA256) += sha256.o | |||
23 | obj-$(CONFIG_CRYPTO_SHA512) += sha512.o | 24 | obj-$(CONFIG_CRYPTO_SHA512) += sha512.o |
24 | obj-$(CONFIG_CRYPTO_WP512) += wp512.o | 25 | obj-$(CONFIG_CRYPTO_WP512) += wp512.o |
25 | obj-$(CONFIG_CRYPTO_TGR192) += tgr192.o | 26 | obj-$(CONFIG_CRYPTO_TGR192) += tgr192.o |
27 | obj-$(CONFIG_CRYPTO_GF128MUL) += gf128mul.o | ||
26 | obj-$(CONFIG_CRYPTO_ECB) += ecb.o | 28 | obj-$(CONFIG_CRYPTO_ECB) += ecb.o |
27 | obj-$(CONFIG_CRYPTO_CBC) += cbc.o | 29 | obj-$(CONFIG_CRYPTO_CBC) += cbc.o |
30 | obj-$(CONFIG_CRYPTO_LRW) += lrw.o | ||
28 | obj-$(CONFIG_CRYPTO_DES) += des.o | 31 | obj-$(CONFIG_CRYPTO_DES) += des.o |
29 | obj-$(CONFIG_CRYPTO_BLOWFISH) += blowfish.o | 32 | obj-$(CONFIG_CRYPTO_BLOWFISH) += blowfish.o |
30 | obj-$(CONFIG_CRYPTO_TWOFISH) += twofish.o | 33 | obj-$(CONFIG_CRYPTO_TWOFISH) += twofish.o |
diff --git a/crypto/api.c b/crypto/api.c index 4fb7fa45cb0d..8c446871cd5b 100644 --- a/crypto/api.c +++ b/crypto/api.c | |||
@@ -466,23 +466,8 @@ void crypto_free_tfm(struct crypto_tfm *tfm) | |||
466 | kfree(tfm); | 466 | kfree(tfm); |
467 | } | 467 | } |
468 | 468 | ||
469 | int crypto_alg_available(const char *name, u32 flags) | ||
470 | { | ||
471 | int ret = 0; | ||
472 | struct crypto_alg *alg = crypto_alg_mod_lookup(name, 0, | ||
473 | CRYPTO_ALG_ASYNC); | ||
474 | |||
475 | if (!IS_ERR(alg)) { | ||
476 | crypto_mod_put(alg); | ||
477 | ret = 1; | ||
478 | } | ||
479 | |||
480 | return ret; | ||
481 | } | ||
482 | |||
483 | EXPORT_SYMBOL_GPL(crypto_alloc_tfm); | 469 | EXPORT_SYMBOL_GPL(crypto_alloc_tfm); |
484 | EXPORT_SYMBOL_GPL(crypto_free_tfm); | 470 | EXPORT_SYMBOL_GPL(crypto_free_tfm); |
485 | EXPORT_SYMBOL_GPL(crypto_alg_available); | ||
486 | 471 | ||
487 | int crypto_has_alg(const char *name, u32 type, u32 mask) | 472 | int crypto_has_alg(const char *name, u32 type, u32 mask) |
488 | { | 473 | { |
diff --git a/crypto/digest.c b/crypto/digest.c index 0155a94e4b15..8f4593268ce0 100644 --- a/crypto/digest.c +++ b/crypto/digest.c | |||
@@ -21,54 +21,6 @@ | |||
21 | #include "internal.h" | 21 | #include "internal.h" |
22 | #include "scatterwalk.h" | 22 | #include "scatterwalk.h" |
23 | 23 | ||
24 | void crypto_digest_init(struct crypto_tfm *tfm) | ||
25 | { | ||
26 | struct crypto_hash *hash = crypto_hash_cast(tfm); | ||
27 | struct hash_desc desc = { .tfm = hash, .flags = tfm->crt_flags }; | ||
28 | |||
29 | crypto_hash_init(&desc); | ||
30 | } | ||
31 | EXPORT_SYMBOL_GPL(crypto_digest_init); | ||
32 | |||
33 | void crypto_digest_update(struct crypto_tfm *tfm, | ||
34 | struct scatterlist *sg, unsigned int nsg) | ||
35 | { | ||
36 | struct crypto_hash *hash = crypto_hash_cast(tfm); | ||
37 | struct hash_desc desc = { .tfm = hash, .flags = tfm->crt_flags }; | ||
38 | unsigned int nbytes = 0; | ||
39 | unsigned int i; | ||
40 | |||
41 | for (i = 0; i < nsg; i++) | ||
42 | nbytes += sg[i].length; | ||
43 | |||
44 | crypto_hash_update(&desc, sg, nbytes); | ||
45 | } | ||
46 | EXPORT_SYMBOL_GPL(crypto_digest_update); | ||
47 | |||
48 | void crypto_digest_final(struct crypto_tfm *tfm, u8 *out) | ||
49 | { | ||
50 | struct crypto_hash *hash = crypto_hash_cast(tfm); | ||
51 | struct hash_desc desc = { .tfm = hash, .flags = tfm->crt_flags }; | ||
52 | |||
53 | crypto_hash_final(&desc, out); | ||
54 | } | ||
55 | EXPORT_SYMBOL_GPL(crypto_digest_final); | ||
56 | |||
57 | void crypto_digest_digest(struct crypto_tfm *tfm, | ||
58 | struct scatterlist *sg, unsigned int nsg, u8 *out) | ||
59 | { | ||
60 | struct crypto_hash *hash = crypto_hash_cast(tfm); | ||
61 | struct hash_desc desc = { .tfm = hash, .flags = tfm->crt_flags }; | ||
62 | unsigned int nbytes = 0; | ||
63 | unsigned int i; | ||
64 | |||
65 | for (i = 0; i < nsg; i++) | ||
66 | nbytes += sg[i].length; | ||
67 | |||
68 | crypto_hash_digest(&desc, sg, nbytes, out); | ||
69 | } | ||
70 | EXPORT_SYMBOL_GPL(crypto_digest_digest); | ||
71 | |||
72 | static int init(struct hash_desc *desc) | 24 | static int init(struct hash_desc *desc) |
73 | { | 25 | { |
74 | struct crypto_tfm *tfm = crypto_hash_tfm(desc->tfm); | 26 | struct crypto_tfm *tfm = crypto_hash_tfm(desc->tfm); |
diff --git a/crypto/gf128mul.c b/crypto/gf128mul.c new file mode 100644 index 000000000000..0a2aadfa1d85 --- /dev/null +++ b/crypto/gf128mul.c | |||
@@ -0,0 +1,466 @@ | |||
1 | /* gf128mul.c - GF(2^128) multiplication functions | ||
2 | * | ||
3 | * Copyright (c) 2003, Dr Brian Gladman, Worcester, UK. | ||
4 | * Copyright (c) 2006, Rik Snel <rsnel@cube.dyndns.org> | ||
5 | * | ||
6 | * Based on Dr Brian Gladman's (GPL'd) work published at | ||
7 | * http://fp.gladman.plus.com/cryptography_technology/index.htm | ||
8 | * See the original copyright notice below. | ||
9 | * | ||
10 | * This program is free software; you can redistribute it and/or modify it | ||
11 | * under the terms of the GNU General Public License as published by the Free | ||
12 | * Software Foundation; either version 2 of the License, or (at your option) | ||
13 | * any later version. | ||
14 | */ | ||
15 | |||
16 | /* | ||
17 | --------------------------------------------------------------------------- | ||
18 | Copyright (c) 2003, Dr Brian Gladman, Worcester, UK. All rights reserved. | ||
19 | |||
20 | LICENSE TERMS | ||
21 | |||
22 | The free distribution and use of this software in both source and binary | ||
23 | form is allowed (with or without changes) provided that: | ||
24 | |||
25 | 1. distributions of this source code include the above copyright | ||
26 | notice, this list of conditions and the following disclaimer; | ||
27 | |||
28 | 2. distributions in binary form include the above copyright | ||
29 | notice, this list of conditions and the following disclaimer | ||
30 | in the documentation and/or other associated materials; | ||
31 | |||
32 | 3. the copyright holder's name is not used to endorse products | ||
33 | built using this software without specific written permission. | ||
34 | |||
35 | ALTERNATIVELY, provided that this notice is retained in full, this product | ||
36 | may be distributed under the terms of the GNU General Public License (GPL), | ||
37 | in which case the provisions of the GPL apply INSTEAD OF those given above. | ||
38 | |||
39 | DISCLAIMER | ||
40 | |||
41 | This software is provided 'as is' with no explicit or implied warranties | ||
42 | in respect of its properties, including, but not limited to, correctness | ||
43 | and/or fitness for purpose. | ||
44 | --------------------------------------------------------------------------- | ||
45 | Issue 31/01/2006 | ||
46 | |||
47 | This file provides fast multiplication in GF(128) as required by several | ||
48 | cryptographic authentication modes | ||
49 | */ | ||
50 | |||
51 | #include <crypto/gf128mul.h> | ||
52 | #include <linux/kernel.h> | ||
53 | #include <linux/module.h> | ||
54 | #include <linux/slab.h> | ||
55 | |||
56 | #define gf128mul_dat(q) { \ | ||
57 | q(0x00), q(0x01), q(0x02), q(0x03), q(0x04), q(0x05), q(0x06), q(0x07),\ | ||
58 | q(0x08), q(0x09), q(0x0a), q(0x0b), q(0x0c), q(0x0d), q(0x0e), q(0x0f),\ | ||
59 | q(0x10), q(0x11), q(0x12), q(0x13), q(0x14), q(0x15), q(0x16), q(0x17),\ | ||
60 | q(0x18), q(0x19), q(0x1a), q(0x1b), q(0x1c), q(0x1d), q(0x1e), q(0x1f),\ | ||
61 | q(0x20), q(0x21), q(0x22), q(0x23), q(0x24), q(0x25), q(0x26), q(0x27),\ | ||
62 | q(0x28), q(0x29), q(0x2a), q(0x2b), q(0x2c), q(0x2d), q(0x2e), q(0x2f),\ | ||
63 | q(0x30), q(0x31), q(0x32), q(0x33), q(0x34), q(0x35), q(0x36), q(0x37),\ | ||
64 | q(0x38), q(0x39), q(0x3a), q(0x3b), q(0x3c), q(0x3d), q(0x3e), q(0x3f),\ | ||
65 | q(0x40), q(0x41), q(0x42), q(0x43), q(0x44), q(0x45), q(0x46), q(0x47),\ | ||
66 | q(0x48), q(0x49), q(0x4a), q(0x4b), q(0x4c), q(0x4d), q(0x4e), q(0x4f),\ | ||
67 | q(0x50), q(0x51), q(0x52), q(0x53), q(0x54), q(0x55), q(0x56), q(0x57),\ | ||
68 | q(0x58), q(0x59), q(0x5a), q(0x5b), q(0x5c), q(0x5d), q(0x5e), q(0x5f),\ | ||
69 | q(0x60), q(0x61), q(0x62), q(0x63), q(0x64), q(0x65), q(0x66), q(0x67),\ | ||
70 | q(0x68), q(0x69), q(0x6a), q(0x6b), q(0x6c), q(0x6d), q(0x6e), q(0x6f),\ | ||
71 | q(0x70), q(0x71), q(0x72), q(0x73), q(0x74), q(0x75), q(0x76), q(0x77),\ | ||
72 | q(0x78), q(0x79), q(0x7a), q(0x7b), q(0x7c), q(0x7d), q(0x7e), q(0x7f),\ | ||
73 | q(0x80), q(0x81), q(0x82), q(0x83), q(0x84), q(0x85), q(0x86), q(0x87),\ | ||
74 | q(0x88), q(0x89), q(0x8a), q(0x8b), q(0x8c), q(0x8d), q(0x8e), q(0x8f),\ | ||
75 | q(0x90), q(0x91), q(0x92), q(0x93), q(0x94), q(0x95), q(0x96), q(0x97),\ | ||
76 | q(0x98), q(0x99), q(0x9a), q(0x9b), q(0x9c), q(0x9d), q(0x9e), q(0x9f),\ | ||
77 | q(0xa0), q(0xa1), q(0xa2), q(0xa3), q(0xa4), q(0xa5), q(0xa6), q(0xa7),\ | ||
78 | q(0xa8), q(0xa9), q(0xaa), q(0xab), q(0xac), q(0xad), q(0xae), q(0xaf),\ | ||
79 | q(0xb0), q(0xb1), q(0xb2), q(0xb3), q(0xb4), q(0xb5), q(0xb6), q(0xb7),\ | ||
80 | q(0xb8), q(0xb9), q(0xba), q(0xbb), q(0xbc), q(0xbd), q(0xbe), q(0xbf),\ | ||
81 | q(0xc0), q(0xc1), q(0xc2), q(0xc3), q(0xc4), q(0xc5), q(0xc6), q(0xc7),\ | ||
82 | q(0xc8), q(0xc9), q(0xca), q(0xcb), q(0xcc), q(0xcd), q(0xce), q(0xcf),\ | ||
83 | q(0xd0), q(0xd1), q(0xd2), q(0xd3), q(0xd4), q(0xd5), q(0xd6), q(0xd7),\ | ||
84 | q(0xd8), q(0xd9), q(0xda), q(0xdb), q(0xdc), q(0xdd), q(0xde), q(0xdf),\ | ||
85 | q(0xe0), q(0xe1), q(0xe2), q(0xe3), q(0xe4), q(0xe5), q(0xe6), q(0xe7),\ | ||
86 | q(0xe8), q(0xe9), q(0xea), q(0xeb), q(0xec), q(0xed), q(0xee), q(0xef),\ | ||
87 | q(0xf0), q(0xf1), q(0xf2), q(0xf3), q(0xf4), q(0xf5), q(0xf6), q(0xf7),\ | ||
88 | q(0xf8), q(0xf9), q(0xfa), q(0xfb), q(0xfc), q(0xfd), q(0xfe), q(0xff) \ | ||
89 | } | ||
90 | |||
91 | /* Given the value i in 0..255 as the byte overflow when a field element | ||
92 | in GHASH is multipled by x^8, this function will return the values that | ||
93 | are generated in the lo 16-bit word of the field value by applying the | ||
94 | modular polynomial. The values lo_byte and hi_byte are returned via the | ||
95 | macro xp_fun(lo_byte, hi_byte) so that the values can be assembled into | ||
96 | memory as required by a suitable definition of this macro operating on | ||
97 | the table above | ||
98 | */ | ||
99 | |||
100 | #define xx(p, q) 0x##p##q | ||
101 | |||
102 | #define xda_bbe(i) ( \ | ||
103 | (i & 0x80 ? xx(43, 80) : 0) ^ (i & 0x40 ? xx(21, c0) : 0) ^ \ | ||
104 | (i & 0x20 ? xx(10, e0) : 0) ^ (i & 0x10 ? xx(08, 70) : 0) ^ \ | ||
105 | (i & 0x08 ? xx(04, 38) : 0) ^ (i & 0x04 ? xx(02, 1c) : 0) ^ \ | ||
106 | (i & 0x02 ? xx(01, 0e) : 0) ^ (i & 0x01 ? xx(00, 87) : 0) \ | ||
107 | ) | ||
108 | |||
109 | #define xda_lle(i) ( \ | ||
110 | (i & 0x80 ? xx(e1, 00) : 0) ^ (i & 0x40 ? xx(70, 80) : 0) ^ \ | ||
111 | (i & 0x20 ? xx(38, 40) : 0) ^ (i & 0x10 ? xx(1c, 20) : 0) ^ \ | ||
112 | (i & 0x08 ? xx(0e, 10) : 0) ^ (i & 0x04 ? xx(07, 08) : 0) ^ \ | ||
113 | (i & 0x02 ? xx(03, 84) : 0) ^ (i & 0x01 ? xx(01, c2) : 0) \ | ||
114 | ) | ||
115 | |||
116 | static const u16 gf128mul_table_lle[256] = gf128mul_dat(xda_lle); | ||
117 | static const u16 gf128mul_table_bbe[256] = gf128mul_dat(xda_bbe); | ||
118 | |||
119 | /* These functions multiply a field element by x, by x^4 and by x^8 | ||
120 | * in the polynomial field representation. It uses 32-bit word operations | ||
121 | * to gain speed but compensates for machine endianess and hence works | ||
122 | * correctly on both styles of machine. | ||
123 | */ | ||
124 | |||
125 | static void gf128mul_x_lle(be128 *r, const be128 *x) | ||
126 | { | ||
127 | u64 a = be64_to_cpu(x->a); | ||
128 | u64 b = be64_to_cpu(x->b); | ||
129 | u64 _tt = gf128mul_table_lle[(b << 7) & 0xff]; | ||
130 | |||
131 | r->b = cpu_to_be64((b >> 1) | (a << 63)); | ||
132 | r->a = cpu_to_be64((a >> 1) ^ (_tt << 48)); | ||
133 | } | ||
134 | |||
135 | static void gf128mul_x_bbe(be128 *r, const be128 *x) | ||
136 | { | ||
137 | u64 a = be64_to_cpu(x->a); | ||
138 | u64 b = be64_to_cpu(x->b); | ||
139 | u64 _tt = gf128mul_table_bbe[a >> 63]; | ||
140 | |||
141 | r->a = cpu_to_be64((a << 1) | (b >> 63)); | ||
142 | r->b = cpu_to_be64((b << 1) ^ _tt); | ||
143 | } | ||
144 | |||
145 | static void gf128mul_x8_lle(be128 *x) | ||
146 | { | ||
147 | u64 a = be64_to_cpu(x->a); | ||
148 | u64 b = be64_to_cpu(x->b); | ||
149 | u64 _tt = gf128mul_table_lle[b & 0xff]; | ||
150 | |||
151 | x->b = cpu_to_be64((b >> 8) | (a << 56)); | ||
152 | x->a = cpu_to_be64((a >> 8) ^ (_tt << 48)); | ||
153 | } | ||
154 | |||
155 | static void gf128mul_x8_bbe(be128 *x) | ||
156 | { | ||
157 | u64 a = be64_to_cpu(x->a); | ||
158 | u64 b = be64_to_cpu(x->b); | ||
159 | u64 _tt = gf128mul_table_bbe[a >> 56]; | ||
160 | |||
161 | x->a = cpu_to_be64((a << 8) | (b >> 56)); | ||
162 | x->b = cpu_to_be64((b << 8) ^ _tt); | ||
163 | } | ||
164 | |||
165 | void gf128mul_lle(be128 *r, const be128 *b) | ||
166 | { | ||
167 | be128 p[8]; | ||
168 | int i; | ||
169 | |||
170 | p[0] = *r; | ||
171 | for (i = 0; i < 7; ++i) | ||
172 | gf128mul_x_lle(&p[i + 1], &p[i]); | ||
173 | |||
174 | memset(r, 0, sizeof(r)); | ||
175 | for (i = 0;;) { | ||
176 | u8 ch = ((u8 *)b)[15 - i]; | ||
177 | |||
178 | if (ch & 0x80) | ||
179 | be128_xor(r, r, &p[0]); | ||
180 | if (ch & 0x40) | ||
181 | be128_xor(r, r, &p[1]); | ||
182 | if (ch & 0x20) | ||
183 | be128_xor(r, r, &p[2]); | ||
184 | if (ch & 0x10) | ||
185 | be128_xor(r, r, &p[3]); | ||
186 | if (ch & 0x08) | ||
187 | be128_xor(r, r, &p[4]); | ||
188 | if (ch & 0x04) | ||
189 | be128_xor(r, r, &p[5]); | ||
190 | if (ch & 0x02) | ||
191 | be128_xor(r, r, &p[6]); | ||
192 | if (ch & 0x01) | ||
193 | be128_xor(r, r, &p[7]); | ||
194 | |||
195 | if (++i >= 16) | ||
196 | break; | ||
197 | |||
198 | gf128mul_x8_lle(r); | ||
199 | } | ||
200 | } | ||
201 | EXPORT_SYMBOL(gf128mul_lle); | ||
202 | |||
203 | void gf128mul_bbe(be128 *r, const be128 *b) | ||
204 | { | ||
205 | be128 p[8]; | ||
206 | int i; | ||
207 | |||
208 | p[0] = *r; | ||
209 | for (i = 0; i < 7; ++i) | ||
210 | gf128mul_x_bbe(&p[i + 1], &p[i]); | ||
211 | |||
212 | memset(r, 0, sizeof(r)); | ||
213 | for (i = 0;;) { | ||
214 | u8 ch = ((u8 *)b)[i]; | ||
215 | |||
216 | if (ch & 0x80) | ||
217 | be128_xor(r, r, &p[7]); | ||
218 | if (ch & 0x40) | ||
219 | be128_xor(r, r, &p[6]); | ||
220 | if (ch & 0x20) | ||
221 | be128_xor(r, r, &p[5]); | ||
222 | if (ch & 0x10) | ||
223 | be128_xor(r, r, &p[4]); | ||
224 | if (ch & 0x08) | ||
225 | be128_xor(r, r, &p[3]); | ||
226 | if (ch & 0x04) | ||
227 | be128_xor(r, r, &p[2]); | ||
228 | if (ch & 0x02) | ||
229 | be128_xor(r, r, &p[1]); | ||
230 | if (ch & 0x01) | ||
231 | be128_xor(r, r, &p[0]); | ||
232 | |||
233 | if (++i >= 16) | ||
234 | break; | ||
235 | |||
236 | gf128mul_x8_bbe(r); | ||
237 | } | ||
238 | } | ||
239 | EXPORT_SYMBOL(gf128mul_bbe); | ||
240 | |||
241 | /* This version uses 64k bytes of table space. | ||
242 | A 16 byte buffer has to be multiplied by a 16 byte key | ||
243 | value in GF(128). If we consider a GF(128) value in | ||
244 | the buffer's lowest byte, we can construct a table of | ||
245 | the 256 16 byte values that result from the 256 values | ||
246 | of this byte. This requires 4096 bytes. But we also | ||
247 | need tables for each of the 16 higher bytes in the | ||
248 | buffer as well, which makes 64 kbytes in total. | ||
249 | */ | ||
250 | /* additional explanation | ||
251 | * t[0][BYTE] contains g*BYTE | ||
252 | * t[1][BYTE] contains g*x^8*BYTE | ||
253 | * .. | ||
254 | * t[15][BYTE] contains g*x^120*BYTE */ | ||
255 | struct gf128mul_64k *gf128mul_init_64k_lle(const be128 *g) | ||
256 | { | ||
257 | struct gf128mul_64k *t; | ||
258 | int i, j, k; | ||
259 | |||
260 | t = kzalloc(sizeof(*t), GFP_KERNEL); | ||
261 | if (!t) | ||
262 | goto out; | ||
263 | |||
264 | for (i = 0; i < 16; i++) { | ||
265 | t->t[i] = kzalloc(sizeof(*t->t[i]), GFP_KERNEL); | ||
266 | if (!t->t[i]) { | ||
267 | gf128mul_free_64k(t); | ||
268 | t = NULL; | ||
269 | goto out; | ||
270 | } | ||
271 | } | ||
272 | |||
273 | t->t[0]->t[128] = *g; | ||
274 | for (j = 64; j > 0; j >>= 1) | ||
275 | gf128mul_x_lle(&t->t[0]->t[j], &t->t[0]->t[j + j]); | ||
276 | |||
277 | for (i = 0;;) { | ||
278 | for (j = 2; j < 256; j += j) | ||
279 | for (k = 1; k < j; ++k) | ||
280 | be128_xor(&t->t[i]->t[j + k], | ||
281 | &t->t[i]->t[j], &t->t[i]->t[k]); | ||
282 | |||
283 | if (++i >= 16) | ||
284 | break; | ||
285 | |||
286 | for (j = 128; j > 0; j >>= 1) { | ||
287 | t->t[i]->t[j] = t->t[i - 1]->t[j]; | ||
288 | gf128mul_x8_lle(&t->t[i]->t[j]); | ||
289 | } | ||
290 | } | ||
291 | |||
292 | out: | ||
293 | return t; | ||
294 | } | ||
295 | EXPORT_SYMBOL(gf128mul_init_64k_lle); | ||
296 | |||
297 | struct gf128mul_64k *gf128mul_init_64k_bbe(const be128 *g) | ||
298 | { | ||
299 | struct gf128mul_64k *t; | ||
300 | int i, j, k; | ||
301 | |||
302 | t = kzalloc(sizeof(*t), GFP_KERNEL); | ||
303 | if (!t) | ||
304 | goto out; | ||
305 | |||
306 | for (i = 0; i < 16; i++) { | ||
307 | t->t[i] = kzalloc(sizeof(*t->t[i]), GFP_KERNEL); | ||
308 | if (!t->t[i]) { | ||
309 | gf128mul_free_64k(t); | ||
310 | t = NULL; | ||
311 | goto out; | ||
312 | } | ||
313 | } | ||
314 | |||
315 | t->t[0]->t[1] = *g; | ||
316 | for (j = 1; j <= 64; j <<= 1) | ||
317 | gf128mul_x_bbe(&t->t[0]->t[j + j], &t->t[0]->t[j]); | ||
318 | |||
319 | for (i = 0;;) { | ||
320 | for (j = 2; j < 256; j += j) | ||
321 | for (k = 1; k < j; ++k) | ||
322 | be128_xor(&t->t[i]->t[j + k], | ||
323 | &t->t[i]->t[j], &t->t[i]->t[k]); | ||
324 | |||
325 | if (++i >= 16) | ||
326 | break; | ||
327 | |||
328 | for (j = 128; j > 0; j >>= 1) { | ||
329 | t->t[i]->t[j] = t->t[i - 1]->t[j]; | ||
330 | gf128mul_x8_bbe(&t->t[i]->t[j]); | ||
331 | } | ||
332 | } | ||
333 | |||
334 | out: | ||
335 | return t; | ||
336 | } | ||
337 | EXPORT_SYMBOL(gf128mul_init_64k_bbe); | ||
338 | |||
339 | void gf128mul_free_64k(struct gf128mul_64k *t) | ||
340 | { | ||
341 | int i; | ||
342 | |||
343 | for (i = 0; i < 16; i++) | ||
344 | kfree(t->t[i]); | ||
345 | kfree(t); | ||
346 | } | ||
347 | EXPORT_SYMBOL(gf128mul_free_64k); | ||
348 | |||
349 | void gf128mul_64k_lle(be128 *a, struct gf128mul_64k *t) | ||
350 | { | ||
351 | u8 *ap = (u8 *)a; | ||
352 | be128 r[1]; | ||
353 | int i; | ||
354 | |||
355 | *r = t->t[0]->t[ap[0]]; | ||
356 | for (i = 1; i < 16; ++i) | ||
357 | be128_xor(r, r, &t->t[i]->t[ap[i]]); | ||
358 | *a = *r; | ||
359 | } | ||
360 | EXPORT_SYMBOL(gf128mul_64k_lle); | ||
361 | |||
362 | void gf128mul_64k_bbe(be128 *a, struct gf128mul_64k *t) | ||
363 | { | ||
364 | u8 *ap = (u8 *)a; | ||
365 | be128 r[1]; | ||
366 | int i; | ||
367 | |||
368 | *r = t->t[0]->t[ap[15]]; | ||
369 | for (i = 1; i < 16; ++i) | ||
370 | be128_xor(r, r, &t->t[i]->t[ap[15 - i]]); | ||
371 | *a = *r; | ||
372 | } | ||
373 | EXPORT_SYMBOL(gf128mul_64k_bbe); | ||
374 | |||
375 | /* This version uses 4k bytes of table space. | ||
376 | A 16 byte buffer has to be multiplied by a 16 byte key | ||
377 | value in GF(128). If we consider a GF(128) value in a | ||
378 | single byte, we can construct a table of the 256 16 byte | ||
379 | values that result from the 256 values of this byte. | ||
380 | This requires 4096 bytes. If we take the highest byte in | ||
381 | the buffer and use this table to get the result, we then | ||
382 | have to multiply by x^120 to get the final value. For the | ||
383 | next highest byte the result has to be multiplied by x^112 | ||
384 | and so on. But we can do this by accumulating the result | ||
385 | in an accumulator starting with the result for the top | ||
386 | byte. We repeatedly multiply the accumulator value by | ||
387 | x^8 and then add in (i.e. xor) the 16 bytes of the next | ||
388 | lower byte in the buffer, stopping when we reach the | ||
389 | lowest byte. This requires a 4096 byte table. | ||
390 | */ | ||
391 | struct gf128mul_4k *gf128mul_init_4k_lle(const be128 *g) | ||
392 | { | ||
393 | struct gf128mul_4k *t; | ||
394 | int j, k; | ||
395 | |||
396 | t = kzalloc(sizeof(*t), GFP_KERNEL); | ||
397 | if (!t) | ||
398 | goto out; | ||
399 | |||
400 | t->t[128] = *g; | ||
401 | for (j = 64; j > 0; j >>= 1) | ||
402 | gf128mul_x_lle(&t->t[j], &t->t[j+j]); | ||
403 | |||
404 | for (j = 2; j < 256; j += j) | ||
405 | for (k = 1; k < j; ++k) | ||
406 | be128_xor(&t->t[j + k], &t->t[j], &t->t[k]); | ||
407 | |||
408 | out: | ||
409 | return t; | ||
410 | } | ||
411 | EXPORT_SYMBOL(gf128mul_init_4k_lle); | ||
412 | |||
413 | struct gf128mul_4k *gf128mul_init_4k_bbe(const be128 *g) | ||
414 | { | ||
415 | struct gf128mul_4k *t; | ||
416 | int j, k; | ||
417 | |||
418 | t = kzalloc(sizeof(*t), GFP_KERNEL); | ||
419 | if (!t) | ||
420 | goto out; | ||
421 | |||
422 | t->t[1] = *g; | ||
423 | for (j = 1; j <= 64; j <<= 1) | ||
424 | gf128mul_x_bbe(&t->t[j + j], &t->t[j]); | ||
425 | |||
426 | for (j = 2; j < 256; j += j) | ||
427 | for (k = 1; k < j; ++k) | ||
428 | be128_xor(&t->t[j + k], &t->t[j], &t->t[k]); | ||
429 | |||
430 | out: | ||
431 | return t; | ||
432 | } | ||
433 | EXPORT_SYMBOL(gf128mul_init_4k_bbe); | ||
434 | |||
435 | void gf128mul_4k_lle(be128 *a, struct gf128mul_4k *t) | ||
436 | { | ||
437 | u8 *ap = (u8 *)a; | ||
438 | be128 r[1]; | ||
439 | int i = 15; | ||
440 | |||
441 | *r = t->t[ap[15]]; | ||
442 | while (i--) { | ||
443 | gf128mul_x8_lle(r); | ||
444 | be128_xor(r, r, &t->t[ap[i]]); | ||
445 | } | ||
446 | *a = *r; | ||
447 | } | ||
448 | EXPORT_SYMBOL(gf128mul_4k_lle); | ||
449 | |||
450 | void gf128mul_4k_bbe(be128 *a, struct gf128mul_4k *t) | ||
451 | { | ||
452 | u8 *ap = (u8 *)a; | ||
453 | be128 r[1]; | ||
454 | int i = 0; | ||
455 | |||
456 | *r = t->t[ap[0]]; | ||
457 | while (++i < 16) { | ||
458 | gf128mul_x8_bbe(r); | ||
459 | be128_xor(r, r, &t->t[ap[i]]); | ||
460 | } | ||
461 | *a = *r; | ||
462 | } | ||
463 | EXPORT_SYMBOL(gf128mul_4k_bbe); | ||
464 | |||
465 | MODULE_LICENSE("GPL"); | ||
466 | MODULE_DESCRIPTION("Functions for multiplying elements of GF(2^128)"); | ||
diff --git a/crypto/lrw.c b/crypto/lrw.c new file mode 100644 index 000000000000..56642586d84f --- /dev/null +++ b/crypto/lrw.c | |||
@@ -0,0 +1,301 @@ | |||
1 | /* LRW: as defined by Cyril Guyot in | ||
2 | * http://grouper.ieee.org/groups/1619/email/pdf00017.pdf | ||
3 | * | ||
4 | * Copyright (c) 2006 Rik Snel <rsnel@cube.dyndns.org> | ||
5 | * | ||
6 | * Based om ecb.c | ||
7 | * Copyright (c) 2006 Herbert Xu <herbert@gondor.apana.org.au> | ||
8 | * | ||
9 | * This program is free software; you can redistribute it and/or modify it | ||
10 | * under the terms of the GNU General Public License as published by the Free | ||
11 | * Software Foundation; either version 2 of the License, or (at your option) | ||
12 | * any later version. | ||
13 | */ | ||
14 | /* This implementation is checked against the test vectors in the above | ||
15 | * document and by a test vector provided by Ken Buchanan at | ||
16 | * http://www.mail-archive.com/stds-p1619@listserv.ieee.org/msg00173.html | ||
17 | * | ||
18 | * The test vectors are included in the testing module tcrypt.[ch] */ | ||
19 | #include <crypto/algapi.h> | ||
20 | #include <linux/err.h> | ||
21 | #include <linux/init.h> | ||
22 | #include <linux/kernel.h> | ||
23 | #include <linux/module.h> | ||
24 | #include <linux/scatterlist.h> | ||
25 | #include <linux/slab.h> | ||
26 | |||
27 | #include <crypto/b128ops.h> | ||
28 | #include <crypto/gf128mul.h> | ||
29 | |||
30 | struct priv { | ||
31 | struct crypto_cipher *child; | ||
32 | /* optimizes multiplying a random (non incrementing, as at the | ||
33 | * start of a new sector) value with key2, we could also have | ||
34 | * used 4k optimization tables or no optimization at all. In the | ||
35 | * latter case we would have to store key2 here */ | ||
36 | struct gf128mul_64k *table; | ||
37 | /* stores: | ||
38 | * key2*{ 0,0,...0,0,0,0,1 }, key2*{ 0,0,...0,0,0,1,1 }, | ||
39 | * key2*{ 0,0,...0,0,1,1,1 }, key2*{ 0,0,...0,1,1,1,1 } | ||
40 | * key2*{ 0,0,...1,1,1,1,1 }, etc | ||
41 | * needed for optimized multiplication of incrementing values | ||
42 | * with key2 */ | ||
43 | be128 mulinc[128]; | ||
44 | }; | ||
45 | |||
46 | static inline void setbit128_bbe(void *b, int bit) | ||
47 | { | ||
48 | __set_bit(bit ^ 0x78, b); | ||
49 | } | ||
50 | |||
51 | static int setkey(struct crypto_tfm *parent, const u8 *key, | ||
52 | unsigned int keylen) | ||
53 | { | ||
54 | struct priv *ctx = crypto_tfm_ctx(parent); | ||
55 | struct crypto_cipher *child = ctx->child; | ||
56 | int err, i; | ||
57 | be128 tmp = { 0 }; | ||
58 | int bsize = crypto_cipher_blocksize(child); | ||
59 | |||
60 | crypto_cipher_clear_flags(child, CRYPTO_TFM_REQ_MASK); | ||
61 | crypto_cipher_set_flags(child, crypto_tfm_get_flags(parent) & | ||
62 | CRYPTO_TFM_REQ_MASK); | ||
63 | if ((err = crypto_cipher_setkey(child, key, keylen - bsize))) | ||
64 | return err; | ||
65 | crypto_tfm_set_flags(parent, crypto_cipher_get_flags(child) & | ||
66 | CRYPTO_TFM_RES_MASK); | ||
67 | |||
68 | if (ctx->table) | ||
69 | gf128mul_free_64k(ctx->table); | ||
70 | |||
71 | /* initialize multiplication table for Key2 */ | ||
72 | ctx->table = gf128mul_init_64k_bbe((be128 *)(key + keylen - bsize)); | ||
73 | if (!ctx->table) | ||
74 | return -ENOMEM; | ||
75 | |||
76 | /* initialize optimization table */ | ||
77 | for (i = 0; i < 128; i++) { | ||
78 | setbit128_bbe(&tmp, i); | ||
79 | ctx->mulinc[i] = tmp; | ||
80 | gf128mul_64k_bbe(&ctx->mulinc[i], ctx->table); | ||
81 | } | ||
82 | |||
83 | return 0; | ||
84 | } | ||
85 | |||
86 | struct sinfo { | ||
87 | be128 t; | ||
88 | struct crypto_tfm *tfm; | ||
89 | void (*fn)(struct crypto_tfm *, u8 *, const u8 *); | ||
90 | }; | ||
91 | |||
92 | static inline void inc(be128 *iv) | ||
93 | { | ||
94 | if (!(iv->b = cpu_to_be64(be64_to_cpu(iv->b) + 1))) | ||
95 | iv->a = cpu_to_be64(be64_to_cpu(iv->a) + 1); | ||
96 | } | ||
97 | |||
98 | static inline void lrw_round(struct sinfo *s, void *dst, const void *src) | ||
99 | { | ||
100 | be128_xor(dst, &s->t, src); /* PP <- T xor P */ | ||
101 | s->fn(s->tfm, dst, dst); /* CC <- E(Key2,PP) */ | ||
102 | be128_xor(dst, dst, &s->t); /* C <- T xor CC */ | ||
103 | } | ||
104 | |||
105 | /* this returns the number of consequative 1 bits starting | ||
106 | * from the right, get_index128(00 00 00 00 00 00 ... 00 00 10 FB) = 2 */ | ||
107 | static inline int get_index128(be128 *block) | ||
108 | { | ||
109 | int x; | ||
110 | __be32 *p = (__be32 *) block; | ||
111 | |||
112 | for (p += 3, x = 0; x < 128; p--, x += 32) { | ||
113 | u32 val = be32_to_cpup(p); | ||
114 | |||
115 | if (!~val) | ||
116 | continue; | ||
117 | |||
118 | return x + ffz(val); | ||
119 | } | ||
120 | |||
121 | return x; | ||
122 | } | ||
123 | |||
124 | static int crypt(struct blkcipher_desc *d, | ||
125 | struct blkcipher_walk *w, struct priv *ctx, | ||
126 | void (*fn)(struct crypto_tfm *, u8 *, const u8 *)) | ||
127 | { | ||
128 | int err; | ||
129 | unsigned int avail; | ||
130 | const int bs = crypto_cipher_blocksize(ctx->child); | ||
131 | struct sinfo s = { | ||
132 | .tfm = crypto_cipher_tfm(ctx->child), | ||
133 | .fn = fn | ||
134 | }; | ||
135 | be128 *iv; | ||
136 | u8 *wsrc; | ||
137 | u8 *wdst; | ||
138 | |||
139 | err = blkcipher_walk_virt(d, w); | ||
140 | if (!(avail = w->nbytes)) | ||
141 | return err; | ||
142 | |||
143 | wsrc = w->src.virt.addr; | ||
144 | wdst = w->dst.virt.addr; | ||
145 | |||
146 | /* calculate first value of T */ | ||
147 | iv = (be128 *)w->iv; | ||
148 | s.t = *iv; | ||
149 | |||
150 | /* T <- I*Key2 */ | ||
151 | gf128mul_64k_bbe(&s.t, ctx->table); | ||
152 | |||
153 | goto first; | ||
154 | |||
155 | for (;;) { | ||
156 | do { | ||
157 | /* T <- I*Key2, using the optimization | ||
158 | * discussed in the specification */ | ||
159 | be128_xor(&s.t, &s.t, &ctx->mulinc[get_index128(iv)]); | ||
160 | inc(iv); | ||
161 | |||
162 | first: | ||
163 | lrw_round(&s, wdst, wsrc); | ||
164 | |||
165 | wsrc += bs; | ||
166 | wdst += bs; | ||
167 | } while ((avail -= bs) >= bs); | ||
168 | |||
169 | err = blkcipher_walk_done(d, w, avail); | ||
170 | if (!(avail = w->nbytes)) | ||
171 | break; | ||
172 | |||
173 | wsrc = w->src.virt.addr; | ||
174 | wdst = w->dst.virt.addr; | ||
175 | } | ||
176 | |||
177 | return err; | ||
178 | } | ||
179 | |||
180 | static int encrypt(struct blkcipher_desc *desc, struct scatterlist *dst, | ||
181 | struct scatterlist *src, unsigned int nbytes) | ||
182 | { | ||
183 | struct priv *ctx = crypto_blkcipher_ctx(desc->tfm); | ||
184 | struct blkcipher_walk w; | ||
185 | |||
186 | blkcipher_walk_init(&w, dst, src, nbytes); | ||
187 | return crypt(desc, &w, ctx, | ||
188 | crypto_cipher_alg(ctx->child)->cia_encrypt); | ||
189 | } | ||
190 | |||
191 | static int decrypt(struct blkcipher_desc *desc, struct scatterlist *dst, | ||
192 | struct scatterlist *src, unsigned int nbytes) | ||
193 | { | ||
194 | struct priv *ctx = crypto_blkcipher_ctx(desc->tfm); | ||
195 | struct blkcipher_walk w; | ||
196 | |||
197 | blkcipher_walk_init(&w, dst, src, nbytes); | ||
198 | return crypt(desc, &w, ctx, | ||
199 | crypto_cipher_alg(ctx->child)->cia_decrypt); | ||
200 | } | ||
201 | |||
202 | static int init_tfm(struct crypto_tfm *tfm) | ||
203 | { | ||
204 | struct crypto_instance *inst = (void *)tfm->__crt_alg; | ||
205 | struct crypto_spawn *spawn = crypto_instance_ctx(inst); | ||
206 | struct priv *ctx = crypto_tfm_ctx(tfm); | ||
207 | u32 *flags = &tfm->crt_flags; | ||
208 | |||
209 | tfm = crypto_spawn_tfm(spawn); | ||
210 | if (IS_ERR(tfm)) | ||
211 | return PTR_ERR(tfm); | ||
212 | |||
213 | if (crypto_tfm_alg_blocksize(tfm) != 16) { | ||
214 | *flags |= CRYPTO_TFM_RES_BAD_BLOCK_LEN; | ||
215 | return -EINVAL; | ||
216 | } | ||
217 | |||
218 | ctx->child = crypto_cipher_cast(tfm); | ||
219 | return 0; | ||
220 | } | ||
221 | |||
222 | static void exit_tfm(struct crypto_tfm *tfm) | ||
223 | { | ||
224 | struct priv *ctx = crypto_tfm_ctx(tfm); | ||
225 | if (ctx->table) | ||
226 | gf128mul_free_64k(ctx->table); | ||
227 | crypto_free_cipher(ctx->child); | ||
228 | } | ||
229 | |||
230 | static struct crypto_instance *alloc(void *param, unsigned int len) | ||
231 | { | ||
232 | struct crypto_instance *inst; | ||
233 | struct crypto_alg *alg; | ||
234 | |||
235 | alg = crypto_get_attr_alg(param, len, CRYPTO_ALG_TYPE_CIPHER, | ||
236 | CRYPTO_ALG_TYPE_MASK | CRYPTO_ALG_ASYNC); | ||
237 | if (IS_ERR(alg)) | ||
238 | return ERR_PTR(PTR_ERR(alg)); | ||
239 | |||
240 | inst = crypto_alloc_instance("lrw", alg); | ||
241 | if (IS_ERR(inst)) | ||
242 | goto out_put_alg; | ||
243 | |||
244 | inst->alg.cra_flags = CRYPTO_ALG_TYPE_BLKCIPHER; | ||
245 | inst->alg.cra_priority = alg->cra_priority; | ||
246 | inst->alg.cra_blocksize = alg->cra_blocksize; | ||
247 | |||
248 | if (alg->cra_alignmask < 7) inst->alg.cra_alignmask = 7; | ||
249 | else inst->alg.cra_alignmask = alg->cra_alignmask; | ||
250 | inst->alg.cra_type = &crypto_blkcipher_type; | ||
251 | |||
252 | if (!(alg->cra_blocksize % 4)) | ||
253 | inst->alg.cra_alignmask |= 3; | ||
254 | inst->alg.cra_blkcipher.ivsize = alg->cra_blocksize; | ||
255 | inst->alg.cra_blkcipher.min_keysize = | ||
256 | alg->cra_cipher.cia_min_keysize + alg->cra_blocksize; | ||
257 | inst->alg.cra_blkcipher.max_keysize = | ||
258 | alg->cra_cipher.cia_max_keysize + alg->cra_blocksize; | ||
259 | |||
260 | inst->alg.cra_ctxsize = sizeof(struct priv); | ||
261 | |||
262 | inst->alg.cra_init = init_tfm; | ||
263 | inst->alg.cra_exit = exit_tfm; | ||
264 | |||
265 | inst->alg.cra_blkcipher.setkey = setkey; | ||
266 | inst->alg.cra_blkcipher.encrypt = encrypt; | ||
267 | inst->alg.cra_blkcipher.decrypt = decrypt; | ||
268 | |||
269 | out_put_alg: | ||
270 | crypto_mod_put(alg); | ||
271 | return inst; | ||
272 | } | ||
273 | |||
274 | static void free(struct crypto_instance *inst) | ||
275 | { | ||
276 | crypto_drop_spawn(crypto_instance_ctx(inst)); | ||
277 | kfree(inst); | ||
278 | } | ||
279 | |||
280 | static struct crypto_template crypto_tmpl = { | ||
281 | .name = "lrw", | ||
282 | .alloc = alloc, | ||
283 | .free = free, | ||
284 | .module = THIS_MODULE, | ||
285 | }; | ||
286 | |||
287 | static int __init crypto_module_init(void) | ||
288 | { | ||
289 | return crypto_register_template(&crypto_tmpl); | ||
290 | } | ||
291 | |||
292 | static void __exit crypto_module_exit(void) | ||
293 | { | ||
294 | crypto_unregister_template(&crypto_tmpl); | ||
295 | } | ||
296 | |||
297 | module_init(crypto_module_init); | ||
298 | module_exit(crypto_module_exit); | ||
299 | |||
300 | MODULE_LICENSE("GPL"); | ||
301 | MODULE_DESCRIPTION("LRW block cipher mode"); | ||
diff --git a/crypto/tcrypt.c b/crypto/tcrypt.c index 83307420d31c..d671e8942b1f 100644 --- a/crypto/tcrypt.c +++ b/crypto/tcrypt.c | |||
@@ -906,6 +906,10 @@ static void do_test(void) | |||
906 | AES_CBC_ENC_TEST_VECTORS); | 906 | AES_CBC_ENC_TEST_VECTORS); |
907 | test_cipher("cbc(aes)", DECRYPT, aes_cbc_dec_tv_template, | 907 | test_cipher("cbc(aes)", DECRYPT, aes_cbc_dec_tv_template, |
908 | AES_CBC_DEC_TEST_VECTORS); | 908 | AES_CBC_DEC_TEST_VECTORS); |
909 | test_cipher("lrw(aes)", ENCRYPT, aes_lrw_enc_tv_template, | ||
910 | AES_LRW_ENC_TEST_VECTORS); | ||
911 | test_cipher("lrw(aes)", DECRYPT, aes_lrw_dec_tv_template, | ||
912 | AES_LRW_DEC_TEST_VECTORS); | ||
909 | 913 | ||
910 | //CAST5 | 914 | //CAST5 |
911 | test_cipher("ecb(cast5)", ENCRYPT, cast5_enc_tv_template, | 915 | test_cipher("ecb(cast5)", ENCRYPT, cast5_enc_tv_template, |
@@ -977,6 +981,9 @@ static void do_test(void) | |||
977 | test_hash("hmac(sha256)", hmac_sha256_tv_template, | 981 | test_hash("hmac(sha256)", hmac_sha256_tv_template, |
978 | HMAC_SHA256_TEST_VECTORS); | 982 | HMAC_SHA256_TEST_VECTORS); |
979 | 983 | ||
984 | test_hash("xcbc(aes)", aes_xcbc128_tv_template, | ||
985 | XCBC_AES_TEST_VECTORS); | ||
986 | |||
980 | test_hash("michael_mic", michael_mic_tv_template, MICHAEL_MIC_TEST_VECTORS); | 987 | test_hash("michael_mic", michael_mic_tv_template, MICHAEL_MIC_TEST_VECTORS); |
981 | break; | 988 | break; |
982 | 989 | ||
@@ -1052,6 +1059,10 @@ static void do_test(void) | |||
1052 | AES_CBC_ENC_TEST_VECTORS); | 1059 | AES_CBC_ENC_TEST_VECTORS); |
1053 | test_cipher("cbc(aes)", DECRYPT, aes_cbc_dec_tv_template, | 1060 | test_cipher("cbc(aes)", DECRYPT, aes_cbc_dec_tv_template, |
1054 | AES_CBC_DEC_TEST_VECTORS); | 1061 | AES_CBC_DEC_TEST_VECTORS); |
1062 | test_cipher("lrw(aes)", ENCRYPT, aes_lrw_enc_tv_template, | ||
1063 | AES_LRW_ENC_TEST_VECTORS); | ||
1064 | test_cipher("lrw(aes)", DECRYPT, aes_lrw_dec_tv_template, | ||
1065 | AES_LRW_DEC_TEST_VECTORS); | ||
1055 | break; | 1066 | break; |
1056 | 1067 | ||
1057 | case 11: | 1068 | case 11: |
@@ -1191,6 +1202,10 @@ static void do_test(void) | |||
1191 | aes_speed_template); | 1202 | aes_speed_template); |
1192 | test_cipher_speed("cbc(aes)", DECRYPT, sec, NULL, 0, | 1203 | test_cipher_speed("cbc(aes)", DECRYPT, sec, NULL, 0, |
1193 | aes_speed_template); | 1204 | aes_speed_template); |
1205 | test_cipher_speed("lrw(aes)", ENCRYPT, sec, NULL, 0, | ||
1206 | aes_lrw_speed_template); | ||
1207 | test_cipher_speed("lrw(aes)", DECRYPT, sec, NULL, 0, | ||
1208 | aes_lrw_speed_template); | ||
1194 | break; | 1209 | break; |
1195 | 1210 | ||
1196 | case 201: | 1211 | case 201: |
diff --git a/crypto/tcrypt.h b/crypto/tcrypt.h index a40c4411729e..48a81362cb85 100644 --- a/crypto/tcrypt.h +++ b/crypto/tcrypt.h | |||
@@ -39,15 +39,15 @@ struct hash_testvec { | |||
39 | struct cipher_testvec { | 39 | struct cipher_testvec { |
40 | char key[MAX_KEYLEN] __attribute__ ((__aligned__(4))); | 40 | char key[MAX_KEYLEN] __attribute__ ((__aligned__(4))); |
41 | char iv[MAX_IVLEN]; | 41 | char iv[MAX_IVLEN]; |
42 | char input[48]; | 42 | char input[512]; |
43 | char result[48]; | 43 | char result[512]; |
44 | unsigned char tap[MAX_TAP]; | 44 | unsigned char tap[MAX_TAP]; |
45 | int np; | 45 | int np; |
46 | unsigned char fail; | 46 | unsigned char fail; |
47 | unsigned char wk; /* weak key flag */ | 47 | unsigned char wk; /* weak key flag */ |
48 | unsigned char klen; | 48 | unsigned char klen; |
49 | unsigned char ilen; | 49 | unsigned short ilen; |
50 | unsigned char rlen; | 50 | unsigned short rlen; |
51 | }; | 51 | }; |
52 | 52 | ||
53 | struct cipher_speed { | 53 | struct cipher_speed { |
@@ -933,6 +933,74 @@ static struct hash_testvec hmac_sha256_tv_template[] = { | |||
933 | }, | 933 | }, |
934 | }; | 934 | }; |
935 | 935 | ||
936 | #define XCBC_AES_TEST_VECTORS 6 | ||
937 | |||
938 | static struct hash_testvec aes_xcbc128_tv_template[] = { | ||
939 | { | ||
940 | .key = { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, | ||
941 | 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f }, | ||
942 | .plaintext = { [0 ... 15] = 0 }, | ||
943 | .digest = { 0x75, 0xf0, 0x25, 0x1d, 0x52, 0x8a, 0xc0, 0x1c, | ||
944 | 0x45, 0x73, 0xdf, 0xd5, 0x84, 0xd7, 0x9f, 0x29 }, | ||
945 | .psize = 0, | ||
946 | .ksize = 16, | ||
947 | }, { | ||
948 | .key = { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, | ||
949 | 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f }, | ||
950 | .plaintext = { 0x00, 0x01, 0x02 }, | ||
951 | .digest = { 0x5b, 0x37, 0x65, 0x80, 0xae, 0x2f, 0x19, 0xaf, | ||
952 | 0xe7, 0x21, 0x9c, 0xee, 0xf1, 0x72, 0x75, 0x6f }, | ||
953 | .psize = 3, | ||
954 | .ksize = 16, | ||
955 | } , { | ||
956 | .key = { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, | ||
957 | 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f }, | ||
958 | .plaintext = { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, | ||
959 | 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f }, | ||
960 | .digest = { 0xd2, 0xa2, 0x46, 0xfa, 0x34, 0x9b, 0x68, 0xa7, | ||
961 | 0x99, 0x98, 0xa4, 0x39, 0x4f, 0xf7, 0xa2, 0x63 }, | ||
962 | .psize = 16, | ||
963 | .ksize = 16, | ||
964 | }, { | ||
965 | .key = { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, | ||
966 | 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f }, | ||
967 | .plaintext = { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, | ||
968 | 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, | ||
969 | 0x10, 0x11, 0x12, 0x13 }, | ||
970 | .digest = { 0x47, 0xf5, 0x1b, 0x45, 0x64, 0x96, 0x62, 0x15, | ||
971 | 0xb8, 0x98, 0x5c, 0x63, 0x05, 0x5e, 0xd3, 0x08 }, | ||
972 | .tap = { 10, 10 }, | ||
973 | .psize = 20, | ||
974 | .np = 2, | ||
975 | .ksize = 16, | ||
976 | }, { | ||
977 | .key = { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, | ||
978 | 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f }, | ||
979 | .plaintext = { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, | ||
980 | 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, | ||
981 | 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, | ||
982 | 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f }, | ||
983 | .digest = { 0xf5, 0x4f, 0x0e, 0xc8, 0xd2, 0xb9, 0xf3, 0xd3, | ||
984 | 0x68, 0x07, 0x73, 0x4b, 0xd5, 0x28, 0x3f, 0xd4 }, | ||
985 | .psize = 32, | ||
986 | .ksize = 16, | ||
987 | }, { | ||
988 | .key = { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, | ||
989 | 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f }, | ||
990 | .plaintext = { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, | ||
991 | 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, | ||
992 | 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, | ||
993 | 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, | ||
994 | 0x20, 0x21 }, | ||
995 | .digest = { 0xbe, 0xcb, 0xb3, 0xbc, 0xcd, 0xb5, 0x18, 0xa3, | ||
996 | 0x06, 0x77, 0xd5, 0x48, 0x1f, 0xb6, 0xb4, 0xd8 }, | ||
997 | .tap = { 17, 17 }, | ||
998 | .psize = 34, | ||
999 | .np = 2, | ||
1000 | .ksize = 16, | ||
1001 | } | ||
1002 | }; | ||
1003 | |||
936 | /* | 1004 | /* |
937 | * DES test vectors. | 1005 | * DES test vectors. |
938 | */ | 1006 | */ |
@@ -1831,6 +1899,8 @@ static struct cipher_testvec cast6_dec_tv_template[] = { | |||
1831 | #define AES_DEC_TEST_VECTORS 3 | 1899 | #define AES_DEC_TEST_VECTORS 3 |
1832 | #define AES_CBC_ENC_TEST_VECTORS 2 | 1900 | #define AES_CBC_ENC_TEST_VECTORS 2 |
1833 | #define AES_CBC_DEC_TEST_VECTORS 2 | 1901 | #define AES_CBC_DEC_TEST_VECTORS 2 |
1902 | #define AES_LRW_ENC_TEST_VECTORS 8 | ||
1903 | #define AES_LRW_DEC_TEST_VECTORS 8 | ||
1834 | 1904 | ||
1835 | static struct cipher_testvec aes_enc_tv_template[] = { | 1905 | static struct cipher_testvec aes_enc_tv_template[] = { |
1836 | { /* From FIPS-197 */ | 1906 | { /* From FIPS-197 */ |
@@ -1968,6 +2038,509 @@ static struct cipher_testvec aes_cbc_dec_tv_template[] = { | |||
1968 | }, | 2038 | }, |
1969 | }; | 2039 | }; |
1970 | 2040 | ||
2041 | static struct cipher_testvec aes_lrw_enc_tv_template[] = { | ||
2042 | /* from http://grouper.ieee.org/groups/1619/email/pdf00017.pdf */ | ||
2043 | { /* LRW-32-AES 1 */ | ||
2044 | .key = { 0x45, 0x62, 0xac, 0x25, 0xf8, 0x28, 0x17, 0x6d, | ||
2045 | 0x4c, 0x26, 0x84, 0x14, 0xb5, 0x68, 0x01, 0x85, | ||
2046 | 0x25, 0x8e, 0x2a, 0x05, 0xe7, 0x3e, 0x9d, 0x03, | ||
2047 | 0xee, 0x5a, 0x83, 0x0c, 0xcc, 0x09, 0x4c, 0x87 }, | ||
2048 | .klen = 32, | ||
2049 | .iv = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
2050 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01 }, | ||
2051 | .input = { 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, | ||
2052 | 0x38, 0x39, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46 }, | ||
2053 | .ilen = 16, | ||
2054 | .result = { 0xf1, 0xb2, 0x73, 0xcd, 0x65, 0xa3, 0xdf, 0x5f, | ||
2055 | 0xe9, 0x5d, 0x48, 0x92, 0x54, 0x63, 0x4e, 0xb8 }, | ||
2056 | .rlen = 16, | ||
2057 | }, { /* LRW-32-AES 2 */ | ||
2058 | .key = { 0x59, 0x70, 0x47, 0x14, 0xf5, 0x57, 0x47, 0x8c, | ||
2059 | 0xd7, 0x79, 0xe8, 0x0f, 0x54, 0x88, 0x79, 0x44, | ||
2060 | 0x0d, 0x48, 0xf0, 0xb7, 0xb1, 0x5a, 0x53, 0xea, | ||
2061 | 0x1c, 0xaa, 0x6b, 0x29, 0xc2, 0xca, 0xfb, 0xaf | ||
2062 | }, | ||
2063 | .klen = 32, | ||
2064 | .iv = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
2065 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02 }, | ||
2066 | .input = { 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, | ||
2067 | 0x38, 0x39, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46 }, | ||
2068 | .ilen = 16, | ||
2069 | .result = { 0x00, 0xc8, 0x2b, 0xae, 0x95, 0xbb, 0xcd, 0xe5, | ||
2070 | 0x27, 0x4f, 0x07, 0x69, 0xb2, 0x60, 0xe1, 0x36 }, | ||
2071 | .rlen = 16, | ||
2072 | }, { /* LRW-32-AES 3 */ | ||
2073 | .key = { 0xd8, 0x2a, 0x91, 0x34, 0xb2, 0x6a, 0x56, 0x50, | ||
2074 | 0x30, 0xfe, 0x69, 0xe2, 0x37, 0x7f, 0x98, 0x47, | ||
2075 | 0xcd, 0xf9, 0x0b, 0x16, 0x0c, 0x64, 0x8f, 0xb6, | ||
2076 | 0xb0, 0x0d, 0x0d, 0x1b, 0xae, 0x85, 0x87, 0x1f }, | ||
2077 | .klen = 32, | ||
2078 | .iv = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
2079 | 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00 }, | ||
2080 | .input = { 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, | ||
2081 | 0x38, 0x39, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46 }, | ||
2082 | .ilen = 16, | ||
2083 | .result = { 0x76, 0x32, 0x21, 0x83, 0xed, 0x8f, 0xf1, 0x82, | ||
2084 | 0xf9, 0x59, 0x62, 0x03, 0x69, 0x0e, 0x5e, 0x01 }, | ||
2085 | .rlen = 16, | ||
2086 | }, { /* LRW-32-AES 4 */ | ||
2087 | .key = { 0x0f, 0x6a, 0xef, 0xf8, 0xd3, 0xd2, 0xbb, 0x15, | ||
2088 | 0x25, 0x83, 0xf7, 0x3c, 0x1f, 0x01, 0x28, 0x74, | ||
2089 | 0xca, 0xc6, 0xbc, 0x35, 0x4d, 0x4a, 0x65, 0x54, | ||
2090 | 0x90, 0xae, 0x61, 0xcf, 0x7b, 0xae, 0xbd, 0xcc, | ||
2091 | 0xad, 0xe4, 0x94, 0xc5, 0x4a, 0x29, 0xae, 0x70 }, | ||
2092 | .klen = 40, | ||
2093 | .iv = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
2094 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01 }, | ||
2095 | .input = { 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, | ||
2096 | 0x38, 0x39, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46 }, | ||
2097 | .ilen = 16, | ||
2098 | .result = { 0x9c, 0x0f, 0x15, 0x2f, 0x55, 0xa2, 0xd8, 0xf0, | ||
2099 | 0xd6, 0x7b, 0x8f, 0x9e, 0x28, 0x22, 0xbc, 0x41 }, | ||
2100 | .rlen = 16, | ||
2101 | }, { /* LRW-32-AES 5 */ | ||
2102 | .key = { 0x8a, 0xd4, 0xee, 0x10, 0x2f, 0xbd, 0x81, 0xff, | ||
2103 | 0xf8, 0x86, 0xce, 0xac, 0x93, 0xc5, 0xad, 0xc6, | ||
2104 | 0xa0, 0x19, 0x07, 0xc0, 0x9d, 0xf7, 0xbb, 0xdd, | ||
2105 | 0x52, 0x13, 0xb2, 0xb7, 0xf0, 0xff, 0x11, 0xd8, | ||
2106 | 0xd6, 0x08, 0xd0, 0xcd, 0x2e, 0xb1, 0x17, 0x6f }, | ||
2107 | .klen = 40, | ||
2108 | .iv = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
2109 | 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00 }, | ||
2110 | .input = { 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, | ||
2111 | 0x38, 0x39, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46 }, | ||
2112 | .ilen = 16, | ||
2113 | .result = { 0xd4, 0x27, 0x6a, 0x7f, 0x14, 0x91, 0x3d, 0x65, | ||
2114 | 0xc8, 0x60, 0x48, 0x02, 0x87, 0xe3, 0x34, 0x06 }, | ||
2115 | .rlen = 16, | ||
2116 | }, { /* LRW-32-AES 6 */ | ||
2117 | .key = { 0xf8, 0xd4, 0x76, 0xff, 0xd6, 0x46, 0xee, 0x6c, | ||
2118 | 0x23, 0x84, 0xcb, 0x1c, 0x77, 0xd6, 0x19, 0x5d, | ||
2119 | 0xfe, 0xf1, 0xa9, 0xf3, 0x7b, 0xbc, 0x8d, 0x21, | ||
2120 | 0xa7, 0x9c, 0x21, 0xf8, 0xcb, 0x90, 0x02, 0x89, | ||
2121 | 0xa8, 0x45, 0x34, 0x8e, 0xc8, 0xc5, 0xb5, 0xf1, | ||
2122 | 0x26, 0xf5, 0x0e, 0x76, 0xfe, 0xfd, 0x1b, 0x1e }, | ||
2123 | .klen = 48, | ||
2124 | .iv = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
2125 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01 }, | ||
2126 | .input = { 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, | ||
2127 | 0x38, 0x39, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46 }, | ||
2128 | .ilen = 16, | ||
2129 | .result = { 0xbd, 0x06, 0xb8, 0xe1, 0xdb, 0x98, 0x89, 0x9e, | ||
2130 | 0xc4, 0x98, 0xe4, 0x91, 0xcf, 0x1c, 0x70, 0x2b }, | ||
2131 | .rlen = 16, | ||
2132 | }, { /* LRW-32-AES 7 */ | ||
2133 | .key = { 0xfb, 0x76, 0x15, 0xb2, 0x3d, 0x80, 0x89, 0x1d, | ||
2134 | 0xd4, 0x70, 0x98, 0x0b, 0xc7, 0x95, 0x84, 0xc8, | ||
2135 | 0xb2, 0xfb, 0x64, 0xce, 0x60, 0x97, 0x87, 0x8d, | ||
2136 | 0x17, 0xfc, 0xe4, 0x5a, 0x49, 0xe8, 0x30, 0xb7, | ||
2137 | 0x6e, 0x78, 0x17, 0xe7, 0x2d, 0x5e, 0x12, 0xd4, | ||
2138 | 0x60, 0x64, 0x04, 0x7a, 0xf1, 0x2f, 0x9e, 0x0c }, | ||
2139 | .klen = 48, | ||
2140 | .iv = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
2141 | 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00 }, | ||
2142 | .input = { 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, | ||
2143 | 0x38, 0x39, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46 }, | ||
2144 | .ilen = 16, | ||
2145 | .result = { 0x5b, 0x90, 0x8e, 0xc1, 0xab, 0xdd, 0x67, 0x5f, | ||
2146 | 0x3d, 0x69, 0x8a, 0x95, 0x53, 0xc8, 0x9c, 0xe5 }, | ||
2147 | .rlen = 16, | ||
2148 | }, { | ||
2149 | /* http://www.mail-archive.com/stds-p1619@listserv.ieee.org/msg00173.html */ | ||
2150 | .key = { 0xf8, 0xd4, 0x76, 0xff, 0xd6, 0x46, 0xee, 0x6c, | ||
2151 | 0x23, 0x84, 0xcb, 0x1c, 0x77, 0xd6, 0x19, 0x5d, | ||
2152 | 0xfe, 0xf1, 0xa9, 0xf3, 0x7b, 0xbc, 0x8d, 0x21, | ||
2153 | 0xa7, 0x9c, 0x21, 0xf8, 0xcb, 0x90, 0x02, 0x89, | ||
2154 | 0xa8, 0x45, 0x34, 0x8e, 0xc8, 0xc5, 0xb5, 0xf1, | ||
2155 | 0x26, 0xf5, 0x0e, 0x76, 0xfe, 0xfd, 0x1b, 0x1e }, | ||
2156 | .klen = 48, | ||
2157 | .iv = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
2158 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01 }, | ||
2159 | .input = { 0x05, 0x11, 0xb7, 0x18, 0xab, 0xc6, 0x2d, 0xac, | ||
2160 | 0x70, 0x5d, 0xf6, 0x22, 0x94, 0xcd, 0xe5, 0x6c, | ||
2161 | 0x17, 0x6b, 0xf6, 0x1c, 0xf0, 0xf3, 0x6e, 0xf8, | ||
2162 | 0x50, 0x38, 0x1f, 0x71, 0x49, 0xb6, 0x57, 0xd6, | ||
2163 | 0x8f, 0xcb, 0x8d, 0x6b, 0xe3, 0xa6, 0x29, 0x90, | ||
2164 | 0xfe, 0x2a, 0x62, 0x82, 0xae, 0x6d, 0x8b, 0xf6, | ||
2165 | 0xad, 0x1e, 0x9e, 0x20, 0x5f, 0x38, 0xbe, 0x04, | ||
2166 | 0xda, 0x10, 0x8e, 0xed, 0xa2, 0xa4, 0x87, 0xab, | ||
2167 | 0xda, 0x6b, 0xb4, 0x0c, 0x75, 0xba, 0xd3, 0x7c, | ||
2168 | 0xc9, 0xac, 0x42, 0x31, 0x95, 0x7c, 0xc9, 0x04, | ||
2169 | 0xeb, 0xd5, 0x6e, 0x32, 0x69, 0x8a, 0xdb, 0xa6, | ||
2170 | 0x15, 0xd7, 0x3f, 0x4f, 0x2f, 0x66, 0x69, 0x03, | ||
2171 | 0x9c, 0x1f, 0x54, 0x0f, 0xde, 0x1f, 0xf3, 0x65, | ||
2172 | 0x4c, 0x96, 0x12, 0xed, 0x7c, 0x92, 0x03, 0x01, | ||
2173 | 0x6f, 0xbc, 0x35, 0x93, 0xac, 0xf1, 0x27, 0xf1, | ||
2174 | 0xb4, 0x96, 0x82, 0x5a, 0x5f, 0xb0, 0xa0, 0x50, | ||
2175 | 0x89, 0xa4, 0x8e, 0x66, 0x44, 0x85, 0xcc, 0xfd, | ||
2176 | 0x33, 0x14, 0x70, 0xe3, 0x96, 0xb2, 0xc3, 0xd3, | ||
2177 | 0xbb, 0x54, 0x5a, 0x1a, 0xf9, 0x74, 0xa2, 0xc5, | ||
2178 | 0x2d, 0x64, 0x75, 0xdd, 0xb4, 0x54, 0xe6, 0x74, | ||
2179 | 0x8c, 0xd3, 0x9d, 0x9e, 0x86, 0xab, 0x51, 0x53, | ||
2180 | 0xb7, 0x93, 0x3e, 0x6f, 0xd0, 0x4e, 0x2c, 0x40, | ||
2181 | 0xf6, 0xa8, 0x2e, 0x3e, 0x9d, 0xf4, 0x66, 0xa5, | ||
2182 | 0x76, 0x12, 0x73, 0x44, 0x1a, 0x56, 0xd7, 0x72, | ||
2183 | 0x88, 0xcd, 0x21, 0x8c, 0x4c, 0x0f, 0xfe, 0xda, | ||
2184 | 0x95, 0xe0, 0x3a, 0xa6, 0xa5, 0x84, 0x46, 0xcd, | ||
2185 | 0xd5, 0x3e, 0x9d, 0x3a, 0xe2, 0x67, 0xe6, 0x60, | ||
2186 | 0x1a, 0xe2, 0x70, 0x85, 0x58, 0xc2, 0x1b, 0x09, | ||
2187 | 0xe1, 0xd7, 0x2c, 0xca, 0xad, 0xa8, 0x8f, 0xf9, | ||
2188 | 0xac, 0xb3, 0x0e, 0xdb, 0xca, 0x2e, 0xe2, 0xb8, | ||
2189 | 0x51, 0x71, 0xd9, 0x3c, 0x6c, 0xf1, 0x56, 0xf8, | ||
2190 | 0xea, 0x9c, 0xf1, 0xfb, 0x0c, 0xe6, 0xb7, 0x10, | ||
2191 | 0x1c, 0xf8, 0xa9, 0x7c, 0xe8, 0x53, 0x35, 0xc1, | ||
2192 | 0x90, 0x3e, 0x76, 0x4a, 0x74, 0xa4, 0x21, 0x2c, | ||
2193 | 0xf6, 0x2c, 0x4e, 0x0f, 0x94, 0x3a, 0x88, 0x2e, | ||
2194 | 0x41, 0x09, 0x6a, 0x33, 0x7d, 0xf6, 0xdd, 0x3f, | ||
2195 | 0x8d, 0x23, 0x31, 0x74, 0x84, 0xeb, 0x88, 0x6e, | ||
2196 | 0xcc, 0xb9, 0xbc, 0x22, 0x83, 0x19, 0x07, 0x22, | ||
2197 | 0xa5, 0x2d, 0xdf, 0xa5, 0xf3, 0x80, 0x85, 0x78, | ||
2198 | 0x84, 0x39, 0x6a, 0x6d, 0x6a, 0x99, 0x4f, 0xa5, | ||
2199 | 0x15, 0xfe, 0x46, 0xb0, 0xe4, 0x6c, 0xa5, 0x41, | ||
2200 | 0x3c, 0xce, 0x8f, 0x42, 0x60, 0x71, 0xa7, 0x75, | ||
2201 | 0x08, 0x40, 0x65, 0x8a, 0x82, 0xbf, 0xf5, 0x43, | ||
2202 | 0x71, 0x96, 0xa9, 0x4d, 0x44, 0x8a, 0x20, 0xbe, | ||
2203 | 0xfa, 0x4d, 0xbb, 0xc0, 0x7d, 0x31, 0x96, 0x65, | ||
2204 | 0xe7, 0x75, 0xe5, 0x3e, 0xfd, 0x92, 0x3b, 0xc9, | ||
2205 | 0x55, 0xbb, 0x16, 0x7e, 0xf7, 0xc2, 0x8c, 0xa4, | ||
2206 | 0x40, 0x1d, 0xe5, 0xef, 0x0e, 0xdf, 0xe4, 0x9a, | ||
2207 | 0x62, 0x73, 0x65, 0xfd, 0x46, 0x63, 0x25, 0x3d, | ||
2208 | 0x2b, 0xaf, 0xe5, 0x64, 0xfe, 0xa5, 0x5c, 0xcf, | ||
2209 | 0x24, 0xf3, 0xb4, 0xac, 0x64, 0xba, 0xdf, 0x4b, | ||
2210 | 0xc6, 0x96, 0x7d, 0x81, 0x2d, 0x8d, 0x97, 0xf7, | ||
2211 | 0xc5, 0x68, 0x77, 0x84, 0x32, 0x2b, 0xcc, 0x85, | ||
2212 | 0x74, 0x96, 0xf0, 0x12, 0x77, 0x61, 0xb9, 0xeb, | ||
2213 | 0x71, 0xaa, 0x82, 0xcb, 0x1c, 0xdb, 0x89, 0xc8, | ||
2214 | 0xc6, 0xb5, 0xe3, 0x5c, 0x7d, 0x39, 0x07, 0x24, | ||
2215 | 0xda, 0x39, 0x87, 0x45, 0xc0, 0x2b, 0xbb, 0x01, | ||
2216 | 0xac, 0xbc, 0x2a, 0x5c, 0x7f, 0xfc, 0xe8, 0xce, | ||
2217 | 0x6d, 0x9c, 0x6f, 0xed, 0xd3, 0xc1, 0xa1, 0xd6, | ||
2218 | 0xc5, 0x55, 0xa9, 0x66, 0x2f, 0xe1, 0xc8, 0x32, | ||
2219 | 0xa6, 0x5d, 0xa4, 0x3a, 0x98, 0x73, 0xe8, 0x45, | ||
2220 | 0xa4, 0xc7, 0xa8, 0xb4, 0xf6, 0x13, 0x03, 0xf6, | ||
2221 | 0xe9, 0x2e, 0xc4, 0x29, 0x0f, 0x84, 0xdb, 0xc4, | ||
2222 | 0x21, 0xc4, 0xc2, 0x75, 0x67, 0x89, 0x37, 0x0a }, | ||
2223 | .ilen = 512, | ||
2224 | .result = { 0x1a, 0x1d, 0xa9, 0x30, 0xad, 0xf9, 0x2f, 0x9b, | ||
2225 | 0xb6, 0x1d, 0xae, 0xef, 0xf0, 0x2f, 0xf8, 0x5a, | ||
2226 | 0x39, 0x3c, 0xbf, 0x2a, 0xb2, 0x45, 0xb2, 0x23, | ||
2227 | 0x1b, 0x63, 0x3c, 0xcf, 0xaa, 0xbe, 0xcf, 0x4e, | ||
2228 | 0xfa, 0xe8, 0x29, 0xc2, 0x20, 0x68, 0x2b, 0x3c, | ||
2229 | 0x2e, 0x8b, 0xf7, 0x6e, 0x25, 0xbd, 0xe3, 0x3d, | ||
2230 | 0x66, 0x27, 0xd6, 0xaf, 0xd6, 0x64, 0x3e, 0xe3, | ||
2231 | 0xe8, 0x58, 0x46, 0x97, 0x39, 0x51, 0x07, 0xde, | ||
2232 | 0xcb, 0x37, 0xbc, 0xa9, 0xc0, 0x5f, 0x75, 0xc3, | ||
2233 | 0x0e, 0x84, 0x23, 0x1d, 0x16, 0xd4, 0x1c, 0x59, | ||
2234 | 0x9c, 0x1a, 0x02, 0x55, 0xab, 0x3a, 0x97, 0x1d, | ||
2235 | 0xdf, 0xdd, 0xc7, 0x06, 0x51, 0xd7, 0x70, 0xae, | ||
2236 | 0x23, 0xc6, 0x8c, 0xf5, 0x1e, 0xa0, 0xe5, 0x82, | ||
2237 | 0xb8, 0xb2, 0xbf, 0x04, 0xa0, 0x32, 0x8e, 0x68, | ||
2238 | 0xeb, 0xaf, 0x6e, 0x2d, 0x94, 0x22, 0x2f, 0xce, | ||
2239 | 0x4c, 0xb5, 0x59, 0xe2, 0xa2, 0x2f, 0xa0, 0x98, | ||
2240 | 0x1a, 0x97, 0xc6, 0xd4, 0xb5, 0x00, 0x59, 0xf2, | ||
2241 | 0x84, 0x14, 0x72, 0xb1, 0x9a, 0x6e, 0xa3, 0x7f, | ||
2242 | 0xea, 0x20, 0xe7, 0xcb, 0x65, 0x77, 0x3a, 0xdf, | ||
2243 | 0xc8, 0x97, 0x67, 0x15, 0xc2, 0x2a, 0x27, 0xcc, | ||
2244 | 0x18, 0x55, 0xa1, 0x24, 0x0b, 0x24, 0x24, 0xaf, | ||
2245 | 0x5b, 0xec, 0x68, 0xb8, 0xc8, 0xf5, 0xba, 0x63, | ||
2246 | 0xff, 0xed, 0x89, 0xce, 0xd5, 0x3d, 0x88, 0xf3, | ||
2247 | 0x25, 0xef, 0x05, 0x7c, 0x3a, 0xef, 0xeb, 0xd8, | ||
2248 | 0x7a, 0x32, 0x0d, 0xd1, 0x1e, 0x58, 0x59, 0x99, | ||
2249 | 0x90, 0x25, 0xb5, 0x26, 0xb0, 0xe3, 0x2b, 0x6c, | ||
2250 | 0x4c, 0xa9, 0x8b, 0x84, 0x4f, 0x5e, 0x01, 0x50, | ||
2251 | 0x41, 0x30, 0x58, 0xc5, 0x62, 0x74, 0x52, 0x1d, | ||
2252 | 0x45, 0x24, 0x6a, 0x42, 0x64, 0x4f, 0x97, 0x1c, | ||
2253 | 0xa8, 0x66, 0xb5, 0x6d, 0x79, 0xd4, 0x0d, 0x48, | ||
2254 | 0xc5, 0x5f, 0xf3, 0x90, 0x32, 0xdd, 0xdd, 0xe1, | ||
2255 | 0xe4, 0xa9, 0x9f, 0xfc, 0xc3, 0x52, 0x5a, 0x46, | ||
2256 | 0xe4, 0x81, 0x84, 0x95, 0x36, 0x59, 0x7a, 0x6b, | ||
2257 | 0xaa, 0xb3, 0x60, 0xad, 0xce, 0x9f, 0x9f, 0x28, | ||
2258 | 0xe0, 0x01, 0x75, 0x22, 0xc4, 0x4e, 0xa9, 0x62, | ||
2259 | 0x5c, 0x62, 0x0d, 0x00, 0xcb, 0x13, 0xe8, 0x43, | ||
2260 | 0x72, 0xd4, 0x2d, 0x53, 0x46, 0xb5, 0xd1, 0x16, | ||
2261 | 0x22, 0x18, 0xdf, 0x34, 0x33, 0xf5, 0xd6, 0x1c, | ||
2262 | 0xb8, 0x79, 0x78, 0x97, 0x94, 0xff, 0x72, 0x13, | ||
2263 | 0x4c, 0x27, 0xfc, 0xcb, 0xbf, 0x01, 0x53, 0xa6, | ||
2264 | 0xb4, 0x50, 0x6e, 0xde, 0xdf, 0xb5, 0x43, 0xa4, | ||
2265 | 0x59, 0xdf, 0x52, 0xf9, 0x7c, 0xe0, 0x11, 0x6f, | ||
2266 | 0x2d, 0x14, 0x8e, 0x24, 0x61, 0x2c, 0xe1, 0x17, | ||
2267 | 0xcc, 0xce, 0x51, 0x0c, 0x19, 0x8a, 0x82, 0x30, | ||
2268 | 0x94, 0xd5, 0x3d, 0x6a, 0x53, 0x06, 0x5e, 0xbd, | ||
2269 | 0xb7, 0xeb, 0xfa, 0xfd, 0x27, 0x51, 0xde, 0x85, | ||
2270 | 0x1e, 0x86, 0x53, 0x11, 0x53, 0x94, 0x00, 0xee, | ||
2271 | 0x2b, 0x8c, 0x08, 0x2a, 0xbf, 0xdd, 0xae, 0x11, | ||
2272 | 0xcb, 0x1e, 0xa2, 0x07, 0x9a, 0x80, 0xcf, 0x62, | ||
2273 | 0x9b, 0x09, 0xdc, 0x95, 0x3c, 0x96, 0x8e, 0xb1, | ||
2274 | 0x09, 0xbd, 0xe4, 0xeb, 0xdb, 0xca, 0x70, 0x7a, | ||
2275 | 0x9e, 0xfa, 0x31, 0x18, 0x45, 0x3c, 0x21, 0x33, | ||
2276 | 0xb0, 0xb3, 0x2b, 0xea, 0xf3, 0x71, 0x2d, 0xe1, | ||
2277 | 0x03, 0xad, 0x1b, 0x48, 0xd4, 0x67, 0x27, 0xf0, | ||
2278 | 0x62, 0xe4, 0x3d, 0xfb, 0x9b, 0x08, 0x76, 0xe7, | ||
2279 | 0xdd, 0x2b, 0x01, 0x39, 0x04, 0x5a, 0x58, 0x7a, | ||
2280 | 0xf7, 0x11, 0x90, 0xec, 0xbd, 0x51, 0x5c, 0x32, | ||
2281 | 0x6b, 0xd7, 0x35, 0x39, 0x02, 0x6b, 0xf2, 0xa6, | ||
2282 | 0xd0, 0x0d, 0x07, 0xe1, 0x06, 0xc4, 0x5b, 0x7d, | ||
2283 | 0xe4, 0x6a, 0xd7, 0xee, 0x15, 0x1f, 0x83, 0xb4, | ||
2284 | 0xa3, 0xa7, 0x5e, 0xc3, 0x90, 0xb7, 0xef, 0xd3, | ||
2285 | 0xb7, 0x4f, 0xf8, 0x92, 0x4c, 0xb7, 0x3c, 0x29, | ||
2286 | 0xcd, 0x7e, 0x2b, 0x5d, 0x43, 0xea, 0x42, 0xe7, | ||
2287 | 0x74, 0x3f, 0x7d, 0x58, 0x88, 0x75, 0xde, 0x3e }, | ||
2288 | .rlen = 512, | ||
2289 | } | ||
2290 | }; | ||
2291 | |||
2292 | static struct cipher_testvec aes_lrw_dec_tv_template[] = { | ||
2293 | /* from http://grouper.ieee.org/groups/1619/email/pdf00017.pdf */ | ||
2294 | /* same as enc vectors with input and result reversed */ | ||
2295 | { /* LRW-32-AES 1 */ | ||
2296 | .key = { 0x45, 0x62, 0xac, 0x25, 0xf8, 0x28, 0x17, 0x6d, | ||
2297 | 0x4c, 0x26, 0x84, 0x14, 0xb5, 0x68, 0x01, 0x85, | ||
2298 | 0x25, 0x8e, 0x2a, 0x05, 0xe7, 0x3e, 0x9d, 0x03, | ||
2299 | 0xee, 0x5a, 0x83, 0x0c, 0xcc, 0x09, 0x4c, 0x87 }, | ||
2300 | .klen = 32, | ||
2301 | .iv = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
2302 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01 }, | ||
2303 | .input = { 0xf1, 0xb2, 0x73, 0xcd, 0x65, 0xa3, 0xdf, 0x5f, | ||
2304 | 0xe9, 0x5d, 0x48, 0x92, 0x54, 0x63, 0x4e, 0xb8 }, | ||
2305 | .ilen = 16, | ||
2306 | .result = { 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, | ||
2307 | 0x38, 0x39, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46 }, | ||
2308 | .rlen = 16, | ||
2309 | }, { /* LRW-32-AES 2 */ | ||
2310 | .key = { 0x59, 0x70, 0x47, 0x14, 0xf5, 0x57, 0x47, 0x8c, | ||
2311 | 0xd7, 0x79, 0xe8, 0x0f, 0x54, 0x88, 0x79, 0x44, | ||
2312 | 0x0d, 0x48, 0xf0, 0xb7, 0xb1, 0x5a, 0x53, 0xea, | ||
2313 | 0x1c, 0xaa, 0x6b, 0x29, 0xc2, 0xca, 0xfb, 0xaf | ||
2314 | }, | ||
2315 | .klen = 32, | ||
2316 | .iv = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
2317 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02 }, | ||
2318 | .input = { 0x00, 0xc8, 0x2b, 0xae, 0x95, 0xbb, 0xcd, 0xe5, | ||
2319 | 0x27, 0x4f, 0x07, 0x69, 0xb2, 0x60, 0xe1, 0x36 }, | ||
2320 | .ilen = 16, | ||
2321 | .result = { 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, | ||
2322 | 0x38, 0x39, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46 }, | ||
2323 | .rlen = 16, | ||
2324 | }, { /* LRW-32-AES 3 */ | ||
2325 | .key = { 0xd8, 0x2a, 0x91, 0x34, 0xb2, 0x6a, 0x56, 0x50, | ||
2326 | 0x30, 0xfe, 0x69, 0xe2, 0x37, 0x7f, 0x98, 0x47, | ||
2327 | 0xcd, 0xf9, 0x0b, 0x16, 0x0c, 0x64, 0x8f, 0xb6, | ||
2328 | 0xb0, 0x0d, 0x0d, 0x1b, 0xae, 0x85, 0x87, 0x1f }, | ||
2329 | .klen = 32, | ||
2330 | .iv = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
2331 | 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00 }, | ||
2332 | .input = { 0x76, 0x32, 0x21, 0x83, 0xed, 0x8f, 0xf1, 0x82, | ||
2333 | 0xf9, 0x59, 0x62, 0x03, 0x69, 0x0e, 0x5e, 0x01 }, | ||
2334 | .ilen = 16, | ||
2335 | .result = { 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, | ||
2336 | 0x38, 0x39, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46 }, | ||
2337 | .rlen = 16, | ||
2338 | }, { /* LRW-32-AES 4 */ | ||
2339 | .key = { 0x0f, 0x6a, 0xef, 0xf8, 0xd3, 0xd2, 0xbb, 0x15, | ||
2340 | 0x25, 0x83, 0xf7, 0x3c, 0x1f, 0x01, 0x28, 0x74, | ||
2341 | 0xca, 0xc6, 0xbc, 0x35, 0x4d, 0x4a, 0x65, 0x54, | ||
2342 | 0x90, 0xae, 0x61, 0xcf, 0x7b, 0xae, 0xbd, 0xcc, | ||
2343 | 0xad, 0xe4, 0x94, 0xc5, 0x4a, 0x29, 0xae, 0x70 }, | ||
2344 | .klen = 40, | ||
2345 | .iv = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
2346 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01 }, | ||
2347 | .input = { 0x9c, 0x0f, 0x15, 0x2f, 0x55, 0xa2, 0xd8, 0xf0, | ||
2348 | 0xd6, 0x7b, 0x8f, 0x9e, 0x28, 0x22, 0xbc, 0x41 }, | ||
2349 | .ilen = 16, | ||
2350 | .result = { 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, | ||
2351 | 0x38, 0x39, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46 }, | ||
2352 | .rlen = 16, | ||
2353 | }, { /* LRW-32-AES 5 */ | ||
2354 | .key = { 0x8a, 0xd4, 0xee, 0x10, 0x2f, 0xbd, 0x81, 0xff, | ||
2355 | 0xf8, 0x86, 0xce, 0xac, 0x93, 0xc5, 0xad, 0xc6, | ||
2356 | 0xa0, 0x19, 0x07, 0xc0, 0x9d, 0xf7, 0xbb, 0xdd, | ||
2357 | 0x52, 0x13, 0xb2, 0xb7, 0xf0, 0xff, 0x11, 0xd8, | ||
2358 | 0xd6, 0x08, 0xd0, 0xcd, 0x2e, 0xb1, 0x17, 0x6f }, | ||
2359 | .klen = 40, | ||
2360 | .iv = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
2361 | 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00 }, | ||
2362 | .input = { 0xd4, 0x27, 0x6a, 0x7f, 0x14, 0x91, 0x3d, 0x65, | ||
2363 | 0xc8, 0x60, 0x48, 0x02, 0x87, 0xe3, 0x34, 0x06 }, | ||
2364 | .ilen = 16, | ||
2365 | .result = { 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, | ||
2366 | 0x38, 0x39, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46 }, | ||
2367 | .rlen = 16, | ||
2368 | }, { /* LRW-32-AES 6 */ | ||
2369 | .key = { 0xf8, 0xd4, 0x76, 0xff, 0xd6, 0x46, 0xee, 0x6c, | ||
2370 | 0x23, 0x84, 0xcb, 0x1c, 0x77, 0xd6, 0x19, 0x5d, | ||
2371 | 0xfe, 0xf1, 0xa9, 0xf3, 0x7b, 0xbc, 0x8d, 0x21, | ||
2372 | 0xa7, 0x9c, 0x21, 0xf8, 0xcb, 0x90, 0x02, 0x89, | ||
2373 | 0xa8, 0x45, 0x34, 0x8e, 0xc8, 0xc5, 0xb5, 0xf1, | ||
2374 | 0x26, 0xf5, 0x0e, 0x76, 0xfe, 0xfd, 0x1b, 0x1e }, | ||
2375 | .klen = 48, | ||
2376 | .iv = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
2377 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01 }, | ||
2378 | .input = { 0xbd, 0x06, 0xb8, 0xe1, 0xdb, 0x98, 0x89, 0x9e, | ||
2379 | 0xc4, 0x98, 0xe4, 0x91, 0xcf, 0x1c, 0x70, 0x2b }, | ||
2380 | .ilen = 16, | ||
2381 | .result = { 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, | ||
2382 | 0x38, 0x39, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46 }, | ||
2383 | .rlen = 16, | ||
2384 | }, { /* LRW-32-AES 7 */ | ||
2385 | .key = { 0xfb, 0x76, 0x15, 0xb2, 0x3d, 0x80, 0x89, 0x1d, | ||
2386 | 0xd4, 0x70, 0x98, 0x0b, 0xc7, 0x95, 0x84, 0xc8, | ||
2387 | 0xb2, 0xfb, 0x64, 0xce, 0x60, 0x97, 0x87, 0x8d, | ||
2388 | 0x17, 0xfc, 0xe4, 0x5a, 0x49, 0xe8, 0x30, 0xb7, | ||
2389 | 0x6e, 0x78, 0x17, 0xe7, 0x2d, 0x5e, 0x12, 0xd4, | ||
2390 | 0x60, 0x64, 0x04, 0x7a, 0xf1, 0x2f, 0x9e, 0x0c }, | ||
2391 | .klen = 48, | ||
2392 | .iv = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
2393 | 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00 }, | ||
2394 | .input = { 0x5b, 0x90, 0x8e, 0xc1, 0xab, 0xdd, 0x67, 0x5f, | ||
2395 | 0x3d, 0x69, 0x8a, 0x95, 0x53, 0xc8, 0x9c, 0xe5 }, | ||
2396 | .ilen = 16, | ||
2397 | .result = { 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, | ||
2398 | 0x38, 0x39, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46 }, | ||
2399 | .rlen = 16, | ||
2400 | }, { | ||
2401 | /* http://www.mail-archive.com/stds-p1619@listserv.ieee.org/msg00173.html */ | ||
2402 | .key = { 0xf8, 0xd4, 0x76, 0xff, 0xd6, 0x46, 0xee, 0x6c, | ||
2403 | 0x23, 0x84, 0xcb, 0x1c, 0x77, 0xd6, 0x19, 0x5d, | ||
2404 | 0xfe, 0xf1, 0xa9, 0xf3, 0x7b, 0xbc, 0x8d, 0x21, | ||
2405 | 0xa7, 0x9c, 0x21, 0xf8, 0xcb, 0x90, 0x02, 0x89, | ||
2406 | 0xa8, 0x45, 0x34, 0x8e, 0xc8, 0xc5, 0xb5, 0xf1, | ||
2407 | 0x26, 0xf5, 0x0e, 0x76, 0xfe, 0xfd, 0x1b, 0x1e }, | ||
2408 | .klen = 48, | ||
2409 | .iv = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
2410 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01 }, | ||
2411 | .input = { 0x1a, 0x1d, 0xa9, 0x30, 0xad, 0xf9, 0x2f, 0x9b, | ||
2412 | 0xb6, 0x1d, 0xae, 0xef, 0xf0, 0x2f, 0xf8, 0x5a, | ||
2413 | 0x39, 0x3c, 0xbf, 0x2a, 0xb2, 0x45, 0xb2, 0x23, | ||
2414 | 0x1b, 0x63, 0x3c, 0xcf, 0xaa, 0xbe, 0xcf, 0x4e, | ||
2415 | 0xfa, 0xe8, 0x29, 0xc2, 0x20, 0x68, 0x2b, 0x3c, | ||
2416 | 0x2e, 0x8b, 0xf7, 0x6e, 0x25, 0xbd, 0xe3, 0x3d, | ||
2417 | 0x66, 0x27, 0xd6, 0xaf, 0xd6, 0x64, 0x3e, 0xe3, | ||
2418 | 0xe8, 0x58, 0x46, 0x97, 0x39, 0x51, 0x07, 0xde, | ||
2419 | 0xcb, 0x37, 0xbc, 0xa9, 0xc0, 0x5f, 0x75, 0xc3, | ||
2420 | 0x0e, 0x84, 0x23, 0x1d, 0x16, 0xd4, 0x1c, 0x59, | ||
2421 | 0x9c, 0x1a, 0x02, 0x55, 0xab, 0x3a, 0x97, 0x1d, | ||
2422 | 0xdf, 0xdd, 0xc7, 0x06, 0x51, 0xd7, 0x70, 0xae, | ||
2423 | 0x23, 0xc6, 0x8c, 0xf5, 0x1e, 0xa0, 0xe5, 0x82, | ||
2424 | 0xb8, 0xb2, 0xbf, 0x04, 0xa0, 0x32, 0x8e, 0x68, | ||
2425 | 0xeb, 0xaf, 0x6e, 0x2d, 0x94, 0x22, 0x2f, 0xce, | ||
2426 | 0x4c, 0xb5, 0x59, 0xe2, 0xa2, 0x2f, 0xa0, 0x98, | ||
2427 | 0x1a, 0x97, 0xc6, 0xd4, 0xb5, 0x00, 0x59, 0xf2, | ||
2428 | 0x84, 0x14, 0x72, 0xb1, 0x9a, 0x6e, 0xa3, 0x7f, | ||
2429 | 0xea, 0x20, 0xe7, 0xcb, 0x65, 0x77, 0x3a, 0xdf, | ||
2430 | 0xc8, 0x97, 0x67, 0x15, 0xc2, 0x2a, 0x27, 0xcc, | ||
2431 | 0x18, 0x55, 0xa1, 0x24, 0x0b, 0x24, 0x24, 0xaf, | ||
2432 | 0x5b, 0xec, 0x68, 0xb8, 0xc8, 0xf5, 0xba, 0x63, | ||
2433 | 0xff, 0xed, 0x89, 0xce, 0xd5, 0x3d, 0x88, 0xf3, | ||
2434 | 0x25, 0xef, 0x05, 0x7c, 0x3a, 0xef, 0xeb, 0xd8, | ||
2435 | 0x7a, 0x32, 0x0d, 0xd1, 0x1e, 0x58, 0x59, 0x99, | ||
2436 | 0x90, 0x25, 0xb5, 0x26, 0xb0, 0xe3, 0x2b, 0x6c, | ||
2437 | 0x4c, 0xa9, 0x8b, 0x84, 0x4f, 0x5e, 0x01, 0x50, | ||
2438 | 0x41, 0x30, 0x58, 0xc5, 0x62, 0x74, 0x52, 0x1d, | ||
2439 | 0x45, 0x24, 0x6a, 0x42, 0x64, 0x4f, 0x97, 0x1c, | ||
2440 | 0xa8, 0x66, 0xb5, 0x6d, 0x79, 0xd4, 0x0d, 0x48, | ||
2441 | 0xc5, 0x5f, 0xf3, 0x90, 0x32, 0xdd, 0xdd, 0xe1, | ||
2442 | 0xe4, 0xa9, 0x9f, 0xfc, 0xc3, 0x52, 0x5a, 0x46, | ||
2443 | 0xe4, 0x81, 0x84, 0x95, 0x36, 0x59, 0x7a, 0x6b, | ||
2444 | 0xaa, 0xb3, 0x60, 0xad, 0xce, 0x9f, 0x9f, 0x28, | ||
2445 | 0xe0, 0x01, 0x75, 0x22, 0xc4, 0x4e, 0xa9, 0x62, | ||
2446 | 0x5c, 0x62, 0x0d, 0x00, 0xcb, 0x13, 0xe8, 0x43, | ||
2447 | 0x72, 0xd4, 0x2d, 0x53, 0x46, 0xb5, 0xd1, 0x16, | ||
2448 | 0x22, 0x18, 0xdf, 0x34, 0x33, 0xf5, 0xd6, 0x1c, | ||
2449 | 0xb8, 0x79, 0x78, 0x97, 0x94, 0xff, 0x72, 0x13, | ||
2450 | 0x4c, 0x27, 0xfc, 0xcb, 0xbf, 0x01, 0x53, 0xa6, | ||
2451 | 0xb4, 0x50, 0x6e, 0xde, 0xdf, 0xb5, 0x43, 0xa4, | ||
2452 | 0x59, 0xdf, 0x52, 0xf9, 0x7c, 0xe0, 0x11, 0x6f, | ||
2453 | 0x2d, 0x14, 0x8e, 0x24, 0x61, 0x2c, 0xe1, 0x17, | ||
2454 | 0xcc, 0xce, 0x51, 0x0c, 0x19, 0x8a, 0x82, 0x30, | ||
2455 | 0x94, 0xd5, 0x3d, 0x6a, 0x53, 0x06, 0x5e, 0xbd, | ||
2456 | 0xb7, 0xeb, 0xfa, 0xfd, 0x27, 0x51, 0xde, 0x85, | ||
2457 | 0x1e, 0x86, 0x53, 0x11, 0x53, 0x94, 0x00, 0xee, | ||
2458 | 0x2b, 0x8c, 0x08, 0x2a, 0xbf, 0xdd, 0xae, 0x11, | ||
2459 | 0xcb, 0x1e, 0xa2, 0x07, 0x9a, 0x80, 0xcf, 0x62, | ||
2460 | 0x9b, 0x09, 0xdc, 0x95, 0x3c, 0x96, 0x8e, 0xb1, | ||
2461 | 0x09, 0xbd, 0xe4, 0xeb, 0xdb, 0xca, 0x70, 0x7a, | ||
2462 | 0x9e, 0xfa, 0x31, 0x18, 0x45, 0x3c, 0x21, 0x33, | ||
2463 | 0xb0, 0xb3, 0x2b, 0xea, 0xf3, 0x71, 0x2d, 0xe1, | ||
2464 | 0x03, 0xad, 0x1b, 0x48, 0xd4, 0x67, 0x27, 0xf0, | ||
2465 | 0x62, 0xe4, 0x3d, 0xfb, 0x9b, 0x08, 0x76, 0xe7, | ||
2466 | 0xdd, 0x2b, 0x01, 0x39, 0x04, 0x5a, 0x58, 0x7a, | ||
2467 | 0xf7, 0x11, 0x90, 0xec, 0xbd, 0x51, 0x5c, 0x32, | ||
2468 | 0x6b, 0xd7, 0x35, 0x39, 0x02, 0x6b, 0xf2, 0xa6, | ||
2469 | 0xd0, 0x0d, 0x07, 0xe1, 0x06, 0xc4, 0x5b, 0x7d, | ||
2470 | 0xe4, 0x6a, 0xd7, 0xee, 0x15, 0x1f, 0x83, 0xb4, | ||
2471 | 0xa3, 0xa7, 0x5e, 0xc3, 0x90, 0xb7, 0xef, 0xd3, | ||
2472 | 0xb7, 0x4f, 0xf8, 0x92, 0x4c, 0xb7, 0x3c, 0x29, | ||
2473 | 0xcd, 0x7e, 0x2b, 0x5d, 0x43, 0xea, 0x42, 0xe7, | ||
2474 | 0x74, 0x3f, 0x7d, 0x58, 0x88, 0x75, 0xde, 0x3e }, | ||
2475 | .ilen = 512, | ||
2476 | .result = { 0x05, 0x11, 0xb7, 0x18, 0xab, 0xc6, 0x2d, 0xac, | ||
2477 | 0x70, 0x5d, 0xf6, 0x22, 0x94, 0xcd, 0xe5, 0x6c, | ||
2478 | 0x17, 0x6b, 0xf6, 0x1c, 0xf0, 0xf3, 0x6e, 0xf8, | ||
2479 | 0x50, 0x38, 0x1f, 0x71, 0x49, 0xb6, 0x57, 0xd6, | ||
2480 | 0x8f, 0xcb, 0x8d, 0x6b, 0xe3, 0xa6, 0x29, 0x90, | ||
2481 | 0xfe, 0x2a, 0x62, 0x82, 0xae, 0x6d, 0x8b, 0xf6, | ||
2482 | 0xad, 0x1e, 0x9e, 0x20, 0x5f, 0x38, 0xbe, 0x04, | ||
2483 | 0xda, 0x10, 0x8e, 0xed, 0xa2, 0xa4, 0x87, 0xab, | ||
2484 | 0xda, 0x6b, 0xb4, 0x0c, 0x75, 0xba, 0xd3, 0x7c, | ||
2485 | 0xc9, 0xac, 0x42, 0x31, 0x95, 0x7c, 0xc9, 0x04, | ||
2486 | 0xeb, 0xd5, 0x6e, 0x32, 0x69, 0x8a, 0xdb, 0xa6, | ||
2487 | 0x15, 0xd7, 0x3f, 0x4f, 0x2f, 0x66, 0x69, 0x03, | ||
2488 | 0x9c, 0x1f, 0x54, 0x0f, 0xde, 0x1f, 0xf3, 0x65, | ||
2489 | 0x4c, 0x96, 0x12, 0xed, 0x7c, 0x92, 0x03, 0x01, | ||
2490 | 0x6f, 0xbc, 0x35, 0x93, 0xac, 0xf1, 0x27, 0xf1, | ||
2491 | 0xb4, 0x96, 0x82, 0x5a, 0x5f, 0xb0, 0xa0, 0x50, | ||
2492 | 0x89, 0xa4, 0x8e, 0x66, 0x44, 0x85, 0xcc, 0xfd, | ||
2493 | 0x33, 0x14, 0x70, 0xe3, 0x96, 0xb2, 0xc3, 0xd3, | ||
2494 | 0xbb, 0x54, 0x5a, 0x1a, 0xf9, 0x74, 0xa2, 0xc5, | ||
2495 | 0x2d, 0x64, 0x75, 0xdd, 0xb4, 0x54, 0xe6, 0x74, | ||
2496 | 0x8c, 0xd3, 0x9d, 0x9e, 0x86, 0xab, 0x51, 0x53, | ||
2497 | 0xb7, 0x93, 0x3e, 0x6f, 0xd0, 0x4e, 0x2c, 0x40, | ||
2498 | 0xf6, 0xa8, 0x2e, 0x3e, 0x9d, 0xf4, 0x66, 0xa5, | ||
2499 | 0x76, 0x12, 0x73, 0x44, 0x1a, 0x56, 0xd7, 0x72, | ||
2500 | 0x88, 0xcd, 0x21, 0x8c, 0x4c, 0x0f, 0xfe, 0xda, | ||
2501 | 0x95, 0xe0, 0x3a, 0xa6, 0xa5, 0x84, 0x46, 0xcd, | ||
2502 | 0xd5, 0x3e, 0x9d, 0x3a, 0xe2, 0x67, 0xe6, 0x60, | ||
2503 | 0x1a, 0xe2, 0x70, 0x85, 0x58, 0xc2, 0x1b, 0x09, | ||
2504 | 0xe1, 0xd7, 0x2c, 0xca, 0xad, 0xa8, 0x8f, 0xf9, | ||
2505 | 0xac, 0xb3, 0x0e, 0xdb, 0xca, 0x2e, 0xe2, 0xb8, | ||
2506 | 0x51, 0x71, 0xd9, 0x3c, 0x6c, 0xf1, 0x56, 0xf8, | ||
2507 | 0xea, 0x9c, 0xf1, 0xfb, 0x0c, 0xe6, 0xb7, 0x10, | ||
2508 | 0x1c, 0xf8, 0xa9, 0x7c, 0xe8, 0x53, 0x35, 0xc1, | ||
2509 | 0x90, 0x3e, 0x76, 0x4a, 0x74, 0xa4, 0x21, 0x2c, | ||
2510 | 0xf6, 0x2c, 0x4e, 0x0f, 0x94, 0x3a, 0x88, 0x2e, | ||
2511 | 0x41, 0x09, 0x6a, 0x33, 0x7d, 0xf6, 0xdd, 0x3f, | ||
2512 | 0x8d, 0x23, 0x31, 0x74, 0x84, 0xeb, 0x88, 0x6e, | ||
2513 | 0xcc, 0xb9, 0xbc, 0x22, 0x83, 0x19, 0x07, 0x22, | ||
2514 | 0xa5, 0x2d, 0xdf, 0xa5, 0xf3, 0x80, 0x85, 0x78, | ||
2515 | 0x84, 0x39, 0x6a, 0x6d, 0x6a, 0x99, 0x4f, 0xa5, | ||
2516 | 0x15, 0xfe, 0x46, 0xb0, 0xe4, 0x6c, 0xa5, 0x41, | ||
2517 | 0x3c, 0xce, 0x8f, 0x42, 0x60, 0x71, 0xa7, 0x75, | ||
2518 | 0x08, 0x40, 0x65, 0x8a, 0x82, 0xbf, 0xf5, 0x43, | ||
2519 | 0x71, 0x96, 0xa9, 0x4d, 0x44, 0x8a, 0x20, 0xbe, | ||
2520 | 0xfa, 0x4d, 0xbb, 0xc0, 0x7d, 0x31, 0x96, 0x65, | ||
2521 | 0xe7, 0x75, 0xe5, 0x3e, 0xfd, 0x92, 0x3b, 0xc9, | ||
2522 | 0x55, 0xbb, 0x16, 0x7e, 0xf7, 0xc2, 0x8c, 0xa4, | ||
2523 | 0x40, 0x1d, 0xe5, 0xef, 0x0e, 0xdf, 0xe4, 0x9a, | ||
2524 | 0x62, 0x73, 0x65, 0xfd, 0x46, 0x63, 0x25, 0x3d, | ||
2525 | 0x2b, 0xaf, 0xe5, 0x64, 0xfe, 0xa5, 0x5c, 0xcf, | ||
2526 | 0x24, 0xf3, 0xb4, 0xac, 0x64, 0xba, 0xdf, 0x4b, | ||
2527 | 0xc6, 0x96, 0x7d, 0x81, 0x2d, 0x8d, 0x97, 0xf7, | ||
2528 | 0xc5, 0x68, 0x77, 0x84, 0x32, 0x2b, 0xcc, 0x85, | ||
2529 | 0x74, 0x96, 0xf0, 0x12, 0x77, 0x61, 0xb9, 0xeb, | ||
2530 | 0x71, 0xaa, 0x82, 0xcb, 0x1c, 0xdb, 0x89, 0xc8, | ||
2531 | 0xc6, 0xb5, 0xe3, 0x5c, 0x7d, 0x39, 0x07, 0x24, | ||
2532 | 0xda, 0x39, 0x87, 0x45, 0xc0, 0x2b, 0xbb, 0x01, | ||
2533 | 0xac, 0xbc, 0x2a, 0x5c, 0x7f, 0xfc, 0xe8, 0xce, | ||
2534 | 0x6d, 0x9c, 0x6f, 0xed, 0xd3, 0xc1, 0xa1, 0xd6, | ||
2535 | 0xc5, 0x55, 0xa9, 0x66, 0x2f, 0xe1, 0xc8, 0x32, | ||
2536 | 0xa6, 0x5d, 0xa4, 0x3a, 0x98, 0x73, 0xe8, 0x45, | ||
2537 | 0xa4, 0xc7, 0xa8, 0xb4, 0xf6, 0x13, 0x03, 0xf6, | ||
2538 | 0xe9, 0x2e, 0xc4, 0x29, 0x0f, 0x84, 0xdb, 0xc4, | ||
2539 | 0x21, 0xc4, 0xc2, 0x75, 0x67, 0x89, 0x37, 0x0a }, | ||
2540 | .rlen = 512, | ||
2541 | } | ||
2542 | }; | ||
2543 | |||
1971 | /* Cast5 test vectors from RFC 2144 */ | 2544 | /* Cast5 test vectors from RFC 2144 */ |
1972 | #define CAST5_ENC_TEST_VECTORS 3 | 2545 | #define CAST5_ENC_TEST_VECTORS 3 |
1973 | #define CAST5_DEC_TEST_VECTORS 3 | 2546 | #define CAST5_DEC_TEST_VECTORS 3 |
@@ -3084,6 +3657,27 @@ static struct cipher_speed aes_speed_template[] = { | |||
3084 | { .klen = 0, .blen = 0, } | 3657 | { .klen = 0, .blen = 0, } |
3085 | }; | 3658 | }; |
3086 | 3659 | ||
3660 | static struct cipher_speed aes_lrw_speed_template[] = { | ||
3661 | { .klen = 32, .blen = 16, }, | ||
3662 | { .klen = 32, .blen = 64, }, | ||
3663 | { .klen = 32, .blen = 256, }, | ||
3664 | { .klen = 32, .blen = 1024, }, | ||
3665 | { .klen = 32, .blen = 8192, }, | ||
3666 | { .klen = 40, .blen = 16, }, | ||
3667 | { .klen = 40, .blen = 64, }, | ||
3668 | { .klen = 40, .blen = 256, }, | ||
3669 | { .klen = 40, .blen = 1024, }, | ||
3670 | { .klen = 40, .blen = 8192, }, | ||
3671 | { .klen = 48, .blen = 16, }, | ||
3672 | { .klen = 48, .blen = 64, }, | ||
3673 | { .klen = 48, .blen = 256, }, | ||
3674 | { .klen = 48, .blen = 1024, }, | ||
3675 | { .klen = 48, .blen = 8192, }, | ||
3676 | |||
3677 | /* End marker */ | ||
3678 | { .klen = 0, .blen = 0, } | ||
3679 | }; | ||
3680 | |||
3087 | static struct cipher_speed des3_ede_speed_template[] = { | 3681 | static struct cipher_speed des3_ede_speed_template[] = { |
3088 | { .klen = 24, .blen = 16, }, | 3682 | { .klen = 24, .blen = 16, }, |
3089 | { .klen = 24, .blen = 64, }, | 3683 | { .klen = 24, .blen = 64, }, |
diff --git a/crypto/xcbc.c b/crypto/xcbc.c new file mode 100644 index 000000000000..9347eb6bcf69 --- /dev/null +++ b/crypto/xcbc.c | |||
@@ -0,0 +1,348 @@ | |||
1 | /* | ||
2 | * Copyright (C)2006 USAGI/WIDE Project | ||
3 | * | ||
4 | * This program is free software; you can redistribute it and/or modify | ||
5 | * it under the terms of the GNU General Public License as published by | ||
6 | * the Free Software Foundation; either version 2 of the License, or | ||
7 | * (at your option) any later version. | ||
8 | * | ||
9 | * This program is distributed in the hope that it will be useful, | ||
10 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
11 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
12 | * GNU General Public License for more details. | ||
13 | * | ||
14 | * You should have received a copy of the GNU General Public License | ||
15 | * along with this program; if not, write to the Free Software | ||
16 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | ||
17 | * | ||
18 | * Author: | ||
19 | * Kazunori Miyazawa <miyazawa@linux-ipv6.org> | ||
20 | */ | ||
21 | |||
22 | #include <linux/crypto.h> | ||
23 | #include <linux/err.h> | ||
24 | #include <linux/kernel.h> | ||
25 | #include <linux/mm.h> | ||
26 | #include <linux/rtnetlink.h> | ||
27 | #include <linux/slab.h> | ||
28 | #include <linux/scatterlist.h> | ||
29 | #include "internal.h" | ||
30 | |||
31 | static u_int32_t ks[12] = {0x01010101, 0x01010101, 0x01010101, 0x01010101, | ||
32 | 0x02020202, 0x02020202, 0x02020202, 0x02020202, | ||
33 | 0x03030303, 0x03030303, 0x03030303, 0x03030303}; | ||
34 | /* | ||
35 | * +------------------------ | ||
36 | * | <parent tfm> | ||
37 | * +------------------------ | ||
38 | * | crypto_xcbc_ctx | ||
39 | * +------------------------ | ||
40 | * | odds (block size) | ||
41 | * +------------------------ | ||
42 | * | prev (block size) | ||
43 | * +------------------------ | ||
44 | * | key (block size) | ||
45 | * +------------------------ | ||
46 | * | consts (block size * 3) | ||
47 | * +------------------------ | ||
48 | */ | ||
49 | struct crypto_xcbc_ctx { | ||
50 | struct crypto_tfm *child; | ||
51 | u8 *odds; | ||
52 | u8 *prev; | ||
53 | u8 *key; | ||
54 | u8 *consts; | ||
55 | void (*xor)(u8 *a, const u8 *b, unsigned int bs); | ||
56 | unsigned int keylen; | ||
57 | unsigned int len; | ||
58 | }; | ||
59 | |||
60 | static void xor_128(u8 *a, const u8 *b, unsigned int bs) | ||
61 | { | ||
62 | ((u32 *)a)[0] ^= ((u32 *)b)[0]; | ||
63 | ((u32 *)a)[1] ^= ((u32 *)b)[1]; | ||
64 | ((u32 *)a)[2] ^= ((u32 *)b)[2]; | ||
65 | ((u32 *)a)[3] ^= ((u32 *)b)[3]; | ||
66 | } | ||
67 | |||
68 | static int _crypto_xcbc_digest_setkey(struct crypto_hash *parent, | ||
69 | struct crypto_xcbc_ctx *ctx) | ||
70 | { | ||
71 | int bs = crypto_hash_blocksize(parent); | ||
72 | int err = 0; | ||
73 | u8 key1[bs]; | ||
74 | |||
75 | if ((err = crypto_cipher_setkey(ctx->child, ctx->key, ctx->keylen))) | ||
76 | return err; | ||
77 | |||
78 | ctx->child->__crt_alg->cra_cipher.cia_encrypt(ctx->child, key1, | ||
79 | ctx->consts); | ||
80 | |||
81 | return crypto_cipher_setkey(ctx->child, key1, bs); | ||
82 | } | ||
83 | |||
84 | static int crypto_xcbc_digest_setkey(struct crypto_hash *parent, | ||
85 | const u8 *inkey, unsigned int keylen) | ||
86 | { | ||
87 | struct crypto_xcbc_ctx *ctx = crypto_hash_ctx_aligned(parent); | ||
88 | |||
89 | if (keylen != crypto_tfm_alg_blocksize(ctx->child)) | ||
90 | return -EINVAL; | ||
91 | |||
92 | ctx->keylen = keylen; | ||
93 | memcpy(ctx->key, inkey, keylen); | ||
94 | ctx->consts = (u8*)ks; | ||
95 | |||
96 | return _crypto_xcbc_digest_setkey(parent, ctx); | ||
97 | } | ||
98 | |||
99 | static int crypto_xcbc_digest_init(struct hash_desc *pdesc) | ||
100 | { | ||
101 | struct crypto_xcbc_ctx *ctx = crypto_hash_ctx_aligned(pdesc->tfm); | ||
102 | int bs = crypto_hash_blocksize(pdesc->tfm); | ||
103 | |||
104 | ctx->len = 0; | ||
105 | memset(ctx->odds, 0, bs); | ||
106 | memset(ctx->prev, 0, bs); | ||
107 | |||
108 | return 0; | ||
109 | } | ||
110 | |||
111 | static int crypto_xcbc_digest_update(struct hash_desc *pdesc, | ||
112 | struct scatterlist *sg, | ||
113 | unsigned int nbytes) | ||
114 | { | ||
115 | struct crypto_hash *parent = pdesc->tfm; | ||
116 | struct crypto_xcbc_ctx *ctx = crypto_hash_ctx_aligned(parent); | ||
117 | struct crypto_tfm *tfm = ctx->child; | ||
118 | int bs = crypto_hash_blocksize(parent); | ||
119 | unsigned int i = 0; | ||
120 | |||
121 | do { | ||
122 | |||
123 | struct page *pg = sg[i].page; | ||
124 | unsigned int offset = sg[i].offset; | ||
125 | unsigned int slen = sg[i].length; | ||
126 | |||
127 | while (slen > 0) { | ||
128 | unsigned int len = min(slen, ((unsigned int)(PAGE_SIZE)) - offset); | ||
129 | char *p = crypto_kmap(pg, 0) + offset; | ||
130 | |||
131 | /* checking the data can fill the block */ | ||
132 | if ((ctx->len + len) <= bs) { | ||
133 | memcpy(ctx->odds + ctx->len, p, len); | ||
134 | ctx->len += len; | ||
135 | slen -= len; | ||
136 | |||
137 | /* checking the rest of the page */ | ||
138 | if (len + offset >= PAGE_SIZE) { | ||
139 | offset = 0; | ||
140 | pg++; | ||
141 | } else | ||
142 | offset += len; | ||
143 | |||
144 | crypto_kunmap(p, 0); | ||
145 | crypto_yield(tfm->crt_flags); | ||
146 | continue; | ||
147 | } | ||
148 | |||
149 | /* filling odds with new data and encrypting it */ | ||
150 | memcpy(ctx->odds + ctx->len, p, bs - ctx->len); | ||
151 | len -= bs - ctx->len; | ||
152 | p += bs - ctx->len; | ||
153 | |||
154 | ctx->xor(ctx->prev, ctx->odds, bs); | ||
155 | tfm->__crt_alg->cra_cipher.cia_encrypt(tfm, ctx->prev, ctx->prev); | ||
156 | |||
157 | /* clearing the length */ | ||
158 | ctx->len = 0; | ||
159 | |||
160 | /* encrypting the rest of data */ | ||
161 | while (len > bs) { | ||
162 | ctx->xor(ctx->prev, p, bs); | ||
163 | tfm->__crt_alg->cra_cipher.cia_encrypt(tfm, ctx->prev, ctx->prev); | ||
164 | p += bs; | ||
165 | len -= bs; | ||
166 | } | ||
167 | |||
168 | /* keeping the surplus of blocksize */ | ||
169 | if (len) { | ||
170 | memcpy(ctx->odds, p, len); | ||
171 | ctx->len = len; | ||
172 | } | ||
173 | crypto_kunmap(p, 0); | ||
174 | crypto_yield(tfm->crt_flags); | ||
175 | slen -= min(slen, ((unsigned int)(PAGE_SIZE)) - offset); | ||
176 | offset = 0; | ||
177 | pg++; | ||
178 | } | ||
179 | nbytes-=sg[i].length; | ||
180 | i++; | ||
181 | } while (nbytes>0); | ||
182 | |||
183 | return 0; | ||
184 | } | ||
185 | |||
186 | static int crypto_xcbc_digest_final(struct hash_desc *pdesc, u8 *out) | ||
187 | { | ||
188 | struct crypto_hash *parent = pdesc->tfm; | ||
189 | struct crypto_xcbc_ctx *ctx = crypto_hash_ctx_aligned(parent); | ||
190 | struct crypto_tfm *tfm = ctx->child; | ||
191 | int bs = crypto_hash_blocksize(parent); | ||
192 | int err = 0; | ||
193 | |||
194 | if (ctx->len == bs) { | ||
195 | u8 key2[bs]; | ||
196 | |||
197 | if ((err = crypto_cipher_setkey(tfm, ctx->key, ctx->keylen)) != 0) | ||
198 | return err; | ||
199 | |||
200 | tfm->__crt_alg->cra_cipher.cia_encrypt(tfm, key2, (const u8*)(ctx->consts+bs)); | ||
201 | |||
202 | ctx->xor(ctx->prev, ctx->odds, bs); | ||
203 | ctx->xor(ctx->prev, key2, bs); | ||
204 | _crypto_xcbc_digest_setkey(parent, ctx); | ||
205 | |||
206 | tfm->__crt_alg->cra_cipher.cia_encrypt(tfm, out, ctx->prev); | ||
207 | } else { | ||
208 | u8 key3[bs]; | ||
209 | unsigned int rlen; | ||
210 | u8 *p = ctx->odds + ctx->len; | ||
211 | *p = 0x80; | ||
212 | p++; | ||
213 | |||
214 | rlen = bs - ctx->len -1; | ||
215 | if (rlen) | ||
216 | memset(p, 0, rlen); | ||
217 | |||
218 | if ((err = crypto_cipher_setkey(tfm, ctx->key, ctx->keylen)) != 0) | ||
219 | return err; | ||
220 | |||
221 | tfm->__crt_alg->cra_cipher.cia_encrypt(tfm, key3, (const u8*)(ctx->consts+bs*2)); | ||
222 | |||
223 | ctx->xor(ctx->prev, ctx->odds, bs); | ||
224 | ctx->xor(ctx->prev, key3, bs); | ||
225 | |||
226 | _crypto_xcbc_digest_setkey(parent, ctx); | ||
227 | |||
228 | tfm->__crt_alg->cra_cipher.cia_encrypt(tfm, out, ctx->prev); | ||
229 | } | ||
230 | |||
231 | return 0; | ||
232 | } | ||
233 | |||
234 | static int crypto_xcbc_digest(struct hash_desc *pdesc, | ||
235 | struct scatterlist *sg, unsigned int nbytes, u8 *out) | ||
236 | { | ||
237 | crypto_xcbc_digest_init(pdesc); | ||
238 | crypto_xcbc_digest_update(pdesc, sg, nbytes); | ||
239 | return crypto_xcbc_digest_final(pdesc, out); | ||
240 | } | ||
241 | |||
242 | static int xcbc_init_tfm(struct crypto_tfm *tfm) | ||
243 | { | ||
244 | struct crypto_instance *inst = (void *)tfm->__crt_alg; | ||
245 | struct crypto_spawn *spawn = crypto_instance_ctx(inst); | ||
246 | struct crypto_xcbc_ctx *ctx = crypto_hash_ctx_aligned(__crypto_hash_cast(tfm)); | ||
247 | int bs = crypto_hash_blocksize(__crypto_hash_cast(tfm)); | ||
248 | |||
249 | tfm = crypto_spawn_tfm(spawn); | ||
250 | if (IS_ERR(tfm)) | ||
251 | return PTR_ERR(tfm); | ||
252 | |||
253 | switch(bs) { | ||
254 | case 16: | ||
255 | ctx->xor = xor_128; | ||
256 | break; | ||
257 | default: | ||
258 | return -EINVAL; | ||
259 | } | ||
260 | |||
261 | ctx->child = crypto_cipher_cast(tfm); | ||
262 | ctx->odds = (u8*)(ctx+1); | ||
263 | ctx->prev = ctx->odds + bs; | ||
264 | ctx->key = ctx->prev + bs; | ||
265 | |||
266 | return 0; | ||
267 | }; | ||
268 | |||
269 | static void xcbc_exit_tfm(struct crypto_tfm *tfm) | ||
270 | { | ||
271 | struct crypto_xcbc_ctx *ctx = crypto_hash_ctx_aligned(__crypto_hash_cast(tfm)); | ||
272 | crypto_free_cipher(ctx->child); | ||
273 | } | ||
274 | |||
275 | static struct crypto_instance *xcbc_alloc(void *param, unsigned int len) | ||
276 | { | ||
277 | struct crypto_instance *inst; | ||
278 | struct crypto_alg *alg; | ||
279 | alg = crypto_get_attr_alg(param, len, CRYPTO_ALG_TYPE_CIPHER, | ||
280 | CRYPTO_ALG_TYPE_HASH_MASK | CRYPTO_ALG_ASYNC); | ||
281 | if (IS_ERR(alg)) | ||
282 | return ERR_PTR(PTR_ERR(alg)); | ||
283 | |||
284 | switch(alg->cra_blocksize) { | ||
285 | case 16: | ||
286 | break; | ||
287 | default: | ||
288 | return ERR_PTR(PTR_ERR(alg)); | ||
289 | } | ||
290 | |||
291 | inst = crypto_alloc_instance("xcbc", alg); | ||
292 | if (IS_ERR(inst)) | ||
293 | goto out_put_alg; | ||
294 | |||
295 | inst->alg.cra_flags = CRYPTO_ALG_TYPE_HASH; | ||
296 | inst->alg.cra_priority = alg->cra_priority; | ||
297 | inst->alg.cra_blocksize = alg->cra_blocksize; | ||
298 | inst->alg.cra_alignmask = alg->cra_alignmask; | ||
299 | inst->alg.cra_type = &crypto_hash_type; | ||
300 | |||
301 | inst->alg.cra_hash.digestsize = | ||
302 | (alg->cra_flags & CRYPTO_ALG_TYPE_MASK) == | ||
303 | CRYPTO_ALG_TYPE_HASH ? alg->cra_hash.digestsize : | ||
304 | alg->cra_blocksize; | ||
305 | inst->alg.cra_ctxsize = sizeof(struct crypto_xcbc_ctx) + | ||
306 | ALIGN(inst->alg.cra_blocksize * 3, sizeof(void *)); | ||
307 | inst->alg.cra_init = xcbc_init_tfm; | ||
308 | inst->alg.cra_exit = xcbc_exit_tfm; | ||
309 | |||
310 | inst->alg.cra_hash.init = crypto_xcbc_digest_init; | ||
311 | inst->alg.cra_hash.update = crypto_xcbc_digest_update; | ||
312 | inst->alg.cra_hash.final = crypto_xcbc_digest_final; | ||
313 | inst->alg.cra_hash.digest = crypto_xcbc_digest; | ||
314 | inst->alg.cra_hash.setkey = crypto_xcbc_digest_setkey; | ||
315 | |||
316 | out_put_alg: | ||
317 | crypto_mod_put(alg); | ||
318 | return inst; | ||
319 | } | ||
320 | |||
321 | static void xcbc_free(struct crypto_instance *inst) | ||
322 | { | ||
323 | crypto_drop_spawn(crypto_instance_ctx(inst)); | ||
324 | kfree(inst); | ||
325 | } | ||
326 | |||
327 | static struct crypto_template crypto_xcbc_tmpl = { | ||
328 | .name = "xcbc", | ||
329 | .alloc = xcbc_alloc, | ||
330 | .free = xcbc_free, | ||
331 | .module = THIS_MODULE, | ||
332 | }; | ||
333 | |||
334 | static int __init crypto_xcbc_module_init(void) | ||
335 | { | ||
336 | return crypto_register_template(&crypto_xcbc_tmpl); | ||
337 | } | ||
338 | |||
339 | static void __exit crypto_xcbc_module_exit(void) | ||
340 | { | ||
341 | crypto_unregister_template(&crypto_xcbc_tmpl); | ||
342 | } | ||
343 | |||
344 | module_init(crypto_xcbc_module_init); | ||
345 | module_exit(crypto_xcbc_module_exit); | ||
346 | |||
347 | MODULE_LICENSE("GPL"); | ||
348 | MODULE_DESCRIPTION("XCBC keyed hash algorithm"); | ||
diff --git a/drivers/atm/Makefile b/drivers/atm/Makefile index b5077ce8cb40..1b16f8166b09 100644 --- a/drivers/atm/Makefile +++ b/drivers/atm/Makefile | |||
@@ -41,7 +41,7 @@ ifeq ($(CONFIG_ATM_FORE200E_PCA),y) | |||
41 | # guess the target endianess to choose the right PCA-200E firmware image | 41 | # guess the target endianess to choose the right PCA-200E firmware image |
42 | ifeq ($(CONFIG_ATM_FORE200E_PCA_DEFAULT_FW),y) | 42 | ifeq ($(CONFIG_ATM_FORE200E_PCA_DEFAULT_FW),y) |
43 | byteorder.h := include$(if $(patsubst $(srctree),,$(objtree)),2)/asm/byteorder.h | 43 | byteorder.h := include$(if $(patsubst $(srctree),,$(objtree)),2)/asm/byteorder.h |
44 | CONFIG_ATM_FORE200E_PCA_FW := $(obj)/pca200e$(if $(shell $(CC) -E -dM $(byteorder.h) | grep ' __LITTLE_ENDIAN '),.bin,_ecd.bin2) | 44 | CONFIG_ATM_FORE200E_PCA_FW := $(obj)/pca200e$(if $(shell $(CC) $(CPPFLAGS) -E -dM $(byteorder.h) | grep ' __LITTLE_ENDIAN '),.bin,_ecd.bin2) |
45 | endif | 45 | endif |
46 | endif | 46 | endif |
47 | 47 | ||
diff --git a/drivers/block/Kconfig b/drivers/block/Kconfig index 432c17e1e0e6..85072446d772 100644 --- a/drivers/block/Kconfig +++ b/drivers/block/Kconfig | |||
@@ -306,6 +306,7 @@ config BLK_DEV_LOOP | |||
306 | config BLK_DEV_CRYPTOLOOP | 306 | config BLK_DEV_CRYPTOLOOP |
307 | tristate "Cryptoloop Support" | 307 | tristate "Cryptoloop Support" |
308 | select CRYPTO | 308 | select CRYPTO |
309 | select CRYPTO_CBC | ||
309 | depends on BLK_DEV_LOOP | 310 | depends on BLK_DEV_LOOP |
310 | ---help--- | 311 | ---help--- |
311 | Say Y here if you want to be able to use the ciphers that are | 312 | Say Y here if you want to be able to use the ciphers that are |
diff --git a/drivers/crypto/Kconfig b/drivers/crypto/Kconfig index adb554153f67..e816535ab305 100644 --- a/drivers/crypto/Kconfig +++ b/drivers/crypto/Kconfig | |||
@@ -51,4 +51,17 @@ config CRYPTO_DEV_PADLOCK_SHA | |||
51 | If unsure say M. The compiled module will be | 51 | If unsure say M. The compiled module will be |
52 | called padlock-sha.ko | 52 | called padlock-sha.ko |
53 | 53 | ||
54 | config CRYPTO_DEV_GEODE | ||
55 | tristate "Support for the Geode LX AES engine" | ||
56 | depends on CRYPTO && X86_32 | ||
57 | select CRYPTO_ALGAPI | ||
58 | select CRYPTO_BLKCIPHER | ||
59 | default m | ||
60 | help | ||
61 | Say 'Y' here to use the AMD Geode LX processor on-board AES | ||
62 | engine for the CryptoAPI AES alogrithm. | ||
63 | |||
64 | To compile this driver as a module, choose M here: the module | ||
65 | will be called geode-aes. | ||
66 | |||
54 | endmenu | 67 | endmenu |
diff --git a/drivers/crypto/Makefile b/drivers/crypto/Makefile index 4c3d0ec1cf80..6059cf869414 100644 --- a/drivers/crypto/Makefile +++ b/drivers/crypto/Makefile | |||
@@ -1,3 +1,4 @@ | |||
1 | obj-$(CONFIG_CRYPTO_DEV_PADLOCK) += padlock.o | 1 | obj-$(CONFIG_CRYPTO_DEV_PADLOCK) += padlock.o |
2 | obj-$(CONFIG_CRYPTO_DEV_PADLOCK_AES) += padlock-aes.o | 2 | obj-$(CONFIG_CRYPTO_DEV_PADLOCK_AES) += padlock-aes.o |
3 | obj-$(CONFIG_CRYPTO_DEV_PADLOCK_SHA) += padlock-sha.o | 3 | obj-$(CONFIG_CRYPTO_DEV_PADLOCK_SHA) += padlock-sha.o |
4 | obj-$(CONFIG_CRYPTO_DEV_GEODE) += geode-aes.o | ||
diff --git a/drivers/crypto/geode-aes.c b/drivers/crypto/geode-aes.c new file mode 100644 index 000000000000..43a68398656f --- /dev/null +++ b/drivers/crypto/geode-aes.c | |||
@@ -0,0 +1,474 @@ | |||
1 | /* Copyright (C) 2004-2006, Advanced Micro Devices, Inc. | ||
2 | * | ||
3 | * This program is free software; you can redistribute it and/or modify | ||
4 | * it under the terms of the GNU General Public License as published by | ||
5 | * the Free Software Foundation; either version 2 of the License, or | ||
6 | * (at your option) any later version. | ||
7 | */ | ||
8 | |||
9 | #include <linux/module.h> | ||
10 | #include <linux/kernel.h> | ||
11 | #include <linux/sched.h> | ||
12 | #include <linux/pci.h> | ||
13 | #include <linux/pci_ids.h> | ||
14 | #include <linux/crypto.h> | ||
15 | #include <linux/spinlock.h> | ||
16 | #include <crypto/algapi.h> | ||
17 | |||
18 | #include <asm/io.h> | ||
19 | #include <asm/delay.h> | ||
20 | |||
21 | #include "geode-aes.h" | ||
22 | |||
23 | /* Register definitions */ | ||
24 | |||
25 | #define AES_CTRLA_REG 0x0000 | ||
26 | |||
27 | #define AES_CTRL_START 0x01 | ||
28 | #define AES_CTRL_DECRYPT 0x00 | ||
29 | #define AES_CTRL_ENCRYPT 0x02 | ||
30 | #define AES_CTRL_WRKEY 0x04 | ||
31 | #define AES_CTRL_DCA 0x08 | ||
32 | #define AES_CTRL_SCA 0x10 | ||
33 | #define AES_CTRL_CBC 0x20 | ||
34 | |||
35 | #define AES_INTR_REG 0x0008 | ||
36 | |||
37 | #define AES_INTRA_PENDING (1 << 16) | ||
38 | #define AES_INTRB_PENDING (1 << 17) | ||
39 | |||
40 | #define AES_INTR_PENDING (AES_INTRA_PENDING | AES_INTRB_PENDING) | ||
41 | #define AES_INTR_MASK 0x07 | ||
42 | |||
43 | #define AES_SOURCEA_REG 0x0010 | ||
44 | #define AES_DSTA_REG 0x0014 | ||
45 | #define AES_LENA_REG 0x0018 | ||
46 | #define AES_WRITEKEY0_REG 0x0030 | ||
47 | #define AES_WRITEIV0_REG 0x0040 | ||
48 | |||
49 | /* A very large counter that is used to gracefully bail out of an | ||
50 | * operation in case of trouble | ||
51 | */ | ||
52 | |||
53 | #define AES_OP_TIMEOUT 0x50000 | ||
54 | |||
55 | /* Static structures */ | ||
56 | |||
57 | static void __iomem * _iobase; | ||
58 | static spinlock_t lock; | ||
59 | |||
60 | /* Write a 128 bit field (either a writable key or IV) */ | ||
61 | static inline void | ||
62 | _writefield(u32 offset, void *value) | ||
63 | { | ||
64 | int i; | ||
65 | for(i = 0; i < 4; i++) | ||
66 | iowrite32(((u32 *) value)[i], _iobase + offset + (i * 4)); | ||
67 | } | ||
68 | |||
69 | /* Read a 128 bit field (either a writable key or IV) */ | ||
70 | static inline void | ||
71 | _readfield(u32 offset, void *value) | ||
72 | { | ||
73 | int i; | ||
74 | for(i = 0; i < 4; i++) | ||
75 | ((u32 *) value)[i] = ioread32(_iobase + offset + (i * 4)); | ||
76 | } | ||
77 | |||
78 | static int | ||
79 | do_crypt(void *src, void *dst, int len, u32 flags) | ||
80 | { | ||
81 | u32 status; | ||
82 | u32 counter = AES_OP_TIMEOUT; | ||
83 | |||
84 | iowrite32(virt_to_phys(src), _iobase + AES_SOURCEA_REG); | ||
85 | iowrite32(virt_to_phys(dst), _iobase + AES_DSTA_REG); | ||
86 | iowrite32(len, _iobase + AES_LENA_REG); | ||
87 | |||
88 | /* Start the operation */ | ||
89 | iowrite32(AES_CTRL_START | flags, _iobase + AES_CTRLA_REG); | ||
90 | |||
91 | do | ||
92 | status = ioread32(_iobase + AES_INTR_REG); | ||
93 | while(!(status & AES_INTRA_PENDING) && --counter); | ||
94 | |||
95 | /* Clear the event */ | ||
96 | iowrite32((status & 0xFF) | AES_INTRA_PENDING, _iobase + AES_INTR_REG); | ||
97 | return counter ? 0 : 1; | ||
98 | } | ||
99 | |||
100 | static unsigned int | ||
101 | geode_aes_crypt(struct geode_aes_op *op) | ||
102 | { | ||
103 | |||
104 | u32 flags = 0; | ||
105 | int iflags; | ||
106 | |||
107 | if (op->len == 0 || op->src == op->dst) | ||
108 | return 0; | ||
109 | |||
110 | if (op->flags & AES_FLAGS_COHERENT) | ||
111 | flags |= (AES_CTRL_DCA | AES_CTRL_SCA); | ||
112 | |||
113 | if (op->dir == AES_DIR_ENCRYPT) | ||
114 | flags |= AES_CTRL_ENCRYPT; | ||
115 | |||
116 | /* Start the critical section */ | ||
117 | |||
118 | spin_lock_irqsave(&lock, iflags); | ||
119 | |||
120 | if (op->mode == AES_MODE_CBC) { | ||
121 | flags |= AES_CTRL_CBC; | ||
122 | _writefield(AES_WRITEIV0_REG, op->iv); | ||
123 | } | ||
124 | |||
125 | if (op->flags & AES_FLAGS_USRKEY) { | ||
126 | flags |= AES_CTRL_WRKEY; | ||
127 | _writefield(AES_WRITEKEY0_REG, op->key); | ||
128 | } | ||
129 | |||
130 | do_crypt(op->src, op->dst, op->len, flags); | ||
131 | |||
132 | if (op->mode == AES_MODE_CBC) | ||
133 | _readfield(AES_WRITEIV0_REG, op->iv); | ||
134 | |||
135 | spin_unlock_irqrestore(&lock, iflags); | ||
136 | |||
137 | return op->len; | ||
138 | } | ||
139 | |||
140 | /* CRYPTO-API Functions */ | ||
141 | |||
142 | static int | ||
143 | geode_setkey(struct crypto_tfm *tfm, const u8 *key, unsigned int len) | ||
144 | { | ||
145 | struct geode_aes_op *op = crypto_tfm_ctx(tfm); | ||
146 | |||
147 | if (len != AES_KEY_LENGTH) { | ||
148 | tfm->crt_flags |= CRYPTO_TFM_RES_BAD_KEY_LEN; | ||
149 | return -EINVAL; | ||
150 | } | ||
151 | |||
152 | memcpy(op->key, key, len); | ||
153 | return 0; | ||
154 | } | ||
155 | |||
156 | static void | ||
157 | geode_encrypt(struct crypto_tfm *tfm, u8 *out, const u8 *in) | ||
158 | { | ||
159 | struct geode_aes_op *op = crypto_tfm_ctx(tfm); | ||
160 | |||
161 | if ((out == NULL) || (in == NULL)) | ||
162 | return; | ||
163 | |||
164 | op->src = (void *) in; | ||
165 | op->dst = (void *) out; | ||
166 | op->mode = AES_MODE_ECB; | ||
167 | op->flags = 0; | ||
168 | op->len = AES_MIN_BLOCK_SIZE; | ||
169 | op->dir = AES_DIR_ENCRYPT; | ||
170 | |||
171 | geode_aes_crypt(op); | ||
172 | } | ||
173 | |||
174 | |||
175 | static void | ||
176 | geode_decrypt(struct crypto_tfm *tfm, u8 *out, const u8 *in) | ||
177 | { | ||
178 | struct geode_aes_op *op = crypto_tfm_ctx(tfm); | ||
179 | |||
180 | if ((out == NULL) || (in == NULL)) | ||
181 | return; | ||
182 | |||
183 | op->src = (void *) in; | ||
184 | op->dst = (void *) out; | ||
185 | op->mode = AES_MODE_ECB; | ||
186 | op->flags = 0; | ||
187 | op->len = AES_MIN_BLOCK_SIZE; | ||
188 | op->dir = AES_DIR_DECRYPT; | ||
189 | |||
190 | geode_aes_crypt(op); | ||
191 | } | ||
192 | |||
193 | |||
194 | static struct crypto_alg geode_alg = { | ||
195 | .cra_name = "aes", | ||
196 | .cra_driver_name = "geode-aes-128", | ||
197 | .cra_priority = 300, | ||
198 | .cra_alignmask = 15, | ||
199 | .cra_flags = CRYPTO_ALG_TYPE_CIPHER, | ||
200 | .cra_blocksize = AES_MIN_BLOCK_SIZE, | ||
201 | .cra_ctxsize = sizeof(struct geode_aes_op), | ||
202 | .cra_module = THIS_MODULE, | ||
203 | .cra_list = LIST_HEAD_INIT(geode_alg.cra_list), | ||
204 | .cra_u = { | ||
205 | .cipher = { | ||
206 | .cia_min_keysize = AES_KEY_LENGTH, | ||
207 | .cia_max_keysize = AES_KEY_LENGTH, | ||
208 | .cia_setkey = geode_setkey, | ||
209 | .cia_encrypt = geode_encrypt, | ||
210 | .cia_decrypt = geode_decrypt | ||
211 | } | ||
212 | } | ||
213 | }; | ||
214 | |||
215 | static int | ||
216 | geode_cbc_decrypt(struct blkcipher_desc *desc, | ||
217 | struct scatterlist *dst, struct scatterlist *src, | ||
218 | unsigned int nbytes) | ||
219 | { | ||
220 | struct geode_aes_op *op = crypto_blkcipher_ctx(desc->tfm); | ||
221 | struct blkcipher_walk walk; | ||
222 | int err, ret; | ||
223 | |||
224 | blkcipher_walk_init(&walk, dst, src, nbytes); | ||
225 | err = blkcipher_walk_virt(desc, &walk); | ||
226 | |||
227 | while((nbytes = walk.nbytes)) { | ||
228 | op->src = walk.src.virt.addr, | ||
229 | op->dst = walk.dst.virt.addr; | ||
230 | op->mode = AES_MODE_CBC; | ||
231 | op->len = nbytes - (nbytes % AES_MIN_BLOCK_SIZE); | ||
232 | op->dir = AES_DIR_DECRYPT; | ||
233 | |||
234 | memcpy(op->iv, walk.iv, AES_IV_LENGTH); | ||
235 | |||
236 | ret = geode_aes_crypt(op); | ||
237 | |||
238 | memcpy(walk.iv, op->iv, AES_IV_LENGTH); | ||
239 | nbytes -= ret; | ||
240 | |||
241 | err = blkcipher_walk_done(desc, &walk, nbytes); | ||
242 | } | ||
243 | |||
244 | return err; | ||
245 | } | ||
246 | |||
247 | static int | ||
248 | geode_cbc_encrypt(struct blkcipher_desc *desc, | ||
249 | struct scatterlist *dst, struct scatterlist *src, | ||
250 | unsigned int nbytes) | ||
251 | { | ||
252 | struct geode_aes_op *op = crypto_blkcipher_ctx(desc->tfm); | ||
253 | struct blkcipher_walk walk; | ||
254 | int err, ret; | ||
255 | |||
256 | blkcipher_walk_init(&walk, dst, src, nbytes); | ||
257 | err = blkcipher_walk_virt(desc, &walk); | ||
258 | |||
259 | while((nbytes = walk.nbytes)) { | ||
260 | op->src = walk.src.virt.addr, | ||
261 | op->dst = walk.dst.virt.addr; | ||
262 | op->mode = AES_MODE_CBC; | ||
263 | op->len = nbytes - (nbytes % AES_MIN_BLOCK_SIZE); | ||
264 | op->dir = AES_DIR_ENCRYPT; | ||
265 | |||
266 | memcpy(op->iv, walk.iv, AES_IV_LENGTH); | ||
267 | |||
268 | ret = geode_aes_crypt(op); | ||
269 | nbytes -= ret; | ||
270 | err = blkcipher_walk_done(desc, &walk, nbytes); | ||
271 | } | ||
272 | |||
273 | return err; | ||
274 | } | ||
275 | |||
276 | static struct crypto_alg geode_cbc_alg = { | ||
277 | .cra_name = "cbc(aes)", | ||
278 | .cra_driver_name = "cbc-aes-geode-128", | ||
279 | .cra_priority = 400, | ||
280 | .cra_flags = CRYPTO_ALG_TYPE_BLKCIPHER, | ||
281 | .cra_blocksize = AES_MIN_BLOCK_SIZE, | ||
282 | .cra_ctxsize = sizeof(struct geode_aes_op), | ||
283 | .cra_alignmask = 15, | ||
284 | .cra_type = &crypto_blkcipher_type, | ||
285 | .cra_module = THIS_MODULE, | ||
286 | .cra_list = LIST_HEAD_INIT(geode_cbc_alg.cra_list), | ||
287 | .cra_u = { | ||
288 | .blkcipher = { | ||
289 | .min_keysize = AES_KEY_LENGTH, | ||
290 | .max_keysize = AES_KEY_LENGTH, | ||
291 | .setkey = geode_setkey, | ||
292 | .encrypt = geode_cbc_encrypt, | ||
293 | .decrypt = geode_cbc_decrypt, | ||
294 | } | ||
295 | } | ||
296 | }; | ||
297 | |||
298 | static int | ||
299 | geode_ecb_decrypt(struct blkcipher_desc *desc, | ||
300 | struct scatterlist *dst, struct scatterlist *src, | ||
301 | unsigned int nbytes) | ||
302 | { | ||
303 | struct geode_aes_op *op = crypto_blkcipher_ctx(desc->tfm); | ||
304 | struct blkcipher_walk walk; | ||
305 | int err, ret; | ||
306 | |||
307 | blkcipher_walk_init(&walk, dst, src, nbytes); | ||
308 | err = blkcipher_walk_virt(desc, &walk); | ||
309 | |||
310 | while((nbytes = walk.nbytes)) { | ||
311 | op->src = walk.src.virt.addr, | ||
312 | op->dst = walk.dst.virt.addr; | ||
313 | op->mode = AES_MODE_ECB; | ||
314 | op->len = nbytes - (nbytes % AES_MIN_BLOCK_SIZE); | ||
315 | op->dir = AES_DIR_DECRYPT; | ||
316 | |||
317 | ret = geode_aes_crypt(op); | ||
318 | nbytes -= ret; | ||
319 | err = blkcipher_walk_done(desc, &walk, nbytes); | ||
320 | } | ||
321 | |||
322 | return err; | ||
323 | } | ||
324 | |||
325 | static int | ||
326 | geode_ecb_encrypt(struct blkcipher_desc *desc, | ||
327 | struct scatterlist *dst, struct scatterlist *src, | ||
328 | unsigned int nbytes) | ||
329 | { | ||
330 | struct geode_aes_op *op = crypto_blkcipher_ctx(desc->tfm); | ||
331 | struct blkcipher_walk walk; | ||
332 | int err, ret; | ||
333 | |||
334 | blkcipher_walk_init(&walk, dst, src, nbytes); | ||
335 | err = blkcipher_walk_virt(desc, &walk); | ||
336 | |||
337 | while((nbytes = walk.nbytes)) { | ||
338 | op->src = walk.src.virt.addr, | ||
339 | op->dst = walk.dst.virt.addr; | ||
340 | op->mode = AES_MODE_ECB; | ||
341 | op->len = nbytes - (nbytes % AES_MIN_BLOCK_SIZE); | ||
342 | op->dir = AES_DIR_ENCRYPT; | ||
343 | |||
344 | ret = geode_aes_crypt(op); | ||
345 | nbytes -= ret; | ||
346 | ret = blkcipher_walk_done(desc, &walk, nbytes); | ||
347 | } | ||
348 | |||
349 | return err; | ||
350 | } | ||
351 | |||
352 | static struct crypto_alg geode_ecb_alg = { | ||
353 | .cra_name = "ecb(aes)", | ||
354 | .cra_driver_name = "ecb-aes-geode-128", | ||
355 | .cra_priority = 400, | ||
356 | .cra_flags = CRYPTO_ALG_TYPE_BLKCIPHER, | ||
357 | .cra_blocksize = AES_MIN_BLOCK_SIZE, | ||
358 | .cra_ctxsize = sizeof(struct geode_aes_op), | ||
359 | .cra_alignmask = 15, | ||
360 | .cra_type = &crypto_blkcipher_type, | ||
361 | .cra_module = THIS_MODULE, | ||
362 | .cra_list = LIST_HEAD_INIT(geode_ecb_alg.cra_list), | ||
363 | .cra_u = { | ||
364 | .blkcipher = { | ||
365 | .min_keysize = AES_KEY_LENGTH, | ||
366 | .max_keysize = AES_KEY_LENGTH, | ||
367 | .setkey = geode_setkey, | ||
368 | .encrypt = geode_ecb_encrypt, | ||
369 | .decrypt = geode_ecb_decrypt, | ||
370 | } | ||
371 | } | ||
372 | }; | ||
373 | |||
374 | static void | ||
375 | geode_aes_remove(struct pci_dev *dev) | ||
376 | { | ||
377 | crypto_unregister_alg(&geode_alg); | ||
378 | crypto_unregister_alg(&geode_ecb_alg); | ||
379 | crypto_unregister_alg(&geode_cbc_alg); | ||
380 | |||
381 | pci_iounmap(dev, _iobase); | ||
382 | _iobase = NULL; | ||
383 | |||
384 | pci_release_regions(dev); | ||
385 | pci_disable_device(dev); | ||
386 | } | ||
387 | |||
388 | |||
389 | static int | ||
390 | geode_aes_probe(struct pci_dev *dev, const struct pci_device_id *id) | ||
391 | { | ||
392 | int ret; | ||
393 | |||
394 | if ((ret = pci_enable_device(dev))) | ||
395 | return ret; | ||
396 | |||
397 | if ((ret = pci_request_regions(dev, "geode-aes-128"))) | ||
398 | goto eenable; | ||
399 | |||
400 | _iobase = pci_iomap(dev, 0, 0); | ||
401 | |||
402 | if (_iobase == NULL) { | ||
403 | ret = -ENOMEM; | ||
404 | goto erequest; | ||
405 | } | ||
406 | |||
407 | spin_lock_init(&lock); | ||
408 | |||
409 | /* Clear any pending activity */ | ||
410 | iowrite32(AES_INTR_PENDING | AES_INTR_MASK, _iobase + AES_INTR_REG); | ||
411 | |||
412 | if ((ret = crypto_register_alg(&geode_alg))) | ||
413 | goto eiomap; | ||
414 | |||
415 | if ((ret = crypto_register_alg(&geode_ecb_alg))) | ||
416 | goto ealg; | ||
417 | |||
418 | if ((ret = crypto_register_alg(&geode_cbc_alg))) | ||
419 | goto eecb; | ||
420 | |||
421 | printk(KERN_NOTICE "geode-aes: GEODE AES engine enabled.\n"); | ||
422 | return 0; | ||
423 | |||
424 | eecb: | ||
425 | crypto_unregister_alg(&geode_ecb_alg); | ||
426 | |||
427 | ealg: | ||
428 | crypto_unregister_alg(&geode_alg); | ||
429 | |||
430 | eiomap: | ||
431 | pci_iounmap(dev, _iobase); | ||
432 | |||
433 | erequest: | ||
434 | pci_release_regions(dev); | ||
435 | |||
436 | eenable: | ||
437 | pci_disable_device(dev); | ||
438 | |||
439 | printk(KERN_ERR "geode-aes: GEODE AES initialization failed.\n"); | ||
440 | return ret; | ||
441 | } | ||
442 | |||
443 | static struct pci_device_id geode_aes_tbl[] = { | ||
444 | { PCI_VENDOR_ID_AMD, PCI_DEVICE_ID_AMD_LX_AES, PCI_ANY_ID, PCI_ANY_ID} , | ||
445 | { 0, } | ||
446 | }; | ||
447 | |||
448 | MODULE_DEVICE_TABLE(pci, geode_aes_tbl); | ||
449 | |||
450 | static struct pci_driver geode_aes_driver = { | ||
451 | .name = "Geode LX AES", | ||
452 | .id_table = geode_aes_tbl, | ||
453 | .probe = geode_aes_probe, | ||
454 | .remove = __devexit_p(geode_aes_remove) | ||
455 | }; | ||
456 | |||
457 | static int __init | ||
458 | geode_aes_init(void) | ||
459 | { | ||
460 | return pci_module_init(&geode_aes_driver); | ||
461 | } | ||
462 | |||
463 | static void __exit | ||
464 | geode_aes_exit(void) | ||
465 | { | ||
466 | pci_unregister_driver(&geode_aes_driver); | ||
467 | } | ||
468 | |||
469 | MODULE_AUTHOR("Advanced Micro Devices, Inc."); | ||
470 | MODULE_DESCRIPTION("Geode LX Hardware AES driver"); | ||
471 | MODULE_LICENSE("GPL"); | ||
472 | |||
473 | module_init(geode_aes_init); | ||
474 | module_exit(geode_aes_exit); | ||
diff --git a/drivers/crypto/geode-aes.h b/drivers/crypto/geode-aes.h new file mode 100644 index 000000000000..8003a36f3a83 --- /dev/null +++ b/drivers/crypto/geode-aes.h | |||
@@ -0,0 +1,40 @@ | |||
1 | /* Copyright (C) 2003-2006, Advanced Micro Devices, Inc. | ||
2 | * | ||
3 | * This program is free software; you can redistribute it and/or modify | ||
4 | * it under the terms of the GNU General Public License as published by | ||
5 | * the Free Software Foundation; either version 2 of the License, or | ||
6 | * (at your option) any later version. | ||
7 | */ | ||
8 | |||
9 | #ifndef _GEODE_AES_H_ | ||
10 | #define _GEODE_AES_H_ | ||
11 | |||
12 | #define AES_KEY_LENGTH 16 | ||
13 | #define AES_IV_LENGTH 16 | ||
14 | |||
15 | #define AES_MIN_BLOCK_SIZE 16 | ||
16 | |||
17 | #define AES_MODE_ECB 0 | ||
18 | #define AES_MODE_CBC 1 | ||
19 | |||
20 | #define AES_DIR_DECRYPT 0 | ||
21 | #define AES_DIR_ENCRYPT 1 | ||
22 | |||
23 | #define AES_FLAGS_USRKEY (1 << 0) | ||
24 | #define AES_FLAGS_COHERENT (1 << 1) | ||
25 | |||
26 | struct geode_aes_op { | ||
27 | |||
28 | void *src; | ||
29 | void *dst; | ||
30 | |||
31 | u32 mode; | ||
32 | u32 dir; | ||
33 | u32 flags; | ||
34 | int len; | ||
35 | |||
36 | u8 key[AES_KEY_LENGTH]; | ||
37 | u8 iv[AES_IV_LENGTH]; | ||
38 | }; | ||
39 | |||
40 | #endif | ||
diff --git a/drivers/md/dm-crypt.c b/drivers/md/dm-crypt.c index c7bee4f2eedb..a1086ee8cccd 100644 --- a/drivers/md/dm-crypt.c +++ b/drivers/md/dm-crypt.c | |||
@@ -20,6 +20,7 @@ | |||
20 | #include <asm/atomic.h> | 20 | #include <asm/atomic.h> |
21 | #include <linux/scatterlist.h> | 21 | #include <linux/scatterlist.h> |
22 | #include <asm/page.h> | 22 | #include <asm/page.h> |
23 | #include <asm/unaligned.h> | ||
23 | 24 | ||
24 | #include "dm.h" | 25 | #include "dm.h" |
25 | 26 | ||
@@ -85,7 +86,10 @@ struct crypt_config { | |||
85 | */ | 86 | */ |
86 | struct crypt_iv_operations *iv_gen_ops; | 87 | struct crypt_iv_operations *iv_gen_ops; |
87 | char *iv_mode; | 88 | char *iv_mode; |
88 | struct crypto_cipher *iv_gen_private; | 89 | union { |
90 | struct crypto_cipher *essiv_tfm; | ||
91 | int benbi_shift; | ||
92 | } iv_gen_private; | ||
89 | sector_t iv_offset; | 93 | sector_t iv_offset; |
90 | unsigned int iv_size; | 94 | unsigned int iv_size; |
91 | 95 | ||
@@ -113,6 +117,9 @@ static struct kmem_cache *_crypt_io_pool; | |||
113 | * encrypted with the bulk cipher using a salt as key. The salt | 117 | * encrypted with the bulk cipher using a salt as key. The salt |
114 | * should be derived from the bulk cipher's key via hashing. | 118 | * should be derived from the bulk cipher's key via hashing. |
115 | * | 119 | * |
120 | * benbi: the 64-bit "big-endian 'narrow block'-count", starting at 1 | ||
121 | * (needed for LRW-32-AES and possible other narrow block modes) | ||
122 | * | ||
116 | * plumb: unimplemented, see: | 123 | * plumb: unimplemented, see: |
117 | * http://article.gmane.org/gmane.linux.kernel.device-mapper.dm-crypt/454 | 124 | * http://article.gmane.org/gmane.linux.kernel.device-mapper.dm-crypt/454 |
118 | */ | 125 | */ |
@@ -191,21 +198,61 @@ static int crypt_iv_essiv_ctr(struct crypt_config *cc, struct dm_target *ti, | |||
191 | } | 198 | } |
192 | kfree(salt); | 199 | kfree(salt); |
193 | 200 | ||
194 | cc->iv_gen_private = essiv_tfm; | 201 | cc->iv_gen_private.essiv_tfm = essiv_tfm; |
195 | return 0; | 202 | return 0; |
196 | } | 203 | } |
197 | 204 | ||
198 | static void crypt_iv_essiv_dtr(struct crypt_config *cc) | 205 | static void crypt_iv_essiv_dtr(struct crypt_config *cc) |
199 | { | 206 | { |
200 | crypto_free_cipher(cc->iv_gen_private); | 207 | crypto_free_cipher(cc->iv_gen_private.essiv_tfm); |
201 | cc->iv_gen_private = NULL; | 208 | cc->iv_gen_private.essiv_tfm = NULL; |
202 | } | 209 | } |
203 | 210 | ||
204 | static int crypt_iv_essiv_gen(struct crypt_config *cc, u8 *iv, sector_t sector) | 211 | static int crypt_iv_essiv_gen(struct crypt_config *cc, u8 *iv, sector_t sector) |
205 | { | 212 | { |
206 | memset(iv, 0, cc->iv_size); | 213 | memset(iv, 0, cc->iv_size); |
207 | *(u64 *)iv = cpu_to_le64(sector); | 214 | *(u64 *)iv = cpu_to_le64(sector); |
208 | crypto_cipher_encrypt_one(cc->iv_gen_private, iv, iv); | 215 | crypto_cipher_encrypt_one(cc->iv_gen_private.essiv_tfm, iv, iv); |
216 | return 0; | ||
217 | } | ||
218 | |||
219 | static int crypt_iv_benbi_ctr(struct crypt_config *cc, struct dm_target *ti, | ||
220 | const char *opts) | ||
221 | { | ||
222 | unsigned int bs = crypto_blkcipher_blocksize(cc->tfm); | ||
223 | int log = long_log2(bs); | ||
224 | |||
225 | /* we need to calculate how far we must shift the sector count | ||
226 | * to get the cipher block count, we use this shift in _gen */ | ||
227 | |||
228 | if (1 << log != bs) { | ||
229 | ti->error = "cypher blocksize is not a power of 2"; | ||
230 | return -EINVAL; | ||
231 | } | ||
232 | |||
233 | if (log > 9) { | ||
234 | ti->error = "cypher blocksize is > 512"; | ||
235 | return -EINVAL; | ||
236 | } | ||
237 | |||
238 | cc->iv_gen_private.benbi_shift = 9 - log; | ||
239 | |||
240 | return 0; | ||
241 | } | ||
242 | |||
243 | static void crypt_iv_benbi_dtr(struct crypt_config *cc) | ||
244 | { | ||
245 | } | ||
246 | |||
247 | static int crypt_iv_benbi_gen(struct crypt_config *cc, u8 *iv, sector_t sector) | ||
248 | { | ||
249 | __be64 val; | ||
250 | |||
251 | memset(iv, 0, cc->iv_size - sizeof(u64)); /* rest is cleared below */ | ||
252 | |||
253 | val = cpu_to_be64(((u64)sector << cc->iv_gen_private.benbi_shift) + 1); | ||
254 | put_unaligned(val, (__be64 *)(iv + cc->iv_size - sizeof(u64))); | ||
255 | |||
209 | return 0; | 256 | return 0; |
210 | } | 257 | } |
211 | 258 | ||
@@ -219,13 +266,18 @@ static struct crypt_iv_operations crypt_iv_essiv_ops = { | |||
219 | .generator = crypt_iv_essiv_gen | 266 | .generator = crypt_iv_essiv_gen |
220 | }; | 267 | }; |
221 | 268 | ||
269 | static struct crypt_iv_operations crypt_iv_benbi_ops = { | ||
270 | .ctr = crypt_iv_benbi_ctr, | ||
271 | .dtr = crypt_iv_benbi_dtr, | ||
272 | .generator = crypt_iv_benbi_gen | ||
273 | }; | ||
222 | 274 | ||
223 | static int | 275 | static int |
224 | crypt_convert_scatterlist(struct crypt_config *cc, struct scatterlist *out, | 276 | crypt_convert_scatterlist(struct crypt_config *cc, struct scatterlist *out, |
225 | struct scatterlist *in, unsigned int length, | 277 | struct scatterlist *in, unsigned int length, |
226 | int write, sector_t sector) | 278 | int write, sector_t sector) |
227 | { | 279 | { |
228 | u8 iv[cc->iv_size]; | 280 | u8 iv[cc->iv_size] __attribute__ ((aligned(__alignof__(u64)))); |
229 | struct blkcipher_desc desc = { | 281 | struct blkcipher_desc desc = { |
230 | .tfm = cc->tfm, | 282 | .tfm = cc->tfm, |
231 | .info = iv, | 283 | .info = iv, |
@@ -768,7 +820,7 @@ static int crypt_ctr(struct dm_target *ti, unsigned int argc, char **argv) | |||
768 | cc->tfm = tfm; | 820 | cc->tfm = tfm; |
769 | 821 | ||
770 | /* | 822 | /* |
771 | * Choose ivmode. Valid modes: "plain", "essiv:<esshash>". | 823 | * Choose ivmode. Valid modes: "plain", "essiv:<esshash>", "benbi". |
772 | * See comments at iv code | 824 | * See comments at iv code |
773 | */ | 825 | */ |
774 | 826 | ||
@@ -778,6 +830,8 @@ static int crypt_ctr(struct dm_target *ti, unsigned int argc, char **argv) | |||
778 | cc->iv_gen_ops = &crypt_iv_plain_ops; | 830 | cc->iv_gen_ops = &crypt_iv_plain_ops; |
779 | else if (strcmp(ivmode, "essiv") == 0) | 831 | else if (strcmp(ivmode, "essiv") == 0) |
780 | cc->iv_gen_ops = &crypt_iv_essiv_ops; | 832 | cc->iv_gen_ops = &crypt_iv_essiv_ops; |
833 | else if (strcmp(ivmode, "benbi") == 0) | ||
834 | cc->iv_gen_ops = &crypt_iv_benbi_ops; | ||
781 | else { | 835 | else { |
782 | ti->error = "Invalid IV mode"; | 836 | ti->error = "Invalid IV mode"; |
783 | goto bad2; | 837 | goto bad2; |
diff --git a/drivers/net/irda/pxaficp_ir.c b/drivers/net/irda/pxaficp_ir.c index f9a1c88a4283..9137e239fac2 100644 --- a/drivers/net/irda/pxaficp_ir.c +++ b/drivers/net/irda/pxaficp_ir.c | |||
@@ -704,9 +704,9 @@ static int pxa_irda_stop(struct net_device *dev) | |||
704 | return 0; | 704 | return 0; |
705 | } | 705 | } |
706 | 706 | ||
707 | static int pxa_irda_suspend(struct device *_dev, pm_message_t state) | 707 | static int pxa_irda_suspend(struct platform_device *_dev, pm_message_t state) |
708 | { | 708 | { |
709 | struct net_device *dev = dev_get_drvdata(_dev); | 709 | struct net_device *dev = platform_get_drvdata(_dev); |
710 | struct pxa_irda *si; | 710 | struct pxa_irda *si; |
711 | 711 | ||
712 | if (dev && netif_running(dev)) { | 712 | if (dev && netif_running(dev)) { |
@@ -718,9 +718,9 @@ static int pxa_irda_suspend(struct device *_dev, pm_message_t state) | |||
718 | return 0; | 718 | return 0; |
719 | } | 719 | } |
720 | 720 | ||
721 | static int pxa_irda_resume(struct device *_dev) | 721 | static int pxa_irda_resume(struct platform_device *_dev) |
722 | { | 722 | { |
723 | struct net_device *dev = dev_get_drvdata(_dev); | 723 | struct net_device *dev = platform_get_drvdata(_dev); |
724 | struct pxa_irda *si; | 724 | struct pxa_irda *si; |
725 | 725 | ||
726 | if (dev && netif_running(dev)) { | 726 | if (dev && netif_running(dev)) { |
@@ -746,9 +746,8 @@ static int pxa_irda_init_iobuf(iobuff_t *io, int size) | |||
746 | return io->head ? 0 : -ENOMEM; | 746 | return io->head ? 0 : -ENOMEM; |
747 | } | 747 | } |
748 | 748 | ||
749 | static int pxa_irda_probe(struct device *_dev) | 749 | static int pxa_irda_probe(struct platform_device *pdev) |
750 | { | 750 | { |
751 | struct platform_device *pdev = to_platform_device(_dev); | ||
752 | struct net_device *dev; | 751 | struct net_device *dev; |
753 | struct pxa_irda *si; | 752 | struct pxa_irda *si; |
754 | unsigned int baudrate_mask; | 753 | unsigned int baudrate_mask; |
@@ -822,9 +821,9 @@ err_mem_1: | |||
822 | return err; | 821 | return err; |
823 | } | 822 | } |
824 | 823 | ||
825 | static int pxa_irda_remove(struct device *_dev) | 824 | static int pxa_irda_remove(struct platform_device *_dev) |
826 | { | 825 | { |
827 | struct net_device *dev = dev_get_drvdata(_dev); | 826 | struct net_device *dev = platform_get_drvdata(_dev); |
828 | 827 | ||
829 | if (dev) { | 828 | if (dev) { |
830 | struct pxa_irda *si = netdev_priv(dev); | 829 | struct pxa_irda *si = netdev_priv(dev); |
@@ -840,9 +839,10 @@ static int pxa_irda_remove(struct device *_dev) | |||
840 | return 0; | 839 | return 0; |
841 | } | 840 | } |
842 | 841 | ||
843 | static struct device_driver pxa_ir_driver = { | 842 | static struct platform_driver pxa_ir_driver = { |
844 | .name = "pxa2xx-ir", | 843 | .driver = { |
845 | .bus = &platform_bus_type, | 844 | .name = "pxa2xx-ir", |
845 | }, | ||
846 | .probe = pxa_irda_probe, | 846 | .probe = pxa_irda_probe, |
847 | .remove = pxa_irda_remove, | 847 | .remove = pxa_irda_remove, |
848 | .suspend = pxa_irda_suspend, | 848 | .suspend = pxa_irda_suspend, |
@@ -851,12 +851,12 @@ static struct device_driver pxa_ir_driver = { | |||
851 | 851 | ||
852 | static int __init pxa_irda_init(void) | 852 | static int __init pxa_irda_init(void) |
853 | { | 853 | { |
854 | return driver_register(&pxa_ir_driver); | 854 | return platform_driver_register(&pxa_ir_driver); |
855 | } | 855 | } |
856 | 856 | ||
857 | static void __exit pxa_irda_exit(void) | 857 | static void __exit pxa_irda_exit(void) |
858 | { | 858 | { |
859 | driver_unregister(&pxa_ir_driver); | 859 | platform_driver_unregister(&pxa_ir_driver); |
860 | } | 860 | } |
861 | 861 | ||
862 | module_init(pxa_irda_init); | 862 | module_init(pxa_irda_init); |
diff --git a/drivers/net/tg3.c b/drivers/net/tg3.c index d9123c9adc1e..571320ae87ab 100644 --- a/drivers/net/tg3.c +++ b/drivers/net/tg3.c | |||
@@ -68,8 +68,8 @@ | |||
68 | 68 | ||
69 | #define DRV_MODULE_NAME "tg3" | 69 | #define DRV_MODULE_NAME "tg3" |
70 | #define PFX DRV_MODULE_NAME ": " | 70 | #define PFX DRV_MODULE_NAME ": " |
71 | #define DRV_MODULE_VERSION "3.69" | 71 | #define DRV_MODULE_VERSION "3.70" |
72 | #define DRV_MODULE_RELDATE "November 15, 2006" | 72 | #define DRV_MODULE_RELDATE "December 1, 2006" |
73 | 73 | ||
74 | #define TG3_DEF_MAC_MODE 0 | 74 | #define TG3_DEF_MAC_MODE 0 |
75 | #define TG3_DEF_RX_MODE 0 | 75 | #define TG3_DEF_RX_MODE 0 |
@@ -192,6 +192,7 @@ static struct pci_device_id tg3_pci_tbl[] = { | |||
192 | {PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_TIGON3_5786)}, | 192 | {PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_TIGON3_5786)}, |
193 | {PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_TIGON3_5787)}, | 193 | {PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_TIGON3_5787)}, |
194 | {PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_TIGON3_5787M)}, | 194 | {PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_TIGON3_5787M)}, |
195 | {PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_TIGON3_5787F)}, | ||
195 | {PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_TIGON3_5714)}, | 196 | {PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_TIGON3_5714)}, |
196 | {PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_TIGON3_5714S)}, | 197 | {PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_TIGON3_5714S)}, |
197 | {PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_TIGON3_5715)}, | 198 | {PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_TIGON3_5715)}, |
@@ -1061,7 +1062,7 @@ static void tg3_frob_aux_power(struct tg3 *tp) | |||
1061 | { | 1062 | { |
1062 | struct tg3 *tp_peer = tp; | 1063 | struct tg3 *tp_peer = tp; |
1063 | 1064 | ||
1064 | if ((tp->tg3_flags & TG3_FLAG_EEPROM_WRITE_PROT) != 0) | 1065 | if ((tp->tg3_flags2 & TG3_FLG2_IS_NIC) == 0) |
1065 | return; | 1066 | return; |
1066 | 1067 | ||
1067 | if ((GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5704) || | 1068 | if ((GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5704) || |
@@ -1212,8 +1213,8 @@ static int tg3_set_power_state(struct tg3 *tp, pci_power_t state) | |||
1212 | power_control); | 1213 | power_control); |
1213 | udelay(100); /* Delay after power state change */ | 1214 | udelay(100); /* Delay after power state change */ |
1214 | 1215 | ||
1215 | /* Switch out of Vaux if it is not a LOM */ | 1216 | /* Switch out of Vaux if it is a NIC */ |
1216 | if (!(tp->tg3_flags & TG3_FLAG_EEPROM_WRITE_PROT)) | 1217 | if (tp->tg3_flags2 & TG3_FLG2_IS_NIC) |
1217 | tw32_wait_f(GRC_LOCAL_CTRL, tp->grc_local_ctrl, 100); | 1218 | tw32_wait_f(GRC_LOCAL_CTRL, tp->grc_local_ctrl, 100); |
1218 | 1219 | ||
1219 | return 0; | 1220 | return 0; |
@@ -1401,8 +1402,10 @@ static int tg3_set_power_state(struct tg3 *tp, pci_power_t state) | |||
1401 | static void tg3_link_report(struct tg3 *tp) | 1402 | static void tg3_link_report(struct tg3 *tp) |
1402 | { | 1403 | { |
1403 | if (!netif_carrier_ok(tp->dev)) { | 1404 | if (!netif_carrier_ok(tp->dev)) { |
1404 | printk(KERN_INFO PFX "%s: Link is down.\n", tp->dev->name); | 1405 | if (netif_msg_link(tp)) |
1405 | } else { | 1406 | printk(KERN_INFO PFX "%s: Link is down.\n", |
1407 | tp->dev->name); | ||
1408 | } else if (netif_msg_link(tp)) { | ||
1406 | printk(KERN_INFO PFX "%s: Link is up at %d Mbps, %s duplex.\n", | 1409 | printk(KERN_INFO PFX "%s: Link is up at %d Mbps, %s duplex.\n", |
1407 | tp->dev->name, | 1410 | tp->dev->name, |
1408 | (tp->link_config.active_speed == SPEED_1000 ? | 1411 | (tp->link_config.active_speed == SPEED_1000 ? |
@@ -1557,12 +1560,6 @@ static void tg3_phy_copper_begin(struct tg3 *tp) | |||
1557 | 1560 | ||
1558 | tg3_writephy(tp, MII_ADVERTISE, new_adv); | 1561 | tg3_writephy(tp, MII_ADVERTISE, new_adv); |
1559 | } else if (tp->link_config.speed == SPEED_INVALID) { | 1562 | } else if (tp->link_config.speed == SPEED_INVALID) { |
1560 | tp->link_config.advertising = | ||
1561 | (ADVERTISED_10baseT_Half | ADVERTISED_10baseT_Full | | ||
1562 | ADVERTISED_100baseT_Half | ADVERTISED_100baseT_Full | | ||
1563 | ADVERTISED_1000baseT_Half | ADVERTISED_1000baseT_Full | | ||
1564 | ADVERTISED_Autoneg | ADVERTISED_MII); | ||
1565 | |||
1566 | if (tp->tg3_flags & TG3_FLAG_10_100_ONLY) | 1563 | if (tp->tg3_flags & TG3_FLAG_10_100_ONLY) |
1567 | tp->link_config.advertising &= | 1564 | tp->link_config.advertising &= |
1568 | ~(ADVERTISED_1000baseT_Half | | 1565 | ~(ADVERTISED_1000baseT_Half | |
@@ -1706,25 +1703,36 @@ static int tg3_init_5401phy_dsp(struct tg3 *tp) | |||
1706 | return err; | 1703 | return err; |
1707 | } | 1704 | } |
1708 | 1705 | ||
1709 | static int tg3_copper_is_advertising_all(struct tg3 *tp) | 1706 | static int tg3_copper_is_advertising_all(struct tg3 *tp, u32 mask) |
1710 | { | 1707 | { |
1711 | u32 adv_reg, all_mask; | 1708 | u32 adv_reg, all_mask = 0; |
1709 | |||
1710 | if (mask & ADVERTISED_10baseT_Half) | ||
1711 | all_mask |= ADVERTISE_10HALF; | ||
1712 | if (mask & ADVERTISED_10baseT_Full) | ||
1713 | all_mask |= ADVERTISE_10FULL; | ||
1714 | if (mask & ADVERTISED_100baseT_Half) | ||
1715 | all_mask |= ADVERTISE_100HALF; | ||
1716 | if (mask & ADVERTISED_100baseT_Full) | ||
1717 | all_mask |= ADVERTISE_100FULL; | ||
1712 | 1718 | ||
1713 | if (tg3_readphy(tp, MII_ADVERTISE, &adv_reg)) | 1719 | if (tg3_readphy(tp, MII_ADVERTISE, &adv_reg)) |
1714 | return 0; | 1720 | return 0; |
1715 | 1721 | ||
1716 | all_mask = (ADVERTISE_10HALF | ADVERTISE_10FULL | | ||
1717 | ADVERTISE_100HALF | ADVERTISE_100FULL); | ||
1718 | if ((adv_reg & all_mask) != all_mask) | 1722 | if ((adv_reg & all_mask) != all_mask) |
1719 | return 0; | 1723 | return 0; |
1720 | if (!(tp->tg3_flags & TG3_FLAG_10_100_ONLY)) { | 1724 | if (!(tp->tg3_flags & TG3_FLAG_10_100_ONLY)) { |
1721 | u32 tg3_ctrl; | 1725 | u32 tg3_ctrl; |
1722 | 1726 | ||
1727 | all_mask = 0; | ||
1728 | if (mask & ADVERTISED_1000baseT_Half) | ||
1729 | all_mask |= ADVERTISE_1000HALF; | ||
1730 | if (mask & ADVERTISED_1000baseT_Full) | ||
1731 | all_mask |= ADVERTISE_1000FULL; | ||
1732 | |||
1723 | if (tg3_readphy(tp, MII_TG3_CTRL, &tg3_ctrl)) | 1733 | if (tg3_readphy(tp, MII_TG3_CTRL, &tg3_ctrl)) |
1724 | return 0; | 1734 | return 0; |
1725 | 1735 | ||
1726 | all_mask = (MII_TG3_CTRL_ADV_1000_HALF | | ||
1727 | MII_TG3_CTRL_ADV_1000_FULL); | ||
1728 | if ((tg3_ctrl & all_mask) != all_mask) | 1736 | if ((tg3_ctrl & all_mask) != all_mask) |
1729 | return 0; | 1737 | return 0; |
1730 | } | 1738 | } |
@@ -1884,7 +1892,8 @@ static int tg3_setup_copper_phy(struct tg3 *tp, int force_reset) | |||
1884 | /* Force autoneg restart if we are exiting | 1892 | /* Force autoneg restart if we are exiting |
1885 | * low power mode. | 1893 | * low power mode. |
1886 | */ | 1894 | */ |
1887 | if (!tg3_copper_is_advertising_all(tp)) | 1895 | if (!tg3_copper_is_advertising_all(tp, |
1896 | tp->link_config.advertising)) | ||
1888 | current_link_up = 0; | 1897 | current_link_up = 0; |
1889 | } else { | 1898 | } else { |
1890 | current_link_up = 0; | 1899 | current_link_up = 0; |
@@ -3703,8 +3712,9 @@ static void tg3_tx_timeout(struct net_device *dev) | |||
3703 | { | 3712 | { |
3704 | struct tg3 *tp = netdev_priv(dev); | 3713 | struct tg3 *tp = netdev_priv(dev); |
3705 | 3714 | ||
3706 | printk(KERN_ERR PFX "%s: transmit timed out, resetting\n", | 3715 | if (netif_msg_tx_err(tp)) |
3707 | dev->name); | 3716 | printk(KERN_ERR PFX "%s: transmit timed out, resetting\n", |
3717 | dev->name); | ||
3708 | 3718 | ||
3709 | schedule_work(&tp->reset_task); | 3719 | schedule_work(&tp->reset_task); |
3710 | } | 3720 | } |
@@ -6396,16 +6406,17 @@ static int tg3_reset_hw(struct tg3 *tp, int reset_phy) | |||
6396 | udelay(40); | 6406 | udelay(40); |
6397 | 6407 | ||
6398 | /* tp->grc_local_ctrl is partially set up during tg3_get_invariants(). | 6408 | /* tp->grc_local_ctrl is partially set up during tg3_get_invariants(). |
6399 | * If TG3_FLAG_EEPROM_WRITE_PROT is set, we should read the | 6409 | * If TG3_FLG2_IS_NIC is zero, we should read the |
6400 | * register to preserve the GPIO settings for LOMs. The GPIOs, | 6410 | * register to preserve the GPIO settings for LOMs. The GPIOs, |
6401 | * whether used as inputs or outputs, are set by boot code after | 6411 | * whether used as inputs or outputs, are set by boot code after |
6402 | * reset. | 6412 | * reset. |
6403 | */ | 6413 | */ |
6404 | if (tp->tg3_flags & TG3_FLAG_EEPROM_WRITE_PROT) { | 6414 | if (!(tp->tg3_flags2 & TG3_FLG2_IS_NIC)) { |
6405 | u32 gpio_mask; | 6415 | u32 gpio_mask; |
6406 | 6416 | ||
6407 | gpio_mask = GRC_LCLCTRL_GPIO_OE0 | GRC_LCLCTRL_GPIO_OE2 | | 6417 | gpio_mask = GRC_LCLCTRL_GPIO_OE0 | GRC_LCLCTRL_GPIO_OE1 | |
6408 | GRC_LCLCTRL_GPIO_OUTPUT0 | GRC_LCLCTRL_GPIO_OUTPUT2; | 6418 | GRC_LCLCTRL_GPIO_OE2 | GRC_LCLCTRL_GPIO_OUTPUT0 | |
6419 | GRC_LCLCTRL_GPIO_OUTPUT1 | GRC_LCLCTRL_GPIO_OUTPUT2; | ||
6409 | 6420 | ||
6410 | if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5752) | 6421 | if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5752) |
6411 | gpio_mask |= GRC_LCLCTRL_GPIO_OE3 | | 6422 | gpio_mask |= GRC_LCLCTRL_GPIO_OE3 | |
@@ -6417,8 +6428,9 @@ static int tg3_reset_hw(struct tg3 *tp, int reset_phy) | |||
6417 | tp->grc_local_ctrl |= tr32(GRC_LOCAL_CTRL) & gpio_mask; | 6428 | tp->grc_local_ctrl |= tr32(GRC_LOCAL_CTRL) & gpio_mask; |
6418 | 6429 | ||
6419 | /* GPIO1 must be driven high for eeprom write protect */ | 6430 | /* GPIO1 must be driven high for eeprom write protect */ |
6420 | tp->grc_local_ctrl |= (GRC_LCLCTRL_GPIO_OE1 | | 6431 | if (tp->tg3_flags & TG3_FLAG_EEPROM_WRITE_PROT) |
6421 | GRC_LCLCTRL_GPIO_OUTPUT1); | 6432 | tp->grc_local_ctrl |= (GRC_LCLCTRL_GPIO_OE1 | |
6433 | GRC_LCLCTRL_GPIO_OUTPUT1); | ||
6422 | } | 6434 | } |
6423 | tw32_f(GRC_LOCAL_CTRL, tp->grc_local_ctrl); | 6435 | tw32_f(GRC_LOCAL_CTRL, tp->grc_local_ctrl); |
6424 | udelay(100); | 6436 | udelay(100); |
@@ -8656,7 +8668,9 @@ static int tg3_test_registers(struct tg3 *tp) | |||
8656 | return 0; | 8668 | return 0; |
8657 | 8669 | ||
8658 | out: | 8670 | out: |
8659 | printk(KERN_ERR PFX "Register test failed at offset %x\n", offset); | 8671 | if (netif_msg_hw(tp)) |
8672 | printk(KERN_ERR PFX "Register test failed at offset %x\n", | ||
8673 | offset); | ||
8660 | tw32(offset, save_val); | 8674 | tw32(offset, save_val); |
8661 | return -EIO; | 8675 | return -EIO; |
8662 | } | 8676 | } |
@@ -8781,17 +8795,20 @@ static int tg3_run_loopback(struct tg3 *tp, int loopback_mode) | |||
8781 | tg3_writephy(tp, 0x10, phy & ~0x4000); | 8795 | tg3_writephy(tp, 0x10, phy & ~0x4000); |
8782 | tg3_writephy(tp, MII_TG3_EPHY_TEST, phytest); | 8796 | tg3_writephy(tp, MII_TG3_EPHY_TEST, phytest); |
8783 | } | 8797 | } |
8784 | } | 8798 | val = BMCR_LOOPBACK | BMCR_FULLDPLX | BMCR_SPEED100; |
8785 | val = BMCR_LOOPBACK | BMCR_FULLDPLX; | 8799 | } else |
8786 | if (tp->tg3_flags & TG3_FLAG_10_100_ONLY) | 8800 | val = BMCR_LOOPBACK | BMCR_FULLDPLX | BMCR_SPEED1000; |
8787 | val |= BMCR_SPEED100; | ||
8788 | else | ||
8789 | val |= BMCR_SPEED1000; | ||
8790 | 8801 | ||
8791 | tg3_writephy(tp, MII_BMCR, val); | 8802 | tg3_writephy(tp, MII_BMCR, val); |
8792 | udelay(40); | 8803 | udelay(40); |
8793 | if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5906) | 8804 | |
8805 | mac_mode = (tp->mac_mode & ~MAC_MODE_PORT_MODE_MASK) | | ||
8806 | MAC_MODE_LINK_POLARITY; | ||
8807 | if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5906) { | ||
8794 | tg3_writephy(tp, MII_TG3_EPHY_PTEST, 0x1800); | 8808 | tg3_writephy(tp, MII_TG3_EPHY_PTEST, 0x1800); |
8809 | mac_mode |= MAC_MODE_PORT_MODE_MII; | ||
8810 | } else | ||
8811 | mac_mode |= MAC_MODE_PORT_MODE_GMII; | ||
8795 | 8812 | ||
8796 | /* reset to prevent losing 1st rx packet intermittently */ | 8813 | /* reset to prevent losing 1st rx packet intermittently */ |
8797 | if (tp->tg3_flags2 & TG3_FLG2_MII_SERDES) { | 8814 | if (tp->tg3_flags2 & TG3_FLG2_MII_SERDES) { |
@@ -8799,12 +8816,6 @@ static int tg3_run_loopback(struct tg3 *tp, int loopback_mode) | |||
8799 | udelay(10); | 8816 | udelay(10); |
8800 | tw32_f(MAC_RX_MODE, tp->rx_mode); | 8817 | tw32_f(MAC_RX_MODE, tp->rx_mode); |
8801 | } | 8818 | } |
8802 | mac_mode = (tp->mac_mode & ~MAC_MODE_PORT_MODE_MASK) | | ||
8803 | MAC_MODE_LINK_POLARITY; | ||
8804 | if (tp->tg3_flags & TG3_FLAG_10_100_ONLY) | ||
8805 | mac_mode |= MAC_MODE_PORT_MODE_MII; | ||
8806 | else | ||
8807 | mac_mode |= MAC_MODE_PORT_MODE_GMII; | ||
8808 | if ((tp->phy_id & PHY_ID_MASK) == PHY_ID_BCM5401) { | 8819 | if ((tp->phy_id & PHY_ID_MASK) == PHY_ID_BCM5401) { |
8809 | mac_mode &= ~MAC_MODE_LINK_POLARITY; | 8820 | mac_mode &= ~MAC_MODE_LINK_POLARITY; |
8810 | tg3_writephy(tp, MII_TG3_EXT_CTRL, | 8821 | tg3_writephy(tp, MII_TG3_EXT_CTRL, |
@@ -9456,16 +9467,12 @@ static void __devinit tg3_get_5906_nvram_info(struct tg3 *tp) | |||
9456 | /* Chips other than 5700/5701 use the NVRAM for fetching info. */ | 9467 | /* Chips other than 5700/5701 use the NVRAM for fetching info. */ |
9457 | static void __devinit tg3_nvram_init(struct tg3 *tp) | 9468 | static void __devinit tg3_nvram_init(struct tg3 *tp) |
9458 | { | 9469 | { |
9459 | int j; | ||
9460 | |||
9461 | tw32_f(GRC_EEPROM_ADDR, | 9470 | tw32_f(GRC_EEPROM_ADDR, |
9462 | (EEPROM_ADDR_FSM_RESET | | 9471 | (EEPROM_ADDR_FSM_RESET | |
9463 | (EEPROM_DEFAULT_CLOCK_PERIOD << | 9472 | (EEPROM_DEFAULT_CLOCK_PERIOD << |
9464 | EEPROM_ADDR_CLKPERD_SHIFT))); | 9473 | EEPROM_ADDR_CLKPERD_SHIFT))); |
9465 | 9474 | ||
9466 | /* XXX schedule_timeout() ... */ | 9475 | msleep(1); |
9467 | for (j = 0; j < 100; j++) | ||
9468 | udelay(10); | ||
9469 | 9476 | ||
9470 | /* Enable seeprom accesses. */ | 9477 | /* Enable seeprom accesses. */ |
9471 | tw32_f(GRC_LOCAL_CTRL, | 9478 | tw32_f(GRC_LOCAL_CTRL, |
@@ -9526,12 +9533,12 @@ static int tg3_nvram_read_using_eeprom(struct tg3 *tp, | |||
9526 | EEPROM_ADDR_ADDR_MASK) | | 9533 | EEPROM_ADDR_ADDR_MASK) | |
9527 | EEPROM_ADDR_READ | EEPROM_ADDR_START); | 9534 | EEPROM_ADDR_READ | EEPROM_ADDR_START); |
9528 | 9535 | ||
9529 | for (i = 0; i < 10000; i++) { | 9536 | for (i = 0; i < 1000; i++) { |
9530 | tmp = tr32(GRC_EEPROM_ADDR); | 9537 | tmp = tr32(GRC_EEPROM_ADDR); |
9531 | 9538 | ||
9532 | if (tmp & EEPROM_ADDR_COMPLETE) | 9539 | if (tmp & EEPROM_ADDR_COMPLETE) |
9533 | break; | 9540 | break; |
9534 | udelay(100); | 9541 | msleep(1); |
9535 | } | 9542 | } |
9536 | if (!(tmp & EEPROM_ADDR_COMPLETE)) | 9543 | if (!(tmp & EEPROM_ADDR_COMPLETE)) |
9537 | return -EBUSY; | 9544 | return -EBUSY; |
@@ -9656,12 +9663,12 @@ static int tg3_nvram_write_block_using_eeprom(struct tg3 *tp, | |||
9656 | EEPROM_ADDR_START | | 9663 | EEPROM_ADDR_START | |
9657 | EEPROM_ADDR_WRITE); | 9664 | EEPROM_ADDR_WRITE); |
9658 | 9665 | ||
9659 | for (j = 0; j < 10000; j++) { | 9666 | for (j = 0; j < 1000; j++) { |
9660 | val = tr32(GRC_EEPROM_ADDR); | 9667 | val = tr32(GRC_EEPROM_ADDR); |
9661 | 9668 | ||
9662 | if (val & EEPROM_ADDR_COMPLETE) | 9669 | if (val & EEPROM_ADDR_COMPLETE) |
9663 | break; | 9670 | break; |
9664 | udelay(100); | 9671 | msleep(1); |
9665 | } | 9672 | } |
9666 | if (!(val & EEPROM_ADDR_COMPLETE)) { | 9673 | if (!(val & EEPROM_ADDR_COMPLETE)) { |
9667 | rc = -EBUSY; | 9674 | rc = -EBUSY; |
@@ -9965,8 +9972,10 @@ static void __devinit tg3_get_eeprom_hw_cfg(struct tg3 *tp) | |||
9965 | tp->tg3_flags |= TG3_FLAG_EEPROM_WRITE_PROT; | 9972 | tp->tg3_flags |= TG3_FLAG_EEPROM_WRITE_PROT; |
9966 | 9973 | ||
9967 | if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5906) { | 9974 | if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5906) { |
9968 | if (!(tr32(PCIE_TRANSACTION_CFG) & PCIE_TRANS_CFG_LOM)) | 9975 | if (!(tr32(PCIE_TRANSACTION_CFG) & PCIE_TRANS_CFG_LOM)) { |
9969 | tp->tg3_flags &= ~TG3_FLAG_EEPROM_WRITE_PROT; | 9976 | tp->tg3_flags &= ~TG3_FLAG_EEPROM_WRITE_PROT; |
9977 | tp->tg3_flags2 |= TG3_FLG2_IS_NIC; | ||
9978 | } | ||
9970 | return; | 9979 | return; |
9971 | } | 9980 | } |
9972 | 9981 | ||
@@ -10066,10 +10075,17 @@ static void __devinit tg3_get_eeprom_hw_cfg(struct tg3 *tp) | |||
10066 | tp->pdev->subsystem_vendor == PCI_VENDOR_ID_DELL) | 10075 | tp->pdev->subsystem_vendor == PCI_VENDOR_ID_DELL) |
10067 | tp->led_ctrl = LED_CTRL_MODE_PHY_2; | 10076 | tp->led_ctrl = LED_CTRL_MODE_PHY_2; |
10068 | 10077 | ||
10069 | if (nic_cfg & NIC_SRAM_DATA_CFG_EEPROM_WP) | 10078 | if (nic_cfg & NIC_SRAM_DATA_CFG_EEPROM_WP) { |
10070 | tp->tg3_flags |= TG3_FLAG_EEPROM_WRITE_PROT; | 10079 | tp->tg3_flags |= TG3_FLAG_EEPROM_WRITE_PROT; |
10071 | else | 10080 | if ((tp->pdev->subsystem_vendor == |
10081 | PCI_VENDOR_ID_ARIMA) && | ||
10082 | (tp->pdev->subsystem_device == 0x205a || | ||
10083 | tp->pdev->subsystem_device == 0x2063)) | ||
10084 | tp->tg3_flags &= ~TG3_FLAG_EEPROM_WRITE_PROT; | ||
10085 | } else { | ||
10072 | tp->tg3_flags &= ~TG3_FLAG_EEPROM_WRITE_PROT; | 10086 | tp->tg3_flags &= ~TG3_FLAG_EEPROM_WRITE_PROT; |
10087 | tp->tg3_flags2 |= TG3_FLG2_IS_NIC; | ||
10088 | } | ||
10073 | 10089 | ||
10074 | if (nic_cfg & NIC_SRAM_DATA_CFG_ASF_ENABLE) { | 10090 | if (nic_cfg & NIC_SRAM_DATA_CFG_ASF_ENABLE) { |
10075 | tp->tg3_flags |= TG3_FLAG_ENABLE_ASF; | 10091 | tp->tg3_flags |= TG3_FLAG_ENABLE_ASF; |
@@ -10147,7 +10163,7 @@ static int __devinit tg3_phy_probe(struct tg3 *tp) | |||
10147 | 10163 | ||
10148 | if (!(tp->tg3_flags2 & TG3_FLG2_ANY_SERDES) && | 10164 | if (!(tp->tg3_flags2 & TG3_FLG2_ANY_SERDES) && |
10149 | !(tp->tg3_flags & TG3_FLAG_ENABLE_ASF)) { | 10165 | !(tp->tg3_flags & TG3_FLAG_ENABLE_ASF)) { |
10150 | u32 bmsr, adv_reg, tg3_ctrl; | 10166 | u32 bmsr, adv_reg, tg3_ctrl, mask; |
10151 | 10167 | ||
10152 | tg3_readphy(tp, MII_BMSR, &bmsr); | 10168 | tg3_readphy(tp, MII_BMSR, &bmsr); |
10153 | if (!tg3_readphy(tp, MII_BMSR, &bmsr) && | 10169 | if (!tg3_readphy(tp, MII_BMSR, &bmsr) && |
@@ -10171,7 +10187,10 @@ static int __devinit tg3_phy_probe(struct tg3 *tp) | |||
10171 | MII_TG3_CTRL_ENABLE_AS_MASTER); | 10187 | MII_TG3_CTRL_ENABLE_AS_MASTER); |
10172 | } | 10188 | } |
10173 | 10189 | ||
10174 | if (!tg3_copper_is_advertising_all(tp)) { | 10190 | mask = (ADVERTISED_10baseT_Half | ADVERTISED_10baseT_Full | |
10191 | ADVERTISED_100baseT_Half | ADVERTISED_100baseT_Full | | ||
10192 | ADVERTISED_1000baseT_Half | ADVERTISED_1000baseT_Full); | ||
10193 | if (!tg3_copper_is_advertising_all(tp, mask)) { | ||
10175 | tg3_writephy(tp, MII_ADVERTISE, adv_reg); | 10194 | tg3_writephy(tp, MII_ADVERTISE, adv_reg); |
10176 | 10195 | ||
10177 | if (!(tp->tg3_flags & TG3_FLAG_10_100_ONLY)) | 10196 | if (!(tp->tg3_flags & TG3_FLAG_10_100_ONLY)) |
@@ -10695,7 +10714,7 @@ static int __devinit tg3_get_invariants(struct tg3 *tp) | |||
10695 | tp->tg3_flags |= TG3_FLAG_SRAM_USE_CONFIG; | 10714 | tp->tg3_flags |= TG3_FLAG_SRAM_USE_CONFIG; |
10696 | 10715 | ||
10697 | /* Get eeprom hw config before calling tg3_set_power_state(). | 10716 | /* Get eeprom hw config before calling tg3_set_power_state(). |
10698 | * In particular, the TG3_FLAG_EEPROM_WRITE_PROT flag must be | 10717 | * In particular, the TG3_FLG2_IS_NIC flag must be |
10699 | * determined before calling tg3_set_power_state() so that | 10718 | * determined before calling tg3_set_power_state() so that |
10700 | * we know whether or not to switch out of Vaux power. | 10719 | * we know whether or not to switch out of Vaux power. |
10701 | * When the flag is set, it means that GPIO1 is used for eeprom | 10720 | * When the flag is set, it means that GPIO1 is used for eeprom |
@@ -10862,7 +10881,8 @@ static int __devinit tg3_get_invariants(struct tg3 *tp) | |||
10862 | tp->pdev->device == PCI_DEVICE_ID_TIGON3_5705F)) || | 10881 | tp->pdev->device == PCI_DEVICE_ID_TIGON3_5705F)) || |
10863 | (tp->pdev->vendor == PCI_VENDOR_ID_BROADCOM && | 10882 | (tp->pdev->vendor == PCI_VENDOR_ID_BROADCOM && |
10864 | (tp->pdev->device == PCI_DEVICE_ID_TIGON3_5751F || | 10883 | (tp->pdev->device == PCI_DEVICE_ID_TIGON3_5751F || |
10865 | tp->pdev->device == PCI_DEVICE_ID_TIGON3_5753F)) || | 10884 | tp->pdev->device == PCI_DEVICE_ID_TIGON3_5753F || |
10885 | tp->pdev->device == PCI_DEVICE_ID_TIGON3_5787F)) || | ||
10866 | GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5906) | 10886 | GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5906) |
10867 | tp->tg3_flags |= TG3_FLAG_10_100_ONLY; | 10887 | tp->tg3_flags |= TG3_FLAG_10_100_ONLY; |
10868 | 10888 | ||
@@ -11912,13 +11932,15 @@ static int __devinit tg3_init_one(struct pci_dev *pdev, | |||
11912 | 11932 | ||
11913 | pci_set_drvdata(pdev, dev); | 11933 | pci_set_drvdata(pdev, dev); |
11914 | 11934 | ||
11915 | printk(KERN_INFO "%s: Tigon3 [partno(%s) rev %04x PHY(%s)] (%s) %sBaseT Ethernet ", | 11935 | printk(KERN_INFO "%s: Tigon3 [partno(%s) rev %04x PHY(%s)] (%s) %s Ethernet ", |
11916 | dev->name, | 11936 | dev->name, |
11917 | tp->board_part_number, | 11937 | tp->board_part_number, |
11918 | tp->pci_chip_rev_id, | 11938 | tp->pci_chip_rev_id, |
11919 | tg3_phy_string(tp), | 11939 | tg3_phy_string(tp), |
11920 | tg3_bus_string(tp, str), | 11940 | tg3_bus_string(tp, str), |
11921 | (tp->tg3_flags & TG3_FLAG_10_100_ONLY) ? "10/100" : "10/100/1000"); | 11941 | ((tp->tg3_flags & TG3_FLAG_10_100_ONLY) ? "10/100Base-TX" : |
11942 | ((tp->tg3_flags2 & TG3_FLG2_ANY_SERDES) ? "1000Base-SX" : | ||
11943 | "10/100/1000Base-T"))); | ||
11922 | 11944 | ||
11923 | for (i = 0; i < 6; i++) | 11945 | for (i = 0; i < 6; i++) |
11924 | printk("%2.2x%c", dev->dev_addr[i], | 11946 | printk("%2.2x%c", dev->dev_addr[i], |
diff --git a/drivers/net/tg3.h b/drivers/net/tg3.h index 92f53000bce6..dfaf4ed127bd 100644 --- a/drivers/net/tg3.h +++ b/drivers/net/tg3.h | |||
@@ -2233,6 +2233,7 @@ struct tg3 { | |||
2233 | #define TG3_FLG2_PCI_EXPRESS 0x00000200 | 2233 | #define TG3_FLG2_PCI_EXPRESS 0x00000200 |
2234 | #define TG3_FLG2_ASF_NEW_HANDSHAKE 0x00000400 | 2234 | #define TG3_FLG2_ASF_NEW_HANDSHAKE 0x00000400 |
2235 | #define TG3_FLG2_HW_AUTONEG 0x00000800 | 2235 | #define TG3_FLG2_HW_AUTONEG 0x00000800 |
2236 | #define TG3_FLG2_IS_NIC 0x00001000 | ||
2236 | #define TG3_FLG2_PHY_SERDES 0x00002000 | 2237 | #define TG3_FLG2_PHY_SERDES 0x00002000 |
2237 | #define TG3_FLG2_CAPACITIVE_COUPLING 0x00004000 | 2238 | #define TG3_FLG2_CAPACITIVE_COUPLING 0x00004000 |
2238 | #define TG3_FLG2_FLASH 0x00008000 | 2239 | #define TG3_FLG2_FLASH 0x00008000 |
diff --git a/include/crypto/b128ops.h b/include/crypto/b128ops.h new file mode 100644 index 000000000000..0b8e6bc55301 --- /dev/null +++ b/include/crypto/b128ops.h | |||
@@ -0,0 +1,80 @@ | |||
1 | /* b128ops.h - common 128-bit block operations | ||
2 | * | ||
3 | * Copyright (c) 2003, Dr Brian Gladman, Worcester, UK. | ||
4 | * Copyright (c) 2006, Rik Snel <rsnel@cube.dyndns.org> | ||
5 | * | ||
6 | * Based on Dr Brian Gladman's (GPL'd) work published at | ||
7 | * http://fp.gladman.plus.com/cryptography_technology/index.htm | ||
8 | * See the original copyright notice below. | ||
9 | * | ||
10 | * This program is free software; you can redistribute it and/or modify it | ||
11 | * under the terms of the GNU General Public License as published by the Free | ||
12 | * Software Foundation; either version 2 of the License, or (at your option) | ||
13 | * any later version. | ||
14 | */ | ||
15 | /* | ||
16 | --------------------------------------------------------------------------- | ||
17 | Copyright (c) 2003, Dr Brian Gladman, Worcester, UK. All rights reserved. | ||
18 | |||
19 | LICENSE TERMS | ||
20 | |||
21 | The free distribution and use of this software in both source and binary | ||
22 | form is allowed (with or without changes) provided that: | ||
23 | |||
24 | 1. distributions of this source code include the above copyright | ||
25 | notice, this list of conditions and the following disclaimer; | ||
26 | |||
27 | 2. distributions in binary form include the above copyright | ||
28 | notice, this list of conditions and the following disclaimer | ||
29 | in the documentation and/or other associated materials; | ||
30 | |||
31 | 3. the copyright holder's name is not used to endorse products | ||
32 | built using this software without specific written permission. | ||
33 | |||
34 | ALTERNATIVELY, provided that this notice is retained in full, this product | ||
35 | may be distributed under the terms of the GNU General Public License (GPL), | ||
36 | in which case the provisions of the GPL apply INSTEAD OF those given above. | ||
37 | |||
38 | DISCLAIMER | ||
39 | |||
40 | This software is provided 'as is' with no explicit or implied warranties | ||
41 | in respect of its properties, including, but not limited to, correctness | ||
42 | and/or fitness for purpose. | ||
43 | --------------------------------------------------------------------------- | ||
44 | Issue Date: 13/06/2006 | ||
45 | */ | ||
46 | |||
47 | #ifndef _CRYPTO_B128OPS_H | ||
48 | #define _CRYPTO_B128OPS_H | ||
49 | |||
50 | #include <linux/types.h> | ||
51 | |||
52 | typedef struct { | ||
53 | u64 a, b; | ||
54 | } u128; | ||
55 | |||
56 | typedef struct { | ||
57 | __be64 a, b; | ||
58 | } be128; | ||
59 | |||
60 | typedef struct { | ||
61 | __le64 b, a; | ||
62 | } le128; | ||
63 | |||
64 | static inline void u128_xor(u128 *r, const u128 *p, const u128 *q) | ||
65 | { | ||
66 | r->a = p->a ^ q->a; | ||
67 | r->b = p->b ^ q->b; | ||
68 | } | ||
69 | |||
70 | static inline void be128_xor(be128 *r, const be128 *p, const be128 *q) | ||
71 | { | ||
72 | u128_xor((u128 *)r, (u128 *)p, (u128 *)q); | ||
73 | } | ||
74 | |||
75 | static inline void le128_xor(le128 *r, const le128 *p, const le128 *q) | ||
76 | { | ||
77 | u128_xor((u128 *)r, (u128 *)p, (u128 *)q); | ||
78 | } | ||
79 | |||
80 | #endif /* _CRYPTO_B128OPS_H */ | ||
diff --git a/include/crypto/gf128mul.h b/include/crypto/gf128mul.h new file mode 100644 index 000000000000..4fd315202442 --- /dev/null +++ b/include/crypto/gf128mul.h | |||
@@ -0,0 +1,198 @@ | |||
1 | /* gf128mul.h - GF(2^128) multiplication functions | ||
2 | * | ||
3 | * Copyright (c) 2003, Dr Brian Gladman, Worcester, UK. | ||
4 | * Copyright (c) 2006 Rik Snel <rsnel@cube.dyndns.org> | ||
5 | * | ||
6 | * Based on Dr Brian Gladman's (GPL'd) work published at | ||
7 | * http://fp.gladman.plus.com/cryptography_technology/index.htm | ||
8 | * See the original copyright notice below. | ||
9 | * | ||
10 | * This program is free software; you can redistribute it and/or modify it | ||
11 | * under the terms of the GNU General Public License as published by the Free | ||
12 | * Software Foundation; either version 2 of the License, or (at your option) | ||
13 | * any later version. | ||
14 | */ | ||
15 | /* | ||
16 | --------------------------------------------------------------------------- | ||
17 | Copyright (c) 2003, Dr Brian Gladman, Worcester, UK. All rights reserved. | ||
18 | |||
19 | LICENSE TERMS | ||
20 | |||
21 | The free distribution and use of this software in both source and binary | ||
22 | form is allowed (with or without changes) provided that: | ||
23 | |||
24 | 1. distributions of this source code include the above copyright | ||
25 | notice, this list of conditions and the following disclaimer; | ||
26 | |||
27 | 2. distributions in binary form include the above copyright | ||
28 | notice, this list of conditions and the following disclaimer | ||
29 | in the documentation and/or other associated materials; | ||
30 | |||
31 | 3. the copyright holder's name is not used to endorse products | ||
32 | built using this software without specific written permission. | ||
33 | |||
34 | ALTERNATIVELY, provided that this notice is retained in full, this product | ||
35 | may be distributed under the terms of the GNU General Public License (GPL), | ||
36 | in which case the provisions of the GPL apply INSTEAD OF those given above. | ||
37 | |||
38 | DISCLAIMER | ||
39 | |||
40 | This software is provided 'as is' with no explicit or implied warranties | ||
41 | in respect of its properties, including, but not limited to, correctness | ||
42 | and/or fitness for purpose. | ||
43 | --------------------------------------------------------------------------- | ||
44 | Issue Date: 31/01/2006 | ||
45 | |||
46 | An implementation of field multiplication in Galois Field GF(128) | ||
47 | */ | ||
48 | |||
49 | #ifndef _CRYPTO_GF128MUL_H | ||
50 | #define _CRYPTO_GF128MUL_H | ||
51 | |||
52 | #include <crypto/b128ops.h> | ||
53 | #include <linux/slab.h> | ||
54 | |||
55 | /* Comment by Rik: | ||
56 | * | ||
57 | * For some background on GF(2^128) see for example: http://- | ||
58 | * csrc.nist.gov/CryptoToolkit/modes/proposedmodes/gcm/gcm-revised-spec.pdf | ||
59 | * | ||
60 | * The elements of GF(2^128) := GF(2)[X]/(X^128-X^7-X^2-X^1-1) can | ||
61 | * be mapped to computer memory in a variety of ways. Let's examine | ||
62 | * three common cases. | ||
63 | * | ||
64 | * Take a look at the 16 binary octets below in memory order. The msb's | ||
65 | * are left and the lsb's are right. char b[16] is an array and b[0] is | ||
66 | * the first octet. | ||
67 | * | ||
68 | * 80000000 00000000 00000000 00000000 .... 00000000 00000000 00000000 | ||
69 | * b[0] b[1] b[2] b[3] b[13] b[14] b[15] | ||
70 | * | ||
71 | * Every bit is a coefficient of some power of X. We can store the bits | ||
72 | * in every byte in little-endian order and the bytes themselves also in | ||
73 | * little endian order. I will call this lle (little-little-endian). | ||
74 | * The above buffer represents the polynomial 1, and X^7+X^2+X^1+1 looks | ||
75 | * like 11100001 00000000 .... 00000000 = { 0xE1, 0x00, }. | ||
76 | * This format was originally implemented in gf128mul and is used | ||
77 | * in GCM (Galois/Counter mode) and in ABL (Arbitrary Block Length). | ||
78 | * | ||
79 | * Another convention says: store the bits in bigendian order and the | ||
80 | * bytes also. This is bbe (big-big-endian). Now the buffer above | ||
81 | * represents X^127. X^7+X^2+X^1+1 looks like 00000000 .... 10000111, | ||
82 | * b[15] = 0x87 and the rest is 0. LRW uses this convention and bbe | ||
83 | * is partly implemented. | ||
84 | * | ||
85 | * Both of the above formats are easy to implement on big-endian | ||
86 | * machines. | ||
87 | * | ||
88 | * EME (which is patent encumbered) uses the ble format (bits are stored | ||
89 | * in big endian order and the bytes in little endian). The above buffer | ||
90 | * represents X^7 in this case and the primitive polynomial is b[0] = 0x87. | ||
91 | * | ||
92 | * The common machine word-size is smaller than 128 bits, so to make | ||
93 | * an efficient implementation we must split into machine word sizes. | ||
94 | * This file uses one 32bit for the moment. Machine endianness comes into | ||
95 | * play. The lle format in relation to machine endianness is discussed | ||
96 | * below by the original author of gf128mul Dr Brian Gladman. | ||
97 | * | ||
98 | * Let's look at the bbe and ble format on a little endian machine. | ||
99 | * | ||
100 | * bbe on a little endian machine u32 x[4]: | ||
101 | * | ||
102 | * MS x[0] LS MS x[1] LS | ||
103 | * ms ls ms ls ms ls ms ls ms ls ms ls ms ls ms ls | ||
104 | * 103..96 111.104 119.112 127.120 71...64 79...72 87...80 95...88 | ||
105 | * | ||
106 | * MS x[2] LS MS x[3] LS | ||
107 | * ms ls ms ls ms ls ms ls ms ls ms ls ms ls ms ls | ||
108 | * 39...32 47...40 55...48 63...56 07...00 15...08 23...16 31...24 | ||
109 | * | ||
110 | * ble on a little endian machine | ||
111 | * | ||
112 | * MS x[0] LS MS x[1] LS | ||
113 | * ms ls ms ls ms ls ms ls ms ls ms ls ms ls ms ls | ||
114 | * 31...24 23...16 15...08 07...00 63...56 55...48 47...40 39...32 | ||
115 | * | ||
116 | * MS x[2] LS MS x[3] LS | ||
117 | * ms ls ms ls ms ls ms ls ms ls ms ls ms ls ms ls | ||
118 | * 95...88 87...80 79...72 71...64 127.120 199.112 111.104 103..96 | ||
119 | * | ||
120 | * Multiplications in GF(2^128) are mostly bit-shifts, so you see why | ||
121 | * ble (and lbe also) are easier to implement on a little-endian | ||
122 | * machine than on a big-endian machine. The converse holds for bbe | ||
123 | * and lle. | ||
124 | * | ||
125 | * Note: to have good alignment, it seems to me that it is sufficient | ||
126 | * to keep elements of GF(2^128) in type u64[2]. On 32-bit wordsize | ||
127 | * machines this will automatically aligned to wordsize and on a 64-bit | ||
128 | * machine also. | ||
129 | */ | ||
130 | /* Multiply a GF128 field element by x. Field elements are held in arrays | ||
131 | of bytes in which field bits 8n..8n + 7 are held in byte[n], with lower | ||
132 | indexed bits placed in the more numerically significant bit positions | ||
133 | within bytes. | ||
134 | |||
135 | On little endian machines the bit indexes translate into the bit | ||
136 | positions within four 32-bit words in the following way | ||
137 | |||
138 | MS x[0] LS MS x[1] LS | ||
139 | ms ls ms ls ms ls ms ls ms ls ms ls ms ls ms ls | ||
140 | 24...31 16...23 08...15 00...07 56...63 48...55 40...47 32...39 | ||
141 | |||
142 | MS x[2] LS MS x[3] LS | ||
143 | ms ls ms ls ms ls ms ls ms ls ms ls ms ls ms ls | ||
144 | 88...95 80...87 72...79 64...71 120.127 112.119 104.111 96..103 | ||
145 | |||
146 | On big endian machines the bit indexes translate into the bit | ||
147 | positions within four 32-bit words in the following way | ||
148 | |||
149 | MS x[0] LS MS x[1] LS | ||
150 | ms ls ms ls ms ls ms ls ms ls ms ls ms ls ms ls | ||
151 | 00...07 08...15 16...23 24...31 32...39 40...47 48...55 56...63 | ||
152 | |||
153 | MS x[2] LS MS x[3] LS | ||
154 | ms ls ms ls ms ls ms ls ms ls ms ls ms ls ms ls | ||
155 | 64...71 72...79 80...87 88...95 96..103 104.111 112.119 120.127 | ||
156 | */ | ||
157 | |||
158 | /* A slow generic version of gf_mul, implemented for lle and bbe | ||
159 | * It multiplies a and b and puts the result in a */ | ||
160 | void gf128mul_lle(be128 *a, const be128 *b); | ||
161 | |||
162 | void gf128mul_bbe(be128 *a, const be128 *b); | ||
163 | |||
164 | |||
165 | /* 4k table optimization */ | ||
166 | |||
167 | struct gf128mul_4k { | ||
168 | be128 t[256]; | ||
169 | }; | ||
170 | |||
171 | struct gf128mul_4k *gf128mul_init_4k_lle(const be128 *g); | ||
172 | struct gf128mul_4k *gf128mul_init_4k_bbe(const be128 *g); | ||
173 | void gf128mul_4k_lle(be128 *a, struct gf128mul_4k *t); | ||
174 | void gf128mul_4k_bbe(be128 *a, struct gf128mul_4k *t); | ||
175 | |||
176 | static inline void gf128mul_free_4k(struct gf128mul_4k *t) | ||
177 | { | ||
178 | kfree(t); | ||
179 | } | ||
180 | |||
181 | |||
182 | /* 64k table optimization, implemented for lle and bbe */ | ||
183 | |||
184 | struct gf128mul_64k { | ||
185 | struct gf128mul_4k *t[16]; | ||
186 | }; | ||
187 | |||
188 | /* first initialize with the constant factor with which you | ||
189 | * want to multiply and then call gf128_64k_lle with the other | ||
190 | * factor in the first argument, the table in the second and a | ||
191 | * scratch register in the third. Afterwards *a = *r. */ | ||
192 | struct gf128mul_64k *gf128mul_init_64k_lle(const be128 *g); | ||
193 | struct gf128mul_64k *gf128mul_init_64k_bbe(const be128 *g); | ||
194 | void gf128mul_free_64k(struct gf128mul_64k *t); | ||
195 | void gf128mul_64k_lle(be128 *a, struct gf128mul_64k *t); | ||
196 | void gf128mul_64k_bbe(be128 *a, struct gf128mul_64k *t); | ||
197 | |||
198 | #endif /* _CRYPTO_GF128MUL_H */ | ||
diff --git a/include/linux/audit.h b/include/linux/audit.h index b2ca666d9997..0e07db6cc0d0 100644 --- a/include/linux/audit.h +++ b/include/linux/audit.h | |||
@@ -101,6 +101,10 @@ | |||
101 | #define AUDIT_MAC_CIPSOV4_DEL 1408 /* NetLabel: del CIPSOv4 DOI entry */ | 101 | #define AUDIT_MAC_CIPSOV4_DEL 1408 /* NetLabel: del CIPSOv4 DOI entry */ |
102 | #define AUDIT_MAC_MAP_ADD 1409 /* NetLabel: add LSM domain mapping */ | 102 | #define AUDIT_MAC_MAP_ADD 1409 /* NetLabel: add LSM domain mapping */ |
103 | #define AUDIT_MAC_MAP_DEL 1410 /* NetLabel: del LSM domain mapping */ | 103 | #define AUDIT_MAC_MAP_DEL 1410 /* NetLabel: del LSM domain mapping */ |
104 | #define AUDIT_MAC_IPSEC_ADDSA 1411 /* Add a XFRM state */ | ||
105 | #define AUDIT_MAC_IPSEC_DELSA 1412 /* Delete a XFRM state */ | ||
106 | #define AUDIT_MAC_IPSEC_ADDSPD 1413 /* Add a XFRM policy */ | ||
107 | #define AUDIT_MAC_IPSEC_DELSPD 1414 /* Delete a XFRM policy */ | ||
104 | 108 | ||
105 | #define AUDIT_FIRST_KERN_ANOM_MSG 1700 | 109 | #define AUDIT_FIRST_KERN_ANOM_MSG 1700 |
106 | #define AUDIT_LAST_KERN_ANOM_MSG 1799 | 110 | #define AUDIT_LAST_KERN_ANOM_MSG 1799 |
@@ -377,6 +381,7 @@ extern void auditsc_get_stamp(struct audit_context *ctx, | |||
377 | struct timespec *t, unsigned int *serial); | 381 | struct timespec *t, unsigned int *serial); |
378 | extern int audit_set_loginuid(struct task_struct *task, uid_t loginuid); | 382 | extern int audit_set_loginuid(struct task_struct *task, uid_t loginuid); |
379 | extern uid_t audit_get_loginuid(struct audit_context *ctx); | 383 | extern uid_t audit_get_loginuid(struct audit_context *ctx); |
384 | extern void audit_log_task_context(struct audit_buffer *ab); | ||
380 | extern int __audit_ipc_obj(struct kern_ipc_perm *ipcp); | 385 | extern int __audit_ipc_obj(struct kern_ipc_perm *ipcp); |
381 | extern int __audit_ipc_set_perm(unsigned long qbytes, uid_t uid, gid_t gid, mode_t mode); | 386 | extern int __audit_ipc_set_perm(unsigned long qbytes, uid_t uid, gid_t gid, mode_t mode); |
382 | extern int audit_bprm(struct linux_binprm *bprm); | 387 | extern int audit_bprm(struct linux_binprm *bprm); |
@@ -449,6 +454,7 @@ extern int audit_n_rules; | |||
449 | #define audit_inode_update(i) do { ; } while (0) | 454 | #define audit_inode_update(i) do { ; } while (0) |
450 | #define auditsc_get_stamp(c,t,s) do { BUG(); } while (0) | 455 | #define auditsc_get_stamp(c,t,s) do { BUG(); } while (0) |
451 | #define audit_get_loginuid(c) ({ -1; }) | 456 | #define audit_get_loginuid(c) ({ -1; }) |
457 | #define audit_log_task_context(b) do { ; } while (0) | ||
452 | #define audit_ipc_obj(i) ({ 0; }) | 458 | #define audit_ipc_obj(i) ({ 0; }) |
453 | #define audit_ipc_set_perm(q,u,g,m) ({ 0; }) | 459 | #define audit_ipc_set_perm(q,u,g,m) ({ 0; }) |
454 | #define audit_bprm(p) ({ 0; }) | 460 | #define audit_bprm(p) ({ 0; }) |
diff --git a/include/linux/crypto.h b/include/linux/crypto.h index 6485e9716b36..4aa9046601da 100644 --- a/include/linux/crypto.h +++ b/include/linux/crypto.h | |||
@@ -241,12 +241,8 @@ int crypto_unregister_alg(struct crypto_alg *alg); | |||
241 | * Algorithm query interface. | 241 | * Algorithm query interface. |
242 | */ | 242 | */ |
243 | #ifdef CONFIG_CRYPTO | 243 | #ifdef CONFIG_CRYPTO |
244 | int crypto_alg_available(const char *name, u32 flags) | ||
245 | __deprecated_for_modules; | ||
246 | int crypto_has_alg(const char *name, u32 type, u32 mask); | 244 | int crypto_has_alg(const char *name, u32 type, u32 mask); |
247 | #else | 245 | #else |
248 | static int crypto_alg_available(const char *name, u32 flags) | ||
249 | __deprecated_for_modules; | ||
250 | static inline int crypto_alg_available(const char *name, u32 flags) | 246 | static inline int crypto_alg_available(const char *name, u32 flags) |
251 | { | 247 | { |
252 | return 0; | 248 | return 0; |
@@ -707,16 +703,6 @@ static inline void crypto_cipher_decrypt_one(struct crypto_cipher *tfm, | |||
707 | dst, src); | 703 | dst, src); |
708 | } | 704 | } |
709 | 705 | ||
710 | void crypto_digest_init(struct crypto_tfm *tfm) __deprecated_for_modules; | ||
711 | void crypto_digest_update(struct crypto_tfm *tfm, | ||
712 | struct scatterlist *sg, unsigned int nsg) | ||
713 | __deprecated_for_modules; | ||
714 | void crypto_digest_final(struct crypto_tfm *tfm, u8 *out) | ||
715 | __deprecated_for_modules; | ||
716 | void crypto_digest_digest(struct crypto_tfm *tfm, | ||
717 | struct scatterlist *sg, unsigned int nsg, u8 *out) | ||
718 | __deprecated_for_modules; | ||
719 | |||
720 | static inline struct crypto_hash *__crypto_hash_cast(struct crypto_tfm *tfm) | 706 | static inline struct crypto_hash *__crypto_hash_cast(struct crypto_tfm *tfm) |
721 | { | 707 | { |
722 | return (struct crypto_hash *)tfm; | 708 | return (struct crypto_hash *)tfm; |
@@ -729,14 +715,6 @@ static inline struct crypto_hash *crypto_hash_cast(struct crypto_tfm *tfm) | |||
729 | return __crypto_hash_cast(tfm); | 715 | return __crypto_hash_cast(tfm); |
730 | } | 716 | } |
731 | 717 | ||
732 | static int crypto_digest_setkey(struct crypto_tfm *tfm, const u8 *key, | ||
733 | unsigned int keylen) __deprecated; | ||
734 | static inline int crypto_digest_setkey(struct crypto_tfm *tfm, | ||
735 | const u8 *key, unsigned int keylen) | ||
736 | { | ||
737 | return tfm->crt_hash.setkey(crypto_hash_cast(tfm), key, keylen); | ||
738 | } | ||
739 | |||
740 | static inline struct crypto_hash *crypto_alloc_hash(const char *alg_name, | 718 | static inline struct crypto_hash *crypto_alloc_hash(const char *alg_name, |
741 | u32 type, u32 mask) | 719 | u32 type, u32 mask) |
742 | { | 720 | { |
diff --git a/include/linux/genetlink.h b/include/linux/genetlink.h index 9049dc65ae51..f7a93770e1be 100644 --- a/include/linux/genetlink.h +++ b/include/linux/genetlink.h | |||
@@ -17,6 +17,9 @@ struct genlmsghdr { | |||
17 | #define GENL_HDRLEN NLMSG_ALIGN(sizeof(struct genlmsghdr)) | 17 | #define GENL_HDRLEN NLMSG_ALIGN(sizeof(struct genlmsghdr)) |
18 | 18 | ||
19 | #define GENL_ADMIN_PERM 0x01 | 19 | #define GENL_ADMIN_PERM 0x01 |
20 | #define GENL_CMD_CAP_DO 0x02 | ||
21 | #define GENL_CMD_CAP_DUMP 0x04 | ||
22 | #define GENL_CMD_CAP_HASPOL 0x08 | ||
20 | 23 | ||
21 | /* | 24 | /* |
22 | * List of reserved static generic netlink identifiers: | 25 | * List of reserved static generic netlink identifiers: |
@@ -58,9 +61,6 @@ enum { | |||
58 | CTRL_ATTR_OP_UNSPEC, | 61 | CTRL_ATTR_OP_UNSPEC, |
59 | CTRL_ATTR_OP_ID, | 62 | CTRL_ATTR_OP_ID, |
60 | CTRL_ATTR_OP_FLAGS, | 63 | CTRL_ATTR_OP_FLAGS, |
61 | CTRL_ATTR_OP_POLICY, | ||
62 | CTRL_ATTR_OP_DOIT, | ||
63 | CTRL_ATTR_OP_DUMPIT, | ||
64 | __CTRL_ATTR_OP_MAX, | 64 | __CTRL_ATTR_OP_MAX, |
65 | }; | 65 | }; |
66 | 66 | ||
diff --git a/include/linux/netfilter/nf_conntrack_pptp.h b/include/linux/netfilter/nf_conntrack_pptp.h index fb049ec11ff2..9d8144a488cd 100644 --- a/include/linux/netfilter/nf_conntrack_pptp.h +++ b/include/linux/netfilter/nf_conntrack_pptp.h | |||
@@ -2,6 +2,8 @@ | |||
2 | #ifndef _NF_CONNTRACK_PPTP_H | 2 | #ifndef _NF_CONNTRACK_PPTP_H |
3 | #define _NF_CONNTRACK_PPTP_H | 3 | #define _NF_CONNTRACK_PPTP_H |
4 | 4 | ||
5 | #include <linux/netfilter/nf_conntrack_common.h> | ||
6 | |||
5 | /* state of the control session */ | 7 | /* state of the control session */ |
6 | enum pptp_ctrlsess_state { | 8 | enum pptp_ctrlsess_state { |
7 | PPTP_SESSION_NONE, /* no session present */ | 9 | PPTP_SESSION_NONE, /* no session present */ |
@@ -295,7 +297,6 @@ union pptp_ctrl_union { | |||
295 | /* crap needed for nf_conntrack_compat.h */ | 297 | /* crap needed for nf_conntrack_compat.h */ |
296 | struct nf_conn; | 298 | struct nf_conn; |
297 | struct nf_conntrack_expect; | 299 | struct nf_conntrack_expect; |
298 | enum ip_conntrack_info; | ||
299 | 300 | ||
300 | extern int | 301 | extern int |
301 | (*nf_nat_pptp_hook_outbound)(struct sk_buff **pskb, | 302 | (*nf_nat_pptp_hook_outbound)(struct sk_buff **pskb, |
diff --git a/include/linux/pci_ids.h b/include/linux/pci_ids.h index ff2dcb436cd0..4d972bbef316 100644 --- a/include/linux/pci_ids.h +++ b/include/linux/pci_ids.h | |||
@@ -1931,6 +1931,7 @@ | |||
1931 | #define PCI_DEVICE_ID_TIGON3_5750M 0x167c | 1931 | #define PCI_DEVICE_ID_TIGON3_5750M 0x167c |
1932 | #define PCI_DEVICE_ID_TIGON3_5751M 0x167d | 1932 | #define PCI_DEVICE_ID_TIGON3_5751M 0x167d |
1933 | #define PCI_DEVICE_ID_TIGON3_5751F 0x167e | 1933 | #define PCI_DEVICE_ID_TIGON3_5751F 0x167e |
1934 | #define PCI_DEVICE_ID_TIGON3_5787F 0x167f | ||
1934 | #define PCI_DEVICE_ID_TIGON3_5787M 0x1693 | 1935 | #define PCI_DEVICE_ID_TIGON3_5787M 0x1693 |
1935 | #define PCI_DEVICE_ID_TIGON3_5782 0x1696 | 1936 | #define PCI_DEVICE_ID_TIGON3_5782 0x1696 |
1936 | #define PCI_DEVICE_ID_TIGON3_5786 0x169a | 1937 | #define PCI_DEVICE_ID_TIGON3_5786 0x169a |
@@ -2002,6 +2003,8 @@ | |||
2002 | #define PCI_DEVICE_ID_FARSITE_TE1 0x1610 | 2003 | #define PCI_DEVICE_ID_FARSITE_TE1 0x1610 |
2003 | #define PCI_DEVICE_ID_FARSITE_TE1C 0x1612 | 2004 | #define PCI_DEVICE_ID_FARSITE_TE1C 0x1612 |
2004 | 2005 | ||
2006 | #define PCI_VENDOR_ID_ARIMA 0x161f | ||
2007 | |||
2005 | #define PCI_VENDOR_ID_SIBYTE 0x166d | 2008 | #define PCI_VENDOR_ID_SIBYTE 0x166d |
2006 | #define PCI_DEVICE_ID_BCM1250_PCI 0x0001 | 2009 | #define PCI_DEVICE_ID_BCM1250_PCI 0x0001 |
2007 | #define PCI_DEVICE_ID_BCM1250_HT 0x0002 | 2010 | #define PCI_DEVICE_ID_BCM1250_HT 0x0002 |
diff --git a/include/linux/pfkeyv2.h b/include/linux/pfkeyv2.h index 0f0b880c4280..265bafab6494 100644 --- a/include/linux/pfkeyv2.h +++ b/include/linux/pfkeyv2.h | |||
@@ -285,6 +285,7 @@ struct sadb_x_sec_ctx { | |||
285 | #define SADB_X_AALG_SHA2_384HMAC 6 | 285 | #define SADB_X_AALG_SHA2_384HMAC 6 |
286 | #define SADB_X_AALG_SHA2_512HMAC 7 | 286 | #define SADB_X_AALG_SHA2_512HMAC 7 |
287 | #define SADB_X_AALG_RIPEMD160HMAC 8 | 287 | #define SADB_X_AALG_RIPEMD160HMAC 8 |
288 | #define SADB_X_AALG_AES_XCBC_MAC 9 | ||
288 | #define SADB_X_AALG_NULL 251 /* kame */ | 289 | #define SADB_X_AALG_NULL 251 /* kame */ |
289 | #define SADB_AALG_MAX 251 | 290 | #define SADB_AALG_MAX 251 |
290 | 291 | ||
diff --git a/include/net/irda/irlan_filter.h b/include/net/irda/irlan_filter.h index 492dedaa8ac1..1720539ac2c1 100644 --- a/include/net/irda/irlan_filter.h +++ b/include/net/irda/irlan_filter.h | |||
@@ -28,6 +28,8 @@ | |||
28 | void irlan_check_command_param(struct irlan_cb *self, char *param, | 28 | void irlan_check_command_param(struct irlan_cb *self, char *param, |
29 | char *value); | 29 | char *value); |
30 | void irlan_filter_request(struct irlan_cb *self, struct sk_buff *skb); | 30 | void irlan_filter_request(struct irlan_cb *self, struct sk_buff *skb); |
31 | #ifdef CONFIG_PROC_FS | ||
31 | void irlan_print_filter(struct seq_file *seq, int filter_type); | 32 | void irlan_print_filter(struct seq_file *seq, int filter_type); |
33 | #endif | ||
32 | 34 | ||
33 | #endif /* IRLAN_FILTER_H */ | 35 | #endif /* IRLAN_FILTER_H */ |
diff --git a/include/net/xfrm.h b/include/net/xfrm.h index 15ec19dcf9c8..e4765413cf80 100644 --- a/include/net/xfrm.h +++ b/include/net/xfrm.h | |||
@@ -392,6 +392,20 @@ extern int xfrm_unregister_km(struct xfrm_mgr *km); | |||
392 | 392 | ||
393 | extern unsigned int xfrm_policy_count[XFRM_POLICY_MAX*2]; | 393 | extern unsigned int xfrm_policy_count[XFRM_POLICY_MAX*2]; |
394 | 394 | ||
395 | /* Audit Information */ | ||
396 | struct xfrm_audit | ||
397 | { | ||
398 | uid_t loginuid; | ||
399 | u32 secid; | ||
400 | }; | ||
401 | |||
402 | #ifdef CONFIG_AUDITSYSCALL | ||
403 | extern void xfrm_audit_log(uid_t auid, u32 secid, int type, int result, | ||
404 | struct xfrm_policy *xp, struct xfrm_state *x); | ||
405 | #else | ||
406 | #define xfrm_audit_log(a,s,t,r,p,x) do { ; } while (0) | ||
407 | #endif /* CONFIG_AUDITSYSCALL */ | ||
408 | |||
395 | static inline void xfrm_pol_hold(struct xfrm_policy *policy) | 409 | static inline void xfrm_pol_hold(struct xfrm_policy *policy) |
396 | { | 410 | { |
397 | if (likely(policy != NULL)) | 411 | if (likely(policy != NULL)) |
@@ -906,7 +920,7 @@ static inline int xfrm_state_sort(struct xfrm_state **dst, struct xfrm_state **s | |||
906 | #endif | 920 | #endif |
907 | extern struct xfrm_state *xfrm_find_acq_byseq(u32 seq); | 921 | extern struct xfrm_state *xfrm_find_acq_byseq(u32 seq); |
908 | extern int xfrm_state_delete(struct xfrm_state *x); | 922 | extern int xfrm_state_delete(struct xfrm_state *x); |
909 | extern void xfrm_state_flush(u8 proto); | 923 | extern void xfrm_state_flush(u8 proto, struct xfrm_audit *audit_info); |
910 | extern int xfrm_replay_check(struct xfrm_state *x, __be32 seq); | 924 | extern int xfrm_replay_check(struct xfrm_state *x, __be32 seq); |
911 | extern void xfrm_replay_advance(struct xfrm_state *x, __be32 seq); | 925 | extern void xfrm_replay_advance(struct xfrm_state *x, __be32 seq); |
912 | extern void xfrm_replay_notify(struct xfrm_state *x, int event); | 926 | extern void xfrm_replay_notify(struct xfrm_state *x, int event); |
@@ -959,13 +973,13 @@ struct xfrm_policy *xfrm_policy_bysel_ctx(u8 type, int dir, | |||
959 | struct xfrm_selector *sel, | 973 | struct xfrm_selector *sel, |
960 | struct xfrm_sec_ctx *ctx, int delete); | 974 | struct xfrm_sec_ctx *ctx, int delete); |
961 | struct xfrm_policy *xfrm_policy_byid(u8, int dir, u32 id, int delete); | 975 | struct xfrm_policy *xfrm_policy_byid(u8, int dir, u32 id, int delete); |
962 | void xfrm_policy_flush(u8 type); | 976 | void xfrm_policy_flush(u8 type, struct xfrm_audit *audit_info); |
963 | u32 xfrm_get_acqseq(void); | 977 | u32 xfrm_get_acqseq(void); |
964 | void xfrm_alloc_spi(struct xfrm_state *x, __be32 minspi, __be32 maxspi); | 978 | void xfrm_alloc_spi(struct xfrm_state *x, __be32 minspi, __be32 maxspi); |
965 | struct xfrm_state * xfrm_find_acq(u8 mode, u32 reqid, u8 proto, | 979 | struct xfrm_state * xfrm_find_acq(u8 mode, u32 reqid, u8 proto, |
966 | xfrm_address_t *daddr, xfrm_address_t *saddr, | 980 | xfrm_address_t *daddr, xfrm_address_t *saddr, |
967 | int create, unsigned short family); | 981 | int create, unsigned short family); |
968 | extern void xfrm_policy_flush(u8 type); | 982 | extern void xfrm_policy_flush(u8 type, struct xfrm_audit *audit_info); |
969 | extern int xfrm_sk_policy_insert(struct sock *sk, int dir, struct xfrm_policy *pol); | 983 | extern int xfrm_sk_policy_insert(struct sock *sk, int dir, struct xfrm_policy *pol); |
970 | extern int xfrm_bundle_ok(struct xfrm_policy *pol, struct xfrm_dst *xdst, | 984 | extern int xfrm_bundle_ok(struct xfrm_policy *pol, struct xfrm_dst *xdst, |
971 | struct flowi *fl, int family, int strict); | 985 | struct flowi *fl, int family, int strict); |
diff --git a/kernel/auditsc.c b/kernel/auditsc.c index ab97e5101232..40722e26de98 100644 --- a/kernel/auditsc.c +++ b/kernel/auditsc.c | |||
@@ -731,7 +731,7 @@ static inline void audit_free_context(struct audit_context *context) | |||
731 | printk(KERN_ERR "audit: freed %d contexts\n", count); | 731 | printk(KERN_ERR "audit: freed %d contexts\n", count); |
732 | } | 732 | } |
733 | 733 | ||
734 | static void audit_log_task_context(struct audit_buffer *ab) | 734 | void audit_log_task_context(struct audit_buffer *ab) |
735 | { | 735 | { |
736 | char *ctx = NULL; | 736 | char *ctx = NULL; |
737 | ssize_t len = 0; | 737 | ssize_t len = 0; |
@@ -760,6 +760,8 @@ error_path: | |||
760 | return; | 760 | return; |
761 | } | 761 | } |
762 | 762 | ||
763 | EXPORT_SYMBOL(audit_log_task_context); | ||
764 | |||
763 | static void audit_log_task_info(struct audit_buffer *ab, struct task_struct *tsk) | 765 | static void audit_log_task_info(struct audit_buffer *ab, struct task_struct *tsk) |
764 | { | 766 | { |
765 | char name[sizeof(tsk->comm)]; | 767 | char name[sizeof(tsk->comm)]; |
@@ -1488,6 +1490,8 @@ uid_t audit_get_loginuid(struct audit_context *ctx) | |||
1488 | return ctx ? ctx->loginuid : -1; | 1490 | return ctx ? ctx->loginuid : -1; |
1489 | } | 1491 | } |
1490 | 1492 | ||
1493 | EXPORT_SYMBOL(audit_get_loginuid); | ||
1494 | |||
1491 | /** | 1495 | /** |
1492 | * __audit_mq_open - record audit data for a POSIX MQ open | 1496 | * __audit_mq_open - record audit data for a POSIX MQ open |
1493 | * @oflag: open flag | 1497 | * @oflag: open flag |
diff --git a/net/bridge/br_netfilter.c b/net/bridge/br_netfilter.c index ac47ba2ba028..bd221ad52eaf 100644 --- a/net/bridge/br_netfilter.c +++ b/net/bridge/br_netfilter.c | |||
@@ -34,6 +34,7 @@ | |||
34 | #include <linux/netfilter_ipv6.h> | 34 | #include <linux/netfilter_ipv6.h> |
35 | #include <linux/netfilter_arp.h> | 35 | #include <linux/netfilter_arp.h> |
36 | #include <linux/in_route.h> | 36 | #include <linux/in_route.h> |
37 | #include <linux/inetdevice.h> | ||
37 | 38 | ||
38 | #include <net/ip.h> | 39 | #include <net/ip.h> |
39 | #include <net/ipv6.h> | 40 | #include <net/ipv6.h> |
@@ -221,10 +222,14 @@ static void __br_dnat_complain(void) | |||
221 | * | 222 | * |
222 | * Otherwise, the packet is considered to be routed and we just | 223 | * Otherwise, the packet is considered to be routed and we just |
223 | * change the destination MAC address so that the packet will | 224 | * change the destination MAC address so that the packet will |
224 | * later be passed up to the IP stack to be routed. | 225 | * later be passed up to the IP stack to be routed. For a redirected |
226 | * packet, ip_route_input() will give back the localhost as output device, | ||
227 | * which differs from the bridge device. | ||
225 | * | 228 | * |
226 | * Let us now consider the case that ip_route_input() fails: | 229 | * Let us now consider the case that ip_route_input() fails: |
227 | * | 230 | * |
231 | * This can be because the destination address is martian, in which case | ||
232 | * the packet will be dropped. | ||
228 | * After a "echo '0' > /proc/sys/net/ipv4/ip_forward" ip_route_input() | 233 | * After a "echo '0' > /proc/sys/net/ipv4/ip_forward" ip_route_input() |
229 | * will fail, while __ip_route_output_key() will return success. The source | 234 | * will fail, while __ip_route_output_key() will return success. The source |
230 | * address for __ip_route_output_key() is set to zero, so __ip_route_output_key | 235 | * address for __ip_route_output_key() is set to zero, so __ip_route_output_key |
@@ -237,7 +242,8 @@ static void __br_dnat_complain(void) | |||
237 | * | 242 | * |
238 | * --Lennert, 20020411 | 243 | * --Lennert, 20020411 |
239 | * --Bart, 20020416 (updated) | 244 | * --Bart, 20020416 (updated) |
240 | * --Bart, 20021007 (updated) */ | 245 | * --Bart, 20021007 (updated) |
246 | * --Bart, 20062711 (updated) */ | ||
241 | static int br_nf_pre_routing_finish_bridge(struct sk_buff *skb) | 247 | static int br_nf_pre_routing_finish_bridge(struct sk_buff *skb) |
242 | { | 248 | { |
243 | if (skb->pkt_type == PACKET_OTHERHOST) { | 249 | if (skb->pkt_type == PACKET_OTHERHOST) { |
@@ -264,15 +270,15 @@ static int br_nf_pre_routing_finish(struct sk_buff *skb) | |||
264 | struct net_device *dev = skb->dev; | 270 | struct net_device *dev = skb->dev; |
265 | struct iphdr *iph = skb->nh.iph; | 271 | struct iphdr *iph = skb->nh.iph; |
266 | struct nf_bridge_info *nf_bridge = skb->nf_bridge; | 272 | struct nf_bridge_info *nf_bridge = skb->nf_bridge; |
273 | int err; | ||
267 | 274 | ||
268 | if (nf_bridge->mask & BRNF_PKT_TYPE) { | 275 | if (nf_bridge->mask & BRNF_PKT_TYPE) { |
269 | skb->pkt_type = PACKET_OTHERHOST; | 276 | skb->pkt_type = PACKET_OTHERHOST; |
270 | nf_bridge->mask ^= BRNF_PKT_TYPE; | 277 | nf_bridge->mask ^= BRNF_PKT_TYPE; |
271 | } | 278 | } |
272 | nf_bridge->mask ^= BRNF_NF_BRIDGE_PREROUTING; | 279 | nf_bridge->mask ^= BRNF_NF_BRIDGE_PREROUTING; |
273 | |||
274 | if (dnat_took_place(skb)) { | 280 | if (dnat_took_place(skb)) { |
275 | if (ip_route_input(skb, iph->daddr, iph->saddr, iph->tos, dev)) { | 281 | if ((err = ip_route_input(skb, iph->daddr, iph->saddr, iph->tos, dev))) { |
276 | struct rtable *rt; | 282 | struct rtable *rt; |
277 | struct flowi fl = { | 283 | struct flowi fl = { |
278 | .nl_u = { | 284 | .nl_u = { |
@@ -283,19 +289,33 @@ static int br_nf_pre_routing_finish(struct sk_buff *skb) | |||
283 | }, | 289 | }, |
284 | .proto = 0, | 290 | .proto = 0, |
285 | }; | 291 | }; |
292 | struct in_device *in_dev = in_dev_get(dev); | ||
293 | |||
294 | /* If err equals -EHOSTUNREACH the error is due to a | ||
295 | * martian destination or due to the fact that | ||
296 | * forwarding is disabled. For most martian packets, | ||
297 | * ip_route_output_key() will fail. It won't fail for 2 types of | ||
298 | * martian destinations: loopback destinations and destination | ||
299 | * 0.0.0.0. In both cases the packet will be dropped because the | ||
300 | * destination is the loopback device and not the bridge. */ | ||
301 | if (err != -EHOSTUNREACH || !in_dev || IN_DEV_FORWARD(in_dev)) | ||
302 | goto free_skb; | ||
286 | 303 | ||
287 | if (!ip_route_output_key(&rt, &fl)) { | 304 | if (!ip_route_output_key(&rt, &fl)) { |
288 | /* - Bridged-and-DNAT'ed traffic doesn't | 305 | /* - Bridged-and-DNAT'ed traffic doesn't |
289 | * require ip_forwarding. | 306 | * require ip_forwarding. */ |
290 | * - Deal with redirected traffic. */ | 307 | if (((struct dst_entry *)rt)->dev == dev) { |
291 | if (((struct dst_entry *)rt)->dev == dev || | ||
292 | rt->rt_type == RTN_LOCAL) { | ||
293 | skb->dst = (struct dst_entry *)rt; | 308 | skb->dst = (struct dst_entry *)rt; |
294 | goto bridged_dnat; | 309 | goto bridged_dnat; |
295 | } | 310 | } |
311 | /* we are sure that forwarding is disabled, so printing | ||
312 | * this message is no problem. Note that the packet could | ||
313 | * still have a martian destination address, in which case | ||
314 | * the packet could be dropped even if forwarding were enabled */ | ||
296 | __br_dnat_complain(); | 315 | __br_dnat_complain(); |
297 | dst_release((struct dst_entry *)rt); | 316 | dst_release((struct dst_entry *)rt); |
298 | } | 317 | } |
318 | free_skb: | ||
299 | kfree_skb(skb); | 319 | kfree_skb(skb); |
300 | return 0; | 320 | return 0; |
301 | } else { | 321 | } else { |
diff --git a/net/core/wireless.c b/net/core/wireless.c index cb1b8728d7ee..f69ab7b4408e 100644 --- a/net/core/wireless.c +++ b/net/core/wireless.c | |||
@@ -2130,7 +2130,7 @@ int iw_handler_set_spy(struct net_device * dev, | |||
2130 | * The rtnl_lock() make sure we don't race with the other iw_handlers. | 2130 | * The rtnl_lock() make sure we don't race with the other iw_handlers. |
2131 | * This make sure wireless_spy_update() "see" that the spy list | 2131 | * This make sure wireless_spy_update() "see" that the spy list |
2132 | * is temporarily disabled. */ | 2132 | * is temporarily disabled. */ |
2133 | wmb(); | 2133 | smp_wmb(); |
2134 | 2134 | ||
2135 | /* Are there are addresses to copy? */ | 2135 | /* Are there are addresses to copy? */ |
2136 | if(wrqu->data.length > 0) { | 2136 | if(wrqu->data.length > 0) { |
@@ -2159,7 +2159,7 @@ int iw_handler_set_spy(struct net_device * dev, | |||
2159 | } | 2159 | } |
2160 | 2160 | ||
2161 | /* Make sure above is updated before re-enabling */ | 2161 | /* Make sure above is updated before re-enabling */ |
2162 | wmb(); | 2162 | smp_wmb(); |
2163 | 2163 | ||
2164 | /* Enable addresses */ | 2164 | /* Enable addresses */ |
2165 | spydata->spy_number = wrqu->data.length; | 2165 | spydata->spy_number = wrqu->data.length; |
diff --git a/net/ipv4/inet_timewait_sock.c b/net/ipv4/inet_timewait_sock.c index e28330aa4139..9f414e35c488 100644 --- a/net/ipv4/inet_timewait_sock.c +++ b/net/ipv4/inet_timewait_sock.c | |||
@@ -178,7 +178,6 @@ void inet_twdr_hangman(unsigned long data) | |||
178 | need_timer = 0; | 178 | need_timer = 0; |
179 | if (inet_twdr_do_twkill_work(twdr, twdr->slot)) { | 179 | if (inet_twdr_do_twkill_work(twdr, twdr->slot)) { |
180 | twdr->thread_slots |= (1 << twdr->slot); | 180 | twdr->thread_slots |= (1 << twdr->slot); |
181 | mb(); | ||
182 | schedule_work(&twdr->twkill_work); | 181 | schedule_work(&twdr->twkill_work); |
183 | need_timer = 1; | 182 | need_timer = 1; |
184 | } else { | 183 | } else { |
diff --git a/net/ipv4/netfilter/arp_tables.c b/net/ipv4/netfilter/arp_tables.c index 413c2d0a1f3d..71b76ade00e1 100644 --- a/net/ipv4/netfilter/arp_tables.c +++ b/net/ipv4/netfilter/arp_tables.c | |||
@@ -375,6 +375,13 @@ static int mark_source_chains(struct xt_table_info *newinfo, | |||
375 | && unconditional(&e->arp)) { | 375 | && unconditional(&e->arp)) { |
376 | unsigned int oldpos, size; | 376 | unsigned int oldpos, size; |
377 | 377 | ||
378 | if (t->verdict < -NF_MAX_VERDICT - 1) { | ||
379 | duprintf("mark_source_chains: bad " | ||
380 | "negative verdict (%i)\n", | ||
381 | t->verdict); | ||
382 | return 0; | ||
383 | } | ||
384 | |||
378 | /* Return: backtrack through the last | 385 | /* Return: backtrack through the last |
379 | * big jump. | 386 | * big jump. |
380 | */ | 387 | */ |
@@ -404,6 +411,14 @@ static int mark_source_chains(struct xt_table_info *newinfo, | |||
404 | if (strcmp(t->target.u.user.name, | 411 | if (strcmp(t->target.u.user.name, |
405 | ARPT_STANDARD_TARGET) == 0 | 412 | ARPT_STANDARD_TARGET) == 0 |
406 | && newpos >= 0) { | 413 | && newpos >= 0) { |
414 | if (newpos > newinfo->size - | ||
415 | sizeof(struct arpt_entry)) { | ||
416 | duprintf("mark_source_chains: " | ||
417 | "bad verdict (%i)\n", | ||
418 | newpos); | ||
419 | return 0; | ||
420 | } | ||
421 | |||
407 | /* This a jump; chase it. */ | 422 | /* This a jump; chase it. */ |
408 | duprintf("Jump rule %u -> %u\n", | 423 | duprintf("Jump rule %u -> %u\n", |
409 | pos, newpos); | 424 | pos, newpos); |
@@ -426,8 +441,6 @@ static int mark_source_chains(struct xt_table_info *newinfo, | |||
426 | static inline int standard_check(const struct arpt_entry_target *t, | 441 | static inline int standard_check(const struct arpt_entry_target *t, |
427 | unsigned int max_offset) | 442 | unsigned int max_offset) |
428 | { | 443 | { |
429 | struct arpt_standard_target *targ = (void *)t; | ||
430 | |||
431 | /* Check standard info. */ | 444 | /* Check standard info. */ |
432 | if (t->u.target_size | 445 | if (t->u.target_size |
433 | != ARPT_ALIGN(sizeof(struct arpt_standard_target))) { | 446 | != ARPT_ALIGN(sizeof(struct arpt_standard_target))) { |
@@ -437,18 +450,6 @@ static inline int standard_check(const struct arpt_entry_target *t, | |||
437 | return 0; | 450 | return 0; |
438 | } | 451 | } |
439 | 452 | ||
440 | if (targ->verdict >= 0 | ||
441 | && targ->verdict > max_offset - sizeof(struct arpt_entry)) { | ||
442 | duprintf("arpt_standard_check: bad verdict (%i)\n", | ||
443 | targ->verdict); | ||
444 | return 0; | ||
445 | } | ||
446 | |||
447 | if (targ->verdict < -NF_MAX_VERDICT - 1) { | ||
448 | duprintf("arpt_standard_check: bad negative verdict (%i)\n", | ||
449 | targ->verdict); | ||
450 | return 0; | ||
451 | } | ||
452 | return 1; | 453 | return 1; |
453 | } | 454 | } |
454 | 455 | ||
@@ -627,18 +628,20 @@ static int translate_table(const char *name, | |||
627 | } | 628 | } |
628 | } | 629 | } |
629 | 630 | ||
631 | if (!mark_source_chains(newinfo, valid_hooks, entry0)) { | ||
632 | duprintf("Looping hook\n"); | ||
633 | return -ELOOP; | ||
634 | } | ||
635 | |||
630 | /* Finally, each sanity check must pass */ | 636 | /* Finally, each sanity check must pass */ |
631 | i = 0; | 637 | i = 0; |
632 | ret = ARPT_ENTRY_ITERATE(entry0, newinfo->size, | 638 | ret = ARPT_ENTRY_ITERATE(entry0, newinfo->size, |
633 | check_entry, name, size, &i); | 639 | check_entry, name, size, &i); |
634 | 640 | ||
635 | if (ret != 0) | 641 | if (ret != 0) { |
636 | goto cleanup; | 642 | ARPT_ENTRY_ITERATE(entry0, newinfo->size, |
637 | 643 | cleanup_entry, &i); | |
638 | ret = -ELOOP; | 644 | return ret; |
639 | if (!mark_source_chains(newinfo, valid_hooks, entry0)) { | ||
640 | duprintf("Looping hook\n"); | ||
641 | goto cleanup; | ||
642 | } | 645 | } |
643 | 646 | ||
644 | /* And one copy for every other CPU */ | 647 | /* And one copy for every other CPU */ |
@@ -647,9 +650,6 @@ static int translate_table(const char *name, | |||
647 | memcpy(newinfo->entries[i], entry0, newinfo->size); | 650 | memcpy(newinfo->entries[i], entry0, newinfo->size); |
648 | } | 651 | } |
649 | 652 | ||
650 | return 0; | ||
651 | cleanup: | ||
652 | ARPT_ENTRY_ITERATE(entry0, newinfo->size, cleanup_entry, &i); | ||
653 | return ret; | 653 | return ret; |
654 | } | 654 | } |
655 | 655 | ||
diff --git a/net/ipv4/netfilter/ip_tables.c b/net/ipv4/netfilter/ip_tables.c index 8a455439b128..0ff2956d35e5 100644 --- a/net/ipv4/netfilter/ip_tables.c +++ b/net/ipv4/netfilter/ip_tables.c | |||
@@ -401,6 +401,13 @@ mark_source_chains(struct xt_table_info *newinfo, | |||
401 | && unconditional(&e->ip)) { | 401 | && unconditional(&e->ip)) { |
402 | unsigned int oldpos, size; | 402 | unsigned int oldpos, size; |
403 | 403 | ||
404 | if (t->verdict < -NF_MAX_VERDICT - 1) { | ||
405 | duprintf("mark_source_chains: bad " | ||
406 | "negative verdict (%i)\n", | ||
407 | t->verdict); | ||
408 | return 0; | ||
409 | } | ||
410 | |||
404 | /* Return: backtrack through the last | 411 | /* Return: backtrack through the last |
405 | big jump. */ | 412 | big jump. */ |
406 | do { | 413 | do { |
@@ -438,6 +445,13 @@ mark_source_chains(struct xt_table_info *newinfo, | |||
438 | if (strcmp(t->target.u.user.name, | 445 | if (strcmp(t->target.u.user.name, |
439 | IPT_STANDARD_TARGET) == 0 | 446 | IPT_STANDARD_TARGET) == 0 |
440 | && newpos >= 0) { | 447 | && newpos >= 0) { |
448 | if (newpos > newinfo->size - | ||
449 | sizeof(struct ipt_entry)) { | ||
450 | duprintf("mark_source_chains: " | ||
451 | "bad verdict (%i)\n", | ||
452 | newpos); | ||
453 | return 0; | ||
454 | } | ||
441 | /* This a jump; chase it. */ | 455 | /* This a jump; chase it. */ |
442 | duprintf("Jump rule %u -> %u\n", | 456 | duprintf("Jump rule %u -> %u\n", |
443 | pos, newpos); | 457 | pos, newpos); |
@@ -470,27 +484,6 @@ cleanup_match(struct ipt_entry_match *m, unsigned int *i) | |||
470 | } | 484 | } |
471 | 485 | ||
472 | static inline int | 486 | static inline int |
473 | standard_check(const struct ipt_entry_target *t, | ||
474 | unsigned int max_offset) | ||
475 | { | ||
476 | struct ipt_standard_target *targ = (void *)t; | ||
477 | |||
478 | /* Check standard info. */ | ||
479 | if (targ->verdict >= 0 | ||
480 | && targ->verdict > max_offset - sizeof(struct ipt_entry)) { | ||
481 | duprintf("ipt_standard_check: bad verdict (%i)\n", | ||
482 | targ->verdict); | ||
483 | return 0; | ||
484 | } | ||
485 | if (targ->verdict < -NF_MAX_VERDICT - 1) { | ||
486 | duprintf("ipt_standard_check: bad negative verdict (%i)\n", | ||
487 | targ->verdict); | ||
488 | return 0; | ||
489 | } | ||
490 | return 1; | ||
491 | } | ||
492 | |||
493 | static inline int | ||
494 | check_match(struct ipt_entry_match *m, | 487 | check_match(struct ipt_entry_match *m, |
495 | const char *name, | 488 | const char *name, |
496 | const struct ipt_ip *ip, | 489 | const struct ipt_ip *ip, |
@@ -576,12 +569,7 @@ check_entry(struct ipt_entry *e, const char *name, unsigned int size, | |||
576 | if (ret) | 569 | if (ret) |
577 | goto err; | 570 | goto err; |
578 | 571 | ||
579 | if (t->u.kernel.target == &ipt_standard_target) { | 572 | if (t->u.kernel.target->checkentry |
580 | if (!standard_check(t, size)) { | ||
581 | ret = -EINVAL; | ||
582 | goto err; | ||
583 | } | ||
584 | } else if (t->u.kernel.target->checkentry | ||
585 | && !t->u.kernel.target->checkentry(name, e, target, t->data, | 573 | && !t->u.kernel.target->checkentry(name, e, target, t->data, |
586 | e->comefrom)) { | 574 | e->comefrom)) { |
587 | duprintf("ip_tables: check failed for `%s'.\n", | 575 | duprintf("ip_tables: check failed for `%s'.\n", |
@@ -718,17 +706,19 @@ translate_table(const char *name, | |||
718 | } | 706 | } |
719 | } | 707 | } |
720 | 708 | ||
709 | if (!mark_source_chains(newinfo, valid_hooks, entry0)) | ||
710 | return -ELOOP; | ||
711 | |||
721 | /* Finally, each sanity check must pass */ | 712 | /* Finally, each sanity check must pass */ |
722 | i = 0; | 713 | i = 0; |
723 | ret = IPT_ENTRY_ITERATE(entry0, newinfo->size, | 714 | ret = IPT_ENTRY_ITERATE(entry0, newinfo->size, |
724 | check_entry, name, size, &i); | 715 | check_entry, name, size, &i); |
725 | 716 | ||
726 | if (ret != 0) | 717 | if (ret != 0) { |
727 | goto cleanup; | 718 | IPT_ENTRY_ITERATE(entry0, newinfo->size, |
728 | 719 | cleanup_entry, &i); | |
729 | ret = -ELOOP; | 720 | return ret; |
730 | if (!mark_source_chains(newinfo, valid_hooks, entry0)) | 721 | } |
731 | goto cleanup; | ||
732 | 722 | ||
733 | /* And one copy for every other CPU */ | 723 | /* And one copy for every other CPU */ |
734 | for_each_possible_cpu(i) { | 724 | for_each_possible_cpu(i) { |
@@ -736,9 +726,6 @@ translate_table(const char *name, | |||
736 | memcpy(newinfo->entries[i], entry0, newinfo->size); | 726 | memcpy(newinfo->entries[i], entry0, newinfo->size); |
737 | } | 727 | } |
738 | 728 | ||
739 | return 0; | ||
740 | cleanup: | ||
741 | IPT_ENTRY_ITERATE(entry0, newinfo->size, cleanup_entry, &i); | ||
742 | return ret; | 729 | return ret; |
743 | } | 730 | } |
744 | 731 | ||
@@ -1529,25 +1516,8 @@ static inline int compat_copy_match_from_user(struct ipt_entry_match *m, | |||
1529 | void **dstptr, compat_uint_t *size, const char *name, | 1516 | void **dstptr, compat_uint_t *size, const char *name, |
1530 | const struct ipt_ip *ip, unsigned int hookmask) | 1517 | const struct ipt_ip *ip, unsigned int hookmask) |
1531 | { | 1518 | { |
1532 | struct ipt_entry_match *dm; | ||
1533 | struct ipt_match *match; | ||
1534 | int ret; | ||
1535 | |||
1536 | dm = (struct ipt_entry_match *)*dstptr; | ||
1537 | match = m->u.kernel.match; | ||
1538 | xt_compat_match_from_user(m, dstptr, size); | 1519 | xt_compat_match_from_user(m, dstptr, size); |
1539 | 1520 | return 0; | |
1540 | ret = xt_check_match(match, AF_INET, dm->u.match_size - sizeof(*dm), | ||
1541 | name, hookmask, ip->proto, | ||
1542 | ip->invflags & IPT_INV_PROTO); | ||
1543 | if (!ret && m->u.kernel.match->checkentry | ||
1544 | && !m->u.kernel.match->checkentry(name, ip, match, dm->data, | ||
1545 | hookmask)) { | ||
1546 | duprintf("ip_tables: check failed for `%s'.\n", | ||
1547 | m->u.kernel.match->name); | ||
1548 | ret = -EINVAL; | ||
1549 | } | ||
1550 | return ret; | ||
1551 | } | 1521 | } |
1552 | 1522 | ||
1553 | static int compat_copy_entry_from_user(struct ipt_entry *e, void **dstptr, | 1523 | static int compat_copy_entry_from_user(struct ipt_entry *e, void **dstptr, |
@@ -1569,7 +1539,7 @@ static int compat_copy_entry_from_user(struct ipt_entry *e, void **dstptr, | |||
1569 | ret = IPT_MATCH_ITERATE(e, compat_copy_match_from_user, dstptr, size, | 1539 | ret = IPT_MATCH_ITERATE(e, compat_copy_match_from_user, dstptr, size, |
1570 | name, &de->ip, de->comefrom); | 1540 | name, &de->ip, de->comefrom); |
1571 | if (ret) | 1541 | if (ret) |
1572 | goto err; | 1542 | return ret; |
1573 | de->target_offset = e->target_offset - (origsize - *size); | 1543 | de->target_offset = e->target_offset - (origsize - *size); |
1574 | t = ipt_get_target(e); | 1544 | t = ipt_get_target(e); |
1575 | target = t->u.kernel.target; | 1545 | target = t->u.kernel.target; |
@@ -1582,31 +1552,62 @@ static int compat_copy_entry_from_user(struct ipt_entry *e, void **dstptr, | |||
1582 | if ((unsigned char *)de - base < newinfo->underflow[h]) | 1552 | if ((unsigned char *)de - base < newinfo->underflow[h]) |
1583 | newinfo->underflow[h] -= origsize - *size; | 1553 | newinfo->underflow[h] -= origsize - *size; |
1584 | } | 1554 | } |
1555 | return ret; | ||
1556 | } | ||
1557 | |||
1558 | static inline int compat_check_match(struct ipt_entry_match *m, const char *name, | ||
1559 | const struct ipt_ip *ip, unsigned int hookmask) | ||
1560 | { | ||
1561 | struct ipt_match *match; | ||
1562 | int ret; | ||
1563 | |||
1564 | match = m->u.kernel.match; | ||
1565 | ret = xt_check_match(match, AF_INET, m->u.match_size - sizeof(*m), | ||
1566 | name, hookmask, ip->proto, | ||
1567 | ip->invflags & IPT_INV_PROTO); | ||
1568 | if (!ret && m->u.kernel.match->checkentry | ||
1569 | && !m->u.kernel.match->checkentry(name, ip, match, m->data, | ||
1570 | hookmask)) { | ||
1571 | duprintf("ip_tables: compat: check failed for `%s'.\n", | ||
1572 | m->u.kernel.match->name); | ||
1573 | ret = -EINVAL; | ||
1574 | } | ||
1575 | return ret; | ||
1576 | } | ||
1577 | |||
1578 | static inline int compat_check_target(struct ipt_entry *e, const char *name) | ||
1579 | { | ||
1580 | struct ipt_entry_target *t; | ||
1581 | struct ipt_target *target; | ||
1582 | int ret; | ||
1585 | 1583 | ||
1586 | t = ipt_get_target(de); | 1584 | t = ipt_get_target(e); |
1587 | target = t->u.kernel.target; | 1585 | target = t->u.kernel.target; |
1588 | ret = xt_check_target(target, AF_INET, t->u.target_size - sizeof(*t), | 1586 | ret = xt_check_target(target, AF_INET, t->u.target_size - sizeof(*t), |
1589 | name, e->comefrom, e->ip.proto, | 1587 | name, e->comefrom, e->ip.proto, |
1590 | e->ip.invflags & IPT_INV_PROTO); | 1588 | e->ip.invflags & IPT_INV_PROTO); |
1591 | if (ret) | 1589 | if (!ret && t->u.kernel.target->checkentry |
1592 | goto err; | 1590 | && !t->u.kernel.target->checkentry(name, e, target, |
1593 | 1591 | t->data, e->comefrom)) { | |
1594 | ret = -EINVAL; | ||
1595 | if (t->u.kernel.target == &ipt_standard_target) { | ||
1596 | if (!standard_check(t, *size)) | ||
1597 | goto err; | ||
1598 | } else if (t->u.kernel.target->checkentry | ||
1599 | && !t->u.kernel.target->checkentry(name, de, target, | ||
1600 | t->data, de->comefrom)) { | ||
1601 | duprintf("ip_tables: compat: check failed for `%s'.\n", | 1592 | duprintf("ip_tables: compat: check failed for `%s'.\n", |
1602 | t->u.kernel.target->name); | 1593 | t->u.kernel.target->name); |
1603 | goto err; | 1594 | ret = -EINVAL; |
1604 | } | 1595 | } |
1605 | ret = 0; | ||
1606 | err: | ||
1607 | return ret; | 1596 | return ret; |
1608 | } | 1597 | } |
1609 | 1598 | ||
1599 | static inline int compat_check_entry(struct ipt_entry *e, const char *name) | ||
1600 | { | ||
1601 | int ret; | ||
1602 | |||
1603 | ret = IPT_MATCH_ITERATE(e, compat_check_match, name, &e->ip, | ||
1604 | e->comefrom); | ||
1605 | if (ret) | ||
1606 | return ret; | ||
1607 | |||
1608 | return compat_check_target(e, name); | ||
1609 | } | ||
1610 | |||
1610 | static int | 1611 | static int |
1611 | translate_compat_table(const char *name, | 1612 | translate_compat_table(const char *name, |
1612 | unsigned int valid_hooks, | 1613 | unsigned int valid_hooks, |
@@ -1695,6 +1696,11 @@ translate_compat_table(const char *name, | |||
1695 | if (!mark_source_chains(newinfo, valid_hooks, entry1)) | 1696 | if (!mark_source_chains(newinfo, valid_hooks, entry1)) |
1696 | goto free_newinfo; | 1697 | goto free_newinfo; |
1697 | 1698 | ||
1699 | ret = IPT_ENTRY_ITERATE(entry1, newinfo->size, compat_check_entry, | ||
1700 | name); | ||
1701 | if (ret) | ||
1702 | goto free_newinfo; | ||
1703 | |||
1698 | /* And one copy for every other CPU */ | 1704 | /* And one copy for every other CPU */ |
1699 | for_each_possible_cpu(i) | 1705 | for_each_possible_cpu(i) |
1700 | if (newinfo->entries[i] && newinfo->entries[i] != entry1) | 1706 | if (newinfo->entries[i] && newinfo->entries[i] != entry1) |
diff --git a/net/ipv4/route.c b/net/ipv4/route.c index 9f3924c4905e..11c167118e87 100644 --- a/net/ipv4/route.c +++ b/net/ipv4/route.c | |||
@@ -1780,7 +1780,7 @@ static inline int __mkroute_input(struct sk_buff *skb, | |||
1780 | #endif | 1780 | #endif |
1781 | if (in_dev->cnf.no_policy) | 1781 | if (in_dev->cnf.no_policy) |
1782 | rth->u.dst.flags |= DST_NOPOLICY; | 1782 | rth->u.dst.flags |= DST_NOPOLICY; |
1783 | if (in_dev->cnf.no_xfrm) | 1783 | if (out_dev->cnf.no_xfrm) |
1784 | rth->u.dst.flags |= DST_NOXFRM; | 1784 | rth->u.dst.flags |= DST_NOXFRM; |
1785 | rth->fl.fl4_dst = daddr; | 1785 | rth->fl.fl4_dst = daddr; |
1786 | rth->rt_dst = daddr; | 1786 | rth->rt_dst = daddr; |
diff --git a/net/ipv4/tcp_input.c b/net/ipv4/tcp_input.c index 9304034c0c47..c701f6abbfc1 100644 --- a/net/ipv4/tcp_input.c +++ b/net/ipv4/tcp_input.c | |||
@@ -4235,7 +4235,7 @@ static int tcp_rcv_synsent_state_process(struct sock *sk, struct sk_buff *skb, | |||
4235 | * Change state from SYN-SENT only after copied_seq | 4235 | * Change state from SYN-SENT only after copied_seq |
4236 | * is initialized. */ | 4236 | * is initialized. */ |
4237 | tp->copied_seq = tp->rcv_nxt; | 4237 | tp->copied_seq = tp->rcv_nxt; |
4238 | mb(); | 4238 | smp_mb(); |
4239 | tcp_set_state(sk, TCP_ESTABLISHED); | 4239 | tcp_set_state(sk, TCP_ESTABLISHED); |
4240 | 4240 | ||
4241 | security_inet_conn_established(sk, skb); | 4241 | security_inet_conn_established(sk, skb); |
@@ -4483,7 +4483,7 @@ int tcp_rcv_state_process(struct sock *sk, struct sk_buff *skb, | |||
4483 | case TCP_SYN_RECV: | 4483 | case TCP_SYN_RECV: |
4484 | if (acceptable) { | 4484 | if (acceptable) { |
4485 | tp->copied_seq = tp->rcv_nxt; | 4485 | tp->copied_seq = tp->rcv_nxt; |
4486 | mb(); | 4486 | smp_mb(); |
4487 | tcp_set_state(sk, TCP_ESTABLISHED); | 4487 | tcp_set_state(sk, TCP_ESTABLISHED); |
4488 | sk->sk_state_change(sk); | 4488 | sk->sk_state_change(sk); |
4489 | 4489 | ||
diff --git a/net/ipv4/xfrm4_policy.c b/net/ipv4/xfrm4_policy.c index d4107bb701b5..fb9f69c616f5 100644 --- a/net/ipv4/xfrm4_policy.c +++ b/net/ipv4/xfrm4_policy.c | |||
@@ -274,6 +274,8 @@ static void xfrm4_dst_destroy(struct dst_entry *dst) | |||
274 | 274 | ||
275 | if (likely(xdst->u.rt.idev)) | 275 | if (likely(xdst->u.rt.idev)) |
276 | in_dev_put(xdst->u.rt.idev); | 276 | in_dev_put(xdst->u.rt.idev); |
277 | if (likely(xdst->u.rt.peer)) | ||
278 | inet_putpeer(xdst->u.rt.peer); | ||
277 | xfrm_dst_destroy(xdst); | 279 | xfrm_dst_destroy(xdst); |
278 | } | 280 | } |
279 | 281 | ||
diff --git a/net/ipv6/ip6_output.c b/net/ipv6/ip6_output.c index e05ecbb1412d..e9212c7ff5cf 100644 --- a/net/ipv6/ip6_output.c +++ b/net/ipv6/ip6_output.c | |||
@@ -624,13 +624,13 @@ static int ip6_fragment(struct sk_buff *skb, int (*output)(struct sk_buff *)) | |||
624 | skb_shinfo(skb)->frag_list = NULL; | 624 | skb_shinfo(skb)->frag_list = NULL; |
625 | /* BUILD HEADER */ | 625 | /* BUILD HEADER */ |
626 | 626 | ||
627 | *prevhdr = NEXTHDR_FRAGMENT; | ||
627 | tmp_hdr = kmemdup(skb->nh.raw, hlen, GFP_ATOMIC); | 628 | tmp_hdr = kmemdup(skb->nh.raw, hlen, GFP_ATOMIC); |
628 | if (!tmp_hdr) { | 629 | if (!tmp_hdr) { |
629 | IP6_INC_STATS(ip6_dst_idev(skb->dst), IPSTATS_MIB_FRAGFAILS); | 630 | IP6_INC_STATS(ip6_dst_idev(skb->dst), IPSTATS_MIB_FRAGFAILS); |
630 | return -ENOMEM; | 631 | return -ENOMEM; |
631 | } | 632 | } |
632 | 633 | ||
633 | *prevhdr = NEXTHDR_FRAGMENT; | ||
634 | __skb_pull(skb, hlen); | 634 | __skb_pull(skb, hlen); |
635 | fh = (struct frag_hdr*)__skb_push(skb, sizeof(struct frag_hdr)); | 635 | fh = (struct frag_hdr*)__skb_push(skb, sizeof(struct frag_hdr)); |
636 | skb->nh.raw = __skb_push(skb, hlen); | 636 | skb->nh.raw = __skb_push(skb, hlen); |
diff --git a/net/ipv6/netfilter/ip6_tables.c b/net/ipv6/netfilter/ip6_tables.c index f63fb86d7c7b..4eec4b3988b8 100644 --- a/net/ipv6/netfilter/ip6_tables.c +++ b/net/ipv6/netfilter/ip6_tables.c | |||
@@ -440,6 +440,13 @@ mark_source_chains(struct xt_table_info *newinfo, | |||
440 | && unconditional(&e->ipv6)) { | 440 | && unconditional(&e->ipv6)) { |
441 | unsigned int oldpos, size; | 441 | unsigned int oldpos, size; |
442 | 442 | ||
443 | if (t->verdict < -NF_MAX_VERDICT - 1) { | ||
444 | duprintf("mark_source_chains: bad " | ||
445 | "negative verdict (%i)\n", | ||
446 | t->verdict); | ||
447 | return 0; | ||
448 | } | ||
449 | |||
443 | /* Return: backtrack through the last | 450 | /* Return: backtrack through the last |
444 | big jump. */ | 451 | big jump. */ |
445 | do { | 452 | do { |
@@ -477,6 +484,13 @@ mark_source_chains(struct xt_table_info *newinfo, | |||
477 | if (strcmp(t->target.u.user.name, | 484 | if (strcmp(t->target.u.user.name, |
478 | IP6T_STANDARD_TARGET) == 0 | 485 | IP6T_STANDARD_TARGET) == 0 |
479 | && newpos >= 0) { | 486 | && newpos >= 0) { |
487 | if (newpos > newinfo->size - | ||
488 | sizeof(struct ip6t_entry)) { | ||
489 | duprintf("mark_source_chains: " | ||
490 | "bad verdict (%i)\n", | ||
491 | newpos); | ||
492 | return 0; | ||
493 | } | ||
480 | /* This a jump; chase it. */ | 494 | /* This a jump; chase it. */ |
481 | duprintf("Jump rule %u -> %u\n", | 495 | duprintf("Jump rule %u -> %u\n", |
482 | pos, newpos); | 496 | pos, newpos); |
@@ -509,27 +523,6 @@ cleanup_match(struct ip6t_entry_match *m, unsigned int *i) | |||
509 | } | 523 | } |
510 | 524 | ||
511 | static inline int | 525 | static inline int |
512 | standard_check(const struct ip6t_entry_target *t, | ||
513 | unsigned int max_offset) | ||
514 | { | ||
515 | struct ip6t_standard_target *targ = (void *)t; | ||
516 | |||
517 | /* Check standard info. */ | ||
518 | if (targ->verdict >= 0 | ||
519 | && targ->verdict > max_offset - sizeof(struct ip6t_entry)) { | ||
520 | duprintf("ip6t_standard_check: bad verdict (%i)\n", | ||
521 | targ->verdict); | ||
522 | return 0; | ||
523 | } | ||
524 | if (targ->verdict < -NF_MAX_VERDICT - 1) { | ||
525 | duprintf("ip6t_standard_check: bad negative verdict (%i)\n", | ||
526 | targ->verdict); | ||
527 | return 0; | ||
528 | } | ||
529 | return 1; | ||
530 | } | ||
531 | |||
532 | static inline int | ||
533 | check_match(struct ip6t_entry_match *m, | 526 | check_match(struct ip6t_entry_match *m, |
534 | const char *name, | 527 | const char *name, |
535 | const struct ip6t_ip6 *ipv6, | 528 | const struct ip6t_ip6 *ipv6, |
@@ -616,12 +609,7 @@ check_entry(struct ip6t_entry *e, const char *name, unsigned int size, | |||
616 | if (ret) | 609 | if (ret) |
617 | goto err; | 610 | goto err; |
618 | 611 | ||
619 | if (t->u.kernel.target == &ip6t_standard_target) { | 612 | if (t->u.kernel.target->checkentry |
620 | if (!standard_check(t, size)) { | ||
621 | ret = -EINVAL; | ||
622 | goto err; | ||
623 | } | ||
624 | } else if (t->u.kernel.target->checkentry | ||
625 | && !t->u.kernel.target->checkentry(name, e, target, t->data, | 613 | && !t->u.kernel.target->checkentry(name, e, target, t->data, |
626 | e->comefrom)) { | 614 | e->comefrom)) { |
627 | duprintf("ip_tables: check failed for `%s'.\n", | 615 | duprintf("ip_tables: check failed for `%s'.\n", |
@@ -758,17 +746,19 @@ translate_table(const char *name, | |||
758 | } | 746 | } |
759 | } | 747 | } |
760 | 748 | ||
749 | if (!mark_source_chains(newinfo, valid_hooks, entry0)) | ||
750 | return -ELOOP; | ||
751 | |||
761 | /* Finally, each sanity check must pass */ | 752 | /* Finally, each sanity check must pass */ |
762 | i = 0; | 753 | i = 0; |
763 | ret = IP6T_ENTRY_ITERATE(entry0, newinfo->size, | 754 | ret = IP6T_ENTRY_ITERATE(entry0, newinfo->size, |
764 | check_entry, name, size, &i); | 755 | check_entry, name, size, &i); |
765 | 756 | ||
766 | if (ret != 0) | 757 | if (ret != 0) { |
767 | goto cleanup; | 758 | IP6T_ENTRY_ITERATE(entry0, newinfo->size, |
768 | 759 | cleanup_entry, &i); | |
769 | ret = -ELOOP; | 760 | return ret; |
770 | if (!mark_source_chains(newinfo, valid_hooks, entry0)) | 761 | } |
771 | goto cleanup; | ||
772 | 762 | ||
773 | /* And one copy for every other CPU */ | 763 | /* And one copy for every other CPU */ |
774 | for_each_possible_cpu(i) { | 764 | for_each_possible_cpu(i) { |
@@ -777,9 +767,6 @@ translate_table(const char *name, | |||
777 | } | 767 | } |
778 | 768 | ||
779 | return 0; | 769 | return 0; |
780 | cleanup: | ||
781 | IP6T_ENTRY_ITERATE(entry0, newinfo->size, cleanup_entry, &i); | ||
782 | return ret; | ||
783 | } | 770 | } |
784 | 771 | ||
785 | /* Gets counters. */ | 772 | /* Gets counters. */ |
diff --git a/net/ipv6/raw.c b/net/ipv6/raw.c index c2e629d6aea4..4ae1b19ada5d 100644 --- a/net/ipv6/raw.c +++ b/net/ipv6/raw.c | |||
@@ -854,7 +854,8 @@ back_from_confirm: | |||
854 | } | 854 | } |
855 | done: | 855 | done: |
856 | dst_release(dst); | 856 | dst_release(dst); |
857 | release_sock(sk); | 857 | if (!inet->hdrincl) |
858 | release_sock(sk); | ||
858 | out: | 859 | out: |
859 | fl6_sock_release(flowlabel); | 860 | fl6_sock_release(flowlabel); |
860 | return err<0?err:len; | 861 | return err<0?err:len; |
diff --git a/net/irda/irttp.c b/net/irda/irttp.c index 252f11012566..03504f3e4990 100644 --- a/net/irda/irttp.c +++ b/net/irda/irttp.c | |||
@@ -1100,7 +1100,7 @@ int irttp_connect_request(struct tsap_cb *self, __u8 dtsap_sel, | |||
1100 | return -ENOMEM; | 1100 | return -ENOMEM; |
1101 | 1101 | ||
1102 | /* Reserve space for MUX_CONTROL and LAP header */ | 1102 | /* Reserve space for MUX_CONTROL and LAP header */ |
1103 | skb_reserve(tx_skb, TTP_MAX_HEADER); | 1103 | skb_reserve(tx_skb, TTP_MAX_HEADER + TTP_SAR_HEADER); |
1104 | } else { | 1104 | } else { |
1105 | tx_skb = userdata; | 1105 | tx_skb = userdata; |
1106 | /* | 1106 | /* |
@@ -1349,7 +1349,7 @@ int irttp_connect_response(struct tsap_cb *self, __u32 max_sdu_size, | |||
1349 | return -ENOMEM; | 1349 | return -ENOMEM; |
1350 | 1350 | ||
1351 | /* Reserve space for MUX_CONTROL and LAP header */ | 1351 | /* Reserve space for MUX_CONTROL and LAP header */ |
1352 | skb_reserve(tx_skb, TTP_MAX_HEADER); | 1352 | skb_reserve(tx_skb, TTP_MAX_HEADER + TTP_SAR_HEADER); |
1353 | } else { | 1353 | } else { |
1354 | tx_skb = userdata; | 1354 | tx_skb = userdata; |
1355 | /* | 1355 | /* |
diff --git a/net/key/af_key.c b/net/key/af_key.c index 0e1dbfbb9b10..5dd5094659a1 100644 --- a/net/key/af_key.c +++ b/net/key/af_key.c | |||
@@ -27,6 +27,7 @@ | |||
27 | #include <linux/proc_fs.h> | 27 | #include <linux/proc_fs.h> |
28 | #include <linux/init.h> | 28 | #include <linux/init.h> |
29 | #include <net/xfrm.h> | 29 | #include <net/xfrm.h> |
30 | #include <linux/audit.h> | ||
30 | 31 | ||
31 | #include <net/sock.h> | 32 | #include <net/sock.h> |
32 | 33 | ||
@@ -1420,6 +1421,9 @@ static int pfkey_add(struct sock *sk, struct sk_buff *skb, struct sadb_msg *hdr, | |||
1420 | else | 1421 | else |
1421 | err = xfrm_state_update(x); | 1422 | err = xfrm_state_update(x); |
1422 | 1423 | ||
1424 | xfrm_audit_log(audit_get_loginuid(current->audit_context), 0, | ||
1425 | AUDIT_MAC_IPSEC_ADDSA, err ? 0 : 1, NULL, x); | ||
1426 | |||
1423 | if (err < 0) { | 1427 | if (err < 0) { |
1424 | x->km.state = XFRM_STATE_DEAD; | 1428 | x->km.state = XFRM_STATE_DEAD; |
1425 | __xfrm_state_put(x); | 1429 | __xfrm_state_put(x); |
@@ -1460,8 +1464,12 @@ static int pfkey_delete(struct sock *sk, struct sk_buff *skb, struct sadb_msg *h | |||
1460 | err = -EPERM; | 1464 | err = -EPERM; |
1461 | goto out; | 1465 | goto out; |
1462 | } | 1466 | } |
1463 | 1467 | ||
1464 | err = xfrm_state_delete(x); | 1468 | err = xfrm_state_delete(x); |
1469 | |||
1470 | xfrm_audit_log(audit_get_loginuid(current->audit_context), 0, | ||
1471 | AUDIT_MAC_IPSEC_DELSA, err ? 0 : 1, NULL, x); | ||
1472 | |||
1465 | if (err < 0) | 1473 | if (err < 0) |
1466 | goto out; | 1474 | goto out; |
1467 | 1475 | ||
@@ -1637,12 +1645,15 @@ static int pfkey_flush(struct sock *sk, struct sk_buff *skb, struct sadb_msg *hd | |||
1637 | { | 1645 | { |
1638 | unsigned proto; | 1646 | unsigned proto; |
1639 | struct km_event c; | 1647 | struct km_event c; |
1648 | struct xfrm_audit audit_info; | ||
1640 | 1649 | ||
1641 | proto = pfkey_satype2proto(hdr->sadb_msg_satype); | 1650 | proto = pfkey_satype2proto(hdr->sadb_msg_satype); |
1642 | if (proto == 0) | 1651 | if (proto == 0) |
1643 | return -EINVAL; | 1652 | return -EINVAL; |
1644 | 1653 | ||
1645 | xfrm_state_flush(proto); | 1654 | audit_info.loginuid = audit_get_loginuid(current->audit_context); |
1655 | audit_info.secid = 0; | ||
1656 | xfrm_state_flush(proto, &audit_info); | ||
1646 | c.data.proto = proto; | 1657 | c.data.proto = proto; |
1647 | c.seq = hdr->sadb_msg_seq; | 1658 | c.seq = hdr->sadb_msg_seq; |
1648 | c.pid = hdr->sadb_msg_pid; | 1659 | c.pid = hdr->sadb_msg_pid; |
@@ -2205,6 +2216,9 @@ static int pfkey_spdadd(struct sock *sk, struct sk_buff *skb, struct sadb_msg *h | |||
2205 | err = xfrm_policy_insert(pol->sadb_x_policy_dir-1, xp, | 2216 | err = xfrm_policy_insert(pol->sadb_x_policy_dir-1, xp, |
2206 | hdr->sadb_msg_type != SADB_X_SPDUPDATE); | 2217 | hdr->sadb_msg_type != SADB_X_SPDUPDATE); |
2207 | 2218 | ||
2219 | xfrm_audit_log(audit_get_loginuid(current->audit_context), 0, | ||
2220 | AUDIT_MAC_IPSEC_ADDSPD, err ? 0 : 1, xp, NULL); | ||
2221 | |||
2208 | if (err) | 2222 | if (err) |
2209 | goto out; | 2223 | goto out; |
2210 | 2224 | ||
@@ -2282,6 +2296,10 @@ static int pfkey_spddelete(struct sock *sk, struct sk_buff *skb, struct sadb_msg | |||
2282 | xp = xfrm_policy_bysel_ctx(XFRM_POLICY_TYPE_MAIN, pol->sadb_x_policy_dir-1, | 2296 | xp = xfrm_policy_bysel_ctx(XFRM_POLICY_TYPE_MAIN, pol->sadb_x_policy_dir-1, |
2283 | &sel, tmp.security, 1); | 2297 | &sel, tmp.security, 1); |
2284 | security_xfrm_policy_free(&tmp); | 2298 | security_xfrm_policy_free(&tmp); |
2299 | |||
2300 | xfrm_audit_log(audit_get_loginuid(current->audit_context), 0, | ||
2301 | AUDIT_MAC_IPSEC_DELSPD, (xp) ? 1 : 0, xp, NULL); | ||
2302 | |||
2285 | if (xp == NULL) | 2303 | if (xp == NULL) |
2286 | return -ENOENT; | 2304 | return -ENOENT; |
2287 | 2305 | ||
@@ -2416,8 +2434,11 @@ static int key_notify_policy_flush(struct km_event *c) | |||
2416 | static int pfkey_spdflush(struct sock *sk, struct sk_buff *skb, struct sadb_msg *hdr, void **ext_hdrs) | 2434 | static int pfkey_spdflush(struct sock *sk, struct sk_buff *skb, struct sadb_msg *hdr, void **ext_hdrs) |
2417 | { | 2435 | { |
2418 | struct km_event c; | 2436 | struct km_event c; |
2437 | struct xfrm_audit audit_info; | ||
2419 | 2438 | ||
2420 | xfrm_policy_flush(XFRM_POLICY_TYPE_MAIN); | 2439 | audit_info.loginuid = audit_get_loginuid(current->audit_context); |
2440 | audit_info.secid = 0; | ||
2441 | xfrm_policy_flush(XFRM_POLICY_TYPE_MAIN, &audit_info); | ||
2421 | c.data.type = XFRM_POLICY_TYPE_MAIN; | 2442 | c.data.type = XFRM_POLICY_TYPE_MAIN; |
2422 | c.event = XFRM_MSG_FLUSHPOLICY; | 2443 | c.event = XFRM_MSG_FLUSHPOLICY; |
2423 | c.pid = hdr->sadb_msg_pid; | 2444 | c.pid = hdr->sadb_msg_pid; |
diff --git a/net/netfilter/nf_conntrack_core.c b/net/netfilter/nf_conntrack_core.c index a9638ff52a72..9b02ec4012fb 100644 --- a/net/netfilter/nf_conntrack_core.c +++ b/net/netfilter/nf_conntrack_core.c | |||
@@ -1093,7 +1093,7 @@ static void free_conntrack_hash(struct list_head *hash, int vmalloced, int size) | |||
1093 | get_order(sizeof(struct list_head) * size)); | 1093 | get_order(sizeof(struct list_head) * size)); |
1094 | } | 1094 | } |
1095 | 1095 | ||
1096 | void nf_conntrack_flush() | 1096 | void nf_conntrack_flush(void) |
1097 | { | 1097 | { |
1098 | nf_ct_iterate_cleanup(kill_all, NULL); | 1098 | nf_ct_iterate_cleanup(kill_all, NULL); |
1099 | } | 1099 | } |
diff --git a/net/netfilter/nf_conntrack_expect.c b/net/netfilter/nf_conntrack_expect.c index c20f901fa177..9cbf926cdd14 100644 --- a/net/netfilter/nf_conntrack_expect.c +++ b/net/netfilter/nf_conntrack_expect.c | |||
@@ -91,25 +91,28 @@ EXPORT_SYMBOL_GPL(nf_conntrack_expect_find_get); | |||
91 | struct nf_conntrack_expect * | 91 | struct nf_conntrack_expect * |
92 | find_expectation(const struct nf_conntrack_tuple *tuple) | 92 | find_expectation(const struct nf_conntrack_tuple *tuple) |
93 | { | 93 | { |
94 | struct nf_conntrack_expect *i; | 94 | struct nf_conntrack_expect *exp; |
95 | |||
96 | exp = __nf_conntrack_expect_find(tuple); | ||
97 | if (!exp) | ||
98 | return NULL; | ||
95 | 99 | ||
96 | list_for_each_entry(i, &nf_conntrack_expect_list, list) { | ||
97 | /* If master is not in hash table yet (ie. packet hasn't left | 100 | /* If master is not in hash table yet (ie. packet hasn't left |
98 | this machine yet), how can other end know about expected? | 101 | this machine yet), how can other end know about expected? |
99 | Hence these are not the droids you are looking for (if | 102 | Hence these are not the droids you are looking for (if |
100 | master ct never got confirmed, we'd hold a reference to it | 103 | master ct never got confirmed, we'd hold a reference to it |
101 | and weird things would happen to future packets). */ | 104 | and weird things would happen to future packets). */ |
102 | if (nf_ct_tuple_mask_cmp(tuple, &i->tuple, &i->mask) | 105 | if (!nf_ct_is_confirmed(exp->master)) |
103 | && nf_ct_is_confirmed(i->master)) { | 106 | return NULL; |
104 | if (i->flags & NF_CT_EXPECT_PERMANENT) { | 107 | |
105 | atomic_inc(&i->use); | 108 | if (exp->flags & NF_CT_EXPECT_PERMANENT) { |
106 | return i; | 109 | atomic_inc(&exp->use); |
107 | } else if (del_timer(&i->timeout)) { | 110 | return exp; |
108 | nf_ct_unlink_expect(i); | 111 | } else if (del_timer(&exp->timeout)) { |
109 | return i; | 112 | nf_ct_unlink_expect(exp); |
110 | } | 113 | return exp; |
111 | } | ||
112 | } | 114 | } |
115 | |||
113 | return NULL; | 116 | return NULL; |
114 | } | 117 | } |
115 | 118 | ||
diff --git a/net/netlink/genetlink.c b/net/netlink/genetlink.c index b9b03747c1f3..548e4e6e698f 100644 --- a/net/netlink/genetlink.c +++ b/net/netlink/genetlink.c | |||
@@ -143,6 +143,13 @@ int genl_register_ops(struct genl_family *family, struct genl_ops *ops) | |||
143 | goto errout; | 143 | goto errout; |
144 | } | 144 | } |
145 | 145 | ||
146 | if (ops->dumpit) | ||
147 | ops->flags |= GENL_CMD_CAP_DUMP; | ||
148 | if (ops->doit) | ||
149 | ops->flags |= GENL_CMD_CAP_DO; | ||
150 | if (ops->policy) | ||
151 | ops->flags |= GENL_CMD_CAP_HASPOL; | ||
152 | |||
146 | genl_lock(); | 153 | genl_lock(); |
147 | list_add_tail(&ops->ops_list, &family->ops_list); | 154 | list_add_tail(&ops->ops_list, &family->ops_list); |
148 | genl_unlock(); | 155 | genl_unlock(); |
@@ -387,7 +394,7 @@ static void genl_rcv(struct sock *sk, int len) | |||
387 | static struct genl_family genl_ctrl = { | 394 | static struct genl_family genl_ctrl = { |
388 | .id = GENL_ID_CTRL, | 395 | .id = GENL_ID_CTRL, |
389 | .name = "nlctrl", | 396 | .name = "nlctrl", |
390 | .version = 0x1, | 397 | .version = 0x2, |
391 | .maxattr = CTRL_ATTR_MAX, | 398 | .maxattr = CTRL_ATTR_MAX, |
392 | }; | 399 | }; |
393 | 400 | ||
@@ -425,15 +432,6 @@ static int ctrl_fill_info(struct genl_family *family, u32 pid, u32 seq, | |||
425 | NLA_PUT_U32(skb, CTRL_ATTR_OP_ID, ops->cmd); | 432 | NLA_PUT_U32(skb, CTRL_ATTR_OP_ID, ops->cmd); |
426 | NLA_PUT_U32(skb, CTRL_ATTR_OP_FLAGS, ops->flags); | 433 | NLA_PUT_U32(skb, CTRL_ATTR_OP_FLAGS, ops->flags); |
427 | 434 | ||
428 | if (ops->policy) | ||
429 | NLA_PUT_FLAG(skb, CTRL_ATTR_OP_POLICY); | ||
430 | |||
431 | if (ops->doit) | ||
432 | NLA_PUT_FLAG(skb, CTRL_ATTR_OP_DOIT); | ||
433 | |||
434 | if (ops->dumpit) | ||
435 | NLA_PUT_FLAG(skb, CTRL_ATTR_OP_DUMPIT); | ||
436 | |||
437 | nla_nest_end(skb, nest); | 435 | nla_nest_end(skb, nest); |
438 | } | 436 | } |
439 | 437 | ||
diff --git a/net/packet/af_packet.c b/net/packet/af_packet.c index 08e68b67bbf6..da73e8a8c18d 100644 --- a/net/packet/af_packet.c +++ b/net/packet/af_packet.c | |||
@@ -660,7 +660,7 @@ static int tpacket_rcv(struct sk_buff *skb, struct net_device *dev, struct packe | |||
660 | sll->sll_ifindex = dev->ifindex; | 660 | sll->sll_ifindex = dev->ifindex; |
661 | 661 | ||
662 | h->tp_status = status; | 662 | h->tp_status = status; |
663 | mb(); | 663 | smp_mb(); |
664 | 664 | ||
665 | { | 665 | { |
666 | struct page *p_start, *p_end; | 666 | struct page *p_start, *p_end; |
diff --git a/net/sched/cls_fw.c b/net/sched/cls_fw.c index f59a2c4aa039..c797d6ada7de 100644 --- a/net/sched/cls_fw.c +++ b/net/sched/cls_fw.c | |||
@@ -101,9 +101,10 @@ static int fw_classify(struct sk_buff *skb, struct tcf_proto *tp, | |||
101 | struct fw_head *head = (struct fw_head*)tp->root; | 101 | struct fw_head *head = (struct fw_head*)tp->root; |
102 | struct fw_filter *f; | 102 | struct fw_filter *f; |
103 | int r; | 103 | int r; |
104 | u32 id = skb->mark & head->mask; | 104 | u32 id = skb->mark; |
105 | 105 | ||
106 | if (head != NULL) { | 106 | if (head != NULL) { |
107 | id &= head->mask; | ||
107 | for (f=head->ht[fw_hash(id)]; f; f=f->next) { | 108 | for (f=head->ht[fw_hash(id)]; f; f=f->next) { |
108 | if (f->id == id) { | 109 | if (f->id == id) { |
109 | *res = f->res; | 110 | *res = f->res; |
diff --git a/net/wanrouter/wanmain.c b/net/wanrouter/wanmain.c index 316211d9f17d..769cdd62c1bb 100644 --- a/net/wanrouter/wanmain.c +++ b/net/wanrouter/wanmain.c | |||
@@ -62,63 +62,6 @@ | |||
62 | 62 | ||
63 | #define KMEM_SAFETYZONE 8 | 63 | #define KMEM_SAFETYZONE 8 |
64 | 64 | ||
65 | /***********FOR DEBUGGING PURPOSES********************************************* | ||
66 | static void * dbg_kmalloc(unsigned int size, int prio, int line) { | ||
67 | int i = 0; | ||
68 | void * v = kmalloc(size+sizeof(unsigned int)+2*KMEM_SAFETYZONE*8,prio); | ||
69 | char * c1 = v; | ||
70 | c1 += sizeof(unsigned int); | ||
71 | *((unsigned int *)v) = size; | ||
72 | |||
73 | for (i = 0; i < KMEM_SAFETYZONE; i++) { | ||
74 | c1[0] = 'D'; c1[1] = 'E'; c1[2] = 'A'; c1[3] = 'D'; | ||
75 | c1[4] = 'B'; c1[5] = 'E'; c1[6] = 'E'; c1[7] = 'F'; | ||
76 | c1 += 8; | ||
77 | } | ||
78 | c1 += size; | ||
79 | for (i = 0; i < KMEM_SAFETYZONE; i++) { | ||
80 | c1[0] = 'M'; c1[1] = 'U'; c1[2] = 'N'; c1[3] = 'G'; | ||
81 | c1[4] = 'W'; c1[5] = 'A'; c1[6] = 'L'; c1[7] = 'L'; | ||
82 | c1 += 8; | ||
83 | } | ||
84 | v = ((char *)v) + sizeof(unsigned int) + KMEM_SAFETYZONE*8; | ||
85 | printk(KERN_INFO "line %d kmalloc(%d,%d) = %p\n",line,size,prio,v); | ||
86 | return v; | ||
87 | } | ||
88 | static void dbg_kfree(void * v, int line) { | ||
89 | unsigned int * sp = (unsigned int *)(((char *)v) - (sizeof(unsigned int) + KMEM_SAFETYZONE*8)); | ||
90 | unsigned int size = *sp; | ||
91 | char * c1 = ((char *)v) - KMEM_SAFETYZONE*8; | ||
92 | int i = 0; | ||
93 | for (i = 0; i < KMEM_SAFETYZONE; i++) { | ||
94 | if ( c1[0] != 'D' || c1[1] != 'E' || c1[2] != 'A' || c1[3] != 'D' | ||
95 | || c1[4] != 'B' || c1[5] != 'E' || c1[6] != 'E' || c1[7] != 'F') { | ||
96 | printk(KERN_INFO "kmalloced block at %p has been corrupted (underrun)!\n",v); | ||
97 | printk(KERN_INFO " %4x: %2x %2x %2x %2x %2x %2x %2x %2x\n", i*8, | ||
98 | c1[0],c1[1],c1[2],c1[3],c1[4],c1[5],c1[6],c1[7] ); | ||
99 | } | ||
100 | c1 += 8; | ||
101 | } | ||
102 | c1 += size; | ||
103 | for (i = 0; i < KMEM_SAFETYZONE; i++) { | ||
104 | if ( c1[0] != 'M' || c1[1] != 'U' || c1[2] != 'N' || c1[3] != 'G' | ||
105 | || c1[4] != 'W' || c1[5] != 'A' || c1[6] != 'L' || c1[7] != 'L' | ||
106 | ) { | ||
107 | printk(KERN_INFO "kmalloced block at %p has been corrupted (overrun):\n",v); | ||
108 | printk(KERN_INFO " %4x: %2x %2x %2x %2x %2x %2x %2x %2x\n", i*8, | ||
109 | c1[0],c1[1],c1[2],c1[3],c1[4],c1[5],c1[6],c1[7] ); | ||
110 | } | ||
111 | c1 += 8; | ||
112 | } | ||
113 | printk(KERN_INFO "line %d kfree(%p)\n",line,v); | ||
114 | v = ((char *)v) - (sizeof(unsigned int) + KMEM_SAFETYZONE*8); | ||
115 | kfree(v); | ||
116 | } | ||
117 | |||
118 | #define kmalloc(x,y) dbg_kmalloc(x,y,__LINE__) | ||
119 | #define kfree(x) dbg_kfree(x,__LINE__) | ||
120 | *****************************************************************************/ | ||
121 | |||
122 | /* | 65 | /* |
123 | * Function Prototypes | 66 | * Function Prototypes |
124 | */ | 67 | */ |
diff --git a/net/xfrm/xfrm_algo.c b/net/xfrm/xfrm_algo.c index 5a0dbeb6bbe8..6b381fc0383d 100644 --- a/net/xfrm/xfrm_algo.c +++ b/net/xfrm/xfrm_algo.c | |||
@@ -119,6 +119,23 @@ static struct xfrm_algo_desc aalg_list[] = { | |||
119 | .sadb_alg_maxbits = 160 | 119 | .sadb_alg_maxbits = 160 |
120 | } | 120 | } |
121 | }, | 121 | }, |
122 | { | ||
123 | .name = "xcbc(aes)", | ||
124 | |||
125 | .uinfo = { | ||
126 | .auth = { | ||
127 | .icv_truncbits = 96, | ||
128 | .icv_fullbits = 128, | ||
129 | } | ||
130 | }, | ||
131 | |||
132 | .desc = { | ||
133 | .sadb_alg_id = SADB_X_AALG_AES_XCBC_MAC, | ||
134 | .sadb_alg_ivlen = 0, | ||
135 | .sadb_alg_minbits = 128, | ||
136 | .sadb_alg_maxbits = 128 | ||
137 | } | ||
138 | }, | ||
122 | }; | 139 | }; |
123 | 140 | ||
124 | static struct xfrm_algo_desc ealg_list[] = { | 141 | static struct xfrm_algo_desc ealg_list[] = { |
diff --git a/net/xfrm/xfrm_policy.c b/net/xfrm/xfrm_policy.c index 3f3f563eb4ab..bebd40e5a62e 100644 --- a/net/xfrm/xfrm_policy.c +++ b/net/xfrm/xfrm_policy.c | |||
@@ -25,6 +25,7 @@ | |||
25 | #include <linux/cache.h> | 25 | #include <linux/cache.h> |
26 | #include <net/xfrm.h> | 26 | #include <net/xfrm.h> |
27 | #include <net/ip.h> | 27 | #include <net/ip.h> |
28 | #include <linux/audit.h> | ||
28 | 29 | ||
29 | #include "xfrm_hash.h" | 30 | #include "xfrm_hash.h" |
30 | 31 | ||
@@ -804,7 +805,7 @@ struct xfrm_policy *xfrm_policy_byid(u8 type, int dir, u32 id, int delete) | |||
804 | } | 805 | } |
805 | EXPORT_SYMBOL(xfrm_policy_byid); | 806 | EXPORT_SYMBOL(xfrm_policy_byid); |
806 | 807 | ||
807 | void xfrm_policy_flush(u8 type) | 808 | void xfrm_policy_flush(u8 type, struct xfrm_audit *audit_info) |
808 | { | 809 | { |
809 | int dir; | 810 | int dir; |
810 | 811 | ||
@@ -824,6 +825,9 @@ void xfrm_policy_flush(u8 type) | |||
824 | hlist_del(&pol->byidx); | 825 | hlist_del(&pol->byidx); |
825 | write_unlock_bh(&xfrm_policy_lock); | 826 | write_unlock_bh(&xfrm_policy_lock); |
826 | 827 | ||
828 | xfrm_audit_log(audit_info->loginuid, audit_info->secid, | ||
829 | AUDIT_MAC_IPSEC_DELSPD, 1, pol, NULL); | ||
830 | |||
827 | xfrm_policy_kill(pol); | 831 | xfrm_policy_kill(pol); |
828 | killed++; | 832 | killed++; |
829 | 833 | ||
@@ -842,6 +846,11 @@ void xfrm_policy_flush(u8 type) | |||
842 | hlist_del(&pol->byidx); | 846 | hlist_del(&pol->byidx); |
843 | write_unlock_bh(&xfrm_policy_lock); | 847 | write_unlock_bh(&xfrm_policy_lock); |
844 | 848 | ||
849 | xfrm_audit_log(audit_info->loginuid, | ||
850 | audit_info->secid, | ||
851 | AUDIT_MAC_IPSEC_DELSPD, 1, | ||
852 | pol, NULL); | ||
853 | |||
845 | xfrm_policy_kill(pol); | 854 | xfrm_policy_kill(pol); |
846 | killed++; | 855 | killed++; |
847 | 856 | ||
@@ -860,33 +869,12 @@ EXPORT_SYMBOL(xfrm_policy_flush); | |||
860 | int xfrm_policy_walk(u8 type, int (*func)(struct xfrm_policy *, int, int, void*), | 869 | int xfrm_policy_walk(u8 type, int (*func)(struct xfrm_policy *, int, int, void*), |
861 | void *data) | 870 | void *data) |
862 | { | 871 | { |
863 | struct xfrm_policy *pol; | 872 | struct xfrm_policy *pol, *last = NULL; |
864 | struct hlist_node *entry; | 873 | struct hlist_node *entry; |
865 | int dir, count, error; | 874 | int dir, last_dir = 0, count, error; |
866 | 875 | ||
867 | read_lock_bh(&xfrm_policy_lock); | 876 | read_lock_bh(&xfrm_policy_lock); |
868 | count = 0; | 877 | count = 0; |
869 | for (dir = 0; dir < 2*XFRM_POLICY_MAX; dir++) { | ||
870 | struct hlist_head *table = xfrm_policy_bydst[dir].table; | ||
871 | int i; | ||
872 | |||
873 | hlist_for_each_entry(pol, entry, | ||
874 | &xfrm_policy_inexact[dir], bydst) { | ||
875 | if (pol->type == type) | ||
876 | count++; | ||
877 | } | ||
878 | for (i = xfrm_policy_bydst[dir].hmask; i >= 0; i--) { | ||
879 | hlist_for_each_entry(pol, entry, table + i, bydst) { | ||
880 | if (pol->type == type) | ||
881 | count++; | ||
882 | } | ||
883 | } | ||
884 | } | ||
885 | |||
886 | if (count == 0) { | ||
887 | error = -ENOENT; | ||
888 | goto out; | ||
889 | } | ||
890 | 878 | ||
891 | for (dir = 0; dir < 2*XFRM_POLICY_MAX; dir++) { | 879 | for (dir = 0; dir < 2*XFRM_POLICY_MAX; dir++) { |
892 | struct hlist_head *table = xfrm_policy_bydst[dir].table; | 880 | struct hlist_head *table = xfrm_policy_bydst[dir].table; |
@@ -896,21 +884,37 @@ int xfrm_policy_walk(u8 type, int (*func)(struct xfrm_policy *, int, int, void*) | |||
896 | &xfrm_policy_inexact[dir], bydst) { | 884 | &xfrm_policy_inexact[dir], bydst) { |
897 | if (pol->type != type) | 885 | if (pol->type != type) |
898 | continue; | 886 | continue; |
899 | error = func(pol, dir % XFRM_POLICY_MAX, --count, data); | 887 | if (last) { |
900 | if (error) | 888 | error = func(last, last_dir % XFRM_POLICY_MAX, |
901 | goto out; | 889 | count, data); |
890 | if (error) | ||
891 | goto out; | ||
892 | } | ||
893 | last = pol; | ||
894 | last_dir = dir; | ||
895 | count++; | ||
902 | } | 896 | } |
903 | for (i = xfrm_policy_bydst[dir].hmask; i >= 0; i--) { | 897 | for (i = xfrm_policy_bydst[dir].hmask; i >= 0; i--) { |
904 | hlist_for_each_entry(pol, entry, table + i, bydst) { | 898 | hlist_for_each_entry(pol, entry, table + i, bydst) { |
905 | if (pol->type != type) | 899 | if (pol->type != type) |
906 | continue; | 900 | continue; |
907 | error = func(pol, dir % XFRM_POLICY_MAX, --count, data); | 901 | if (last) { |
908 | if (error) | 902 | error = func(last, last_dir % XFRM_POLICY_MAX, |
909 | goto out; | 903 | count, data); |
904 | if (error) | ||
905 | goto out; | ||
906 | } | ||
907 | last = pol; | ||
908 | last_dir = dir; | ||
909 | count++; | ||
910 | } | 910 | } |
911 | } | 911 | } |
912 | } | 912 | } |
913 | error = 0; | 913 | if (count == 0) { |
914 | error = -ENOENT; | ||
915 | goto out; | ||
916 | } | ||
917 | error = func(last, last_dir % XFRM_POLICY_MAX, 0, data); | ||
914 | out: | 918 | out: |
915 | read_unlock_bh(&xfrm_policy_lock); | 919 | read_unlock_bh(&xfrm_policy_lock); |
916 | return error; | 920 | return error; |
@@ -1982,6 +1986,117 @@ int xfrm_bundle_ok(struct xfrm_policy *pol, struct xfrm_dst *first, | |||
1982 | 1986 | ||
1983 | EXPORT_SYMBOL(xfrm_bundle_ok); | 1987 | EXPORT_SYMBOL(xfrm_bundle_ok); |
1984 | 1988 | ||
1989 | #ifdef CONFIG_AUDITSYSCALL | ||
1990 | /* Audit addition and deletion of SAs and ipsec policy */ | ||
1991 | |||
1992 | void xfrm_audit_log(uid_t auid, u32 sid, int type, int result, | ||
1993 | struct xfrm_policy *xp, struct xfrm_state *x) | ||
1994 | { | ||
1995 | |||
1996 | char *secctx; | ||
1997 | u32 secctx_len; | ||
1998 | struct xfrm_sec_ctx *sctx = NULL; | ||
1999 | struct audit_buffer *audit_buf; | ||
2000 | int family; | ||
2001 | extern int audit_enabled; | ||
2002 | |||
2003 | if (audit_enabled == 0) | ||
2004 | return; | ||
2005 | |||
2006 | audit_buf = audit_log_start(current->audit_context, GFP_ATOMIC, type); | ||
2007 | if (audit_buf == NULL) | ||
2008 | return; | ||
2009 | |||
2010 | switch(type) { | ||
2011 | case AUDIT_MAC_IPSEC_ADDSA: | ||
2012 | audit_log_format(audit_buf, "SAD add: auid=%u", auid); | ||
2013 | break; | ||
2014 | case AUDIT_MAC_IPSEC_DELSA: | ||
2015 | audit_log_format(audit_buf, "SAD delete: auid=%u", auid); | ||
2016 | break; | ||
2017 | case AUDIT_MAC_IPSEC_ADDSPD: | ||
2018 | audit_log_format(audit_buf, "SPD add: auid=%u", auid); | ||
2019 | break; | ||
2020 | case AUDIT_MAC_IPSEC_DELSPD: | ||
2021 | audit_log_format(audit_buf, "SPD delete: auid=%u", auid); | ||
2022 | break; | ||
2023 | default: | ||
2024 | return; | ||
2025 | } | ||
2026 | |||
2027 | if (sid != 0 && | ||
2028 | security_secid_to_secctx(sid, &secctx, &secctx_len) == 0) | ||
2029 | audit_log_format(audit_buf, " subj=%s", secctx); | ||
2030 | else | ||
2031 | audit_log_task_context(audit_buf); | ||
2032 | |||
2033 | if (xp) { | ||
2034 | family = xp->selector.family; | ||
2035 | if (xp->security) | ||
2036 | sctx = xp->security; | ||
2037 | } else { | ||
2038 | family = x->props.family; | ||
2039 | if (x->security) | ||
2040 | sctx = x->security; | ||
2041 | } | ||
2042 | |||
2043 | if (sctx) | ||
2044 | audit_log_format(audit_buf, | ||
2045 | " sec_alg=%u sec_doi=%u sec_obj=%s", | ||
2046 | sctx->ctx_alg, sctx->ctx_doi, sctx->ctx_str); | ||
2047 | |||
2048 | switch(family) { | ||
2049 | case AF_INET: | ||
2050 | { | ||
2051 | struct in_addr saddr, daddr; | ||
2052 | if (xp) { | ||
2053 | saddr.s_addr = xp->selector.saddr.a4; | ||
2054 | daddr.s_addr = xp->selector.daddr.a4; | ||
2055 | } else { | ||
2056 | saddr.s_addr = x->props.saddr.a4; | ||
2057 | daddr.s_addr = x->id.daddr.a4; | ||
2058 | } | ||
2059 | audit_log_format(audit_buf, | ||
2060 | " src=%u.%u.%u.%u dst=%u.%u.%u.%u", | ||
2061 | NIPQUAD(saddr), NIPQUAD(daddr)); | ||
2062 | } | ||
2063 | break; | ||
2064 | case AF_INET6: | ||
2065 | { | ||
2066 | struct in6_addr saddr6, daddr6; | ||
2067 | if (xp) { | ||
2068 | memcpy(&saddr6, xp->selector.saddr.a6, | ||
2069 | sizeof(struct in6_addr)); | ||
2070 | memcpy(&daddr6, xp->selector.daddr.a6, | ||
2071 | sizeof(struct in6_addr)); | ||
2072 | } else { | ||
2073 | memcpy(&saddr6, x->props.saddr.a6, | ||
2074 | sizeof(struct in6_addr)); | ||
2075 | memcpy(&daddr6, x->id.daddr.a6, | ||
2076 | sizeof(struct in6_addr)); | ||
2077 | } | ||
2078 | audit_log_format(audit_buf, | ||
2079 | " src=" NIP6_FMT "dst=" NIP6_FMT, | ||
2080 | NIP6(saddr6), NIP6(daddr6)); | ||
2081 | } | ||
2082 | break; | ||
2083 | } | ||
2084 | |||
2085 | if (x) | ||
2086 | audit_log_format(audit_buf, " spi=%lu(0x%lx) protocol=%s", | ||
2087 | (unsigned long)ntohl(x->id.spi), | ||
2088 | (unsigned long)ntohl(x->id.spi), | ||
2089 | x->id.proto == IPPROTO_AH ? "AH" : | ||
2090 | (x->id.proto == IPPROTO_ESP ? | ||
2091 | "ESP" : "IPCOMP")); | ||
2092 | |||
2093 | audit_log_format(audit_buf, " res=%u", result); | ||
2094 | audit_log_end(audit_buf); | ||
2095 | } | ||
2096 | |||
2097 | EXPORT_SYMBOL(xfrm_audit_log); | ||
2098 | #endif /* CONFIG_AUDITSYSCALL */ | ||
2099 | |||
1985 | int xfrm_policy_register_afinfo(struct xfrm_policy_afinfo *afinfo) | 2100 | int xfrm_policy_register_afinfo(struct xfrm_policy_afinfo *afinfo) |
1986 | { | 2101 | { |
1987 | int err = 0; | 2102 | int err = 0; |
diff --git a/net/xfrm/xfrm_state.c b/net/xfrm/xfrm_state.c index da54a64ccfa3..fdb08d9f34aa 100644 --- a/net/xfrm/xfrm_state.c +++ b/net/xfrm/xfrm_state.c | |||
@@ -20,6 +20,7 @@ | |||
20 | #include <linux/module.h> | 20 | #include <linux/module.h> |
21 | #include <linux/cache.h> | 21 | #include <linux/cache.h> |
22 | #include <asm/uaccess.h> | 22 | #include <asm/uaccess.h> |
23 | #include <linux/audit.h> | ||
23 | 24 | ||
24 | #include "xfrm_hash.h" | 25 | #include "xfrm_hash.h" |
25 | 26 | ||
@@ -238,6 +239,7 @@ static void xfrm_timer_handler(unsigned long data) | |||
238 | unsigned long now = (unsigned long)xtime.tv_sec; | 239 | unsigned long now = (unsigned long)xtime.tv_sec; |
239 | long next = LONG_MAX; | 240 | long next = LONG_MAX; |
240 | int warn = 0; | 241 | int warn = 0; |
242 | int err = 0; | ||
241 | 243 | ||
242 | spin_lock(&x->lock); | 244 | spin_lock(&x->lock); |
243 | if (x->km.state == XFRM_STATE_DEAD) | 245 | if (x->km.state == XFRM_STATE_DEAD) |
@@ -295,9 +297,14 @@ expired: | |||
295 | next = 2; | 297 | next = 2; |
296 | goto resched; | 298 | goto resched; |
297 | } | 299 | } |
298 | if (!__xfrm_state_delete(x) && x->id.spi) | 300 | |
301 | err = __xfrm_state_delete(x); | ||
302 | if (!err && x->id.spi) | ||
299 | km_state_expired(x, 1, 0); | 303 | km_state_expired(x, 1, 0); |
300 | 304 | ||
305 | xfrm_audit_log(audit_get_loginuid(current->audit_context), 0, | ||
306 | AUDIT_MAC_IPSEC_DELSA, err ? 0 : 1, NULL, x); | ||
307 | |||
301 | out: | 308 | out: |
302 | spin_unlock(&x->lock); | 309 | spin_unlock(&x->lock); |
303 | } | 310 | } |
@@ -384,9 +391,10 @@ int xfrm_state_delete(struct xfrm_state *x) | |||
384 | } | 391 | } |
385 | EXPORT_SYMBOL(xfrm_state_delete); | 392 | EXPORT_SYMBOL(xfrm_state_delete); |
386 | 393 | ||
387 | void xfrm_state_flush(u8 proto) | 394 | void xfrm_state_flush(u8 proto, struct xfrm_audit *audit_info) |
388 | { | 395 | { |
389 | int i; | 396 | int i; |
397 | int err = 0; | ||
390 | 398 | ||
391 | spin_lock_bh(&xfrm_state_lock); | 399 | spin_lock_bh(&xfrm_state_lock); |
392 | for (i = 0; i <= xfrm_state_hmask; i++) { | 400 | for (i = 0; i <= xfrm_state_hmask; i++) { |
@@ -399,7 +407,11 @@ restart: | |||
399 | xfrm_state_hold(x); | 407 | xfrm_state_hold(x); |
400 | spin_unlock_bh(&xfrm_state_lock); | 408 | spin_unlock_bh(&xfrm_state_lock); |
401 | 409 | ||
402 | xfrm_state_delete(x); | 410 | err = xfrm_state_delete(x); |
411 | xfrm_audit_log(audit_info->loginuid, | ||
412 | audit_info->secid, | ||
413 | AUDIT_MAC_IPSEC_DELSA, | ||
414 | err ? 0 : 1, NULL, x); | ||
403 | xfrm_state_put(x); | 415 | xfrm_state_put(x); |
404 | 416 | ||
405 | spin_lock_bh(&xfrm_state_lock); | 417 | spin_lock_bh(&xfrm_state_lock); |
@@ -1099,7 +1111,7 @@ int xfrm_state_walk(u8 proto, int (*func)(struct xfrm_state *, int, void*), | |||
1099 | void *data) | 1111 | void *data) |
1100 | { | 1112 | { |
1101 | int i; | 1113 | int i; |
1102 | struct xfrm_state *x; | 1114 | struct xfrm_state *x, *last = NULL; |
1103 | struct hlist_node *entry; | 1115 | struct hlist_node *entry; |
1104 | int count = 0; | 1116 | int count = 0; |
1105 | int err = 0; | 1117 | int err = 0; |
@@ -1107,24 +1119,22 @@ int xfrm_state_walk(u8 proto, int (*func)(struct xfrm_state *, int, void*), | |||
1107 | spin_lock_bh(&xfrm_state_lock); | 1119 | spin_lock_bh(&xfrm_state_lock); |
1108 | for (i = 0; i <= xfrm_state_hmask; i++) { | 1120 | for (i = 0; i <= xfrm_state_hmask; i++) { |
1109 | hlist_for_each_entry(x, entry, xfrm_state_bydst+i, bydst) { | 1121 | hlist_for_each_entry(x, entry, xfrm_state_bydst+i, bydst) { |
1110 | if (xfrm_id_proto_match(x->id.proto, proto)) | 1122 | if (!xfrm_id_proto_match(x->id.proto, proto)) |
1111 | count++; | 1123 | continue; |
1124 | if (last) { | ||
1125 | err = func(last, count, data); | ||
1126 | if (err) | ||
1127 | goto out; | ||
1128 | } | ||
1129 | last = x; | ||
1130 | count++; | ||
1112 | } | 1131 | } |
1113 | } | 1132 | } |
1114 | if (count == 0) { | 1133 | if (count == 0) { |
1115 | err = -ENOENT; | 1134 | err = -ENOENT; |
1116 | goto out; | 1135 | goto out; |
1117 | } | 1136 | } |
1118 | 1137 | err = func(last, 0, data); | |
1119 | for (i = 0; i <= xfrm_state_hmask; i++) { | ||
1120 | hlist_for_each_entry(x, entry, xfrm_state_bydst+i, bydst) { | ||
1121 | if (!xfrm_id_proto_match(x->id.proto, proto)) | ||
1122 | continue; | ||
1123 | err = func(x, --count, data); | ||
1124 | if (err) | ||
1125 | goto out; | ||
1126 | } | ||
1127 | } | ||
1128 | out: | 1138 | out: |
1129 | spin_unlock_bh(&xfrm_state_lock); | 1139 | spin_unlock_bh(&xfrm_state_lock); |
1130 | return err; | 1140 | return err; |
diff --git a/net/xfrm/xfrm_user.c b/net/xfrm/xfrm_user.c index 311205ffa775..e5372b11fc8f 100644 --- a/net/xfrm/xfrm_user.c +++ b/net/xfrm/xfrm_user.c | |||
@@ -31,6 +31,7 @@ | |||
31 | #if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE) | 31 | #if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE) |
32 | #include <linux/in6.h> | 32 | #include <linux/in6.h> |
33 | #endif | 33 | #endif |
34 | #include <linux/audit.h> | ||
34 | 35 | ||
35 | static int verify_one_alg(struct rtattr **xfrma, enum xfrm_attr_type_t type) | 36 | static int verify_one_alg(struct rtattr **xfrma, enum xfrm_attr_type_t type) |
36 | { | 37 | { |
@@ -454,6 +455,9 @@ static int xfrm_add_sa(struct sk_buff *skb, struct nlmsghdr *nlh, void **xfrma) | |||
454 | else | 455 | else |
455 | err = xfrm_state_update(x); | 456 | err = xfrm_state_update(x); |
456 | 457 | ||
458 | xfrm_audit_log(NETLINK_CB(skb).loginuid, NETLINK_CB(skb).sid, | ||
459 | AUDIT_MAC_IPSEC_ADDSA, err ? 0 : 1, NULL, x); | ||
460 | |||
457 | if (err < 0) { | 461 | if (err < 0) { |
458 | x->km.state = XFRM_STATE_DEAD; | 462 | x->km.state = XFRM_STATE_DEAD; |
459 | __xfrm_state_put(x); | 463 | __xfrm_state_put(x); |
@@ -523,6 +527,10 @@ static int xfrm_del_sa(struct sk_buff *skb, struct nlmsghdr *nlh, void **xfrma) | |||
523 | } | 527 | } |
524 | 528 | ||
525 | err = xfrm_state_delete(x); | 529 | err = xfrm_state_delete(x); |
530 | |||
531 | xfrm_audit_log(NETLINK_CB(skb).loginuid, NETLINK_CB(skb).sid, | ||
532 | AUDIT_MAC_IPSEC_DELSA, err ? 0 : 1, NULL, x); | ||
533 | |||
526 | if (err < 0) | 534 | if (err < 0) |
527 | goto out; | 535 | goto out; |
528 | 536 | ||
@@ -1030,6 +1038,9 @@ static int xfrm_add_policy(struct sk_buff *skb, struct nlmsghdr *nlh, void **xfr | |||
1030 | * a type XFRM_MSG_UPDPOLICY - JHS */ | 1038 | * a type XFRM_MSG_UPDPOLICY - JHS */ |
1031 | excl = nlh->nlmsg_type == XFRM_MSG_NEWPOLICY; | 1039 | excl = nlh->nlmsg_type == XFRM_MSG_NEWPOLICY; |
1032 | err = xfrm_policy_insert(p->dir, xp, excl); | 1040 | err = xfrm_policy_insert(p->dir, xp, excl); |
1041 | xfrm_audit_log(NETLINK_CB(skb).loginuid, NETLINK_CB(skb).sid, | ||
1042 | AUDIT_MAC_IPSEC_DELSPD, err ? 0 : 1, xp, NULL); | ||
1043 | |||
1033 | if (err) { | 1044 | if (err) { |
1034 | security_xfrm_policy_free(xp); | 1045 | security_xfrm_policy_free(xp); |
1035 | kfree(xp); | 1046 | kfree(xp); |
@@ -1257,6 +1268,10 @@ static int xfrm_get_policy(struct sk_buff *skb, struct nlmsghdr *nlh, void **xfr | |||
1257 | xp = xfrm_policy_bysel_ctx(type, p->dir, &p->sel, tmp.security, delete); | 1268 | xp = xfrm_policy_bysel_ctx(type, p->dir, &p->sel, tmp.security, delete); |
1258 | security_xfrm_policy_free(&tmp); | 1269 | security_xfrm_policy_free(&tmp); |
1259 | } | 1270 | } |
1271 | if (delete) | ||
1272 | xfrm_audit_log(NETLINK_CB(skb).loginuid, NETLINK_CB(skb).sid, | ||
1273 | AUDIT_MAC_IPSEC_DELSPD, (xp) ? 1 : 0, xp, NULL); | ||
1274 | |||
1260 | if (xp == NULL) | 1275 | if (xp == NULL) |
1261 | return -ENOENT; | 1276 | return -ENOENT; |
1262 | 1277 | ||
@@ -1291,8 +1306,11 @@ static int xfrm_flush_sa(struct sk_buff *skb, struct nlmsghdr *nlh, void **xfrma | |||
1291 | { | 1306 | { |
1292 | struct km_event c; | 1307 | struct km_event c; |
1293 | struct xfrm_usersa_flush *p = NLMSG_DATA(nlh); | 1308 | struct xfrm_usersa_flush *p = NLMSG_DATA(nlh); |
1309 | struct xfrm_audit audit_info; | ||
1294 | 1310 | ||
1295 | xfrm_state_flush(p->proto); | 1311 | audit_info.loginuid = NETLINK_CB(skb).loginuid; |
1312 | audit_info.secid = NETLINK_CB(skb).sid; | ||
1313 | xfrm_state_flush(p->proto, &audit_info); | ||
1296 | c.data.proto = p->proto; | 1314 | c.data.proto = p->proto; |
1297 | c.event = nlh->nlmsg_type; | 1315 | c.event = nlh->nlmsg_type; |
1298 | c.seq = nlh->nlmsg_seq; | 1316 | c.seq = nlh->nlmsg_seq; |
@@ -1442,12 +1460,15 @@ static int xfrm_flush_policy(struct sk_buff *skb, struct nlmsghdr *nlh, void **x | |||
1442 | struct km_event c; | 1460 | struct km_event c; |
1443 | u8 type = XFRM_POLICY_TYPE_MAIN; | 1461 | u8 type = XFRM_POLICY_TYPE_MAIN; |
1444 | int err; | 1462 | int err; |
1463 | struct xfrm_audit audit_info; | ||
1445 | 1464 | ||
1446 | err = copy_from_user_policy_type(&type, (struct rtattr **)xfrma); | 1465 | err = copy_from_user_policy_type(&type, (struct rtattr **)xfrma); |
1447 | if (err) | 1466 | if (err) |
1448 | return err; | 1467 | return err; |
1449 | 1468 | ||
1450 | xfrm_policy_flush(type); | 1469 | audit_info.loginuid = NETLINK_CB(skb).loginuid; |
1470 | audit_info.secid = NETLINK_CB(skb).sid; | ||
1471 | xfrm_policy_flush(type, &audit_info); | ||
1451 | c.data.type = type; | 1472 | c.data.type = type; |
1452 | c.event = nlh->nlmsg_type; | 1473 | c.event = nlh->nlmsg_type; |
1453 | c.seq = nlh->nlmsg_seq; | 1474 | c.seq = nlh->nlmsg_seq; |
@@ -1502,6 +1523,9 @@ static int xfrm_add_pol_expire(struct sk_buff *skb, struct nlmsghdr *nlh, void * | |||
1502 | err = 0; | 1523 | err = 0; |
1503 | if (up->hard) { | 1524 | if (up->hard) { |
1504 | xfrm_policy_delete(xp, p->dir); | 1525 | xfrm_policy_delete(xp, p->dir); |
1526 | xfrm_audit_log(NETLINK_CB(skb).loginuid, NETLINK_CB(skb).sid, | ||
1527 | AUDIT_MAC_IPSEC_DELSPD, 1, xp, NULL); | ||
1528 | |||
1505 | } else { | 1529 | } else { |
1506 | // reset the timers here? | 1530 | // reset the timers here? |
1507 | printk("Dont know what to do with soft policy expire\n"); | 1531 | printk("Dont know what to do with soft policy expire\n"); |
@@ -1533,8 +1557,11 @@ static int xfrm_add_sa_expire(struct sk_buff *skb, struct nlmsghdr *nlh, void ** | |||
1533 | goto out; | 1557 | goto out; |
1534 | km_state_expired(x, ue->hard, current->pid); | 1558 | km_state_expired(x, ue->hard, current->pid); |
1535 | 1559 | ||
1536 | if (ue->hard) | 1560 | if (ue->hard) { |
1537 | __xfrm_state_delete(x); | 1561 | __xfrm_state_delete(x); |
1562 | xfrm_audit_log(NETLINK_CB(skb).loginuid, NETLINK_CB(skb).sid, | ||
1563 | AUDIT_MAC_IPSEC_DELSA, 1, NULL, x); | ||
1564 | } | ||
1538 | out: | 1565 | out: |
1539 | spin_unlock_bh(&x->lock); | 1566 | spin_unlock_bh(&x->lock); |
1540 | xfrm_state_put(x); | 1567 | xfrm_state_put(x); |