Commit a5c660e6 authored by James Morris's avatar James Morris

[CRYPTO]: Add in 3des implementation.

parent c7f36a27
......@@ -11,7 +11,7 @@ CONFIG_CRYPTO_SHA1
SHA-1 secure hash standard (FIPS 180-1), including HMAC (RFC2104, RFC2404).
CONFIG_CRYPTO_DES
DES cipher algorithm (FIPS 46-2), and 3DES_EDE.
DES cipher algorithm (FIPS 46-2), and Triple DES EDE (FIPS 46-3).
CONFIG_CRYPTO_TEST
Quick & dirty crypto test module.
......
......@@ -8,7 +8,7 @@ bool 'Cryptographic API' CONFIG_CRYPTO
if [ "$CONFIG_CRYPTO" = "y" ]; then
tristate ' MD5 digest algorithm' CONFIG_CRYPTO_MD5
tristate ' SHA-1 digest algorithm' CONFIG_CRYPTO_SHA1
tristate ' DES/3DES cipher algorithms' CONFIG_CRYPTO_DES
tristate ' DES and Triple DES EDE cipher algorithms' CONFIG_CRYPTO_DES
tristate ' Testing module' CONFIG_CRYPTO_TEST
fi
......
/*
* Cryptographic API.
*
* DES & 3DES_EDE Cipher Algorithms.
* DES & Triple DES EDE Cipher Algorithms.
*
* Originally released as descore by Dana L. How <how@isl.stanford.edu>.
* Modified by Raimar Falke <rf13@inf.tu-dresden.de> for the Linux-Kernel.
......@@ -27,11 +27,25 @@
#include <linux/crypto.h>
#define DES_KEY_SIZE 8
#define DES_KEY_SIZE_WORDS 2
#define DES_EXPKEY_WORDS 32
#define DES_BLOCK_SIZE 8
#define DES3_EDE_KEY_SIZE (3 * DES_KEY_SIZE)
#define DES3_EDE_EXPKEY_WORDS (3 * DES_EXPKEY_WORDS)
#define DES3_EDE_BLOCK_SIZE DES_BLOCK_SIZE
#define ROR(d,c,o) ((d) = (d) >> (c) | (d) << (o))
struct des_ctx {
__u8 iv[DES_BLOCK_SIZE];
__u32 expkey[DES_EXPKEY_WORDS];
};
struct des3_ede_ctx {
__u8 iv[DES_BLOCK_SIZE];
__u32 expkey[DES3_EDE_EXPKEY_WORDS];
};
const static __u32 des_keymap[] = {
0x02080008, 0x02082000, 0x00002008, 0x00000000,
0x02002000, 0x00080008, 0x02080000, 0x02082008,
......@@ -263,30 +277,25 @@ const static char parity[] = {
4,8,8,0,8,0,0,8,8,0,0,8,0,8,8,0,8,5,0,8,0,8,8,0,0,8,8,0,8,0,6,8,
};
struct des_ctx {
__u8 iv[DES_BLOCK_SIZE];
__u32 keyinfo[32];
};
static void des_small_fips_encrypt(void *ctx, __u8 *dst, __u8 *src)
static void des_small_fips_encrypt(__u32 *expkey, __u8 *dst, __u8 *src)
{
__u32 *keyinfo = ((struct des_ctx *)ctx)->keyinfo;
__u32 x, y, z;
x = src [7];
x = src[7];
x <<= 8;
x |= src [6];
x |= src[6];
x <<= 8;
x |= src [5];
x |= src[5];
x <<= 8;
x |= src [4];
y = src [3];
x |= src[4];
y = src[3];
y <<= 8;
y |= src [2];
y |= src[2];
y <<= 8;
y |= src [1];
y |= src[1];
y <<= 8;
y |= src [0];
y |= src[0];
z = ((x >> 004) ^ y) & 0x0F0F0F0FL;
x ^= z << 004;
y ^= z;
......@@ -304,7 +313,7 @@ static void des_small_fips_encrypt(void *ctx, __u8 *dst, __u8 *src)
y ^= z;
x ^= z;
y = y >> 1 | y << 31;
z = keyinfo [0];
z = expkey[0];
z ^= y;
x ^= * (__u32 *) ((u8 *) (des_keymap + 192) + (0xFC & z));
z >>= 8;
......@@ -313,7 +322,7 @@ static void des_small_fips_encrypt(void *ctx, __u8 *dst, __u8 *src)
x ^= * (__u32 *) ((u8 *) (des_keymap + 64) + (0xFC & z));
z >>= 8;
x ^= * (__u32 *) ((u8 *) des_keymap + (0xFC & z));
z = keyinfo [1];
z = expkey[1];
z ^= y;
z = z << 4 | z >> 28;
x ^= * (__u32 *) ((u8 *) (des_keymap + 448) + (0xFC & z));
......@@ -323,7 +332,7 @@ static void des_small_fips_encrypt(void *ctx, __u8 *dst, __u8 *src)
x ^= * (__u32 *) ((u8 *) (des_keymap + 320) + (0xFC & z));
z >>= 8;
x ^= * (__u32 *) ((u8 *) (des_keymap + 256) + (0xFC & z));
z = keyinfo [2];
z = expkey[2];
z ^= x;
y ^= * (__u32 *) ((u8 *) (des_keymap + 192) + (0xFC & z));
z >>= 8;
......@@ -332,7 +341,7 @@ static void des_small_fips_encrypt(void *ctx, __u8 *dst, __u8 *src)
y ^= * (__u32 *) ((u8 *) (des_keymap + 64) + (0xFC & z));
z >>= 8;
y ^= * (__u32 *) ((u8 *) des_keymap + (0xFC & z));
z = keyinfo [3];
z = expkey[3];
z ^= x;
z = z << 4 | z >> 28;
y ^= * (__u32 *) ((u8 *) (des_keymap + 448) + (0xFC & z));
......@@ -342,7 +351,7 @@ static void des_small_fips_encrypt(void *ctx, __u8 *dst, __u8 *src)
y ^= * (__u32 *) ((u8 *) (des_keymap + 320) + (0xFC & z));
z >>= 8;
y ^= * (__u32 *) ((u8 *) (des_keymap + 256) + (0xFC & z));
z = keyinfo [4];
z = expkey[4];
z ^= y;
x ^= * (__u32 *) ((u8 *) (des_keymap + 192) + (0xFC & z));
z >>= 8;
......@@ -351,7 +360,7 @@ static void des_small_fips_encrypt(void *ctx, __u8 *dst, __u8 *src)
x ^= * (__u32 *) ((u8 *) (des_keymap + 64) + (0xFC & z));
z >>= 8;
x ^= * (__u32 *) ((u8 *) des_keymap + (0xFC & z));
z = keyinfo [5];
z = expkey[5];
z ^= y;
z = z << 4 | z >> 28;
x ^= * (__u32 *) ((u8 *) (des_keymap + 448) + (0xFC & z));
......@@ -361,7 +370,7 @@ static void des_small_fips_encrypt(void *ctx, __u8 *dst, __u8 *src)
x ^= * (__u32 *) ((u8 *) (des_keymap + 320) + (0xFC & z));
z >>= 8;
x ^= * (__u32 *) ((u8 *) (des_keymap + 256) + (0xFC & z));
z = keyinfo [6];
z = expkey[6];
z ^= x;
y ^= * (__u32 *) ((u8 *) (des_keymap + 192) + (0xFC & z));
z >>= 8;
......@@ -370,7 +379,7 @@ static void des_small_fips_encrypt(void *ctx, __u8 *dst, __u8 *src)
y ^= * (__u32 *) ((u8 *) (des_keymap + 64) + (0xFC & z));
z >>= 8;
y ^= * (__u32 *) ((u8 *) des_keymap + (0xFC & z));
z = keyinfo [7];
z = expkey[7];
z ^= x;
z = z << 4 | z >> 28;
y ^= * (__u32 *) ((u8 *) (des_keymap + 448) + (0xFC & z));
......@@ -380,7 +389,7 @@ static void des_small_fips_encrypt(void *ctx, __u8 *dst, __u8 *src)
y ^= * (__u32 *) ((u8 *) (des_keymap + 320) + (0xFC & z));
z >>= 8;
y ^= * (__u32 *) ((u8 *) (des_keymap + 256) + (0xFC & z));
z = keyinfo [8];
z = expkey[8];
z ^= y;
x ^= * (__u32 *) ((u8 *) (des_keymap + 192) + (0xFC & z));
z >>= 8;
......@@ -389,7 +398,7 @@ static void des_small_fips_encrypt(void *ctx, __u8 *dst, __u8 *src)
x ^= * (__u32 *) ((u8 *) (des_keymap + 64) + (0xFC & z));
z >>= 8;
x ^= * (__u32 *) ((u8 *) des_keymap + (0xFC & z));
z = keyinfo [9];
z = expkey[9];
z ^= y;
z = z << 4 | z >> 28;
x ^= * (__u32 *) ((u8 *) (des_keymap + 448) + (0xFC & z));
......@@ -399,7 +408,7 @@ static void des_small_fips_encrypt(void *ctx, __u8 *dst, __u8 *src)
x ^= * (__u32 *) ((u8 *) (des_keymap + 320) + (0xFC & z));
z >>= 8;
x ^= * (__u32 *) ((u8 *) (des_keymap + 256) + (0xFC & z));
z = keyinfo [10];
z = expkey[10];
z ^= x;
y ^= * (__u32 *) ((u8 *) (des_keymap + 192) + (0xFC & z));
z >>= 8;
......@@ -408,7 +417,7 @@ static void des_small_fips_encrypt(void *ctx, __u8 *dst, __u8 *src)
y ^= * (__u32 *) ((u8 *) (des_keymap + 64) + (0xFC & z));
z >>= 8;
y ^= * (__u32 *) ((u8 *) des_keymap + (0xFC & z));
z = keyinfo [11];
z = expkey[11];
z ^= x;
z = z << 4 | z >> 28;
y ^= * (__u32 *) ((u8 *) (des_keymap + 448) + (0xFC & z));
......@@ -418,7 +427,7 @@ static void des_small_fips_encrypt(void *ctx, __u8 *dst, __u8 *src)
y ^= * (__u32 *) ((u8 *) (des_keymap + 320) + (0xFC & z));
z >>= 8;
y ^= * (__u32 *) ((u8 *) (des_keymap + 256) + (0xFC & z));
z = keyinfo [12];
z = expkey[12];
z ^= y;
x ^= * (__u32 *) ((u8 *) (des_keymap + 192) + (0xFC & z));
z >>= 8;
......@@ -427,7 +436,7 @@ static void des_small_fips_encrypt(void *ctx, __u8 *dst, __u8 *src)
x ^= * (__u32 *) ((u8 *) (des_keymap + 64) + (0xFC & z));
z >>= 8;
x ^= * (__u32 *) ((u8 *) des_keymap + (0xFC & z));
z = keyinfo [13];
z = expkey[13];
z ^= y;
z = z << 4 | z >> 28;
x ^= * (__u32 *) ((u8 *) (des_keymap + 448) + (0xFC & z));
......@@ -437,7 +446,7 @@ static void des_small_fips_encrypt(void *ctx, __u8 *dst, __u8 *src)
x ^= * (__u32 *) ((u8 *) (des_keymap + 320) + (0xFC & z));
z >>= 8;
x ^= * (__u32 *) ((u8 *) (des_keymap + 256) + (0xFC & z));
z = keyinfo [14];
z = expkey[14];
z ^= x;
y ^= * (__u32 *) ((u8 *) (des_keymap + 192) + (0xFC & z));
z >>= 8;
......@@ -446,7 +455,7 @@ static void des_small_fips_encrypt(void *ctx, __u8 *dst, __u8 *src)
y ^= * (__u32 *) ((u8 *) (des_keymap + 64) + (0xFC & z));
z >>= 8;
y ^= * (__u32 *) ((u8 *) des_keymap + (0xFC & z));
z = keyinfo [15];
z = expkey[15];
z ^= x;
z = z << 4 | z >> 28;
y ^= * (__u32 *) ((u8 *) (des_keymap + 448) + (0xFC & z));
......@@ -456,7 +465,7 @@ static void des_small_fips_encrypt(void *ctx, __u8 *dst, __u8 *src)
y ^= * (__u32 *) ((u8 *) (des_keymap + 320) + (0xFC & z));
z >>= 8;
y ^= * (__u32 *) ((u8 *) (des_keymap + 256) + (0xFC & z));
z = keyinfo [16];
z = expkey[16];
z ^= y;
x ^= * (__u32 *) ((u8 *) (des_keymap + 192) + (0xFC & z));
z >>= 8;
......@@ -465,7 +474,7 @@ static void des_small_fips_encrypt(void *ctx, __u8 *dst, __u8 *src)
x ^= * (__u32 *) ((u8 *) (des_keymap + 64) + (0xFC & z));
z >>= 8;
x ^= * (__u32 *) ((u8 *) des_keymap + (0xFC & z));
z = keyinfo [17];
z = expkey[17];
z ^= y;
z = z << 4 | z >> 28;
x ^= * (__u32 *) ((u8 *) (des_keymap + 448) + (0xFC & z));
......@@ -475,7 +484,7 @@ static void des_small_fips_encrypt(void *ctx, __u8 *dst, __u8 *src)
x ^= * (__u32 *) ((u8 *) (des_keymap + 320) + (0xFC & z));
z >>= 8;
x ^= * (__u32 *) ((u8 *) (des_keymap + 256) + (0xFC & z));
z = keyinfo [18];
z = expkey[18];
z ^= x;
y ^= * (__u32 *) ((u8 *) (des_keymap + 192) + (0xFC & z));
z >>= 8;
......@@ -484,7 +493,7 @@ static void des_small_fips_encrypt(void *ctx, __u8 *dst, __u8 *src)
y ^= * (__u32 *) ((u8 *) (des_keymap + 64) + (0xFC & z));
z >>= 8;
y ^= * (__u32 *) ((u8 *) des_keymap + (0xFC & z));
z = keyinfo [19];
z = expkey[19];
z ^= x;
z = z << 4 | z >> 28;
y ^= * (__u32 *) ((u8 *) (des_keymap + 448) + (0xFC & z));
......@@ -494,7 +503,7 @@ static void des_small_fips_encrypt(void *ctx, __u8 *dst, __u8 *src)
y ^= * (__u32 *) ((u8 *) (des_keymap + 320) + (0xFC & z));
z >>= 8;
y ^= * (__u32 *) ((u8 *) (des_keymap + 256) + (0xFC & z));
z = keyinfo [20];
z = expkey[20];
z ^= y;
x ^= * (__u32 *) ((u8 *) (des_keymap + 192) + (0xFC & z));
z >>= 8;
......@@ -503,7 +512,7 @@ static void des_small_fips_encrypt(void *ctx, __u8 *dst, __u8 *src)
x ^= * (__u32 *) ((u8 *) (des_keymap + 64) + (0xFC & z));
z >>= 8;
x ^= * (__u32 *) ((u8 *) des_keymap + (0xFC & z));
z = keyinfo [21];
z = expkey[21];
z ^= y;
z = z << 4 | z >> 28;
x ^= * (__u32 *) ((u8 *) (des_keymap + 448) + (0xFC & z));
......@@ -513,7 +522,7 @@ static void des_small_fips_encrypt(void *ctx, __u8 *dst, __u8 *src)
x ^= * (__u32 *) ((u8 *) (des_keymap + 320) + (0xFC & z));
z >>= 8;
x ^= * (__u32 *) ((u8 *) (des_keymap + 256) + (0xFC & z));
z = keyinfo [22];
z = expkey[22];
z ^= x;
y ^= * (__u32 *) ((u8 *) (des_keymap + 192) + (0xFC & z));
z >>= 8;
......@@ -522,7 +531,7 @@ static void des_small_fips_encrypt(void *ctx, __u8 *dst, __u8 *src)
y ^= * (__u32 *) ((u8 *) (des_keymap + 64) + (0xFC & z));
z >>= 8;
y ^= * (__u32 *) ((u8 *) des_keymap + (0xFC & z));
z = keyinfo [23];
z = expkey[23];
z ^= x;
z = z << 4 | z >> 28;
y ^= * (__u32 *) ((u8 *) (des_keymap + 448) + (0xFC & z));
......@@ -532,7 +541,7 @@ static void des_small_fips_encrypt(void *ctx, __u8 *dst, __u8 *src)
y ^= * (__u32 *) ((u8 *) (des_keymap + 320) + (0xFC & z));
z >>= 8;
y ^= * (__u32 *) ((u8 *) (des_keymap + 256) + (0xFC & z));
z = keyinfo [24];
z = expkey[24];
z ^= y;
x ^= * (__u32 *) ((u8 *) (des_keymap + 192) + (0xFC & z));
z >>= 8;
......@@ -541,7 +550,7 @@ static void des_small_fips_encrypt(void *ctx, __u8 *dst, __u8 *src)
x ^= * (__u32 *) ((u8 *) (des_keymap + 64) + (0xFC & z));
z >>= 8;
x ^= * (__u32 *) ((u8 *) des_keymap + (0xFC & z));
z = keyinfo [25];
z = expkey[25];
z ^= y;
z = z << 4 | z >> 28;
x ^= * (__u32 *) ((u8 *) (des_keymap + 448) + (0xFC & z));
......@@ -551,7 +560,7 @@ static void des_small_fips_encrypt(void *ctx, __u8 *dst, __u8 *src)
x ^= * (__u32 *) ((u8 *) (des_keymap + 320) + (0xFC & z));
z >>= 8;
x ^= * (__u32 *) ((u8 *) (des_keymap + 256) + (0xFC & z));
z = keyinfo [26];
z = expkey[26];
z ^= x;
y ^= * (__u32 *) ((u8 *) (des_keymap + 192) + (0xFC & z));
z >>= 8;
......@@ -560,7 +569,7 @@ static void des_small_fips_encrypt(void *ctx, __u8 *dst, __u8 *src)
y ^= * (__u32 *) ((u8 *) (des_keymap + 64) + (0xFC & z));
z >>= 8;
y ^= * (__u32 *) ((u8 *) des_keymap + (0xFC & z));
z = keyinfo [27];
z = expkey[27];
z ^= x;
z = z << 4 | z >> 28;
y ^= * (__u32 *) ((u8 *) (des_keymap + 448) + (0xFC & z));
......@@ -570,7 +579,7 @@ static void des_small_fips_encrypt(void *ctx, __u8 *dst, __u8 *src)
y ^= * (__u32 *) ((u8 *) (des_keymap + 320) + (0xFC & z));
z >>= 8;
y ^= * (__u32 *) ((u8 *) (des_keymap + 256) + (0xFC & z));
z = keyinfo [28];
z = expkey[28];
z ^= y;
x ^= * (__u32 *) ((u8 *) (des_keymap + 192) + (0xFC & z));
z >>= 8;
......@@ -579,7 +588,7 @@ static void des_small_fips_encrypt(void *ctx, __u8 *dst, __u8 *src)
x ^= * (__u32 *) ((u8 *) (des_keymap + 64) + (0xFC & z));
z >>= 8;
x ^= * (__u32 *) ((u8 *) des_keymap + (0xFC & z));
z = keyinfo [29];
z = expkey[29];
z ^= y;
z = z << 4 | z >> 28;
x ^= * (__u32 *) ((u8 *) (des_keymap + 448) + (0xFC & z));
......@@ -589,7 +598,7 @@ static void des_small_fips_encrypt(void *ctx, __u8 *dst, __u8 *src)
x ^= * (__u32 *) ((u8 *) (des_keymap + 320) + (0xFC & z));
z >>= 8;
x ^= * (__u32 *) ((u8 *) (des_keymap + 256) + (0xFC & z));
z = keyinfo [30];
z = expkey[30];
z ^= x;
y ^= * (__u32 *) ((u8 *) (des_keymap + 192) + (0xFC & z));
z >>= 8;
......@@ -598,7 +607,7 @@ static void des_small_fips_encrypt(void *ctx, __u8 *dst, __u8 *src)
y ^= * (__u32 *) ((u8 *) (des_keymap + 64) + (0xFC & z));
z >>= 8;
y ^= * (__u32 *) ((u8 *) des_keymap + (0xFC & z));
z = keyinfo [31];
z = expkey[31];
z ^= x;
z = z << 4 | z >> 28;
y ^= * (__u32 *) ((u8 *) (des_keymap + 448) + (0xFC & z));
......@@ -625,42 +634,41 @@ static void des_small_fips_encrypt(void *ctx, __u8 *dst, __u8 *src)
z = ((y >> 004) ^ x) & 0x0F0F0F0FL;
y ^= z << 004;
x ^= z;
dst [0] = x;
dst[0] = x;
x >>= 8;
dst [1] = x;
dst[1] = x;
x >>= 8;
dst [2] = x;
dst[2] = x;
x >>= 8;
dst [3] = x;
dst [4] = y;
dst[3] = x;
dst[4] = y;
y >>= 8;
dst [5] = y;
dst[5] = y;
y >>= 8;
dst [6] = y;
dst[6] = y;
y >>= 8;
dst [7] = y;
dst[7] = y;
return;
}
static void des_small_fips_decrypt(void *ctx, __u8 *dst, __u8 *src)
static void des_small_fips_decrypt(__u32 *expkey, __u8 *dst, __u8 *src)
{
__u32 *keyinfo = ((struct des_ctx *)ctx)->keyinfo;
__u32 x, y, z;
x = src [7];
x = src[7];
x <<= 8;
x |= src [6];
x |= src[6];
x <<= 8;
x |= src [5];
x |= src[5];
x <<= 8;
x |= src [4];
y = src [3];
x |= src[4];
y = src[3];
y <<= 8;
y |= src [2];
y |= src[2];
y <<= 8;
y |= src [1];
y |= src[1];
y <<= 8;
y |= src [0];
y |= src[0];
z = ((x >> 004) ^ y) & 0x0F0F0F0FL;
x ^= z << 004;
y ^= z;
......@@ -678,7 +686,7 @@ static void des_small_fips_decrypt(void *ctx, __u8 *dst, __u8 *src)
y ^= z;
x ^= z;
y = y >> 1 | y << 31;
z = keyinfo [31];
z = expkey[31];
z ^= y;
z = z << 4 | z >> 28;
x ^= * (__u32 *) ((u8 *) (des_keymap + 448) + (0xFC & z));
......@@ -688,7 +696,7 @@ static void des_small_fips_decrypt(void *ctx, __u8 *dst, __u8 *src)
x ^= * (__u32 *) ((u8 *) (des_keymap + 320) + (0xFC & z));
z >>= 8;
x ^= * (__u32 *) ((u8 *) (des_keymap + 256) + (0xFC & z));
z = keyinfo [30];
z = expkey[30];
z ^= y;
x ^= * (__u32 *) ((u8 *) (des_keymap + 192) + (0xFC & z));
z >>= 8;
......@@ -697,7 +705,7 @@ static void des_small_fips_decrypt(void *ctx, __u8 *dst, __u8 *src)
x ^= * (__u32 *) ((u8 *) (des_keymap + 64) + (0xFC & z));
z >>= 8;
x ^= * (__u32 *) ((u8 *) des_keymap + (0xFC & z));
z = keyinfo [29];
z = expkey[29];
z ^= x;
z = z << 4 | z >> 28;
y ^= * (__u32 *) ((u8 *) (des_keymap + 448) + (0xFC & z));
......@@ -707,7 +715,7 @@ static void des_small_fips_decrypt(void *ctx, __u8 *dst, __u8 *src)
y ^= * (__u32 *) ((u8 *) (des_keymap + 320) + (0xFC & z));
z >>= 8;
y ^= * (__u32 *) ((u8 *) (des_keymap + 256) + (0xFC & z));
z = keyinfo [28];
z = expkey[28];
z ^= x;
y ^= * (__u32 *) ((u8 *) (des_keymap + 192) + (0xFC & z));
z >>= 8;
......@@ -716,7 +724,7 @@ static void des_small_fips_decrypt(void *ctx, __u8 *dst, __u8 *src)
y ^= * (__u32 *) ((u8 *) (des_keymap + 64) + (0xFC & z));
z >>= 8;
y ^= * (__u32 *) ((u8 *) des_keymap + (0xFC & z));
z = keyinfo [27];
z = expkey[27];
z ^= y;
z = z << 4 | z >> 28;
x ^= * (__u32 *) ((u8 *) (des_keymap + 448) + (0xFC & z));
......@@ -726,7 +734,7 @@ static void des_small_fips_decrypt(void *ctx, __u8 *dst, __u8 *src)
x ^= * (__u32 *) ((u8 *) (des_keymap + 320) + (0xFC & z));
z >>= 8;
x ^= * (__u32 *) ((u8 *) (des_keymap + 256) + (0xFC & z));
z = keyinfo [26];
z = expkey[26];
z ^= y;
x ^= * (__u32 *) ((u8 *) (des_keymap + 192) + (0xFC & z));
z >>= 8;
......@@ -735,7 +743,7 @@ static void des_small_fips_decrypt(void *ctx, __u8 *dst, __u8 *src)
x ^= * (__u32 *) ((u8 *) (des_keymap + 64) + (0xFC & z));
z >>= 8;
x ^= * (__u32 *) ((u8 *) des_keymap + (0xFC & z));
z = keyinfo [25];
z = expkey[25];
z ^= x;
z = z << 4 | z >> 28;
y ^= * (__u32 *) ((u8 *) (des_keymap + 448) + (0xFC & z));
......@@ -745,7 +753,7 @@ static void des_small_fips_decrypt(void *ctx, __u8 *dst, __u8 *src)
y ^= * (__u32 *) ((u8 *) (des_keymap + 320) + (0xFC & z));
z >>= 8;
y ^= * (__u32 *) ((u8 *) (des_keymap + 256) + (0xFC & z));
z = keyinfo [24];
z = expkey[24];
z ^= x;
y ^= * (__u32 *) ((u8 *) (des_keymap + 192) + (0xFC & z));
z >>= 8;
......@@ -754,7 +762,7 @@ static void des_small_fips_decrypt(void *ctx, __u8 *dst, __u8 *src)
y ^= * (__u32 *) ((u8 *) (des_keymap + 64) + (0xFC & z));
z >>= 8;
y ^= * (__u32 *) ((u8 *) des_keymap + (0xFC & z));
z = keyinfo [23];
z = expkey[23];
z ^= y;
z = z << 4 | z >> 28;
x ^= * (__u32 *) ((u8 *) (des_keymap + 448) + (0xFC & z));
......@@ -764,7 +772,7 @@ static void des_small_fips_decrypt(void *ctx, __u8 *dst, __u8 *src)
x ^= * (__u32 *) ((u8 *) (des_keymap + 320) + (0xFC & z));
z >>= 8;
x ^= * (__u32 *) ((u8 *) (des_keymap + 256) + (0xFC & z));
z = keyinfo [22];
z = expkey[22];
z ^= y;
x ^= * (__u32 *) ((u8 *) (des_keymap + 192) + (0xFC & z));
z >>= 8;
......@@ -773,7 +781,7 @@ static void des_small_fips_decrypt(void *ctx, __u8 *dst, __u8 *src)
x ^= * (__u32 *) ((u8 *) (des_keymap + 64) + (0xFC & z));
z >>= 8;
x ^= * (__u32 *) ((u8 *) des_keymap + (0xFC & z));
z = keyinfo [21];
z = expkey[21];
z ^= x;
z = z << 4 | z >> 28;
y ^= * (__u32 *) ((u8 *) (des_keymap + 448) + (0xFC & z));
......@@ -783,7 +791,7 @@ static void des_small_fips_decrypt(void *ctx, __u8 *dst, __u8 *src)
y ^= * (__u32 *) ((u8 *) (des_keymap + 320) + (0xFC & z));
z >>= 8;
y ^= * (__u32 *) ((u8 *) (des_keymap + 256) + (0xFC & z));
z = keyinfo [20];
z = expkey[20];
z ^= x;
y ^= * (__u32 *) ((u8 *) (des_keymap + 192) + (0xFC & z));
z >>= 8;
......@@ -792,7 +800,7 @@ static void des_small_fips_decrypt(void *ctx, __u8 *dst, __u8 *src)
y ^= * (__u32 *) ((u8 *) (des_keymap + 64) + (0xFC & z));
z >>= 8;
y ^= * (__u32 *) ((u8 *) des_keymap + (0xFC & z));
z = keyinfo [19];
z = expkey[19];
z ^= y;
z = z << 4 | z >> 28;
x ^= * (__u32 *) ((u8 *) (des_keymap + 448) + (0xFC & z));
......@@ -802,7 +810,7 @@ static void des_small_fips_decrypt(void *ctx, __u8 *dst, __u8 *src)
x ^= * (__u32 *) ((u8 *) (des_keymap + 320) + (0xFC & z));
z >>= 8;
x ^= * (__u32 *) ((u8 *) (des_keymap + 256) + (0xFC & z));
z = keyinfo [18];
z = expkey[18];
z ^= y;
x ^= * (__u32 *) ((u8 *) (des_keymap + 192) + (0xFC & z));
z >>= 8;
......@@ -811,7 +819,7 @@ static void des_small_fips_decrypt(void *ctx, __u8 *dst, __u8 *src)
x ^= * (__u32 *) ((u8 *) (des_keymap + 64) + (0xFC & z));
z >>= 8;
x ^= * (__u32 *) ((u8 *) des_keymap + (0xFC & z));
z = keyinfo [17];
z = expkey[17];
z ^= x;
z = z << 4 | z >> 28;
y ^= * (__u32 *) ((u8 *) (des_keymap + 448) + (0xFC & z));
......@@ -821,7 +829,7 @@ static void des_small_fips_decrypt(void *ctx, __u8 *dst, __u8 *src)
y ^= * (__u32 *) ((u8 *) (des_keymap + 320) + (0xFC & z));
z >>= 8;
y ^= * (__u32 *) ((u8 *) (des_keymap + 256) + (0xFC & z));
z = keyinfo [16];
z = expkey[16];
z ^= x;
y ^= * (__u32 *) ((u8 *) (des_keymap + 192) + (0xFC & z));
z >>= 8;
......@@ -830,7 +838,7 @@ static void des_small_fips_decrypt(void *ctx, __u8 *dst, __u8 *src)
y ^= * (__u32 *) ((u8 *) (des_keymap + 64) + (0xFC & z));
z >>= 8;
y ^= * (__u32 *) ((u8 *) des_keymap + (0xFC & z));
z = keyinfo [15];
z = expkey[15];
z ^= y;
z = z << 4 | z >> 28;
x ^= * (__u32 *) ((u8 *) (des_keymap + 448) + (0xFC & z));
......@@ -840,7 +848,7 @@ static void des_small_fips_decrypt(void *ctx, __u8 *dst, __u8 *src)
x ^= * (__u32 *) ((u8 *) (des_keymap + 320) + (0xFC & z));
z >>= 8;
x ^= * (__u32 *) ((u8 *) (des_keymap + 256) + (0xFC & z));
z = keyinfo [14];
z = expkey[14];
z ^= y;
x ^= * (__u32 *) ((u8 *) (des_keymap + 192) + (0xFC & z));
z >>= 8;
......@@ -849,7 +857,7 @@ static void des_small_fips_decrypt(void *ctx, __u8 *dst, __u8 *src)
x ^= * (__u32 *) ((u8 *) (des_keymap + 64) + (0xFC & z));
z >>= 8;
x ^= * (__u32 *) ((u8 *) des_keymap + (0xFC & z));
z = keyinfo [13];
z = expkey[13];
z ^= x;
z = z << 4 | z >> 28;
y ^= * (__u32 *) ((u8 *) (des_keymap + 448) + (0xFC & z));
......@@ -859,7 +867,7 @@ static void des_small_fips_decrypt(void *ctx, __u8 *dst, __u8 *src)
y ^= * (__u32 *) ((u8 *) (des_keymap + 320) + (0xFC & z));
z >>= 8;
y ^= * (__u32 *) ((u8 *) (des_keymap + 256) + (0xFC & z));
z = keyinfo [12];
z = expkey[12];
z ^= x;
y ^= * (__u32 *) ((u8 *) (des_keymap + 192) + (0xFC & z));
z >>= 8;
......@@ -868,7 +876,7 @@ static void des_small_fips_decrypt(void *ctx, __u8 *dst, __u8 *src)
y ^= * (__u32 *) ((u8 *) (des_keymap + 64) + (0xFC & z));
z >>= 8;
y ^= * (__u32 *) ((u8 *) des_keymap + (0xFC & z));
z = keyinfo [11];
z = expkey[11];
z ^= y;
z = z << 4 | z >> 28;
x ^= * (__u32 *) ((u8 *) (des_keymap + 448) + (0xFC & z));
......@@ -878,7 +886,7 @@ static void des_small_fips_decrypt(void *ctx, __u8 *dst, __u8 *src)
x ^= * (__u32 *) ((u8 *) (des_keymap + 320) + (0xFC & z));
z >>= 8;
x ^= * (__u32 *) ((u8 *) (des_keymap + 256) + (0xFC & z));
z = keyinfo [10];
z = expkey[10];
z ^= y;
x ^= * (__u32 *) ((u8 *) (des_keymap + 192) + (0xFC & z));
z >>= 8;
......@@ -887,7 +895,7 @@ static void des_small_fips_decrypt(void *ctx, __u8 *dst, __u8 *src)
x ^= * (__u32 *) ((u8 *) (des_keymap + 64) + (0xFC & z));
z >>= 8;
x ^= * (__u32 *) ((u8 *) des_keymap + (0xFC & z));
z = keyinfo [9];
z = expkey[9];
z ^= x;
z = z << 4 | z >> 28;
y ^= * (__u32 *) ((u8 *) (des_keymap + 448) + (0xFC & z));
......@@ -897,7 +905,7 @@ static void des_small_fips_decrypt(void *ctx, __u8 *dst, __u8 *src)
y ^= * (__u32 *) ((u8 *) (des_keymap + 320) + (0xFC & z));
z >>= 8;
y ^= * (__u32 *) ((u8 *) (des_keymap + 256) + (0xFC & z));
z = keyinfo [8];
z = expkey[8];
z ^= x;
y ^= * (__u32 *) ((u8 *) (des_keymap + 192) + (0xFC & z));
z >>= 8;
......@@ -906,7 +914,7 @@ static void des_small_fips_decrypt(void *ctx, __u8 *dst, __u8 *src)
y ^= * (__u32 *) ((u8 *) (des_keymap + 64) + (0xFC & z));
z >>= 8;
y ^= * (__u32 *) ((u8 *) des_keymap + (0xFC & z));
z = keyinfo [7];
z = expkey[7];
z ^= y;
z = z << 4 | z >> 28;
x ^= * (__u32 *) ((u8 *) (des_keymap + 448) + (0xFC & z));
......@@ -916,7 +924,7 @@ static void des_small_fips_decrypt(void *ctx, __u8 *dst, __u8 *src)
x ^= * (__u32 *) ((u8 *) (des_keymap + 320) + (0xFC & z));
z >>= 8;
x ^= * (__u32 *) ((u8 *) (des_keymap + 256) + (0xFC & z));
z = keyinfo [6];
z = expkey[6];
z ^= y;
x ^= * (__u32 *) ((u8 *) (des_keymap + 192) + (0xFC & z));
z >>= 8;
......@@ -925,7 +933,7 @@ static void des_small_fips_decrypt(void *ctx, __u8 *dst, __u8 *src)
x ^= * (__u32 *) ((u8 *) (des_keymap + 64) + (0xFC & z));
z >>= 8;
x ^= * (__u32 *) ((u8 *) des_keymap + (0xFC & z));
z = keyinfo [5];
z = expkey[5];
z ^= x;
z = z << 4 | z >> 28;
y ^= * (__u32 *) ((u8 *) (des_keymap + 448) + (0xFC & z));
......@@ -935,7 +943,7 @@ static void des_small_fips_decrypt(void *ctx, __u8 *dst, __u8 *src)
y ^= * (__u32 *) ((u8 *) (des_keymap + 320) + (0xFC & z));
z >>= 8;
y ^= * (__u32 *) ((u8 *) (des_keymap + 256) + (0xFC & z));
z = keyinfo [4];
z = expkey[4];
z ^= x;
y ^= * (__u32 *) ((u8 *) (des_keymap + 192) + (0xFC & z));
z >>= 8;
......@@ -944,7 +952,7 @@ static void des_small_fips_decrypt(void *ctx, __u8 *dst, __u8 *src)
y ^= * (__u32 *) ((u8 *) (des_keymap + 64) + (0xFC & z));
z >>= 8;
y ^= * (__u32 *) ((u8 *) des_keymap + (0xFC & z));
z = keyinfo [3];
z = expkey[3];
z ^= y;
z = z << 4 | z >> 28;
x ^= * (__u32 *) ((u8 *) (des_keymap + 448) + (0xFC & z));
......@@ -954,7 +962,7 @@ static void des_small_fips_decrypt(void *ctx, __u8 *dst, __u8 *src)
x ^= * (__u32 *) ((u8 *) (des_keymap + 320) + (0xFC & z));
z >>= 8;
x ^= * (__u32 *) ((u8 *) (des_keymap + 256) + (0xFC & z));
z = keyinfo [2];
z = expkey[2];
z ^= y;
x ^= * (__u32 *) ((u8 *) (des_keymap + 192) + (0xFC & z));
z >>= 8;
......@@ -963,7 +971,7 @@ static void des_small_fips_decrypt(void *ctx, __u8 *dst, __u8 *src)
x ^= * (__u32 *) ((u8 *) (des_keymap + 64) + (0xFC & z));
z >>= 8;
x ^= * (__u32 *) ((u8 *) des_keymap + (0xFC & z));
z = keyinfo [1];
z = expkey[1];
z ^= x;
z = z << 4 | z >> 28;
y ^= * (__u32 *) ((u8 *) (des_keymap + 448) + (0xFC & z));
......@@ -973,7 +981,7 @@ static void des_small_fips_decrypt(void *ctx, __u8 *dst, __u8 *src)
y ^= * (__u32 *) ((u8 *) (des_keymap + 320) + (0xFC & z));
z >>= 8;
y ^= * (__u32 *) ((u8 *) (des_keymap + 256) + (0xFC & z));
z = keyinfo [0];
z = expkey[0];
z ^= x;
y ^= * (__u32 *) ((u8 *) (des_keymap + 192) + (0xFC & z));
z >>= 8;
......@@ -999,33 +1007,32 @@ static void des_small_fips_decrypt(void *ctx, __u8 *dst, __u8 *src)
z = ((y >> 004) ^ x) & 0x0F0F0F0FL;
y ^= z << 004;
x ^= z;
dst [0] = x;
dst[0] = x;
x >>= 8;
dst [1] = x;
dst[1] = x;
x >>= 8;
dst [2] = x;
dst[2] = x;
x >>= 8;
dst [3] = x;
dst [4] = y;
dst[3] = x;
dst[4] = y;
y >>= 8;
dst [5] = y;
dst[5] = y;
y >>= 8;
dst [6] = y;
dst[6] = y;
y >>= 8;
dst [7] = y;
dst[7] = y;
return;
}
/*
* RFC2451: Weak key checks SHOULD be performed.
*/
static int des_setkey(void *ctx, const __u8 *key, size_t keylen, int *flags)
static int setkey(__u32 *expkey, const __u8 *key, size_t keylen, int *flags)
{
struct des_ctx *dctx = ctx;
const __u8 *k;
__u8 *b0, *b1;
__u32 n, w;
__u32 *method;
__u8 bits0[56], bits1[56];
if (keylen != DES_KEY_SIZE) {
......@@ -1125,7 +1132,6 @@ static int des_setkey(void *ctx, const __u8 *key, size_t keylen, int *flags)
/* put the bits in the correct places */
n = 16;
k = rotors;
method = dctx->keyinfo;
do {
w = (b1[k[ 0 ]] | b0[k[ 1 ]]) << 4;
......@@ -1143,7 +1149,7 @@ static int des_setkey(void *ctx, const __u8 *key, size_t keylen, int *flags)
w |= (b1[k[18 ]] | b0[k[19 ]]) << 4;
w |= (b1[k[20 ]] | b0[k[21 ]]) << 2;
w |= b1[k[22 ]] | b0[k[23 ]];
method[0] = w;
expkey[0] = w;
w = (b1[k[ 0+24]] | b0[k[ 1+24]]) << 4;
w |= (b1[k[ 2+24]] | b0[k[ 3+24]]) << 2;
......@@ -1162,16 +1168,94 @@ static int des_setkey(void *ctx, const __u8 *key, size_t keylen, int *flags)
w |= b1[k[22+24]] | b0[k[23+24]];
ROR(w, 4, 28); /* could be eliminated */
method[1] = w;
expkey[1] = w;
k += 48;
method += 2;
expkey += 2;
} while (--n);
return 0;
}
static struct crypto_alg alg = {
static int des_setkey(void *ctx, const __u8 *key, size_t keylen, int *flags)
{
return setkey(((struct des_ctx *)ctx)->expkey, key, keylen, flags);
}
static void des_encrypt(void *ctx, __u8 *dst, __u8 *src)
{
des_small_fips_encrypt(((struct des_ctx *)ctx)->expkey, dst, src);
}
static void des_decrypt(void *ctx, __u8 *dst, __u8 *src)
{
des_small_fips_decrypt(((struct des_ctx *)ctx)->expkey, dst, src);
}
/*
* RFC2451:
*
* For DES-EDE3, there is no known need to reject weak or
* complementation keys. Any weakness is obviated by the use of
* multiple keys.
*
* However, if the first two or last two independent 64-bit keys are
* equal (k1 == k2 or k2 == k3), then the DES3 operation is simply the
* same as DES. Implementers MUST reject keys that exhibit this
* property.
*
*/
static int des3_ede_setkey(void *ctx, const __u8 *key,
size_t keylen, int *flags)
{
int i, off;
struct des3_ede_ctx *dctx = ctx;
if (keylen != DES3_EDE_KEY_SIZE) {
*flags |= CRYPTO_BAD_KEY_LEN;
return -EINVAL;
}
if (!(memcmp(key, &key[DES_KEY_SIZE], DES_KEY_SIZE) &&
memcmp(&key[DES_KEY_SIZE], &key[DES_KEY_SIZE * 2],
DES_KEY_SIZE))) {
*flags |= CRYPTO_BAD_KEY_SCHED;
return -EINVAL;
}
for (i = 0, off = 0; i < 3; i++, off += DES_EXPKEY_WORDS,
key += DES_KEY_SIZE) {
int ret = setkey(&dctx->expkey[off], key, DES_KEY_SIZE, flags);
if (ret < 0)
return ret;
}
return 0;
}
static void des3_ede_encrypt(void *ctx, __u8 *dst, __u8 *src)
{
struct des3_ede_ctx *dctx = ctx;
des_small_fips_encrypt(dctx->expkey, dst, src);
des_small_fips_decrypt(&dctx->expkey[DES_EXPKEY_WORDS], dst, dst);
des_small_fips_encrypt(&dctx->expkey[DES_EXPKEY_WORDS * 2], dst, dst);
return;
}
static void des3_ede_decrypt(void *ctx, __u8 *dst, __u8 *src)
{
struct des3_ede_ctx *dctx = ctx;
des_small_fips_decrypt(&dctx->expkey[DES_EXPKEY_WORDS * 2], dst, src);
des_small_fips_encrypt(&dctx->expkey[DES_EXPKEY_WORDS], dst, dst);
des_small_fips_decrypt(dctx->expkey, dst, dst);
return;
}
static struct crypto_alg des_alg = {
.cra_id = CRYPTO_ALG_DES,
.cra_name = "des",
.cra_blocksize = DES_BLOCK_SIZE,
......@@ -1180,19 +1264,47 @@ static struct crypto_alg alg = {
.cia_keysize = DES_KEY_SIZE,
.cia_ivsize = DES_BLOCK_SIZE,
.cia_setkey = des_setkey,
.cia_encrypt = des_small_fips_encrypt,
.cia_decrypt = des_small_fips_decrypt } }
.cia_encrypt = des_encrypt,
.cia_decrypt = des_decrypt } }
};
static struct crypto_alg des3_ede_alg = {
.cra_id = CRYPTO_ALG_DES3_EDE,
.cra_name = "des3_ede",
.cra_blocksize = DES3_EDE_BLOCK_SIZE,
.cra_ctxsize = sizeof(struct des3_ede_ctx),
.cra_u = { .cipher = {
.cia_keysize = DES3_EDE_KEY_SIZE,
.cia_ivsize = DES3_EDE_BLOCK_SIZE,
.cia_setkey = des3_ede_setkey,
.cia_encrypt = des3_ede_encrypt,
.cia_decrypt = des3_ede_decrypt } }
};
static int __init init(void)
{
INIT_LIST_HEAD(&alg.cra_list);
return crypto_register_alg(&alg);
int ret = 0;
INIT_LIST_HEAD(&des_alg.cra_list);
INIT_LIST_HEAD(&des3_ede_alg.cra_list);
ret = crypto_register_alg(&des_alg);
if (ret < 0)
goto out;
ret = crypto_register_alg(&des3_ede_alg);
if (ret < 0) {
crypto_unregister_alg(&des_alg);
goto out;
}
out:
return ret;
}
static void __exit fini(void)
{
crypto_unregister_alg(&alg);
crypto_unregister_alg(&des3_ede_alg);
crypto_unregister_alg(&des_alg);
}
module_init(init);
......@@ -1200,16 +1312,3 @@ module_exit(fini);
MODULE_LICENSE("GPL");
MODULE_DESCRIPTION("DES & Triple DES EDE Cipher Algorithms");
#if 0
/*
* RFC2451:
*
* However, if the first two or last two independent 64-bit keys are
* equal (k1 == k2 or k2 == k3), then the 3DES operation is simply the
* same as DES. Implementers MUST reject keys that exhibit this
* property.
*/
#endif
......@@ -42,7 +42,6 @@
#define IDX7 27333
#define IDX8 3000
static int mode = 0;
static char *xbuf;
static char *tvmem;
......@@ -1094,6 +1093,115 @@ void test_des(void)
return;
}
void test_des3_ede(void)
{
int ret, i, len;
size_t tsize;
char *p, *q;
struct crypto_tfm *tfm;
char *key;
/*char res[8];*/
struct des_tv *des_tv;
struct scatterlist sg[8];
printk("\ntesting des3 ede encryption\n");
tsize = sizeof(des3_ede_enc_tv_template);
if (tsize > TVMEMSIZE) {
printk("template (%Zd) too big for tvmem (%d)\n", tsize, TVMEMSIZE);
return;
}
memcpy(tvmem, des3_ede_enc_tv_template, tsize);
des_tv = (void *)tvmem;
tfm = crypto_alloc_tfm(CRYPTO_ALG_DES3_EDE_ECB);
if (tfm == NULL) {
printk("failed to load transform for CRYPTO_ALG_DES3_EDE_ECB\n");
return;
}
for (i = 0; i < DES3_EDE_ENC_TEST_VECTORS; i++) {
printk("test %d:\n", i + 1);
key = des_tv[i].key;
tfm->crt_flags = CRYPTO_WEAK_KEY_CHECK;
ret = crypto_cipher_setkey(tfm, key, 24);
if (ret) {
printk("setkey() failed flags=%x\n", tfm->crt_flags);
if (!des_tv[i].fail)
goto out;
}
len = des_tv[i].len;
p = des_tv[i].plaintext;
sg[0].page = virt_to_page(p);
sg[0].offset = ((long)p & ~PAGE_MASK);
sg[0].length = len;
ret = crypto_cipher_encrypt(tfm, sg, 1);
if (ret) {
printk("encrypt() failed flags=%x\n", tfm->crt_flags);
goto out;
}
q = kmap(sg[0].page) + sg[0].offset;
hexdump(q, len);
printk("%s\n", memcmp(q, des_tv[i].result, len) ? "fail" : "pass");
}
printk("\ntesting des3 ede decryption\n");
tsize = sizeof(des3_ede_dec_tv_template);
if (tsize > TVMEMSIZE) {
printk("template (%Zd) too big for tvmem (%d)\n", tsize, TVMEMSIZE);
return;
}
memcpy(tvmem, des3_ede_dec_tv_template, tsize);
des_tv = (void *)tvmem;
for (i = 0; i < DES3_EDE_DEC_TEST_VECTORS; i++) {
printk("test %d:\n", i + 1);
key = des_tv[i].key;
tfm->crt_flags = CRYPTO_WEAK_KEY_CHECK;
ret = crypto_cipher_setkey(tfm, key, 24);
if (ret) {
printk("setkey() failed flags=%x\n", tfm->crt_flags);
if (!des_tv[i].fail)
goto out;
}
len = des_tv[i].len;
p = des_tv[i].plaintext;
sg[0].page = virt_to_page(p);
sg[0].offset = ((long)p & ~PAGE_MASK);
sg[0].length = len;
ret = crypto_cipher_decrypt(tfm, sg, 1);
if (ret) {
printk("decrypt() failed flags=%x\n", tfm->crt_flags);
goto out;
}
q = kmap(sg[0].page) + sg[0].offset;
hexdump(q, len);
printk("%s\n", memcmp(q, des_tv[i].result, len) ? "fail" : "pass");
}
out:
crypto_free_tfm(tfm);
return;
}
static void do_test(void)
{
switch (mode) {
......@@ -1102,6 +1210,7 @@ static void do_test(void)
test_md5();
test_sha1();
test_des();
test_des3_ede();
break;
case 1:
......@@ -1116,6 +1225,10 @@ static void do_test(void)
test_des();
break;
case 4:
test_des3_ede();
break;
default:
/* useful for debugging */
printk("not testing anything\n");
......
......@@ -306,11 +306,13 @@ struct sha1_testvec {
#define DES_DEC_TEST_VECTORS 2
#define DES_CBC_ENC_TEST_VECTORS 4
#define DES_CBC_DEC_TEST_VECTORS 3
#define DES3_EDE_ENC_TEST_VECTORS 3
#define DES3_EDE_DEC_TEST_VECTORS 3
struct des_tv {
int len;
int fail;
char key[8];
char key[24];
char iv[8];
char plaintext[128];
char result[128];
......@@ -581,7 +583,104 @@ struct des_tv des_cbc_dec_tv_template[] = {
},
};
/*
* We really need some more test vectors, especially for DES3 CBC.
*/
struct des_tv des3_ede_enc_tv_template[] = {
/* These are from openssl */
{
8, 0,
{ 0x01, 0x23, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF,
0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55,
0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10},
{ 0 },
{ 0x73, 0x6F, 0x6D, 0x65, 0x64, 0x61, 0x74, 0x61 },
{ 0x18, 0xd7, 0x48, 0xe5, 0x63, 0x62, 0x05, 0x72 },
},
{
8, 0,
{ 0x03,0x52,0x02,0x07,0x67,0x20,0x82,0x17,
0x86,0x02,0x87,0x66,0x59,0x08,0x21,0x98,
0x64,0x05,0x6A,0xBD,0xFE,0xA9,0x34,0x57 },
{ 0 },
{ 0x73,0x71,0x75,0x69,0x67,0x67,0x6C,0x65 },
{ 0xc0,0x7d,0x2a,0x0f,0xa5,0x66,0xfa,0x30 }
},
{
8, 0,
{ 0x10,0x46,0x10,0x34,0x89,0x98,0x80,0x20,
0x91,0x07,0xD0,0x15,0x89,0x19,0x01,0x01,
0x19,0x07,0x92,0x10,0x98,0x1A,0x01,0x01 },
{ 0 },
{ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 },
{ 0xe1,0xef,0x62,0xc3,0x32,0xfe,0x82,0x5b }
},
};
struct des_tv des3_ede_dec_tv_template[] = {
/* These are from openssl */
{
8, 0,
{ 0x01, 0x23, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF,
0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55,
0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10},
{ 0 },
{ 0x18, 0xd7, 0x48, 0xe5, 0x63, 0x62, 0x05, 0x72 },
{ 0x73, 0x6F, 0x6D, 0x65, 0x64, 0x61, 0x74, 0x61 },
},
{
8, 0,
{ 0x03,0x52,0x02,0x07,0x67,0x20,0x82,0x17,
0x86,0x02,0x87,0x66,0x59,0x08,0x21,0x98,
0x64,0x05,0x6A,0xBD,0xFE,0xA9,0x34,0x57 },
{ 0 },
{ 0xc0,0x7d,0x2a,0x0f,0xa5,0x66,0xfa,0x30 },
{ 0x73,0x71,0x75,0x69,0x67,0x67,0x6C,0x65 },
},
{
8, 0,
{ 0x10,0x46,0x10,0x34,0x89,0x98,0x80,0x20,
0x91,0x07,0xD0,0x15,0x89,0x19,0x01,0x01,
0x19,0x07,0x92,0x10,0x98,0x1A,0x01,0x01 },
{ 0 },
{ 0xe1,0xef,0x62,0xc3,0x32,0xfe,0x82,0x5b },
{ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 },
},
};
#endif /* _CRYPTO_TCRYPT_H */
......@@ -22,7 +22,8 @@
#define CRYPTO_WEAK_KEY_CHECK 0x0001
#define CRYPTO_WEAK_KEY 0x0008
#define CRYPTO_BAD_KEY_LEN 0x0010
#define CRYPTO_BAD_BLOCK_LEN 0x0020
#define CRYPTO_BAD_KEY_SCHED 0x0020
#define CRYPTO_BAD_BLOCK_LEN 0x0040
#define CRYPTO_ATOMIC 0x1000
/*
......@@ -51,9 +52,9 @@
#define CRYPTO_ALG_DES_ECB (CRYPTO_ALG_DES|CRYPTO_MODE_ECB)
#define CRYPTO_ALG_DES_CBC (CRYPTO_ALG_DES|CRYPTO_MODE_CBC)
#define CRYPTO_ALG_3DES_EDE (0x00000002|CRYPTO_TYPE_CIPHER)
#define CRYPTO_ALG_3DES_EDE_ECB (CRYPTO_ALG_3DES_EDE|CRYPTO_MODE_ECB)
#define CRYPTO_ALG_3DES_EDE_CBC (CRYPTO_ALG_3DES_EDE|CRYPTO_MODE_CBC)
#define CRYPTO_ALG_DES3_EDE (0x00000002|CRYPTO_TYPE_CIPHER)
#define CRYPTO_ALG_DES3_EDE_ECB (CRYPTO_ALG_DES3_EDE|CRYPTO_MODE_ECB)
#define CRYPTO_ALG_DES3_EDE_CBC (CRYPTO_ALG_DES3_EDE|CRYPTO_MODE_CBC)
#define CRYPTO_ALG_MD5 (0x00000f00|CRYPTO_TYPE_DIGEST)
#define CRYPTO_ALG_SHA1 (0x00000f01|CRYPTO_TYPE_DIGEST)
......@@ -61,10 +62,6 @@
#define CRYPTO_MAX_ALG_NAME 64
#define CRYPTO_MAX_BLOCK_SIZE 16
#define cra_cipher cra_u.cipher
#define cra_digest cra_u.digest
#define cra_compress cra_u.compress
struct scatterlist;
struct cipher_alg {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment