aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorEvgeniy Polyakov <johnpol@2ka.mipt.ru>2007-10-11 07:58:16 -0400
committerHerbert Xu <herbert@gondor.apana.org.au>2008-01-10 16:16:03 -0500
commitc3041f9c93e31159f4e321abea7c1549d271e6a7 (patch)
tree12a4b27c2717f2935ccac0f1873c19e09492d4c7
parent16d004a2eda7be2c6a2de63eca2ad3c6b57307b3 (diff)
[CRYPTO] hifn_795x: Detect weak keys
HIFN driver update to use DES weak key checks (exported in this patch). Signed-off-by: Evgeniy Polyakov <johnpol@2ka.mipt.ru> Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
-rw-r--r--crypto/des_generic.c9
-rw-r--r--drivers/crypto/Kconfig2
-rw-r--r--drivers/crypto/hifn_795x.c11
3 files changed, 17 insertions, 5 deletions
diff --git a/crypto/des_generic.c b/crypto/des_generic.c
index f75eafe1a875..355ecb71cb0d 100644
--- a/crypto/des_generic.c
+++ b/crypto/des_generic.c
@@ -628,7 +628,7 @@ static const u32 S8[64] = {
628 * Choice 1 has operated on the key. 628 * Choice 1 has operated on the key.
629 * 629 *
630 */ 630 */
631static unsigned long ekey(u32 *pe, const u8 *k) 631unsigned long des_ekey(u32 *pe, const u8 *k)
632{ 632{
633 /* K&R: long is at least 32 bits */ 633 /* K&R: long is at least 32 bits */
634 unsigned long a, b, c, d, w; 634 unsigned long a, b, c, d, w;
@@ -703,6 +703,7 @@ static unsigned long ekey(u32 *pe, const u8 *k)
703 /* Zero if weak key */ 703 /* Zero if weak key */
704 return w; 704 return w;
705} 705}
706EXPORT_SYMBOL_GPL(des_ekey);
706 707
707/* 708/*
708 * Decryption key expansion 709 * Decryption key expansion
@@ -786,7 +787,7 @@ static int des_setkey(struct crypto_tfm *tfm, const u8 *key,
786 int ret; 787 int ret;
787 788
788 /* Expand to tmp */ 789 /* Expand to tmp */
789 ret = ekey(tmp, key); 790 ret = des_ekey(tmp, key);
790 791
791 if (unlikely(ret == 0) && (*flags & CRYPTO_TFM_REQ_WEAK_KEY)) { 792 if (unlikely(ret == 0) && (*flags & CRYPTO_TFM_REQ_WEAK_KEY)) {
792 *flags |= CRYPTO_TFM_RES_WEAK_KEY; 793 *flags |= CRYPTO_TFM_RES_WEAK_KEY;
@@ -873,9 +874,9 @@ static int des3_ede_setkey(struct crypto_tfm *tfm, const u8 *key,
873 return -EINVAL; 874 return -EINVAL;
874 } 875 }
875 876
876 ekey(expkey, key); expkey += DES_EXPKEY_WORDS; key += DES_KEY_SIZE; 877 des_ekey(expkey, key); expkey += DES_EXPKEY_WORDS; key += DES_KEY_SIZE;
877 dkey(expkey, key); expkey += DES_EXPKEY_WORDS; key += DES_KEY_SIZE; 878 dkey(expkey, key); expkey += DES_EXPKEY_WORDS; key += DES_KEY_SIZE;
878 ekey(expkey, key); 879 des_ekey(expkey, key);
879 880
880 return 0; 881 return 0;
881} 882}
diff --git a/drivers/crypto/Kconfig b/drivers/crypto/Kconfig
index 1ef7697fc998..c2de1351819f 100644
--- a/drivers/crypto/Kconfig
+++ b/drivers/crypto/Kconfig
@@ -85,9 +85,9 @@ config ZCRYPT_MONOLITHIC
85 85
86config CRYPTO_DEV_HIFN_795X 86config CRYPTO_DEV_HIFN_795X
87 tristate "Driver HIFN 795x crypto accelerator chips" 87 tristate "Driver HIFN 795x crypto accelerator chips"
88 select CRYPTO_DES
88 select CRYPTO_ALGAPI 89 select CRYPTO_ALGAPI
89 select CRYPTO_ABLKCIPHER 90 select CRYPTO_ABLKCIPHER
90 select CRYPTO_BLKCIPHER
91 help 91 help
92 This option allows you to have support for HIFN 795x crypto adapters. 92 This option allows you to have support for HIFN 795x crypto adapters.
93 93
diff --git a/drivers/crypto/hifn_795x.c b/drivers/crypto/hifn_795x.c
index e3376f2236b2..391c20a3dff8 100644
--- a/drivers/crypto/hifn_795x.c
+++ b/drivers/crypto/hifn_795x.c
@@ -29,6 +29,7 @@
29#include <linux/crypto.h> 29#include <linux/crypto.h>
30 30
31#include <crypto/algapi.h> 31#include <crypto/algapi.h>
32#include <crypto/des.h>
32 33
33#include <asm/kmap_types.h> 34#include <asm/kmap_types.h>
34 35
@@ -1924,6 +1925,16 @@ static int hifn_setkey(struct crypto_ablkcipher *cipher, const u8 *key,
1924 return -1; 1925 return -1;
1925 } 1926 }
1926 1927
1928 if (len == HIFN_DES_KEY_LENGTH) {
1929 u32 tmp[DES_EXPKEY_WORDS];
1930 int ret = des_ekey(tmp, key);
1931
1932 if (unlikely(ret == 0) && (tfm->crt_flags & CRYPTO_TFM_REQ_WEAK_KEY)) {
1933 tfm->crt_flags |= CRYPTO_TFM_RES_WEAK_KEY;
1934 return -EINVAL;
1935 }
1936 }
1937
1927 dev->flags &= ~HIFN_FLAG_OLD_KEY; 1938 dev->flags &= ~HIFN_FLAG_OLD_KEY;
1928 1939
1929 memcpy(ctx->key, key, len); 1940 memcpy(ctx->key, key, len);