.. | .. |
---|
61 | 61 | return x >> (n << 3); |
---|
62 | 62 | } |
---|
63 | 63 | |
---|
64 | | -static const u32 rco_tab[10] = { 1, 2, 4, 8, 16, 32, 64, 128, 27, 54 }; |
---|
65 | | - |
---|
66 | 64 | /* cacheline-aligned to facilitate prefetching into cache */ |
---|
67 | | -__visible const u32 crypto_ft_tab[4][256] __cacheline_aligned = { |
---|
| 65 | +__visible const u32 crypto_ft_tab[4][256] ____cacheline_aligned = { |
---|
68 | 66 | { |
---|
69 | 67 | 0xa56363c6, 0x847c7cf8, 0x997777ee, 0x8d7b7bf6, |
---|
70 | 68 | 0x0df2f2ff, 0xbd6b6bd6, 0xb16f6fde, 0x54c5c591, |
---|
.. | .. |
---|
328 | 326 | } |
---|
329 | 327 | }; |
---|
330 | 328 | |
---|
331 | | -__visible const u32 crypto_fl_tab[4][256] __cacheline_aligned = { |
---|
| 329 | +static const u32 crypto_fl_tab[4][256] ____cacheline_aligned = { |
---|
332 | 330 | { |
---|
333 | 331 | 0x00000063, 0x0000007c, 0x00000077, 0x0000007b, |
---|
334 | 332 | 0x000000f2, 0x0000006b, 0x0000006f, 0x000000c5, |
---|
.. | .. |
---|
592 | 590 | } |
---|
593 | 591 | }; |
---|
594 | 592 | |
---|
595 | | -__visible const u32 crypto_it_tab[4][256] __cacheline_aligned = { |
---|
| 593 | +__visible const u32 crypto_it_tab[4][256] ____cacheline_aligned = { |
---|
596 | 594 | { |
---|
597 | 595 | 0x50a7f451, 0x5365417e, 0xc3a4171a, 0x965e273a, |
---|
598 | 596 | 0xcb6bab3b, 0xf1459d1f, 0xab58faac, 0x9303e34b, |
---|
.. | .. |
---|
856 | 854 | } |
---|
857 | 855 | }; |
---|
858 | 856 | |
---|
859 | | -__visible const u32 crypto_il_tab[4][256] __cacheline_aligned = { |
---|
| 857 | +static const u32 crypto_il_tab[4][256] ____cacheline_aligned = { |
---|
860 | 858 | { |
---|
861 | 859 | 0x00000052, 0x00000009, 0x0000006a, 0x000000d5, |
---|
862 | 860 | 0x00000030, 0x00000036, 0x000000a5, 0x00000038, |
---|
.. | .. |
---|
1121 | 1119 | }; |
---|
1122 | 1120 | |
---|
1123 | 1121 | EXPORT_SYMBOL_GPL(crypto_ft_tab); |
---|
1124 | | -EXPORT_SYMBOL_GPL(crypto_fl_tab); |
---|
1125 | 1122 | EXPORT_SYMBOL_GPL(crypto_it_tab); |
---|
1126 | | -EXPORT_SYMBOL_GPL(crypto_il_tab); |
---|
1127 | | - |
---|
1128 | | -/* initialise the key schedule from the user supplied key */ |
---|
1129 | | - |
---|
1130 | | -#define star_x(x) (((x) & 0x7f7f7f7f) << 1) ^ ((((x) & 0x80808080) >> 7) * 0x1b) |
---|
1131 | | - |
---|
1132 | | -#define imix_col(y, x) do { \ |
---|
1133 | | - u = star_x(x); \ |
---|
1134 | | - v = star_x(u); \ |
---|
1135 | | - w = star_x(v); \ |
---|
1136 | | - t = w ^ (x); \ |
---|
1137 | | - (y) = u ^ v ^ w; \ |
---|
1138 | | - (y) ^= ror32(u ^ t, 8) ^ \ |
---|
1139 | | - ror32(v ^ t, 16) ^ \ |
---|
1140 | | - ror32(t, 24); \ |
---|
1141 | | -} while (0) |
---|
1142 | | - |
---|
1143 | | -#define ls_box(x) \ |
---|
1144 | | - crypto_fl_tab[0][byte(x, 0)] ^ \ |
---|
1145 | | - crypto_fl_tab[1][byte(x, 1)] ^ \ |
---|
1146 | | - crypto_fl_tab[2][byte(x, 2)] ^ \ |
---|
1147 | | - crypto_fl_tab[3][byte(x, 3)] |
---|
1148 | | - |
---|
1149 | | -#define loop4(i) do { \ |
---|
1150 | | - t = ror32(t, 8); \ |
---|
1151 | | - t = ls_box(t) ^ rco_tab[i]; \ |
---|
1152 | | - t ^= ctx->key_enc[4 * i]; \ |
---|
1153 | | - ctx->key_enc[4 * i + 4] = t; \ |
---|
1154 | | - t ^= ctx->key_enc[4 * i + 1]; \ |
---|
1155 | | - ctx->key_enc[4 * i + 5] = t; \ |
---|
1156 | | - t ^= ctx->key_enc[4 * i + 2]; \ |
---|
1157 | | - ctx->key_enc[4 * i + 6] = t; \ |
---|
1158 | | - t ^= ctx->key_enc[4 * i + 3]; \ |
---|
1159 | | - ctx->key_enc[4 * i + 7] = t; \ |
---|
1160 | | -} while (0) |
---|
1161 | | - |
---|
1162 | | -#define loop6(i) do { \ |
---|
1163 | | - t = ror32(t, 8); \ |
---|
1164 | | - t = ls_box(t) ^ rco_tab[i]; \ |
---|
1165 | | - t ^= ctx->key_enc[6 * i]; \ |
---|
1166 | | - ctx->key_enc[6 * i + 6] = t; \ |
---|
1167 | | - t ^= ctx->key_enc[6 * i + 1]; \ |
---|
1168 | | - ctx->key_enc[6 * i + 7] = t; \ |
---|
1169 | | - t ^= ctx->key_enc[6 * i + 2]; \ |
---|
1170 | | - ctx->key_enc[6 * i + 8] = t; \ |
---|
1171 | | - t ^= ctx->key_enc[6 * i + 3]; \ |
---|
1172 | | - ctx->key_enc[6 * i + 9] = t; \ |
---|
1173 | | - t ^= ctx->key_enc[6 * i + 4]; \ |
---|
1174 | | - ctx->key_enc[6 * i + 10] = t; \ |
---|
1175 | | - t ^= ctx->key_enc[6 * i + 5]; \ |
---|
1176 | | - ctx->key_enc[6 * i + 11] = t; \ |
---|
1177 | | -} while (0) |
---|
1178 | | - |
---|
1179 | | -#define loop8tophalf(i) do { \ |
---|
1180 | | - t = ror32(t, 8); \ |
---|
1181 | | - t = ls_box(t) ^ rco_tab[i]; \ |
---|
1182 | | - t ^= ctx->key_enc[8 * i]; \ |
---|
1183 | | - ctx->key_enc[8 * i + 8] = t; \ |
---|
1184 | | - t ^= ctx->key_enc[8 * i + 1]; \ |
---|
1185 | | - ctx->key_enc[8 * i + 9] = t; \ |
---|
1186 | | - t ^= ctx->key_enc[8 * i + 2]; \ |
---|
1187 | | - ctx->key_enc[8 * i + 10] = t; \ |
---|
1188 | | - t ^= ctx->key_enc[8 * i + 3]; \ |
---|
1189 | | - ctx->key_enc[8 * i + 11] = t; \ |
---|
1190 | | -} while (0) |
---|
1191 | | - |
---|
1192 | | -#define loop8(i) do { \ |
---|
1193 | | - loop8tophalf(i); \ |
---|
1194 | | - t = ctx->key_enc[8 * i + 4] ^ ls_box(t); \ |
---|
1195 | | - ctx->key_enc[8 * i + 12] = t; \ |
---|
1196 | | - t ^= ctx->key_enc[8 * i + 5]; \ |
---|
1197 | | - ctx->key_enc[8 * i + 13] = t; \ |
---|
1198 | | - t ^= ctx->key_enc[8 * i + 6]; \ |
---|
1199 | | - ctx->key_enc[8 * i + 14] = t; \ |
---|
1200 | | - t ^= ctx->key_enc[8 * i + 7]; \ |
---|
1201 | | - ctx->key_enc[8 * i + 15] = t; \ |
---|
1202 | | -} while (0) |
---|
1203 | | - |
---|
1204 | | -/** |
---|
1205 | | - * crypto_aes_expand_key - Expands the AES key as described in FIPS-197 |
---|
1206 | | - * @ctx: The location where the computed key will be stored. |
---|
1207 | | - * @in_key: The supplied key. |
---|
1208 | | - * @key_len: The length of the supplied key. |
---|
1209 | | - * |
---|
1210 | | - * Returns 0 on success. The function fails only if an invalid key size (or |
---|
1211 | | - * pointer) is supplied. |
---|
1212 | | - * The expanded key size is 240 bytes (max of 14 rounds with a unique 16 bytes |
---|
1213 | | - * key schedule plus a 16 bytes key which is used before the first round). |
---|
1214 | | - * The decryption key is prepared for the "Equivalent Inverse Cipher" as |
---|
1215 | | - * described in FIPS-197. The first slot (16 bytes) of each key (enc or dec) is |
---|
1216 | | - * for the initial combination, the second slot for the first round and so on. |
---|
1217 | | - */ |
---|
1218 | | -int crypto_aes_expand_key(struct crypto_aes_ctx *ctx, const u8 *in_key, |
---|
1219 | | - unsigned int key_len) |
---|
1220 | | -{ |
---|
1221 | | - u32 i, t, u, v, w, j; |
---|
1222 | | - |
---|
1223 | | - if (key_len != AES_KEYSIZE_128 && key_len != AES_KEYSIZE_192 && |
---|
1224 | | - key_len != AES_KEYSIZE_256) |
---|
1225 | | - return -EINVAL; |
---|
1226 | | - |
---|
1227 | | - ctx->key_length = key_len; |
---|
1228 | | - |
---|
1229 | | - ctx->key_enc[0] = get_unaligned_le32(in_key); |
---|
1230 | | - ctx->key_enc[1] = get_unaligned_le32(in_key + 4); |
---|
1231 | | - ctx->key_enc[2] = get_unaligned_le32(in_key + 8); |
---|
1232 | | - ctx->key_enc[3] = get_unaligned_le32(in_key + 12); |
---|
1233 | | - |
---|
1234 | | - ctx->key_dec[key_len + 24] = ctx->key_enc[0]; |
---|
1235 | | - ctx->key_dec[key_len + 25] = ctx->key_enc[1]; |
---|
1236 | | - ctx->key_dec[key_len + 26] = ctx->key_enc[2]; |
---|
1237 | | - ctx->key_dec[key_len + 27] = ctx->key_enc[3]; |
---|
1238 | | - |
---|
1239 | | - switch (key_len) { |
---|
1240 | | - case AES_KEYSIZE_128: |
---|
1241 | | - t = ctx->key_enc[3]; |
---|
1242 | | - for (i = 0; i < 10; ++i) |
---|
1243 | | - loop4(i); |
---|
1244 | | - break; |
---|
1245 | | - |
---|
1246 | | - case AES_KEYSIZE_192: |
---|
1247 | | - ctx->key_enc[4] = get_unaligned_le32(in_key + 16); |
---|
1248 | | - t = ctx->key_enc[5] = get_unaligned_le32(in_key + 20); |
---|
1249 | | - for (i = 0; i < 8; ++i) |
---|
1250 | | - loop6(i); |
---|
1251 | | - break; |
---|
1252 | | - |
---|
1253 | | - case AES_KEYSIZE_256: |
---|
1254 | | - ctx->key_enc[4] = get_unaligned_le32(in_key + 16); |
---|
1255 | | - ctx->key_enc[5] = get_unaligned_le32(in_key + 20); |
---|
1256 | | - ctx->key_enc[6] = get_unaligned_le32(in_key + 24); |
---|
1257 | | - t = ctx->key_enc[7] = get_unaligned_le32(in_key + 28); |
---|
1258 | | - for (i = 0; i < 6; ++i) |
---|
1259 | | - loop8(i); |
---|
1260 | | - loop8tophalf(i); |
---|
1261 | | - break; |
---|
1262 | | - } |
---|
1263 | | - |
---|
1264 | | - ctx->key_dec[0] = ctx->key_enc[key_len + 24]; |
---|
1265 | | - ctx->key_dec[1] = ctx->key_enc[key_len + 25]; |
---|
1266 | | - ctx->key_dec[2] = ctx->key_enc[key_len + 26]; |
---|
1267 | | - ctx->key_dec[3] = ctx->key_enc[key_len + 27]; |
---|
1268 | | - |
---|
1269 | | - for (i = 4; i < key_len + 24; ++i) { |
---|
1270 | | - j = key_len + 24 - (i & ~3) + (i & 3); |
---|
1271 | | - imix_col(ctx->key_dec[j], ctx->key_enc[i]); |
---|
1272 | | - } |
---|
1273 | | - return 0; |
---|
1274 | | -} |
---|
1275 | | -EXPORT_SYMBOL_GPL(crypto_aes_expand_key); |
---|
1276 | 1123 | |
---|
1277 | 1124 | /** |
---|
1278 | 1125 | * crypto_aes_set_key - Set the AES key. |
---|
.. | .. |
---|
1280 | 1127 | * @in_key: The input key. |
---|
1281 | 1128 | * @key_len: The size of the key. |
---|
1282 | 1129 | * |
---|
1283 | | - * Returns 0 on success, on failure the %CRYPTO_TFM_RES_BAD_KEY_LEN flag in tfm |
---|
1284 | | - * is set. The function uses crypto_aes_expand_key() to expand the key. |
---|
1285 | | - * &crypto_aes_ctx _must_ be the private data embedded in @tfm which is |
---|
1286 | | - * retrieved with crypto_tfm_ctx(). |
---|
| 1130 | + * This function uses aes_expand_key() to expand the key. &crypto_aes_ctx |
---|
| 1131 | + * _must_ be the private data embedded in @tfm which is retrieved with |
---|
| 1132 | + * crypto_tfm_ctx(). |
---|
| 1133 | + * |
---|
| 1134 | + * Return: 0 on success; -EINVAL on failure (only happens for bad key lengths) |
---|
1287 | 1135 | */ |
---|
1288 | 1136 | int crypto_aes_set_key(struct crypto_tfm *tfm, const u8 *in_key, |
---|
1289 | 1137 | unsigned int key_len) |
---|
1290 | 1138 | { |
---|
1291 | 1139 | struct crypto_aes_ctx *ctx = crypto_tfm_ctx(tfm); |
---|
1292 | | - u32 *flags = &tfm->crt_flags; |
---|
1293 | | - int ret; |
---|
1294 | 1140 | |
---|
1295 | | - ret = crypto_aes_expand_key(ctx, in_key, key_len); |
---|
1296 | | - if (!ret) |
---|
1297 | | - return 0; |
---|
1298 | | - |
---|
1299 | | - *flags |= CRYPTO_TFM_RES_BAD_KEY_LEN; |
---|
1300 | | - return -EINVAL; |
---|
| 1141 | + return aes_expandkey(ctx, in_key, key_len); |
---|
1301 | 1142 | } |
---|
1302 | 1143 | EXPORT_SYMBOL_GPL(crypto_aes_set_key); |
---|
1303 | 1144 | |
---|
.. | .. |
---|
1332 | 1173 | f_rl(bo, bi, 3, k); \ |
---|
1333 | 1174 | } while (0) |
---|
1334 | 1175 | |
---|
1335 | | -static void aes_encrypt(struct crypto_tfm *tfm, u8 *out, const u8 *in) |
---|
| 1176 | +static void crypto_aes_encrypt(struct crypto_tfm *tfm, u8 *out, const u8 *in) |
---|
1336 | 1177 | { |
---|
1337 | 1178 | const struct crypto_aes_ctx *ctx = crypto_tfm_ctx(tfm); |
---|
1338 | 1179 | u32 b0[4], b1[4]; |
---|
.. | .. |
---|
1402 | 1243 | i_rl(bo, bi, 3, k); \ |
---|
1403 | 1244 | } while (0) |
---|
1404 | 1245 | |
---|
1405 | | -static void aes_decrypt(struct crypto_tfm *tfm, u8 *out, const u8 *in) |
---|
| 1246 | +static void crypto_aes_decrypt(struct crypto_tfm *tfm, u8 *out, const u8 *in) |
---|
1406 | 1247 | { |
---|
1407 | 1248 | const struct crypto_aes_ctx *ctx = crypto_tfm_ctx(tfm); |
---|
1408 | 1249 | u32 b0[4], b1[4]; |
---|
.. | .. |
---|
1454 | 1295 | .cia_min_keysize = AES_MIN_KEY_SIZE, |
---|
1455 | 1296 | .cia_max_keysize = AES_MAX_KEY_SIZE, |
---|
1456 | 1297 | .cia_setkey = crypto_aes_set_key, |
---|
1457 | | - .cia_encrypt = aes_encrypt, |
---|
1458 | | - .cia_decrypt = aes_decrypt |
---|
| 1298 | + .cia_encrypt = crypto_aes_encrypt, |
---|
| 1299 | + .cia_decrypt = crypto_aes_decrypt |
---|
1459 | 1300 | } |
---|
1460 | 1301 | } |
---|
1461 | 1302 | }; |
---|
.. | .. |
---|
1470 | 1311 | crypto_unregister_alg(&aes_alg); |
---|
1471 | 1312 | } |
---|
1472 | 1313 | |
---|
1473 | | -module_init(aes_init); |
---|
| 1314 | +subsys_initcall(aes_init); |
---|
1474 | 1315 | module_exit(aes_fini); |
---|
1475 | 1316 | |
---|
1476 | 1317 | MODULE_DESCRIPTION("Rijndael (AES) Cipher Algorithm"); |
---|