Signed-off-by: Sebastian Andrzej Siewior <sebastian@xxxxxxxxxxxxx> --- 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 majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html