crypto: Move md5_transform to lib/md5.c
[linux-2.6.git] / crypto / des_generic.c
index 59966d1..873818d 100644 (file)
 #include <linux/crypto.h>
 #include <linux/types.h>
 
-#define DES_KEY_SIZE           8
-#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
+#include <crypto/des.h>
 
 #define ROL(x, r) ((x) = rol32((x), (r)))
 #define ROR(x, r) ((x) = ror32((x), (r)))
@@ -620,7 +614,7 @@ static const u32 S8[64] = {
 #define T3(x) pt[2 * (x) + 2]
 #define T4(x) pt[2 * (x) + 3]
 
-#define PC2(a, b, c, d) (T4(d) | T3(c) | T2(b) | T1(a))
+#define DES_PC2(a, b, c, d) (T4(d) | T3(c) | T2(b) | T1(a))
 
 /*
  * Encryption key expansion
@@ -634,7 +628,7 @@ static const u32 S8[64] = {
  *   Choice 1 has operated on the key.
  *
  */
-static unsigned long ekey(u32 *pe, const u8 *k)
+unsigned long des_ekey(u32 *pe, const u8 *k)
 {
        /* K&R: long is at least 32 bits */
        unsigned long a, b, c, d, w;
@@ -645,22 +639,22 @@ static unsigned long ekey(u32 *pe, const u8 *k)
        b = k[6]; b &= 0x0e; b <<= 4; b |= k[2] & 0x1e; b = pc1[b];
        a = k[7]; a &= 0x0e; a <<= 4; a |= k[3] & 0x1e; a = pc1[a];
 
-       pe[15 * 2 + 0] = PC2(a, b, c, d); d = rs[d];
-       pe[14 * 2 + 0] = PC2(d, a, b, c); c = rs[c]; b = rs[b];
-       pe[13 * 2 + 0] = PC2(b, c, d, a); a = rs[a]; d = rs[d];
-       pe[12 * 2 + 0] = PC2(d, a, b, c); c = rs[c]; b = rs[b];
-       pe[11 * 2 + 0] = PC2(b, c, d, a); a = rs[a]; d = rs[d];
-       pe[10 * 2 + 0] = PC2(d, a, b, c); c = rs[c]; b = rs[b];
-       pe[ 9 * 2 + 0] = PC2(b, c, d, a); a = rs[a]; d = rs[d];
-       pe[ 8 * 2 + 0] = PC2(d, a, b, c); c = rs[c];
-       pe[ 7 * 2 + 0] = PC2(c, d, a, b); b = rs[b]; a = rs[a];
-       pe[ 6 * 2 + 0] = PC2(a, b, c, d); d = rs[d]; c = rs[c];
-       pe[ 5 * 2 + 0] = PC2(c, d, a, b); b = rs[b]; a = rs[a];
-       pe[ 4 * 2 + 0] = PC2(a, b, c, d); d = rs[d]; c = rs[c];
-       pe[ 3 * 2 + 0] = PC2(c, d, a, b); b = rs[b]; a = rs[a];
-       pe[ 2 * 2 + 0] = PC2(a, b, c, d); d = rs[d]; c = rs[c];
-       pe[ 1 * 2 + 0] = PC2(c, d, a, b); b = rs[b];
-       pe[ 0 * 2 + 0] = PC2(b, c, d, a);
+       pe[15 * 2 + 0] = DES_PC2(a, b, c, d); d = rs[d];
+       pe[14 * 2 + 0] = DES_PC2(d, a, b, c); c = rs[c]; b = rs[b];
+       pe[13 * 2 + 0] = DES_PC2(b, c, d, a); a = rs[a]; d = rs[d];
+       pe[12 * 2 + 0] = DES_PC2(d, a, b, c); c = rs[c]; b = rs[b];
+       pe[11 * 2 + 0] = DES_PC2(b, c, d, a); a = rs[a]; d = rs[d];
+       pe[10 * 2 + 0] = DES_PC2(d, a, b, c); c = rs[c]; b = rs[b];
+       pe[ 9 * 2 + 0] = DES_PC2(b, c, d, a); a = rs[a]; d = rs[d];
+       pe[ 8 * 2 + 0] = DES_PC2(d, a, b, c); c = rs[c];
+       pe[ 7 * 2 + 0] = DES_PC2(c, d, a, b); b = rs[b]; a = rs[a];
+       pe[ 6 * 2 + 0] = DES_PC2(a, b, c, d); d = rs[d]; c = rs[c];
+       pe[ 5 * 2 + 0] = DES_PC2(c, d, a, b); b = rs[b]; a = rs[a];
+       pe[ 4 * 2 + 0] = DES_PC2(a, b, c, d); d = rs[d]; c = rs[c];
+       pe[ 3 * 2 + 0] = DES_PC2(c, d, a, b); b = rs[b]; a = rs[a];
+       pe[ 2 * 2 + 0] = DES_PC2(a, b, c, d); d = rs[d]; c = rs[c];
+       pe[ 1 * 2 + 0] = DES_PC2(c, d, a, b); b = rs[b];
+       pe[ 0 * 2 + 0] = DES_PC2(b, c, d, a);
 
        /* Check if first half is weak */
        w  = (a ^ c) | (b ^ d) | (rs[a] ^ c) | (b ^ rs[d]);
@@ -676,22 +670,22 @@ static unsigned long ekey(u32 *pe, const u8 *k)
        /* Check if second half is weak */
        w |= (a ^ c) | (b ^ d) | (rs[a] ^ c) | (b ^ rs[d]);
 
-       pe[15 * 2 + 1] = PC2(a, b, c, d); d = rs[d];
-       pe[14 * 2 + 1] = PC2(d, a, b, c); c = rs[c]; b = rs[b];
-       pe[13 * 2 + 1] = PC2(b, c, d, a); a = rs[a]; d = rs[d];
-       pe[12 * 2 + 1] = PC2(d, a, b, c); c = rs[c]; b = rs[b];
-       pe[11 * 2 + 1] = PC2(b, c, d, a); a = rs[a]; d = rs[d];
-       pe[10 * 2 + 1] = PC2(d, a, b, c); c = rs[c]; b = rs[b];
-       pe[ 9 * 2 + 1] = PC2(b, c, d, a); a = rs[a]; d = rs[d];
-       pe[ 8 * 2 + 1] = PC2(d, a, b, c); c = rs[c];
-       pe[ 7 * 2 + 1] = PC2(c, d, a, b); b = rs[b]; a = rs[a];
-       pe[ 6 * 2 + 1] = PC2(a, b, c, d); d = rs[d]; c = rs[c];
-       pe[ 5 * 2 + 1] = PC2(c, d, a, b); b = rs[b]; a = rs[a];
-       pe[ 4 * 2 + 1] = PC2(a, b, c, d); d = rs[d]; c = rs[c];
-       pe[ 3 * 2 + 1] = PC2(c, d, a, b); b = rs[b]; a = rs[a];
-       pe[ 2 * 2 + 1] = PC2(a, b, c, d); d = rs[d]; c = rs[c];
-       pe[ 1 * 2 + 1] = PC2(c, d, a, b); b = rs[b];
-       pe[ 0 * 2 + 1] = PC2(b, c, d, a);
+       pe[15 * 2 + 1] = DES_PC2(a, b, c, d); d = rs[d];
+       pe[14 * 2 + 1] = DES_PC2(d, a, b, c); c = rs[c]; b = rs[b];
+       pe[13 * 2 + 1] = DES_PC2(b, c, d, a); a = rs[a]; d = rs[d];
+       pe[12 * 2 + 1] = DES_PC2(d, a, b, c); c = rs[c]; b = rs[b];
+       pe[11 * 2 + 1] = DES_PC2(b, c, d, a); a = rs[a]; d = rs[d];
+       pe[10 * 2 + 1] = DES_PC2(d, a, b, c); c = rs[c]; b = rs[b];
+       pe[ 9 * 2 + 1] = DES_PC2(b, c, d, a); a = rs[a]; d = rs[d];
+       pe[ 8 * 2 + 1] = DES_PC2(d, a, b, c); c = rs[c];
+       pe[ 7 * 2 + 1] = DES_PC2(c, d, a, b); b = rs[b]; a = rs[a];
+       pe[ 6 * 2 + 1] = DES_PC2(a, b, c, d); d = rs[d]; c = rs[c];
+       pe[ 5 * 2 + 1] = DES_PC2(c, d, a, b); b = rs[b]; a = rs[a];
+       pe[ 4 * 2 + 1] = DES_PC2(a, b, c, d); d = rs[d]; c = rs[c];
+       pe[ 3 * 2 + 1] = DES_PC2(c, d, a, b); b = rs[b]; a = rs[a];
+       pe[ 2 * 2 + 1] = DES_PC2(a, b, c, d); d = rs[d]; c = rs[c];
+       pe[ 1 * 2 + 1] = DES_PC2(c, d, a, b); b = rs[b];
+       pe[ 0 * 2 + 1] = DES_PC2(b, c, d, a);
 
        /* Fixup: 2413 5768 -> 1357 2468 */
        for (d = 0; d < 16; ++d) {
@@ -709,6 +703,7 @@ static unsigned long ekey(u32 *pe, const u8 *k)
        /* Zero if weak key */
        return w;
 }
+EXPORT_SYMBOL_GPL(des_ekey);
 
 /*
  * Decryption key expansion
@@ -727,22 +722,22 @@ static void dkey(u32 *pe, const u8 *k)
        b = k[6]; b &= 0x0e; b <<= 4; b |= k[2] & 0x1e; b = pc1[b];
        a = k[7]; a &= 0x0e; a <<= 4; a |= k[3] & 0x1e; a = pc1[a];
 
-       pe[ 0 * 2] = PC2(a, b, c, d); d = rs[d];
-       pe[ 1 * 2] = PC2(d, a, b, c); c = rs[c]; b = rs[b];
-       pe[ 2 * 2] = PC2(b, c, d, a); a = rs[a]; d = rs[d];
-       pe[ 3 * 2] = PC2(d, a, b, c); c = rs[c]; b = rs[b];
-       pe[ 4 * 2] = PC2(b, c, d, a); a = rs[a]; d = rs[d];
-       pe[ 5 * 2] = PC2(d, a, b, c); c = rs[c]; b = rs[b];
-       pe[ 6 * 2] = PC2(b, c, d, a); a = rs[a]; d = rs[d];
-       pe[ 7 * 2] = PC2(d, a, b, c); c = rs[c];
-       pe[ 8 * 2] = PC2(c, d, a, b); b = rs[b]; a = rs[a];
-       pe[ 9 * 2] = PC2(a, b, c, d); d = rs[d]; c = rs[c];
-       pe[10 * 2] = PC2(c, d, a, b); b = rs[b]; a = rs[a];
-       pe[11 * 2] = PC2(a, b, c, d); d = rs[d]; c = rs[c];
-       pe[12 * 2] = PC2(c, d, a, b); b = rs[b]; a = rs[a];
-       pe[13 * 2] = PC2(a, b, c, d); d = rs[d]; c = rs[c];
-       pe[14 * 2] = PC2(c, d, a, b); b = rs[b];
-       pe[15 * 2] = PC2(b, c, d, a);
+       pe[ 0 * 2] = DES_PC2(a, b, c, d); d = rs[d];
+       pe[ 1 * 2] = DES_PC2(d, a, b, c); c = rs[c]; b = rs[b];
+       pe[ 2 * 2] = DES_PC2(b, c, d, a); a = rs[a]; d = rs[d];
+       pe[ 3 * 2] = DES_PC2(d, a, b, c); c = rs[c]; b = rs[b];
+       pe[ 4 * 2] = DES_PC2(b, c, d, a); a = rs[a]; d = rs[d];
+       pe[ 5 * 2] = DES_PC2(d, a, b, c); c = rs[c]; b = rs[b];
+       pe[ 6 * 2] = DES_PC2(b, c, d, a); a = rs[a]; d = rs[d];
+       pe[ 7 * 2] = DES_PC2(d, a, b, c); c = rs[c];
+       pe[ 8 * 2] = DES_PC2(c, d, a, b); b = rs[b]; a = rs[a];
+       pe[ 9 * 2] = DES_PC2(a, b, c, d); d = rs[d]; c = rs[c];
+       pe[10 * 2] = DES_PC2(c, d, a, b); b = rs[b]; a = rs[a];
+       pe[11 * 2] = DES_PC2(a, b, c, d); d = rs[d]; c = rs[c];
+       pe[12 * 2] = DES_PC2(c, d, a, b); b = rs[b]; a = rs[a];
+       pe[13 * 2] = DES_PC2(a, b, c, d); d = rs[d]; c = rs[c];
+       pe[14 * 2] = DES_PC2(c, d, a, b); b = rs[b];
+       pe[15 * 2] = DES_PC2(b, c, d, a);
 
        /* Skip to next table set */
        pt += 512;
@@ -752,22 +747,22 @@ static void dkey(u32 *pe, const u8 *k)
        b = k[2]; b &= 0xe0; b >>= 4; b |= k[6] & 0xf0; b = pc1[b + 1];
        a = k[3]; a &= 0xe0; a >>= 4; a |= k[7] & 0xf0; a = pc1[a + 1];
 
-       pe[ 0 * 2 + 1] = PC2(a, b, c, d); d = rs[d];
-       pe[ 1 * 2 + 1] = PC2(d, a, b, c); c = rs[c]; b = rs[b];
-       pe[ 2 * 2 + 1] = PC2(b, c, d, a); a = rs[a]; d = rs[d];
-       pe[ 3 * 2 + 1] = PC2(d, a, b, c); c = rs[c]; b = rs[b];
-       pe[ 4 * 2 + 1] = PC2(b, c, d, a); a = rs[a]; d = rs[d];
-       pe[ 5 * 2 + 1] = PC2(d, a, b, c); c = rs[c]; b = rs[b];
-       pe[ 6 * 2 + 1] = PC2(b, c, d, a); a = rs[a]; d = rs[d];
-       pe[ 7 * 2 + 1] = PC2(d, a, b, c); c = rs[c];
-       pe[ 8 * 2 + 1] = PC2(c, d, a, b); b = rs[b]; a = rs[a];
-       pe[ 9 * 2 + 1] = PC2(a, b, c, d); d = rs[d]; c = rs[c];
-       pe[10 * 2 + 1] = PC2(c, d, a, b); b = rs[b]; a = rs[a];
-       pe[11 * 2 + 1] = PC2(a, b, c, d); d = rs[d]; c = rs[c];
-       pe[12 * 2 + 1] = PC2(c, d, a, b); b = rs[b]; a = rs[a];
-       pe[13 * 2 + 1] = PC2(a, b, c, d); d = rs[d]; c = rs[c];
-       pe[14 * 2 + 1] = PC2(c, d, a, b); b = rs[b];
-       pe[15 * 2 + 1] = PC2(b, c, d, a);
+       pe[ 0 * 2 + 1] = DES_PC2(a, b, c, d); d = rs[d];
+       pe[ 1 * 2 + 1] = DES_PC2(d, a, b, c); c = rs[c]; b = rs[b];
+       pe[ 2 * 2 + 1] = DES_PC2(b, c, d, a); a = rs[a]; d = rs[d];
+       pe[ 3 * 2 + 1] = DES_PC2(d, a, b, c); c = rs[c]; b = rs[b];
+       pe[ 4 * 2 + 1] = DES_PC2(b, c, d, a); a = rs[a]; d = rs[d];
+       pe[ 5 * 2 + 1] = DES_PC2(d, a, b, c); c = rs[c]; b = rs[b];
+       pe[ 6 * 2 + 1] = DES_PC2(b, c, d, a); a = rs[a]; d = rs[d];
+       pe[ 7 * 2 + 1] = DES_PC2(d, a, b, c); c = rs[c];
+       pe[ 8 * 2 + 1] = DES_PC2(c, d, a, b); b = rs[b]; a = rs[a];
+       pe[ 9 * 2 + 1] = DES_PC2(a, b, c, d); d = rs[d]; c = rs[c];
+       pe[10 * 2 + 1] = DES_PC2(c, d, a, b); b = rs[b]; a = rs[a];
+       pe[11 * 2 + 1] = DES_PC2(a, b, c, d); d = rs[d]; c = rs[c];
+       pe[12 * 2 + 1] = DES_PC2(c, d, a, b); b = rs[b]; a = rs[a];
+       pe[13 * 2 + 1] = DES_PC2(a, b, c, d); d = rs[d]; c = rs[c];
+       pe[14 * 2 + 1] = DES_PC2(c, d, a, b); b = rs[b];
+       pe[15 * 2 + 1] = DES_PC2(b, c, d, a);
 
        /* Fixup: 2413 5768 -> 1357 2468 */
        for (d = 0; d < 16; ++d) {
@@ -792,7 +787,7 @@ static int des_setkey(struct crypto_tfm *tfm, const u8 *key,
        int ret;
 
        /* Expand to tmp */
-       ret = ekey(tmp, key);
+       ret = des_ekey(tmp, key);
 
        if (unlikely(ret == 0) && (*flags & CRYPTO_TFM_REQ_WEAK_KEY)) {
                *flags |= CRYPTO_TFM_RES_WEAK_KEY;
@@ -873,15 +868,15 @@ static int des3_ede_setkey(struct crypto_tfm *tfm, const u8 *key,
        u32 *flags = &tfm->crt_flags;
 
        if (unlikely(!((K[0] ^ K[2]) | (K[1] ^ K[3])) ||
-                    !((K[2] ^ K[4]) | (K[3] ^ K[5]))))
-       {
-               *flags |= CRYPTO_TFM_RES_BAD_KEY_SCHED;
+                    !((K[2] ^ K[4]) | (K[3] ^ K[5]))) &&
+                    (*flags & CRYPTO_TFM_REQ_WEAK_KEY)) {
+               *flags |= CRYPTO_TFM_RES_WEAK_KEY;
                return -EINVAL;
        }
 
-       ekey(expkey, key); expkey += DES_EXPKEY_WORDS; key += DES_KEY_SIZE;
+       des_ekey(expkey, key); expkey += DES_EXPKEY_WORDS; key += DES_KEY_SIZE;
        dkey(expkey, key); expkey += DES_EXPKEY_WORDS; key += DES_KEY_SIZE;
-       ekey(expkey, key);
+       des_ekey(expkey, key);
 
        return 0;
 }
@@ -982,7 +977,7 @@ static struct crypto_alg des3_ede_alg = {
 
 MODULE_ALIAS("des3_ede");
 
-static int __init init(void)
+static int __init des_generic_mod_init(void)
 {
        int ret = 0;
 
@@ -997,14 +992,14 @@ out:
        return ret;
 }
 
-static void __exit fini(void)
+static void __exit des_generic_mod_fini(void)
 {
        crypto_unregister_alg(&des3_ede_alg);
        crypto_unregister_alg(&des_alg);
 }
 
-module_init(init);
-module_exit(fini);
+module_init(des_generic_mod_init);
+module_exit(des_generic_mod_fini);
 
 MODULE_LICENSE("GPL");
 MODULE_DESCRIPTION("DES & Triple DES EDE Cipher Algorithms");