Signed-off-by: Sebastian Andrzej Siewior <sebast...@breakpoint.cc>
---
 crypto/testmgr.c |   60 +++++++++++++++++++++++++++++++++++++++++++++---------
 1 files changed, 50 insertions(+), 10 deletions(-)

diff --git a/crypto/testmgr.c b/crypto/testmgr.c
index 7620bfc..c471e04 100644
--- a/crypto/testmgr.c
+++ b/crypto/testmgr.c
@@ -20,6 +20,7 @@
 #include <linux/slab.h>
 #include <linux/string.h>
 #include <crypto/rng.h>
+#include <crypto/arc4.h>
 
 #include "internal.h"
 #include "testmgr.h"
@@ -44,6 +45,7 @@
 /*
 * Used by test_cipher()
 */
+#define CRYPT_ARC4 2
 #define ENCRYPT 1
 #define DECRYPT 0
 
@@ -717,7 +719,7 @@ out_nobuf:
        return ret;
 }
 
-static int test_skcipher(struct crypto_ablkcipher *tfm, int enc,
+static int test_skcipher(struct crypto_ablkcipher *tfm, int mode,
                         struct cipher_testvec *template, unsigned int tcount)
 {
        const char *algo =
@@ -736,7 +738,7 @@ static int test_skcipher(struct crypto_ablkcipher *tfm, int 
enc,
        if (testmgr_alloc_buf(xbuf))
                goto out_nobuf;
 
-       if (enc == ENCRYPT)
+       if (mode == ENCRYPT)
                e = "encryption";
        else
                e = "decryption";
@@ -775,7 +777,11 @@ static int test_skcipher(struct crypto_ablkcipher *tfm, 
int enc,
                                crypto_ablkcipher_set_flags(
                                        tfm, CRYPTO_TFM_REQ_WEAK_KEY);
 
-                       ret = crypto_ablkcipher_setkey(tfm, template[i].key,
+                       if (mode == CRYPT_ARC4)
+                               arc4_setup_iv((struct arc4_iv *)iv,
+                                       template[i].key, template[i].klen);
+                       else
+                               ret = crypto_ablkcipher_setkey(tfm, 
template[i].key,
                                                       template[i].klen);
                        if (!ret == template[i].fail) {
                                printk(KERN_ERR "alg: skcipher: setkey failed "
@@ -789,7 +795,7 @@ static int test_skcipher(struct crypto_ablkcipher *tfm, int 
enc,
 
                        ablkcipher_request_set_crypt(req, sg, sg,
                                                     template[i].ilen, iv);
-                       ret = enc ?
+                       ret = mode ?
                                crypto_ablkcipher_encrypt(req) :
                                crypto_ablkcipher_decrypt(req);
 
@@ -839,7 +845,11 @@ static int test_skcipher(struct crypto_ablkcipher *tfm, 
int enc,
                                crypto_ablkcipher_set_flags(
                                        tfm, CRYPTO_TFM_REQ_WEAK_KEY);
 
-                       ret = crypto_ablkcipher_setkey(tfm, template[i].key,
+                       if (mode == CRYPT_ARC4)
+                               arc4_setup_iv((struct arc4_iv *)iv,
+                                       template[i].key, template[i].klen);
+                       else
+                               ret = crypto_ablkcipher_setkey(tfm, 
template[i].key,
                                                       template[i].klen);
                        if (!ret == template[i].fail) {
                                printk(KERN_ERR "alg: skcipher: setkey failed "
@@ -876,7 +886,7 @@ static int test_skcipher(struct crypto_ablkcipher *tfm, int 
enc,
                        ablkcipher_request_set_crypt(req, sg, sg,
                                        template[i].ilen, iv);
 
-                       ret = enc ?
+                       ret = mode ?
                                crypto_ablkcipher_encrypt(req) :
                                crypto_ablkcipher_decrypt(req);
 
@@ -1316,11 +1326,12 @@ out:
        return err;
 }
 
-static int alg_test_skcipher(const struct alg_test_desc *desc,
-                            const char *driver, u32 type, u32 mask)
+static int _alg_test_skcipher(const struct alg_test_desc *desc,
+                            const char *driver, u32 type, u32 mask, u32 arc4)
 {
        struct crypto_ablkcipher *tfm;
        int err = 0;
+       int mode;
 
        tfm = crypto_alloc_ablkcipher(driver, type, mask);
        if (IS_ERR(tfm)) {
@@ -1329,15 +1340,17 @@ static int alg_test_skcipher(const struct alg_test_desc 
*desc,
                return PTR_ERR(tfm);
        }
 
+       mode = arc4 ? CRYPT_ARC4 : ENCRYPT;
        if (desc->suite.cipher.enc.vecs) {
-               err = test_skcipher(tfm, ENCRYPT, desc->suite.cipher.enc.vecs,
+               err = test_skcipher(tfm, mode , desc->suite.cipher.enc.vecs,
                                    desc->suite.cipher.enc.count);
                if (err)
                        goto out;
        }
 
+       mode = arc4 ? CRYPT_ARC4 : DECRYPT;
        if (desc->suite.cipher.dec.vecs)
-               err = test_skcipher(tfm, DECRYPT, desc->suite.cipher.dec.vecs,
+               err = test_skcipher(tfm, mode, desc->suite.cipher.dec.vecs,
                                    desc->suite.cipher.dec.count);
 
 out:
@@ -1345,6 +1358,18 @@ out:
        return err;
 }
 
+static int alg_test_skcipher(const struct alg_test_desc *desc,
+                            const char *driver, u32 type, u32 mask)
+{
+       return _alg_test_skcipher(desc, driver, type, mask, 0);
+}
+
+static int alg_test_arc4_skcipher(const struct alg_test_desc *desc,
+                            const char *driver, u32 type, u32 mask)
+{
+       return _alg_test_skcipher(desc, driver, type, mask, 1);
+}
+
 static int alg_test_comp(const struct alg_test_desc *desc, const char *driver,
                         u32 type, u32 mask)
 {
@@ -1490,6 +1515,21 @@ static const struct alg_test_desc alg_test_descs[] = {
                        }
                }
        }, {
+               .alg = "arc4",
+               .test = alg_test_arc4_skcipher,
+               .suite = {
+                       .cipher = {
+                               .enc = {
+                                       .vecs = arc4_enc_tv_template,
+                                       .count = ARC4_ENC_TEST_VECTORS
+                               },
+                               .dec = {
+                                       .vecs = arc4_dec_tv_template,
+                                       .count = ARC4_DEC_TEST_VECTORS
+                               }
+                       }
+               }
+       }, {
                .alg = "cbc(aes)",
                .test = alg_test_skcipher,
                .fips_allowed = 1,
-- 
1.6.6

--
To unsubscribe from this list: send the line "unsubscribe linux-crypto" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to