2008-07-31 13:08:25 +04:00
|
|
|
/*
|
|
|
|
* Algorithm testing framework and tests.
|
|
|
|
*
|
|
|
|
* Copyright (c) 2002 James Morris <jmorris@intercode.com.au>
|
|
|
|
* Copyright (c) 2002 Jean-Francois Dive <jef@linuxbe.org>
|
|
|
|
* Copyright (c) 2007 Nokia Siemens Networks
|
|
|
|
* Copyright (c) 2008 Herbert Xu <herbert@gondor.apana.org.au>
|
|
|
|
*
|
2010-11-04 22:02:04 +03:00
|
|
|
* Updated RFC4106 AES-GCM testing.
|
|
|
|
* Authors: Aidan O'Mahony (aidan.o.mahony@intel.com)
|
|
|
|
* Adrian Hoban <adrian.hoban@intel.com>
|
|
|
|
* Gabriele Paoloni <gabriele.paoloni@intel.com>
|
|
|
|
* Tadeusz Struk (tadeusz.struk@intel.com)
|
|
|
|
* Copyright (c) 2010, Intel Corporation.
|
|
|
|
*
|
2008-07-31 13:08:25 +04:00
|
|
|
* This program is free software; you can redistribute it and/or modify it
|
|
|
|
* under the terms of the GNU General Public License as published by the Free
|
|
|
|
* Software Foundation; either version 2 of the License, or (at your option)
|
|
|
|
* any later version.
|
|
|
|
*
|
|
|
|
*/
|
|
|
|
|
2015-04-22 10:06:31 +03:00
|
|
|
#include <crypto/aead.h>
|
2008-07-31 13:08:25 +04:00
|
|
|
#include <crypto/hash.h>
|
2015-08-20 10:21:46 +03:00
|
|
|
#include <crypto/skcipher.h>
|
2008-07-31 13:08:25 +04:00
|
|
|
#include <linux/err.h>
|
2015-04-22 08:25:58 +03:00
|
|
|
#include <linux/fips.h>
|
2008-07-31 13:08:25 +04:00
|
|
|
#include <linux/module.h>
|
|
|
|
#include <linux/scatterlist.h>
|
|
|
|
#include <linux/slab.h>
|
|
|
|
#include <linux/string.h>
|
2009-05-04 15:44:50 +04:00
|
|
|
#include <crypto/rng.h>
|
2014-05-31 19:25:36 +04:00
|
|
|
#include <crypto/drbg.h>
|
2015-06-16 20:31:06 +03:00
|
|
|
#include <crypto/akcipher.h>
|
2016-06-22 19:49:14 +03:00
|
|
|
#include <crypto/kpp.h>
|
2016-10-21 15:19:54 +03:00
|
|
|
#include <crypto/acompress.h>
|
2008-07-31 13:08:25 +04:00
|
|
|
|
|
|
|
#include "internal.h"
|
2010-06-03 14:53:43 +04:00
|
|
|
|
2016-05-03 12:00:17 +03:00
|
|
|
static bool notests;
|
|
|
|
module_param(notests, bool, 0644);
|
|
|
|
MODULE_PARM_DESC(notests, "disable crypto self-tests");
|
|
|
|
|
2010-08-06 05:40:28 +04:00
|
|
|
#ifdef CONFIG_CRYPTO_MANAGER_DISABLE_TESTS
|
2010-06-03 14:53:43 +04:00
|
|
|
|
|
|
|
/* a perfect nop */
|
|
|
|
int alg_test(const char *driver, const char *alg, u32 type, u32 mask)
|
|
|
|
{
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
#else
|
|
|
|
|
2008-07-31 13:08:25 +04:00
|
|
|
#include "testmgr.h"
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Need slab memory for testing (size in number of pages).
|
|
|
|
*/
|
|
|
|
#define XBUFSIZE 8
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Indexes into the xbuf to simulate cross-page access.
|
|
|
|
*/
|
|
|
|
#define IDX1 32
|
|
|
|
#define IDX2 32400
|
2016-12-08 11:23:52 +03:00
|
|
|
#define IDX3 1511
|
2008-07-31 13:08:25 +04:00
|
|
|
#define IDX4 8193
|
|
|
|
#define IDX5 22222
|
|
|
|
#define IDX6 17101
|
|
|
|
#define IDX7 27333
|
|
|
|
#define IDX8 3000
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Used by test_cipher()
|
|
|
|
*/
|
|
|
|
#define ENCRYPT 1
|
|
|
|
#define DECRYPT 0
|
|
|
|
|
|
|
|
struct aead_test_suite {
|
|
|
|
struct {
|
2017-02-25 02:46:59 +03:00
|
|
|
const struct aead_testvec *vecs;
|
2008-07-31 13:08:25 +04:00
|
|
|
unsigned int count;
|
|
|
|
} enc, dec;
|
|
|
|
};
|
|
|
|
|
|
|
|
struct cipher_test_suite {
|
crypto: testmgr - eliminate redundant decryption test vectors
Currently testmgr has separate encryption and decryption test vectors
for symmetric ciphers. That's massively redundant, since with few
exceptions (mostly mistakes, apparently), all decryption tests are
identical to the encryption tests, just with the input/result flipped.
Therefore, eliminate the redundancy by removing the decryption test
vectors and updating testmgr to test both encryption and decryption
using what used to be the encryption test vectors. Naming is adjusted
accordingly: each cipher_testvec now has a 'ptext' (plaintext), 'ctext'
(ciphertext), and 'len' instead of an 'input', 'result', 'ilen', and
'rlen'. Note that it was always the case that 'ilen == rlen'.
AES keywrap ("kw(aes)") is special because its IV is generated by the
encryption. Previously this was handled by specifying 'iv_out' for
encryption and 'iv' for decryption. To make it work cleanly with only
one set of test vectors, put the IV in 'iv', remove 'iv_out', and add a
boolean that indicates that the IV is generated by the encryption.
In total, this removes over 10000 lines from testmgr.h, with no
reduction in test coverage since prior patches already copied the few
unique decryption test vectors into the encryption test vectors.
This covers all algorithms that used 'struct cipher_testvec', e.g. any
block cipher in the ECB, CBC, CTR, XTS, LRW, CTS-CBC, PCBC, OFB, or
keywrap modes, and Salsa20 and ChaCha20. No change is made to AEAD
tests, though we probably can eliminate a similar redundancy there too.
The testmgr.h portion of this patch was automatically generated using
the following awk script, with some slight manual fixups on top (updated
'struct cipher_testvec' definition, updated a few comments, and fixed up
the AES keywrap test vectors):
BEGIN { OTHER = 0; ENCVEC = 1; DECVEC = 2; DECVEC_TAIL = 3; mode = OTHER }
/^static const struct cipher_testvec.*_enc_/ { sub("_enc", ""); mode = ENCVEC }
/^static const struct cipher_testvec.*_dec_/ { mode = DECVEC }
mode == ENCVEC && !/\.ilen[[:space:]]*=/ {
sub(/\.input[[:space:]]*=$/, ".ptext =")
sub(/\.input[[:space:]]*=/, ".ptext\t=")
sub(/\.result[[:space:]]*=$/, ".ctext =")
sub(/\.result[[:space:]]*=/, ".ctext\t=")
sub(/\.rlen[[:space:]]*=/, ".len\t=")
print
}
mode == DECVEC_TAIL && /[^[:space:]]/ { mode = OTHER }
mode == OTHER { print }
mode == ENCVEC && /^};/ { mode = OTHER }
mode == DECVEC && /^};/ { mode = DECVEC_TAIL }
Note that git's default diff algorithm gets confused by the testmgr.h
portion of this patch, and reports too many lines added and removed.
It's better viewed with 'git diff --minimal' (or 'git show --minimal'),
which reports "2 files changed, 919 insertions(+), 11723 deletions(-)".
Signed-off-by: Eric Biggers <ebiggers@google.com>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
2018-05-21 08:50:29 +03:00
|
|
|
const struct cipher_testvec *vecs;
|
|
|
|
unsigned int count;
|
2008-07-31 13:08:25 +04:00
|
|
|
};
|
|
|
|
|
|
|
|
struct comp_test_suite {
|
|
|
|
struct {
|
2017-02-25 02:46:59 +03:00
|
|
|
const struct comp_testvec *vecs;
|
2008-07-31 13:08:25 +04:00
|
|
|
unsigned int count;
|
|
|
|
} comp, decomp;
|
|
|
|
};
|
|
|
|
|
|
|
|
struct hash_test_suite {
|
2017-02-25 02:46:59 +03:00
|
|
|
const struct hash_testvec *vecs;
|
2008-07-31 13:08:25 +04:00
|
|
|
unsigned int count;
|
|
|
|
};
|
|
|
|
|
2009-05-04 15:44:50 +04:00
|
|
|
struct cprng_test_suite {
|
2017-02-25 02:46:59 +03:00
|
|
|
const struct cprng_testvec *vecs;
|
2009-05-04 15:44:50 +04:00
|
|
|
unsigned int count;
|
|
|
|
};
|
|
|
|
|
2014-05-31 19:25:36 +04:00
|
|
|
struct drbg_test_suite {
|
2017-02-25 02:46:59 +03:00
|
|
|
const struct drbg_testvec *vecs;
|
2014-05-31 19:25:36 +04:00
|
|
|
unsigned int count;
|
|
|
|
};
|
|
|
|
|
2015-06-16 20:31:06 +03:00
|
|
|
struct akcipher_test_suite {
|
2017-02-25 02:46:59 +03:00
|
|
|
const struct akcipher_testvec *vecs;
|
2015-06-16 20:31:06 +03:00
|
|
|
unsigned int count;
|
|
|
|
};
|
|
|
|
|
2016-06-22 19:49:14 +03:00
|
|
|
struct kpp_test_suite {
|
2017-02-25 02:46:59 +03:00
|
|
|
const struct kpp_testvec *vecs;
|
2016-06-22 19:49:14 +03:00
|
|
|
unsigned int count;
|
|
|
|
};
|
|
|
|
|
2008-07-31 13:08:25 +04:00
|
|
|
struct alg_test_desc {
|
|
|
|
const char *alg;
|
|
|
|
int (*test)(const struct alg_test_desc *desc, const char *driver,
|
|
|
|
u32 type, u32 mask);
|
2009-05-15 09:16:03 +04:00
|
|
|
int fips_allowed; /* set if alg is allowed in fips mode */
|
2008-07-31 13:08:25 +04:00
|
|
|
|
|
|
|
union {
|
|
|
|
struct aead_test_suite aead;
|
|
|
|
struct cipher_test_suite cipher;
|
|
|
|
struct comp_test_suite comp;
|
|
|
|
struct hash_test_suite hash;
|
2009-05-04 15:44:50 +04:00
|
|
|
struct cprng_test_suite cprng;
|
2014-05-31 19:25:36 +04:00
|
|
|
struct drbg_test_suite drbg;
|
2015-06-16 20:31:06 +03:00
|
|
|
struct akcipher_test_suite akcipher;
|
2016-06-22 19:49:14 +03:00
|
|
|
struct kpp_test_suite kpp;
|
2008-07-31 13:08:25 +04:00
|
|
|
} suite;
|
|
|
|
};
|
|
|
|
|
2017-02-25 02:46:59 +03:00
|
|
|
static const unsigned int IDX[8] = {
|
|
|
|
IDX1, IDX2, IDX3, IDX4, IDX5, IDX6, IDX7, IDX8 };
|
2008-07-31 13:08:25 +04:00
|
|
|
|
|
|
|
static void hexdump(unsigned char *buf, unsigned int len)
|
|
|
|
{
|
|
|
|
print_hex_dump(KERN_CONT, "", DUMP_PREFIX_OFFSET,
|
|
|
|
16, 1,
|
|
|
|
buf, len, false);
|
|
|
|
}
|
|
|
|
|
2009-05-06 10:15:47 +04:00
|
|
|
static int testmgr_alloc_buf(char *buf[XBUFSIZE])
|
|
|
|
{
|
|
|
|
int i;
|
|
|
|
|
|
|
|
for (i = 0; i < XBUFSIZE; i++) {
|
|
|
|
buf[i] = (void *)__get_free_page(GFP_KERNEL);
|
|
|
|
if (!buf[i])
|
|
|
|
goto err_free_buf;
|
|
|
|
}
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
|
|
|
|
err_free_buf:
|
|
|
|
while (i-- > 0)
|
|
|
|
free_page((unsigned long)buf[i]);
|
|
|
|
|
|
|
|
return -ENOMEM;
|
|
|
|
}
|
|
|
|
|
|
|
|
static void testmgr_free_buf(char *buf[XBUFSIZE])
|
|
|
|
{
|
|
|
|
int i;
|
|
|
|
|
|
|
|
for (i = 0; i < XBUFSIZE; i++)
|
|
|
|
free_page((unsigned long)buf[i]);
|
|
|
|
}
|
|
|
|
|
2018-01-16 17:26:13 +03:00
|
|
|
static int ahash_guard_result(char *result, char c, int size)
|
|
|
|
{
|
|
|
|
int i;
|
|
|
|
|
|
|
|
for (i = 0; i < size; i++) {
|
|
|
|
if (result[i] != c)
|
|
|
|
return -EINVAL;
|
|
|
|
}
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2016-02-03 13:26:57 +03:00
|
|
|
static int ahash_partial_update(struct ahash_request **preq,
|
2017-02-25 02:46:59 +03:00
|
|
|
struct crypto_ahash *tfm, const struct hash_testvec *template,
|
2016-02-03 13:26:57 +03:00
|
|
|
void *hash_buff, int k, int temp, struct scatterlist *sg,
|
2017-10-18 10:00:43 +03:00
|
|
|
const char *algo, char *result, struct crypto_wait *wait)
|
2016-02-03 13:26:57 +03:00
|
|
|
{
|
|
|
|
char *state;
|
|
|
|
struct ahash_request *req;
|
|
|
|
int statesize, ret = -EINVAL;
|
2018-01-01 23:40:14 +03:00
|
|
|
static const unsigned char guard[] = { 0x00, 0xba, 0xad, 0x00 };
|
2018-01-16 17:26:13 +03:00
|
|
|
int digestsize = crypto_ahash_digestsize(tfm);
|
2016-02-03 13:26:57 +03:00
|
|
|
|
|
|
|
req = *preq;
|
|
|
|
statesize = crypto_ahash_statesize(
|
|
|
|
crypto_ahash_reqtfm(req));
|
2016-09-28 17:38:37 +03:00
|
|
|
state = kmalloc(statesize + sizeof(guard), GFP_KERNEL);
|
2016-02-03 13:26:57 +03:00
|
|
|
if (!state) {
|
2017-06-05 08:33:43 +03:00
|
|
|
pr_err("alg: hash: Failed to alloc state for %s\n", algo);
|
2016-02-03 13:26:57 +03:00
|
|
|
goto out_nostate;
|
|
|
|
}
|
2016-09-28 17:38:37 +03:00
|
|
|
memcpy(state + statesize, guard, sizeof(guard));
|
2018-01-16 17:26:13 +03:00
|
|
|
memset(result, 1, digestsize);
|
2016-02-03 13:26:57 +03:00
|
|
|
ret = crypto_ahash_export(req, state);
|
2016-09-28 17:38:37 +03:00
|
|
|
WARN_ON(memcmp(state + statesize, guard, sizeof(guard)));
|
2016-02-03 13:26:57 +03:00
|
|
|
if (ret) {
|
2017-06-05 08:33:43 +03:00
|
|
|
pr_err("alg: hash: Failed to export() for %s\n", algo);
|
2016-02-03 13:26:57 +03:00
|
|
|
goto out;
|
|
|
|
}
|
2018-01-16 17:26:13 +03:00
|
|
|
ret = ahash_guard_result(result, 1, digestsize);
|
|
|
|
if (ret) {
|
|
|
|
pr_err("alg: hash: Failed, export used req->result for %s\n",
|
|
|
|
algo);
|
|
|
|
goto out;
|
|
|
|
}
|
2016-02-03 13:26:57 +03:00
|
|
|
ahash_request_free(req);
|
|
|
|
req = ahash_request_alloc(tfm, GFP_KERNEL);
|
|
|
|
if (!req) {
|
|
|
|
pr_err("alg: hash: Failed to alloc request for %s\n", algo);
|
|
|
|
goto out_noreq;
|
|
|
|
}
|
|
|
|
ahash_request_set_callback(req,
|
|
|
|
CRYPTO_TFM_REQ_MAY_BACKLOG,
|
2017-10-18 10:00:43 +03:00
|
|
|
crypto_req_done, wait);
|
2016-02-03 13:26:57 +03:00
|
|
|
|
|
|
|
memcpy(hash_buff, template->plaintext + temp,
|
|
|
|
template->tap[k]);
|
|
|
|
sg_init_one(&sg[0], hash_buff, template->tap[k]);
|
|
|
|
ahash_request_set_crypt(req, sg, result, template->tap[k]);
|
|
|
|
ret = crypto_ahash_import(req, state);
|
|
|
|
if (ret) {
|
|
|
|
pr_err("alg: hash: Failed to import() for %s\n", algo);
|
|
|
|
goto out;
|
|
|
|
}
|
2018-01-16 17:26:13 +03:00
|
|
|
ret = ahash_guard_result(result, 1, digestsize);
|
|
|
|
if (ret) {
|
|
|
|
pr_err("alg: hash: Failed, import used req->result for %s\n",
|
|
|
|
algo);
|
|
|
|
goto out;
|
|
|
|
}
|
2017-10-18 10:00:43 +03:00
|
|
|
ret = crypto_wait_req(crypto_ahash_update(req), wait);
|
2016-02-03 13:26:57 +03:00
|
|
|
if (ret)
|
|
|
|
goto out;
|
|
|
|
*preq = req;
|
|
|
|
ret = 0;
|
|
|
|
goto out_noreq;
|
|
|
|
out:
|
|
|
|
ahash_request_free(req);
|
|
|
|
out_noreq:
|
|
|
|
kfree(state);
|
|
|
|
out_nostate:
|
|
|
|
return ret;
|
|
|
|
}
|
|
|
|
|
2018-07-01 10:02:35 +03:00
|
|
|
enum hash_test {
|
|
|
|
HASH_TEST_DIGEST,
|
|
|
|
HASH_TEST_FINAL,
|
|
|
|
HASH_TEST_FINUP
|
|
|
|
};
|
|
|
|
|
2017-02-25 02:46:59 +03:00
|
|
|
static int __test_hash(struct crypto_ahash *tfm,
|
|
|
|
const struct hash_testvec *template, unsigned int tcount,
|
2018-07-01 10:02:35 +03:00
|
|
|
enum hash_test test_type, const int align_offset)
|
2008-07-31 13:08:25 +04:00
|
|
|
{
|
|
|
|
const char *algo = crypto_tfm_alg_driver_name(crypto_ahash_tfm(tfm));
|
2017-01-11 02:24:46 +03:00
|
|
|
size_t digest_size = crypto_ahash_digestsize(tfm);
|
2008-07-31 13:08:25 +04:00
|
|
|
unsigned int i, j, k, temp;
|
|
|
|
struct scatterlist sg[8];
|
2014-07-23 12:59:38 +04:00
|
|
|
char *result;
|
|
|
|
char *key;
|
2008-07-31 13:08:25 +04:00
|
|
|
struct ahash_request *req;
|
2017-10-18 10:00:43 +03:00
|
|
|
struct crypto_wait wait;
|
2008-07-31 13:08:25 +04:00
|
|
|
void *hash_buff;
|
2009-05-06 10:15:47 +04:00
|
|
|
char *xbuf[XBUFSIZE];
|
|
|
|
int ret = -ENOMEM;
|
|
|
|
|
2017-01-11 02:24:46 +03:00
|
|
|
result = kmalloc(digest_size, GFP_KERNEL);
|
2014-07-23 12:59:38 +04:00
|
|
|
if (!result)
|
|
|
|
return ret;
|
|
|
|
key = kmalloc(MAX_KEYLEN, GFP_KERNEL);
|
|
|
|
if (!key)
|
|
|
|
goto out_nobuf;
|
2009-05-06 10:15:47 +04:00
|
|
|
if (testmgr_alloc_buf(xbuf))
|
|
|
|
goto out_nobuf;
|
2008-07-31 13:08:25 +04:00
|
|
|
|
2017-10-18 10:00:43 +03:00
|
|
|
crypto_init_wait(&wait);
|
2008-07-31 13:08:25 +04:00
|
|
|
|
|
|
|
req = ahash_request_alloc(tfm, GFP_KERNEL);
|
|
|
|
if (!req) {
|
|
|
|
printk(KERN_ERR "alg: hash: Failed to allocate request for "
|
|
|
|
"%s\n", algo);
|
|
|
|
goto out_noreq;
|
|
|
|
}
|
|
|
|
ahash_request_set_callback(req, CRYPTO_TFM_REQ_MAY_BACKLOG,
|
2017-10-18 10:00:43 +03:00
|
|
|
crypto_req_done, &wait);
|
2008-07-31 13:08:25 +04:00
|
|
|
|
2009-05-29 10:23:12 +04:00
|
|
|
j = 0;
|
2008-07-31 13:08:25 +04:00
|
|
|
for (i = 0; i < tcount; i++) {
|
2009-05-29 10:23:12 +04:00
|
|
|
if (template[i].np)
|
|
|
|
continue;
|
|
|
|
|
2013-06-13 18:37:55 +04:00
|
|
|
ret = -EINVAL;
|
|
|
|
if (WARN_ON(align_offset + template[i].psize > PAGE_SIZE))
|
|
|
|
goto out;
|
|
|
|
|
2009-05-29 10:23:12 +04:00
|
|
|
j++;
|
2017-01-11 02:24:46 +03:00
|
|
|
memset(result, 0, digest_size);
|
2008-07-31 13:08:25 +04:00
|
|
|
|
|
|
|
hash_buff = xbuf[0];
|
2013-06-13 18:37:55 +04:00
|
|
|
hash_buff += align_offset;
|
2008-07-31 13:08:25 +04:00
|
|
|
|
|
|
|
memcpy(hash_buff, template[i].plaintext, template[i].psize);
|
|
|
|
sg_init_one(&sg[0], hash_buff, template[i].psize);
|
|
|
|
|
|
|
|
if (template[i].ksize) {
|
|
|
|
crypto_ahash_clear_flags(tfm, ~0);
|
2014-07-23 12:59:38 +04:00
|
|
|
if (template[i].ksize > MAX_KEYLEN) {
|
|
|
|
pr_err("alg: hash: setkey failed on test %d for %s: key size %d > %d\n",
|
|
|
|
j, algo, template[i].ksize, MAX_KEYLEN);
|
|
|
|
ret = -EINVAL;
|
|
|
|
goto out;
|
|
|
|
}
|
|
|
|
memcpy(key, template[i].key, template[i].ksize);
|
|
|
|
ret = crypto_ahash_setkey(tfm, key, template[i].ksize);
|
2008-07-31 13:08:25 +04:00
|
|
|
if (ret) {
|
|
|
|
printk(KERN_ERR "alg: hash: setkey failed on "
|
2009-05-29 10:23:12 +04:00
|
|
|
"test %d for %s: ret=%d\n", j, algo,
|
2008-07-31 13:08:25 +04:00
|
|
|
-ret);
|
|
|
|
goto out;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
ahash_request_set_crypt(req, sg, result, template[i].psize);
|
2018-07-01 10:02:35 +03:00
|
|
|
switch (test_type) {
|
|
|
|
case HASH_TEST_DIGEST:
|
2017-10-18 10:00:43 +03:00
|
|
|
ret = crypto_wait_req(crypto_ahash_digest(req), &wait);
|
2010-05-19 08:12:03 +04:00
|
|
|
if (ret) {
|
|
|
|
pr_err("alg: hash: digest failed on test %d "
|
|
|
|
"for %s: ret=%d\n", j, algo, -ret);
|
|
|
|
goto out;
|
|
|
|
}
|
2018-07-01 10:02:35 +03:00
|
|
|
break;
|
|
|
|
|
|
|
|
case HASH_TEST_FINAL:
|
2018-01-16 17:26:13 +03:00
|
|
|
memset(result, 1, digest_size);
|
2017-10-18 10:00:43 +03:00
|
|
|
ret = crypto_wait_req(crypto_ahash_init(req), &wait);
|
2010-05-19 08:12:03 +04:00
|
|
|
if (ret) {
|
2017-06-05 08:33:43 +03:00
|
|
|
pr_err("alg: hash: init failed on test %d "
|
2010-05-19 08:12:03 +04:00
|
|
|
"for %s: ret=%d\n", j, algo, -ret);
|
|
|
|
goto out;
|
|
|
|
}
|
2018-01-16 17:26:13 +03:00
|
|
|
ret = ahash_guard_result(result, 1, digest_size);
|
|
|
|
if (ret) {
|
|
|
|
pr_err("alg: hash: init failed on test %d "
|
|
|
|
"for %s: used req->result\n", j, algo);
|
|
|
|
goto out;
|
|
|
|
}
|
2017-10-18 10:00:43 +03:00
|
|
|
ret = crypto_wait_req(crypto_ahash_update(req), &wait);
|
2010-05-19 08:12:03 +04:00
|
|
|
if (ret) {
|
2017-06-05 08:33:43 +03:00
|
|
|
pr_err("alg: hash: update failed on test %d "
|
2010-05-19 08:12:03 +04:00
|
|
|
"for %s: ret=%d\n", j, algo, -ret);
|
|
|
|
goto out;
|
|
|
|
}
|
2018-01-16 17:26:13 +03:00
|
|
|
ret = ahash_guard_result(result, 1, digest_size);
|
|
|
|
if (ret) {
|
|
|
|
pr_err("alg: hash: update failed on test %d "
|
|
|
|
"for %s: used req->result\n", j, algo);
|
|
|
|
goto out;
|
|
|
|
}
|
2017-10-18 10:00:43 +03:00
|
|
|
ret = crypto_wait_req(crypto_ahash_final(req), &wait);
|
2010-05-19 08:12:03 +04:00
|
|
|
if (ret) {
|
2017-06-05 08:33:43 +03:00
|
|
|
pr_err("alg: hash: final failed on test %d "
|
2010-05-19 08:12:03 +04:00
|
|
|
"for %s: ret=%d\n", j, algo, -ret);
|
|
|
|
goto out;
|
2008-07-31 13:08:25 +04:00
|
|
|
}
|
2018-07-01 10:02:35 +03:00
|
|
|
break;
|
|
|
|
|
|
|
|
case HASH_TEST_FINUP:
|
|
|
|
memset(result, 1, digest_size);
|
|
|
|
ret = crypto_wait_req(crypto_ahash_init(req), &wait);
|
|
|
|
if (ret) {
|
|
|
|
pr_err("alg: hash: init failed on test %d "
|
|
|
|
"for %s: ret=%d\n", j, algo, -ret);
|
|
|
|
goto out;
|
|
|
|
}
|
|
|
|
ret = ahash_guard_result(result, 1, digest_size);
|
|
|
|
if (ret) {
|
|
|
|
pr_err("alg: hash: init failed on test %d "
|
|
|
|
"for %s: used req->result\n", j, algo);
|
|
|
|
goto out;
|
|
|
|
}
|
|
|
|
ret = crypto_wait_req(crypto_ahash_finup(req), &wait);
|
|
|
|
if (ret) {
|
|
|
|
pr_err("alg: hash: final failed on test %d "
|
|
|
|
"for %s: ret=%d\n", j, algo, -ret);
|
|
|
|
goto out;
|
|
|
|
}
|
|
|
|
break;
|
2008-07-31 13:08:25 +04:00
|
|
|
}
|
|
|
|
|
|
|
|
if (memcmp(result, template[i].digest,
|
|
|
|
crypto_ahash_digestsize(tfm))) {
|
|
|
|
printk(KERN_ERR "alg: hash: Test %d failed for %s\n",
|
2009-05-29 10:23:12 +04:00
|
|
|
j, algo);
|
2008-07-31 13:08:25 +04:00
|
|
|
hexdump(result, crypto_ahash_digestsize(tfm));
|
|
|
|
ret = -EINVAL;
|
|
|
|
goto out;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2018-07-01 10:02:35 +03:00
|
|
|
if (test_type)
|
|
|
|
goto out;
|
|
|
|
|
2008-07-31 13:08:25 +04:00
|
|
|
j = 0;
|
|
|
|
for (i = 0; i < tcount; i++) {
|
2013-06-13 18:37:55 +04:00
|
|
|
/* alignment tests are only done with continuous buffers */
|
|
|
|
if (align_offset != 0)
|
|
|
|
break;
|
|
|
|
|
2014-08-08 15:27:50 +04:00
|
|
|
if (!template[i].np)
|
|
|
|
continue;
|
2008-07-31 13:08:25 +04:00
|
|
|
|
2014-08-08 15:27:50 +04:00
|
|
|
j++;
|
2017-01-11 02:24:46 +03:00
|
|
|
memset(result, 0, digest_size);
|
2008-07-31 13:08:25 +04:00
|
|
|
|
2014-08-08 15:27:50 +04:00
|
|
|
temp = 0;
|
|
|
|
sg_init_table(sg, template[i].np);
|
|
|
|
ret = -EINVAL;
|
|
|
|
for (k = 0; k < template[i].np; k++) {
|
|
|
|
if (WARN_ON(offset_in_page(IDX[k]) +
|
|
|
|
template[i].tap[k] > PAGE_SIZE))
|
|
|
|
goto out;
|
|
|
|
sg_set_buf(&sg[k],
|
|
|
|
memcpy(xbuf[IDX[k] >> PAGE_SHIFT] +
|
|
|
|
offset_in_page(IDX[k]),
|
|
|
|
template[i].plaintext + temp,
|
|
|
|
template[i].tap[k]),
|
|
|
|
template[i].tap[k]);
|
|
|
|
temp += template[i].tap[k];
|
|
|
|
}
|
2008-07-31 13:08:25 +04:00
|
|
|
|
2014-08-08 15:27:50 +04:00
|
|
|
if (template[i].ksize) {
|
|
|
|
if (template[i].ksize > MAX_KEYLEN) {
|
|
|
|
pr_err("alg: hash: setkey failed on test %d for %s: key size %d > %d\n",
|
|
|
|
j, algo, template[i].ksize, MAX_KEYLEN);
|
|
|
|
ret = -EINVAL;
|
2008-07-31 13:08:25 +04:00
|
|
|
goto out;
|
|
|
|
}
|
2014-08-08 15:27:50 +04:00
|
|
|
crypto_ahash_clear_flags(tfm, ~0);
|
|
|
|
memcpy(key, template[i].key, template[i].ksize);
|
|
|
|
ret = crypto_ahash_setkey(tfm, key, template[i].ksize);
|
2008-07-31 13:08:25 +04:00
|
|
|
|
2014-08-08 15:27:50 +04:00
|
|
|
if (ret) {
|
|
|
|
printk(KERN_ERR "alg: hash: setkey "
|
|
|
|
"failed on chunking test %d "
|
|
|
|
"for %s: ret=%d\n", j, algo, -ret);
|
2008-07-31 13:08:25 +04:00
|
|
|
goto out;
|
|
|
|
}
|
|
|
|
}
|
2014-08-08 15:27:50 +04:00
|
|
|
|
|
|
|
ahash_request_set_crypt(req, sg, result, template[i].psize);
|
2017-10-18 10:00:43 +03:00
|
|
|
ret = crypto_wait_req(crypto_ahash_digest(req), &wait);
|
|
|
|
if (ret) {
|
|
|
|
pr_err("alg: hash: digest failed on chunking test %d for %s: ret=%d\n",
|
|
|
|
j, algo, -ret);
|
2014-08-08 15:27:50 +04:00
|
|
|
goto out;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (memcmp(result, template[i].digest,
|
|
|
|
crypto_ahash_digestsize(tfm))) {
|
|
|
|
printk(KERN_ERR "alg: hash: Chunking test %d "
|
|
|
|
"failed for %s\n", j, algo);
|
|
|
|
hexdump(result, crypto_ahash_digestsize(tfm));
|
|
|
|
ret = -EINVAL;
|
2016-02-03 13:26:57 +03:00
|
|
|
goto out;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/* partial update exercise */
|
|
|
|
j = 0;
|
|
|
|
for (i = 0; i < tcount; i++) {
|
|
|
|
/* alignment tests are only done with continuous buffers */
|
|
|
|
if (align_offset != 0)
|
|
|
|
break;
|
|
|
|
|
|
|
|
if (template[i].np < 2)
|
|
|
|
continue;
|
|
|
|
|
|
|
|
j++;
|
2017-01-11 02:24:46 +03:00
|
|
|
memset(result, 0, digest_size);
|
2016-02-03 13:26:57 +03:00
|
|
|
|
|
|
|
ret = -EINVAL;
|
|
|
|
hash_buff = xbuf[0];
|
|
|
|
memcpy(hash_buff, template[i].plaintext,
|
|
|
|
template[i].tap[0]);
|
|
|
|
sg_init_one(&sg[0], hash_buff, template[i].tap[0]);
|
|
|
|
|
|
|
|
if (template[i].ksize) {
|
|
|
|
crypto_ahash_clear_flags(tfm, ~0);
|
|
|
|
if (template[i].ksize > MAX_KEYLEN) {
|
|
|
|
pr_err("alg: hash: setkey failed on test %d for %s: key size %d > %d\n",
|
|
|
|
j, algo, template[i].ksize, MAX_KEYLEN);
|
|
|
|
ret = -EINVAL;
|
|
|
|
goto out;
|
|
|
|
}
|
|
|
|
memcpy(key, template[i].key, template[i].ksize);
|
|
|
|
ret = crypto_ahash_setkey(tfm, key, template[i].ksize);
|
|
|
|
if (ret) {
|
|
|
|
pr_err("alg: hash: setkey failed on test %d for %s: ret=%d\n",
|
|
|
|
j, algo, -ret);
|
|
|
|
goto out;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
ahash_request_set_crypt(req, sg, result, template[i].tap[0]);
|
2017-10-18 10:00:43 +03:00
|
|
|
ret = crypto_wait_req(crypto_ahash_init(req), &wait);
|
2016-02-03 13:26:57 +03:00
|
|
|
if (ret) {
|
2017-06-05 08:33:43 +03:00
|
|
|
pr_err("alg: hash: init failed on test %d for %s: ret=%d\n",
|
2016-02-03 13:26:57 +03:00
|
|
|
j, algo, -ret);
|
|
|
|
goto out;
|
|
|
|
}
|
2017-10-18 10:00:43 +03:00
|
|
|
ret = crypto_wait_req(crypto_ahash_update(req), &wait);
|
2016-02-03 13:26:57 +03:00
|
|
|
if (ret) {
|
2017-06-05 08:33:43 +03:00
|
|
|
pr_err("alg: hash: update failed on test %d for %s: ret=%d\n",
|
2016-02-03 13:26:57 +03:00
|
|
|
j, algo, -ret);
|
|
|
|
goto out;
|
|
|
|
}
|
|
|
|
|
|
|
|
temp = template[i].tap[0];
|
|
|
|
for (k = 1; k < template[i].np; k++) {
|
|
|
|
ret = ahash_partial_update(&req, tfm, &template[i],
|
|
|
|
hash_buff, k, temp, &sg[0], algo, result,
|
2017-10-18 10:00:43 +03:00
|
|
|
&wait);
|
2016-02-03 13:26:57 +03:00
|
|
|
if (ret) {
|
2017-06-05 08:33:43 +03:00
|
|
|
pr_err("alg: hash: partial update failed on test %d for %s: ret=%d\n",
|
2016-02-03 13:26:57 +03:00
|
|
|
j, algo, -ret);
|
|
|
|
goto out_noreq;
|
|
|
|
}
|
|
|
|
temp += template[i].tap[k];
|
|
|
|
}
|
2017-10-18 10:00:43 +03:00
|
|
|
ret = crypto_wait_req(crypto_ahash_final(req), &wait);
|
2016-02-03 13:26:57 +03:00
|
|
|
if (ret) {
|
2017-06-05 08:33:43 +03:00
|
|
|
pr_err("alg: hash: final failed on test %d for %s: ret=%d\n",
|
2016-02-03 13:26:57 +03:00
|
|
|
j, algo, -ret);
|
|
|
|
goto out;
|
|
|
|
}
|
|
|
|
if (memcmp(result, template[i].digest,
|
|
|
|
crypto_ahash_digestsize(tfm))) {
|
|
|
|
pr_err("alg: hash: Partial Test %d failed for %s\n",
|
|
|
|
j, algo);
|
|
|
|
hexdump(result, crypto_ahash_digestsize(tfm));
|
|
|
|
ret = -EINVAL;
|
2014-08-08 15:27:50 +04:00
|
|
|
goto out;
|
|
|
|
}
|
2008-07-31 13:08:25 +04:00
|
|
|
}
|
|
|
|
|
|
|
|
ret = 0;
|
|
|
|
|
|
|
|
out:
|
|
|
|
ahash_request_free(req);
|
|
|
|
out_noreq:
|
2009-05-06 10:15:47 +04:00
|
|
|
testmgr_free_buf(xbuf);
|
|
|
|
out_nobuf:
|
2014-07-23 12:59:38 +04:00
|
|
|
kfree(key);
|
|
|
|
kfree(result);
|
2008-07-31 13:08:25 +04:00
|
|
|
return ret;
|
|
|
|
}
|
|
|
|
|
2017-02-25 02:46:59 +03:00
|
|
|
static int test_hash(struct crypto_ahash *tfm,
|
|
|
|
const struct hash_testvec *template,
|
2018-07-01 10:02:35 +03:00
|
|
|
unsigned int tcount, enum hash_test test_type)
|
2013-06-13 18:37:55 +04:00
|
|
|
{
|
|
|
|
unsigned int alignmask;
|
|
|
|
int ret;
|
|
|
|
|
2018-07-01 10:02:35 +03:00
|
|
|
ret = __test_hash(tfm, template, tcount, test_type, 0);
|
2013-06-13 18:37:55 +04:00
|
|
|
if (ret)
|
|
|
|
return ret;
|
|
|
|
|
|
|
|
/* test unaligned buffers, check with one byte offset */
|
2018-07-01 10:02:35 +03:00
|
|
|
ret = __test_hash(tfm, template, tcount, test_type, 1);
|
2013-06-13 18:37:55 +04:00
|
|
|
if (ret)
|
|
|
|
return ret;
|
|
|
|
|
|
|
|
alignmask = crypto_tfm_alg_alignmask(&tfm->base);
|
|
|
|
if (alignmask) {
|
|
|
|
/* Check if alignment mask for tfm is correctly set. */
|
2018-07-01 10:02:35 +03:00
|
|
|
ret = __test_hash(tfm, template, tcount, test_type,
|
2013-06-13 18:37:55 +04:00
|
|
|
alignmask + 1);
|
|
|
|
if (ret)
|
|
|
|
return ret;
|
|
|
|
}
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2012-09-21 11:26:52 +04:00
|
|
|
static int __test_aead(struct crypto_aead *tfm, int enc,
|
2017-02-25 02:46:59 +03:00
|
|
|
const struct aead_testvec *template, unsigned int tcount,
|
2013-06-13 18:37:50 +04:00
|
|
|
const bool diff_dst, const int align_offset)
|
2008-07-31 13:08:25 +04:00
|
|
|
{
|
|
|
|
const char *algo = crypto_tfm_alg_driver_name(crypto_aead_tfm(tfm));
|
|
|
|
unsigned int i, j, k, n, temp;
|
2009-05-06 10:15:47 +04:00
|
|
|
int ret = -ENOMEM;
|
2008-07-31 13:08:25 +04:00
|
|
|
char *q;
|
|
|
|
char *key;
|
|
|
|
struct aead_request *req;
|
2012-09-21 11:26:52 +04:00
|
|
|
struct scatterlist *sg;
|
|
|
|
struct scatterlist *sgout;
|
|
|
|
const char *e, *d;
|
2017-10-18 10:00:43 +03:00
|
|
|
struct crypto_wait wait;
|
2015-01-28 12:03:05 +03:00
|
|
|
unsigned int authsize, iv_len;
|
2008-07-31 13:08:25 +04:00
|
|
|
void *input;
|
2012-09-21 11:26:52 +04:00
|
|
|
void *output;
|
2008-07-31 13:08:25 +04:00
|
|
|
void *assoc;
|
2014-05-19 20:51:33 +04:00
|
|
|
char *iv;
|
2009-05-06 10:15:47 +04:00
|
|
|
char *xbuf[XBUFSIZE];
|
2012-09-21 11:26:52 +04:00
|
|
|
char *xoutbuf[XBUFSIZE];
|
2009-05-06 10:15:47 +04:00
|
|
|
char *axbuf[XBUFSIZE];
|
|
|
|
|
2014-05-19 20:51:33 +04:00
|
|
|
iv = kzalloc(MAX_IVLEN, GFP_KERNEL);
|
|
|
|
if (!iv)
|
|
|
|
return ret;
|
2014-07-23 12:59:38 +04:00
|
|
|
key = kmalloc(MAX_KEYLEN, GFP_KERNEL);
|
|
|
|
if (!key)
|
|
|
|
goto out_noxbuf;
|
2009-05-06 10:15:47 +04:00
|
|
|
if (testmgr_alloc_buf(xbuf))
|
|
|
|
goto out_noxbuf;
|
|
|
|
if (testmgr_alloc_buf(axbuf))
|
|
|
|
goto out_noaxbuf;
|
2012-09-21 11:26:52 +04:00
|
|
|
if (diff_dst && testmgr_alloc_buf(xoutbuf))
|
|
|
|
goto out_nooutbuf;
|
|
|
|
|
|
|
|
/* avoid "the frame size is larger than 1024 bytes" compiler warning */
|
treewide: kmalloc() -> kmalloc_array()
The kmalloc() function has a 2-factor argument form, kmalloc_array(). This
patch replaces cases of:
kmalloc(a * b, gfp)
with:
kmalloc_array(a * b, gfp)
as well as handling cases of:
kmalloc(a * b * c, gfp)
with:
kmalloc(array3_size(a, b, c), gfp)
as it's slightly less ugly than:
kmalloc_array(array_size(a, b), c, gfp)
This does, however, attempt to ignore constant size factors like:
kmalloc(4 * 1024, gfp)
though any constants defined via macros get caught up in the conversion.
Any factors with a sizeof() of "unsigned char", "char", and "u8" were
dropped, since they're redundant.
The tools/ directory was manually excluded, since it has its own
implementation of kmalloc().
The Coccinelle script used for this was:
// Fix redundant parens around sizeof().
@@
type TYPE;
expression THING, E;
@@
(
kmalloc(
- (sizeof(TYPE)) * E
+ sizeof(TYPE) * E
, ...)
|
kmalloc(
- (sizeof(THING)) * E
+ sizeof(THING) * E
, ...)
)
// Drop single-byte sizes and redundant parens.
@@
expression COUNT;
typedef u8;
typedef __u8;
@@
(
kmalloc(
- sizeof(u8) * (COUNT)
+ COUNT
, ...)
|
kmalloc(
- sizeof(__u8) * (COUNT)
+ COUNT
, ...)
|
kmalloc(
- sizeof(char) * (COUNT)
+ COUNT
, ...)
|
kmalloc(
- sizeof(unsigned char) * (COUNT)
+ COUNT
, ...)
|
kmalloc(
- sizeof(u8) * COUNT
+ COUNT
, ...)
|
kmalloc(
- sizeof(__u8) * COUNT
+ COUNT
, ...)
|
kmalloc(
- sizeof(char) * COUNT
+ COUNT
, ...)
|
kmalloc(
- sizeof(unsigned char) * COUNT
+ COUNT
, ...)
)
// 2-factor product with sizeof(type/expression) and identifier or constant.
@@
type TYPE;
expression THING;
identifier COUNT_ID;
constant COUNT_CONST;
@@
(
- kmalloc
+ kmalloc_array
(
- sizeof(TYPE) * (COUNT_ID)
+ COUNT_ID, sizeof(TYPE)
, ...)
|
- kmalloc
+ kmalloc_array
(
- sizeof(TYPE) * COUNT_ID
+ COUNT_ID, sizeof(TYPE)
, ...)
|
- kmalloc
+ kmalloc_array
(
- sizeof(TYPE) * (COUNT_CONST)
+ COUNT_CONST, sizeof(TYPE)
, ...)
|
- kmalloc
+ kmalloc_array
(
- sizeof(TYPE) * COUNT_CONST
+ COUNT_CONST, sizeof(TYPE)
, ...)
|
- kmalloc
+ kmalloc_array
(
- sizeof(THING) * (COUNT_ID)
+ COUNT_ID, sizeof(THING)
, ...)
|
- kmalloc
+ kmalloc_array
(
- sizeof(THING) * COUNT_ID
+ COUNT_ID, sizeof(THING)
, ...)
|
- kmalloc
+ kmalloc_array
(
- sizeof(THING) * (COUNT_CONST)
+ COUNT_CONST, sizeof(THING)
, ...)
|
- kmalloc
+ kmalloc_array
(
- sizeof(THING) * COUNT_CONST
+ COUNT_CONST, sizeof(THING)
, ...)
)
// 2-factor product, only identifiers.
@@
identifier SIZE, COUNT;
@@
- kmalloc
+ kmalloc_array
(
- SIZE * COUNT
+ COUNT, SIZE
, ...)
// 3-factor product with 1 sizeof(type) or sizeof(expression), with
// redundant parens removed.
@@
expression THING;
identifier STRIDE, COUNT;
type TYPE;
@@
(
kmalloc(
- sizeof(TYPE) * (COUNT) * (STRIDE)
+ array3_size(COUNT, STRIDE, sizeof(TYPE))
, ...)
|
kmalloc(
- sizeof(TYPE) * (COUNT) * STRIDE
+ array3_size(COUNT, STRIDE, sizeof(TYPE))
, ...)
|
kmalloc(
- sizeof(TYPE) * COUNT * (STRIDE)
+ array3_size(COUNT, STRIDE, sizeof(TYPE))
, ...)
|
kmalloc(
- sizeof(TYPE) * COUNT * STRIDE
+ array3_size(COUNT, STRIDE, sizeof(TYPE))
, ...)
|
kmalloc(
- sizeof(THING) * (COUNT) * (STRIDE)
+ array3_size(COUNT, STRIDE, sizeof(THING))
, ...)
|
kmalloc(
- sizeof(THING) * (COUNT) * STRIDE
+ array3_size(COUNT, STRIDE, sizeof(THING))
, ...)
|
kmalloc(
- sizeof(THING) * COUNT * (STRIDE)
+ array3_size(COUNT, STRIDE, sizeof(THING))
, ...)
|
kmalloc(
- sizeof(THING) * COUNT * STRIDE
+ array3_size(COUNT, STRIDE, sizeof(THING))
, ...)
)
// 3-factor product with 2 sizeof(variable), with redundant parens removed.
@@
expression THING1, THING2;
identifier COUNT;
type TYPE1, TYPE2;
@@
(
kmalloc(
- sizeof(TYPE1) * sizeof(TYPE2) * COUNT
+ array3_size(COUNT, sizeof(TYPE1), sizeof(TYPE2))
, ...)
|
kmalloc(
- sizeof(TYPE1) * sizeof(THING2) * (COUNT)
+ array3_size(COUNT, sizeof(TYPE1), sizeof(TYPE2))
, ...)
|
kmalloc(
- sizeof(THING1) * sizeof(THING2) * COUNT
+ array3_size(COUNT, sizeof(THING1), sizeof(THING2))
, ...)
|
kmalloc(
- sizeof(THING1) * sizeof(THING2) * (COUNT)
+ array3_size(COUNT, sizeof(THING1), sizeof(THING2))
, ...)
|
kmalloc(
- sizeof(TYPE1) * sizeof(THING2) * COUNT
+ array3_size(COUNT, sizeof(TYPE1), sizeof(THING2))
, ...)
|
kmalloc(
- sizeof(TYPE1) * sizeof(THING2) * (COUNT)
+ array3_size(COUNT, sizeof(TYPE1), sizeof(THING2))
, ...)
)
// 3-factor product, only identifiers, with redundant parens removed.
@@
identifier STRIDE, SIZE, COUNT;
@@
(
kmalloc(
- (COUNT) * STRIDE * SIZE
+ array3_size(COUNT, STRIDE, SIZE)
, ...)
|
kmalloc(
- COUNT * (STRIDE) * SIZE
+ array3_size(COUNT, STRIDE, SIZE)
, ...)
|
kmalloc(
- COUNT * STRIDE * (SIZE)
+ array3_size(COUNT, STRIDE, SIZE)
, ...)
|
kmalloc(
- (COUNT) * (STRIDE) * SIZE
+ array3_size(COUNT, STRIDE, SIZE)
, ...)
|
kmalloc(
- COUNT * (STRIDE) * (SIZE)
+ array3_size(COUNT, STRIDE, SIZE)
, ...)
|
kmalloc(
- (COUNT) * STRIDE * (SIZE)
+ array3_size(COUNT, STRIDE, SIZE)
, ...)
|
kmalloc(
- (COUNT) * (STRIDE) * (SIZE)
+ array3_size(COUNT, STRIDE, SIZE)
, ...)
|
kmalloc(
- COUNT * STRIDE * SIZE
+ array3_size(COUNT, STRIDE, SIZE)
, ...)
)
// Any remaining multi-factor products, first at least 3-factor products,
// when they're not all constants...
@@
expression E1, E2, E3;
constant C1, C2, C3;
@@
(
kmalloc(C1 * C2 * C3, ...)
|
kmalloc(
- (E1) * E2 * E3
+ array3_size(E1, E2, E3)
, ...)
|
kmalloc(
- (E1) * (E2) * E3
+ array3_size(E1, E2, E3)
, ...)
|
kmalloc(
- (E1) * (E2) * (E3)
+ array3_size(E1, E2, E3)
, ...)
|
kmalloc(
- E1 * E2 * E3
+ array3_size(E1, E2, E3)
, ...)
)
// And then all remaining 2 factors products when they're not all constants,
// keeping sizeof() as the second factor argument.
@@
expression THING, E1, E2;
type TYPE;
constant C1, C2, C3;
@@
(
kmalloc(sizeof(THING) * C2, ...)
|
kmalloc(sizeof(TYPE) * C2, ...)
|
kmalloc(C1 * C2 * C3, ...)
|
kmalloc(C1 * C2, ...)
|
- kmalloc
+ kmalloc_array
(
- sizeof(TYPE) * (E2)
+ E2, sizeof(TYPE)
, ...)
|
- kmalloc
+ kmalloc_array
(
- sizeof(TYPE) * E2
+ E2, sizeof(TYPE)
, ...)
|
- kmalloc
+ kmalloc_array
(
- sizeof(THING) * (E2)
+ E2, sizeof(THING)
, ...)
|
- kmalloc
+ kmalloc_array
(
- sizeof(THING) * E2
+ E2, sizeof(THING)
, ...)
|
- kmalloc
+ kmalloc_array
(
- (E1) * E2
+ E1, E2
, ...)
|
- kmalloc
+ kmalloc_array
(
- (E1) * (E2)
+ E1, E2
, ...)
|
- kmalloc
+ kmalloc_array
(
- E1 * E2
+ E1, E2
, ...)
)
Signed-off-by: Kees Cook <keescook@chromium.org>
2018-06-12 23:55:00 +03:00
|
|
|
sg = kmalloc(array3_size(sizeof(*sg), 8, (diff_dst ? 4 : 2)),
|
|
|
|
GFP_KERNEL);
|
2012-09-21 11:26:52 +04:00
|
|
|
if (!sg)
|
|
|
|
goto out_nosg;
|
2015-05-27 11:03:43 +03:00
|
|
|
sgout = &sg[16];
|
2012-09-21 11:26:52 +04:00
|
|
|
|
|
|
|
if (diff_dst)
|
|
|
|
d = "-ddst";
|
|
|
|
else
|
|
|
|
d = "";
|
|
|
|
|
2008-07-31 13:08:25 +04:00
|
|
|
if (enc == ENCRYPT)
|
|
|
|
e = "encryption";
|
|
|
|
else
|
|
|
|
e = "decryption";
|
|
|
|
|
2017-10-18 10:00:43 +03:00
|
|
|
crypto_init_wait(&wait);
|
2008-07-31 13:08:25 +04:00
|
|
|
|
|
|
|
req = aead_request_alloc(tfm, GFP_KERNEL);
|
|
|
|
if (!req) {
|
2012-09-21 11:26:52 +04:00
|
|
|
pr_err("alg: aead%s: Failed to allocate request for %s\n",
|
|
|
|
d, algo);
|
2008-07-31 13:08:25 +04:00
|
|
|
goto out;
|
|
|
|
}
|
|
|
|
|
|
|
|
aead_request_set_callback(req, CRYPTO_TFM_REQ_MAY_BACKLOG,
|
2017-10-18 10:00:43 +03:00
|
|
|
crypto_req_done, &wait);
|
2008-07-31 13:08:25 +04:00
|
|
|
|
2016-02-03 15:58:12 +03:00
|
|
|
iv_len = crypto_aead_ivsize(tfm);
|
|
|
|
|
2008-07-31 13:08:25 +04:00
|
|
|
for (i = 0, j = 0; i < tcount; i++) {
|
2014-07-28 14:11:23 +04:00
|
|
|
if (template[i].np)
|
|
|
|
continue;
|
2008-07-31 13:08:25 +04:00
|
|
|
|
2014-07-28 14:11:23 +04:00
|
|
|
j++;
|
2009-05-29 10:05:42 +04:00
|
|
|
|
2014-07-28 14:11:23 +04:00
|
|
|
/* some templates have no input data but they will
|
|
|
|
* touch input
|
|
|
|
*/
|
|
|
|
input = xbuf[0];
|
|
|
|
input += align_offset;
|
|
|
|
assoc = axbuf[0];
|
2008-07-31 13:08:25 +04:00
|
|
|
|
2014-07-28 14:11:23 +04:00
|
|
|
ret = -EINVAL;
|
|
|
|
if (WARN_ON(align_offset + template[i].ilen >
|
|
|
|
PAGE_SIZE || template[i].alen > PAGE_SIZE))
|
|
|
|
goto out;
|
2008-07-31 13:08:25 +04:00
|
|
|
|
2014-07-28 14:11:23 +04:00
|
|
|
memcpy(input, template[i].input, template[i].ilen);
|
|
|
|
memcpy(assoc, template[i].assoc, template[i].alen);
|
|
|
|
if (template[i].iv)
|
2015-01-28 12:03:05 +03:00
|
|
|
memcpy(iv, template[i].iv, iv_len);
|
2014-07-28 14:11:23 +04:00
|
|
|
else
|
2015-01-28 12:03:05 +03:00
|
|
|
memset(iv, 0, iv_len);
|
2014-07-28 14:11:23 +04:00
|
|
|
|
|
|
|
crypto_aead_clear_flags(tfm, ~0);
|
|
|
|
if (template[i].wk)
|
|
|
|
crypto_aead_set_flags(tfm, CRYPTO_TFM_REQ_WEAK_KEY);
|
|
|
|
|
|
|
|
if (template[i].klen > MAX_KEYLEN) {
|
|
|
|
pr_err("alg: aead%s: setkey failed on test %d for %s: key size %d > %d\n",
|
|
|
|
d, j, algo, template[i].klen,
|
|
|
|
MAX_KEYLEN);
|
|
|
|
ret = -EINVAL;
|
|
|
|
goto out;
|
|
|
|
}
|
|
|
|
memcpy(key, template[i].key, template[i].klen);
|
2008-07-31 13:08:25 +04:00
|
|
|
|
2014-07-28 14:11:23 +04:00
|
|
|
ret = crypto_aead_setkey(tfm, key, template[i].klen);
|
2016-07-29 11:32:09 +03:00
|
|
|
if (template[i].fail == !ret) {
|
2014-07-28 14:11:23 +04:00
|
|
|
pr_err("alg: aead%s: setkey failed on test %d for %s: flags=%x\n",
|
|
|
|
d, j, algo, crypto_aead_get_flags(tfm));
|
|
|
|
goto out;
|
|
|
|
} else if (ret)
|
|
|
|
continue;
|
2008-07-31 13:08:25 +04:00
|
|
|
|
2014-07-28 14:11:23 +04:00
|
|
|
authsize = abs(template[i].rlen - template[i].ilen);
|
|
|
|
ret = crypto_aead_setauthsize(tfm, authsize);
|
|
|
|
if (ret) {
|
|
|
|
pr_err("alg: aead%s: Failed to set authsize to %u on test %d for %s\n",
|
|
|
|
d, authsize, j, algo);
|
|
|
|
goto out;
|
|
|
|
}
|
2008-07-31 13:08:25 +04:00
|
|
|
|
2015-05-27 11:03:43 +03:00
|
|
|
k = !!template[i].alen;
|
|
|
|
sg_init_table(sg, k + 1);
|
|
|
|
sg_set_buf(&sg[0], assoc, template[i].alen);
|
|
|
|
sg_set_buf(&sg[k], input,
|
|
|
|
template[i].ilen + (enc ? authsize : 0));
|
|
|
|
output = input;
|
|
|
|
|
2014-07-28 14:11:23 +04:00
|
|
|
if (diff_dst) {
|
2015-05-27 11:03:43 +03:00
|
|
|
sg_init_table(sgout, k + 1);
|
|
|
|
sg_set_buf(&sgout[0], assoc, template[i].alen);
|
|
|
|
|
2014-07-28 14:11:23 +04:00
|
|
|
output = xoutbuf[0];
|
|
|
|
output += align_offset;
|
2015-05-27 11:03:43 +03:00
|
|
|
sg_set_buf(&sgout[k], output,
|
|
|
|
template[i].rlen + (enc ? 0 : authsize));
|
2014-07-28 14:11:23 +04:00
|
|
|
}
|
2012-09-21 11:26:52 +04:00
|
|
|
|
2014-07-28 14:11:23 +04:00
|
|
|
aead_request_set_crypt(req, sg, (diff_dst) ? sgout : sg,
|
|
|
|
template[i].ilen, iv);
|
2008-07-31 13:08:25 +04:00
|
|
|
|
2015-05-27 11:03:43 +03:00
|
|
|
aead_request_set_ad(req, template[i].alen);
|
2008-07-31 13:08:25 +04:00
|
|
|
|
2017-10-18 10:00:43 +03:00
|
|
|
ret = crypto_wait_req(enc ? crypto_aead_encrypt(req)
|
|
|
|
: crypto_aead_decrypt(req), &wait);
|
2008-07-31 13:08:25 +04:00
|
|
|
|
2014-07-28 14:11:23 +04:00
|
|
|
switch (ret) {
|
|
|
|
case 0:
|
|
|
|
if (template[i].novrfy) {
|
|
|
|
/* verification was supposed to fail */
|
|
|
|
pr_err("alg: aead%s: %s failed on test %d for %s: ret was 0, expected -EBADMSG\n",
|
|
|
|
d, e, j, algo);
|
|
|
|
/* so really, we got a bad message */
|
|
|
|
ret = -EBADMSG;
|
2008-07-31 13:08:25 +04:00
|
|
|
goto out;
|
|
|
|
}
|
2014-07-28 14:11:23 +04:00
|
|
|
break;
|
|
|
|
case -EBADMSG:
|
|
|
|
if (template[i].novrfy)
|
|
|
|
/* verification failure was expected */
|
|
|
|
continue;
|
|
|
|
/* fall through */
|
|
|
|
default:
|
|
|
|
pr_err("alg: aead%s: %s failed on test %d for %s: ret=%d\n",
|
|
|
|
d, e, j, algo, -ret);
|
|
|
|
goto out;
|
|
|
|
}
|
|
|
|
|
|
|
|
q = output;
|
|
|
|
if (memcmp(q, template[i].result, template[i].rlen)) {
|
|
|
|
pr_err("alg: aead%s: Test %d failed on %s for %s\n",
|
|
|
|
d, j, e, algo);
|
|
|
|
hexdump(q, template[i].rlen);
|
|
|
|
ret = -EINVAL;
|
|
|
|
goto out;
|
2008-07-31 13:08:25 +04:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
for (i = 0, j = 0; i < tcount; i++) {
|
2013-06-13 18:37:50 +04:00
|
|
|
/* alignment tests are only done with continuous buffers */
|
|
|
|
if (align_offset != 0)
|
|
|
|
break;
|
|
|
|
|
2014-07-28 14:11:23 +04:00
|
|
|
if (!template[i].np)
|
|
|
|
continue;
|
2008-07-31 13:08:25 +04:00
|
|
|
|
2014-07-28 14:11:23 +04:00
|
|
|
j++;
|
2008-07-31 13:08:25 +04:00
|
|
|
|
2014-07-28 14:11:23 +04:00
|
|
|
if (template[i].iv)
|
2016-02-03 15:58:12 +03:00
|
|
|
memcpy(iv, template[i].iv, iv_len);
|
2014-07-28 14:11:23 +04:00
|
|
|
else
|
|
|
|
memset(iv, 0, MAX_IVLEN);
|
|
|
|
|
|
|
|
crypto_aead_clear_flags(tfm, ~0);
|
|
|
|
if (template[i].wk)
|
|
|
|
crypto_aead_set_flags(tfm, CRYPTO_TFM_REQ_WEAK_KEY);
|
|
|
|
if (template[i].klen > MAX_KEYLEN) {
|
|
|
|
pr_err("alg: aead%s: setkey failed on test %d for %s: key size %d > %d\n",
|
|
|
|
d, j, algo, template[i].klen, MAX_KEYLEN);
|
|
|
|
ret = -EINVAL;
|
|
|
|
goto out;
|
|
|
|
}
|
|
|
|
memcpy(key, template[i].key, template[i].klen);
|
2008-07-31 13:08:25 +04:00
|
|
|
|
2014-07-28 14:11:23 +04:00
|
|
|
ret = crypto_aead_setkey(tfm, key, template[i].klen);
|
2016-07-29 11:32:09 +03:00
|
|
|
if (template[i].fail == !ret) {
|
2014-07-28 14:11:23 +04:00
|
|
|
pr_err("alg: aead%s: setkey failed on chunk test %d for %s: flags=%x\n",
|
|
|
|
d, j, algo, crypto_aead_get_flags(tfm));
|
|
|
|
goto out;
|
|
|
|
} else if (ret)
|
|
|
|
continue;
|
2008-07-31 13:08:25 +04:00
|
|
|
|
2014-07-28 14:11:23 +04:00
|
|
|
authsize = abs(template[i].rlen - template[i].ilen);
|
2008-07-31 13:08:25 +04:00
|
|
|
|
2014-07-28 14:11:23 +04:00
|
|
|
ret = -EINVAL;
|
2015-05-27 11:03:43 +03:00
|
|
|
sg_init_table(sg, template[i].anp + template[i].np);
|
2014-07-28 14:11:23 +04:00
|
|
|
if (diff_dst)
|
2015-05-27 11:03:43 +03:00
|
|
|
sg_init_table(sgout, template[i].anp + template[i].np);
|
|
|
|
|
|
|
|
ret = -EINVAL;
|
|
|
|
for (k = 0, temp = 0; k < template[i].anp; k++) {
|
|
|
|
if (WARN_ON(offset_in_page(IDX[k]) +
|
|
|
|
template[i].atap[k] > PAGE_SIZE))
|
|
|
|
goto out;
|
|
|
|
sg_set_buf(&sg[k],
|
|
|
|
memcpy(axbuf[IDX[k] >> PAGE_SHIFT] +
|
|
|
|
offset_in_page(IDX[k]),
|
|
|
|
template[i].assoc + temp,
|
|
|
|
template[i].atap[k]),
|
|
|
|
template[i].atap[k]);
|
|
|
|
if (diff_dst)
|
|
|
|
sg_set_buf(&sgout[k],
|
|
|
|
axbuf[IDX[k] >> PAGE_SHIFT] +
|
|
|
|
offset_in_page(IDX[k]),
|
|
|
|
template[i].atap[k]);
|
|
|
|
temp += template[i].atap[k];
|
|
|
|
}
|
|
|
|
|
2014-07-28 14:11:23 +04:00
|
|
|
for (k = 0, temp = 0; k < template[i].np; k++) {
|
|
|
|
if (WARN_ON(offset_in_page(IDX[k]) +
|
|
|
|
template[i].tap[k] > PAGE_SIZE))
|
|
|
|
goto out;
|
2008-07-31 13:08:25 +04:00
|
|
|
|
2014-07-28 14:11:23 +04:00
|
|
|
q = xbuf[IDX[k] >> PAGE_SHIFT] + offset_in_page(IDX[k]);
|
|
|
|
memcpy(q, template[i].input + temp, template[i].tap[k]);
|
2015-05-27 11:03:43 +03:00
|
|
|
sg_set_buf(&sg[template[i].anp + k],
|
|
|
|
q, template[i].tap[k]);
|
2008-07-31 13:08:25 +04:00
|
|
|
|
2014-07-28 14:11:23 +04:00
|
|
|
if (diff_dst) {
|
|
|
|
q = xoutbuf[IDX[k] >> PAGE_SHIFT] +
|
|
|
|
offset_in_page(IDX[k]);
|
2012-09-21 11:26:52 +04:00
|
|
|
|
2014-07-28 14:11:23 +04:00
|
|
|
memset(q, 0, template[i].tap[k]);
|
2012-09-21 11:26:52 +04:00
|
|
|
|
2015-05-27 11:03:43 +03:00
|
|
|
sg_set_buf(&sgout[template[i].anp + k],
|
|
|
|
q, template[i].tap[k]);
|
2014-07-28 14:11:23 +04:00
|
|
|
}
|
2012-09-21 11:26:52 +04:00
|
|
|
|
2014-07-28 14:11:23 +04:00
|
|
|
n = template[i].tap[k];
|
|
|
|
if (k == template[i].np - 1 && enc)
|
|
|
|
n += authsize;
|
|
|
|
if (offset_in_page(q) + n < PAGE_SIZE)
|
|
|
|
q[n] = 0;
|
2012-09-21 11:26:52 +04:00
|
|
|
|
2014-07-28 14:11:23 +04:00
|
|
|
temp += template[i].tap[k];
|
|
|
|
}
|
2013-11-28 17:11:18 +04:00
|
|
|
|
2014-07-28 14:11:23 +04:00
|
|
|
ret = crypto_aead_setauthsize(tfm, authsize);
|
|
|
|
if (ret) {
|
|
|
|
pr_err("alg: aead%s: Failed to set authsize to %u on chunk test %d for %s\n",
|
|
|
|
d, authsize, j, algo);
|
|
|
|
goto out;
|
|
|
|
}
|
2008-07-31 13:08:25 +04:00
|
|
|
|
2014-07-28 14:11:23 +04:00
|
|
|
if (enc) {
|
2015-05-27 11:03:43 +03:00
|
|
|
if (WARN_ON(sg[template[i].anp + k - 1].offset +
|
|
|
|
sg[template[i].anp + k - 1].length +
|
|
|
|
authsize > PAGE_SIZE)) {
|
2014-07-28 14:11:23 +04:00
|
|
|
ret = -EINVAL;
|
2008-07-31 13:08:25 +04:00
|
|
|
goto out;
|
|
|
|
}
|
|
|
|
|
2014-07-28 14:11:23 +04:00
|
|
|
if (diff_dst)
|
2015-05-27 11:03:43 +03:00
|
|
|
sgout[template[i].anp + k - 1].length +=
|
|
|
|
authsize;
|
|
|
|
sg[template[i].anp + k - 1].length += authsize;
|
2014-07-28 14:11:23 +04:00
|
|
|
}
|
2008-07-31 13:08:25 +04:00
|
|
|
|
2014-07-28 14:11:23 +04:00
|
|
|
aead_request_set_crypt(req, sg, (diff_dst) ? sgout : sg,
|
|
|
|
template[i].ilen,
|
|
|
|
iv);
|
2008-07-31 13:08:25 +04:00
|
|
|
|
2015-05-27 11:03:43 +03:00
|
|
|
aead_request_set_ad(req, template[i].alen);
|
2008-07-31 13:08:25 +04:00
|
|
|
|
2017-10-18 10:00:43 +03:00
|
|
|
ret = crypto_wait_req(enc ? crypto_aead_encrypt(req)
|
|
|
|
: crypto_aead_decrypt(req), &wait);
|
2008-07-31 13:08:25 +04:00
|
|
|
|
2014-07-28 14:11:23 +04:00
|
|
|
switch (ret) {
|
|
|
|
case 0:
|
|
|
|
if (template[i].novrfy) {
|
|
|
|
/* verification was supposed to fail */
|
|
|
|
pr_err("alg: aead%s: %s failed on chunk test %d for %s: ret was 0, expected -EBADMSG\n",
|
|
|
|
d, e, j, algo);
|
|
|
|
/* so really, we got a bad message */
|
|
|
|
ret = -EBADMSG;
|
2008-07-31 13:08:25 +04:00
|
|
|
goto out;
|
|
|
|
}
|
2014-07-28 14:11:23 +04:00
|
|
|
break;
|
|
|
|
case -EBADMSG:
|
|
|
|
if (template[i].novrfy)
|
|
|
|
/* verification failure was expected */
|
|
|
|
continue;
|
|
|
|
/* fall through */
|
|
|
|
default:
|
|
|
|
pr_err("alg: aead%s: %s failed on chunk test %d for %s: ret=%d\n",
|
|
|
|
d, e, j, algo, -ret);
|
|
|
|
goto out;
|
|
|
|
}
|
2008-07-31 13:08:25 +04:00
|
|
|
|
2014-07-28 14:11:23 +04:00
|
|
|
ret = -EINVAL;
|
|
|
|
for (k = 0, temp = 0; k < template[i].np; k++) {
|
|
|
|
if (diff_dst)
|
|
|
|
q = xoutbuf[IDX[k] >> PAGE_SHIFT] +
|
|
|
|
offset_in_page(IDX[k]);
|
|
|
|
else
|
|
|
|
q = xbuf[IDX[k] >> PAGE_SHIFT] +
|
|
|
|
offset_in_page(IDX[k]);
|
2008-07-31 13:08:25 +04:00
|
|
|
|
2014-07-28 14:11:23 +04:00
|
|
|
n = template[i].tap[k];
|
|
|
|
if (k == template[i].np - 1)
|
|
|
|
n += enc ? authsize : -authsize;
|
2008-07-31 13:08:25 +04:00
|
|
|
|
2014-07-28 14:11:23 +04:00
|
|
|
if (memcmp(q, template[i].result + temp, n)) {
|
|
|
|
pr_err("alg: aead%s: Chunk test %d failed on %s at page %u for %s\n",
|
|
|
|
d, j, e, k, algo);
|
|
|
|
hexdump(q, n);
|
|
|
|
goto out;
|
|
|
|
}
|
2008-07-31 13:08:25 +04:00
|
|
|
|
2014-07-28 14:11:23 +04:00
|
|
|
q += n;
|
|
|
|
if (k == template[i].np - 1 && !enc) {
|
|
|
|
if (!diff_dst &&
|
|
|
|
memcmp(q, template[i].input +
|
|
|
|
temp + n, authsize))
|
|
|
|
n = authsize;
|
|
|
|
else
|
|
|
|
n = 0;
|
|
|
|
} else {
|
|
|
|
for (n = 0; offset_in_page(q + n) && q[n]; n++)
|
|
|
|
;
|
|
|
|
}
|
|
|
|
if (n) {
|
|
|
|
pr_err("alg: aead%s: Result buffer corruption in chunk test %d on %s at page %u for %s: %u bytes:\n",
|
|
|
|
d, j, e, k, algo, n);
|
|
|
|
hexdump(q, n);
|
|
|
|
goto out;
|
2008-07-31 13:08:25 +04:00
|
|
|
}
|
2014-07-28 14:11:23 +04:00
|
|
|
|
|
|
|
temp += template[i].tap[k];
|
2008-07-31 13:08:25 +04:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
ret = 0;
|
|
|
|
|
|
|
|
out:
|
|
|
|
aead_request_free(req);
|
2012-09-21 11:26:52 +04:00
|
|
|
kfree(sg);
|
|
|
|
out_nosg:
|
|
|
|
if (diff_dst)
|
|
|
|
testmgr_free_buf(xoutbuf);
|
|
|
|
out_nooutbuf:
|
2009-05-06 10:15:47 +04:00
|
|
|
testmgr_free_buf(axbuf);
|
|
|
|
out_noaxbuf:
|
|
|
|
testmgr_free_buf(xbuf);
|
|
|
|
out_noxbuf:
|
2014-07-23 12:59:38 +04:00
|
|
|
kfree(key);
|
2014-05-19 20:51:33 +04:00
|
|
|
kfree(iv);
|
2008-07-31 13:08:25 +04:00
|
|
|
return ret;
|
|
|
|
}
|
|
|
|
|
2012-09-21 11:26:52 +04:00
|
|
|
static int test_aead(struct crypto_aead *tfm, int enc,
|
2017-02-25 02:46:59 +03:00
|
|
|
const struct aead_testvec *template, unsigned int tcount)
|
2012-09-21 11:26:52 +04:00
|
|
|
{
|
2013-06-13 18:37:50 +04:00
|
|
|
unsigned int alignmask;
|
2012-09-21 11:26:52 +04:00
|
|
|
int ret;
|
|
|
|
|
|
|
|
/* test 'dst == src' case */
|
2013-06-13 18:37:50 +04:00
|
|
|
ret = __test_aead(tfm, enc, template, tcount, false, 0);
|
2012-09-21 11:26:52 +04:00
|
|
|
if (ret)
|
|
|
|
return ret;
|
|
|
|
|
|
|
|
/* test 'dst != src' case */
|
2013-06-13 18:37:50 +04:00
|
|
|
ret = __test_aead(tfm, enc, template, tcount, true, 0);
|
|
|
|
if (ret)
|
|
|
|
return ret;
|
|
|
|
|
|
|
|
/* test unaligned buffers, check with one byte offset */
|
|
|
|
ret = __test_aead(tfm, enc, template, tcount, true, 1);
|
|
|
|
if (ret)
|
|
|
|
return ret;
|
|
|
|
|
|
|
|
alignmask = crypto_tfm_alg_alignmask(&tfm->base);
|
|
|
|
if (alignmask) {
|
|
|
|
/* Check if alignment mask for tfm is correctly set. */
|
|
|
|
ret = __test_aead(tfm, enc, template, tcount, true,
|
|
|
|
alignmask + 1);
|
|
|
|
if (ret)
|
|
|
|
return ret;
|
|
|
|
}
|
|
|
|
|
|
|
|
return 0;
|
2012-09-21 11:26:52 +04:00
|
|
|
}
|
|
|
|
|
2008-08-17 11:01:56 +04:00
|
|
|
static int test_cipher(struct crypto_cipher *tfm, int enc,
|
2017-02-25 02:46:59 +03:00
|
|
|
const struct cipher_testvec *template,
|
|
|
|
unsigned int tcount)
|
2008-08-17 11:01:56 +04:00
|
|
|
{
|
|
|
|
const char *algo = crypto_tfm_alg_driver_name(crypto_cipher_tfm(tfm));
|
|
|
|
unsigned int i, j, k;
|
|
|
|
char *q;
|
|
|
|
const char *e;
|
crypto: testmgr - eliminate redundant decryption test vectors
Currently testmgr has separate encryption and decryption test vectors
for symmetric ciphers. That's massively redundant, since with few
exceptions (mostly mistakes, apparently), all decryption tests are
identical to the encryption tests, just with the input/result flipped.
Therefore, eliminate the redundancy by removing the decryption test
vectors and updating testmgr to test both encryption and decryption
using what used to be the encryption test vectors. Naming is adjusted
accordingly: each cipher_testvec now has a 'ptext' (plaintext), 'ctext'
(ciphertext), and 'len' instead of an 'input', 'result', 'ilen', and
'rlen'. Note that it was always the case that 'ilen == rlen'.
AES keywrap ("kw(aes)") is special because its IV is generated by the
encryption. Previously this was handled by specifying 'iv_out' for
encryption and 'iv' for decryption. To make it work cleanly with only
one set of test vectors, put the IV in 'iv', remove 'iv_out', and add a
boolean that indicates that the IV is generated by the encryption.
In total, this removes over 10000 lines from testmgr.h, with no
reduction in test coverage since prior patches already copied the few
unique decryption test vectors into the encryption test vectors.
This covers all algorithms that used 'struct cipher_testvec', e.g. any
block cipher in the ECB, CBC, CTR, XTS, LRW, CTS-CBC, PCBC, OFB, or
keywrap modes, and Salsa20 and ChaCha20. No change is made to AEAD
tests, though we probably can eliminate a similar redundancy there too.
The testmgr.h portion of this patch was automatically generated using
the following awk script, with some slight manual fixups on top (updated
'struct cipher_testvec' definition, updated a few comments, and fixed up
the AES keywrap test vectors):
BEGIN { OTHER = 0; ENCVEC = 1; DECVEC = 2; DECVEC_TAIL = 3; mode = OTHER }
/^static const struct cipher_testvec.*_enc_/ { sub("_enc", ""); mode = ENCVEC }
/^static const struct cipher_testvec.*_dec_/ { mode = DECVEC }
mode == ENCVEC && !/\.ilen[[:space:]]*=/ {
sub(/\.input[[:space:]]*=$/, ".ptext =")
sub(/\.input[[:space:]]*=/, ".ptext\t=")
sub(/\.result[[:space:]]*=$/, ".ctext =")
sub(/\.result[[:space:]]*=/, ".ctext\t=")
sub(/\.rlen[[:space:]]*=/, ".len\t=")
print
}
mode == DECVEC_TAIL && /[^[:space:]]/ { mode = OTHER }
mode == OTHER { print }
mode == ENCVEC && /^};/ { mode = OTHER }
mode == DECVEC && /^};/ { mode = DECVEC_TAIL }
Note that git's default diff algorithm gets confused by the testmgr.h
portion of this patch, and reports too many lines added and removed.
It's better viewed with 'git diff --minimal' (or 'git show --minimal'),
which reports "2 files changed, 919 insertions(+), 11723 deletions(-)".
Signed-off-by: Eric Biggers <ebiggers@google.com>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
2018-05-21 08:50:29 +03:00
|
|
|
const char *input, *result;
|
2008-08-17 11:01:56 +04:00
|
|
|
void *data;
|
2009-05-06 10:15:47 +04:00
|
|
|
char *xbuf[XBUFSIZE];
|
|
|
|
int ret = -ENOMEM;
|
|
|
|
|
|
|
|
if (testmgr_alloc_buf(xbuf))
|
|
|
|
goto out_nobuf;
|
2008-08-17 11:01:56 +04:00
|
|
|
|
|
|
|
if (enc == ENCRYPT)
|
|
|
|
e = "encryption";
|
|
|
|
else
|
|
|
|
e = "decryption";
|
|
|
|
|
|
|
|
j = 0;
|
|
|
|
for (i = 0; i < tcount; i++) {
|
|
|
|
if (template[i].np)
|
|
|
|
continue;
|
|
|
|
|
2016-08-25 16:15:01 +03:00
|
|
|
if (fips_enabled && template[i].fips_skip)
|
|
|
|
continue;
|
|
|
|
|
crypto: testmgr - eliminate redundant decryption test vectors
Currently testmgr has separate encryption and decryption test vectors
for symmetric ciphers. That's massively redundant, since with few
exceptions (mostly mistakes, apparently), all decryption tests are
identical to the encryption tests, just with the input/result flipped.
Therefore, eliminate the redundancy by removing the decryption test
vectors and updating testmgr to test both encryption and decryption
using what used to be the encryption test vectors. Naming is adjusted
accordingly: each cipher_testvec now has a 'ptext' (plaintext), 'ctext'
(ciphertext), and 'len' instead of an 'input', 'result', 'ilen', and
'rlen'. Note that it was always the case that 'ilen == rlen'.
AES keywrap ("kw(aes)") is special because its IV is generated by the
encryption. Previously this was handled by specifying 'iv_out' for
encryption and 'iv' for decryption. To make it work cleanly with only
one set of test vectors, put the IV in 'iv', remove 'iv_out', and add a
boolean that indicates that the IV is generated by the encryption.
In total, this removes over 10000 lines from testmgr.h, with no
reduction in test coverage since prior patches already copied the few
unique decryption test vectors into the encryption test vectors.
This covers all algorithms that used 'struct cipher_testvec', e.g. any
block cipher in the ECB, CBC, CTR, XTS, LRW, CTS-CBC, PCBC, OFB, or
keywrap modes, and Salsa20 and ChaCha20. No change is made to AEAD
tests, though we probably can eliminate a similar redundancy there too.
The testmgr.h portion of this patch was automatically generated using
the following awk script, with some slight manual fixups on top (updated
'struct cipher_testvec' definition, updated a few comments, and fixed up
the AES keywrap test vectors):
BEGIN { OTHER = 0; ENCVEC = 1; DECVEC = 2; DECVEC_TAIL = 3; mode = OTHER }
/^static const struct cipher_testvec.*_enc_/ { sub("_enc", ""); mode = ENCVEC }
/^static const struct cipher_testvec.*_dec_/ { mode = DECVEC }
mode == ENCVEC && !/\.ilen[[:space:]]*=/ {
sub(/\.input[[:space:]]*=$/, ".ptext =")
sub(/\.input[[:space:]]*=/, ".ptext\t=")
sub(/\.result[[:space:]]*=$/, ".ctext =")
sub(/\.result[[:space:]]*=/, ".ctext\t=")
sub(/\.rlen[[:space:]]*=/, ".len\t=")
print
}
mode == DECVEC_TAIL && /[^[:space:]]/ { mode = OTHER }
mode == OTHER { print }
mode == ENCVEC && /^};/ { mode = OTHER }
mode == DECVEC && /^};/ { mode = DECVEC_TAIL }
Note that git's default diff algorithm gets confused by the testmgr.h
portion of this patch, and reports too many lines added and removed.
It's better viewed with 'git diff --minimal' (or 'git show --minimal'),
which reports "2 files changed, 919 insertions(+), 11723 deletions(-)".
Signed-off-by: Eric Biggers <ebiggers@google.com>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
2018-05-21 08:50:29 +03:00
|
|
|
input = enc ? template[i].ptext : template[i].ctext;
|
|
|
|
result = enc ? template[i].ctext : template[i].ptext;
|
2008-08-17 11:01:56 +04:00
|
|
|
j++;
|
|
|
|
|
2009-05-29 10:05:42 +04:00
|
|
|
ret = -EINVAL;
|
crypto: testmgr - eliminate redundant decryption test vectors
Currently testmgr has separate encryption and decryption test vectors
for symmetric ciphers. That's massively redundant, since with few
exceptions (mostly mistakes, apparently), all decryption tests are
identical to the encryption tests, just with the input/result flipped.
Therefore, eliminate the redundancy by removing the decryption test
vectors and updating testmgr to test both encryption and decryption
using what used to be the encryption test vectors. Naming is adjusted
accordingly: each cipher_testvec now has a 'ptext' (plaintext), 'ctext'
(ciphertext), and 'len' instead of an 'input', 'result', 'ilen', and
'rlen'. Note that it was always the case that 'ilen == rlen'.
AES keywrap ("kw(aes)") is special because its IV is generated by the
encryption. Previously this was handled by specifying 'iv_out' for
encryption and 'iv' for decryption. To make it work cleanly with only
one set of test vectors, put the IV in 'iv', remove 'iv_out', and add a
boolean that indicates that the IV is generated by the encryption.
In total, this removes over 10000 lines from testmgr.h, with no
reduction in test coverage since prior patches already copied the few
unique decryption test vectors into the encryption test vectors.
This covers all algorithms that used 'struct cipher_testvec', e.g. any
block cipher in the ECB, CBC, CTR, XTS, LRW, CTS-CBC, PCBC, OFB, or
keywrap modes, and Salsa20 and ChaCha20. No change is made to AEAD
tests, though we probably can eliminate a similar redundancy there too.
The testmgr.h portion of this patch was automatically generated using
the following awk script, with some slight manual fixups on top (updated
'struct cipher_testvec' definition, updated a few comments, and fixed up
the AES keywrap test vectors):
BEGIN { OTHER = 0; ENCVEC = 1; DECVEC = 2; DECVEC_TAIL = 3; mode = OTHER }
/^static const struct cipher_testvec.*_enc_/ { sub("_enc", ""); mode = ENCVEC }
/^static const struct cipher_testvec.*_dec_/ { mode = DECVEC }
mode == ENCVEC && !/\.ilen[[:space:]]*=/ {
sub(/\.input[[:space:]]*=$/, ".ptext =")
sub(/\.input[[:space:]]*=/, ".ptext\t=")
sub(/\.result[[:space:]]*=$/, ".ctext =")
sub(/\.result[[:space:]]*=/, ".ctext\t=")
sub(/\.rlen[[:space:]]*=/, ".len\t=")
print
}
mode == DECVEC_TAIL && /[^[:space:]]/ { mode = OTHER }
mode == OTHER { print }
mode == ENCVEC && /^};/ { mode = OTHER }
mode == DECVEC && /^};/ { mode = DECVEC_TAIL }
Note that git's default diff algorithm gets confused by the testmgr.h
portion of this patch, and reports too many lines added and removed.
It's better viewed with 'git diff --minimal' (or 'git show --minimal'),
which reports "2 files changed, 919 insertions(+), 11723 deletions(-)".
Signed-off-by: Eric Biggers <ebiggers@google.com>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
2018-05-21 08:50:29 +03:00
|
|
|
if (WARN_ON(template[i].len > PAGE_SIZE))
|
2009-05-29 10:05:42 +04:00
|
|
|
goto out;
|
|
|
|
|
2008-08-17 11:01:56 +04:00
|
|
|
data = xbuf[0];
|
crypto: testmgr - eliminate redundant decryption test vectors
Currently testmgr has separate encryption and decryption test vectors
for symmetric ciphers. That's massively redundant, since with few
exceptions (mostly mistakes, apparently), all decryption tests are
identical to the encryption tests, just with the input/result flipped.
Therefore, eliminate the redundancy by removing the decryption test
vectors and updating testmgr to test both encryption and decryption
using what used to be the encryption test vectors. Naming is adjusted
accordingly: each cipher_testvec now has a 'ptext' (plaintext), 'ctext'
(ciphertext), and 'len' instead of an 'input', 'result', 'ilen', and
'rlen'. Note that it was always the case that 'ilen == rlen'.
AES keywrap ("kw(aes)") is special because its IV is generated by the
encryption. Previously this was handled by specifying 'iv_out' for
encryption and 'iv' for decryption. To make it work cleanly with only
one set of test vectors, put the IV in 'iv', remove 'iv_out', and add a
boolean that indicates that the IV is generated by the encryption.
In total, this removes over 10000 lines from testmgr.h, with no
reduction in test coverage since prior patches already copied the few
unique decryption test vectors into the encryption test vectors.
This covers all algorithms that used 'struct cipher_testvec', e.g. any
block cipher in the ECB, CBC, CTR, XTS, LRW, CTS-CBC, PCBC, OFB, or
keywrap modes, and Salsa20 and ChaCha20. No change is made to AEAD
tests, though we probably can eliminate a similar redundancy there too.
The testmgr.h portion of this patch was automatically generated using
the following awk script, with some slight manual fixups on top (updated
'struct cipher_testvec' definition, updated a few comments, and fixed up
the AES keywrap test vectors):
BEGIN { OTHER = 0; ENCVEC = 1; DECVEC = 2; DECVEC_TAIL = 3; mode = OTHER }
/^static const struct cipher_testvec.*_enc_/ { sub("_enc", ""); mode = ENCVEC }
/^static const struct cipher_testvec.*_dec_/ { mode = DECVEC }
mode == ENCVEC && !/\.ilen[[:space:]]*=/ {
sub(/\.input[[:space:]]*=$/, ".ptext =")
sub(/\.input[[:space:]]*=/, ".ptext\t=")
sub(/\.result[[:space:]]*=$/, ".ctext =")
sub(/\.result[[:space:]]*=/, ".ctext\t=")
sub(/\.rlen[[:space:]]*=/, ".len\t=")
print
}
mode == DECVEC_TAIL && /[^[:space:]]/ { mode = OTHER }
mode == OTHER { print }
mode == ENCVEC && /^};/ { mode = OTHER }
mode == DECVEC && /^};/ { mode = DECVEC_TAIL }
Note that git's default diff algorithm gets confused by the testmgr.h
portion of this patch, and reports too many lines added and removed.
It's better viewed with 'git diff --minimal' (or 'git show --minimal'),
which reports "2 files changed, 919 insertions(+), 11723 deletions(-)".
Signed-off-by: Eric Biggers <ebiggers@google.com>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
2018-05-21 08:50:29 +03:00
|
|
|
memcpy(data, input, template[i].len);
|
2008-08-17 11:01:56 +04:00
|
|
|
|
|
|
|
crypto_cipher_clear_flags(tfm, ~0);
|
|
|
|
if (template[i].wk)
|
|
|
|
crypto_cipher_set_flags(tfm, CRYPTO_TFM_REQ_WEAK_KEY);
|
|
|
|
|
|
|
|
ret = crypto_cipher_setkey(tfm, template[i].key,
|
|
|
|
template[i].klen);
|
2016-07-29 11:32:09 +03:00
|
|
|
if (template[i].fail == !ret) {
|
2008-08-17 11:01:56 +04:00
|
|
|
printk(KERN_ERR "alg: cipher: setkey failed "
|
|
|
|
"on test %d for %s: flags=%x\n", j,
|
|
|
|
algo, crypto_cipher_get_flags(tfm));
|
|
|
|
goto out;
|
|
|
|
} else if (ret)
|
|
|
|
continue;
|
|
|
|
|
crypto: testmgr - eliminate redundant decryption test vectors
Currently testmgr has separate encryption and decryption test vectors
for symmetric ciphers. That's massively redundant, since with few
exceptions (mostly mistakes, apparently), all decryption tests are
identical to the encryption tests, just with the input/result flipped.
Therefore, eliminate the redundancy by removing the decryption test
vectors and updating testmgr to test both encryption and decryption
using what used to be the encryption test vectors. Naming is adjusted
accordingly: each cipher_testvec now has a 'ptext' (plaintext), 'ctext'
(ciphertext), and 'len' instead of an 'input', 'result', 'ilen', and
'rlen'. Note that it was always the case that 'ilen == rlen'.
AES keywrap ("kw(aes)") is special because its IV is generated by the
encryption. Previously this was handled by specifying 'iv_out' for
encryption and 'iv' for decryption. To make it work cleanly with only
one set of test vectors, put the IV in 'iv', remove 'iv_out', and add a
boolean that indicates that the IV is generated by the encryption.
In total, this removes over 10000 lines from testmgr.h, with no
reduction in test coverage since prior patches already copied the few
unique decryption test vectors into the encryption test vectors.
This covers all algorithms that used 'struct cipher_testvec', e.g. any
block cipher in the ECB, CBC, CTR, XTS, LRW, CTS-CBC, PCBC, OFB, or
keywrap modes, and Salsa20 and ChaCha20. No change is made to AEAD
tests, though we probably can eliminate a similar redundancy there too.
The testmgr.h portion of this patch was automatically generated using
the following awk script, with some slight manual fixups on top (updated
'struct cipher_testvec' definition, updated a few comments, and fixed up
the AES keywrap test vectors):
BEGIN { OTHER = 0; ENCVEC = 1; DECVEC = 2; DECVEC_TAIL = 3; mode = OTHER }
/^static const struct cipher_testvec.*_enc_/ { sub("_enc", ""); mode = ENCVEC }
/^static const struct cipher_testvec.*_dec_/ { mode = DECVEC }
mode == ENCVEC && !/\.ilen[[:space:]]*=/ {
sub(/\.input[[:space:]]*=$/, ".ptext =")
sub(/\.input[[:space:]]*=/, ".ptext\t=")
sub(/\.result[[:space:]]*=$/, ".ctext =")
sub(/\.result[[:space:]]*=/, ".ctext\t=")
sub(/\.rlen[[:space:]]*=/, ".len\t=")
print
}
mode == DECVEC_TAIL && /[^[:space:]]/ { mode = OTHER }
mode == OTHER { print }
mode == ENCVEC && /^};/ { mode = OTHER }
mode == DECVEC && /^};/ { mode = DECVEC_TAIL }
Note that git's default diff algorithm gets confused by the testmgr.h
portion of this patch, and reports too many lines added and removed.
It's better viewed with 'git diff --minimal' (or 'git show --minimal'),
which reports "2 files changed, 919 insertions(+), 11723 deletions(-)".
Signed-off-by: Eric Biggers <ebiggers@google.com>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
2018-05-21 08:50:29 +03:00
|
|
|
for (k = 0; k < template[i].len;
|
2008-08-17 11:01:56 +04:00
|
|
|
k += crypto_cipher_blocksize(tfm)) {
|
|
|
|
if (enc)
|
|
|
|
crypto_cipher_encrypt_one(tfm, data + k,
|
|
|
|
data + k);
|
|
|
|
else
|
|
|
|
crypto_cipher_decrypt_one(tfm, data + k,
|
|
|
|
data + k);
|
|
|
|
}
|
|
|
|
|
|
|
|
q = data;
|
crypto: testmgr - eliminate redundant decryption test vectors
Currently testmgr has separate encryption and decryption test vectors
for symmetric ciphers. That's massively redundant, since with few
exceptions (mostly mistakes, apparently), all decryption tests are
identical to the encryption tests, just with the input/result flipped.
Therefore, eliminate the redundancy by removing the decryption test
vectors and updating testmgr to test both encryption and decryption
using what used to be the encryption test vectors. Naming is adjusted
accordingly: each cipher_testvec now has a 'ptext' (plaintext), 'ctext'
(ciphertext), and 'len' instead of an 'input', 'result', 'ilen', and
'rlen'. Note that it was always the case that 'ilen == rlen'.
AES keywrap ("kw(aes)") is special because its IV is generated by the
encryption. Previously this was handled by specifying 'iv_out' for
encryption and 'iv' for decryption. To make it work cleanly with only
one set of test vectors, put the IV in 'iv', remove 'iv_out', and add a
boolean that indicates that the IV is generated by the encryption.
In total, this removes over 10000 lines from testmgr.h, with no
reduction in test coverage since prior patches already copied the few
unique decryption test vectors into the encryption test vectors.
This covers all algorithms that used 'struct cipher_testvec', e.g. any
block cipher in the ECB, CBC, CTR, XTS, LRW, CTS-CBC, PCBC, OFB, or
keywrap modes, and Salsa20 and ChaCha20. No change is made to AEAD
tests, though we probably can eliminate a similar redundancy there too.
The testmgr.h portion of this patch was automatically generated using
the following awk script, with some slight manual fixups on top (updated
'struct cipher_testvec' definition, updated a few comments, and fixed up
the AES keywrap test vectors):
BEGIN { OTHER = 0; ENCVEC = 1; DECVEC = 2; DECVEC_TAIL = 3; mode = OTHER }
/^static const struct cipher_testvec.*_enc_/ { sub("_enc", ""); mode = ENCVEC }
/^static const struct cipher_testvec.*_dec_/ { mode = DECVEC }
mode == ENCVEC && !/\.ilen[[:space:]]*=/ {
sub(/\.input[[:space:]]*=$/, ".ptext =")
sub(/\.input[[:space:]]*=/, ".ptext\t=")
sub(/\.result[[:space:]]*=$/, ".ctext =")
sub(/\.result[[:space:]]*=/, ".ctext\t=")
sub(/\.rlen[[:space:]]*=/, ".len\t=")
print
}
mode == DECVEC_TAIL && /[^[:space:]]/ { mode = OTHER }
mode == OTHER { print }
mode == ENCVEC && /^};/ { mode = OTHER }
mode == DECVEC && /^};/ { mode = DECVEC_TAIL }
Note that git's default diff algorithm gets confused by the testmgr.h
portion of this patch, and reports too many lines added and removed.
It's better viewed with 'git diff --minimal' (or 'git show --minimal'),
which reports "2 files changed, 919 insertions(+), 11723 deletions(-)".
Signed-off-by: Eric Biggers <ebiggers@google.com>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
2018-05-21 08:50:29 +03:00
|
|
|
if (memcmp(q, result, template[i].len)) {
|
2008-08-17 11:01:56 +04:00
|
|
|
printk(KERN_ERR "alg: cipher: Test %d failed "
|
|
|
|
"on %s for %s\n", j, e, algo);
|
crypto: testmgr - eliminate redundant decryption test vectors
Currently testmgr has separate encryption and decryption test vectors
for symmetric ciphers. That's massively redundant, since with few
exceptions (mostly mistakes, apparently), all decryption tests are
identical to the encryption tests, just with the input/result flipped.
Therefore, eliminate the redundancy by removing the decryption test
vectors and updating testmgr to test both encryption and decryption
using what used to be the encryption test vectors. Naming is adjusted
accordingly: each cipher_testvec now has a 'ptext' (plaintext), 'ctext'
(ciphertext), and 'len' instead of an 'input', 'result', 'ilen', and
'rlen'. Note that it was always the case that 'ilen == rlen'.
AES keywrap ("kw(aes)") is special because its IV is generated by the
encryption. Previously this was handled by specifying 'iv_out' for
encryption and 'iv' for decryption. To make it work cleanly with only
one set of test vectors, put the IV in 'iv', remove 'iv_out', and add a
boolean that indicates that the IV is generated by the encryption.
In total, this removes over 10000 lines from testmgr.h, with no
reduction in test coverage since prior patches already copied the few
unique decryption test vectors into the encryption test vectors.
This covers all algorithms that used 'struct cipher_testvec', e.g. any
block cipher in the ECB, CBC, CTR, XTS, LRW, CTS-CBC, PCBC, OFB, or
keywrap modes, and Salsa20 and ChaCha20. No change is made to AEAD
tests, though we probably can eliminate a similar redundancy there too.
The testmgr.h portion of this patch was automatically generated using
the following awk script, with some slight manual fixups on top (updated
'struct cipher_testvec' definition, updated a few comments, and fixed up
the AES keywrap test vectors):
BEGIN { OTHER = 0; ENCVEC = 1; DECVEC = 2; DECVEC_TAIL = 3; mode = OTHER }
/^static const struct cipher_testvec.*_enc_/ { sub("_enc", ""); mode = ENCVEC }
/^static const struct cipher_testvec.*_dec_/ { mode = DECVEC }
mode == ENCVEC && !/\.ilen[[:space:]]*=/ {
sub(/\.input[[:space:]]*=$/, ".ptext =")
sub(/\.input[[:space:]]*=/, ".ptext\t=")
sub(/\.result[[:space:]]*=$/, ".ctext =")
sub(/\.result[[:space:]]*=/, ".ctext\t=")
sub(/\.rlen[[:space:]]*=/, ".len\t=")
print
}
mode == DECVEC_TAIL && /[^[:space:]]/ { mode = OTHER }
mode == OTHER { print }
mode == ENCVEC && /^};/ { mode = OTHER }
mode == DECVEC && /^};/ { mode = DECVEC_TAIL }
Note that git's default diff algorithm gets confused by the testmgr.h
portion of this patch, and reports too many lines added and removed.
It's better viewed with 'git diff --minimal' (or 'git show --minimal'),
which reports "2 files changed, 919 insertions(+), 11723 deletions(-)".
Signed-off-by: Eric Biggers <ebiggers@google.com>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
2018-05-21 08:50:29 +03:00
|
|
|
hexdump(q, template[i].len);
|
2008-08-17 11:01:56 +04:00
|
|
|
ret = -EINVAL;
|
|
|
|
goto out;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
ret = 0;
|
|
|
|
|
|
|
|
out:
|
2009-05-06 10:15:47 +04:00
|
|
|
testmgr_free_buf(xbuf);
|
|
|
|
out_nobuf:
|
2008-08-17 11:01:56 +04:00
|
|
|
return ret;
|
|
|
|
}
|
|
|
|
|
2015-08-20 10:21:46 +03:00
|
|
|
static int __test_skcipher(struct crypto_skcipher *tfm, int enc,
|
2017-02-25 02:46:59 +03:00
|
|
|
const struct cipher_testvec *template,
|
|
|
|
unsigned int tcount,
|
2013-06-13 18:37:45 +04:00
|
|
|
const bool diff_dst, const int align_offset)
|
2008-07-31 13:08:25 +04:00
|
|
|
{
|
|
|
|
const char *algo =
|
2015-08-20 10:21:46 +03:00
|
|
|
crypto_tfm_alg_driver_name(crypto_skcipher_tfm(tfm));
|
2008-07-31 13:08:25 +04:00
|
|
|
unsigned int i, j, k, n, temp;
|
|
|
|
char *q;
|
2015-08-20 10:21:46 +03:00
|
|
|
struct skcipher_request *req;
|
2008-07-31 13:08:25 +04:00
|
|
|
struct scatterlist sg[8];
|
2012-09-21 11:26:47 +04:00
|
|
|
struct scatterlist sgout[8];
|
|
|
|
const char *e, *d;
|
2017-10-18 10:00:43 +03:00
|
|
|
struct crypto_wait wait;
|
crypto: testmgr - eliminate redundant decryption test vectors
Currently testmgr has separate encryption and decryption test vectors
for symmetric ciphers. That's massively redundant, since with few
exceptions (mostly mistakes, apparently), all decryption tests are
identical to the encryption tests, just with the input/result flipped.
Therefore, eliminate the redundancy by removing the decryption test
vectors and updating testmgr to test both encryption and decryption
using what used to be the encryption test vectors. Naming is adjusted
accordingly: each cipher_testvec now has a 'ptext' (plaintext), 'ctext'
(ciphertext), and 'len' instead of an 'input', 'result', 'ilen', and
'rlen'. Note that it was always the case that 'ilen == rlen'.
AES keywrap ("kw(aes)") is special because its IV is generated by the
encryption. Previously this was handled by specifying 'iv_out' for
encryption and 'iv' for decryption. To make it work cleanly with only
one set of test vectors, put the IV in 'iv', remove 'iv_out', and add a
boolean that indicates that the IV is generated by the encryption.
In total, this removes over 10000 lines from testmgr.h, with no
reduction in test coverage since prior patches already copied the few
unique decryption test vectors into the encryption test vectors.
This covers all algorithms that used 'struct cipher_testvec', e.g. any
block cipher in the ECB, CBC, CTR, XTS, LRW, CTS-CBC, PCBC, OFB, or
keywrap modes, and Salsa20 and ChaCha20. No change is made to AEAD
tests, though we probably can eliminate a similar redundancy there too.
The testmgr.h portion of this patch was automatically generated using
the following awk script, with some slight manual fixups on top (updated
'struct cipher_testvec' definition, updated a few comments, and fixed up
the AES keywrap test vectors):
BEGIN { OTHER = 0; ENCVEC = 1; DECVEC = 2; DECVEC_TAIL = 3; mode = OTHER }
/^static const struct cipher_testvec.*_enc_/ { sub("_enc", ""); mode = ENCVEC }
/^static const struct cipher_testvec.*_dec_/ { mode = DECVEC }
mode == ENCVEC && !/\.ilen[[:space:]]*=/ {
sub(/\.input[[:space:]]*=$/, ".ptext =")
sub(/\.input[[:space:]]*=/, ".ptext\t=")
sub(/\.result[[:space:]]*=$/, ".ctext =")
sub(/\.result[[:space:]]*=/, ".ctext\t=")
sub(/\.rlen[[:space:]]*=/, ".len\t=")
print
}
mode == DECVEC_TAIL && /[^[:space:]]/ { mode = OTHER }
mode == OTHER { print }
mode == ENCVEC && /^};/ { mode = OTHER }
mode == DECVEC && /^};/ { mode = DECVEC_TAIL }
Note that git's default diff algorithm gets confused by the testmgr.h
portion of this patch, and reports too many lines added and removed.
It's better viewed with 'git diff --minimal' (or 'git show --minimal'),
which reports "2 files changed, 919 insertions(+), 11723 deletions(-)".
Signed-off-by: Eric Biggers <ebiggers@google.com>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
2018-05-21 08:50:29 +03:00
|
|
|
const char *input, *result;
|
2008-07-31 13:08:25 +04:00
|
|
|
void *data;
|
|
|
|
char iv[MAX_IVLEN];
|
2009-05-06 10:15:47 +04:00
|
|
|
char *xbuf[XBUFSIZE];
|
2012-09-21 11:26:47 +04:00
|
|
|
char *xoutbuf[XBUFSIZE];
|
2009-05-06 10:15:47 +04:00
|
|
|
int ret = -ENOMEM;
|
2015-09-10 13:11:55 +03:00
|
|
|
unsigned int ivsize = crypto_skcipher_ivsize(tfm);
|
2009-05-06 10:15:47 +04:00
|
|
|
|
|
|
|
if (testmgr_alloc_buf(xbuf))
|
|
|
|
goto out_nobuf;
|
2008-07-31 13:08:25 +04:00
|
|
|
|
2012-09-21 11:26:47 +04:00
|
|
|
if (diff_dst && testmgr_alloc_buf(xoutbuf))
|
|
|
|
goto out_nooutbuf;
|
|
|
|
|
|
|
|
if (diff_dst)
|
|
|
|
d = "-ddst";
|
|
|
|
else
|
|
|
|
d = "";
|
|
|
|
|
2008-07-31 13:08:25 +04:00
|
|
|
if (enc == ENCRYPT)
|
|
|
|
e = "encryption";
|
|
|
|
else
|
|
|
|
e = "decryption";
|
|
|
|
|
2017-10-18 10:00:43 +03:00
|
|
|
crypto_init_wait(&wait);
|
2008-07-31 13:08:25 +04:00
|
|
|
|
2015-08-20 10:21:46 +03:00
|
|
|
req = skcipher_request_alloc(tfm, GFP_KERNEL);
|
2008-07-31 13:08:25 +04:00
|
|
|
if (!req) {
|
2012-09-21 11:26:47 +04:00
|
|
|
pr_err("alg: skcipher%s: Failed to allocate request for %s\n",
|
|
|
|
d, algo);
|
2008-07-31 13:08:25 +04:00
|
|
|
goto out;
|
|
|
|
}
|
|
|
|
|
2015-08-20 10:21:46 +03:00
|
|
|
skcipher_request_set_callback(req, CRYPTO_TFM_REQ_MAY_BACKLOG,
|
2017-10-18 10:00:43 +03:00
|
|
|
crypto_req_done, &wait);
|
2008-07-31 13:08:25 +04:00
|
|
|
|
|
|
|
j = 0;
|
|
|
|
for (i = 0; i < tcount; i++) {
|
2014-08-08 15:27:52 +04:00
|
|
|
if (template[i].np && !template[i].also_non_np)
|
|
|
|
continue;
|
|
|
|
|
2016-08-25 16:15:01 +03:00
|
|
|
if (fips_enabled && template[i].fips_skip)
|
|
|
|
continue;
|
|
|
|
|
crypto: testmgr - eliminate redundant decryption test vectors
Currently testmgr has separate encryption and decryption test vectors
for symmetric ciphers. That's massively redundant, since with few
exceptions (mostly mistakes, apparently), all decryption tests are
identical to the encryption tests, just with the input/result flipped.
Therefore, eliminate the redundancy by removing the decryption test
vectors and updating testmgr to test both encryption and decryption
using what used to be the encryption test vectors. Naming is adjusted
accordingly: each cipher_testvec now has a 'ptext' (plaintext), 'ctext'
(ciphertext), and 'len' instead of an 'input', 'result', 'ilen', and
'rlen'. Note that it was always the case that 'ilen == rlen'.
AES keywrap ("kw(aes)") is special because its IV is generated by the
encryption. Previously this was handled by specifying 'iv_out' for
encryption and 'iv' for decryption. To make it work cleanly with only
one set of test vectors, put the IV in 'iv', remove 'iv_out', and add a
boolean that indicates that the IV is generated by the encryption.
In total, this removes over 10000 lines from testmgr.h, with no
reduction in test coverage since prior patches already copied the few
unique decryption test vectors into the encryption test vectors.
This covers all algorithms that used 'struct cipher_testvec', e.g. any
block cipher in the ECB, CBC, CTR, XTS, LRW, CTS-CBC, PCBC, OFB, or
keywrap modes, and Salsa20 and ChaCha20. No change is made to AEAD
tests, though we probably can eliminate a similar redundancy there too.
The testmgr.h portion of this patch was automatically generated using
the following awk script, with some slight manual fixups on top (updated
'struct cipher_testvec' definition, updated a few comments, and fixed up
the AES keywrap test vectors):
BEGIN { OTHER = 0; ENCVEC = 1; DECVEC = 2; DECVEC_TAIL = 3; mode = OTHER }
/^static const struct cipher_testvec.*_enc_/ { sub("_enc", ""); mode = ENCVEC }
/^static const struct cipher_testvec.*_dec_/ { mode = DECVEC }
mode == ENCVEC && !/\.ilen[[:space:]]*=/ {
sub(/\.input[[:space:]]*=$/, ".ptext =")
sub(/\.input[[:space:]]*=/, ".ptext\t=")
sub(/\.result[[:space:]]*=$/, ".ctext =")
sub(/\.result[[:space:]]*=/, ".ctext\t=")
sub(/\.rlen[[:space:]]*=/, ".len\t=")
print
}
mode == DECVEC_TAIL && /[^[:space:]]/ { mode = OTHER }
mode == OTHER { print }
mode == ENCVEC && /^};/ { mode = OTHER }
mode == DECVEC && /^};/ { mode = DECVEC_TAIL }
Note that git's default diff algorithm gets confused by the testmgr.h
portion of this patch, and reports too many lines added and removed.
It's better viewed with 'git diff --minimal' (or 'git show --minimal'),
which reports "2 files changed, 919 insertions(+), 11723 deletions(-)".
Signed-off-by: Eric Biggers <ebiggers@google.com>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
2018-05-21 08:50:29 +03:00
|
|
|
if (template[i].iv && !(template[i].generates_iv && enc))
|
2015-09-10 13:11:55 +03:00
|
|
|
memcpy(iv, template[i].iv, ivsize);
|
2008-07-31 13:08:25 +04:00
|
|
|
else
|
|
|
|
memset(iv, 0, MAX_IVLEN);
|
|
|
|
|
crypto: testmgr - eliminate redundant decryption test vectors
Currently testmgr has separate encryption and decryption test vectors
for symmetric ciphers. That's massively redundant, since with few
exceptions (mostly mistakes, apparently), all decryption tests are
identical to the encryption tests, just with the input/result flipped.
Therefore, eliminate the redundancy by removing the decryption test
vectors and updating testmgr to test both encryption and decryption
using what used to be the encryption test vectors. Naming is adjusted
accordingly: each cipher_testvec now has a 'ptext' (plaintext), 'ctext'
(ciphertext), and 'len' instead of an 'input', 'result', 'ilen', and
'rlen'. Note that it was always the case that 'ilen == rlen'.
AES keywrap ("kw(aes)") is special because its IV is generated by the
encryption. Previously this was handled by specifying 'iv_out' for
encryption and 'iv' for decryption. To make it work cleanly with only
one set of test vectors, put the IV in 'iv', remove 'iv_out', and add a
boolean that indicates that the IV is generated by the encryption.
In total, this removes over 10000 lines from testmgr.h, with no
reduction in test coverage since prior patches already copied the few
unique decryption test vectors into the encryption test vectors.
This covers all algorithms that used 'struct cipher_testvec', e.g. any
block cipher in the ECB, CBC, CTR, XTS, LRW, CTS-CBC, PCBC, OFB, or
keywrap modes, and Salsa20 and ChaCha20. No change is made to AEAD
tests, though we probably can eliminate a similar redundancy there too.
The testmgr.h portion of this patch was automatically generated using
the following awk script, with some slight manual fixups on top (updated
'struct cipher_testvec' definition, updated a few comments, and fixed up
the AES keywrap test vectors):
BEGIN { OTHER = 0; ENCVEC = 1; DECVEC = 2; DECVEC_TAIL = 3; mode = OTHER }
/^static const struct cipher_testvec.*_enc_/ { sub("_enc", ""); mode = ENCVEC }
/^static const struct cipher_testvec.*_dec_/ { mode = DECVEC }
mode == ENCVEC && !/\.ilen[[:space:]]*=/ {
sub(/\.input[[:space:]]*=$/, ".ptext =")
sub(/\.input[[:space:]]*=/, ".ptext\t=")
sub(/\.result[[:space:]]*=$/, ".ctext =")
sub(/\.result[[:space:]]*=/, ".ctext\t=")
sub(/\.rlen[[:space:]]*=/, ".len\t=")
print
}
mode == DECVEC_TAIL && /[^[:space:]]/ { mode = OTHER }
mode == OTHER { print }
mode == ENCVEC && /^};/ { mode = OTHER }
mode == DECVEC && /^};/ { mode = DECVEC_TAIL }
Note that git's default diff algorithm gets confused by the testmgr.h
portion of this patch, and reports too many lines added and removed.
It's better viewed with 'git diff --minimal' (or 'git show --minimal'),
which reports "2 files changed, 919 insertions(+), 11723 deletions(-)".
Signed-off-by: Eric Biggers <ebiggers@google.com>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
2018-05-21 08:50:29 +03:00
|
|
|
input = enc ? template[i].ptext : template[i].ctext;
|
|
|
|
result = enc ? template[i].ctext : template[i].ptext;
|
2014-08-08 15:27:51 +04:00
|
|
|
j++;
|
|
|
|
ret = -EINVAL;
|
crypto: testmgr - eliminate redundant decryption test vectors
Currently testmgr has separate encryption and decryption test vectors
for symmetric ciphers. That's massively redundant, since with few
exceptions (mostly mistakes, apparently), all decryption tests are
identical to the encryption tests, just with the input/result flipped.
Therefore, eliminate the redundancy by removing the decryption test
vectors and updating testmgr to test both encryption and decryption
using what used to be the encryption test vectors. Naming is adjusted
accordingly: each cipher_testvec now has a 'ptext' (plaintext), 'ctext'
(ciphertext), and 'len' instead of an 'input', 'result', 'ilen', and
'rlen'. Note that it was always the case that 'ilen == rlen'.
AES keywrap ("kw(aes)") is special because its IV is generated by the
encryption. Previously this was handled by specifying 'iv_out' for
encryption and 'iv' for decryption. To make it work cleanly with only
one set of test vectors, put the IV in 'iv', remove 'iv_out', and add a
boolean that indicates that the IV is generated by the encryption.
In total, this removes over 10000 lines from testmgr.h, with no
reduction in test coverage since prior patches already copied the few
unique decryption test vectors into the encryption test vectors.
This covers all algorithms that used 'struct cipher_testvec', e.g. any
block cipher in the ECB, CBC, CTR, XTS, LRW, CTS-CBC, PCBC, OFB, or
keywrap modes, and Salsa20 and ChaCha20. No change is made to AEAD
tests, though we probably can eliminate a similar redundancy there too.
The testmgr.h portion of this patch was automatically generated using
the following awk script, with some slight manual fixups on top (updated
'struct cipher_testvec' definition, updated a few comments, and fixed up
the AES keywrap test vectors):
BEGIN { OTHER = 0; ENCVEC = 1; DECVEC = 2; DECVEC_TAIL = 3; mode = OTHER }
/^static const struct cipher_testvec.*_enc_/ { sub("_enc", ""); mode = ENCVEC }
/^static const struct cipher_testvec.*_dec_/ { mode = DECVEC }
mode == ENCVEC && !/\.ilen[[:space:]]*=/ {
sub(/\.input[[:space:]]*=$/, ".ptext =")
sub(/\.input[[:space:]]*=/, ".ptext\t=")
sub(/\.result[[:space:]]*=$/, ".ctext =")
sub(/\.result[[:space:]]*=/, ".ctext\t=")
sub(/\.rlen[[:space:]]*=/, ".len\t=")
print
}
mode == DECVEC_TAIL && /[^[:space:]]/ { mode = OTHER }
mode == OTHER { print }
mode == ENCVEC && /^};/ { mode = OTHER }
mode == DECVEC && /^};/ { mode = DECVEC_TAIL }
Note that git's default diff algorithm gets confused by the testmgr.h
portion of this patch, and reports too many lines added and removed.
It's better viewed with 'git diff --minimal' (or 'git show --minimal'),
which reports "2 files changed, 919 insertions(+), 11723 deletions(-)".
Signed-off-by: Eric Biggers <ebiggers@google.com>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
2018-05-21 08:50:29 +03:00
|
|
|
if (WARN_ON(align_offset + template[i].len > PAGE_SIZE))
|
2014-08-08 15:27:51 +04:00
|
|
|
goto out;
|
2008-07-31 13:08:25 +04:00
|
|
|
|
2014-08-08 15:27:51 +04:00
|
|
|
data = xbuf[0];
|
|
|
|
data += align_offset;
|
crypto: testmgr - eliminate redundant decryption test vectors
Currently testmgr has separate encryption and decryption test vectors
for symmetric ciphers. That's massively redundant, since with few
exceptions (mostly mistakes, apparently), all decryption tests are
identical to the encryption tests, just with the input/result flipped.
Therefore, eliminate the redundancy by removing the decryption test
vectors and updating testmgr to test both encryption and decryption
using what used to be the encryption test vectors. Naming is adjusted
accordingly: each cipher_testvec now has a 'ptext' (plaintext), 'ctext'
(ciphertext), and 'len' instead of an 'input', 'result', 'ilen', and
'rlen'. Note that it was always the case that 'ilen == rlen'.
AES keywrap ("kw(aes)") is special because its IV is generated by the
encryption. Previously this was handled by specifying 'iv_out' for
encryption and 'iv' for decryption. To make it work cleanly with only
one set of test vectors, put the IV in 'iv', remove 'iv_out', and add a
boolean that indicates that the IV is generated by the encryption.
In total, this removes over 10000 lines from testmgr.h, with no
reduction in test coverage since prior patches already copied the few
unique decryption test vectors into the encryption test vectors.
This covers all algorithms that used 'struct cipher_testvec', e.g. any
block cipher in the ECB, CBC, CTR, XTS, LRW, CTS-CBC, PCBC, OFB, or
keywrap modes, and Salsa20 and ChaCha20. No change is made to AEAD
tests, though we probably can eliminate a similar redundancy there too.
The testmgr.h portion of this patch was automatically generated using
the following awk script, with some slight manual fixups on top (updated
'struct cipher_testvec' definition, updated a few comments, and fixed up
the AES keywrap test vectors):
BEGIN { OTHER = 0; ENCVEC = 1; DECVEC = 2; DECVEC_TAIL = 3; mode = OTHER }
/^static const struct cipher_testvec.*_enc_/ { sub("_enc", ""); mode = ENCVEC }
/^static const struct cipher_testvec.*_dec_/ { mode = DECVEC }
mode == ENCVEC && !/\.ilen[[:space:]]*=/ {
sub(/\.input[[:space:]]*=$/, ".ptext =")
sub(/\.input[[:space:]]*=/, ".ptext\t=")
sub(/\.result[[:space:]]*=$/, ".ctext =")
sub(/\.result[[:space:]]*=/, ".ctext\t=")
sub(/\.rlen[[:space:]]*=/, ".len\t=")
print
}
mode == DECVEC_TAIL && /[^[:space:]]/ { mode = OTHER }
mode == OTHER { print }
mode == ENCVEC && /^};/ { mode = OTHER }
mode == DECVEC && /^};/ { mode = DECVEC_TAIL }
Note that git's default diff algorithm gets confused by the testmgr.h
portion of this patch, and reports too many lines added and removed.
It's better viewed with 'git diff --minimal' (or 'git show --minimal'),
which reports "2 files changed, 919 insertions(+), 11723 deletions(-)".
Signed-off-by: Eric Biggers <ebiggers@google.com>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
2018-05-21 08:50:29 +03:00
|
|
|
memcpy(data, input, template[i].len);
|
2014-08-08 15:27:51 +04:00
|
|
|
|
2015-08-20 10:21:46 +03:00
|
|
|
crypto_skcipher_clear_flags(tfm, ~0);
|
2014-08-08 15:27:51 +04:00
|
|
|
if (template[i].wk)
|
2015-08-20 10:21:46 +03:00
|
|
|
crypto_skcipher_set_flags(tfm,
|
|
|
|
CRYPTO_TFM_REQ_WEAK_KEY);
|
2008-07-31 13:08:25 +04:00
|
|
|
|
2015-08-20 10:21:46 +03:00
|
|
|
ret = crypto_skcipher_setkey(tfm, template[i].key,
|
|
|
|
template[i].klen);
|
2016-07-29 11:32:09 +03:00
|
|
|
if (template[i].fail == !ret) {
|
2014-08-08 15:27:51 +04:00
|
|
|
pr_err("alg: skcipher%s: setkey failed on test %d for %s: flags=%x\n",
|
2015-08-20 10:21:46 +03:00
|
|
|
d, j, algo, crypto_skcipher_get_flags(tfm));
|
2014-08-08 15:27:51 +04:00
|
|
|
goto out;
|
|
|
|
} else if (ret)
|
|
|
|
continue;
|
|
|
|
|
crypto: testmgr - eliminate redundant decryption test vectors
Currently testmgr has separate encryption and decryption test vectors
for symmetric ciphers. That's massively redundant, since with few
exceptions (mostly mistakes, apparently), all decryption tests are
identical to the encryption tests, just with the input/result flipped.
Therefore, eliminate the redundancy by removing the decryption test
vectors and updating testmgr to test both encryption and decryption
using what used to be the encryption test vectors. Naming is adjusted
accordingly: each cipher_testvec now has a 'ptext' (plaintext), 'ctext'
(ciphertext), and 'len' instead of an 'input', 'result', 'ilen', and
'rlen'. Note that it was always the case that 'ilen == rlen'.
AES keywrap ("kw(aes)") is special because its IV is generated by the
encryption. Previously this was handled by specifying 'iv_out' for
encryption and 'iv' for decryption. To make it work cleanly with only
one set of test vectors, put the IV in 'iv', remove 'iv_out', and add a
boolean that indicates that the IV is generated by the encryption.
In total, this removes over 10000 lines from testmgr.h, with no
reduction in test coverage since prior patches already copied the few
unique decryption test vectors into the encryption test vectors.
This covers all algorithms that used 'struct cipher_testvec', e.g. any
block cipher in the ECB, CBC, CTR, XTS, LRW, CTS-CBC, PCBC, OFB, or
keywrap modes, and Salsa20 and ChaCha20. No change is made to AEAD
tests, though we probably can eliminate a similar redundancy there too.
The testmgr.h portion of this patch was automatically generated using
the following awk script, with some slight manual fixups on top (updated
'struct cipher_testvec' definition, updated a few comments, and fixed up
the AES keywrap test vectors):
BEGIN { OTHER = 0; ENCVEC = 1; DECVEC = 2; DECVEC_TAIL = 3; mode = OTHER }
/^static const struct cipher_testvec.*_enc_/ { sub("_enc", ""); mode = ENCVEC }
/^static const struct cipher_testvec.*_dec_/ { mode = DECVEC }
mode == ENCVEC && !/\.ilen[[:space:]]*=/ {
sub(/\.input[[:space:]]*=$/, ".ptext =")
sub(/\.input[[:space:]]*=/, ".ptext\t=")
sub(/\.result[[:space:]]*=$/, ".ctext =")
sub(/\.result[[:space:]]*=/, ".ctext\t=")
sub(/\.rlen[[:space:]]*=/, ".len\t=")
print
}
mode == DECVEC_TAIL && /[^[:space:]]/ { mode = OTHER }
mode == OTHER { print }
mode == ENCVEC && /^};/ { mode = OTHER }
mode == DECVEC && /^};/ { mode = DECVEC_TAIL }
Note that git's default diff algorithm gets confused by the testmgr.h
portion of this patch, and reports too many lines added and removed.
It's better viewed with 'git diff --minimal' (or 'git show --minimal'),
which reports "2 files changed, 919 insertions(+), 11723 deletions(-)".
Signed-off-by: Eric Biggers <ebiggers@google.com>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
2018-05-21 08:50:29 +03:00
|
|
|
sg_init_one(&sg[0], data, template[i].len);
|
2014-08-08 15:27:51 +04:00
|
|
|
if (diff_dst) {
|
|
|
|
data = xoutbuf[0];
|
|
|
|
data += align_offset;
|
crypto: testmgr - eliminate redundant decryption test vectors
Currently testmgr has separate encryption and decryption test vectors
for symmetric ciphers. That's massively redundant, since with few
exceptions (mostly mistakes, apparently), all decryption tests are
identical to the encryption tests, just with the input/result flipped.
Therefore, eliminate the redundancy by removing the decryption test
vectors and updating testmgr to test both encryption and decryption
using what used to be the encryption test vectors. Naming is adjusted
accordingly: each cipher_testvec now has a 'ptext' (plaintext), 'ctext'
(ciphertext), and 'len' instead of an 'input', 'result', 'ilen', and
'rlen'. Note that it was always the case that 'ilen == rlen'.
AES keywrap ("kw(aes)") is special because its IV is generated by the
encryption. Previously this was handled by specifying 'iv_out' for
encryption and 'iv' for decryption. To make it work cleanly with only
one set of test vectors, put the IV in 'iv', remove 'iv_out', and add a
boolean that indicates that the IV is generated by the encryption.
In total, this removes over 10000 lines from testmgr.h, with no
reduction in test coverage since prior patches already copied the few
unique decryption test vectors into the encryption test vectors.
This covers all algorithms that used 'struct cipher_testvec', e.g. any
block cipher in the ECB, CBC, CTR, XTS, LRW, CTS-CBC, PCBC, OFB, or
keywrap modes, and Salsa20 and ChaCha20. No change is made to AEAD
tests, though we probably can eliminate a similar redundancy there too.
The testmgr.h portion of this patch was automatically generated using
the following awk script, with some slight manual fixups on top (updated
'struct cipher_testvec' definition, updated a few comments, and fixed up
the AES keywrap test vectors):
BEGIN { OTHER = 0; ENCVEC = 1; DECVEC = 2; DECVEC_TAIL = 3; mode = OTHER }
/^static const struct cipher_testvec.*_enc_/ { sub("_enc", ""); mode = ENCVEC }
/^static const struct cipher_testvec.*_dec_/ { mode = DECVEC }
mode == ENCVEC && !/\.ilen[[:space:]]*=/ {
sub(/\.input[[:space:]]*=$/, ".ptext =")
sub(/\.input[[:space:]]*=/, ".ptext\t=")
sub(/\.result[[:space:]]*=$/, ".ctext =")
sub(/\.result[[:space:]]*=/, ".ctext\t=")
sub(/\.rlen[[:space:]]*=/, ".len\t=")
print
}
mode == DECVEC_TAIL && /[^[:space:]]/ { mode = OTHER }
mode == OTHER { print }
mode == ENCVEC && /^};/ { mode = OTHER }
mode == DECVEC && /^};/ { mode = DECVEC_TAIL }
Note that git's default diff algorithm gets confused by the testmgr.h
portion of this patch, and reports too many lines added and removed.
It's better viewed with 'git diff --minimal' (or 'git show --minimal'),
which reports "2 files changed, 919 insertions(+), 11723 deletions(-)".
Signed-off-by: Eric Biggers <ebiggers@google.com>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
2018-05-21 08:50:29 +03:00
|
|
|
sg_init_one(&sgout[0], data, template[i].len);
|
2014-08-08 15:27:51 +04:00
|
|
|
}
|
2008-07-31 13:08:25 +04:00
|
|
|
|
2015-08-20 10:21:46 +03:00
|
|
|
skcipher_request_set_crypt(req, sg, (diff_dst) ? sgout : sg,
|
crypto: testmgr - eliminate redundant decryption test vectors
Currently testmgr has separate encryption and decryption test vectors
for symmetric ciphers. That's massively redundant, since with few
exceptions (mostly mistakes, apparently), all decryption tests are
identical to the encryption tests, just with the input/result flipped.
Therefore, eliminate the redundancy by removing the decryption test
vectors and updating testmgr to test both encryption and decryption
using what used to be the encryption test vectors. Naming is adjusted
accordingly: each cipher_testvec now has a 'ptext' (plaintext), 'ctext'
(ciphertext), and 'len' instead of an 'input', 'result', 'ilen', and
'rlen'. Note that it was always the case that 'ilen == rlen'.
AES keywrap ("kw(aes)") is special because its IV is generated by the
encryption. Previously this was handled by specifying 'iv_out' for
encryption and 'iv' for decryption. To make it work cleanly with only
one set of test vectors, put the IV in 'iv', remove 'iv_out', and add a
boolean that indicates that the IV is generated by the encryption.
In total, this removes over 10000 lines from testmgr.h, with no
reduction in test coverage since prior patches already copied the few
unique decryption test vectors into the encryption test vectors.
This covers all algorithms that used 'struct cipher_testvec', e.g. any
block cipher in the ECB, CBC, CTR, XTS, LRW, CTS-CBC, PCBC, OFB, or
keywrap modes, and Salsa20 and ChaCha20. No change is made to AEAD
tests, though we probably can eliminate a similar redundancy there too.
The testmgr.h portion of this patch was automatically generated using
the following awk script, with some slight manual fixups on top (updated
'struct cipher_testvec' definition, updated a few comments, and fixed up
the AES keywrap test vectors):
BEGIN { OTHER = 0; ENCVEC = 1; DECVEC = 2; DECVEC_TAIL = 3; mode = OTHER }
/^static const struct cipher_testvec.*_enc_/ { sub("_enc", ""); mode = ENCVEC }
/^static const struct cipher_testvec.*_dec_/ { mode = DECVEC }
mode == ENCVEC && !/\.ilen[[:space:]]*=/ {
sub(/\.input[[:space:]]*=$/, ".ptext =")
sub(/\.input[[:space:]]*=/, ".ptext\t=")
sub(/\.result[[:space:]]*=$/, ".ctext =")
sub(/\.result[[:space:]]*=/, ".ctext\t=")
sub(/\.rlen[[:space:]]*=/, ".len\t=")
print
}
mode == DECVEC_TAIL && /[^[:space:]]/ { mode = OTHER }
mode == OTHER { print }
mode == ENCVEC && /^};/ { mode = OTHER }
mode == DECVEC && /^};/ { mode = DECVEC_TAIL }
Note that git's default diff algorithm gets confused by the testmgr.h
portion of this patch, and reports too many lines added and removed.
It's better viewed with 'git diff --minimal' (or 'git show --minimal'),
which reports "2 files changed, 919 insertions(+), 11723 deletions(-)".
Signed-off-by: Eric Biggers <ebiggers@google.com>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
2018-05-21 08:50:29 +03:00
|
|
|
template[i].len, iv);
|
2017-10-18 10:00:43 +03:00
|
|
|
ret = crypto_wait_req(enc ? crypto_skcipher_encrypt(req) :
|
|
|
|
crypto_skcipher_decrypt(req), &wait);
|
2014-08-08 15:27:51 +04:00
|
|
|
|
2017-10-18 10:00:43 +03:00
|
|
|
if (ret) {
|
2014-08-08 15:27:51 +04:00
|
|
|
pr_err("alg: skcipher%s: %s failed on test %d for %s: ret=%d\n",
|
|
|
|
d, e, j, algo, -ret);
|
|
|
|
goto out;
|
|
|
|
}
|
2008-07-31 13:08:25 +04:00
|
|
|
|
2014-08-08 15:27:51 +04:00
|
|
|
q = data;
|
crypto: testmgr - eliminate redundant decryption test vectors
Currently testmgr has separate encryption and decryption test vectors
for symmetric ciphers. That's massively redundant, since with few
exceptions (mostly mistakes, apparently), all decryption tests are
identical to the encryption tests, just with the input/result flipped.
Therefore, eliminate the redundancy by removing the decryption test
vectors and updating testmgr to test both encryption and decryption
using what used to be the encryption test vectors. Naming is adjusted
accordingly: each cipher_testvec now has a 'ptext' (plaintext), 'ctext'
(ciphertext), and 'len' instead of an 'input', 'result', 'ilen', and
'rlen'. Note that it was always the case that 'ilen == rlen'.
AES keywrap ("kw(aes)") is special because its IV is generated by the
encryption. Previously this was handled by specifying 'iv_out' for
encryption and 'iv' for decryption. To make it work cleanly with only
one set of test vectors, put the IV in 'iv', remove 'iv_out', and add a
boolean that indicates that the IV is generated by the encryption.
In total, this removes over 10000 lines from testmgr.h, with no
reduction in test coverage since prior patches already copied the few
unique decryption test vectors into the encryption test vectors.
This covers all algorithms that used 'struct cipher_testvec', e.g. any
block cipher in the ECB, CBC, CTR, XTS, LRW, CTS-CBC, PCBC, OFB, or
keywrap modes, and Salsa20 and ChaCha20. No change is made to AEAD
tests, though we probably can eliminate a similar redundancy there too.
The testmgr.h portion of this patch was automatically generated using
the following awk script, with some slight manual fixups on top (updated
'struct cipher_testvec' definition, updated a few comments, and fixed up
the AES keywrap test vectors):
BEGIN { OTHER = 0; ENCVEC = 1; DECVEC = 2; DECVEC_TAIL = 3; mode = OTHER }
/^static const struct cipher_testvec.*_enc_/ { sub("_enc", ""); mode = ENCVEC }
/^static const struct cipher_testvec.*_dec_/ { mode = DECVEC }
mode == ENCVEC && !/\.ilen[[:space:]]*=/ {
sub(/\.input[[:space:]]*=$/, ".ptext =")
sub(/\.input[[:space:]]*=/, ".ptext\t=")
sub(/\.result[[:space:]]*=$/, ".ctext =")
sub(/\.result[[:space:]]*=/, ".ctext\t=")
sub(/\.rlen[[:space:]]*=/, ".len\t=")
print
}
mode == DECVEC_TAIL && /[^[:space:]]/ { mode = OTHER }
mode == OTHER { print }
mode == ENCVEC && /^};/ { mode = OTHER }
mode == DECVEC && /^};/ { mode = DECVEC_TAIL }
Note that git's default diff algorithm gets confused by the testmgr.h
portion of this patch, and reports too many lines added and removed.
It's better viewed with 'git diff --minimal' (or 'git show --minimal'),
which reports "2 files changed, 919 insertions(+), 11723 deletions(-)".
Signed-off-by: Eric Biggers <ebiggers@google.com>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
2018-05-21 08:50:29 +03:00
|
|
|
if (memcmp(q, result, template[i].len)) {
|
2015-06-16 12:46:46 +03:00
|
|
|
pr_err("alg: skcipher%s: Test %d failed (invalid result) on %s for %s\n",
|
2014-08-08 15:27:51 +04:00
|
|
|
d, j, e, algo);
|
crypto: testmgr - eliminate redundant decryption test vectors
Currently testmgr has separate encryption and decryption test vectors
for symmetric ciphers. That's massively redundant, since with few
exceptions (mostly mistakes, apparently), all decryption tests are
identical to the encryption tests, just with the input/result flipped.
Therefore, eliminate the redundancy by removing the decryption test
vectors and updating testmgr to test both encryption and decryption
using what used to be the encryption test vectors. Naming is adjusted
accordingly: each cipher_testvec now has a 'ptext' (plaintext), 'ctext'
(ciphertext), and 'len' instead of an 'input', 'result', 'ilen', and
'rlen'. Note that it was always the case that 'ilen == rlen'.
AES keywrap ("kw(aes)") is special because its IV is generated by the
encryption. Previously this was handled by specifying 'iv_out' for
encryption and 'iv' for decryption. To make it work cleanly with only
one set of test vectors, put the IV in 'iv', remove 'iv_out', and add a
boolean that indicates that the IV is generated by the encryption.
In total, this removes over 10000 lines from testmgr.h, with no
reduction in test coverage since prior patches already copied the few
unique decryption test vectors into the encryption test vectors.
This covers all algorithms that used 'struct cipher_testvec', e.g. any
block cipher in the ECB, CBC, CTR, XTS, LRW, CTS-CBC, PCBC, OFB, or
keywrap modes, and Salsa20 and ChaCha20. No change is made to AEAD
tests, though we probably can eliminate a similar redundancy there too.
The testmgr.h portion of this patch was automatically generated using
the following awk script, with some slight manual fixups on top (updated
'struct cipher_testvec' definition, updated a few comments, and fixed up
the AES keywrap test vectors):
BEGIN { OTHER = 0; ENCVEC = 1; DECVEC = 2; DECVEC_TAIL = 3; mode = OTHER }
/^static const struct cipher_testvec.*_enc_/ { sub("_enc", ""); mode = ENCVEC }
/^static const struct cipher_testvec.*_dec_/ { mode = DECVEC }
mode == ENCVEC && !/\.ilen[[:space:]]*=/ {
sub(/\.input[[:space:]]*=$/, ".ptext =")
sub(/\.input[[:space:]]*=/, ".ptext\t=")
sub(/\.result[[:space:]]*=$/, ".ctext =")
sub(/\.result[[:space:]]*=/, ".ctext\t=")
sub(/\.rlen[[:space:]]*=/, ".len\t=")
print
}
mode == DECVEC_TAIL && /[^[:space:]]/ { mode = OTHER }
mode == OTHER { print }
mode == ENCVEC && /^};/ { mode = OTHER }
mode == DECVEC && /^};/ { mode = DECVEC_TAIL }
Note that git's default diff algorithm gets confused by the testmgr.h
portion of this patch, and reports too many lines added and removed.
It's better viewed with 'git diff --minimal' (or 'git show --minimal'),
which reports "2 files changed, 919 insertions(+), 11723 deletions(-)".
Signed-off-by: Eric Biggers <ebiggers@google.com>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
2018-05-21 08:50:29 +03:00
|
|
|
hexdump(q, template[i].len);
|
2014-08-08 15:27:51 +04:00
|
|
|
ret = -EINVAL;
|
|
|
|
goto out;
|
2008-07-31 13:08:25 +04:00
|
|
|
}
|
2015-06-16 12:46:46 +03:00
|
|
|
|
crypto: testmgr - eliminate redundant decryption test vectors
Currently testmgr has separate encryption and decryption test vectors
for symmetric ciphers. That's massively redundant, since with few
exceptions (mostly mistakes, apparently), all decryption tests are
identical to the encryption tests, just with the input/result flipped.
Therefore, eliminate the redundancy by removing the decryption test
vectors and updating testmgr to test both encryption and decryption
using what used to be the encryption test vectors. Naming is adjusted
accordingly: each cipher_testvec now has a 'ptext' (plaintext), 'ctext'
(ciphertext), and 'len' instead of an 'input', 'result', 'ilen', and
'rlen'. Note that it was always the case that 'ilen == rlen'.
AES keywrap ("kw(aes)") is special because its IV is generated by the
encryption. Previously this was handled by specifying 'iv_out' for
encryption and 'iv' for decryption. To make it work cleanly with only
one set of test vectors, put the IV in 'iv', remove 'iv_out', and add a
boolean that indicates that the IV is generated by the encryption.
In total, this removes over 10000 lines from testmgr.h, with no
reduction in test coverage since prior patches already copied the few
unique decryption test vectors into the encryption test vectors.
This covers all algorithms that used 'struct cipher_testvec', e.g. any
block cipher in the ECB, CBC, CTR, XTS, LRW, CTS-CBC, PCBC, OFB, or
keywrap modes, and Salsa20 and ChaCha20. No change is made to AEAD
tests, though we probably can eliminate a similar redundancy there too.
The testmgr.h portion of this patch was automatically generated using
the following awk script, with some slight manual fixups on top (updated
'struct cipher_testvec' definition, updated a few comments, and fixed up
the AES keywrap test vectors):
BEGIN { OTHER = 0; ENCVEC = 1; DECVEC = 2; DECVEC_TAIL = 3; mode = OTHER }
/^static const struct cipher_testvec.*_enc_/ { sub("_enc", ""); mode = ENCVEC }
/^static const struct cipher_testvec.*_dec_/ { mode = DECVEC }
mode == ENCVEC && !/\.ilen[[:space:]]*=/ {
sub(/\.input[[:space:]]*=$/, ".ptext =")
sub(/\.input[[:space:]]*=/, ".ptext\t=")
sub(/\.result[[:space:]]*=$/, ".ctext =")
sub(/\.result[[:space:]]*=/, ".ctext\t=")
sub(/\.rlen[[:space:]]*=/, ".len\t=")
print
}
mode == DECVEC_TAIL && /[^[:space:]]/ { mode = OTHER }
mode == OTHER { print }
mode == ENCVEC && /^};/ { mode = OTHER }
mode == DECVEC && /^};/ { mode = DECVEC_TAIL }
Note that git's default diff algorithm gets confused by the testmgr.h
portion of this patch, and reports too many lines added and removed.
It's better viewed with 'git diff --minimal' (or 'git show --minimal'),
which reports "2 files changed, 919 insertions(+), 11723 deletions(-)".
Signed-off-by: Eric Biggers <ebiggers@google.com>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
2018-05-21 08:50:29 +03:00
|
|
|
if (template[i].generates_iv && enc &&
|
|
|
|
memcmp(iv, template[i].iv, crypto_skcipher_ivsize(tfm))) {
|
2015-06-16 12:46:46 +03:00
|
|
|
pr_err("alg: skcipher%s: Test %d failed (invalid output IV) on %s for %s\n",
|
|
|
|
d, j, e, algo);
|
|
|
|
hexdump(iv, crypto_skcipher_ivsize(tfm));
|
|
|
|
ret = -EINVAL;
|
|
|
|
goto out;
|
|
|
|
}
|
2008-07-31 13:08:25 +04:00
|
|
|
}
|
|
|
|
|
|
|
|
j = 0;
|
|
|
|
for (i = 0; i < tcount; i++) {
|
2013-06-13 18:37:45 +04:00
|
|
|
/* alignment tests are only done with continuous buffers */
|
|
|
|
if (align_offset != 0)
|
|
|
|
break;
|
2008-07-31 13:08:25 +04:00
|
|
|
|
2014-08-08 15:27:52 +04:00
|
|
|
if (!template[i].np)
|
|
|
|
continue;
|
|
|
|
|
2016-08-25 16:15:01 +03:00
|
|
|
if (fips_enabled && template[i].fips_skip)
|
|
|
|
continue;
|
|
|
|
|
crypto: testmgr - eliminate redundant decryption test vectors
Currently testmgr has separate encryption and decryption test vectors
for symmetric ciphers. That's massively redundant, since with few
exceptions (mostly mistakes, apparently), all decryption tests are
identical to the encryption tests, just with the input/result flipped.
Therefore, eliminate the redundancy by removing the decryption test
vectors and updating testmgr to test both encryption and decryption
using what used to be the encryption test vectors. Naming is adjusted
accordingly: each cipher_testvec now has a 'ptext' (plaintext), 'ctext'
(ciphertext), and 'len' instead of an 'input', 'result', 'ilen', and
'rlen'. Note that it was always the case that 'ilen == rlen'.
AES keywrap ("kw(aes)") is special because its IV is generated by the
encryption. Previously this was handled by specifying 'iv_out' for
encryption and 'iv' for decryption. To make it work cleanly with only
one set of test vectors, put the IV in 'iv', remove 'iv_out', and add a
boolean that indicates that the IV is generated by the encryption.
In total, this removes over 10000 lines from testmgr.h, with no
reduction in test coverage since prior patches already copied the few
unique decryption test vectors into the encryption test vectors.
This covers all algorithms that used 'struct cipher_testvec', e.g. any
block cipher in the ECB, CBC, CTR, XTS, LRW, CTS-CBC, PCBC, OFB, or
keywrap modes, and Salsa20 and ChaCha20. No change is made to AEAD
tests, though we probably can eliminate a similar redundancy there too.
The testmgr.h portion of this patch was automatically generated using
the following awk script, with some slight manual fixups on top (updated
'struct cipher_testvec' definition, updated a few comments, and fixed up
the AES keywrap test vectors):
BEGIN { OTHER = 0; ENCVEC = 1; DECVEC = 2; DECVEC_TAIL = 3; mode = OTHER }
/^static const struct cipher_testvec.*_enc_/ { sub("_enc", ""); mode = ENCVEC }
/^static const struct cipher_testvec.*_dec_/ { mode = DECVEC }
mode == ENCVEC && !/\.ilen[[:space:]]*=/ {
sub(/\.input[[:space:]]*=$/, ".ptext =")
sub(/\.input[[:space:]]*=/, ".ptext\t=")
sub(/\.result[[:space:]]*=$/, ".ctext =")
sub(/\.result[[:space:]]*=/, ".ctext\t=")
sub(/\.rlen[[:space:]]*=/, ".len\t=")
print
}
mode == DECVEC_TAIL && /[^[:space:]]/ { mode = OTHER }
mode == OTHER { print }
mode == ENCVEC && /^};/ { mode = OTHER }
mode == DECVEC && /^};/ { mode = DECVEC_TAIL }
Note that git's default diff algorithm gets confused by the testmgr.h
portion of this patch, and reports too many lines added and removed.
It's better viewed with 'git diff --minimal' (or 'git show --minimal'),
which reports "2 files changed, 919 insertions(+), 11723 deletions(-)".
Signed-off-by: Eric Biggers <ebiggers@google.com>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
2018-05-21 08:50:29 +03:00
|
|
|
if (template[i].iv && !(template[i].generates_iv && enc))
|
2015-09-10 13:11:55 +03:00
|
|
|
memcpy(iv, template[i].iv, ivsize);
|
2008-07-31 13:08:25 +04:00
|
|
|
else
|
|
|
|
memset(iv, 0, MAX_IVLEN);
|
|
|
|
|
crypto: testmgr - eliminate redundant decryption test vectors
Currently testmgr has separate encryption and decryption test vectors
for symmetric ciphers. That's massively redundant, since with few
exceptions (mostly mistakes, apparently), all decryption tests are
identical to the encryption tests, just with the input/result flipped.
Therefore, eliminate the redundancy by removing the decryption test
vectors and updating testmgr to test both encryption and decryption
using what used to be the encryption test vectors. Naming is adjusted
accordingly: each cipher_testvec now has a 'ptext' (plaintext), 'ctext'
(ciphertext), and 'len' instead of an 'input', 'result', 'ilen', and
'rlen'. Note that it was always the case that 'ilen == rlen'.
AES keywrap ("kw(aes)") is special because its IV is generated by the
encryption. Previously this was handled by specifying 'iv_out' for
encryption and 'iv' for decryption. To make it work cleanly with only
one set of test vectors, put the IV in 'iv', remove 'iv_out', and add a
boolean that indicates that the IV is generated by the encryption.
In total, this removes over 10000 lines from testmgr.h, with no
reduction in test coverage since prior patches already copied the few
unique decryption test vectors into the encryption test vectors.
This covers all algorithms that used 'struct cipher_testvec', e.g. any
block cipher in the ECB, CBC, CTR, XTS, LRW, CTS-CBC, PCBC, OFB, or
keywrap modes, and Salsa20 and ChaCha20. No change is made to AEAD
tests, though we probably can eliminate a similar redundancy there too.
The testmgr.h portion of this patch was automatically generated using
the following awk script, with some slight manual fixups on top (updated
'struct cipher_testvec' definition, updated a few comments, and fixed up
the AES keywrap test vectors):
BEGIN { OTHER = 0; ENCVEC = 1; DECVEC = 2; DECVEC_TAIL = 3; mode = OTHER }
/^static const struct cipher_testvec.*_enc_/ { sub("_enc", ""); mode = ENCVEC }
/^static const struct cipher_testvec.*_dec_/ { mode = DECVEC }
mode == ENCVEC && !/\.ilen[[:space:]]*=/ {
sub(/\.input[[:space:]]*=$/, ".ptext =")
sub(/\.input[[:space:]]*=/, ".ptext\t=")
sub(/\.result[[:space:]]*=$/, ".ctext =")
sub(/\.result[[:space:]]*=/, ".ctext\t=")
sub(/\.rlen[[:space:]]*=/, ".len\t=")
print
}
mode == DECVEC_TAIL && /[^[:space:]]/ { mode = OTHER }
mode == OTHER { print }
mode == ENCVEC && /^};/ { mode = OTHER }
mode == DECVEC && /^};/ { mode = DECVEC_TAIL }
Note that git's default diff algorithm gets confused by the testmgr.h
portion of this patch, and reports too many lines added and removed.
It's better viewed with 'git diff --minimal' (or 'git show --minimal'),
which reports "2 files changed, 919 insertions(+), 11723 deletions(-)".
Signed-off-by: Eric Biggers <ebiggers@google.com>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
2018-05-21 08:50:29 +03:00
|
|
|
input = enc ? template[i].ptext : template[i].ctext;
|
|
|
|
result = enc ? template[i].ctext : template[i].ptext;
|
2014-08-08 15:27:51 +04:00
|
|
|
j++;
|
2015-08-20 10:21:46 +03:00
|
|
|
crypto_skcipher_clear_flags(tfm, ~0);
|
2014-08-08 15:27:51 +04:00
|
|
|
if (template[i].wk)
|
2015-08-20 10:21:46 +03:00
|
|
|
crypto_skcipher_set_flags(tfm,
|
|
|
|
CRYPTO_TFM_REQ_WEAK_KEY);
|
2008-07-31 13:08:25 +04:00
|
|
|
|
2015-08-20 10:21:46 +03:00
|
|
|
ret = crypto_skcipher_setkey(tfm, template[i].key,
|
|
|
|
template[i].klen);
|
2016-07-29 11:32:09 +03:00
|
|
|
if (template[i].fail == !ret) {
|
2014-08-08 15:27:51 +04:00
|
|
|
pr_err("alg: skcipher%s: setkey failed on chunk test %d for %s: flags=%x\n",
|
2015-08-20 10:21:46 +03:00
|
|
|
d, j, algo, crypto_skcipher_get_flags(tfm));
|
2014-08-08 15:27:51 +04:00
|
|
|
goto out;
|
|
|
|
} else if (ret)
|
|
|
|
continue;
|
2008-07-31 13:08:25 +04:00
|
|
|
|
2014-08-08 15:27:51 +04:00
|
|
|
temp = 0;
|
|
|
|
ret = -EINVAL;
|
|
|
|
sg_init_table(sg, template[i].np);
|
|
|
|
if (diff_dst)
|
|
|
|
sg_init_table(sgout, template[i].np);
|
|
|
|
for (k = 0; k < template[i].np; k++) {
|
|
|
|
if (WARN_ON(offset_in_page(IDX[k]) +
|
|
|
|
template[i].tap[k] > PAGE_SIZE))
|
2008-07-31 13:08:25 +04:00
|
|
|
goto out;
|
|
|
|
|
2014-08-08 15:27:51 +04:00
|
|
|
q = xbuf[IDX[k] >> PAGE_SHIFT] + offset_in_page(IDX[k]);
|
2008-07-31 13:08:25 +04:00
|
|
|
|
crypto: testmgr - eliminate redundant decryption test vectors
Currently testmgr has separate encryption and decryption test vectors
for symmetric ciphers. That's massively redundant, since with few
exceptions (mostly mistakes, apparently), all decryption tests are
identical to the encryption tests, just with the input/result flipped.
Therefore, eliminate the redundancy by removing the decryption test
vectors and updating testmgr to test both encryption and decryption
using what used to be the encryption test vectors. Naming is adjusted
accordingly: each cipher_testvec now has a 'ptext' (plaintext), 'ctext'
(ciphertext), and 'len' instead of an 'input', 'result', 'ilen', and
'rlen'. Note that it was always the case that 'ilen == rlen'.
AES keywrap ("kw(aes)") is special because its IV is generated by the
encryption. Previously this was handled by specifying 'iv_out' for
encryption and 'iv' for decryption. To make it work cleanly with only
one set of test vectors, put the IV in 'iv', remove 'iv_out', and add a
boolean that indicates that the IV is generated by the encryption.
In total, this removes over 10000 lines from testmgr.h, with no
reduction in test coverage since prior patches already copied the few
unique decryption test vectors into the encryption test vectors.
This covers all algorithms that used 'struct cipher_testvec', e.g. any
block cipher in the ECB, CBC, CTR, XTS, LRW, CTS-CBC, PCBC, OFB, or
keywrap modes, and Salsa20 and ChaCha20. No change is made to AEAD
tests, though we probably can eliminate a similar redundancy there too.
The testmgr.h portion of this patch was automatically generated using
the following awk script, with some slight manual fixups on top (updated
'struct cipher_testvec' definition, updated a few comments, and fixed up
the AES keywrap test vectors):
BEGIN { OTHER = 0; ENCVEC = 1; DECVEC = 2; DECVEC_TAIL = 3; mode = OTHER }
/^static const struct cipher_testvec.*_enc_/ { sub("_enc", ""); mode = ENCVEC }
/^static const struct cipher_testvec.*_dec_/ { mode = DECVEC }
mode == ENCVEC && !/\.ilen[[:space:]]*=/ {
sub(/\.input[[:space:]]*=$/, ".ptext =")
sub(/\.input[[:space:]]*=/, ".ptext\t=")
sub(/\.result[[:space:]]*=$/, ".ctext =")
sub(/\.result[[:space:]]*=/, ".ctext\t=")
sub(/\.rlen[[:space:]]*=/, ".len\t=")
print
}
mode == DECVEC_TAIL && /[^[:space:]]/ { mode = OTHER }
mode == OTHER { print }
mode == ENCVEC && /^};/ { mode = OTHER }
mode == DECVEC && /^};/ { mode = DECVEC_TAIL }
Note that git's default diff algorithm gets confused by the testmgr.h
portion of this patch, and reports too many lines added and removed.
It's better viewed with 'git diff --minimal' (or 'git show --minimal'),
which reports "2 files changed, 919 insertions(+), 11723 deletions(-)".
Signed-off-by: Eric Biggers <ebiggers@google.com>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
2018-05-21 08:50:29 +03:00
|
|
|
memcpy(q, input + temp, template[i].tap[k]);
|
2014-08-08 15:27:51 +04:00
|
|
|
|
|
|
|
if (offset_in_page(q) + template[i].tap[k] < PAGE_SIZE)
|
|
|
|
q[template[i].tap[k]] = 0;
|
|
|
|
|
|
|
|
sg_set_buf(&sg[k], q, template[i].tap[k]);
|
|
|
|
if (diff_dst) {
|
|
|
|
q = xoutbuf[IDX[k] >> PAGE_SHIFT] +
|
2008-07-31 13:08:25 +04:00
|
|
|
offset_in_page(IDX[k]);
|
|
|
|
|
2014-08-08 15:27:51 +04:00
|
|
|
sg_set_buf(&sgout[k], q, template[i].tap[k]);
|
2008-07-31 13:08:25 +04:00
|
|
|
|
2014-08-08 15:27:51 +04:00
|
|
|
memset(q, 0, template[i].tap[k]);
|
|
|
|
if (offset_in_page(q) +
|
|
|
|
template[i].tap[k] < PAGE_SIZE)
|
2008-07-31 13:08:25 +04:00
|
|
|
q[template[i].tap[k]] = 0;
|
2014-08-08 15:27:51 +04:00
|
|
|
}
|
2008-07-31 13:08:25 +04:00
|
|
|
|
2014-08-08 15:27:51 +04:00
|
|
|
temp += template[i].tap[k];
|
|
|
|
}
|
2012-09-21 11:26:47 +04:00
|
|
|
|
2015-08-20 10:21:46 +03:00
|
|
|
skcipher_request_set_crypt(req, sg, (diff_dst) ? sgout : sg,
|
crypto: testmgr - eliminate redundant decryption test vectors
Currently testmgr has separate encryption and decryption test vectors
for symmetric ciphers. That's massively redundant, since with few
exceptions (mostly mistakes, apparently), all decryption tests are
identical to the encryption tests, just with the input/result flipped.
Therefore, eliminate the redundancy by removing the decryption test
vectors and updating testmgr to test both encryption and decryption
using what used to be the encryption test vectors. Naming is adjusted
accordingly: each cipher_testvec now has a 'ptext' (plaintext), 'ctext'
(ciphertext), and 'len' instead of an 'input', 'result', 'ilen', and
'rlen'. Note that it was always the case that 'ilen == rlen'.
AES keywrap ("kw(aes)") is special because its IV is generated by the
encryption. Previously this was handled by specifying 'iv_out' for
encryption and 'iv' for decryption. To make it work cleanly with only
one set of test vectors, put the IV in 'iv', remove 'iv_out', and add a
boolean that indicates that the IV is generated by the encryption.
In total, this removes over 10000 lines from testmgr.h, with no
reduction in test coverage since prior patches already copied the few
unique decryption test vectors into the encryption test vectors.
This covers all algorithms that used 'struct cipher_testvec', e.g. any
block cipher in the ECB, CBC, CTR, XTS, LRW, CTS-CBC, PCBC, OFB, or
keywrap modes, and Salsa20 and ChaCha20. No change is made to AEAD
tests, though we probably can eliminate a similar redundancy there too.
The testmgr.h portion of this patch was automatically generated using
the following awk script, with some slight manual fixups on top (updated
'struct cipher_testvec' definition, updated a few comments, and fixed up
the AES keywrap test vectors):
BEGIN { OTHER = 0; ENCVEC = 1; DECVEC = 2; DECVEC_TAIL = 3; mode = OTHER }
/^static const struct cipher_testvec.*_enc_/ { sub("_enc", ""); mode = ENCVEC }
/^static const struct cipher_testvec.*_dec_/ { mode = DECVEC }
mode == ENCVEC && !/\.ilen[[:space:]]*=/ {
sub(/\.input[[:space:]]*=$/, ".ptext =")
sub(/\.input[[:space:]]*=/, ".ptext\t=")
sub(/\.result[[:space:]]*=$/, ".ctext =")
sub(/\.result[[:space:]]*=/, ".ctext\t=")
sub(/\.rlen[[:space:]]*=/, ".len\t=")
print
}
mode == DECVEC_TAIL && /[^[:space:]]/ { mode = OTHER }
mode == OTHER { print }
mode == ENCVEC && /^};/ { mode = OTHER }
mode == DECVEC && /^};/ { mode = DECVEC_TAIL }
Note that git's default diff algorithm gets confused by the testmgr.h
portion of this patch, and reports too many lines added and removed.
It's better viewed with 'git diff --minimal' (or 'git show --minimal'),
which reports "2 files changed, 919 insertions(+), 11723 deletions(-)".
Signed-off-by: Eric Biggers <ebiggers@google.com>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
2018-05-21 08:50:29 +03:00
|
|
|
template[i].len, iv);
|
2012-09-21 11:26:47 +04:00
|
|
|
|
2017-10-18 10:00:43 +03:00
|
|
|
ret = crypto_wait_req(enc ? crypto_skcipher_encrypt(req) :
|
|
|
|
crypto_skcipher_decrypt(req), &wait);
|
2008-07-31 13:08:25 +04:00
|
|
|
|
2017-10-18 10:00:43 +03:00
|
|
|
if (ret) {
|
2014-08-08 15:27:51 +04:00
|
|
|
pr_err("alg: skcipher%s: %s failed on chunk test %d for %s: ret=%d\n",
|
|
|
|
d, e, j, algo, -ret);
|
|
|
|
goto out;
|
|
|
|
}
|
2008-07-31 13:08:25 +04:00
|
|
|
|
2014-08-08 15:27:51 +04:00
|
|
|
temp = 0;
|
|
|
|
ret = -EINVAL;
|
|
|
|
for (k = 0; k < template[i].np; k++) {
|
|
|
|
if (diff_dst)
|
|
|
|
q = xoutbuf[IDX[k] >> PAGE_SHIFT] +
|
|
|
|
offset_in_page(IDX[k]);
|
|
|
|
else
|
|
|
|
q = xbuf[IDX[k] >> PAGE_SHIFT] +
|
|
|
|
offset_in_page(IDX[k]);
|
2008-07-31 13:08:25 +04:00
|
|
|
|
crypto: testmgr - eliminate redundant decryption test vectors
Currently testmgr has separate encryption and decryption test vectors
for symmetric ciphers. That's massively redundant, since with few
exceptions (mostly mistakes, apparently), all decryption tests are
identical to the encryption tests, just with the input/result flipped.
Therefore, eliminate the redundancy by removing the decryption test
vectors and updating testmgr to test both encryption and decryption
using what used to be the encryption test vectors. Naming is adjusted
accordingly: each cipher_testvec now has a 'ptext' (plaintext), 'ctext'
(ciphertext), and 'len' instead of an 'input', 'result', 'ilen', and
'rlen'. Note that it was always the case that 'ilen == rlen'.
AES keywrap ("kw(aes)") is special because its IV is generated by the
encryption. Previously this was handled by specifying 'iv_out' for
encryption and 'iv' for decryption. To make it work cleanly with only
one set of test vectors, put the IV in 'iv', remove 'iv_out', and add a
boolean that indicates that the IV is generated by the encryption.
In total, this removes over 10000 lines from testmgr.h, with no
reduction in test coverage since prior patches already copied the few
unique decryption test vectors into the encryption test vectors.
This covers all algorithms that used 'struct cipher_testvec', e.g. any
block cipher in the ECB, CBC, CTR, XTS, LRW, CTS-CBC, PCBC, OFB, or
keywrap modes, and Salsa20 and ChaCha20. No change is made to AEAD
tests, though we probably can eliminate a similar redundancy there too.
The testmgr.h portion of this patch was automatically generated using
the following awk script, with some slight manual fixups on top (updated
'struct cipher_testvec' definition, updated a few comments, and fixed up
the AES keywrap test vectors):
BEGIN { OTHER = 0; ENCVEC = 1; DECVEC = 2; DECVEC_TAIL = 3; mode = OTHER }
/^static const struct cipher_testvec.*_enc_/ { sub("_enc", ""); mode = ENCVEC }
/^static const struct cipher_testvec.*_dec_/ { mode = DECVEC }
mode == ENCVEC && !/\.ilen[[:space:]]*=/ {
sub(/\.input[[:space:]]*=$/, ".ptext =")
sub(/\.input[[:space:]]*=/, ".ptext\t=")
sub(/\.result[[:space:]]*=$/, ".ctext =")
sub(/\.result[[:space:]]*=/, ".ctext\t=")
sub(/\.rlen[[:space:]]*=/, ".len\t=")
print
}
mode == DECVEC_TAIL && /[^[:space:]]/ { mode = OTHER }
mode == OTHER { print }
mode == ENCVEC && /^};/ { mode = OTHER }
mode == DECVEC && /^};/ { mode = DECVEC_TAIL }
Note that git's default diff algorithm gets confused by the testmgr.h
portion of this patch, and reports too many lines added and removed.
It's better viewed with 'git diff --minimal' (or 'git show --minimal'),
which reports "2 files changed, 919 insertions(+), 11723 deletions(-)".
Signed-off-by: Eric Biggers <ebiggers@google.com>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
2018-05-21 08:50:29 +03:00
|
|
|
if (memcmp(q, result + temp, template[i].tap[k])) {
|
2014-08-08 15:27:51 +04:00
|
|
|
pr_err("alg: skcipher%s: Chunk test %d failed on %s at page %u for %s\n",
|
|
|
|
d, j, e, k, algo);
|
|
|
|
hexdump(q, template[i].tap[k]);
|
2008-07-31 13:08:25 +04:00
|
|
|
goto out;
|
|
|
|
}
|
|
|
|
|
2014-08-08 15:27:51 +04:00
|
|
|
q += template[i].tap[k];
|
|
|
|
for (n = 0; offset_in_page(q + n) && q[n]; n++)
|
|
|
|
;
|
|
|
|
if (n) {
|
|
|
|
pr_err("alg: skcipher%s: Result buffer corruption in chunk test %d on %s at page %u for %s: %u bytes:\n",
|
|
|
|
d, j, e, k, algo, n);
|
|
|
|
hexdump(q, n);
|
|
|
|
goto out;
|
2008-07-31 13:08:25 +04:00
|
|
|
}
|
2014-08-08 15:27:51 +04:00
|
|
|
temp += template[i].tap[k];
|
2008-07-31 13:08:25 +04:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
ret = 0;
|
|
|
|
|
|
|
|
out:
|
2015-08-20 10:21:46 +03:00
|
|
|
skcipher_request_free(req);
|
2012-09-21 11:26:47 +04:00
|
|
|
if (diff_dst)
|
|
|
|
testmgr_free_buf(xoutbuf);
|
|
|
|
out_nooutbuf:
|
2009-05-06 10:15:47 +04:00
|
|
|
testmgr_free_buf(xbuf);
|
|
|
|
out_nobuf:
|
2008-07-31 13:08:25 +04:00
|
|
|
return ret;
|
|
|
|
}
|
|
|
|
|
2015-08-20 10:21:46 +03:00
|
|
|
static int test_skcipher(struct crypto_skcipher *tfm, int enc,
|
2017-02-25 02:46:59 +03:00
|
|
|
const struct cipher_testvec *template,
|
|
|
|
unsigned int tcount)
|
2012-09-21 11:26:47 +04:00
|
|
|
{
|
2013-06-13 18:37:45 +04:00
|
|
|
unsigned int alignmask;
|
2012-09-21 11:26:47 +04:00
|
|
|
int ret;
|
|
|
|
|
|
|
|
/* test 'dst == src' case */
|
2013-06-13 18:37:45 +04:00
|
|
|
ret = __test_skcipher(tfm, enc, template, tcount, false, 0);
|
2012-09-21 11:26:47 +04:00
|
|
|
if (ret)
|
|
|
|
return ret;
|
|
|
|
|
|
|
|
/* test 'dst != src' case */
|
2013-06-13 18:37:45 +04:00
|
|
|
ret = __test_skcipher(tfm, enc, template, tcount, true, 0);
|
|
|
|
if (ret)
|
|
|
|
return ret;
|
|
|
|
|
|
|
|
/* test unaligned buffers, check with one byte offset */
|
|
|
|
ret = __test_skcipher(tfm, enc, template, tcount, true, 1);
|
|
|
|
if (ret)
|
|
|
|
return ret;
|
|
|
|
|
|
|
|
alignmask = crypto_tfm_alg_alignmask(&tfm->base);
|
|
|
|
if (alignmask) {
|
|
|
|
/* Check if alignment mask for tfm is correctly set. */
|
|
|
|
ret = __test_skcipher(tfm, enc, template, tcount, true,
|
|
|
|
alignmask + 1);
|
|
|
|
if (ret)
|
|
|
|
return ret;
|
|
|
|
}
|
|
|
|
|
|
|
|
return 0;
|
2012-09-21 11:26:47 +04:00
|
|
|
}
|
|
|
|
|
2017-02-25 02:46:59 +03:00
|
|
|
static int test_comp(struct crypto_comp *tfm,
|
|
|
|
const struct comp_testvec *ctemplate,
|
|
|
|
const struct comp_testvec *dtemplate,
|
|
|
|
int ctcount, int dtcount)
|
2008-07-31 13:08:25 +04:00
|
|
|
{
|
|
|
|
const char *algo = crypto_tfm_alg_driver_name(crypto_comp_tfm(tfm));
|
2018-04-11 21:28:32 +03:00
|
|
|
char *output, *decomp_output;
|
2008-07-31 13:08:25 +04:00
|
|
|
unsigned int i;
|
|
|
|
int ret;
|
|
|
|
|
2018-04-11 21:28:32 +03:00
|
|
|
output = kmalloc(COMP_BUF_SIZE, GFP_KERNEL);
|
|
|
|
if (!output)
|
|
|
|
return -ENOMEM;
|
|
|
|
|
|
|
|
decomp_output = kmalloc(COMP_BUF_SIZE, GFP_KERNEL);
|
|
|
|
if (!decomp_output) {
|
|
|
|
kfree(output);
|
|
|
|
return -ENOMEM;
|
|
|
|
}
|
|
|
|
|
2008-07-31 13:08:25 +04:00
|
|
|
for (i = 0; i < ctcount; i++) {
|
2009-03-29 11:44:19 +04:00
|
|
|
int ilen;
|
|
|
|
unsigned int dlen = COMP_BUF_SIZE;
|
2008-07-31 13:08:25 +04:00
|
|
|
|
2018-10-07 14:58:10 +03:00
|
|
|
memset(output, 0, COMP_BUF_SIZE);
|
|
|
|
memset(decomp_output, 0, COMP_BUF_SIZE);
|
2008-07-31 13:08:25 +04:00
|
|
|
|
|
|
|
ilen = ctemplate[i].inlen;
|
|
|
|
ret = crypto_comp_compress(tfm, ctemplate[i].input,
|
2018-04-11 21:28:32 +03:00
|
|
|
ilen, output, &dlen);
|
2008-07-31 13:08:25 +04:00
|
|
|
if (ret) {
|
|
|
|
printk(KERN_ERR "alg: comp: compression failed "
|
|
|
|
"on test %d for %s: ret=%d\n", i + 1, algo,
|
|
|
|
-ret);
|
|
|
|
goto out;
|
|
|
|
}
|
|
|
|
|
2018-04-11 21:28:32 +03:00
|
|
|
ilen = dlen;
|
|
|
|
dlen = COMP_BUF_SIZE;
|
|
|
|
ret = crypto_comp_decompress(tfm, output,
|
|
|
|
ilen, decomp_output, &dlen);
|
|
|
|
if (ret) {
|
|
|
|
pr_err("alg: comp: compression failed: decompress: on test %d for %s failed: ret=%d\n",
|
|
|
|
i + 1, algo, -ret);
|
|
|
|
goto out;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (dlen != ctemplate[i].inlen) {
|
2008-11-28 15:51:28 +03:00
|
|
|
printk(KERN_ERR "alg: comp: Compression test %d "
|
|
|
|
"failed for %s: output len = %d\n", i + 1, algo,
|
|
|
|
dlen);
|
|
|
|
ret = -EINVAL;
|
|
|
|
goto out;
|
|
|
|
}
|
|
|
|
|
2018-04-11 21:28:32 +03:00
|
|
|
if (memcmp(decomp_output, ctemplate[i].input,
|
|
|
|
ctemplate[i].inlen)) {
|
|
|
|
pr_err("alg: comp: compression failed: output differs: on test %d for %s\n",
|
|
|
|
i + 1, algo);
|
|
|
|
hexdump(decomp_output, dlen);
|
2008-07-31 13:08:25 +04:00
|
|
|
ret = -EINVAL;
|
|
|
|
goto out;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
for (i = 0; i < dtcount; i++) {
|
2009-03-29 11:44:19 +04:00
|
|
|
int ilen;
|
|
|
|
unsigned int dlen = COMP_BUF_SIZE;
|
2008-07-31 13:08:25 +04:00
|
|
|
|
2018-10-07 14:58:10 +03:00
|
|
|
memset(decomp_output, 0, COMP_BUF_SIZE);
|
2008-07-31 13:08:25 +04:00
|
|
|
|
|
|
|
ilen = dtemplate[i].inlen;
|
|
|
|
ret = crypto_comp_decompress(tfm, dtemplate[i].input,
|
2018-04-11 21:28:32 +03:00
|
|
|
ilen, decomp_output, &dlen);
|
2008-07-31 13:08:25 +04:00
|
|
|
if (ret) {
|
|
|
|
printk(KERN_ERR "alg: comp: decompression failed "
|
|
|
|
"on test %d for %s: ret=%d\n", i + 1, algo,
|
|
|
|
-ret);
|
|
|
|
goto out;
|
|
|
|
}
|
|
|
|
|
2008-11-28 15:51:28 +03:00
|
|
|
if (dlen != dtemplate[i].outlen) {
|
|
|
|
printk(KERN_ERR "alg: comp: Decompression test %d "
|
|
|
|
"failed for %s: output len = %d\n", i + 1, algo,
|
|
|
|
dlen);
|
|
|
|
ret = -EINVAL;
|
|
|
|
goto out;
|
|
|
|
}
|
|
|
|
|
2018-04-11 21:28:32 +03:00
|
|
|
if (memcmp(decomp_output, dtemplate[i].output, dlen)) {
|
2008-07-31 13:08:25 +04:00
|
|
|
printk(KERN_ERR "alg: comp: Decompression test %d "
|
|
|
|
"failed for %s\n", i + 1, algo);
|
2018-04-11 21:28:32 +03:00
|
|
|
hexdump(decomp_output, dlen);
|
2008-07-31 13:08:25 +04:00
|
|
|
ret = -EINVAL;
|
|
|
|
goto out;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
ret = 0;
|
|
|
|
|
|
|
|
out:
|
2018-04-11 21:28:32 +03:00
|
|
|
kfree(decomp_output);
|
|
|
|
kfree(output);
|
2008-07-31 13:08:25 +04:00
|
|
|
return ret;
|
|
|
|
}
|
|
|
|
|
2017-02-25 02:46:59 +03:00
|
|
|
static int test_acomp(struct crypto_acomp *tfm,
|
2018-04-11 21:28:32 +03:00
|
|
|
const struct comp_testvec *ctemplate,
|
2017-02-25 02:46:59 +03:00
|
|
|
const struct comp_testvec *dtemplate,
|
|
|
|
int ctcount, int dtcount)
|
2016-10-21 15:19:54 +03:00
|
|
|
{
|
|
|
|
const char *algo = crypto_tfm_alg_driver_name(crypto_acomp_tfm(tfm));
|
|
|
|
unsigned int i;
|
2017-04-19 16:27:18 +03:00
|
|
|
char *output, *decomp_out;
|
2016-10-21 15:19:54 +03:00
|
|
|
int ret;
|
|
|
|
struct scatterlist src, dst;
|
|
|
|
struct acomp_req *req;
|
2017-10-18 10:00:43 +03:00
|
|
|
struct crypto_wait wait;
|
2016-10-21 15:19:54 +03:00
|
|
|
|
2016-11-23 21:24:35 +03:00
|
|
|
output = kmalloc(COMP_BUF_SIZE, GFP_KERNEL);
|
|
|
|
if (!output)
|
|
|
|
return -ENOMEM;
|
|
|
|
|
2017-04-19 16:27:18 +03:00
|
|
|
decomp_out = kmalloc(COMP_BUF_SIZE, GFP_KERNEL);
|
|
|
|
if (!decomp_out) {
|
|
|
|
kfree(output);
|
|
|
|
return -ENOMEM;
|
|
|
|
}
|
|
|
|
|
2016-10-21 15:19:54 +03:00
|
|
|
for (i = 0; i < ctcount; i++) {
|
|
|
|
unsigned int dlen = COMP_BUF_SIZE;
|
|
|
|
int ilen = ctemplate[i].inlen;
|
2016-12-21 23:32:54 +03:00
|
|
|
void *input_vec;
|
2016-10-21 15:19:54 +03:00
|
|
|
|
2016-12-30 23:12:00 +03:00
|
|
|
input_vec = kmemdup(ctemplate[i].input, ilen, GFP_KERNEL);
|
2016-12-21 23:32:54 +03:00
|
|
|
if (!input_vec) {
|
|
|
|
ret = -ENOMEM;
|
|
|
|
goto out;
|
|
|
|
}
|
|
|
|
|
2016-11-23 21:24:35 +03:00
|
|
|
memset(output, 0, dlen);
|
2017-10-18 10:00:43 +03:00
|
|
|
crypto_init_wait(&wait);
|
2016-12-21 23:32:54 +03:00
|
|
|
sg_init_one(&src, input_vec, ilen);
|
2016-10-21 15:19:54 +03:00
|
|
|
sg_init_one(&dst, output, dlen);
|
|
|
|
|
|
|
|
req = acomp_request_alloc(tfm);
|
|
|
|
if (!req) {
|
|
|
|
pr_err("alg: acomp: request alloc failed for %s\n",
|
|
|
|
algo);
|
2016-12-21 23:32:54 +03:00
|
|
|
kfree(input_vec);
|
2016-10-21 15:19:54 +03:00
|
|
|
ret = -ENOMEM;
|
|
|
|
goto out;
|
|
|
|
}
|
|
|
|
|
|
|
|
acomp_request_set_params(req, &src, &dst, ilen, dlen);
|
|
|
|
acomp_request_set_callback(req, CRYPTO_TFM_REQ_MAY_BACKLOG,
|
2017-10-18 10:00:43 +03:00
|
|
|
crypto_req_done, &wait);
|
2016-10-21 15:19:54 +03:00
|
|
|
|
2017-10-18 10:00:43 +03:00
|
|
|
ret = crypto_wait_req(crypto_acomp_compress(req), &wait);
|
2016-10-21 15:19:54 +03:00
|
|
|
if (ret) {
|
|
|
|
pr_err("alg: acomp: compression failed on test %d for %s: ret=%d\n",
|
|
|
|
i + 1, algo, -ret);
|
2016-12-21 23:32:54 +03:00
|
|
|
kfree(input_vec);
|
2016-10-21 15:19:54 +03:00
|
|
|
acomp_request_free(req);
|
|
|
|
goto out;
|
|
|
|
}
|
|
|
|
|
2017-04-19 16:27:18 +03:00
|
|
|
ilen = req->dlen;
|
|
|
|
dlen = COMP_BUF_SIZE;
|
|
|
|
sg_init_one(&src, output, ilen);
|
|
|
|
sg_init_one(&dst, decomp_out, dlen);
|
2017-10-18 10:00:43 +03:00
|
|
|
crypto_init_wait(&wait);
|
2017-04-19 16:27:18 +03:00
|
|
|
acomp_request_set_params(req, &src, &dst, ilen, dlen);
|
|
|
|
|
2017-10-18 10:00:43 +03:00
|
|
|
ret = crypto_wait_req(crypto_acomp_decompress(req), &wait);
|
2017-04-19 16:27:18 +03:00
|
|
|
if (ret) {
|
|
|
|
pr_err("alg: acomp: compression failed on test %d for %s: ret=%d\n",
|
|
|
|
i + 1, algo, -ret);
|
|
|
|
kfree(input_vec);
|
|
|
|
acomp_request_free(req);
|
|
|
|
goto out;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (req->dlen != ctemplate[i].inlen) {
|
2016-10-21 15:19:54 +03:00
|
|
|
pr_err("alg: acomp: Compression test %d failed for %s: output len = %d\n",
|
|
|
|
i + 1, algo, req->dlen);
|
|
|
|
ret = -EINVAL;
|
2016-12-21 23:32:54 +03:00
|
|
|
kfree(input_vec);
|
2016-10-21 15:19:54 +03:00
|
|
|
acomp_request_free(req);
|
|
|
|
goto out;
|
|
|
|
}
|
|
|
|
|
2017-04-19 16:27:18 +03:00
|
|
|
if (memcmp(input_vec, decomp_out, req->dlen)) {
|
2016-10-21 15:19:54 +03:00
|
|
|
pr_err("alg: acomp: Compression test %d failed for %s\n",
|
|
|
|
i + 1, algo);
|
|
|
|
hexdump(output, req->dlen);
|
|
|
|
ret = -EINVAL;
|
2016-12-21 23:32:54 +03:00
|
|
|
kfree(input_vec);
|
2016-10-21 15:19:54 +03:00
|
|
|
acomp_request_free(req);
|
|
|
|
goto out;
|
|
|
|
}
|
|
|
|
|
2016-12-21 23:32:54 +03:00
|
|
|
kfree(input_vec);
|
2016-10-21 15:19:54 +03:00
|
|
|
acomp_request_free(req);
|
|
|
|
}
|
|
|
|
|
|
|
|
for (i = 0; i < dtcount; i++) {
|
|
|
|
unsigned int dlen = COMP_BUF_SIZE;
|
|
|
|
int ilen = dtemplate[i].inlen;
|
2016-12-21 23:32:54 +03:00
|
|
|
void *input_vec;
|
|
|
|
|
2016-12-30 23:12:00 +03:00
|
|
|
input_vec = kmemdup(dtemplate[i].input, ilen, GFP_KERNEL);
|
2016-12-21 23:32:54 +03:00
|
|
|
if (!input_vec) {
|
|
|
|
ret = -ENOMEM;
|
|
|
|
goto out;
|
|
|
|
}
|
2016-10-21 15:19:54 +03:00
|
|
|
|
2016-11-23 21:24:35 +03:00
|
|
|
memset(output, 0, dlen);
|
2017-10-18 10:00:43 +03:00
|
|
|
crypto_init_wait(&wait);
|
2016-12-21 23:32:54 +03:00
|
|
|
sg_init_one(&src, input_vec, ilen);
|
2016-10-21 15:19:54 +03:00
|
|
|
sg_init_one(&dst, output, dlen);
|
|
|
|
|
|
|
|
req = acomp_request_alloc(tfm);
|
|
|
|
if (!req) {
|
|
|
|
pr_err("alg: acomp: request alloc failed for %s\n",
|
|
|
|
algo);
|
2016-12-21 23:32:54 +03:00
|
|
|
kfree(input_vec);
|
2016-10-21 15:19:54 +03:00
|
|
|
ret = -ENOMEM;
|
|
|
|
goto out;
|
|
|
|
}
|
|
|
|
|
|
|
|
acomp_request_set_params(req, &src, &dst, ilen, dlen);
|
|
|
|
acomp_request_set_callback(req, CRYPTO_TFM_REQ_MAY_BACKLOG,
|
2017-10-18 10:00:43 +03:00
|
|
|
crypto_req_done, &wait);
|
2016-10-21 15:19:54 +03:00
|
|
|
|
2017-10-18 10:00:43 +03:00
|
|
|
ret = crypto_wait_req(crypto_acomp_decompress(req), &wait);
|
2016-10-21 15:19:54 +03:00
|
|
|
if (ret) {
|
|
|
|
pr_err("alg: acomp: decompression failed on test %d for %s: ret=%d\n",
|
|
|
|
i + 1, algo, -ret);
|
2016-12-21 23:32:54 +03:00
|
|
|
kfree(input_vec);
|
2016-10-21 15:19:54 +03:00
|
|
|
acomp_request_free(req);
|
|
|
|
goto out;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (req->dlen != dtemplate[i].outlen) {
|
|
|
|
pr_err("alg: acomp: Decompression test %d failed for %s: output len = %d\n",
|
|
|
|
i + 1, algo, req->dlen);
|
|
|
|
ret = -EINVAL;
|
2016-12-21 23:32:54 +03:00
|
|
|
kfree(input_vec);
|
2016-10-21 15:19:54 +03:00
|
|
|
acomp_request_free(req);
|
|
|
|
goto out;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (memcmp(output, dtemplate[i].output, req->dlen)) {
|
|
|
|
pr_err("alg: acomp: Decompression test %d failed for %s\n",
|
|
|
|
i + 1, algo);
|
|
|
|
hexdump(output, req->dlen);
|
|
|
|
ret = -EINVAL;
|
2016-12-21 23:32:54 +03:00
|
|
|
kfree(input_vec);
|
2016-10-21 15:19:54 +03:00
|
|
|
acomp_request_free(req);
|
|
|
|
goto out;
|
|
|
|
}
|
|
|
|
|
2016-12-21 23:32:54 +03:00
|
|
|
kfree(input_vec);
|
2016-10-21 15:19:54 +03:00
|
|
|
acomp_request_free(req);
|
|
|
|
}
|
|
|
|
|
|
|
|
ret = 0;
|
|
|
|
|
|
|
|
out:
|
2017-04-19 16:27:18 +03:00
|
|
|
kfree(decomp_out);
|
2016-11-23 21:24:35 +03:00
|
|
|
kfree(output);
|
2016-10-21 15:19:54 +03:00
|
|
|
return ret;
|
|
|
|
}
|
|
|
|
|
2017-02-25 02:46:59 +03:00
|
|
|
static int test_cprng(struct crypto_rng *tfm,
|
|
|
|
const struct cprng_testvec *template,
|
2009-05-04 15:44:50 +04:00
|
|
|
unsigned int tcount)
|
|
|
|
{
|
|
|
|
const char *algo = crypto_tfm_alg_driver_name(crypto_rng_tfm(tfm));
|
2009-10-27 14:04:42 +03:00
|
|
|
int err = 0, i, j, seedsize;
|
2009-05-04 15:44:50 +04:00
|
|
|
u8 *seed;
|
|
|
|
char result[32];
|
|
|
|
|
|
|
|
seedsize = crypto_rng_seedsize(tfm);
|
|
|
|
|
|
|
|
seed = kmalloc(seedsize, GFP_KERNEL);
|
|
|
|
if (!seed) {
|
|
|
|
printk(KERN_ERR "alg: cprng: Failed to allocate seed space "
|
|
|
|
"for %s\n", algo);
|
|
|
|
return -ENOMEM;
|
|
|
|
}
|
|
|
|
|
|
|
|
for (i = 0; i < tcount; i++) {
|
|
|
|
memset(result, 0, 32);
|
|
|
|
|
|
|
|
memcpy(seed, template[i].v, template[i].vlen);
|
|
|
|
memcpy(seed + template[i].vlen, template[i].key,
|
|
|
|
template[i].klen);
|
|
|
|
memcpy(seed + template[i].vlen + template[i].klen,
|
|
|
|
template[i].dt, template[i].dtlen);
|
|
|
|
|
|
|
|
err = crypto_rng_reset(tfm, seed, seedsize);
|
|
|
|
if (err) {
|
|
|
|
printk(KERN_ERR "alg: cprng: Failed to reset rng "
|
|
|
|
"for %s\n", algo);
|
|
|
|
goto out;
|
|
|
|
}
|
|
|
|
|
|
|
|
for (j = 0; j < template[i].loops; j++) {
|
|
|
|
err = crypto_rng_get_bytes(tfm, result,
|
|
|
|
template[i].rlen);
|
2015-03-10 19:00:36 +03:00
|
|
|
if (err < 0) {
|
2009-05-04 15:44:50 +04:00
|
|
|
printk(KERN_ERR "alg: cprng: Failed to obtain "
|
|
|
|
"the correct amount of random data for "
|
2015-03-10 19:00:36 +03:00
|
|
|
"%s (requested %d)\n", algo,
|
|
|
|
template[i].rlen);
|
2009-05-04 15:44:50 +04:00
|
|
|
goto out;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
err = memcmp(result, template[i].result,
|
|
|
|
template[i].rlen);
|
|
|
|
if (err) {
|
|
|
|
printk(KERN_ERR "alg: cprng: Test %d failed for %s\n",
|
|
|
|
i, algo);
|
|
|
|
hexdump(result, template[i].rlen);
|
|
|
|
err = -EINVAL;
|
|
|
|
goto out;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
out:
|
|
|
|
kfree(seed);
|
|
|
|
return err;
|
|
|
|
}
|
|
|
|
|
2008-07-31 13:08:25 +04:00
|
|
|
static int alg_test_aead(const struct alg_test_desc *desc, const char *driver,
|
|
|
|
u32 type, u32 mask)
|
|
|
|
{
|
|
|
|
struct crypto_aead *tfm;
|
|
|
|
int err = 0;
|
|
|
|
|
2016-11-22 15:08:31 +03:00
|
|
|
tfm = crypto_alloc_aead(driver, type, mask);
|
2008-07-31 13:08:25 +04:00
|
|
|
if (IS_ERR(tfm)) {
|
|
|
|
printk(KERN_ERR "alg: aead: Failed to load transform for %s: "
|
|
|
|
"%ld\n", driver, PTR_ERR(tfm));
|
|
|
|
return PTR_ERR(tfm);
|
|
|
|
}
|
|
|
|
|
|
|
|
if (desc->suite.aead.enc.vecs) {
|
|
|
|
err = test_aead(tfm, ENCRYPT, desc->suite.aead.enc.vecs,
|
|
|
|
desc->suite.aead.enc.count);
|
|
|
|
if (err)
|
|
|
|
goto out;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (!err && desc->suite.aead.dec.vecs)
|
|
|
|
err = test_aead(tfm, DECRYPT, desc->suite.aead.dec.vecs,
|
|
|
|
desc->suite.aead.dec.count);
|
|
|
|
|
|
|
|
out:
|
|
|
|
crypto_free_aead(tfm);
|
|
|
|
return err;
|
|
|
|
}
|
|
|
|
|
|
|
|
static int alg_test_cipher(const struct alg_test_desc *desc,
|
|
|
|
const char *driver, u32 type, u32 mask)
|
|
|
|
{
|
crypto: testmgr - eliminate redundant decryption test vectors
Currently testmgr has separate encryption and decryption test vectors
for symmetric ciphers. That's massively redundant, since with few
exceptions (mostly mistakes, apparently), all decryption tests are
identical to the encryption tests, just with the input/result flipped.
Therefore, eliminate the redundancy by removing the decryption test
vectors and updating testmgr to test both encryption and decryption
using what used to be the encryption test vectors. Naming is adjusted
accordingly: each cipher_testvec now has a 'ptext' (plaintext), 'ctext'
(ciphertext), and 'len' instead of an 'input', 'result', 'ilen', and
'rlen'. Note that it was always the case that 'ilen == rlen'.
AES keywrap ("kw(aes)") is special because its IV is generated by the
encryption. Previously this was handled by specifying 'iv_out' for
encryption and 'iv' for decryption. To make it work cleanly with only
one set of test vectors, put the IV in 'iv', remove 'iv_out', and add a
boolean that indicates that the IV is generated by the encryption.
In total, this removes over 10000 lines from testmgr.h, with no
reduction in test coverage since prior patches already copied the few
unique decryption test vectors into the encryption test vectors.
This covers all algorithms that used 'struct cipher_testvec', e.g. any
block cipher in the ECB, CBC, CTR, XTS, LRW, CTS-CBC, PCBC, OFB, or
keywrap modes, and Salsa20 and ChaCha20. No change is made to AEAD
tests, though we probably can eliminate a similar redundancy there too.
The testmgr.h portion of this patch was automatically generated using
the following awk script, with some slight manual fixups on top (updated
'struct cipher_testvec' definition, updated a few comments, and fixed up
the AES keywrap test vectors):
BEGIN { OTHER = 0; ENCVEC = 1; DECVEC = 2; DECVEC_TAIL = 3; mode = OTHER }
/^static const struct cipher_testvec.*_enc_/ { sub("_enc", ""); mode = ENCVEC }
/^static const struct cipher_testvec.*_dec_/ { mode = DECVEC }
mode == ENCVEC && !/\.ilen[[:space:]]*=/ {
sub(/\.input[[:space:]]*=$/, ".ptext =")
sub(/\.input[[:space:]]*=/, ".ptext\t=")
sub(/\.result[[:space:]]*=$/, ".ctext =")
sub(/\.result[[:space:]]*=/, ".ctext\t=")
sub(/\.rlen[[:space:]]*=/, ".len\t=")
print
}
mode == DECVEC_TAIL && /[^[:space:]]/ { mode = OTHER }
mode == OTHER { print }
mode == ENCVEC && /^};/ { mode = OTHER }
mode == DECVEC && /^};/ { mode = DECVEC_TAIL }
Note that git's default diff algorithm gets confused by the testmgr.h
portion of this patch, and reports too many lines added and removed.
It's better viewed with 'git diff --minimal' (or 'git show --minimal'),
which reports "2 files changed, 919 insertions(+), 11723 deletions(-)".
Signed-off-by: Eric Biggers <ebiggers@google.com>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
2018-05-21 08:50:29 +03:00
|
|
|
const struct cipher_test_suite *suite = &desc->suite.cipher;
|
2008-08-17 11:01:56 +04:00
|
|
|
struct crypto_cipher *tfm;
|
crypto: testmgr - eliminate redundant decryption test vectors
Currently testmgr has separate encryption and decryption test vectors
for symmetric ciphers. That's massively redundant, since with few
exceptions (mostly mistakes, apparently), all decryption tests are
identical to the encryption tests, just with the input/result flipped.
Therefore, eliminate the redundancy by removing the decryption test
vectors and updating testmgr to test both encryption and decryption
using what used to be the encryption test vectors. Naming is adjusted
accordingly: each cipher_testvec now has a 'ptext' (plaintext), 'ctext'
(ciphertext), and 'len' instead of an 'input', 'result', 'ilen', and
'rlen'. Note that it was always the case that 'ilen == rlen'.
AES keywrap ("kw(aes)") is special because its IV is generated by the
encryption. Previously this was handled by specifying 'iv_out' for
encryption and 'iv' for decryption. To make it work cleanly with only
one set of test vectors, put the IV in 'iv', remove 'iv_out', and add a
boolean that indicates that the IV is generated by the encryption.
In total, this removes over 10000 lines from testmgr.h, with no
reduction in test coverage since prior patches already copied the few
unique decryption test vectors into the encryption test vectors.
This covers all algorithms that used 'struct cipher_testvec', e.g. any
block cipher in the ECB, CBC, CTR, XTS, LRW, CTS-CBC, PCBC, OFB, or
keywrap modes, and Salsa20 and ChaCha20. No change is made to AEAD
tests, though we probably can eliminate a similar redundancy there too.
The testmgr.h portion of this patch was automatically generated using
the following awk script, with some slight manual fixups on top (updated
'struct cipher_testvec' definition, updated a few comments, and fixed up
the AES keywrap test vectors):
BEGIN { OTHER = 0; ENCVEC = 1; DECVEC = 2; DECVEC_TAIL = 3; mode = OTHER }
/^static const struct cipher_testvec.*_enc_/ { sub("_enc", ""); mode = ENCVEC }
/^static const struct cipher_testvec.*_dec_/ { mode = DECVEC }
mode == ENCVEC && !/\.ilen[[:space:]]*=/ {
sub(/\.input[[:space:]]*=$/, ".ptext =")
sub(/\.input[[:space:]]*=/, ".ptext\t=")
sub(/\.result[[:space:]]*=$/, ".ctext =")
sub(/\.result[[:space:]]*=/, ".ctext\t=")
sub(/\.rlen[[:space:]]*=/, ".len\t=")
print
}
mode == DECVEC_TAIL && /[^[:space:]]/ { mode = OTHER }
mode == OTHER { print }
mode == ENCVEC && /^};/ { mode = OTHER }
mode == DECVEC && /^};/ { mode = DECVEC_TAIL }
Note that git's default diff algorithm gets confused by the testmgr.h
portion of this patch, and reports too many lines added and removed.
It's better viewed with 'git diff --minimal' (or 'git show --minimal'),
which reports "2 files changed, 919 insertions(+), 11723 deletions(-)".
Signed-off-by: Eric Biggers <ebiggers@google.com>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
2018-05-21 08:50:29 +03:00
|
|
|
int err;
|
2008-07-31 13:08:25 +04:00
|
|
|
|
2016-11-22 15:08:31 +03:00
|
|
|
tfm = crypto_alloc_cipher(driver, type, mask);
|
2008-07-31 13:08:25 +04:00
|
|
|
if (IS_ERR(tfm)) {
|
|
|
|
printk(KERN_ERR "alg: cipher: Failed to load transform for "
|
|
|
|
"%s: %ld\n", driver, PTR_ERR(tfm));
|
|
|
|
return PTR_ERR(tfm);
|
|
|
|
}
|
|
|
|
|
crypto: testmgr - eliminate redundant decryption test vectors
Currently testmgr has separate encryption and decryption test vectors
for symmetric ciphers. That's massively redundant, since with few
exceptions (mostly mistakes, apparently), all decryption tests are
identical to the encryption tests, just with the input/result flipped.
Therefore, eliminate the redundancy by removing the decryption test
vectors and updating testmgr to test both encryption and decryption
using what used to be the encryption test vectors. Naming is adjusted
accordingly: each cipher_testvec now has a 'ptext' (plaintext), 'ctext'
(ciphertext), and 'len' instead of an 'input', 'result', 'ilen', and
'rlen'. Note that it was always the case that 'ilen == rlen'.
AES keywrap ("kw(aes)") is special because its IV is generated by the
encryption. Previously this was handled by specifying 'iv_out' for
encryption and 'iv' for decryption. To make it work cleanly with only
one set of test vectors, put the IV in 'iv', remove 'iv_out', and add a
boolean that indicates that the IV is generated by the encryption.
In total, this removes over 10000 lines from testmgr.h, with no
reduction in test coverage since prior patches already copied the few
unique decryption test vectors into the encryption test vectors.
This covers all algorithms that used 'struct cipher_testvec', e.g. any
block cipher in the ECB, CBC, CTR, XTS, LRW, CTS-CBC, PCBC, OFB, or
keywrap modes, and Salsa20 and ChaCha20. No change is made to AEAD
tests, though we probably can eliminate a similar redundancy there too.
The testmgr.h portion of this patch was automatically generated using
the following awk script, with some slight manual fixups on top (updated
'struct cipher_testvec' definition, updated a few comments, and fixed up
the AES keywrap test vectors):
BEGIN { OTHER = 0; ENCVEC = 1; DECVEC = 2; DECVEC_TAIL = 3; mode = OTHER }
/^static const struct cipher_testvec.*_enc_/ { sub("_enc", ""); mode = ENCVEC }
/^static const struct cipher_testvec.*_dec_/ { mode = DECVEC }
mode == ENCVEC && !/\.ilen[[:space:]]*=/ {
sub(/\.input[[:space:]]*=$/, ".ptext =")
sub(/\.input[[:space:]]*=/, ".ptext\t=")
sub(/\.result[[:space:]]*=$/, ".ctext =")
sub(/\.result[[:space:]]*=/, ".ctext\t=")
sub(/\.rlen[[:space:]]*=/, ".len\t=")
print
}
mode == DECVEC_TAIL && /[^[:space:]]/ { mode = OTHER }
mode == OTHER { print }
mode == ENCVEC && /^};/ { mode = OTHER }
mode == DECVEC && /^};/ { mode = DECVEC_TAIL }
Note that git's default diff algorithm gets confused by the testmgr.h
portion of this patch, and reports too many lines added and removed.
It's better viewed with 'git diff --minimal' (or 'git show --minimal'),
which reports "2 files changed, 919 insertions(+), 11723 deletions(-)".
Signed-off-by: Eric Biggers <ebiggers@google.com>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
2018-05-21 08:50:29 +03:00
|
|
|
err = test_cipher(tfm, ENCRYPT, suite->vecs, suite->count);
|
|
|
|
if (!err)
|
|
|
|
err = test_cipher(tfm, DECRYPT, suite->vecs, suite->count);
|
2008-07-31 13:08:25 +04:00
|
|
|
|
2008-08-17 11:01:56 +04:00
|
|
|
crypto_free_cipher(tfm);
|
|
|
|
return err;
|
|
|
|
}
|
|
|
|
|
|
|
|
static int alg_test_skcipher(const struct alg_test_desc *desc,
|
|
|
|
const char *driver, u32 type, u32 mask)
|
|
|
|
{
|
crypto: testmgr - eliminate redundant decryption test vectors
Currently testmgr has separate encryption and decryption test vectors
for symmetric ciphers. That's massively redundant, since with few
exceptions (mostly mistakes, apparently), all decryption tests are
identical to the encryption tests, just with the input/result flipped.
Therefore, eliminate the redundancy by removing the decryption test
vectors and updating testmgr to test both encryption and decryption
using what used to be the encryption test vectors. Naming is adjusted
accordingly: each cipher_testvec now has a 'ptext' (plaintext), 'ctext'
(ciphertext), and 'len' instead of an 'input', 'result', 'ilen', and
'rlen'. Note that it was always the case that 'ilen == rlen'.
AES keywrap ("kw(aes)") is special because its IV is generated by the
encryption. Previously this was handled by specifying 'iv_out' for
encryption and 'iv' for decryption. To make it work cleanly with only
one set of test vectors, put the IV in 'iv', remove 'iv_out', and add a
boolean that indicates that the IV is generated by the encryption.
In total, this removes over 10000 lines from testmgr.h, with no
reduction in test coverage since prior patches already copied the few
unique decryption test vectors into the encryption test vectors.
This covers all algorithms that used 'struct cipher_testvec', e.g. any
block cipher in the ECB, CBC, CTR, XTS, LRW, CTS-CBC, PCBC, OFB, or
keywrap modes, and Salsa20 and ChaCha20. No change is made to AEAD
tests, though we probably can eliminate a similar redundancy there too.
The testmgr.h portion of this patch was automatically generated using
the following awk script, with some slight manual fixups on top (updated
'struct cipher_testvec' definition, updated a few comments, and fixed up
the AES keywrap test vectors):
BEGIN { OTHER = 0; ENCVEC = 1; DECVEC = 2; DECVEC_TAIL = 3; mode = OTHER }
/^static const struct cipher_testvec.*_enc_/ { sub("_enc", ""); mode = ENCVEC }
/^static const struct cipher_testvec.*_dec_/ { mode = DECVEC }
mode == ENCVEC && !/\.ilen[[:space:]]*=/ {
sub(/\.input[[:space:]]*=$/, ".ptext =")
sub(/\.input[[:space:]]*=/, ".ptext\t=")
sub(/\.result[[:space:]]*=$/, ".ctext =")
sub(/\.result[[:space:]]*=/, ".ctext\t=")
sub(/\.rlen[[:space:]]*=/, ".len\t=")
print
}
mode == DECVEC_TAIL && /[^[:space:]]/ { mode = OTHER }
mode == OTHER { print }
mode == ENCVEC && /^};/ { mode = OTHER }
mode == DECVEC && /^};/ { mode = DECVEC_TAIL }
Note that git's default diff algorithm gets confused by the testmgr.h
portion of this patch, and reports too many lines added and removed.
It's better viewed with 'git diff --minimal' (or 'git show --minimal'),
which reports "2 files changed, 919 insertions(+), 11723 deletions(-)".
Signed-off-by: Eric Biggers <ebiggers@google.com>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
2018-05-21 08:50:29 +03:00
|
|
|
const struct cipher_test_suite *suite = &desc->suite.cipher;
|
2015-08-20 10:21:46 +03:00
|
|
|
struct crypto_skcipher *tfm;
|
crypto: testmgr - eliminate redundant decryption test vectors
Currently testmgr has separate encryption and decryption test vectors
for symmetric ciphers. That's massively redundant, since with few
exceptions (mostly mistakes, apparently), all decryption tests are
identical to the encryption tests, just with the input/result flipped.
Therefore, eliminate the redundancy by removing the decryption test
vectors and updating testmgr to test both encryption and decryption
using what used to be the encryption test vectors. Naming is adjusted
accordingly: each cipher_testvec now has a 'ptext' (plaintext), 'ctext'
(ciphertext), and 'len' instead of an 'input', 'result', 'ilen', and
'rlen'. Note that it was always the case that 'ilen == rlen'.
AES keywrap ("kw(aes)") is special because its IV is generated by the
encryption. Previously this was handled by specifying 'iv_out' for
encryption and 'iv' for decryption. To make it work cleanly with only
one set of test vectors, put the IV in 'iv', remove 'iv_out', and add a
boolean that indicates that the IV is generated by the encryption.
In total, this removes over 10000 lines from testmgr.h, with no
reduction in test coverage since prior patches already copied the few
unique decryption test vectors into the encryption test vectors.
This covers all algorithms that used 'struct cipher_testvec', e.g. any
block cipher in the ECB, CBC, CTR, XTS, LRW, CTS-CBC, PCBC, OFB, or
keywrap modes, and Salsa20 and ChaCha20. No change is made to AEAD
tests, though we probably can eliminate a similar redundancy there too.
The testmgr.h portion of this patch was automatically generated using
the following awk script, with some slight manual fixups on top (updated
'struct cipher_testvec' definition, updated a few comments, and fixed up
the AES keywrap test vectors):
BEGIN { OTHER = 0; ENCVEC = 1; DECVEC = 2; DECVEC_TAIL = 3; mode = OTHER }
/^static const struct cipher_testvec.*_enc_/ { sub("_enc", ""); mode = ENCVEC }
/^static const struct cipher_testvec.*_dec_/ { mode = DECVEC }
mode == ENCVEC && !/\.ilen[[:space:]]*=/ {
sub(/\.input[[:space:]]*=$/, ".ptext =")
sub(/\.input[[:space:]]*=/, ".ptext\t=")
sub(/\.result[[:space:]]*=$/, ".ctext =")
sub(/\.result[[:space:]]*=/, ".ctext\t=")
sub(/\.rlen[[:space:]]*=/, ".len\t=")
print
}
mode == DECVEC_TAIL && /[^[:space:]]/ { mode = OTHER }
mode == OTHER { print }
mode == ENCVEC && /^};/ { mode = OTHER }
mode == DECVEC && /^};/ { mode = DECVEC_TAIL }
Note that git's default diff algorithm gets confused by the testmgr.h
portion of this patch, and reports too many lines added and removed.
It's better viewed with 'git diff --minimal' (or 'git show --minimal'),
which reports "2 files changed, 919 insertions(+), 11723 deletions(-)".
Signed-off-by: Eric Biggers <ebiggers@google.com>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
2018-05-21 08:50:29 +03:00
|
|
|
int err;
|
2008-08-17 11:01:56 +04:00
|
|
|
|
2016-11-22 15:08:31 +03:00
|
|
|
tfm = crypto_alloc_skcipher(driver, type, mask);
|
2008-08-17 11:01:56 +04:00
|
|
|
if (IS_ERR(tfm)) {
|
|
|
|
printk(KERN_ERR "alg: skcipher: Failed to load transform for "
|
|
|
|
"%s: %ld\n", driver, PTR_ERR(tfm));
|
|
|
|
return PTR_ERR(tfm);
|
|
|
|
}
|
|
|
|
|
crypto: testmgr - eliminate redundant decryption test vectors
Currently testmgr has separate encryption and decryption test vectors
for symmetric ciphers. That's massively redundant, since with few
exceptions (mostly mistakes, apparently), all decryption tests are
identical to the encryption tests, just with the input/result flipped.
Therefore, eliminate the redundancy by removing the decryption test
vectors and updating testmgr to test both encryption and decryption
using what used to be the encryption test vectors. Naming is adjusted
accordingly: each cipher_testvec now has a 'ptext' (plaintext), 'ctext'
(ciphertext), and 'len' instead of an 'input', 'result', 'ilen', and
'rlen'. Note that it was always the case that 'ilen == rlen'.
AES keywrap ("kw(aes)") is special because its IV is generated by the
encryption. Previously this was handled by specifying 'iv_out' for
encryption and 'iv' for decryption. To make it work cleanly with only
one set of test vectors, put the IV in 'iv', remove 'iv_out', and add a
boolean that indicates that the IV is generated by the encryption.
In total, this removes over 10000 lines from testmgr.h, with no
reduction in test coverage since prior patches already copied the few
unique decryption test vectors into the encryption test vectors.
This covers all algorithms that used 'struct cipher_testvec', e.g. any
block cipher in the ECB, CBC, CTR, XTS, LRW, CTS-CBC, PCBC, OFB, or
keywrap modes, and Salsa20 and ChaCha20. No change is made to AEAD
tests, though we probably can eliminate a similar redundancy there too.
The testmgr.h portion of this patch was automatically generated using
the following awk script, with some slight manual fixups on top (updated
'struct cipher_testvec' definition, updated a few comments, and fixed up
the AES keywrap test vectors):
BEGIN { OTHER = 0; ENCVEC = 1; DECVEC = 2; DECVEC_TAIL = 3; mode = OTHER }
/^static const struct cipher_testvec.*_enc_/ { sub("_enc", ""); mode = ENCVEC }
/^static const struct cipher_testvec.*_dec_/ { mode = DECVEC }
mode == ENCVEC && !/\.ilen[[:space:]]*=/ {
sub(/\.input[[:space:]]*=$/, ".ptext =")
sub(/\.input[[:space:]]*=/, ".ptext\t=")
sub(/\.result[[:space:]]*=$/, ".ctext =")
sub(/\.result[[:space:]]*=/, ".ctext\t=")
sub(/\.rlen[[:space:]]*=/, ".len\t=")
print
}
mode == DECVEC_TAIL && /[^[:space:]]/ { mode = OTHER }
mode == OTHER { print }
mode == ENCVEC && /^};/ { mode = OTHER }
mode == DECVEC && /^};/ { mode = DECVEC_TAIL }
Note that git's default diff algorithm gets confused by the testmgr.h
portion of this patch, and reports too many lines added and removed.
It's better viewed with 'git diff --minimal' (or 'git show --minimal'),
which reports "2 files changed, 919 insertions(+), 11723 deletions(-)".
Signed-off-by: Eric Biggers <ebiggers@google.com>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
2018-05-21 08:50:29 +03:00
|
|
|
err = test_skcipher(tfm, ENCRYPT, suite->vecs, suite->count);
|
|
|
|
if (!err)
|
|
|
|
err = test_skcipher(tfm, DECRYPT, suite->vecs, suite->count);
|
2008-08-17 11:01:56 +04:00
|
|
|
|
2015-08-20 10:21:46 +03:00
|
|
|
crypto_free_skcipher(tfm);
|
2008-07-31 13:08:25 +04:00
|
|
|
return err;
|
|
|
|
}
|
|
|
|
|
|
|
|
static int alg_test_comp(const struct alg_test_desc *desc, const char *driver,
|
|
|
|
u32 type, u32 mask)
|
|
|
|
{
|
2016-10-21 15:19:54 +03:00
|
|
|
struct crypto_comp *comp;
|
|
|
|
struct crypto_acomp *acomp;
|
2008-07-31 13:08:25 +04:00
|
|
|
int err;
|
2016-10-21 15:19:54 +03:00
|
|
|
u32 algo_type = type & CRYPTO_ALG_TYPE_ACOMPRESS_MASK;
|
|
|
|
|
|
|
|
if (algo_type == CRYPTO_ALG_TYPE_ACOMPRESS) {
|
|
|
|
acomp = crypto_alloc_acomp(driver, type, mask);
|
|
|
|
if (IS_ERR(acomp)) {
|
|
|
|
pr_err("alg: acomp: Failed to load transform for %s: %ld\n",
|
|
|
|
driver, PTR_ERR(acomp));
|
|
|
|
return PTR_ERR(acomp);
|
|
|
|
}
|
|
|
|
err = test_acomp(acomp, desc->suite.comp.comp.vecs,
|
|
|
|
desc->suite.comp.decomp.vecs,
|
|
|
|
desc->suite.comp.comp.count,
|
|
|
|
desc->suite.comp.decomp.count);
|
|
|
|
crypto_free_acomp(acomp);
|
|
|
|
} else {
|
|
|
|
comp = crypto_alloc_comp(driver, type, mask);
|
|
|
|
if (IS_ERR(comp)) {
|
|
|
|
pr_err("alg: comp: Failed to load transform for %s: %ld\n",
|
|
|
|
driver, PTR_ERR(comp));
|
|
|
|
return PTR_ERR(comp);
|
|
|
|
}
|
2008-07-31 13:08:25 +04:00
|
|
|
|
2016-10-21 15:19:54 +03:00
|
|
|
err = test_comp(comp, desc->suite.comp.comp.vecs,
|
|
|
|
desc->suite.comp.decomp.vecs,
|
|
|
|
desc->suite.comp.comp.count,
|
|
|
|
desc->suite.comp.decomp.count);
|
2008-07-31 13:08:25 +04:00
|
|
|
|
2016-10-21 15:19:54 +03:00
|
|
|
crypto_free_comp(comp);
|
|
|
|
}
|
2008-07-31 13:08:25 +04:00
|
|
|
return err;
|
|
|
|
}
|
|
|
|
|
2018-05-20 08:07:41 +03:00
|
|
|
static int __alg_test_hash(const struct hash_testvec *template,
|
|
|
|
unsigned int tcount, const char *driver,
|
|
|
|
u32 type, u32 mask)
|
2008-07-31 13:08:25 +04:00
|
|
|
{
|
|
|
|
struct crypto_ahash *tfm;
|
|
|
|
int err;
|
|
|
|
|
2016-11-22 15:08:31 +03:00
|
|
|
tfm = crypto_alloc_ahash(driver, type, mask);
|
2008-07-31 13:08:25 +04:00
|
|
|
if (IS_ERR(tfm)) {
|
|
|
|
printk(KERN_ERR "alg: hash: Failed to load transform for %s: "
|
|
|
|
"%ld\n", driver, PTR_ERR(tfm));
|
|
|
|
return PTR_ERR(tfm);
|
|
|
|
}
|
|
|
|
|
2018-07-01 10:02:35 +03:00
|
|
|
err = test_hash(tfm, template, tcount, HASH_TEST_DIGEST);
|
|
|
|
if (!err)
|
|
|
|
err = test_hash(tfm, template, tcount, HASH_TEST_FINAL);
|
2010-05-19 08:12:03 +04:00
|
|
|
if (!err)
|
2018-07-01 10:02:35 +03:00
|
|
|
err = test_hash(tfm, template, tcount, HASH_TEST_FINUP);
|
2008-07-31 13:08:25 +04:00
|
|
|
crypto_free_ahash(tfm);
|
|
|
|
return err;
|
|
|
|
}
|
|
|
|
|
2018-05-20 08:07:41 +03:00
|
|
|
static int alg_test_hash(const struct alg_test_desc *desc, const char *driver,
|
|
|
|
u32 type, u32 mask)
|
|
|
|
{
|
|
|
|
const struct hash_testvec *template = desc->suite.hash.vecs;
|
|
|
|
unsigned int tcount = desc->suite.hash.count;
|
|
|
|
unsigned int nr_unkeyed, nr_keyed;
|
|
|
|
int err;
|
|
|
|
|
|
|
|
/*
|
|
|
|
* For OPTIONAL_KEY algorithms, we have to do all the unkeyed tests
|
|
|
|
* first, before setting a key on the tfm. To make this easier, we
|
|
|
|
* require that the unkeyed test vectors (if any) are listed first.
|
|
|
|
*/
|
|
|
|
|
|
|
|
for (nr_unkeyed = 0; nr_unkeyed < tcount; nr_unkeyed++) {
|
|
|
|
if (template[nr_unkeyed].ksize)
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
for (nr_keyed = 0; nr_unkeyed + nr_keyed < tcount; nr_keyed++) {
|
|
|
|
if (!template[nr_unkeyed + nr_keyed].ksize) {
|
|
|
|
pr_err("alg: hash: test vectors for %s out of order, "
|
|
|
|
"unkeyed ones must come first\n", desc->alg);
|
|
|
|
return -EINVAL;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
err = 0;
|
|
|
|
if (nr_unkeyed) {
|
|
|
|
err = __alg_test_hash(template, nr_unkeyed, driver, type, mask);
|
|
|
|
template += nr_unkeyed;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (!err && nr_keyed)
|
|
|
|
err = __alg_test_hash(template, nr_keyed, driver, type, mask);
|
|
|
|
|
|
|
|
return err;
|
|
|
|
}
|
|
|
|
|
2008-11-07 09:58:52 +03:00
|
|
|
static int alg_test_crc32c(const struct alg_test_desc *desc,
|
|
|
|
const char *driver, u32 type, u32 mask)
|
|
|
|
{
|
|
|
|
struct crypto_shash *tfm;
|
|
|
|
u32 val;
|
|
|
|
int err;
|
|
|
|
|
|
|
|
err = alg_test_hash(desc, driver, type, mask);
|
|
|
|
if (err)
|
|
|
|
goto out;
|
|
|
|
|
2016-11-22 15:08:31 +03:00
|
|
|
tfm = crypto_alloc_shash(driver, type, mask);
|
2008-11-07 09:58:52 +03:00
|
|
|
if (IS_ERR(tfm)) {
|
|
|
|
printk(KERN_ERR "alg: crc32c: Failed to load transform for %s: "
|
|
|
|
"%ld\n", driver, PTR_ERR(tfm));
|
|
|
|
err = PTR_ERR(tfm);
|
|
|
|
goto out;
|
|
|
|
}
|
|
|
|
|
|
|
|
do {
|
2012-07-02 15:48:30 +04:00
|
|
|
SHASH_DESC_ON_STACK(shash, tfm);
|
|
|
|
u32 *ctx = (u32 *)shash_desc_ctx(shash);
|
2008-11-07 09:58:52 +03:00
|
|
|
|
2012-07-02 15:48:30 +04:00
|
|
|
shash->tfm = tfm;
|
|
|
|
shash->flags = 0;
|
2008-11-07 09:58:52 +03:00
|
|
|
|
2012-07-02 15:48:30 +04:00
|
|
|
*ctx = le32_to_cpu(420553207);
|
|
|
|
err = crypto_shash_final(shash, (u8 *)&val);
|
2008-11-07 09:58:52 +03:00
|
|
|
if (err) {
|
|
|
|
printk(KERN_ERR "alg: crc32c: Operation failed for "
|
|
|
|
"%s: %d\n", driver, err);
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (val != ~420553207) {
|
|
|
|
printk(KERN_ERR "alg: crc32c: Test failed for %s: "
|
|
|
|
"%d\n", driver, val);
|
|
|
|
err = -EINVAL;
|
|
|
|
}
|
|
|
|
} while (0);
|
|
|
|
|
|
|
|
crypto_free_shash(tfm);
|
|
|
|
|
|
|
|
out:
|
|
|
|
return err;
|
|
|
|
}
|
|
|
|
|
2009-05-04 15:44:50 +04:00
|
|
|
static int alg_test_cprng(const struct alg_test_desc *desc, const char *driver,
|
|
|
|
u32 type, u32 mask)
|
|
|
|
{
|
|
|
|
struct crypto_rng *rng;
|
|
|
|
int err;
|
|
|
|
|
2016-11-22 15:08:31 +03:00
|
|
|
rng = crypto_alloc_rng(driver, type, mask);
|
2009-05-04 15:44:50 +04:00
|
|
|
if (IS_ERR(rng)) {
|
|
|
|
printk(KERN_ERR "alg: cprng: Failed to load transform for %s: "
|
|
|
|
"%ld\n", driver, PTR_ERR(rng));
|
|
|
|
return PTR_ERR(rng);
|
|
|
|
}
|
|
|
|
|
|
|
|
err = test_cprng(rng, desc->suite.cprng.vecs, desc->suite.cprng.count);
|
|
|
|
|
|
|
|
crypto_free_rng(rng);
|
|
|
|
|
|
|
|
return err;
|
|
|
|
}
|
|
|
|
|
2014-05-31 19:25:36 +04:00
|
|
|
|
2017-02-25 02:46:59 +03:00
|
|
|
static int drbg_cavs_test(const struct drbg_testvec *test, int pr,
|
2014-05-31 19:25:36 +04:00
|
|
|
const char *driver, u32 type, u32 mask)
|
|
|
|
{
|
|
|
|
int ret = -EAGAIN;
|
|
|
|
struct crypto_rng *drng;
|
|
|
|
struct drbg_test_data test_data;
|
|
|
|
struct drbg_string addtl, pers, testentropy;
|
|
|
|
unsigned char *buf = kzalloc(test->expectedlen, GFP_KERNEL);
|
|
|
|
|
|
|
|
if (!buf)
|
|
|
|
return -ENOMEM;
|
|
|
|
|
2016-11-22 15:08:31 +03:00
|
|
|
drng = crypto_alloc_rng(driver, type, mask);
|
2014-05-31 19:25:36 +04:00
|
|
|
if (IS_ERR(drng)) {
|
2014-07-29 23:47:56 +04:00
|
|
|
printk(KERN_ERR "alg: drbg: could not allocate DRNG handle for "
|
2014-05-31 19:25:36 +04:00
|
|
|
"%s\n", driver);
|
|
|
|
kzfree(buf);
|
|
|
|
return -ENOMEM;
|
|
|
|
}
|
|
|
|
|
|
|
|
test_data.testentropy = &testentropy;
|
|
|
|
drbg_string_fill(&testentropy, test->entropy, test->entropylen);
|
|
|
|
drbg_string_fill(&pers, test->pers, test->perslen);
|
|
|
|
ret = crypto_drbg_reset_test(drng, &pers, &test_data);
|
|
|
|
if (ret) {
|
|
|
|
printk(KERN_ERR "alg: drbg: Failed to reset rng\n");
|
|
|
|
goto outbuf;
|
|
|
|
}
|
|
|
|
|
|
|
|
drbg_string_fill(&addtl, test->addtla, test->addtllen);
|
|
|
|
if (pr) {
|
|
|
|
drbg_string_fill(&testentropy, test->entpra, test->entprlen);
|
|
|
|
ret = crypto_drbg_get_bytes_addtl_test(drng,
|
|
|
|
buf, test->expectedlen, &addtl, &test_data);
|
|
|
|
} else {
|
|
|
|
ret = crypto_drbg_get_bytes_addtl(drng,
|
|
|
|
buf, test->expectedlen, &addtl);
|
|
|
|
}
|
2015-03-10 19:00:36 +03:00
|
|
|
if (ret < 0) {
|
2014-07-29 23:47:56 +04:00
|
|
|
printk(KERN_ERR "alg: drbg: could not obtain random data for "
|
2014-05-31 19:25:36 +04:00
|
|
|
"driver %s\n", driver);
|
|
|
|
goto outbuf;
|
|
|
|
}
|
|
|
|
|
|
|
|
drbg_string_fill(&addtl, test->addtlb, test->addtllen);
|
|
|
|
if (pr) {
|
|
|
|
drbg_string_fill(&testentropy, test->entprb, test->entprlen);
|
|
|
|
ret = crypto_drbg_get_bytes_addtl_test(drng,
|
|
|
|
buf, test->expectedlen, &addtl, &test_data);
|
|
|
|
} else {
|
|
|
|
ret = crypto_drbg_get_bytes_addtl(drng,
|
|
|
|
buf, test->expectedlen, &addtl);
|
|
|
|
}
|
2015-03-10 19:00:36 +03:00
|
|
|
if (ret < 0) {
|
2014-07-29 23:47:56 +04:00
|
|
|
printk(KERN_ERR "alg: drbg: could not obtain random data for "
|
2014-05-31 19:25:36 +04:00
|
|
|
"driver %s\n", driver);
|
|
|
|
goto outbuf;
|
|
|
|
}
|
|
|
|
|
|
|
|
ret = memcmp(test->expected, buf, test->expectedlen);
|
|
|
|
|
|
|
|
outbuf:
|
|
|
|
crypto_free_rng(drng);
|
|
|
|
kzfree(buf);
|
|
|
|
return ret;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
static int alg_test_drbg(const struct alg_test_desc *desc, const char *driver,
|
|
|
|
u32 type, u32 mask)
|
|
|
|
{
|
|
|
|
int err = 0;
|
|
|
|
int pr = 0;
|
|
|
|
int i = 0;
|
2017-02-25 02:46:59 +03:00
|
|
|
const struct drbg_testvec *template = desc->suite.drbg.vecs;
|
2014-05-31 19:25:36 +04:00
|
|
|
unsigned int tcount = desc->suite.drbg.count;
|
|
|
|
|
|
|
|
if (0 == memcmp(driver, "drbg_pr_", 8))
|
|
|
|
pr = 1;
|
|
|
|
|
|
|
|
for (i = 0; i < tcount; i++) {
|
|
|
|
err = drbg_cavs_test(&template[i], pr, driver, type, mask);
|
|
|
|
if (err) {
|
|
|
|
printk(KERN_ERR "alg: drbg: Test %d failed for %s\n",
|
|
|
|
i, driver);
|
|
|
|
err = -EINVAL;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return err;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
2017-02-25 02:46:59 +03:00
|
|
|
static int do_test_kpp(struct crypto_kpp *tfm, const struct kpp_testvec *vec,
|
2016-06-22 19:49:14 +03:00
|
|
|
const char *alg)
|
|
|
|
{
|
|
|
|
struct kpp_request *req;
|
|
|
|
void *input_buf = NULL;
|
|
|
|
void *output_buf = NULL;
|
2017-05-30 17:52:49 +03:00
|
|
|
void *a_public = NULL;
|
|
|
|
void *a_ss = NULL;
|
|
|
|
void *shared_secret = NULL;
|
2017-10-18 10:00:43 +03:00
|
|
|
struct crypto_wait wait;
|
2016-06-22 19:49:14 +03:00
|
|
|
unsigned int out_len_max;
|
|
|
|
int err = -ENOMEM;
|
|
|
|
struct scatterlist src, dst;
|
|
|
|
|
|
|
|
req = kpp_request_alloc(tfm, GFP_KERNEL);
|
|
|
|
if (!req)
|
|
|
|
return err;
|
|
|
|
|
2017-10-18 10:00:43 +03:00
|
|
|
crypto_init_wait(&wait);
|
2016-06-22 19:49:14 +03:00
|
|
|
|
|
|
|
err = crypto_kpp_set_secret(tfm, vec->secret, vec->secret_size);
|
|
|
|
if (err < 0)
|
|
|
|
goto free_req;
|
|
|
|
|
|
|
|
out_len_max = crypto_kpp_maxsize(tfm);
|
|
|
|
output_buf = kzalloc(out_len_max, GFP_KERNEL);
|
|
|
|
if (!output_buf) {
|
|
|
|
err = -ENOMEM;
|
|
|
|
goto free_req;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* Use appropriate parameter as base */
|
|
|
|
kpp_request_set_input(req, NULL, 0);
|
|
|
|
sg_init_one(&dst, output_buf, out_len_max);
|
|
|
|
kpp_request_set_output(req, &dst, out_len_max);
|
|
|
|
kpp_request_set_callback(req, CRYPTO_TFM_REQ_MAY_BACKLOG,
|
2017-10-18 10:00:43 +03:00
|
|
|
crypto_req_done, &wait);
|
2016-06-22 19:49:14 +03:00
|
|
|
|
2017-05-30 17:52:49 +03:00
|
|
|
/* Compute party A's public key */
|
2017-10-18 10:00:43 +03:00
|
|
|
err = crypto_wait_req(crypto_kpp_generate_public_key(req), &wait);
|
2016-06-22 19:49:14 +03:00
|
|
|
if (err) {
|
2017-05-30 17:52:49 +03:00
|
|
|
pr_err("alg: %s: Party A: generate public key test failed. err %d\n",
|
2016-06-22 19:49:14 +03:00
|
|
|
alg, err);
|
|
|
|
goto free_output;
|
|
|
|
}
|
2017-05-30 17:52:49 +03:00
|
|
|
|
|
|
|
if (vec->genkey) {
|
|
|
|
/* Save party A's public key */
|
|
|
|
a_public = kzalloc(out_len_max, GFP_KERNEL);
|
|
|
|
if (!a_public) {
|
|
|
|
err = -ENOMEM;
|
|
|
|
goto free_output;
|
|
|
|
}
|
|
|
|
memcpy(a_public, sg_virt(req->dst), out_len_max);
|
|
|
|
} else {
|
|
|
|
/* Verify calculated public key */
|
|
|
|
if (memcmp(vec->expected_a_public, sg_virt(req->dst),
|
|
|
|
vec->expected_a_public_size)) {
|
|
|
|
pr_err("alg: %s: Party A: generate public key test failed. Invalid output\n",
|
|
|
|
alg);
|
|
|
|
err = -EINVAL;
|
|
|
|
goto free_output;
|
|
|
|
}
|
2016-06-22 19:49:14 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
/* Calculate shared secret key by using counter part (b) public key. */
|
|
|
|
input_buf = kzalloc(vec->b_public_size, GFP_KERNEL);
|
|
|
|
if (!input_buf) {
|
|
|
|
err = -ENOMEM;
|
|
|
|
goto free_output;
|
|
|
|
}
|
|
|
|
|
|
|
|
memcpy(input_buf, vec->b_public, vec->b_public_size);
|
|
|
|
sg_init_one(&src, input_buf, vec->b_public_size);
|
|
|
|
sg_init_one(&dst, output_buf, out_len_max);
|
|
|
|
kpp_request_set_input(req, &src, vec->b_public_size);
|
|
|
|
kpp_request_set_output(req, &dst, out_len_max);
|
|
|
|
kpp_request_set_callback(req, CRYPTO_TFM_REQ_MAY_BACKLOG,
|
2017-10-18 10:00:43 +03:00
|
|
|
crypto_req_done, &wait);
|
|
|
|
err = crypto_wait_req(crypto_kpp_compute_shared_secret(req), &wait);
|
2016-06-22 19:49:14 +03:00
|
|
|
if (err) {
|
2017-05-30 17:52:49 +03:00
|
|
|
pr_err("alg: %s: Party A: compute shared secret test failed. err %d\n",
|
2016-06-22 19:49:14 +03:00
|
|
|
alg, err);
|
|
|
|
goto free_all;
|
|
|
|
}
|
2017-05-30 17:52:49 +03:00
|
|
|
|
|
|
|
if (vec->genkey) {
|
|
|
|
/* Save the shared secret obtained by party A */
|
|
|
|
a_ss = kzalloc(vec->expected_ss_size, GFP_KERNEL);
|
|
|
|
if (!a_ss) {
|
|
|
|
err = -ENOMEM;
|
|
|
|
goto free_all;
|
|
|
|
}
|
|
|
|
memcpy(a_ss, sg_virt(req->dst), vec->expected_ss_size);
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Calculate party B's shared secret by using party A's
|
|
|
|
* public key.
|
|
|
|
*/
|
|
|
|
err = crypto_kpp_set_secret(tfm, vec->b_secret,
|
|
|
|
vec->b_secret_size);
|
|
|
|
if (err < 0)
|
|
|
|
goto free_all;
|
|
|
|
|
|
|
|
sg_init_one(&src, a_public, vec->expected_a_public_size);
|
|
|
|
sg_init_one(&dst, output_buf, out_len_max);
|
|
|
|
kpp_request_set_input(req, &src, vec->expected_a_public_size);
|
|
|
|
kpp_request_set_output(req, &dst, out_len_max);
|
|
|
|
kpp_request_set_callback(req, CRYPTO_TFM_REQ_MAY_BACKLOG,
|
2017-10-18 10:00:43 +03:00
|
|
|
crypto_req_done, &wait);
|
|
|
|
err = crypto_wait_req(crypto_kpp_compute_shared_secret(req),
|
|
|
|
&wait);
|
2017-05-30 17:52:49 +03:00
|
|
|
if (err) {
|
|
|
|
pr_err("alg: %s: Party B: compute shared secret failed. err %d\n",
|
|
|
|
alg, err);
|
|
|
|
goto free_all;
|
|
|
|
}
|
|
|
|
|
|
|
|
shared_secret = a_ss;
|
|
|
|
} else {
|
|
|
|
shared_secret = (void *)vec->expected_ss;
|
|
|
|
}
|
|
|
|
|
2016-06-22 19:49:14 +03:00
|
|
|
/*
|
|
|
|
* verify shared secret from which the user will derive
|
|
|
|
* secret key by executing whatever hash it has chosen
|
|
|
|
*/
|
2017-05-30 17:52:49 +03:00
|
|
|
if (memcmp(shared_secret, sg_virt(req->dst),
|
2016-06-22 19:49:14 +03:00
|
|
|
vec->expected_ss_size)) {
|
|
|
|
pr_err("alg: %s: compute shared secret test failed. Invalid output\n",
|
|
|
|
alg);
|
|
|
|
err = -EINVAL;
|
|
|
|
}
|
|
|
|
|
|
|
|
free_all:
|
2017-05-30 17:52:49 +03:00
|
|
|
kfree(a_ss);
|
2016-06-22 19:49:14 +03:00
|
|
|
kfree(input_buf);
|
|
|
|
free_output:
|
2017-05-30 17:52:49 +03:00
|
|
|
kfree(a_public);
|
2016-06-22 19:49:14 +03:00
|
|
|
kfree(output_buf);
|
|
|
|
free_req:
|
|
|
|
kpp_request_free(req);
|
|
|
|
return err;
|
|
|
|
}
|
|
|
|
|
|
|
|
static int test_kpp(struct crypto_kpp *tfm, const char *alg,
|
2017-02-25 02:46:59 +03:00
|
|
|
const struct kpp_testvec *vecs, unsigned int tcount)
|
2016-06-22 19:49:14 +03:00
|
|
|
{
|
|
|
|
int ret, i;
|
|
|
|
|
|
|
|
for (i = 0; i < tcount; i++) {
|
|
|
|
ret = do_test_kpp(tfm, vecs++, alg);
|
|
|
|
if (ret) {
|
|
|
|
pr_err("alg: %s: test failed on vector %d, err=%d\n",
|
|
|
|
alg, i + 1, ret);
|
|
|
|
return ret;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
static int alg_test_kpp(const struct alg_test_desc *desc, const char *driver,
|
|
|
|
u32 type, u32 mask)
|
|
|
|
{
|
|
|
|
struct crypto_kpp *tfm;
|
|
|
|
int err = 0;
|
|
|
|
|
2016-11-22 15:08:31 +03:00
|
|
|
tfm = crypto_alloc_kpp(driver, type, mask);
|
2016-06-22 19:49:14 +03:00
|
|
|
if (IS_ERR(tfm)) {
|
|
|
|
pr_err("alg: kpp: Failed to load tfm for %s: %ld\n",
|
|
|
|
driver, PTR_ERR(tfm));
|
|
|
|
return PTR_ERR(tfm);
|
|
|
|
}
|
|
|
|
if (desc->suite.kpp.vecs)
|
|
|
|
err = test_kpp(tfm, desc->alg, desc->suite.kpp.vecs,
|
|
|
|
desc->suite.kpp.count);
|
|
|
|
|
|
|
|
crypto_free_kpp(tfm);
|
|
|
|
return err;
|
|
|
|
}
|
|
|
|
|
2016-06-29 14:32:20 +03:00
|
|
|
static int test_akcipher_one(struct crypto_akcipher *tfm,
|
2017-02-25 02:46:59 +03:00
|
|
|
const struct akcipher_testvec *vecs)
|
2015-06-16 20:31:06 +03:00
|
|
|
{
|
2016-05-05 11:42:49 +03:00
|
|
|
char *xbuf[XBUFSIZE];
|
2015-06-16 20:31:06 +03:00
|
|
|
struct akcipher_request *req;
|
|
|
|
void *outbuf_enc = NULL;
|
|
|
|
void *outbuf_dec = NULL;
|
2017-10-18 10:00:43 +03:00
|
|
|
struct crypto_wait wait;
|
2015-06-16 20:31:06 +03:00
|
|
|
unsigned int out_len_max, out_len = 0;
|
|
|
|
int err = -ENOMEM;
|
2015-10-08 19:26:55 +03:00
|
|
|
struct scatterlist src, dst, src_tab[2];
|
2015-06-16 20:31:06 +03:00
|
|
|
|
2016-05-05 11:42:49 +03:00
|
|
|
if (testmgr_alloc_buf(xbuf))
|
|
|
|
return err;
|
|
|
|
|
2015-06-16 20:31:06 +03:00
|
|
|
req = akcipher_request_alloc(tfm, GFP_KERNEL);
|
|
|
|
if (!req)
|
2016-05-05 11:42:49 +03:00
|
|
|
goto free_xbuf;
|
2015-06-16 20:31:06 +03:00
|
|
|
|
2017-10-18 10:00:43 +03:00
|
|
|
crypto_init_wait(&wait);
|
2015-06-16 20:31:06 +03:00
|
|
|
|
2015-10-08 19:26:55 +03:00
|
|
|
if (vecs->public_key_vec)
|
|
|
|
err = crypto_akcipher_set_pub_key(tfm, vecs->key,
|
|
|
|
vecs->key_len);
|
|
|
|
else
|
|
|
|
err = crypto_akcipher_set_priv_key(tfm, vecs->key,
|
|
|
|
vecs->key_len);
|
|
|
|
if (err)
|
2015-06-16 20:31:06 +03:00
|
|
|
goto free_req;
|
|
|
|
|
2016-07-04 12:52:34 +03:00
|
|
|
err = -ENOMEM;
|
2015-10-08 19:26:55 +03:00
|
|
|
out_len_max = crypto_akcipher_maxsize(tfm);
|
2015-06-16 20:31:06 +03:00
|
|
|
outbuf_enc = kzalloc(out_len_max, GFP_KERNEL);
|
|
|
|
if (!outbuf_enc)
|
|
|
|
goto free_req;
|
|
|
|
|
2016-05-05 11:42:49 +03:00
|
|
|
if (WARN_ON(vecs->m_size > PAGE_SIZE))
|
|
|
|
goto free_all;
|
|
|
|
|
|
|
|
memcpy(xbuf[0], vecs->m, vecs->m_size);
|
|
|
|
|
2015-10-08 19:26:55 +03:00
|
|
|
sg_init_table(src_tab, 2);
|
2016-05-05 11:42:49 +03:00
|
|
|
sg_set_buf(&src_tab[0], xbuf[0], 8);
|
|
|
|
sg_set_buf(&src_tab[1], xbuf[0] + 8, vecs->m_size - 8);
|
2015-10-08 19:26:55 +03:00
|
|
|
sg_init_one(&dst, outbuf_enc, out_len_max);
|
|
|
|
akcipher_request_set_crypt(req, src_tab, &dst, vecs->m_size,
|
|
|
|
out_len_max);
|
2015-06-16 20:31:06 +03:00
|
|
|
akcipher_request_set_callback(req, CRYPTO_TFM_REQ_MAY_BACKLOG,
|
2017-10-18 10:00:43 +03:00
|
|
|
crypto_req_done, &wait);
|
2015-06-16 20:31:06 +03:00
|
|
|
|
2017-10-18 10:00:43 +03:00
|
|
|
err = crypto_wait_req(vecs->siggen_sigver_test ?
|
|
|
|
/* Run asymmetric signature generation */
|
|
|
|
crypto_akcipher_sign(req) :
|
|
|
|
/* Run asymmetric encrypt */
|
|
|
|
crypto_akcipher_encrypt(req), &wait);
|
2015-06-16 20:31:06 +03:00
|
|
|
if (err) {
|
2016-06-29 14:32:20 +03:00
|
|
|
pr_err("alg: akcipher: encrypt test failed. err %d\n", err);
|
2015-06-16 20:31:06 +03:00
|
|
|
goto free_all;
|
|
|
|
}
|
2015-10-08 19:26:55 +03:00
|
|
|
if (req->dst_len != vecs->c_size) {
|
2016-06-29 14:32:20 +03:00
|
|
|
pr_err("alg: akcipher: encrypt test failed. Invalid output len\n");
|
2015-06-16 20:31:06 +03:00
|
|
|
err = -EINVAL;
|
|
|
|
goto free_all;
|
|
|
|
}
|
|
|
|
/* verify that encrypted message is equal to expected */
|
2016-05-05 11:42:49 +03:00
|
|
|
if (memcmp(vecs->c, outbuf_enc, vecs->c_size)) {
|
2016-06-29 14:32:20 +03:00
|
|
|
pr_err("alg: akcipher: encrypt test failed. Invalid output\n");
|
|
|
|
hexdump(outbuf_enc, vecs->c_size);
|
2015-06-16 20:31:06 +03:00
|
|
|
err = -EINVAL;
|
|
|
|
goto free_all;
|
|
|
|
}
|
|
|
|
/* Don't invoke decrypt for vectors with public key */
|
|
|
|
if (vecs->public_key_vec) {
|
|
|
|
err = 0;
|
|
|
|
goto free_all;
|
|
|
|
}
|
|
|
|
outbuf_dec = kzalloc(out_len_max, GFP_KERNEL);
|
|
|
|
if (!outbuf_dec) {
|
|
|
|
err = -ENOMEM;
|
|
|
|
goto free_all;
|
|
|
|
}
|
2016-05-05 11:42:49 +03:00
|
|
|
|
|
|
|
if (WARN_ON(vecs->c_size > PAGE_SIZE))
|
|
|
|
goto free_all;
|
|
|
|
|
|
|
|
memcpy(xbuf[0], vecs->c, vecs->c_size);
|
|
|
|
|
|
|
|
sg_init_one(&src, xbuf[0], vecs->c_size);
|
2015-10-08 19:26:55 +03:00
|
|
|
sg_init_one(&dst, outbuf_dec, out_len_max);
|
2017-10-18 10:00:43 +03:00
|
|
|
crypto_init_wait(&wait);
|
2015-10-08 19:26:55 +03:00
|
|
|
akcipher_request_set_crypt(req, &src, &dst, vecs->c_size, out_len_max);
|
2015-06-16 20:31:06 +03:00
|
|
|
|
2017-10-18 10:00:43 +03:00
|
|
|
err = crypto_wait_req(vecs->siggen_sigver_test ?
|
|
|
|
/* Run asymmetric signature verification */
|
|
|
|
crypto_akcipher_verify(req) :
|
|
|
|
/* Run asymmetric decrypt */
|
|
|
|
crypto_akcipher_decrypt(req), &wait);
|
2015-06-16 20:31:06 +03:00
|
|
|
if (err) {
|
2016-06-29 14:32:20 +03:00
|
|
|
pr_err("alg: akcipher: decrypt test failed. err %d\n", err);
|
2015-06-16 20:31:06 +03:00
|
|
|
goto free_all;
|
|
|
|
}
|
|
|
|
out_len = req->dst_len;
|
2016-06-29 14:32:20 +03:00
|
|
|
if (out_len < vecs->m_size) {
|
|
|
|
pr_err("alg: akcipher: decrypt test failed. "
|
|
|
|
"Invalid output len %u\n", out_len);
|
2015-06-16 20:31:06 +03:00
|
|
|
err = -EINVAL;
|
|
|
|
goto free_all;
|
|
|
|
}
|
|
|
|
/* verify that decrypted message is equal to the original msg */
|
2016-06-29 14:32:20 +03:00
|
|
|
if (memchr_inv(outbuf_dec, 0, out_len - vecs->m_size) ||
|
|
|
|
memcmp(vecs->m, outbuf_dec + out_len - vecs->m_size,
|
|
|
|
vecs->m_size)) {
|
|
|
|
pr_err("alg: akcipher: decrypt test failed. Invalid output\n");
|
|
|
|
hexdump(outbuf_dec, out_len);
|
2015-06-16 20:31:06 +03:00
|
|
|
err = -EINVAL;
|
|
|
|
}
|
|
|
|
free_all:
|
|
|
|
kfree(outbuf_dec);
|
|
|
|
kfree(outbuf_enc);
|
|
|
|
free_req:
|
|
|
|
akcipher_request_free(req);
|
2016-05-05 11:42:49 +03:00
|
|
|
free_xbuf:
|
|
|
|
testmgr_free_buf(xbuf);
|
2015-06-16 20:31:06 +03:00
|
|
|
return err;
|
|
|
|
}
|
|
|
|
|
2016-06-29 14:32:20 +03:00
|
|
|
static int test_akcipher(struct crypto_akcipher *tfm, const char *alg,
|
2017-02-25 02:46:59 +03:00
|
|
|
const struct akcipher_testvec *vecs,
|
|
|
|
unsigned int tcount)
|
2015-06-16 20:31:06 +03:00
|
|
|
{
|
2016-07-18 13:20:10 +03:00
|
|
|
const char *algo =
|
|
|
|
crypto_tfm_alg_driver_name(crypto_akcipher_tfm(tfm));
|
2015-06-16 20:31:06 +03:00
|
|
|
int ret, i;
|
|
|
|
|
|
|
|
for (i = 0; i < tcount; i++) {
|
2016-06-29 14:32:20 +03:00
|
|
|
ret = test_akcipher_one(tfm, vecs++);
|
|
|
|
if (!ret)
|
|
|
|
continue;
|
2015-06-16 20:31:06 +03:00
|
|
|
|
2016-07-18 13:20:10 +03:00
|
|
|
pr_err("alg: akcipher: test %d failed for %s, err=%d\n",
|
|
|
|
i + 1, algo, ret);
|
2016-06-29 14:32:20 +03:00
|
|
|
return ret;
|
|
|
|
}
|
2015-06-16 20:31:06 +03:00
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
static int alg_test_akcipher(const struct alg_test_desc *desc,
|
|
|
|
const char *driver, u32 type, u32 mask)
|
|
|
|
{
|
|
|
|
struct crypto_akcipher *tfm;
|
|
|
|
int err = 0;
|
|
|
|
|
2016-11-22 15:08:31 +03:00
|
|
|
tfm = crypto_alloc_akcipher(driver, type, mask);
|
2015-06-16 20:31:06 +03:00
|
|
|
if (IS_ERR(tfm)) {
|
|
|
|
pr_err("alg: akcipher: Failed to load tfm for %s: %ld\n",
|
|
|
|
driver, PTR_ERR(tfm));
|
|
|
|
return PTR_ERR(tfm);
|
|
|
|
}
|
|
|
|
if (desc->suite.akcipher.vecs)
|
|
|
|
err = test_akcipher(tfm, desc->alg, desc->suite.akcipher.vecs,
|
|
|
|
desc->suite.akcipher.count);
|
|
|
|
|
|
|
|
crypto_free_akcipher(tfm);
|
|
|
|
return err;
|
|
|
|
}
|
|
|
|
|
2009-12-23 14:45:20 +03:00
|
|
|
static int alg_test_null(const struct alg_test_desc *desc,
|
|
|
|
const char *driver, u32 type, u32 mask)
|
|
|
|
{
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2017-01-12 16:40:39 +03:00
|
|
|
#define __VECS(tv) { .vecs = tv, .count = ARRAY_SIZE(tv) }
|
|
|
|
|
2008-07-31 13:08:25 +04:00
|
|
|
/* Please keep this list sorted by algorithm name. */
|
|
|
|
static const struct alg_test_desc alg_test_descs[] = {
|
|
|
|
{
|
crypto: adiantum - add Adiantum support
Add support for the Adiantum encryption mode. Adiantum was designed by
Paul Crowley and is specified by our paper:
Adiantum: length-preserving encryption for entry-level processors
(https://eprint.iacr.org/2018/720.pdf)
See our paper for full details; this patch only provides an overview.
Adiantum is a tweakable, length-preserving encryption mode designed for
fast and secure disk encryption, especially on CPUs without dedicated
crypto instructions. Adiantum encrypts each sector using the XChaCha12
stream cipher, two passes of an ε-almost-∆-universal (εA∆U) hash
function, and an invocation of the AES-256 block cipher on a single
16-byte block. On CPUs without AES instructions, Adiantum is much
faster than AES-XTS; for example, on ARM Cortex-A7, on 4096-byte sectors
Adiantum encryption is about 4 times faster than AES-256-XTS encryption,
and decryption about 5 times faster.
Adiantum is a specialization of the more general HBSH construction. Our
earlier proposal, HPolyC, was also a HBSH specialization, but it used a
different εA∆U hash function, one based on Poly1305 only. Adiantum's
εA∆U hash function, which is based primarily on the "NH" hash function
like that used in UMAC (RFC4418), is about twice as fast as HPolyC's;
consequently, Adiantum is about 20% faster than HPolyC.
This speed comes with no loss of security: Adiantum is provably just as
secure as HPolyC, in fact slightly *more* secure. Like HPolyC,
Adiantum's security is reducible to that of XChaCha12 and AES-256,
subject to a security bound. XChaCha12 itself has a security reduction
to ChaCha12. Therefore, one need not "trust" Adiantum; one need only
trust ChaCha12 and AES-256. Note that the εA∆U hash function is only
used for its proven combinatorical properties so cannot be "broken".
Adiantum is also a true wide-block encryption mode, so flipping any
plaintext bit in the sector scrambles the entire ciphertext, and vice
versa. No other such mode is available in the kernel currently; doing
the same with XTS scrambles only 16 bytes. Adiantum also supports
arbitrary-length tweaks and naturally supports any length input >= 16
bytes without needing "ciphertext stealing".
For the stream cipher, Adiantum uses XChaCha12 rather than XChaCha20 in
order to make encryption feasible on the widest range of devices.
Although the 20-round variant is quite popular, the best known attacks
on ChaCha are on only 7 rounds, so ChaCha12 still has a substantial
security margin; in fact, larger than AES-256's. 12-round Salsa20 is
also the eSTREAM recommendation. For the block cipher, Adiantum uses
AES-256, despite it having a lower security margin than XChaCha12 and
needing table lookups, due to AES's extensive adoption and analysis
making it the obvious first choice. Nevertheless, for flexibility this
patch also permits the "adiantum" template to be instantiated with
XChaCha20 and/or with an alternate block cipher.
We need Adiantum support in the kernel for use in dm-crypt and fscrypt,
where currently the only other suitable options are block cipher modes
such as AES-XTS. A big problem with this is that many low-end mobile
devices (e.g. Android Go phones sold primarily in developing countries,
as well as some smartwatches) still have CPUs that lack AES
instructions, e.g. ARM Cortex-A7. Sadly, AES-XTS encryption is much too
slow to be viable on these devices. We did find that some "lightweight"
block ciphers are fast enough, but these suffer from problems such as
not having much cryptanalysis or being too controversial.
The ChaCha stream cipher has excellent performance but is insecure to
use directly for disk encryption, since each sector's IV is reused each
time it is overwritten. Even restricting the threat model to offline
attacks only isn't enough, since modern flash storage devices don't
guarantee that "overwrites" are really overwrites, due to wear-leveling.
Adiantum avoids this problem by constructing a
"tweakable super-pseudorandom permutation"; this is the strongest
possible security model for length-preserving encryption.
Of course, storing random nonces along with the ciphertext would be the
ideal solution. But doing that with existing hardware and filesystems
runs into major practical problems; in most cases it would require data
journaling (like dm-integrity) which severely degrades performance.
Thus, for now length-preserving encryption is still needed.
Signed-off-by: Eric Biggers <ebiggers@google.com>
Reviewed-by: Ard Biesheuvel <ard.biesheuvel@linaro.org>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
2018-11-17 04:26:31 +03:00
|
|
|
.alg = "adiantum(xchacha12,aes)",
|
|
|
|
.test = alg_test_skcipher,
|
|
|
|
.suite = {
|
|
|
|
.cipher = __VECS(adiantum_xchacha12_aes_tv_template)
|
|
|
|
},
|
|
|
|
}, {
|
|
|
|
.alg = "adiantum(xchacha20,aes)",
|
|
|
|
.test = alg_test_skcipher,
|
|
|
|
.suite = {
|
|
|
|
.cipher = __VECS(adiantum_xchacha20_aes_tv_template)
|
|
|
|
},
|
|
|
|
}, {
|
2018-05-11 15:12:50 +03:00
|
|
|
.alg = "aegis128",
|
|
|
|
.test = alg_test_aead,
|
|
|
|
.suite = {
|
|
|
|
.aead = {
|
|
|
|
.enc = __VECS(aegis128_enc_tv_template),
|
|
|
|
.dec = __VECS(aegis128_dec_tv_template),
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}, {
|
|
|
|
.alg = "aegis128l",
|
|
|
|
.test = alg_test_aead,
|
|
|
|
.suite = {
|
|
|
|
.aead = {
|
|
|
|
.enc = __VECS(aegis128l_enc_tv_template),
|
|
|
|
.dec = __VECS(aegis128l_dec_tv_template),
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}, {
|
|
|
|
.alg = "aegis256",
|
|
|
|
.test = alg_test_aead,
|
|
|
|
.suite = {
|
|
|
|
.aead = {
|
|
|
|
.enc = __VECS(aegis256_enc_tv_template),
|
|
|
|
.dec = __VECS(aegis256_dec_tv_template),
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}, {
|
2009-05-04 15:46:29 +04:00
|
|
|
.alg = "ansi_cprng",
|
|
|
|
.test = alg_test_cprng,
|
|
|
|
.suite = {
|
2017-01-12 16:40:39 +03:00
|
|
|
.cprng = __VECS(ansi_cprng_aes_tv_template)
|
2009-05-04 15:46:29 +04:00
|
|
|
}
|
2014-03-14 19:46:51 +04:00
|
|
|
}, {
|
|
|
|
.alg = "authenc(hmac(md5),ecb(cipher_null))",
|
|
|
|
.test = alg_test_aead,
|
|
|
|
.suite = {
|
|
|
|
.aead = {
|
2017-01-12 16:40:39 +03:00
|
|
|
.enc = __VECS(hmac_md5_ecb_cipher_null_enc_tv_template),
|
|
|
|
.dec = __VECS(hmac_md5_ecb_cipher_null_dec_tv_template)
|
2014-03-14 19:46:51 +04:00
|
|
|
}
|
|
|
|
}
|
2012-07-03 20:16:54 +04:00
|
|
|
}, {
|
2015-07-30 12:53:23 +03:00
|
|
|
.alg = "authenc(hmac(sha1),cbc(aes))",
|
2012-07-03 20:16:54 +04:00
|
|
|
.test = alg_test_aead,
|
2017-06-28 14:09:07 +03:00
|
|
|
.fips_allowed = 1,
|
2012-07-03 20:16:54 +04:00
|
|
|
.suite = {
|
|
|
|
.aead = {
|
2017-01-12 16:40:39 +03:00
|
|
|
.enc = __VECS(hmac_sha1_aes_cbc_enc_tv_temp)
|
crypto: testmgr - add aead cbc des, des3_ede tests
Test vectors were taken from existing test for
CBC(DES3_EDE). Associated data has been added to test vectors.
HMAC computed with Crypto++ has been used. Following algos have
been covered.
(a) "authenc(hmac(sha1),cbc(des))"
(b) "authenc(hmac(sha1),cbc(des3_ede))"
(c) "authenc(hmac(sha224),cbc(des))"
(d) "authenc(hmac(sha224),cbc(des3_ede))"
(e) "authenc(hmac(sha256),cbc(des))"
(f) "authenc(hmac(sha256),cbc(des3_ede))"
(g) "authenc(hmac(sha384),cbc(des))"
(h) "authenc(hmac(sha384),cbc(des3_ede))"
(i) "authenc(hmac(sha512),cbc(des))"
(j) "authenc(hmac(sha512),cbc(des3_ede))"
Signed-off-by: Vakul Garg <vakul@freescale.com>
[NiteshNarayanLal@freescale.com: added hooks for the missing algorithms test and tested the patch]
Signed-off-by: Nitesh Lal <NiteshNarayanLal@freescale.com>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
2014-05-21 15:39:08 +04:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}, {
|
2015-07-30 12:53:23 +03:00
|
|
|
.alg = "authenc(hmac(sha1),cbc(des))",
|
crypto: testmgr - add aead cbc des, des3_ede tests
Test vectors were taken from existing test for
CBC(DES3_EDE). Associated data has been added to test vectors.
HMAC computed with Crypto++ has been used. Following algos have
been covered.
(a) "authenc(hmac(sha1),cbc(des))"
(b) "authenc(hmac(sha1),cbc(des3_ede))"
(c) "authenc(hmac(sha224),cbc(des))"
(d) "authenc(hmac(sha224),cbc(des3_ede))"
(e) "authenc(hmac(sha256),cbc(des))"
(f) "authenc(hmac(sha256),cbc(des3_ede))"
(g) "authenc(hmac(sha384),cbc(des))"
(h) "authenc(hmac(sha384),cbc(des3_ede))"
(i) "authenc(hmac(sha512),cbc(des))"
(j) "authenc(hmac(sha512),cbc(des3_ede))"
Signed-off-by: Vakul Garg <vakul@freescale.com>
[NiteshNarayanLal@freescale.com: added hooks for the missing algorithms test and tested the patch]
Signed-off-by: Nitesh Lal <NiteshNarayanLal@freescale.com>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
2014-05-21 15:39:08 +04:00
|
|
|
.test = alg_test_aead,
|
|
|
|
.suite = {
|
|
|
|
.aead = {
|
2017-01-12 16:40:39 +03:00
|
|
|
.enc = __VECS(hmac_sha1_des_cbc_enc_tv_temp)
|
crypto: testmgr - add aead cbc des, des3_ede tests
Test vectors were taken from existing test for
CBC(DES3_EDE). Associated data has been added to test vectors.
HMAC computed with Crypto++ has been used. Following algos have
been covered.
(a) "authenc(hmac(sha1),cbc(des))"
(b) "authenc(hmac(sha1),cbc(des3_ede))"
(c) "authenc(hmac(sha224),cbc(des))"
(d) "authenc(hmac(sha224),cbc(des3_ede))"
(e) "authenc(hmac(sha256),cbc(des))"
(f) "authenc(hmac(sha256),cbc(des3_ede))"
(g) "authenc(hmac(sha384),cbc(des))"
(h) "authenc(hmac(sha384),cbc(des3_ede))"
(i) "authenc(hmac(sha512),cbc(des))"
(j) "authenc(hmac(sha512),cbc(des3_ede))"
Signed-off-by: Vakul Garg <vakul@freescale.com>
[NiteshNarayanLal@freescale.com: added hooks for the missing algorithms test and tested the patch]
Signed-off-by: Nitesh Lal <NiteshNarayanLal@freescale.com>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
2014-05-21 15:39:08 +04:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}, {
|
2015-07-30 12:53:23 +03:00
|
|
|
.alg = "authenc(hmac(sha1),cbc(des3_ede))",
|
crypto: testmgr - add aead cbc des, des3_ede tests
Test vectors were taken from existing test for
CBC(DES3_EDE). Associated data has been added to test vectors.
HMAC computed with Crypto++ has been used. Following algos have
been covered.
(a) "authenc(hmac(sha1),cbc(des))"
(b) "authenc(hmac(sha1),cbc(des3_ede))"
(c) "authenc(hmac(sha224),cbc(des))"
(d) "authenc(hmac(sha224),cbc(des3_ede))"
(e) "authenc(hmac(sha256),cbc(des))"
(f) "authenc(hmac(sha256),cbc(des3_ede))"
(g) "authenc(hmac(sha384),cbc(des))"
(h) "authenc(hmac(sha384),cbc(des3_ede))"
(i) "authenc(hmac(sha512),cbc(des))"
(j) "authenc(hmac(sha512),cbc(des3_ede))"
Signed-off-by: Vakul Garg <vakul@freescale.com>
[NiteshNarayanLal@freescale.com: added hooks for the missing algorithms test and tested the patch]
Signed-off-by: Nitesh Lal <NiteshNarayanLal@freescale.com>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
2014-05-21 15:39:08 +04:00
|
|
|
.test = alg_test_aead,
|
2016-02-05 16:23:33 +03:00
|
|
|
.fips_allowed = 1,
|
crypto: testmgr - add aead cbc des, des3_ede tests
Test vectors were taken from existing test for
CBC(DES3_EDE). Associated data has been added to test vectors.
HMAC computed with Crypto++ has been used. Following algos have
been covered.
(a) "authenc(hmac(sha1),cbc(des))"
(b) "authenc(hmac(sha1),cbc(des3_ede))"
(c) "authenc(hmac(sha224),cbc(des))"
(d) "authenc(hmac(sha224),cbc(des3_ede))"
(e) "authenc(hmac(sha256),cbc(des))"
(f) "authenc(hmac(sha256),cbc(des3_ede))"
(g) "authenc(hmac(sha384),cbc(des))"
(h) "authenc(hmac(sha384),cbc(des3_ede))"
(i) "authenc(hmac(sha512),cbc(des))"
(j) "authenc(hmac(sha512),cbc(des3_ede))"
Signed-off-by: Vakul Garg <vakul@freescale.com>
[NiteshNarayanLal@freescale.com: added hooks for the missing algorithms test and tested the patch]
Signed-off-by: Nitesh Lal <NiteshNarayanLal@freescale.com>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
2014-05-21 15:39:08 +04:00
|
|
|
.suite = {
|
|
|
|
.aead = {
|
2017-01-12 16:40:39 +03:00
|
|
|
.enc = __VECS(hmac_sha1_des3_ede_cbc_enc_tv_temp)
|
2012-07-03 20:16:54 +04:00
|
|
|
}
|
|
|
|
}
|
2016-02-06 13:53:07 +03:00
|
|
|
}, {
|
|
|
|
.alg = "authenc(hmac(sha1),ctr(aes))",
|
|
|
|
.test = alg_test_null,
|
|
|
|
.fips_allowed = 1,
|
2014-03-14 19:46:51 +04:00
|
|
|
}, {
|
|
|
|
.alg = "authenc(hmac(sha1),ecb(cipher_null))",
|
|
|
|
.test = alg_test_aead,
|
|
|
|
.suite = {
|
|
|
|
.aead = {
|
2017-01-12 16:40:39 +03:00
|
|
|
.enc = __VECS(hmac_sha1_ecb_cipher_null_enc_tv_temp),
|
|
|
|
.dec = __VECS(hmac_sha1_ecb_cipher_null_dec_tv_temp)
|
crypto: testmgr - add aead cbc des, des3_ede tests
Test vectors were taken from existing test for
CBC(DES3_EDE). Associated data has been added to test vectors.
HMAC computed with Crypto++ has been used. Following algos have
been covered.
(a) "authenc(hmac(sha1),cbc(des))"
(b) "authenc(hmac(sha1),cbc(des3_ede))"
(c) "authenc(hmac(sha224),cbc(des))"
(d) "authenc(hmac(sha224),cbc(des3_ede))"
(e) "authenc(hmac(sha256),cbc(des))"
(f) "authenc(hmac(sha256),cbc(des3_ede))"
(g) "authenc(hmac(sha384),cbc(des))"
(h) "authenc(hmac(sha384),cbc(des3_ede))"
(i) "authenc(hmac(sha512),cbc(des))"
(j) "authenc(hmac(sha512),cbc(des3_ede))"
Signed-off-by: Vakul Garg <vakul@freescale.com>
[NiteshNarayanLal@freescale.com: added hooks for the missing algorithms test and tested the patch]
Signed-off-by: Nitesh Lal <NiteshNarayanLal@freescale.com>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
2014-05-21 15:39:08 +04:00
|
|
|
}
|
|
|
|
}
|
2016-02-19 15:34:28 +03:00
|
|
|
}, {
|
|
|
|
.alg = "authenc(hmac(sha1),rfc3686(ctr(aes)))",
|
|
|
|
.test = alg_test_null,
|
|
|
|
.fips_allowed = 1,
|
crypto: testmgr - add aead cbc des, des3_ede tests
Test vectors were taken from existing test for
CBC(DES3_EDE). Associated data has been added to test vectors.
HMAC computed with Crypto++ has been used. Following algos have
been covered.
(a) "authenc(hmac(sha1),cbc(des))"
(b) "authenc(hmac(sha1),cbc(des3_ede))"
(c) "authenc(hmac(sha224),cbc(des))"
(d) "authenc(hmac(sha224),cbc(des3_ede))"
(e) "authenc(hmac(sha256),cbc(des))"
(f) "authenc(hmac(sha256),cbc(des3_ede))"
(g) "authenc(hmac(sha384),cbc(des))"
(h) "authenc(hmac(sha384),cbc(des3_ede))"
(i) "authenc(hmac(sha512),cbc(des))"
(j) "authenc(hmac(sha512),cbc(des3_ede))"
Signed-off-by: Vakul Garg <vakul@freescale.com>
[NiteshNarayanLal@freescale.com: added hooks for the missing algorithms test and tested the patch]
Signed-off-by: Nitesh Lal <NiteshNarayanLal@freescale.com>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
2014-05-21 15:39:08 +04:00
|
|
|
}, {
|
2015-07-30 12:53:23 +03:00
|
|
|
.alg = "authenc(hmac(sha224),cbc(des))",
|
crypto: testmgr - add aead cbc des, des3_ede tests
Test vectors were taken from existing test for
CBC(DES3_EDE). Associated data has been added to test vectors.
HMAC computed with Crypto++ has been used. Following algos have
been covered.
(a) "authenc(hmac(sha1),cbc(des))"
(b) "authenc(hmac(sha1),cbc(des3_ede))"
(c) "authenc(hmac(sha224),cbc(des))"
(d) "authenc(hmac(sha224),cbc(des3_ede))"
(e) "authenc(hmac(sha256),cbc(des))"
(f) "authenc(hmac(sha256),cbc(des3_ede))"
(g) "authenc(hmac(sha384),cbc(des))"
(h) "authenc(hmac(sha384),cbc(des3_ede))"
(i) "authenc(hmac(sha512),cbc(des))"
(j) "authenc(hmac(sha512),cbc(des3_ede))"
Signed-off-by: Vakul Garg <vakul@freescale.com>
[NiteshNarayanLal@freescale.com: added hooks for the missing algorithms test and tested the patch]
Signed-off-by: Nitesh Lal <NiteshNarayanLal@freescale.com>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
2014-05-21 15:39:08 +04:00
|
|
|
.test = alg_test_aead,
|
|
|
|
.suite = {
|
|
|
|
.aead = {
|
2017-01-12 16:40:39 +03:00
|
|
|
.enc = __VECS(hmac_sha224_des_cbc_enc_tv_temp)
|
crypto: testmgr - add aead cbc des, des3_ede tests
Test vectors were taken from existing test for
CBC(DES3_EDE). Associated data has been added to test vectors.
HMAC computed with Crypto++ has been used. Following algos have
been covered.
(a) "authenc(hmac(sha1),cbc(des))"
(b) "authenc(hmac(sha1),cbc(des3_ede))"
(c) "authenc(hmac(sha224),cbc(des))"
(d) "authenc(hmac(sha224),cbc(des3_ede))"
(e) "authenc(hmac(sha256),cbc(des))"
(f) "authenc(hmac(sha256),cbc(des3_ede))"
(g) "authenc(hmac(sha384),cbc(des))"
(h) "authenc(hmac(sha384),cbc(des3_ede))"
(i) "authenc(hmac(sha512),cbc(des))"
(j) "authenc(hmac(sha512),cbc(des3_ede))"
Signed-off-by: Vakul Garg <vakul@freescale.com>
[NiteshNarayanLal@freescale.com: added hooks for the missing algorithms test and tested the patch]
Signed-off-by: Nitesh Lal <NiteshNarayanLal@freescale.com>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
2014-05-21 15:39:08 +04:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}, {
|
2015-07-30 12:53:23 +03:00
|
|
|
.alg = "authenc(hmac(sha224),cbc(des3_ede))",
|
crypto: testmgr - add aead cbc des, des3_ede tests
Test vectors were taken from existing test for
CBC(DES3_EDE). Associated data has been added to test vectors.
HMAC computed with Crypto++ has been used. Following algos have
been covered.
(a) "authenc(hmac(sha1),cbc(des))"
(b) "authenc(hmac(sha1),cbc(des3_ede))"
(c) "authenc(hmac(sha224),cbc(des))"
(d) "authenc(hmac(sha224),cbc(des3_ede))"
(e) "authenc(hmac(sha256),cbc(des))"
(f) "authenc(hmac(sha256),cbc(des3_ede))"
(g) "authenc(hmac(sha384),cbc(des))"
(h) "authenc(hmac(sha384),cbc(des3_ede))"
(i) "authenc(hmac(sha512),cbc(des))"
(j) "authenc(hmac(sha512),cbc(des3_ede))"
Signed-off-by: Vakul Garg <vakul@freescale.com>
[NiteshNarayanLal@freescale.com: added hooks for the missing algorithms test and tested the patch]
Signed-off-by: Nitesh Lal <NiteshNarayanLal@freescale.com>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
2014-05-21 15:39:08 +04:00
|
|
|
.test = alg_test_aead,
|
2016-02-05 16:23:33 +03:00
|
|
|
.fips_allowed = 1,
|
crypto: testmgr - add aead cbc des, des3_ede tests
Test vectors were taken from existing test for
CBC(DES3_EDE). Associated data has been added to test vectors.
HMAC computed with Crypto++ has been used. Following algos have
been covered.
(a) "authenc(hmac(sha1),cbc(des))"
(b) "authenc(hmac(sha1),cbc(des3_ede))"
(c) "authenc(hmac(sha224),cbc(des))"
(d) "authenc(hmac(sha224),cbc(des3_ede))"
(e) "authenc(hmac(sha256),cbc(des))"
(f) "authenc(hmac(sha256),cbc(des3_ede))"
(g) "authenc(hmac(sha384),cbc(des))"
(h) "authenc(hmac(sha384),cbc(des3_ede))"
(i) "authenc(hmac(sha512),cbc(des))"
(j) "authenc(hmac(sha512),cbc(des3_ede))"
Signed-off-by: Vakul Garg <vakul@freescale.com>
[NiteshNarayanLal@freescale.com: added hooks for the missing algorithms test and tested the patch]
Signed-off-by: Nitesh Lal <NiteshNarayanLal@freescale.com>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
2014-05-21 15:39:08 +04:00
|
|
|
.suite = {
|
|
|
|
.aead = {
|
2017-01-12 16:40:39 +03:00
|
|
|
.enc = __VECS(hmac_sha224_des3_ede_cbc_enc_tv_temp)
|
2014-03-14 19:46:51 +04:00
|
|
|
}
|
|
|
|
}
|
2012-07-03 20:16:54 +04:00
|
|
|
}, {
|
2015-07-30 12:53:23 +03:00
|
|
|
.alg = "authenc(hmac(sha256),cbc(aes))",
|
2012-07-03 20:16:54 +04:00
|
|
|
.test = alg_test_aead,
|
2016-02-05 16:23:33 +03:00
|
|
|
.fips_allowed = 1,
|
2012-07-03 20:16:54 +04:00
|
|
|
.suite = {
|
|
|
|
.aead = {
|
2017-01-12 16:40:39 +03:00
|
|
|
.enc = __VECS(hmac_sha256_aes_cbc_enc_tv_temp)
|
crypto: testmgr - add aead cbc des, des3_ede tests
Test vectors were taken from existing test for
CBC(DES3_EDE). Associated data has been added to test vectors.
HMAC computed with Crypto++ has been used. Following algos have
been covered.
(a) "authenc(hmac(sha1),cbc(des))"
(b) "authenc(hmac(sha1),cbc(des3_ede))"
(c) "authenc(hmac(sha224),cbc(des))"
(d) "authenc(hmac(sha224),cbc(des3_ede))"
(e) "authenc(hmac(sha256),cbc(des))"
(f) "authenc(hmac(sha256),cbc(des3_ede))"
(g) "authenc(hmac(sha384),cbc(des))"
(h) "authenc(hmac(sha384),cbc(des3_ede))"
(i) "authenc(hmac(sha512),cbc(des))"
(j) "authenc(hmac(sha512),cbc(des3_ede))"
Signed-off-by: Vakul Garg <vakul@freescale.com>
[NiteshNarayanLal@freescale.com: added hooks for the missing algorithms test and tested the patch]
Signed-off-by: Nitesh Lal <NiteshNarayanLal@freescale.com>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
2014-05-21 15:39:08 +04:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}, {
|
2015-07-30 12:53:23 +03:00
|
|
|
.alg = "authenc(hmac(sha256),cbc(des))",
|
crypto: testmgr - add aead cbc des, des3_ede tests
Test vectors were taken from existing test for
CBC(DES3_EDE). Associated data has been added to test vectors.
HMAC computed with Crypto++ has been used. Following algos have
been covered.
(a) "authenc(hmac(sha1),cbc(des))"
(b) "authenc(hmac(sha1),cbc(des3_ede))"
(c) "authenc(hmac(sha224),cbc(des))"
(d) "authenc(hmac(sha224),cbc(des3_ede))"
(e) "authenc(hmac(sha256),cbc(des))"
(f) "authenc(hmac(sha256),cbc(des3_ede))"
(g) "authenc(hmac(sha384),cbc(des))"
(h) "authenc(hmac(sha384),cbc(des3_ede))"
(i) "authenc(hmac(sha512),cbc(des))"
(j) "authenc(hmac(sha512),cbc(des3_ede))"
Signed-off-by: Vakul Garg <vakul@freescale.com>
[NiteshNarayanLal@freescale.com: added hooks for the missing algorithms test and tested the patch]
Signed-off-by: Nitesh Lal <NiteshNarayanLal@freescale.com>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
2014-05-21 15:39:08 +04:00
|
|
|
.test = alg_test_aead,
|
|
|
|
.suite = {
|
|
|
|
.aead = {
|
2017-01-12 16:40:39 +03:00
|
|
|
.enc = __VECS(hmac_sha256_des_cbc_enc_tv_temp)
|
crypto: testmgr - add aead cbc des, des3_ede tests
Test vectors were taken from existing test for
CBC(DES3_EDE). Associated data has been added to test vectors.
HMAC computed with Crypto++ has been used. Following algos have
been covered.
(a) "authenc(hmac(sha1),cbc(des))"
(b) "authenc(hmac(sha1),cbc(des3_ede))"
(c) "authenc(hmac(sha224),cbc(des))"
(d) "authenc(hmac(sha224),cbc(des3_ede))"
(e) "authenc(hmac(sha256),cbc(des))"
(f) "authenc(hmac(sha256),cbc(des3_ede))"
(g) "authenc(hmac(sha384),cbc(des))"
(h) "authenc(hmac(sha384),cbc(des3_ede))"
(i) "authenc(hmac(sha512),cbc(des))"
(j) "authenc(hmac(sha512),cbc(des3_ede))"
Signed-off-by: Vakul Garg <vakul@freescale.com>
[NiteshNarayanLal@freescale.com: added hooks for the missing algorithms test and tested the patch]
Signed-off-by: Nitesh Lal <NiteshNarayanLal@freescale.com>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
2014-05-21 15:39:08 +04:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}, {
|
2015-07-30 12:53:23 +03:00
|
|
|
.alg = "authenc(hmac(sha256),cbc(des3_ede))",
|
crypto: testmgr - add aead cbc des, des3_ede tests
Test vectors were taken from existing test for
CBC(DES3_EDE). Associated data has been added to test vectors.
HMAC computed with Crypto++ has been used. Following algos have
been covered.
(a) "authenc(hmac(sha1),cbc(des))"
(b) "authenc(hmac(sha1),cbc(des3_ede))"
(c) "authenc(hmac(sha224),cbc(des))"
(d) "authenc(hmac(sha224),cbc(des3_ede))"
(e) "authenc(hmac(sha256),cbc(des))"
(f) "authenc(hmac(sha256),cbc(des3_ede))"
(g) "authenc(hmac(sha384),cbc(des))"
(h) "authenc(hmac(sha384),cbc(des3_ede))"
(i) "authenc(hmac(sha512),cbc(des))"
(j) "authenc(hmac(sha512),cbc(des3_ede))"
Signed-off-by: Vakul Garg <vakul@freescale.com>
[NiteshNarayanLal@freescale.com: added hooks for the missing algorithms test and tested the patch]
Signed-off-by: Nitesh Lal <NiteshNarayanLal@freescale.com>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
2014-05-21 15:39:08 +04:00
|
|
|
.test = alg_test_aead,
|
2016-02-05 16:23:33 +03:00
|
|
|
.fips_allowed = 1,
|
crypto: testmgr - add aead cbc des, des3_ede tests
Test vectors were taken from existing test for
CBC(DES3_EDE). Associated data has been added to test vectors.
HMAC computed with Crypto++ has been used. Following algos have
been covered.
(a) "authenc(hmac(sha1),cbc(des))"
(b) "authenc(hmac(sha1),cbc(des3_ede))"
(c) "authenc(hmac(sha224),cbc(des))"
(d) "authenc(hmac(sha224),cbc(des3_ede))"
(e) "authenc(hmac(sha256),cbc(des))"
(f) "authenc(hmac(sha256),cbc(des3_ede))"
(g) "authenc(hmac(sha384),cbc(des))"
(h) "authenc(hmac(sha384),cbc(des3_ede))"
(i) "authenc(hmac(sha512),cbc(des))"
(j) "authenc(hmac(sha512),cbc(des3_ede))"
Signed-off-by: Vakul Garg <vakul@freescale.com>
[NiteshNarayanLal@freescale.com: added hooks for the missing algorithms test and tested the patch]
Signed-off-by: Nitesh Lal <NiteshNarayanLal@freescale.com>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
2014-05-21 15:39:08 +04:00
|
|
|
.suite = {
|
|
|
|
.aead = {
|
2017-01-12 16:40:39 +03:00
|
|
|
.enc = __VECS(hmac_sha256_des3_ede_cbc_enc_tv_temp)
|
crypto: testmgr - add aead cbc des, des3_ede tests
Test vectors were taken from existing test for
CBC(DES3_EDE). Associated data has been added to test vectors.
HMAC computed with Crypto++ has been used. Following algos have
been covered.
(a) "authenc(hmac(sha1),cbc(des))"
(b) "authenc(hmac(sha1),cbc(des3_ede))"
(c) "authenc(hmac(sha224),cbc(des))"
(d) "authenc(hmac(sha224),cbc(des3_ede))"
(e) "authenc(hmac(sha256),cbc(des))"
(f) "authenc(hmac(sha256),cbc(des3_ede))"
(g) "authenc(hmac(sha384),cbc(des))"
(h) "authenc(hmac(sha384),cbc(des3_ede))"
(i) "authenc(hmac(sha512),cbc(des))"
(j) "authenc(hmac(sha512),cbc(des3_ede))"
Signed-off-by: Vakul Garg <vakul@freescale.com>
[NiteshNarayanLal@freescale.com: added hooks for the missing algorithms test and tested the patch]
Signed-off-by: Nitesh Lal <NiteshNarayanLal@freescale.com>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
2014-05-21 15:39:08 +04:00
|
|
|
}
|
|
|
|
}
|
2016-02-06 13:53:07 +03:00
|
|
|
}, {
|
|
|
|
.alg = "authenc(hmac(sha256),ctr(aes))",
|
|
|
|
.test = alg_test_null,
|
|
|
|
.fips_allowed = 1,
|
2016-02-19 15:34:28 +03:00
|
|
|
}, {
|
|
|
|
.alg = "authenc(hmac(sha256),rfc3686(ctr(aes)))",
|
|
|
|
.test = alg_test_null,
|
|
|
|
.fips_allowed = 1,
|
crypto: testmgr - add aead cbc des, des3_ede tests
Test vectors were taken from existing test for
CBC(DES3_EDE). Associated data has been added to test vectors.
HMAC computed with Crypto++ has been used. Following algos have
been covered.
(a) "authenc(hmac(sha1),cbc(des))"
(b) "authenc(hmac(sha1),cbc(des3_ede))"
(c) "authenc(hmac(sha224),cbc(des))"
(d) "authenc(hmac(sha224),cbc(des3_ede))"
(e) "authenc(hmac(sha256),cbc(des))"
(f) "authenc(hmac(sha256),cbc(des3_ede))"
(g) "authenc(hmac(sha384),cbc(des))"
(h) "authenc(hmac(sha384),cbc(des3_ede))"
(i) "authenc(hmac(sha512),cbc(des))"
(j) "authenc(hmac(sha512),cbc(des3_ede))"
Signed-off-by: Vakul Garg <vakul@freescale.com>
[NiteshNarayanLal@freescale.com: added hooks for the missing algorithms test and tested the patch]
Signed-off-by: Nitesh Lal <NiteshNarayanLal@freescale.com>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
2014-05-21 15:39:08 +04:00
|
|
|
}, {
|
2015-07-30 12:53:23 +03:00
|
|
|
.alg = "authenc(hmac(sha384),cbc(des))",
|
crypto: testmgr - add aead cbc des, des3_ede tests
Test vectors were taken from existing test for
CBC(DES3_EDE). Associated data has been added to test vectors.
HMAC computed with Crypto++ has been used. Following algos have
been covered.
(a) "authenc(hmac(sha1),cbc(des))"
(b) "authenc(hmac(sha1),cbc(des3_ede))"
(c) "authenc(hmac(sha224),cbc(des))"
(d) "authenc(hmac(sha224),cbc(des3_ede))"
(e) "authenc(hmac(sha256),cbc(des))"
(f) "authenc(hmac(sha256),cbc(des3_ede))"
(g) "authenc(hmac(sha384),cbc(des))"
(h) "authenc(hmac(sha384),cbc(des3_ede))"
(i) "authenc(hmac(sha512),cbc(des))"
(j) "authenc(hmac(sha512),cbc(des3_ede))"
Signed-off-by: Vakul Garg <vakul@freescale.com>
[NiteshNarayanLal@freescale.com: added hooks for the missing algorithms test and tested the patch]
Signed-off-by: Nitesh Lal <NiteshNarayanLal@freescale.com>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
2014-05-21 15:39:08 +04:00
|
|
|
.test = alg_test_aead,
|
|
|
|
.suite = {
|
|
|
|
.aead = {
|
2017-01-12 16:40:39 +03:00
|
|
|
.enc = __VECS(hmac_sha384_des_cbc_enc_tv_temp)
|
crypto: testmgr - add aead cbc des, des3_ede tests
Test vectors were taken from existing test for
CBC(DES3_EDE). Associated data has been added to test vectors.
HMAC computed with Crypto++ has been used. Following algos have
been covered.
(a) "authenc(hmac(sha1),cbc(des))"
(b) "authenc(hmac(sha1),cbc(des3_ede))"
(c) "authenc(hmac(sha224),cbc(des))"
(d) "authenc(hmac(sha224),cbc(des3_ede))"
(e) "authenc(hmac(sha256),cbc(des))"
(f) "authenc(hmac(sha256),cbc(des3_ede))"
(g) "authenc(hmac(sha384),cbc(des))"
(h) "authenc(hmac(sha384),cbc(des3_ede))"
(i) "authenc(hmac(sha512),cbc(des))"
(j) "authenc(hmac(sha512),cbc(des3_ede))"
Signed-off-by: Vakul Garg <vakul@freescale.com>
[NiteshNarayanLal@freescale.com: added hooks for the missing algorithms test and tested the patch]
Signed-off-by: Nitesh Lal <NiteshNarayanLal@freescale.com>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
2014-05-21 15:39:08 +04:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}, {
|
2015-07-30 12:53:23 +03:00
|
|
|
.alg = "authenc(hmac(sha384),cbc(des3_ede))",
|
crypto: testmgr - add aead cbc des, des3_ede tests
Test vectors were taken from existing test for
CBC(DES3_EDE). Associated data has been added to test vectors.
HMAC computed with Crypto++ has been used. Following algos have
been covered.
(a) "authenc(hmac(sha1),cbc(des))"
(b) "authenc(hmac(sha1),cbc(des3_ede))"
(c) "authenc(hmac(sha224),cbc(des))"
(d) "authenc(hmac(sha224),cbc(des3_ede))"
(e) "authenc(hmac(sha256),cbc(des))"
(f) "authenc(hmac(sha256),cbc(des3_ede))"
(g) "authenc(hmac(sha384),cbc(des))"
(h) "authenc(hmac(sha384),cbc(des3_ede))"
(i) "authenc(hmac(sha512),cbc(des))"
(j) "authenc(hmac(sha512),cbc(des3_ede))"
Signed-off-by: Vakul Garg <vakul@freescale.com>
[NiteshNarayanLal@freescale.com: added hooks for the missing algorithms test and tested the patch]
Signed-off-by: Nitesh Lal <NiteshNarayanLal@freescale.com>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
2014-05-21 15:39:08 +04:00
|
|
|
.test = alg_test_aead,
|
2016-02-05 16:23:33 +03:00
|
|
|
.fips_allowed = 1,
|
crypto: testmgr - add aead cbc des, des3_ede tests
Test vectors were taken from existing test for
CBC(DES3_EDE). Associated data has been added to test vectors.
HMAC computed with Crypto++ has been used. Following algos have
been covered.
(a) "authenc(hmac(sha1),cbc(des))"
(b) "authenc(hmac(sha1),cbc(des3_ede))"
(c) "authenc(hmac(sha224),cbc(des))"
(d) "authenc(hmac(sha224),cbc(des3_ede))"
(e) "authenc(hmac(sha256),cbc(des))"
(f) "authenc(hmac(sha256),cbc(des3_ede))"
(g) "authenc(hmac(sha384),cbc(des))"
(h) "authenc(hmac(sha384),cbc(des3_ede))"
(i) "authenc(hmac(sha512),cbc(des))"
(j) "authenc(hmac(sha512),cbc(des3_ede))"
Signed-off-by: Vakul Garg <vakul@freescale.com>
[NiteshNarayanLal@freescale.com: added hooks for the missing algorithms test and tested the patch]
Signed-off-by: Nitesh Lal <NiteshNarayanLal@freescale.com>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
2014-05-21 15:39:08 +04:00
|
|
|
.suite = {
|
|
|
|
.aead = {
|
2017-01-12 16:40:39 +03:00
|
|
|
.enc = __VECS(hmac_sha384_des3_ede_cbc_enc_tv_temp)
|
2012-07-03 20:16:54 +04:00
|
|
|
}
|
|
|
|
}
|
2016-02-06 13:53:07 +03:00
|
|
|
}, {
|
|
|
|
.alg = "authenc(hmac(sha384),ctr(aes))",
|
|
|
|
.test = alg_test_null,
|
|
|
|
.fips_allowed = 1,
|
2016-02-19 15:34:28 +03:00
|
|
|
}, {
|
|
|
|
.alg = "authenc(hmac(sha384),rfc3686(ctr(aes)))",
|
|
|
|
.test = alg_test_null,
|
|
|
|
.fips_allowed = 1,
|
2012-07-03 20:16:54 +04:00
|
|
|
}, {
|
2015-07-30 12:53:23 +03:00
|
|
|
.alg = "authenc(hmac(sha512),cbc(aes))",
|
2016-02-05 16:23:33 +03:00
|
|
|
.fips_allowed = 1,
|
2012-07-03 20:16:54 +04:00
|
|
|
.test = alg_test_aead,
|
|
|
|
.suite = {
|
|
|
|
.aead = {
|
2017-01-12 16:40:39 +03:00
|
|
|
.enc = __VECS(hmac_sha512_aes_cbc_enc_tv_temp)
|
crypto: testmgr - add aead cbc des, des3_ede tests
Test vectors were taken from existing test for
CBC(DES3_EDE). Associated data has been added to test vectors.
HMAC computed with Crypto++ has been used. Following algos have
been covered.
(a) "authenc(hmac(sha1),cbc(des))"
(b) "authenc(hmac(sha1),cbc(des3_ede))"
(c) "authenc(hmac(sha224),cbc(des))"
(d) "authenc(hmac(sha224),cbc(des3_ede))"
(e) "authenc(hmac(sha256),cbc(des))"
(f) "authenc(hmac(sha256),cbc(des3_ede))"
(g) "authenc(hmac(sha384),cbc(des))"
(h) "authenc(hmac(sha384),cbc(des3_ede))"
(i) "authenc(hmac(sha512),cbc(des))"
(j) "authenc(hmac(sha512),cbc(des3_ede))"
Signed-off-by: Vakul Garg <vakul@freescale.com>
[NiteshNarayanLal@freescale.com: added hooks for the missing algorithms test and tested the patch]
Signed-off-by: Nitesh Lal <NiteshNarayanLal@freescale.com>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
2014-05-21 15:39:08 +04:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}, {
|
2015-07-30 12:53:23 +03:00
|
|
|
.alg = "authenc(hmac(sha512),cbc(des))",
|
crypto: testmgr - add aead cbc des, des3_ede tests
Test vectors were taken from existing test for
CBC(DES3_EDE). Associated data has been added to test vectors.
HMAC computed with Crypto++ has been used. Following algos have
been covered.
(a) "authenc(hmac(sha1),cbc(des))"
(b) "authenc(hmac(sha1),cbc(des3_ede))"
(c) "authenc(hmac(sha224),cbc(des))"
(d) "authenc(hmac(sha224),cbc(des3_ede))"
(e) "authenc(hmac(sha256),cbc(des))"
(f) "authenc(hmac(sha256),cbc(des3_ede))"
(g) "authenc(hmac(sha384),cbc(des))"
(h) "authenc(hmac(sha384),cbc(des3_ede))"
(i) "authenc(hmac(sha512),cbc(des))"
(j) "authenc(hmac(sha512),cbc(des3_ede))"
Signed-off-by: Vakul Garg <vakul@freescale.com>
[NiteshNarayanLal@freescale.com: added hooks for the missing algorithms test and tested the patch]
Signed-off-by: Nitesh Lal <NiteshNarayanLal@freescale.com>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
2014-05-21 15:39:08 +04:00
|
|
|
.test = alg_test_aead,
|
|
|
|
.suite = {
|
|
|
|
.aead = {
|
2017-01-12 16:40:39 +03:00
|
|
|
.enc = __VECS(hmac_sha512_des_cbc_enc_tv_temp)
|
crypto: testmgr - add aead cbc des, des3_ede tests
Test vectors were taken from existing test for
CBC(DES3_EDE). Associated data has been added to test vectors.
HMAC computed with Crypto++ has been used. Following algos have
been covered.
(a) "authenc(hmac(sha1),cbc(des))"
(b) "authenc(hmac(sha1),cbc(des3_ede))"
(c) "authenc(hmac(sha224),cbc(des))"
(d) "authenc(hmac(sha224),cbc(des3_ede))"
(e) "authenc(hmac(sha256),cbc(des))"
(f) "authenc(hmac(sha256),cbc(des3_ede))"
(g) "authenc(hmac(sha384),cbc(des))"
(h) "authenc(hmac(sha384),cbc(des3_ede))"
(i) "authenc(hmac(sha512),cbc(des))"
(j) "authenc(hmac(sha512),cbc(des3_ede))"
Signed-off-by: Vakul Garg <vakul@freescale.com>
[NiteshNarayanLal@freescale.com: added hooks for the missing algorithms test and tested the patch]
Signed-off-by: Nitesh Lal <NiteshNarayanLal@freescale.com>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
2014-05-21 15:39:08 +04:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}, {
|
2015-07-30 12:53:23 +03:00
|
|
|
.alg = "authenc(hmac(sha512),cbc(des3_ede))",
|
crypto: testmgr - add aead cbc des, des3_ede tests
Test vectors were taken from existing test for
CBC(DES3_EDE). Associated data has been added to test vectors.
HMAC computed with Crypto++ has been used. Following algos have
been covered.
(a) "authenc(hmac(sha1),cbc(des))"
(b) "authenc(hmac(sha1),cbc(des3_ede))"
(c) "authenc(hmac(sha224),cbc(des))"
(d) "authenc(hmac(sha224),cbc(des3_ede))"
(e) "authenc(hmac(sha256),cbc(des))"
(f) "authenc(hmac(sha256),cbc(des3_ede))"
(g) "authenc(hmac(sha384),cbc(des))"
(h) "authenc(hmac(sha384),cbc(des3_ede))"
(i) "authenc(hmac(sha512),cbc(des))"
(j) "authenc(hmac(sha512),cbc(des3_ede))"
Signed-off-by: Vakul Garg <vakul@freescale.com>
[NiteshNarayanLal@freescale.com: added hooks for the missing algorithms test and tested the patch]
Signed-off-by: Nitesh Lal <NiteshNarayanLal@freescale.com>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
2014-05-21 15:39:08 +04:00
|
|
|
.test = alg_test_aead,
|
2016-02-05 16:23:33 +03:00
|
|
|
.fips_allowed = 1,
|
crypto: testmgr - add aead cbc des, des3_ede tests
Test vectors were taken from existing test for
CBC(DES3_EDE). Associated data has been added to test vectors.
HMAC computed with Crypto++ has been used. Following algos have
been covered.
(a) "authenc(hmac(sha1),cbc(des))"
(b) "authenc(hmac(sha1),cbc(des3_ede))"
(c) "authenc(hmac(sha224),cbc(des))"
(d) "authenc(hmac(sha224),cbc(des3_ede))"
(e) "authenc(hmac(sha256),cbc(des))"
(f) "authenc(hmac(sha256),cbc(des3_ede))"
(g) "authenc(hmac(sha384),cbc(des))"
(h) "authenc(hmac(sha384),cbc(des3_ede))"
(i) "authenc(hmac(sha512),cbc(des))"
(j) "authenc(hmac(sha512),cbc(des3_ede))"
Signed-off-by: Vakul Garg <vakul@freescale.com>
[NiteshNarayanLal@freescale.com: added hooks for the missing algorithms test and tested the patch]
Signed-off-by: Nitesh Lal <NiteshNarayanLal@freescale.com>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
2014-05-21 15:39:08 +04:00
|
|
|
.suite = {
|
|
|
|
.aead = {
|
2017-01-12 16:40:39 +03:00
|
|
|
.enc = __VECS(hmac_sha512_des3_ede_cbc_enc_tv_temp)
|
2012-07-03 20:16:54 +04:00
|
|
|
}
|
|
|
|
}
|
2016-02-06 13:53:07 +03:00
|
|
|
}, {
|
|
|
|
.alg = "authenc(hmac(sha512),ctr(aes))",
|
|
|
|
.test = alg_test_null,
|
|
|
|
.fips_allowed = 1,
|
2016-02-19 15:34:28 +03:00
|
|
|
}, {
|
|
|
|
.alg = "authenc(hmac(sha512),rfc3686(ctr(aes)))",
|
|
|
|
.test = alg_test_null,
|
|
|
|
.fips_allowed = 1,
|
2009-05-04 15:46:29 +04:00
|
|
|
}, {
|
2008-07-31 13:08:25 +04:00
|
|
|
.alg = "cbc(aes)",
|
2008-08-17 11:01:56 +04:00
|
|
|
.test = alg_test_skcipher,
|
2009-05-15 09:16:03 +04:00
|
|
|
.fips_allowed = 1,
|
2008-07-31 13:08:25 +04:00
|
|
|
.suite = {
|
crypto: testmgr - eliminate redundant decryption test vectors
Currently testmgr has separate encryption and decryption test vectors
for symmetric ciphers. That's massively redundant, since with few
exceptions (mostly mistakes, apparently), all decryption tests are
identical to the encryption tests, just with the input/result flipped.
Therefore, eliminate the redundancy by removing the decryption test
vectors and updating testmgr to test both encryption and decryption
using what used to be the encryption test vectors. Naming is adjusted
accordingly: each cipher_testvec now has a 'ptext' (plaintext), 'ctext'
(ciphertext), and 'len' instead of an 'input', 'result', 'ilen', and
'rlen'. Note that it was always the case that 'ilen == rlen'.
AES keywrap ("kw(aes)") is special because its IV is generated by the
encryption. Previously this was handled by specifying 'iv_out' for
encryption and 'iv' for decryption. To make it work cleanly with only
one set of test vectors, put the IV in 'iv', remove 'iv_out', and add a
boolean that indicates that the IV is generated by the encryption.
In total, this removes over 10000 lines from testmgr.h, with no
reduction in test coverage since prior patches already copied the few
unique decryption test vectors into the encryption test vectors.
This covers all algorithms that used 'struct cipher_testvec', e.g. any
block cipher in the ECB, CBC, CTR, XTS, LRW, CTS-CBC, PCBC, OFB, or
keywrap modes, and Salsa20 and ChaCha20. No change is made to AEAD
tests, though we probably can eliminate a similar redundancy there too.
The testmgr.h portion of this patch was automatically generated using
the following awk script, with some slight manual fixups on top (updated
'struct cipher_testvec' definition, updated a few comments, and fixed up
the AES keywrap test vectors):
BEGIN { OTHER = 0; ENCVEC = 1; DECVEC = 2; DECVEC_TAIL = 3; mode = OTHER }
/^static const struct cipher_testvec.*_enc_/ { sub("_enc", ""); mode = ENCVEC }
/^static const struct cipher_testvec.*_dec_/ { mode = DECVEC }
mode == ENCVEC && !/\.ilen[[:space:]]*=/ {
sub(/\.input[[:space:]]*=$/, ".ptext =")
sub(/\.input[[:space:]]*=/, ".ptext\t=")
sub(/\.result[[:space:]]*=$/, ".ctext =")
sub(/\.result[[:space:]]*=/, ".ctext\t=")
sub(/\.rlen[[:space:]]*=/, ".len\t=")
print
}
mode == DECVEC_TAIL && /[^[:space:]]/ { mode = OTHER }
mode == OTHER { print }
mode == ENCVEC && /^};/ { mode = OTHER }
mode == DECVEC && /^};/ { mode = DECVEC_TAIL }
Note that git's default diff algorithm gets confused by the testmgr.h
portion of this patch, and reports too many lines added and removed.
It's better viewed with 'git diff --minimal' (or 'git show --minimal'),
which reports "2 files changed, 919 insertions(+), 11723 deletions(-)".
Signed-off-by: Eric Biggers <ebiggers@google.com>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
2018-05-21 08:50:29 +03:00
|
|
|
.cipher = __VECS(aes_cbc_tv_template)
|
|
|
|
},
|
2008-07-31 13:08:25 +04:00
|
|
|
}, {
|
|
|
|
.alg = "cbc(anubis)",
|
2008-08-17 11:01:56 +04:00
|
|
|
.test = alg_test_skcipher,
|
2008-07-31 13:08:25 +04:00
|
|
|
.suite = {
|
crypto: testmgr - eliminate redundant decryption test vectors
Currently testmgr has separate encryption and decryption test vectors
for symmetric ciphers. That's massively redundant, since with few
exceptions (mostly mistakes, apparently), all decryption tests are
identical to the encryption tests, just with the input/result flipped.
Therefore, eliminate the redundancy by removing the decryption test
vectors and updating testmgr to test both encryption and decryption
using what used to be the encryption test vectors. Naming is adjusted
accordingly: each cipher_testvec now has a 'ptext' (plaintext), 'ctext'
(ciphertext), and 'len' instead of an 'input', 'result', 'ilen', and
'rlen'. Note that it was always the case that 'ilen == rlen'.
AES keywrap ("kw(aes)") is special because its IV is generated by the
encryption. Previously this was handled by specifying 'iv_out' for
encryption and 'iv' for decryption. To make it work cleanly with only
one set of test vectors, put the IV in 'iv', remove 'iv_out', and add a
boolean that indicates that the IV is generated by the encryption.
In total, this removes over 10000 lines from testmgr.h, with no
reduction in test coverage since prior patches already copied the few
unique decryption test vectors into the encryption test vectors.
This covers all algorithms that used 'struct cipher_testvec', e.g. any
block cipher in the ECB, CBC, CTR, XTS, LRW, CTS-CBC, PCBC, OFB, or
keywrap modes, and Salsa20 and ChaCha20. No change is made to AEAD
tests, though we probably can eliminate a similar redundancy there too.
The testmgr.h portion of this patch was automatically generated using
the following awk script, with some slight manual fixups on top (updated
'struct cipher_testvec' definition, updated a few comments, and fixed up
the AES keywrap test vectors):
BEGIN { OTHER = 0; ENCVEC = 1; DECVEC = 2; DECVEC_TAIL = 3; mode = OTHER }
/^static const struct cipher_testvec.*_enc_/ { sub("_enc", ""); mode = ENCVEC }
/^static const struct cipher_testvec.*_dec_/ { mode = DECVEC }
mode == ENCVEC && !/\.ilen[[:space:]]*=/ {
sub(/\.input[[:space:]]*=$/, ".ptext =")
sub(/\.input[[:space:]]*=/, ".ptext\t=")
sub(/\.result[[:space:]]*=$/, ".ctext =")
sub(/\.result[[:space:]]*=/, ".ctext\t=")
sub(/\.rlen[[:space:]]*=/, ".len\t=")
print
}
mode == DECVEC_TAIL && /[^[:space:]]/ { mode = OTHER }
mode == OTHER { print }
mode == ENCVEC && /^};/ { mode = OTHER }
mode == DECVEC && /^};/ { mode = DECVEC_TAIL }
Note that git's default diff algorithm gets confused by the testmgr.h
portion of this patch, and reports too many lines added and removed.
It's better viewed with 'git diff --minimal' (or 'git show --minimal'),
which reports "2 files changed, 919 insertions(+), 11723 deletions(-)".
Signed-off-by: Eric Biggers <ebiggers@google.com>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
2018-05-21 08:50:29 +03:00
|
|
|
.cipher = __VECS(anubis_cbc_tv_template)
|
|
|
|
},
|
2008-07-31 13:08:25 +04:00
|
|
|
}, {
|
|
|
|
.alg = "cbc(blowfish)",
|
2008-08-17 11:01:56 +04:00
|
|
|
.test = alg_test_skcipher,
|
2008-07-31 13:08:25 +04:00
|
|
|
.suite = {
|
crypto: testmgr - eliminate redundant decryption test vectors
Currently testmgr has separate encryption and decryption test vectors
for symmetric ciphers. That's massively redundant, since with few
exceptions (mostly mistakes, apparently), all decryption tests are
identical to the encryption tests, just with the input/result flipped.
Therefore, eliminate the redundancy by removing the decryption test
vectors and updating testmgr to test both encryption and decryption
using what used to be the encryption test vectors. Naming is adjusted
accordingly: each cipher_testvec now has a 'ptext' (plaintext), 'ctext'
(ciphertext), and 'len' instead of an 'input', 'result', 'ilen', and
'rlen'. Note that it was always the case that 'ilen == rlen'.
AES keywrap ("kw(aes)") is special because its IV is generated by the
encryption. Previously this was handled by specifying 'iv_out' for
encryption and 'iv' for decryption. To make it work cleanly with only
one set of test vectors, put the IV in 'iv', remove 'iv_out', and add a
boolean that indicates that the IV is generated by the encryption.
In total, this removes over 10000 lines from testmgr.h, with no
reduction in test coverage since prior patches already copied the few
unique decryption test vectors into the encryption test vectors.
This covers all algorithms that used 'struct cipher_testvec', e.g. any
block cipher in the ECB, CBC, CTR, XTS, LRW, CTS-CBC, PCBC, OFB, or
keywrap modes, and Salsa20 and ChaCha20. No change is made to AEAD
tests, though we probably can eliminate a similar redundancy there too.
The testmgr.h portion of this patch was automatically generated using
the following awk script, with some slight manual fixups on top (updated
'struct cipher_testvec' definition, updated a few comments, and fixed up
the AES keywrap test vectors):
BEGIN { OTHER = 0; ENCVEC = 1; DECVEC = 2; DECVEC_TAIL = 3; mode = OTHER }
/^static const struct cipher_testvec.*_enc_/ { sub("_enc", ""); mode = ENCVEC }
/^static const struct cipher_testvec.*_dec_/ { mode = DECVEC }
mode == ENCVEC && !/\.ilen[[:space:]]*=/ {
sub(/\.input[[:space:]]*=$/, ".ptext =")
sub(/\.input[[:space:]]*=/, ".ptext\t=")
sub(/\.result[[:space:]]*=$/, ".ctext =")
sub(/\.result[[:space:]]*=/, ".ctext\t=")
sub(/\.rlen[[:space:]]*=/, ".len\t=")
print
}
mode == DECVEC_TAIL && /[^[:space:]]/ { mode = OTHER }
mode == OTHER { print }
mode == ENCVEC && /^};/ { mode = OTHER }
mode == DECVEC && /^};/ { mode = DECVEC_TAIL }
Note that git's default diff algorithm gets confused by the testmgr.h
portion of this patch, and reports too many lines added and removed.
It's better viewed with 'git diff --minimal' (or 'git show --minimal'),
which reports "2 files changed, 919 insertions(+), 11723 deletions(-)".
Signed-off-by: Eric Biggers <ebiggers@google.com>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
2018-05-21 08:50:29 +03:00
|
|
|
.cipher = __VECS(bf_cbc_tv_template)
|
|
|
|
},
|
2008-07-31 13:08:25 +04:00
|
|
|
}, {
|
|
|
|
.alg = "cbc(camellia)",
|
2008-08-17 11:01:56 +04:00
|
|
|
.test = alg_test_skcipher,
|
2008-07-31 13:08:25 +04:00
|
|
|
.suite = {
|
crypto: testmgr - eliminate redundant decryption test vectors
Currently testmgr has separate encryption and decryption test vectors
for symmetric ciphers. That's massively redundant, since with few
exceptions (mostly mistakes, apparently), all decryption tests are
identical to the encryption tests, just with the input/result flipped.
Therefore, eliminate the redundancy by removing the decryption test
vectors and updating testmgr to test both encryption and decryption
using what used to be the encryption test vectors. Naming is adjusted
accordingly: each cipher_testvec now has a 'ptext' (plaintext), 'ctext'
(ciphertext), and 'len' instead of an 'input', 'result', 'ilen', and
'rlen'. Note that it was always the case that 'ilen == rlen'.
AES keywrap ("kw(aes)") is special because its IV is generated by the
encryption. Previously this was handled by specifying 'iv_out' for
encryption and 'iv' for decryption. To make it work cleanly with only
one set of test vectors, put the IV in 'iv', remove 'iv_out', and add a
boolean that indicates that the IV is generated by the encryption.
In total, this removes over 10000 lines from testmgr.h, with no
reduction in test coverage since prior patches already copied the few
unique decryption test vectors into the encryption test vectors.
This covers all algorithms that used 'struct cipher_testvec', e.g. any
block cipher in the ECB, CBC, CTR, XTS, LRW, CTS-CBC, PCBC, OFB, or
keywrap modes, and Salsa20 and ChaCha20. No change is made to AEAD
tests, though we probably can eliminate a similar redundancy there too.
The testmgr.h portion of this patch was automatically generated using
the following awk script, with some slight manual fixups on top (updated
'struct cipher_testvec' definition, updated a few comments, and fixed up
the AES keywrap test vectors):
BEGIN { OTHER = 0; ENCVEC = 1; DECVEC = 2; DECVEC_TAIL = 3; mode = OTHER }
/^static const struct cipher_testvec.*_enc_/ { sub("_enc", ""); mode = ENCVEC }
/^static const struct cipher_testvec.*_dec_/ { mode = DECVEC }
mode == ENCVEC && !/\.ilen[[:space:]]*=/ {
sub(/\.input[[:space:]]*=$/, ".ptext =")
sub(/\.input[[:space:]]*=/, ".ptext\t=")
sub(/\.result[[:space:]]*=$/, ".ctext =")
sub(/\.result[[:space:]]*=/, ".ctext\t=")
sub(/\.rlen[[:space:]]*=/, ".len\t=")
print
}
mode == DECVEC_TAIL && /[^[:space:]]/ { mode = OTHER }
mode == OTHER { print }
mode == ENCVEC && /^};/ { mode = OTHER }
mode == DECVEC && /^};/ { mode = DECVEC_TAIL }
Note that git's default diff algorithm gets confused by the testmgr.h
portion of this patch, and reports too many lines added and removed.
It's better viewed with 'git diff --minimal' (or 'git show --minimal'),
which reports "2 files changed, 919 insertions(+), 11723 deletions(-)".
Signed-off-by: Eric Biggers <ebiggers@google.com>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
2018-05-21 08:50:29 +03:00
|
|
|
.cipher = __VECS(camellia_cbc_tv_template)
|
|
|
|
},
|
2012-07-11 21:37:21 +04:00
|
|
|
}, {
|
|
|
|
.alg = "cbc(cast5)",
|
|
|
|
.test = alg_test_skcipher,
|
|
|
|
.suite = {
|
crypto: testmgr - eliminate redundant decryption test vectors
Currently testmgr has separate encryption and decryption test vectors
for symmetric ciphers. That's massively redundant, since with few
exceptions (mostly mistakes, apparently), all decryption tests are
identical to the encryption tests, just with the input/result flipped.
Therefore, eliminate the redundancy by removing the decryption test
vectors and updating testmgr to test both encryption and decryption
using what used to be the encryption test vectors. Naming is adjusted
accordingly: each cipher_testvec now has a 'ptext' (plaintext), 'ctext'
(ciphertext), and 'len' instead of an 'input', 'result', 'ilen', and
'rlen'. Note that it was always the case that 'ilen == rlen'.
AES keywrap ("kw(aes)") is special because its IV is generated by the
encryption. Previously this was handled by specifying 'iv_out' for
encryption and 'iv' for decryption. To make it work cleanly with only
one set of test vectors, put the IV in 'iv', remove 'iv_out', and add a
boolean that indicates that the IV is generated by the encryption.
In total, this removes over 10000 lines from testmgr.h, with no
reduction in test coverage since prior patches already copied the few
unique decryption test vectors into the encryption test vectors.
This covers all algorithms that used 'struct cipher_testvec', e.g. any
block cipher in the ECB, CBC, CTR, XTS, LRW, CTS-CBC, PCBC, OFB, or
keywrap modes, and Salsa20 and ChaCha20. No change is made to AEAD
tests, though we probably can eliminate a similar redundancy there too.
The testmgr.h portion of this patch was automatically generated using
the following awk script, with some slight manual fixups on top (updated
'struct cipher_testvec' definition, updated a few comments, and fixed up
the AES keywrap test vectors):
BEGIN { OTHER = 0; ENCVEC = 1; DECVEC = 2; DECVEC_TAIL = 3; mode = OTHER }
/^static const struct cipher_testvec.*_enc_/ { sub("_enc", ""); mode = ENCVEC }
/^static const struct cipher_testvec.*_dec_/ { mode = DECVEC }
mode == ENCVEC && !/\.ilen[[:space:]]*=/ {
sub(/\.input[[:space:]]*=$/, ".ptext =")
sub(/\.input[[:space:]]*=/, ".ptext\t=")
sub(/\.result[[:space:]]*=$/, ".ctext =")
sub(/\.result[[:space:]]*=/, ".ctext\t=")
sub(/\.rlen[[:space:]]*=/, ".len\t=")
print
}
mode == DECVEC_TAIL && /[^[:space:]]/ { mode = OTHER }
mode == OTHER { print }
mode == ENCVEC && /^};/ { mode = OTHER }
mode == DECVEC && /^};/ { mode = DECVEC_TAIL }
Note that git's default diff algorithm gets confused by the testmgr.h
portion of this patch, and reports too many lines added and removed.
It's better viewed with 'git diff --minimal' (or 'git show --minimal'),
which reports "2 files changed, 919 insertions(+), 11723 deletions(-)".
Signed-off-by: Eric Biggers <ebiggers@google.com>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
2018-05-21 08:50:29 +03:00
|
|
|
.cipher = __VECS(cast5_cbc_tv_template)
|
|
|
|
},
|
2012-07-11 21:38:29 +04:00
|
|
|
}, {
|
|
|
|
.alg = "cbc(cast6)",
|
|
|
|
.test = alg_test_skcipher,
|
|
|
|
.suite = {
|
crypto: testmgr - eliminate redundant decryption test vectors
Currently testmgr has separate encryption and decryption test vectors
for symmetric ciphers. That's massively redundant, since with few
exceptions (mostly mistakes, apparently), all decryption tests are
identical to the encryption tests, just with the input/result flipped.
Therefore, eliminate the redundancy by removing the decryption test
vectors and updating testmgr to test both encryption and decryption
using what used to be the encryption test vectors. Naming is adjusted
accordingly: each cipher_testvec now has a 'ptext' (plaintext), 'ctext'
(ciphertext), and 'len' instead of an 'input', 'result', 'ilen', and
'rlen'. Note that it was always the case that 'ilen == rlen'.
AES keywrap ("kw(aes)") is special because its IV is generated by the
encryption. Previously this was handled by specifying 'iv_out' for
encryption and 'iv' for decryption. To make it work cleanly with only
one set of test vectors, put the IV in 'iv', remove 'iv_out', and add a
boolean that indicates that the IV is generated by the encryption.
In total, this removes over 10000 lines from testmgr.h, with no
reduction in test coverage since prior patches already copied the few
unique decryption test vectors into the encryption test vectors.
This covers all algorithms that used 'struct cipher_testvec', e.g. any
block cipher in the ECB, CBC, CTR, XTS, LRW, CTS-CBC, PCBC, OFB, or
keywrap modes, and Salsa20 and ChaCha20. No change is made to AEAD
tests, though we probably can eliminate a similar redundancy there too.
The testmgr.h portion of this patch was automatically generated using
the following awk script, with some slight manual fixups on top (updated
'struct cipher_testvec' definition, updated a few comments, and fixed up
the AES keywrap test vectors):
BEGIN { OTHER = 0; ENCVEC = 1; DECVEC = 2; DECVEC_TAIL = 3; mode = OTHER }
/^static const struct cipher_testvec.*_enc_/ { sub("_enc", ""); mode = ENCVEC }
/^static const struct cipher_testvec.*_dec_/ { mode = DECVEC }
mode == ENCVEC && !/\.ilen[[:space:]]*=/ {
sub(/\.input[[:space:]]*=$/, ".ptext =")
sub(/\.input[[:space:]]*=/, ".ptext\t=")
sub(/\.result[[:space:]]*=$/, ".ctext =")
sub(/\.result[[:space:]]*=/, ".ctext\t=")
sub(/\.rlen[[:space:]]*=/, ".len\t=")
print
}
mode == DECVEC_TAIL && /[^[:space:]]/ { mode = OTHER }
mode == OTHER { print }
mode == ENCVEC && /^};/ { mode = OTHER }
mode == DECVEC && /^};/ { mode = DECVEC_TAIL }
Note that git's default diff algorithm gets confused by the testmgr.h
portion of this patch, and reports too many lines added and removed.
It's better viewed with 'git diff --minimal' (or 'git show --minimal'),
which reports "2 files changed, 919 insertions(+), 11723 deletions(-)".
Signed-off-by: Eric Biggers <ebiggers@google.com>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
2018-05-21 08:50:29 +03:00
|
|
|
.cipher = __VECS(cast6_cbc_tv_template)
|
|
|
|
},
|
2008-07-31 13:08:25 +04:00
|
|
|
}, {
|
|
|
|
.alg = "cbc(des)",
|
2008-08-17 11:01:56 +04:00
|
|
|
.test = alg_test_skcipher,
|
2008-07-31 13:08:25 +04:00
|
|
|
.suite = {
|
crypto: testmgr - eliminate redundant decryption test vectors
Currently testmgr has separate encryption and decryption test vectors
for symmetric ciphers. That's massively redundant, since with few
exceptions (mostly mistakes, apparently), all decryption tests are
identical to the encryption tests, just with the input/result flipped.
Therefore, eliminate the redundancy by removing the decryption test
vectors and updating testmgr to test both encryption and decryption
using what used to be the encryption test vectors. Naming is adjusted
accordingly: each cipher_testvec now has a 'ptext' (plaintext), 'ctext'
(ciphertext), and 'len' instead of an 'input', 'result', 'ilen', and
'rlen'. Note that it was always the case that 'ilen == rlen'.
AES keywrap ("kw(aes)") is special because its IV is generated by the
encryption. Previously this was handled by specifying 'iv_out' for
encryption and 'iv' for decryption. To make it work cleanly with only
one set of test vectors, put the IV in 'iv', remove 'iv_out', and add a
boolean that indicates that the IV is generated by the encryption.
In total, this removes over 10000 lines from testmgr.h, with no
reduction in test coverage since prior patches already copied the few
unique decryption test vectors into the encryption test vectors.
This covers all algorithms that used 'struct cipher_testvec', e.g. any
block cipher in the ECB, CBC, CTR, XTS, LRW, CTS-CBC, PCBC, OFB, or
keywrap modes, and Salsa20 and ChaCha20. No change is made to AEAD
tests, though we probably can eliminate a similar redundancy there too.
The testmgr.h portion of this patch was automatically generated using
the following awk script, with some slight manual fixups on top (updated
'struct cipher_testvec' definition, updated a few comments, and fixed up
the AES keywrap test vectors):
BEGIN { OTHER = 0; ENCVEC = 1; DECVEC = 2; DECVEC_TAIL = 3; mode = OTHER }
/^static const struct cipher_testvec.*_enc_/ { sub("_enc", ""); mode = ENCVEC }
/^static const struct cipher_testvec.*_dec_/ { mode = DECVEC }
mode == ENCVEC && !/\.ilen[[:space:]]*=/ {
sub(/\.input[[:space:]]*=$/, ".ptext =")
sub(/\.input[[:space:]]*=/, ".ptext\t=")
sub(/\.result[[:space:]]*=$/, ".ctext =")
sub(/\.result[[:space:]]*=/, ".ctext\t=")
sub(/\.rlen[[:space:]]*=/, ".len\t=")
print
}
mode == DECVEC_TAIL && /[^[:space:]]/ { mode = OTHER }
mode == OTHER { print }
mode == ENCVEC && /^};/ { mode = OTHER }
mode == DECVEC && /^};/ { mode = DECVEC_TAIL }
Note that git's default diff algorithm gets confused by the testmgr.h
portion of this patch, and reports too many lines added and removed.
It's better viewed with 'git diff --minimal' (or 'git show --minimal'),
which reports "2 files changed, 919 insertions(+), 11723 deletions(-)".
Signed-off-by: Eric Biggers <ebiggers@google.com>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
2018-05-21 08:50:29 +03:00
|
|
|
.cipher = __VECS(des_cbc_tv_template)
|
|
|
|
},
|
2008-07-31 13:08:25 +04:00
|
|
|
}, {
|
|
|
|
.alg = "cbc(des3_ede)",
|
2008-08-17 11:01:56 +04:00
|
|
|
.test = alg_test_skcipher,
|
2009-05-15 09:16:03 +04:00
|
|
|
.fips_allowed = 1,
|
2008-07-31 13:08:25 +04:00
|
|
|
.suite = {
|
crypto: testmgr - eliminate redundant decryption test vectors
Currently testmgr has separate encryption and decryption test vectors
for symmetric ciphers. That's massively redundant, since with few
exceptions (mostly mistakes, apparently), all decryption tests are
identical to the encryption tests, just with the input/result flipped.
Therefore, eliminate the redundancy by removing the decryption test
vectors and updating testmgr to test both encryption and decryption
using what used to be the encryption test vectors. Naming is adjusted
accordingly: each cipher_testvec now has a 'ptext' (plaintext), 'ctext'
(ciphertext), and 'len' instead of an 'input', 'result', 'ilen', and
'rlen'. Note that it was always the case that 'ilen == rlen'.
AES keywrap ("kw(aes)") is special because its IV is generated by the
encryption. Previously this was handled by specifying 'iv_out' for
encryption and 'iv' for decryption. To make it work cleanly with only
one set of test vectors, put the IV in 'iv', remove 'iv_out', and add a
boolean that indicates that the IV is generated by the encryption.
In total, this removes over 10000 lines from testmgr.h, with no
reduction in test coverage since prior patches already copied the few
unique decryption test vectors into the encryption test vectors.
This covers all algorithms that used 'struct cipher_testvec', e.g. any
block cipher in the ECB, CBC, CTR, XTS, LRW, CTS-CBC, PCBC, OFB, or
keywrap modes, and Salsa20 and ChaCha20. No change is made to AEAD
tests, though we probably can eliminate a similar redundancy there too.
The testmgr.h portion of this patch was automatically generated using
the following awk script, with some slight manual fixups on top (updated
'struct cipher_testvec' definition, updated a few comments, and fixed up
the AES keywrap test vectors):
BEGIN { OTHER = 0; ENCVEC = 1; DECVEC = 2; DECVEC_TAIL = 3; mode = OTHER }
/^static const struct cipher_testvec.*_enc_/ { sub("_enc", ""); mode = ENCVEC }
/^static const struct cipher_testvec.*_dec_/ { mode = DECVEC }
mode == ENCVEC && !/\.ilen[[:space:]]*=/ {
sub(/\.input[[:space:]]*=$/, ".ptext =")
sub(/\.input[[:space:]]*=/, ".ptext\t=")
sub(/\.result[[:space:]]*=$/, ".ctext =")
sub(/\.result[[:space:]]*=/, ".ctext\t=")
sub(/\.rlen[[:space:]]*=/, ".len\t=")
print
}
mode == DECVEC_TAIL && /[^[:space:]]/ { mode = OTHER }
mode == OTHER { print }
mode == ENCVEC && /^};/ { mode = OTHER }
mode == DECVEC && /^};/ { mode = DECVEC_TAIL }
Note that git's default diff algorithm gets confused by the testmgr.h
portion of this patch, and reports too many lines added and removed.
It's better viewed with 'git diff --minimal' (or 'git show --minimal'),
which reports "2 files changed, 919 insertions(+), 11723 deletions(-)".
Signed-off-by: Eric Biggers <ebiggers@google.com>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
2018-05-21 08:50:29 +03:00
|
|
|
.cipher = __VECS(des3_ede_cbc_tv_template)
|
|
|
|
},
|
2018-04-23 10:25:14 +03:00
|
|
|
}, {
|
|
|
|
/* Same as cbc(aes) except the key is stored in
|
|
|
|
* hardware secure memory which we reference by index
|
|
|
|
*/
|
|
|
|
.alg = "cbc(paes)",
|
|
|
|
.test = alg_test_null,
|
|
|
|
.fips_allowed = 1,
|
2011-10-18 01:02:53 +04:00
|
|
|
}, {
|
|
|
|
.alg = "cbc(serpent)",
|
|
|
|
.test = alg_test_skcipher,
|
|
|
|
.suite = {
|
crypto: testmgr - eliminate redundant decryption test vectors
Currently testmgr has separate encryption and decryption test vectors
for symmetric ciphers. That's massively redundant, since with few
exceptions (mostly mistakes, apparently), all decryption tests are
identical to the encryption tests, just with the input/result flipped.
Therefore, eliminate the redundancy by removing the decryption test
vectors and updating testmgr to test both encryption and decryption
using what used to be the encryption test vectors. Naming is adjusted
accordingly: each cipher_testvec now has a 'ptext' (plaintext), 'ctext'
(ciphertext), and 'len' instead of an 'input', 'result', 'ilen', and
'rlen'. Note that it was always the case that 'ilen == rlen'.
AES keywrap ("kw(aes)") is special because its IV is generated by the
encryption. Previously this was handled by specifying 'iv_out' for
encryption and 'iv' for decryption. To make it work cleanly with only
one set of test vectors, put the IV in 'iv', remove 'iv_out', and add a
boolean that indicates that the IV is generated by the encryption.
In total, this removes over 10000 lines from testmgr.h, with no
reduction in test coverage since prior patches already copied the few
unique decryption test vectors into the encryption test vectors.
This covers all algorithms that used 'struct cipher_testvec', e.g. any
block cipher in the ECB, CBC, CTR, XTS, LRW, CTS-CBC, PCBC, OFB, or
keywrap modes, and Salsa20 and ChaCha20. No change is made to AEAD
tests, though we probably can eliminate a similar redundancy there too.
The testmgr.h portion of this patch was automatically generated using
the following awk script, with some slight manual fixups on top (updated
'struct cipher_testvec' definition, updated a few comments, and fixed up
the AES keywrap test vectors):
BEGIN { OTHER = 0; ENCVEC = 1; DECVEC = 2; DECVEC_TAIL = 3; mode = OTHER }
/^static const struct cipher_testvec.*_enc_/ { sub("_enc", ""); mode = ENCVEC }
/^static const struct cipher_testvec.*_dec_/ { mode = DECVEC }
mode == ENCVEC && !/\.ilen[[:space:]]*=/ {
sub(/\.input[[:space:]]*=$/, ".ptext =")
sub(/\.input[[:space:]]*=/, ".ptext\t=")
sub(/\.result[[:space:]]*=$/, ".ctext =")
sub(/\.result[[:space:]]*=/, ".ctext\t=")
sub(/\.rlen[[:space:]]*=/, ".len\t=")
print
}
mode == DECVEC_TAIL && /[^[:space:]]/ { mode = OTHER }
mode == OTHER { print }
mode == ENCVEC && /^};/ { mode = OTHER }
mode == DECVEC && /^};/ { mode = DECVEC_TAIL }
Note that git's default diff algorithm gets confused by the testmgr.h
portion of this patch, and reports too many lines added and removed.
It's better viewed with 'git diff --minimal' (or 'git show --minimal'),
which reports "2 files changed, 919 insertions(+), 11723 deletions(-)".
Signed-off-by: Eric Biggers <ebiggers@google.com>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
2018-05-21 08:50:29 +03:00
|
|
|
.cipher = __VECS(serpent_cbc_tv_template)
|
|
|
|
},
|
2018-09-20 16:18:38 +03:00
|
|
|
}, {
|
|
|
|
.alg = "cbc(sm4)",
|
|
|
|
.test = alg_test_skcipher,
|
|
|
|
.suite = {
|
|
|
|
.cipher = __VECS(sm4_cbc_tv_template)
|
|
|
|
}
|
2008-07-31 13:08:25 +04:00
|
|
|
}, {
|
|
|
|
.alg = "cbc(twofish)",
|
2008-08-17 11:01:56 +04:00
|
|
|
.test = alg_test_skcipher,
|
2008-07-31 13:08:25 +04:00
|
|
|
.suite = {
|
crypto: testmgr - eliminate redundant decryption test vectors
Currently testmgr has separate encryption and decryption test vectors
for symmetric ciphers. That's massively redundant, since with few
exceptions (mostly mistakes, apparently), all decryption tests are
identical to the encryption tests, just with the input/result flipped.
Therefore, eliminate the redundancy by removing the decryption test
vectors and updating testmgr to test both encryption and decryption
using what used to be the encryption test vectors. Naming is adjusted
accordingly: each cipher_testvec now has a 'ptext' (plaintext), 'ctext'
(ciphertext), and 'len' instead of an 'input', 'result', 'ilen', and
'rlen'. Note that it was always the case that 'ilen == rlen'.
AES keywrap ("kw(aes)") is special because its IV is generated by the
encryption. Previously this was handled by specifying 'iv_out' for
encryption and 'iv' for decryption. To make it work cleanly with only
one set of test vectors, put the IV in 'iv', remove 'iv_out', and add a
boolean that indicates that the IV is generated by the encryption.
In total, this removes over 10000 lines from testmgr.h, with no
reduction in test coverage since prior patches already copied the few
unique decryption test vectors into the encryption test vectors.
This covers all algorithms that used 'struct cipher_testvec', e.g. any
block cipher in the ECB, CBC, CTR, XTS, LRW, CTS-CBC, PCBC, OFB, or
keywrap modes, and Salsa20 and ChaCha20. No change is made to AEAD
tests, though we probably can eliminate a similar redundancy there too.
The testmgr.h portion of this patch was automatically generated using
the following awk script, with some slight manual fixups on top (updated
'struct cipher_testvec' definition, updated a few comments, and fixed up
the AES keywrap test vectors):
BEGIN { OTHER = 0; ENCVEC = 1; DECVEC = 2; DECVEC_TAIL = 3; mode = OTHER }
/^static const struct cipher_testvec.*_enc_/ { sub("_enc", ""); mode = ENCVEC }
/^static const struct cipher_testvec.*_dec_/ { mode = DECVEC }
mode == ENCVEC && !/\.ilen[[:space:]]*=/ {
sub(/\.input[[:space:]]*=$/, ".ptext =")
sub(/\.input[[:space:]]*=/, ".ptext\t=")
sub(/\.result[[:space:]]*=$/, ".ctext =")
sub(/\.result[[:space:]]*=/, ".ctext\t=")
sub(/\.rlen[[:space:]]*=/, ".len\t=")
print
}
mode == DECVEC_TAIL && /[^[:space:]]/ { mode = OTHER }
mode == OTHER { print }
mode == ENCVEC && /^};/ { mode = OTHER }
mode == DECVEC && /^};/ { mode = DECVEC_TAIL }
Note that git's default diff algorithm gets confused by the testmgr.h
portion of this patch, and reports too many lines added and removed.
It's better viewed with 'git diff --minimal' (or 'git show --minimal'),
which reports "2 files changed, 919 insertions(+), 11723 deletions(-)".
Signed-off-by: Eric Biggers <ebiggers@google.com>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
2018-05-21 08:50:29 +03:00
|
|
|
.cipher = __VECS(tf_cbc_tv_template)
|
|
|
|
},
|
2017-02-03 17:49:35 +03:00
|
|
|
}, {
|
|
|
|
.alg = "cbcmac(aes)",
|
|
|
|
.fips_allowed = 1,
|
|
|
|
.test = alg_test_hash,
|
|
|
|
.suite = {
|
|
|
|
.hash = __VECS(aes_cbcmac_tv_template)
|
|
|
|
}
|
2008-07-31 13:08:25 +04:00
|
|
|
}, {
|
|
|
|
.alg = "ccm(aes)",
|
|
|
|
.test = alg_test_aead,
|
2009-05-15 09:16:03 +04:00
|
|
|
.fips_allowed = 1,
|
2008-07-31 13:08:25 +04:00
|
|
|
.suite = {
|
|
|
|
.aead = {
|
2017-01-12 16:40:39 +03:00
|
|
|
.enc = __VECS(aes_ccm_enc_tv_template),
|
|
|
|
.dec = __VECS(aes_ccm_dec_tv_template)
|
2008-07-31 13:08:25 +04:00
|
|
|
}
|
|
|
|
}
|
2018-10-20 02:01:53 +03:00
|
|
|
}, {
|
|
|
|
.alg = "cfb(aes)",
|
|
|
|
.test = alg_test_skcipher,
|
|
|
|
.fips_allowed = 1,
|
|
|
|
.suite = {
|
|
|
|
.cipher = __VECS(aes_cfb_tv_template)
|
|
|
|
},
|
2015-06-01 14:43:57 +03:00
|
|
|
}, {
|
|
|
|
.alg = "chacha20",
|
|
|
|
.test = alg_test_skcipher,
|
|
|
|
.suite = {
|
crypto: testmgr - eliminate redundant decryption test vectors
Currently testmgr has separate encryption and decryption test vectors
for symmetric ciphers. That's massively redundant, since with few
exceptions (mostly mistakes, apparently), all decryption tests are
identical to the encryption tests, just with the input/result flipped.
Therefore, eliminate the redundancy by removing the decryption test
vectors and updating testmgr to test both encryption and decryption
using what used to be the encryption test vectors. Naming is adjusted
accordingly: each cipher_testvec now has a 'ptext' (plaintext), 'ctext'
(ciphertext), and 'len' instead of an 'input', 'result', 'ilen', and
'rlen'. Note that it was always the case that 'ilen == rlen'.
AES keywrap ("kw(aes)") is special because its IV is generated by the
encryption. Previously this was handled by specifying 'iv_out' for
encryption and 'iv' for decryption. To make it work cleanly with only
one set of test vectors, put the IV in 'iv', remove 'iv_out', and add a
boolean that indicates that the IV is generated by the encryption.
In total, this removes over 10000 lines from testmgr.h, with no
reduction in test coverage since prior patches already copied the few
unique decryption test vectors into the encryption test vectors.
This covers all algorithms that used 'struct cipher_testvec', e.g. any
block cipher in the ECB, CBC, CTR, XTS, LRW, CTS-CBC, PCBC, OFB, or
keywrap modes, and Salsa20 and ChaCha20. No change is made to AEAD
tests, though we probably can eliminate a similar redundancy there too.
The testmgr.h portion of this patch was automatically generated using
the following awk script, with some slight manual fixups on top (updated
'struct cipher_testvec' definition, updated a few comments, and fixed up
the AES keywrap test vectors):
BEGIN { OTHER = 0; ENCVEC = 1; DECVEC = 2; DECVEC_TAIL = 3; mode = OTHER }
/^static const struct cipher_testvec.*_enc_/ { sub("_enc", ""); mode = ENCVEC }
/^static const struct cipher_testvec.*_dec_/ { mode = DECVEC }
mode == ENCVEC && !/\.ilen[[:space:]]*=/ {
sub(/\.input[[:space:]]*=$/, ".ptext =")
sub(/\.input[[:space:]]*=/, ".ptext\t=")
sub(/\.result[[:space:]]*=$/, ".ctext =")
sub(/\.result[[:space:]]*=/, ".ctext\t=")
sub(/\.rlen[[:space:]]*=/, ".len\t=")
print
}
mode == DECVEC_TAIL && /[^[:space:]]/ { mode = OTHER }
mode == OTHER { print }
mode == ENCVEC && /^};/ { mode = OTHER }
mode == DECVEC && /^};/ { mode = DECVEC_TAIL }
Note that git's default diff algorithm gets confused by the testmgr.h
portion of this patch, and reports too many lines added and removed.
It's better viewed with 'git diff --minimal' (or 'git show --minimal'),
which reports "2 files changed, 919 insertions(+), 11723 deletions(-)".
Signed-off-by: Eric Biggers <ebiggers@google.com>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
2018-05-21 08:50:29 +03:00
|
|
|
.cipher = __VECS(chacha20_tv_template)
|
|
|
|
},
|
2013-04-08 11:48:44 +04:00
|
|
|
}, {
|
|
|
|
.alg = "cmac(aes)",
|
2015-08-19 09:42:07 +03:00
|
|
|
.fips_allowed = 1,
|
2013-04-08 11:48:44 +04:00
|
|
|
.test = alg_test_hash,
|
|
|
|
.suite = {
|
2017-01-12 16:40:39 +03:00
|
|
|
.hash = __VECS(aes_cmac128_tv_template)
|
2013-04-08 11:48:44 +04:00
|
|
|
}
|
|
|
|
}, {
|
|
|
|
.alg = "cmac(des3_ede)",
|
2015-08-19 09:42:07 +03:00
|
|
|
.fips_allowed = 1,
|
2013-04-08 11:48:44 +04:00
|
|
|
.test = alg_test_hash,
|
|
|
|
.suite = {
|
2017-01-12 16:40:39 +03:00
|
|
|
.hash = __VECS(des3_ede_cmac64_tv_template)
|
2013-04-08 11:48:44 +04:00
|
|
|
}
|
2013-04-07 17:43:56 +04:00
|
|
|
}, {
|
|
|
|
.alg = "compress_null",
|
|
|
|
.test = alg_test_null,
|
2015-05-04 12:00:17 +03:00
|
|
|
}, {
|
|
|
|
.alg = "crc32",
|
|
|
|
.test = alg_test_hash,
|
|
|
|
.suite = {
|
2017-01-12 16:40:39 +03:00
|
|
|
.hash = __VECS(crc32_tv_template)
|
2015-05-04 12:00:17 +03:00
|
|
|
}
|
2008-07-31 13:08:25 +04:00
|
|
|
}, {
|
|
|
|
.alg = "crc32c",
|
2008-11-07 09:58:52 +03:00
|
|
|
.test = alg_test_crc32c,
|
2009-05-15 09:16:03 +04:00
|
|
|
.fips_allowed = 1,
|
2008-07-31 13:08:25 +04:00
|
|
|
.suite = {
|
2017-01-12 16:40:39 +03:00
|
|
|
.hash = __VECS(crc32c_tv_template)
|
2008-07-31 13:08:25 +04:00
|
|
|
}
|
2013-09-07 06:56:26 +04:00
|
|
|
}, {
|
|
|
|
.alg = "crct10dif",
|
|
|
|
.test = alg_test_hash,
|
|
|
|
.fips_allowed = 1,
|
|
|
|
.suite = {
|
2017-01-12 16:40:39 +03:00
|
|
|
.hash = __VECS(crct10dif_tv_template)
|
2013-09-07 06:56:26 +04:00
|
|
|
}
|
2009-05-06 13:29:17 +04:00
|
|
|
}, {
|
|
|
|
.alg = "ctr(aes)",
|
|
|
|
.test = alg_test_skcipher,
|
2009-05-15 09:16:03 +04:00
|
|
|
.fips_allowed = 1,
|
2009-05-06 13:29:17 +04:00
|
|
|
.suite = {
|
crypto: testmgr - eliminate redundant decryption test vectors
Currently testmgr has separate encryption and decryption test vectors
for symmetric ciphers. That's massively redundant, since with few
exceptions (mostly mistakes, apparently), all decryption tests are
identical to the encryption tests, just with the input/result flipped.
Therefore, eliminate the redundancy by removing the decryption test
vectors and updating testmgr to test both encryption and decryption
using what used to be the encryption test vectors. Naming is adjusted
accordingly: each cipher_testvec now has a 'ptext' (plaintext), 'ctext'
(ciphertext), and 'len' instead of an 'input', 'result', 'ilen', and
'rlen'. Note that it was always the case that 'ilen == rlen'.
AES keywrap ("kw(aes)") is special because its IV is generated by the
encryption. Previously this was handled by specifying 'iv_out' for
encryption and 'iv' for decryption. To make it work cleanly with only
one set of test vectors, put the IV in 'iv', remove 'iv_out', and add a
boolean that indicates that the IV is generated by the encryption.
In total, this removes over 10000 lines from testmgr.h, with no
reduction in test coverage since prior patches already copied the few
unique decryption test vectors into the encryption test vectors.
This covers all algorithms that used 'struct cipher_testvec', e.g. any
block cipher in the ECB, CBC, CTR, XTS, LRW, CTS-CBC, PCBC, OFB, or
keywrap modes, and Salsa20 and ChaCha20. No change is made to AEAD
tests, though we probably can eliminate a similar redundancy there too.
The testmgr.h portion of this patch was automatically generated using
the following awk script, with some slight manual fixups on top (updated
'struct cipher_testvec' definition, updated a few comments, and fixed up
the AES keywrap test vectors):
BEGIN { OTHER = 0; ENCVEC = 1; DECVEC = 2; DECVEC_TAIL = 3; mode = OTHER }
/^static const struct cipher_testvec.*_enc_/ { sub("_enc", ""); mode = ENCVEC }
/^static const struct cipher_testvec.*_dec_/ { mode = DECVEC }
mode == ENCVEC && !/\.ilen[[:space:]]*=/ {
sub(/\.input[[:space:]]*=$/, ".ptext =")
sub(/\.input[[:space:]]*=/, ".ptext\t=")
sub(/\.result[[:space:]]*=$/, ".ctext =")
sub(/\.result[[:space:]]*=/, ".ctext\t=")
sub(/\.rlen[[:space:]]*=/, ".len\t=")
print
}
mode == DECVEC_TAIL && /[^[:space:]]/ { mode = OTHER }
mode == OTHER { print }
mode == ENCVEC && /^};/ { mode = OTHER }
mode == DECVEC && /^};/ { mode = DECVEC_TAIL }
Note that git's default diff algorithm gets confused by the testmgr.h
portion of this patch, and reports too many lines added and removed.
It's better viewed with 'git diff --minimal' (or 'git show --minimal'),
which reports "2 files changed, 919 insertions(+), 11723 deletions(-)".
Signed-off-by: Eric Biggers <ebiggers@google.com>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
2018-05-21 08:50:29 +03:00
|
|
|
.cipher = __VECS(aes_ctr_tv_template)
|
2009-05-06 13:29:17 +04:00
|
|
|
}
|
2011-10-11 00:03:03 +04:00
|
|
|
}, {
|
|
|
|
.alg = "ctr(blowfish)",
|
|
|
|
.test = alg_test_skcipher,
|
|
|
|
.suite = {
|
crypto: testmgr - eliminate redundant decryption test vectors
Currently testmgr has separate encryption and decryption test vectors
for symmetric ciphers. That's massively redundant, since with few
exceptions (mostly mistakes, apparently), all decryption tests are
identical to the encryption tests, just with the input/result flipped.
Therefore, eliminate the redundancy by removing the decryption test
vectors and updating testmgr to test both encryption and decryption
using what used to be the encryption test vectors. Naming is adjusted
accordingly: each cipher_testvec now has a 'ptext' (plaintext), 'ctext'
(ciphertext), and 'len' instead of an 'input', 'result', 'ilen', and
'rlen'. Note that it was always the case that 'ilen == rlen'.
AES keywrap ("kw(aes)") is special because its IV is generated by the
encryption. Previously this was handled by specifying 'iv_out' for
encryption and 'iv' for decryption. To make it work cleanly with only
one set of test vectors, put the IV in 'iv', remove 'iv_out', and add a
boolean that indicates that the IV is generated by the encryption.
In total, this removes over 10000 lines from testmgr.h, with no
reduction in test coverage since prior patches already copied the few
unique decryption test vectors into the encryption test vectors.
This covers all algorithms that used 'struct cipher_testvec', e.g. any
block cipher in the ECB, CBC, CTR, XTS, LRW, CTS-CBC, PCBC, OFB, or
keywrap modes, and Salsa20 and ChaCha20. No change is made to AEAD
tests, though we probably can eliminate a similar redundancy there too.
The testmgr.h portion of this patch was automatically generated using
the following awk script, with some slight manual fixups on top (updated
'struct cipher_testvec' definition, updated a few comments, and fixed up
the AES keywrap test vectors):
BEGIN { OTHER = 0; ENCVEC = 1; DECVEC = 2; DECVEC_TAIL = 3; mode = OTHER }
/^static const struct cipher_testvec.*_enc_/ { sub("_enc", ""); mode = ENCVEC }
/^static const struct cipher_testvec.*_dec_/ { mode = DECVEC }
mode == ENCVEC && !/\.ilen[[:space:]]*=/ {
sub(/\.input[[:space:]]*=$/, ".ptext =")
sub(/\.input[[:space:]]*=/, ".ptext\t=")
sub(/\.result[[:space:]]*=$/, ".ctext =")
sub(/\.result[[:space:]]*=/, ".ctext\t=")
sub(/\.rlen[[:space:]]*=/, ".len\t=")
print
}
mode == DECVEC_TAIL && /[^[:space:]]/ { mode = OTHER }
mode == OTHER { print }
mode == ENCVEC && /^};/ { mode = OTHER }
mode == DECVEC && /^};/ { mode = DECVEC_TAIL }
Note that git's default diff algorithm gets confused by the testmgr.h
portion of this patch, and reports too many lines added and removed.
It's better viewed with 'git diff --minimal' (or 'git show --minimal'),
which reports "2 files changed, 919 insertions(+), 11723 deletions(-)".
Signed-off-by: Eric Biggers <ebiggers@google.com>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
2018-05-21 08:50:29 +03:00
|
|
|
.cipher = __VECS(bf_ctr_tv_template)
|
2011-10-11 00:03:03 +04:00
|
|
|
}
|
2012-03-05 22:26:21 +04:00
|
|
|
}, {
|
|
|
|
.alg = "ctr(camellia)",
|
|
|
|
.test = alg_test_skcipher,
|
|
|
|
.suite = {
|
crypto: testmgr - eliminate redundant decryption test vectors
Currently testmgr has separate encryption and decryption test vectors
for symmetric ciphers. That's massively redundant, since with few
exceptions (mostly mistakes, apparently), all decryption tests are
identical to the encryption tests, just with the input/result flipped.
Therefore, eliminate the redundancy by removing the decryption test
vectors and updating testmgr to test both encryption and decryption
using what used to be the encryption test vectors. Naming is adjusted
accordingly: each cipher_testvec now has a 'ptext' (plaintext), 'ctext'
(ciphertext), and 'len' instead of an 'input', 'result', 'ilen', and
'rlen'. Note that it was always the case that 'ilen == rlen'.
AES keywrap ("kw(aes)") is special because its IV is generated by the
encryption. Previously this was handled by specifying 'iv_out' for
encryption and 'iv' for decryption. To make it work cleanly with only
one set of test vectors, put the IV in 'iv', remove 'iv_out', and add a
boolean that indicates that the IV is generated by the encryption.
In total, this removes over 10000 lines from testmgr.h, with no
reduction in test coverage since prior patches already copied the few
unique decryption test vectors into the encryption test vectors.
This covers all algorithms that used 'struct cipher_testvec', e.g. any
block cipher in the ECB, CBC, CTR, XTS, LRW, CTS-CBC, PCBC, OFB, or
keywrap modes, and Salsa20 and ChaCha20. No change is made to AEAD
tests, though we probably can eliminate a similar redundancy there too.
The testmgr.h portion of this patch was automatically generated using
the following awk script, with some slight manual fixups on top (updated
'struct cipher_testvec' definition, updated a few comments, and fixed up
the AES keywrap test vectors):
BEGIN { OTHER = 0; ENCVEC = 1; DECVEC = 2; DECVEC_TAIL = 3; mode = OTHER }
/^static const struct cipher_testvec.*_enc_/ { sub("_enc", ""); mode = ENCVEC }
/^static const struct cipher_testvec.*_dec_/ { mode = DECVEC }
mode == ENCVEC && !/\.ilen[[:space:]]*=/ {
sub(/\.input[[:space:]]*=$/, ".ptext =")
sub(/\.input[[:space:]]*=/, ".ptext\t=")
sub(/\.result[[:space:]]*=$/, ".ctext =")
sub(/\.result[[:space:]]*=/, ".ctext\t=")
sub(/\.rlen[[:space:]]*=/, ".len\t=")
print
}
mode == DECVEC_TAIL && /[^[:space:]]/ { mode = OTHER }
mode == OTHER { print }
mode == ENCVEC && /^};/ { mode = OTHER }
mode == DECVEC && /^};/ { mode = DECVEC_TAIL }
Note that git's default diff algorithm gets confused by the testmgr.h
portion of this patch, and reports too many lines added and removed.
It's better viewed with 'git diff --minimal' (or 'git show --minimal'),
which reports "2 files changed, 919 insertions(+), 11723 deletions(-)".
Signed-off-by: Eric Biggers <ebiggers@google.com>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
2018-05-21 08:50:29 +03:00
|
|
|
.cipher = __VECS(camellia_ctr_tv_template)
|
2012-03-05 22:26:21 +04:00
|
|
|
}
|
2012-07-11 21:37:21 +04:00
|
|
|
}, {
|
|
|
|
.alg = "ctr(cast5)",
|
|
|
|
.test = alg_test_skcipher,
|
|
|
|
.suite = {
|
crypto: testmgr - eliminate redundant decryption test vectors
Currently testmgr has separate encryption and decryption test vectors
for symmetric ciphers. That's massively redundant, since with few
exceptions (mostly mistakes, apparently), all decryption tests are
identical to the encryption tests, just with the input/result flipped.
Therefore, eliminate the redundancy by removing the decryption test
vectors and updating testmgr to test both encryption and decryption
using what used to be the encryption test vectors. Naming is adjusted
accordingly: each cipher_testvec now has a 'ptext' (plaintext), 'ctext'
(ciphertext), and 'len' instead of an 'input', 'result', 'ilen', and
'rlen'. Note that it was always the case that 'ilen == rlen'.
AES keywrap ("kw(aes)") is special because its IV is generated by the
encryption. Previously this was handled by specifying 'iv_out' for
encryption and 'iv' for decryption. To make it work cleanly with only
one set of test vectors, put the IV in 'iv', remove 'iv_out', and add a
boolean that indicates that the IV is generated by the encryption.
In total, this removes over 10000 lines from testmgr.h, with no
reduction in test coverage since prior patches already copied the few
unique decryption test vectors into the encryption test vectors.
This covers all algorithms that used 'struct cipher_testvec', e.g. any
block cipher in the ECB, CBC, CTR, XTS, LRW, CTS-CBC, PCBC, OFB, or
keywrap modes, and Salsa20 and ChaCha20. No change is made to AEAD
tests, though we probably can eliminate a similar redundancy there too.
The testmgr.h portion of this patch was automatically generated using
the following awk script, with some slight manual fixups on top (updated
'struct cipher_testvec' definition, updated a few comments, and fixed up
the AES keywrap test vectors):
BEGIN { OTHER = 0; ENCVEC = 1; DECVEC = 2; DECVEC_TAIL = 3; mode = OTHER }
/^static const struct cipher_testvec.*_enc_/ { sub("_enc", ""); mode = ENCVEC }
/^static const struct cipher_testvec.*_dec_/ { mode = DECVEC }
mode == ENCVEC && !/\.ilen[[:space:]]*=/ {
sub(/\.input[[:space:]]*=$/, ".ptext =")
sub(/\.input[[:space:]]*=/, ".ptext\t=")
sub(/\.result[[:space:]]*=$/, ".ctext =")
sub(/\.result[[:space:]]*=/, ".ctext\t=")
sub(/\.rlen[[:space:]]*=/, ".len\t=")
print
}
mode == DECVEC_TAIL && /[^[:space:]]/ { mode = OTHER }
mode == OTHER { print }
mode == ENCVEC && /^};/ { mode = OTHER }
mode == DECVEC && /^};/ { mode = DECVEC_TAIL }
Note that git's default diff algorithm gets confused by the testmgr.h
portion of this patch, and reports too many lines added and removed.
It's better viewed with 'git diff --minimal' (or 'git show --minimal'),
which reports "2 files changed, 919 insertions(+), 11723 deletions(-)".
Signed-off-by: Eric Biggers <ebiggers@google.com>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
2018-05-21 08:50:29 +03:00
|
|
|
.cipher = __VECS(cast5_ctr_tv_template)
|
2012-07-11 21:37:21 +04:00
|
|
|
}
|
2012-07-11 21:38:29 +04:00
|
|
|
}, {
|
|
|
|
.alg = "ctr(cast6)",
|
|
|
|
.test = alg_test_skcipher,
|
|
|
|
.suite = {
|
crypto: testmgr - eliminate redundant decryption test vectors
Currently testmgr has separate encryption and decryption test vectors
for symmetric ciphers. That's massively redundant, since with few
exceptions (mostly mistakes, apparently), all decryption tests are
identical to the encryption tests, just with the input/result flipped.
Therefore, eliminate the redundancy by removing the decryption test
vectors and updating testmgr to test both encryption and decryption
using what used to be the encryption test vectors. Naming is adjusted
accordingly: each cipher_testvec now has a 'ptext' (plaintext), 'ctext'
(ciphertext), and 'len' instead of an 'input', 'result', 'ilen', and
'rlen'. Note that it was always the case that 'ilen == rlen'.
AES keywrap ("kw(aes)") is special because its IV is generated by the
encryption. Previously this was handled by specifying 'iv_out' for
encryption and 'iv' for decryption. To make it work cleanly with only
one set of test vectors, put the IV in 'iv', remove 'iv_out', and add a
boolean that indicates that the IV is generated by the encryption.
In total, this removes over 10000 lines from testmgr.h, with no
reduction in test coverage since prior patches already copied the few
unique decryption test vectors into the encryption test vectors.
This covers all algorithms that used 'struct cipher_testvec', e.g. any
block cipher in the ECB, CBC, CTR, XTS, LRW, CTS-CBC, PCBC, OFB, or
keywrap modes, and Salsa20 and ChaCha20. No change is made to AEAD
tests, though we probably can eliminate a similar redundancy there too.
The testmgr.h portion of this patch was automatically generated using
the following awk script, with some slight manual fixups on top (updated
'struct cipher_testvec' definition, updated a few comments, and fixed up
the AES keywrap test vectors):
BEGIN { OTHER = 0; ENCVEC = 1; DECVEC = 2; DECVEC_TAIL = 3; mode = OTHER }
/^static const struct cipher_testvec.*_enc_/ { sub("_enc", ""); mode = ENCVEC }
/^static const struct cipher_testvec.*_dec_/ { mode = DECVEC }
mode == ENCVEC && !/\.ilen[[:space:]]*=/ {
sub(/\.input[[:space:]]*=$/, ".ptext =")
sub(/\.input[[:space:]]*=/, ".ptext\t=")
sub(/\.result[[:space:]]*=$/, ".ctext =")
sub(/\.result[[:space:]]*=/, ".ctext\t=")
sub(/\.rlen[[:space:]]*=/, ".len\t=")
print
}
mode == DECVEC_TAIL && /[^[:space:]]/ { mode = OTHER }
mode == OTHER { print }
mode == ENCVEC && /^};/ { mode = OTHER }
mode == DECVEC && /^};/ { mode = DECVEC_TAIL }
Note that git's default diff algorithm gets confused by the testmgr.h
portion of this patch, and reports too many lines added and removed.
It's better viewed with 'git diff --minimal' (or 'git show --minimal'),
which reports "2 files changed, 919 insertions(+), 11723 deletions(-)".
Signed-off-by: Eric Biggers <ebiggers@google.com>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
2018-05-21 08:50:29 +03:00
|
|
|
.cipher = __VECS(cast6_ctr_tv_template)
|
2012-07-11 21:38:29 +04:00
|
|
|
}
|
2012-10-20 15:53:07 +04:00
|
|
|
}, {
|
|
|
|
.alg = "ctr(des)",
|
|
|
|
.test = alg_test_skcipher,
|
|
|
|
.suite = {
|
crypto: testmgr - eliminate redundant decryption test vectors
Currently testmgr has separate encryption and decryption test vectors
for symmetric ciphers. That's massively redundant, since with few
exceptions (mostly mistakes, apparently), all decryption tests are
identical to the encryption tests, just with the input/result flipped.
Therefore, eliminate the redundancy by removing the decryption test
vectors and updating testmgr to test both encryption and decryption
using what used to be the encryption test vectors. Naming is adjusted
accordingly: each cipher_testvec now has a 'ptext' (plaintext), 'ctext'
(ciphertext), and 'len' instead of an 'input', 'result', 'ilen', and
'rlen'. Note that it was always the case that 'ilen == rlen'.
AES keywrap ("kw(aes)") is special because its IV is generated by the
encryption. Previously this was handled by specifying 'iv_out' for
encryption and 'iv' for decryption. To make it work cleanly with only
one set of test vectors, put the IV in 'iv', remove 'iv_out', and add a
boolean that indicates that the IV is generated by the encryption.
In total, this removes over 10000 lines from testmgr.h, with no
reduction in test coverage since prior patches already copied the few
unique decryption test vectors into the encryption test vectors.
This covers all algorithms that used 'struct cipher_testvec', e.g. any
block cipher in the ECB, CBC, CTR, XTS, LRW, CTS-CBC, PCBC, OFB, or
keywrap modes, and Salsa20 and ChaCha20. No change is made to AEAD
tests, though we probably can eliminate a similar redundancy there too.
The testmgr.h portion of this patch was automatically generated using
the following awk script, with some slight manual fixups on top (updated
'struct cipher_testvec' definition, updated a few comments, and fixed up
the AES keywrap test vectors):
BEGIN { OTHER = 0; ENCVEC = 1; DECVEC = 2; DECVEC_TAIL = 3; mode = OTHER }
/^static const struct cipher_testvec.*_enc_/ { sub("_enc", ""); mode = ENCVEC }
/^static const struct cipher_testvec.*_dec_/ { mode = DECVEC }
mode == ENCVEC && !/\.ilen[[:space:]]*=/ {
sub(/\.input[[:space:]]*=$/, ".ptext =")
sub(/\.input[[:space:]]*=/, ".ptext\t=")
sub(/\.result[[:space:]]*=$/, ".ctext =")
sub(/\.result[[:space:]]*=/, ".ctext\t=")
sub(/\.rlen[[:space:]]*=/, ".len\t=")
print
}
mode == DECVEC_TAIL && /[^[:space:]]/ { mode = OTHER }
mode == OTHER { print }
mode == ENCVEC && /^};/ { mode = OTHER }
mode == DECVEC && /^};/ { mode = DECVEC_TAIL }
Note that git's default diff algorithm gets confused by the testmgr.h
portion of this patch, and reports too many lines added and removed.
It's better viewed with 'git diff --minimal' (or 'git show --minimal'),
which reports "2 files changed, 919 insertions(+), 11723 deletions(-)".
Signed-off-by: Eric Biggers <ebiggers@google.com>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
2018-05-21 08:50:29 +03:00
|
|
|
.cipher = __VECS(des_ctr_tv_template)
|
2012-10-20 15:53:07 +04:00
|
|
|
}
|
2012-10-20 15:53:12 +04:00
|
|
|
}, {
|
|
|
|
.alg = "ctr(des3_ede)",
|
|
|
|
.test = alg_test_skcipher,
|
2017-03-20 23:28:05 +03:00
|
|
|
.fips_allowed = 1,
|
2012-10-20 15:53:12 +04:00
|
|
|
.suite = {
|
crypto: testmgr - eliminate redundant decryption test vectors
Currently testmgr has separate encryption and decryption test vectors
for symmetric ciphers. That's massively redundant, since with few
exceptions (mostly mistakes, apparently), all decryption tests are
identical to the encryption tests, just with the input/result flipped.
Therefore, eliminate the redundancy by removing the decryption test
vectors and updating testmgr to test both encryption and decryption
using what used to be the encryption test vectors. Naming is adjusted
accordingly: each cipher_testvec now has a 'ptext' (plaintext), 'ctext'
(ciphertext), and 'len' instead of an 'input', 'result', 'ilen', and
'rlen'. Note that it was always the case that 'ilen == rlen'.
AES keywrap ("kw(aes)") is special because its IV is generated by the
encryption. Previously this was handled by specifying 'iv_out' for
encryption and 'iv' for decryption. To make it work cleanly with only
one set of test vectors, put the IV in 'iv', remove 'iv_out', and add a
boolean that indicates that the IV is generated by the encryption.
In total, this removes over 10000 lines from testmgr.h, with no
reduction in test coverage since prior patches already copied the few
unique decryption test vectors into the encryption test vectors.
This covers all algorithms that used 'struct cipher_testvec', e.g. any
block cipher in the ECB, CBC, CTR, XTS, LRW, CTS-CBC, PCBC, OFB, or
keywrap modes, and Salsa20 and ChaCha20. No change is made to AEAD
tests, though we probably can eliminate a similar redundancy there too.
The testmgr.h portion of this patch was automatically generated using
the following awk script, with some slight manual fixups on top (updated
'struct cipher_testvec' definition, updated a few comments, and fixed up
the AES keywrap test vectors):
BEGIN { OTHER = 0; ENCVEC = 1; DECVEC = 2; DECVEC_TAIL = 3; mode = OTHER }
/^static const struct cipher_testvec.*_enc_/ { sub("_enc", ""); mode = ENCVEC }
/^static const struct cipher_testvec.*_dec_/ { mode = DECVEC }
mode == ENCVEC && !/\.ilen[[:space:]]*=/ {
sub(/\.input[[:space:]]*=$/, ".ptext =")
sub(/\.input[[:space:]]*=/, ".ptext\t=")
sub(/\.result[[:space:]]*=$/, ".ctext =")
sub(/\.result[[:space:]]*=/, ".ctext\t=")
sub(/\.rlen[[:space:]]*=/, ".len\t=")
print
}
mode == DECVEC_TAIL && /[^[:space:]]/ { mode = OTHER }
mode == OTHER { print }
mode == ENCVEC && /^};/ { mode = OTHER }
mode == DECVEC && /^};/ { mode = DECVEC_TAIL }
Note that git's default diff algorithm gets confused by the testmgr.h
portion of this patch, and reports too many lines added and removed.
It's better viewed with 'git diff --minimal' (or 'git show --minimal'),
which reports "2 files changed, 919 insertions(+), 11723 deletions(-)".
Signed-off-by: Eric Biggers <ebiggers@google.com>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
2018-05-21 08:50:29 +03:00
|
|
|
.cipher = __VECS(des3_ede_ctr_tv_template)
|
2012-10-20 15:53:12 +04:00
|
|
|
}
|
2018-04-23 10:25:14 +03:00
|
|
|
}, {
|
|
|
|
/* Same as ctr(aes) except the key is stored in
|
|
|
|
* hardware secure memory which we reference by index
|
|
|
|
*/
|
|
|
|
.alg = "ctr(paes)",
|
|
|
|
.test = alg_test_null,
|
|
|
|
.fips_allowed = 1,
|
2011-10-18 01:02:53 +04:00
|
|
|
}, {
|
|
|
|
.alg = "ctr(serpent)",
|
|
|
|
.test = alg_test_skcipher,
|
|
|
|
.suite = {
|
crypto: testmgr - eliminate redundant decryption test vectors
Currently testmgr has separate encryption and decryption test vectors
for symmetric ciphers. That's massively redundant, since with few
exceptions (mostly mistakes, apparently), all decryption tests are
identical to the encryption tests, just with the input/result flipped.
Therefore, eliminate the redundancy by removing the decryption test
vectors and updating testmgr to test both encryption and decryption
using what used to be the encryption test vectors. Naming is adjusted
accordingly: each cipher_testvec now has a 'ptext' (plaintext), 'ctext'
(ciphertext), and 'len' instead of an 'input', 'result', 'ilen', and
'rlen'. Note that it was always the case that 'ilen == rlen'.
AES keywrap ("kw(aes)") is special because its IV is generated by the
encryption. Previously this was handled by specifying 'iv_out' for
encryption and 'iv' for decryption. To make it work cleanly with only
one set of test vectors, put the IV in 'iv', remove 'iv_out', and add a
boolean that indicates that the IV is generated by the encryption.
In total, this removes over 10000 lines from testmgr.h, with no
reduction in test coverage since prior patches already copied the few
unique decryption test vectors into the encryption test vectors.
This covers all algorithms that used 'struct cipher_testvec', e.g. any
block cipher in the ECB, CBC, CTR, XTS, LRW, CTS-CBC, PCBC, OFB, or
keywrap modes, and Salsa20 and ChaCha20. No change is made to AEAD
tests, though we probably can eliminate a similar redundancy there too.
The testmgr.h portion of this patch was automatically generated using
the following awk script, with some slight manual fixups on top (updated
'struct cipher_testvec' definition, updated a few comments, and fixed up
the AES keywrap test vectors):
BEGIN { OTHER = 0; ENCVEC = 1; DECVEC = 2; DECVEC_TAIL = 3; mode = OTHER }
/^static const struct cipher_testvec.*_enc_/ { sub("_enc", ""); mode = ENCVEC }
/^static const struct cipher_testvec.*_dec_/ { mode = DECVEC }
mode == ENCVEC && !/\.ilen[[:space:]]*=/ {
sub(/\.input[[:space:]]*=$/, ".ptext =")
sub(/\.input[[:space:]]*=/, ".ptext\t=")
sub(/\.result[[:space:]]*=$/, ".ctext =")
sub(/\.result[[:space:]]*=/, ".ctext\t=")
sub(/\.rlen[[:space:]]*=/, ".len\t=")
print
}
mode == DECVEC_TAIL && /[^[:space:]]/ { mode = OTHER }
mode == OTHER { print }
mode == ENCVEC && /^};/ { mode = OTHER }
mode == DECVEC && /^};/ { mode = DECVEC_TAIL }
Note that git's default diff algorithm gets confused by the testmgr.h
portion of this patch, and reports too many lines added and removed.
It's better viewed with 'git diff --minimal' (or 'git show --minimal'),
which reports "2 files changed, 919 insertions(+), 11723 deletions(-)".
Signed-off-by: Eric Biggers <ebiggers@google.com>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
2018-05-21 08:50:29 +03:00
|
|
|
.cipher = __VECS(serpent_ctr_tv_template)
|
2011-10-18 01:02:53 +04:00
|
|
|
}
|
2018-09-20 16:18:38 +03:00
|
|
|
}, {
|
|
|
|
.alg = "ctr(sm4)",
|
|
|
|
.test = alg_test_skcipher,
|
|
|
|
.suite = {
|
|
|
|
.cipher = __VECS(sm4_ctr_tv_template)
|
|
|
|
}
|
2011-10-11 00:03:12 +04:00
|
|
|
}, {
|
|
|
|
.alg = "ctr(twofish)",
|
|
|
|
.test = alg_test_skcipher,
|
|
|
|
.suite = {
|
crypto: testmgr - eliminate redundant decryption test vectors
Currently testmgr has separate encryption and decryption test vectors
for symmetric ciphers. That's massively redundant, since with few
exceptions (mostly mistakes, apparently), all decryption tests are
identical to the encryption tests, just with the input/result flipped.
Therefore, eliminate the redundancy by removing the decryption test
vectors and updating testmgr to test both encryption and decryption
using what used to be the encryption test vectors. Naming is adjusted
accordingly: each cipher_testvec now has a 'ptext' (plaintext), 'ctext'
(ciphertext), and 'len' instead of an 'input', 'result', 'ilen', and
'rlen'. Note that it was always the case that 'ilen == rlen'.
AES keywrap ("kw(aes)") is special because its IV is generated by the
encryption. Previously this was handled by specifying 'iv_out' for
encryption and 'iv' for decryption. To make it work cleanly with only
one set of test vectors, put the IV in 'iv', remove 'iv_out', and add a
boolean that indicates that the IV is generated by the encryption.
In total, this removes over 10000 lines from testmgr.h, with no
reduction in test coverage since prior patches already copied the few
unique decryption test vectors into the encryption test vectors.
This covers all algorithms that used 'struct cipher_testvec', e.g. any
block cipher in the ECB, CBC, CTR, XTS, LRW, CTS-CBC, PCBC, OFB, or
keywrap modes, and Salsa20 and ChaCha20. No change is made to AEAD
tests, though we probably can eliminate a similar redundancy there too.
The testmgr.h portion of this patch was automatically generated using
the following awk script, with some slight manual fixups on top (updated
'struct cipher_testvec' definition, updated a few comments, and fixed up
the AES keywrap test vectors):
BEGIN { OTHER = 0; ENCVEC = 1; DECVEC = 2; DECVEC_TAIL = 3; mode = OTHER }
/^static const struct cipher_testvec.*_enc_/ { sub("_enc", ""); mode = ENCVEC }
/^static const struct cipher_testvec.*_dec_/ { mode = DECVEC }
mode == ENCVEC && !/\.ilen[[:space:]]*=/ {
sub(/\.input[[:space:]]*=$/, ".ptext =")
sub(/\.input[[:space:]]*=/, ".ptext\t=")
sub(/\.result[[:space:]]*=$/, ".ctext =")
sub(/\.result[[:space:]]*=/, ".ctext\t=")
sub(/\.rlen[[:space:]]*=/, ".len\t=")
print
}
mode == DECVEC_TAIL && /[^[:space:]]/ { mode = OTHER }
mode == OTHER { print }
mode == ENCVEC && /^};/ { mode = OTHER }
mode == DECVEC && /^};/ { mode = DECVEC_TAIL }
Note that git's default diff algorithm gets confused by the testmgr.h
portion of this patch, and reports too many lines added and removed.
It's better viewed with 'git diff --minimal' (or 'git show --minimal'),
which reports "2 files changed, 919 insertions(+), 11723 deletions(-)".
Signed-off-by: Eric Biggers <ebiggers@google.com>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
2018-05-21 08:50:29 +03:00
|
|
|
.cipher = __VECS(tf_ctr_tv_template)
|
2011-10-11 00:03:12 +04:00
|
|
|
}
|
2008-07-31 13:08:25 +04:00
|
|
|
}, {
|
|
|
|
.alg = "cts(cbc(aes))",
|
2008-08-17 11:01:56 +04:00
|
|
|
.test = alg_test_skcipher,
|
2018-11-04 13:05:24 +03:00
|
|
|
.fips_allowed = 1,
|
2008-07-31 13:08:25 +04:00
|
|
|
.suite = {
|
crypto: testmgr - eliminate redundant decryption test vectors
Currently testmgr has separate encryption and decryption test vectors
for symmetric ciphers. That's massively redundant, since with few
exceptions (mostly mistakes, apparently), all decryption tests are
identical to the encryption tests, just with the input/result flipped.
Therefore, eliminate the redundancy by removing the decryption test
vectors and updating testmgr to test both encryption and decryption
using what used to be the encryption test vectors. Naming is adjusted
accordingly: each cipher_testvec now has a 'ptext' (plaintext), 'ctext'
(ciphertext), and 'len' instead of an 'input', 'result', 'ilen', and
'rlen'. Note that it was always the case that 'ilen == rlen'.
AES keywrap ("kw(aes)") is special because its IV is generated by the
encryption. Previously this was handled by specifying 'iv_out' for
encryption and 'iv' for decryption. To make it work cleanly with only
one set of test vectors, put the IV in 'iv', remove 'iv_out', and add a
boolean that indicates that the IV is generated by the encryption.
In total, this removes over 10000 lines from testmgr.h, with no
reduction in test coverage since prior patches already copied the few
unique decryption test vectors into the encryption test vectors.
This covers all algorithms that used 'struct cipher_testvec', e.g. any
block cipher in the ECB, CBC, CTR, XTS, LRW, CTS-CBC, PCBC, OFB, or
keywrap modes, and Salsa20 and ChaCha20. No change is made to AEAD
tests, though we probably can eliminate a similar redundancy there too.
The testmgr.h portion of this patch was automatically generated using
the following awk script, with some slight manual fixups on top (updated
'struct cipher_testvec' definition, updated a few comments, and fixed up
the AES keywrap test vectors):
BEGIN { OTHER = 0; ENCVEC = 1; DECVEC = 2; DECVEC_TAIL = 3; mode = OTHER }
/^static const struct cipher_testvec.*_enc_/ { sub("_enc", ""); mode = ENCVEC }
/^static const struct cipher_testvec.*_dec_/ { mode = DECVEC }
mode == ENCVEC && !/\.ilen[[:space:]]*=/ {
sub(/\.input[[:space:]]*=$/, ".ptext =")
sub(/\.input[[:space:]]*=/, ".ptext\t=")
sub(/\.result[[:space:]]*=$/, ".ctext =")
sub(/\.result[[:space:]]*=/, ".ctext\t=")
sub(/\.rlen[[:space:]]*=/, ".len\t=")
print
}
mode == DECVEC_TAIL && /[^[:space:]]/ { mode = OTHER }
mode == OTHER { print }
mode == ENCVEC && /^};/ { mode = OTHER }
mode == DECVEC && /^};/ { mode = DECVEC_TAIL }
Note that git's default diff algorithm gets confused by the testmgr.h
portion of this patch, and reports too many lines added and removed.
It's better viewed with 'git diff --minimal' (or 'git show --minimal'),
which reports "2 files changed, 919 insertions(+), 11723 deletions(-)".
Signed-off-by: Eric Biggers <ebiggers@google.com>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
2018-05-21 08:50:29 +03:00
|
|
|
.cipher = __VECS(cts_mode_tv_template)
|
2008-07-31 13:08:25 +04:00
|
|
|
}
|
|
|
|
}, {
|
|
|
|
.alg = "deflate",
|
|
|
|
.test = alg_test_comp,
|
2012-12-06 13:16:28 +04:00
|
|
|
.fips_allowed = 1,
|
2008-07-31 13:08:25 +04:00
|
|
|
.suite = {
|
|
|
|
.comp = {
|
2017-01-12 16:40:39 +03:00
|
|
|
.comp = __VECS(deflate_comp_tv_template),
|
|
|
|
.decomp = __VECS(deflate_decomp_tv_template)
|
2008-07-31 13:08:25 +04:00
|
|
|
}
|
|
|
|
}
|
2016-06-22 19:49:14 +03:00
|
|
|
}, {
|
|
|
|
.alg = "dh",
|
|
|
|
.test = alg_test_kpp,
|
|
|
|
.fips_allowed = 1,
|
|
|
|
.suite = {
|
2017-01-12 16:40:39 +03:00
|
|
|
.kpp = __VECS(dh_tv_template)
|
2016-06-22 19:49:14 +03:00
|
|
|
}
|
2013-04-07 17:43:56 +04:00
|
|
|
}, {
|
|
|
|
.alg = "digest_null",
|
|
|
|
.test = alg_test_null,
|
2014-05-31 19:25:36 +04:00
|
|
|
}, {
|
|
|
|
.alg = "drbg_nopr_ctr_aes128",
|
|
|
|
.test = alg_test_drbg,
|
|
|
|
.fips_allowed = 1,
|
|
|
|
.suite = {
|
2017-01-12 16:40:39 +03:00
|
|
|
.drbg = __VECS(drbg_nopr_ctr_aes128_tv_template)
|
2014-05-31 19:25:36 +04:00
|
|
|
}
|
|
|
|
}, {
|
|
|
|
.alg = "drbg_nopr_ctr_aes192",
|
|
|
|
.test = alg_test_drbg,
|
|
|
|
.fips_allowed = 1,
|
|
|
|
.suite = {
|
2017-01-12 16:40:39 +03:00
|
|
|
.drbg = __VECS(drbg_nopr_ctr_aes192_tv_template)
|
2014-05-31 19:25:36 +04:00
|
|
|
}
|
|
|
|
}, {
|
|
|
|
.alg = "drbg_nopr_ctr_aes256",
|
|
|
|
.test = alg_test_drbg,
|
|
|
|
.fips_allowed = 1,
|
|
|
|
.suite = {
|
2017-01-12 16:40:39 +03:00
|
|
|
.drbg = __VECS(drbg_nopr_ctr_aes256_tv_template)
|
2014-05-31 19:25:36 +04:00
|
|
|
}
|
|
|
|
}, {
|
|
|
|
/*
|
|
|
|
* There is no need to specifically test the DRBG with every
|
|
|
|
* backend cipher -- covered by drbg_nopr_hmac_sha256 test
|
|
|
|
*/
|
|
|
|
.alg = "drbg_nopr_hmac_sha1",
|
|
|
|
.fips_allowed = 1,
|
|
|
|
.test = alg_test_null,
|
|
|
|
}, {
|
|
|
|
.alg = "drbg_nopr_hmac_sha256",
|
|
|
|
.test = alg_test_drbg,
|
|
|
|
.fips_allowed = 1,
|
|
|
|
.suite = {
|
2017-01-12 16:40:39 +03:00
|
|
|
.drbg = __VECS(drbg_nopr_hmac_sha256_tv_template)
|
2014-05-31 19:25:36 +04:00
|
|
|
}
|
|
|
|
}, {
|
|
|
|
/* covered by drbg_nopr_hmac_sha256 test */
|
|
|
|
.alg = "drbg_nopr_hmac_sha384",
|
|
|
|
.fips_allowed = 1,
|
|
|
|
.test = alg_test_null,
|
|
|
|
}, {
|
|
|
|
.alg = "drbg_nopr_hmac_sha512",
|
|
|
|
.test = alg_test_null,
|
|
|
|
.fips_allowed = 1,
|
|
|
|
}, {
|
|
|
|
.alg = "drbg_nopr_sha1",
|
|
|
|
.fips_allowed = 1,
|
|
|
|
.test = alg_test_null,
|
|
|
|
}, {
|
|
|
|
.alg = "drbg_nopr_sha256",
|
|
|
|
.test = alg_test_drbg,
|
|
|
|
.fips_allowed = 1,
|
|
|
|
.suite = {
|
2017-01-12 16:40:39 +03:00
|
|
|
.drbg = __VECS(drbg_nopr_sha256_tv_template)
|
2014-05-31 19:25:36 +04:00
|
|
|
}
|
|
|
|
}, {
|
|
|
|
/* covered by drbg_nopr_sha256 test */
|
|
|
|
.alg = "drbg_nopr_sha384",
|
|
|
|
.fips_allowed = 1,
|
|
|
|
.test = alg_test_null,
|
|
|
|
}, {
|
|
|
|
.alg = "drbg_nopr_sha512",
|
|
|
|
.fips_allowed = 1,
|
|
|
|
.test = alg_test_null,
|
|
|
|
}, {
|
|
|
|
.alg = "drbg_pr_ctr_aes128",
|
|
|
|
.test = alg_test_drbg,
|
|
|
|
.fips_allowed = 1,
|
|
|
|
.suite = {
|
2017-01-12 16:40:39 +03:00
|
|
|
.drbg = __VECS(drbg_pr_ctr_aes128_tv_template)
|
2014-05-31 19:25:36 +04:00
|
|
|
}
|
|
|
|
}, {
|
|
|
|
/* covered by drbg_pr_ctr_aes128 test */
|
|
|
|
.alg = "drbg_pr_ctr_aes192",
|
|
|
|
.fips_allowed = 1,
|
|
|
|
.test = alg_test_null,
|
|
|
|
}, {
|
|
|
|
.alg = "drbg_pr_ctr_aes256",
|
|
|
|
.fips_allowed = 1,
|
|
|
|
.test = alg_test_null,
|
|
|
|
}, {
|
|
|
|
.alg = "drbg_pr_hmac_sha1",
|
|
|
|
.fips_allowed = 1,
|
|
|
|
.test = alg_test_null,
|
|
|
|
}, {
|
|
|
|
.alg = "drbg_pr_hmac_sha256",
|
|
|
|
.test = alg_test_drbg,
|
|
|
|
.fips_allowed = 1,
|
|
|
|
.suite = {
|
2017-01-12 16:40:39 +03:00
|
|
|
.drbg = __VECS(drbg_pr_hmac_sha256_tv_template)
|
2014-05-31 19:25:36 +04:00
|
|
|
}
|
|
|
|
}, {
|
|
|
|
/* covered by drbg_pr_hmac_sha256 test */
|
|
|
|
.alg = "drbg_pr_hmac_sha384",
|
|
|
|
.fips_allowed = 1,
|
|
|
|
.test = alg_test_null,
|
|
|
|
}, {
|
|
|
|
.alg = "drbg_pr_hmac_sha512",
|
|
|
|
.test = alg_test_null,
|
|
|
|
.fips_allowed = 1,
|
|
|
|
}, {
|
|
|
|
.alg = "drbg_pr_sha1",
|
|
|
|
.fips_allowed = 1,
|
|
|
|
.test = alg_test_null,
|
|
|
|
}, {
|
|
|
|
.alg = "drbg_pr_sha256",
|
|
|
|
.test = alg_test_drbg,
|
|
|
|
.fips_allowed = 1,
|
|
|
|
.suite = {
|
2017-01-12 16:40:39 +03:00
|
|
|
.drbg = __VECS(drbg_pr_sha256_tv_template)
|
2014-05-31 19:25:36 +04:00
|
|
|
}
|
|
|
|
}, {
|
|
|
|
/* covered by drbg_pr_sha256 test */
|
|
|
|
.alg = "drbg_pr_sha384",
|
|
|
|
.fips_allowed = 1,
|
|
|
|
.test = alg_test_null,
|
|
|
|
}, {
|
|
|
|
.alg = "drbg_pr_sha512",
|
|
|
|
.fips_allowed = 1,
|
|
|
|
.test = alg_test_null,
|
2008-07-31 13:08:25 +04:00
|
|
|
}, {
|
|
|
|
.alg = "ecb(aes)",
|
2008-08-17 11:01:56 +04:00
|
|
|
.test = alg_test_skcipher,
|
2009-05-15 09:16:03 +04:00
|
|
|
.fips_allowed = 1,
|
2008-07-31 13:08:25 +04:00
|
|
|
.suite = {
|
crypto: testmgr - eliminate redundant decryption test vectors
Currently testmgr has separate encryption and decryption test vectors
for symmetric ciphers. That's massively redundant, since with few
exceptions (mostly mistakes, apparently), all decryption tests are
identical to the encryption tests, just with the input/result flipped.
Therefore, eliminate the redundancy by removing the decryption test
vectors and updating testmgr to test both encryption and decryption
using what used to be the encryption test vectors. Naming is adjusted
accordingly: each cipher_testvec now has a 'ptext' (plaintext), 'ctext'
(ciphertext), and 'len' instead of an 'input', 'result', 'ilen', and
'rlen'. Note that it was always the case that 'ilen == rlen'.
AES keywrap ("kw(aes)") is special because its IV is generated by the
encryption. Previously this was handled by specifying 'iv_out' for
encryption and 'iv' for decryption. To make it work cleanly with only
one set of test vectors, put the IV in 'iv', remove 'iv_out', and add a
boolean that indicates that the IV is generated by the encryption.
In total, this removes over 10000 lines from testmgr.h, with no
reduction in test coverage since prior patches already copied the few
unique decryption test vectors into the encryption test vectors.
This covers all algorithms that used 'struct cipher_testvec', e.g. any
block cipher in the ECB, CBC, CTR, XTS, LRW, CTS-CBC, PCBC, OFB, or
keywrap modes, and Salsa20 and ChaCha20. No change is made to AEAD
tests, though we probably can eliminate a similar redundancy there too.
The testmgr.h portion of this patch was automatically generated using
the following awk script, with some slight manual fixups on top (updated
'struct cipher_testvec' definition, updated a few comments, and fixed up
the AES keywrap test vectors):
BEGIN { OTHER = 0; ENCVEC = 1; DECVEC = 2; DECVEC_TAIL = 3; mode = OTHER }
/^static const struct cipher_testvec.*_enc_/ { sub("_enc", ""); mode = ENCVEC }
/^static const struct cipher_testvec.*_dec_/ { mode = DECVEC }
mode == ENCVEC && !/\.ilen[[:space:]]*=/ {
sub(/\.input[[:space:]]*=$/, ".ptext =")
sub(/\.input[[:space:]]*=/, ".ptext\t=")
sub(/\.result[[:space:]]*=$/, ".ctext =")
sub(/\.result[[:space:]]*=/, ".ctext\t=")
sub(/\.rlen[[:space:]]*=/, ".len\t=")
print
}
mode == DECVEC_TAIL && /[^[:space:]]/ { mode = OTHER }
mode == OTHER { print }
mode == ENCVEC && /^};/ { mode = OTHER }
mode == DECVEC && /^};/ { mode = DECVEC_TAIL }
Note that git's default diff algorithm gets confused by the testmgr.h
portion of this patch, and reports too many lines added and removed.
It's better viewed with 'git diff --minimal' (or 'git show --minimal'),
which reports "2 files changed, 919 insertions(+), 11723 deletions(-)".
Signed-off-by: Eric Biggers <ebiggers@google.com>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
2018-05-21 08:50:29 +03:00
|
|
|
.cipher = __VECS(aes_tv_template)
|
2008-07-31 13:08:25 +04:00
|
|
|
}
|
|
|
|
}, {
|
|
|
|
.alg = "ecb(anubis)",
|
2008-08-17 11:01:56 +04:00
|
|
|
.test = alg_test_skcipher,
|
2008-07-31 13:08:25 +04:00
|
|
|
.suite = {
|
crypto: testmgr - eliminate redundant decryption test vectors
Currently testmgr has separate encryption and decryption test vectors
for symmetric ciphers. That's massively redundant, since with few
exceptions (mostly mistakes, apparently), all decryption tests are
identical to the encryption tests, just with the input/result flipped.
Therefore, eliminate the redundancy by removing the decryption test
vectors and updating testmgr to test both encryption and decryption
using what used to be the encryption test vectors. Naming is adjusted
accordingly: each cipher_testvec now has a 'ptext' (plaintext), 'ctext'
(ciphertext), and 'len' instead of an 'input', 'result', 'ilen', and
'rlen'. Note that it was always the case that 'ilen == rlen'.
AES keywrap ("kw(aes)") is special because its IV is generated by the
encryption. Previously this was handled by specifying 'iv_out' for
encryption and 'iv' for decryption. To make it work cleanly with only
one set of test vectors, put the IV in 'iv', remove 'iv_out', and add a
boolean that indicates that the IV is generated by the encryption.
In total, this removes over 10000 lines from testmgr.h, with no
reduction in test coverage since prior patches already copied the few
unique decryption test vectors into the encryption test vectors.
This covers all algorithms that used 'struct cipher_testvec', e.g. any
block cipher in the ECB, CBC, CTR, XTS, LRW, CTS-CBC, PCBC, OFB, or
keywrap modes, and Salsa20 and ChaCha20. No change is made to AEAD
tests, though we probably can eliminate a similar redundancy there too.
The testmgr.h portion of this patch was automatically generated using
the following awk script, with some slight manual fixups on top (updated
'struct cipher_testvec' definition, updated a few comments, and fixed up
the AES keywrap test vectors):
BEGIN { OTHER = 0; ENCVEC = 1; DECVEC = 2; DECVEC_TAIL = 3; mode = OTHER }
/^static const struct cipher_testvec.*_enc_/ { sub("_enc", ""); mode = ENCVEC }
/^static const struct cipher_testvec.*_dec_/ { mode = DECVEC }
mode == ENCVEC && !/\.ilen[[:space:]]*=/ {
sub(/\.input[[:space:]]*=$/, ".ptext =")
sub(/\.input[[:space:]]*=/, ".ptext\t=")
sub(/\.result[[:space:]]*=$/, ".ctext =")
sub(/\.result[[:space:]]*=/, ".ctext\t=")
sub(/\.rlen[[:space:]]*=/, ".len\t=")
print
}
mode == DECVEC_TAIL && /[^[:space:]]/ { mode = OTHER }
mode == OTHER { print }
mode == ENCVEC && /^};/ { mode = OTHER }
mode == DECVEC && /^};/ { mode = DECVEC_TAIL }
Note that git's default diff algorithm gets confused by the testmgr.h
portion of this patch, and reports too many lines added and removed.
It's better viewed with 'git diff --minimal' (or 'git show --minimal'),
which reports "2 files changed, 919 insertions(+), 11723 deletions(-)".
Signed-off-by: Eric Biggers <ebiggers@google.com>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
2018-05-21 08:50:29 +03:00
|
|
|
.cipher = __VECS(anubis_tv_template)
|
2008-07-31 13:08:25 +04:00
|
|
|
}
|
|
|
|
}, {
|
|
|
|
.alg = "ecb(arc4)",
|
2008-08-17 11:01:56 +04:00
|
|
|
.test = alg_test_skcipher,
|
2008-07-31 13:08:25 +04:00
|
|
|
.suite = {
|
crypto: testmgr - eliminate redundant decryption test vectors
Currently testmgr has separate encryption and decryption test vectors
for symmetric ciphers. That's massively redundant, since with few
exceptions (mostly mistakes, apparently), all decryption tests are
identical to the encryption tests, just with the input/result flipped.
Therefore, eliminate the redundancy by removing the decryption test
vectors and updating testmgr to test both encryption and decryption
using what used to be the encryption test vectors. Naming is adjusted
accordingly: each cipher_testvec now has a 'ptext' (plaintext), 'ctext'
(ciphertext), and 'len' instead of an 'input', 'result', 'ilen', and
'rlen'. Note that it was always the case that 'ilen == rlen'.
AES keywrap ("kw(aes)") is special because its IV is generated by the
encryption. Previously this was handled by specifying 'iv_out' for
encryption and 'iv' for decryption. To make it work cleanly with only
one set of test vectors, put the IV in 'iv', remove 'iv_out', and add a
boolean that indicates that the IV is generated by the encryption.
In total, this removes over 10000 lines from testmgr.h, with no
reduction in test coverage since prior patches already copied the few
unique decryption test vectors into the encryption test vectors.
This covers all algorithms that used 'struct cipher_testvec', e.g. any
block cipher in the ECB, CBC, CTR, XTS, LRW, CTS-CBC, PCBC, OFB, or
keywrap modes, and Salsa20 and ChaCha20. No change is made to AEAD
tests, though we probably can eliminate a similar redundancy there too.
The testmgr.h portion of this patch was automatically generated using
the following awk script, with some slight manual fixups on top (updated
'struct cipher_testvec' definition, updated a few comments, and fixed up
the AES keywrap test vectors):
BEGIN { OTHER = 0; ENCVEC = 1; DECVEC = 2; DECVEC_TAIL = 3; mode = OTHER }
/^static const struct cipher_testvec.*_enc_/ { sub("_enc", ""); mode = ENCVEC }
/^static const struct cipher_testvec.*_dec_/ { mode = DECVEC }
mode == ENCVEC && !/\.ilen[[:space:]]*=/ {
sub(/\.input[[:space:]]*=$/, ".ptext =")
sub(/\.input[[:space:]]*=/, ".ptext\t=")
sub(/\.result[[:space:]]*=$/, ".ctext =")
sub(/\.result[[:space:]]*=/, ".ctext\t=")
sub(/\.rlen[[:space:]]*=/, ".len\t=")
print
}
mode == DECVEC_TAIL && /[^[:space:]]/ { mode = OTHER }
mode == OTHER { print }
mode == ENCVEC && /^};/ { mode = OTHER }
mode == DECVEC && /^};/ { mode = DECVEC_TAIL }
Note that git's default diff algorithm gets confused by the testmgr.h
portion of this patch, and reports too many lines added and removed.
It's better viewed with 'git diff --minimal' (or 'git show --minimal'),
which reports "2 files changed, 919 insertions(+), 11723 deletions(-)".
Signed-off-by: Eric Biggers <ebiggers@google.com>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
2018-05-21 08:50:29 +03:00
|
|
|
.cipher = __VECS(arc4_tv_template)
|
2008-07-31 13:08:25 +04:00
|
|
|
}
|
|
|
|
}, {
|
|
|
|
.alg = "ecb(blowfish)",
|
2008-08-17 11:01:56 +04:00
|
|
|
.test = alg_test_skcipher,
|
2008-07-31 13:08:25 +04:00
|
|
|
.suite = {
|
crypto: testmgr - eliminate redundant decryption test vectors
Currently testmgr has separate encryption and decryption test vectors
for symmetric ciphers. That's massively redundant, since with few
exceptions (mostly mistakes, apparently), all decryption tests are
identical to the encryption tests, just with the input/result flipped.
Therefore, eliminate the redundancy by removing the decryption test
vectors and updating testmgr to test both encryption and decryption
using what used to be the encryption test vectors. Naming is adjusted
accordingly: each cipher_testvec now has a 'ptext' (plaintext), 'ctext'
(ciphertext), and 'len' instead of an 'input', 'result', 'ilen', and
'rlen'. Note that it was always the case that 'ilen == rlen'.
AES keywrap ("kw(aes)") is special because its IV is generated by the
encryption. Previously this was handled by specifying 'iv_out' for
encryption and 'iv' for decryption. To make it work cleanly with only
one set of test vectors, put the IV in 'iv', remove 'iv_out', and add a
boolean that indicates that the IV is generated by the encryption.
In total, this removes over 10000 lines from testmgr.h, with no
reduction in test coverage since prior patches already copied the few
unique decryption test vectors into the encryption test vectors.
This covers all algorithms that used 'struct cipher_testvec', e.g. any
block cipher in the ECB, CBC, CTR, XTS, LRW, CTS-CBC, PCBC, OFB, or
keywrap modes, and Salsa20 and ChaCha20. No change is made to AEAD
tests, though we probably can eliminate a similar redundancy there too.
The testmgr.h portion of this patch was automatically generated using
the following awk script, with some slight manual fixups on top (updated
'struct cipher_testvec' definition, updated a few comments, and fixed up
the AES keywrap test vectors):
BEGIN { OTHER = 0; ENCVEC = 1; DECVEC = 2; DECVEC_TAIL = 3; mode = OTHER }
/^static const struct cipher_testvec.*_enc_/ { sub("_enc", ""); mode = ENCVEC }
/^static const struct cipher_testvec.*_dec_/ { mode = DECVEC }
mode == ENCVEC && !/\.ilen[[:space:]]*=/ {
sub(/\.input[[:space:]]*=$/, ".ptext =")
sub(/\.input[[:space:]]*=/, ".ptext\t=")
sub(/\.result[[:space:]]*=$/, ".ctext =")
sub(/\.result[[:space:]]*=/, ".ctext\t=")
sub(/\.rlen[[:space:]]*=/, ".len\t=")
print
}
mode == DECVEC_TAIL && /[^[:space:]]/ { mode = OTHER }
mode == OTHER { print }
mode == ENCVEC && /^};/ { mode = OTHER }
mode == DECVEC && /^};/ { mode = DECVEC_TAIL }
Note that git's default diff algorithm gets confused by the testmgr.h
portion of this patch, and reports too many lines added and removed.
It's better viewed with 'git diff --minimal' (or 'git show --minimal'),
which reports "2 files changed, 919 insertions(+), 11723 deletions(-)".
Signed-off-by: Eric Biggers <ebiggers@google.com>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
2018-05-21 08:50:29 +03:00
|
|
|
.cipher = __VECS(bf_tv_template)
|
2008-07-31 13:08:25 +04:00
|
|
|
}
|
|
|
|
}, {
|
|
|
|
.alg = "ecb(camellia)",
|
2008-08-17 11:01:56 +04:00
|
|
|
.test = alg_test_skcipher,
|
2008-07-31 13:08:25 +04:00
|
|
|
.suite = {
|
crypto: testmgr - eliminate redundant decryption test vectors
Currently testmgr has separate encryption and decryption test vectors
for symmetric ciphers. That's massively redundant, since with few
exceptions (mostly mistakes, apparently), all decryption tests are
identical to the encryption tests, just with the input/result flipped.
Therefore, eliminate the redundancy by removing the decryption test
vectors and updating testmgr to test both encryption and decryption
using what used to be the encryption test vectors. Naming is adjusted
accordingly: each cipher_testvec now has a 'ptext' (plaintext), 'ctext'
(ciphertext), and 'len' instead of an 'input', 'result', 'ilen', and
'rlen'. Note that it was always the case that 'ilen == rlen'.
AES keywrap ("kw(aes)") is special because its IV is generated by the
encryption. Previously this was handled by specifying 'iv_out' for
encryption and 'iv' for decryption. To make it work cleanly with only
one set of test vectors, put the IV in 'iv', remove 'iv_out', and add a
boolean that indicates that the IV is generated by the encryption.
In total, this removes over 10000 lines from testmgr.h, with no
reduction in test coverage since prior patches already copied the few
unique decryption test vectors into the encryption test vectors.
This covers all algorithms that used 'struct cipher_testvec', e.g. any
block cipher in the ECB, CBC, CTR, XTS, LRW, CTS-CBC, PCBC, OFB, or
keywrap modes, and Salsa20 and ChaCha20. No change is made to AEAD
tests, though we probably can eliminate a similar redundancy there too.
The testmgr.h portion of this patch was automatically generated using
the following awk script, with some slight manual fixups on top (updated
'struct cipher_testvec' definition, updated a few comments, and fixed up
the AES keywrap test vectors):
BEGIN { OTHER = 0; ENCVEC = 1; DECVEC = 2; DECVEC_TAIL = 3; mode = OTHER }
/^static const struct cipher_testvec.*_enc_/ { sub("_enc", ""); mode = ENCVEC }
/^static const struct cipher_testvec.*_dec_/ { mode = DECVEC }
mode == ENCVEC && !/\.ilen[[:space:]]*=/ {
sub(/\.input[[:space:]]*=$/, ".ptext =")
sub(/\.input[[:space:]]*=/, ".ptext\t=")
sub(/\.result[[:space:]]*=$/, ".ctext =")
sub(/\.result[[:space:]]*=/, ".ctext\t=")
sub(/\.rlen[[:space:]]*=/, ".len\t=")
print
}
mode == DECVEC_TAIL && /[^[:space:]]/ { mode = OTHER }
mode == OTHER { print }
mode == ENCVEC && /^};/ { mode = OTHER }
mode == DECVEC && /^};/ { mode = DECVEC_TAIL }
Note that git's default diff algorithm gets confused by the testmgr.h
portion of this patch, and reports too many lines added and removed.
It's better viewed with 'git diff --minimal' (or 'git show --minimal'),
which reports "2 files changed, 919 insertions(+), 11723 deletions(-)".
Signed-off-by: Eric Biggers <ebiggers@google.com>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
2018-05-21 08:50:29 +03:00
|
|
|
.cipher = __VECS(camellia_tv_template)
|
2008-07-31 13:08:25 +04:00
|
|
|
}
|
|
|
|
}, {
|
|
|
|
.alg = "ecb(cast5)",
|
2008-08-17 11:01:56 +04:00
|
|
|
.test = alg_test_skcipher,
|
2008-07-31 13:08:25 +04:00
|
|
|
.suite = {
|
crypto: testmgr - eliminate redundant decryption test vectors
Currently testmgr has separate encryption and decryption test vectors
for symmetric ciphers. That's massively redundant, since with few
exceptions (mostly mistakes, apparently), all decryption tests are
identical to the encryption tests, just with the input/result flipped.
Therefore, eliminate the redundancy by removing the decryption test
vectors and updating testmgr to test both encryption and decryption
using what used to be the encryption test vectors. Naming is adjusted
accordingly: each cipher_testvec now has a 'ptext' (plaintext), 'ctext'
(ciphertext), and 'len' instead of an 'input', 'result', 'ilen', and
'rlen'. Note that it was always the case that 'ilen == rlen'.
AES keywrap ("kw(aes)") is special because its IV is generated by the
encryption. Previously this was handled by specifying 'iv_out' for
encryption and 'iv' for decryption. To make it work cleanly with only
one set of test vectors, put the IV in 'iv', remove 'iv_out', and add a
boolean that indicates that the IV is generated by the encryption.
In total, this removes over 10000 lines from testmgr.h, with no
reduction in test coverage since prior patches already copied the few
unique decryption test vectors into the encryption test vectors.
This covers all algorithms that used 'struct cipher_testvec', e.g. any
block cipher in the ECB, CBC, CTR, XTS, LRW, CTS-CBC, PCBC, OFB, or
keywrap modes, and Salsa20 and ChaCha20. No change is made to AEAD
tests, though we probably can eliminate a similar redundancy there too.
The testmgr.h portion of this patch was automatically generated using
the following awk script, with some slight manual fixups on top (updated
'struct cipher_testvec' definition, updated a few comments, and fixed up
the AES keywrap test vectors):
BEGIN { OTHER = 0; ENCVEC = 1; DECVEC = 2; DECVEC_TAIL = 3; mode = OTHER }
/^static const struct cipher_testvec.*_enc_/ { sub("_enc", ""); mode = ENCVEC }
/^static const struct cipher_testvec.*_dec_/ { mode = DECVEC }
mode == ENCVEC && !/\.ilen[[:space:]]*=/ {
sub(/\.input[[:space:]]*=$/, ".ptext =")
sub(/\.input[[:space:]]*=/, ".ptext\t=")
sub(/\.result[[:space:]]*=$/, ".ctext =")
sub(/\.result[[:space:]]*=/, ".ctext\t=")
sub(/\.rlen[[:space:]]*=/, ".len\t=")
print
}
mode == DECVEC_TAIL && /[^[:space:]]/ { mode = OTHER }
mode == OTHER { print }
mode == ENCVEC && /^};/ { mode = OTHER }
mode == DECVEC && /^};/ { mode = DECVEC_TAIL }
Note that git's default diff algorithm gets confused by the testmgr.h
portion of this patch, and reports too many lines added and removed.
It's better viewed with 'git diff --minimal' (or 'git show --minimal'),
which reports "2 files changed, 919 insertions(+), 11723 deletions(-)".
Signed-off-by: Eric Biggers <ebiggers@google.com>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
2018-05-21 08:50:29 +03:00
|
|
|
.cipher = __VECS(cast5_tv_template)
|
2008-07-31 13:08:25 +04:00
|
|
|
}
|
|
|
|
}, {
|
|
|
|
.alg = "ecb(cast6)",
|
2008-08-17 11:01:56 +04:00
|
|
|
.test = alg_test_skcipher,
|
2008-07-31 13:08:25 +04:00
|
|
|
.suite = {
|
crypto: testmgr - eliminate redundant decryption test vectors
Currently testmgr has separate encryption and decryption test vectors
for symmetric ciphers. That's massively redundant, since with few
exceptions (mostly mistakes, apparently), all decryption tests are
identical to the encryption tests, just with the input/result flipped.
Therefore, eliminate the redundancy by removing the decryption test
vectors and updating testmgr to test both encryption and decryption
using what used to be the encryption test vectors. Naming is adjusted
accordingly: each cipher_testvec now has a 'ptext' (plaintext), 'ctext'
(ciphertext), and 'len' instead of an 'input', 'result', 'ilen', and
'rlen'. Note that it was always the case that 'ilen == rlen'.
AES keywrap ("kw(aes)") is special because its IV is generated by the
encryption. Previously this was handled by specifying 'iv_out' for
encryption and 'iv' for decryption. To make it work cleanly with only
one set of test vectors, put the IV in 'iv', remove 'iv_out', and add a
boolean that indicates that the IV is generated by the encryption.
In total, this removes over 10000 lines from testmgr.h, with no
reduction in test coverage since prior patches already copied the few
unique decryption test vectors into the encryption test vectors.
This covers all algorithms that used 'struct cipher_testvec', e.g. any
block cipher in the ECB, CBC, CTR, XTS, LRW, CTS-CBC, PCBC, OFB, or
keywrap modes, and Salsa20 and ChaCha20. No change is made to AEAD
tests, though we probably can eliminate a similar redundancy there too.
The testmgr.h portion of this patch was automatically generated using
the following awk script, with some slight manual fixups on top (updated
'struct cipher_testvec' definition, updated a few comments, and fixed up
the AES keywrap test vectors):
BEGIN { OTHER = 0; ENCVEC = 1; DECVEC = 2; DECVEC_TAIL = 3; mode = OTHER }
/^static const struct cipher_testvec.*_enc_/ { sub("_enc", ""); mode = ENCVEC }
/^static const struct cipher_testvec.*_dec_/ { mode = DECVEC }
mode == ENCVEC && !/\.ilen[[:space:]]*=/ {
sub(/\.input[[:space:]]*=$/, ".ptext =")
sub(/\.input[[:space:]]*=/, ".ptext\t=")
sub(/\.result[[:space:]]*=$/, ".ctext =")
sub(/\.result[[:space:]]*=/, ".ctext\t=")
sub(/\.rlen[[:space:]]*=/, ".len\t=")
print
}
mode == DECVEC_TAIL && /[^[:space:]]/ { mode = OTHER }
mode == OTHER { print }
mode == ENCVEC && /^};/ { mode = OTHER }
mode == DECVEC && /^};/ { mode = DECVEC_TAIL }
Note that git's default diff algorithm gets confused by the testmgr.h
portion of this patch, and reports too many lines added and removed.
It's better viewed with 'git diff --minimal' (or 'git show --minimal'),
which reports "2 files changed, 919 insertions(+), 11723 deletions(-)".
Signed-off-by: Eric Biggers <ebiggers@google.com>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
2018-05-21 08:50:29 +03:00
|
|
|
.cipher = __VECS(cast6_tv_template)
|
2008-07-31 13:08:25 +04:00
|
|
|
}
|
2013-04-07 17:43:56 +04:00
|
|
|
}, {
|
|
|
|
.alg = "ecb(cipher_null)",
|
|
|
|
.test = alg_test_null,
|
2017-04-21 14:03:06 +03:00
|
|
|
.fips_allowed = 1,
|
2008-07-31 13:08:25 +04:00
|
|
|
}, {
|
|
|
|
.alg = "ecb(des)",
|
2008-08-17 11:01:56 +04:00
|
|
|
.test = alg_test_skcipher,
|
2008-07-31 13:08:25 +04:00
|
|
|
.suite = {
|
crypto: testmgr - eliminate redundant decryption test vectors
Currently testmgr has separate encryption and decryption test vectors
for symmetric ciphers. That's massively redundant, since with few
exceptions (mostly mistakes, apparently), all decryption tests are
identical to the encryption tests, just with the input/result flipped.
Therefore, eliminate the redundancy by removing the decryption test
vectors and updating testmgr to test both encryption and decryption
using what used to be the encryption test vectors. Naming is adjusted
accordingly: each cipher_testvec now has a 'ptext' (plaintext), 'ctext'
(ciphertext), and 'len' instead of an 'input', 'result', 'ilen', and
'rlen'. Note that it was always the case that 'ilen == rlen'.
AES keywrap ("kw(aes)") is special because its IV is generated by the
encryption. Previously this was handled by specifying 'iv_out' for
encryption and 'iv' for decryption. To make it work cleanly with only
one set of test vectors, put the IV in 'iv', remove 'iv_out', and add a
boolean that indicates that the IV is generated by the encryption.
In total, this removes over 10000 lines from testmgr.h, with no
reduction in test coverage since prior patches already copied the few
unique decryption test vectors into the encryption test vectors.
This covers all algorithms that used 'struct cipher_testvec', e.g. any
block cipher in the ECB, CBC, CTR, XTS, LRW, CTS-CBC, PCBC, OFB, or
keywrap modes, and Salsa20 and ChaCha20. No change is made to AEAD
tests, though we probably can eliminate a similar redundancy there too.
The testmgr.h portion of this patch was automatically generated using
the following awk script, with some slight manual fixups on top (updated
'struct cipher_testvec' definition, updated a few comments, and fixed up
the AES keywrap test vectors):
BEGIN { OTHER = 0; ENCVEC = 1; DECVEC = 2; DECVEC_TAIL = 3; mode = OTHER }
/^static const struct cipher_testvec.*_enc_/ { sub("_enc", ""); mode = ENCVEC }
/^static const struct cipher_testvec.*_dec_/ { mode = DECVEC }
mode == ENCVEC && !/\.ilen[[:space:]]*=/ {
sub(/\.input[[:space:]]*=$/, ".ptext =")
sub(/\.input[[:space:]]*=/, ".ptext\t=")
sub(/\.result[[:space:]]*=$/, ".ctext =")
sub(/\.result[[:space:]]*=/, ".ctext\t=")
sub(/\.rlen[[:space:]]*=/, ".len\t=")
print
}
mode == DECVEC_TAIL && /[^[:space:]]/ { mode = OTHER }
mode == OTHER { print }
mode == ENCVEC && /^};/ { mode = OTHER }
mode == DECVEC && /^};/ { mode = DECVEC_TAIL }
Note that git's default diff algorithm gets confused by the testmgr.h
portion of this patch, and reports too many lines added and removed.
It's better viewed with 'git diff --minimal' (or 'git show --minimal'),
which reports "2 files changed, 919 insertions(+), 11723 deletions(-)".
Signed-off-by: Eric Biggers <ebiggers@google.com>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
2018-05-21 08:50:29 +03:00
|
|
|
.cipher = __VECS(des_tv_template)
|
2008-07-31 13:08:25 +04:00
|
|
|
}
|
|
|
|
}, {
|
|
|
|
.alg = "ecb(des3_ede)",
|
2008-08-17 11:01:56 +04:00
|
|
|
.test = alg_test_skcipher,
|
2009-05-15 09:16:03 +04:00
|
|
|
.fips_allowed = 1,
|
2008-07-31 13:08:25 +04:00
|
|
|
.suite = {
|
crypto: testmgr - eliminate redundant decryption test vectors
Currently testmgr has separate encryption and decryption test vectors
for symmetric ciphers. That's massively redundant, since with few
exceptions (mostly mistakes, apparently), all decryption tests are
identical to the encryption tests, just with the input/result flipped.
Therefore, eliminate the redundancy by removing the decryption test
vectors and updating testmgr to test both encryption and decryption
using what used to be the encryption test vectors. Naming is adjusted
accordingly: each cipher_testvec now has a 'ptext' (plaintext), 'ctext'
(ciphertext), and 'len' instead of an 'input', 'result', 'ilen', and
'rlen'. Note that it was always the case that 'ilen == rlen'.
AES keywrap ("kw(aes)") is special because its IV is generated by the
encryption. Previously this was handled by specifying 'iv_out' for
encryption and 'iv' for decryption. To make it work cleanly with only
one set of test vectors, put the IV in 'iv', remove 'iv_out', and add a
boolean that indicates that the IV is generated by the encryption.
In total, this removes over 10000 lines from testmgr.h, with no
reduction in test coverage since prior patches already copied the few
unique decryption test vectors into the encryption test vectors.
This covers all algorithms that used 'struct cipher_testvec', e.g. any
block cipher in the ECB, CBC, CTR, XTS, LRW, CTS-CBC, PCBC, OFB, or
keywrap modes, and Salsa20 and ChaCha20. No change is made to AEAD
tests, though we probably can eliminate a similar redundancy there too.
The testmgr.h portion of this patch was automatically generated using
the following awk script, with some slight manual fixups on top (updated
'struct cipher_testvec' definition, updated a few comments, and fixed up
the AES keywrap test vectors):
BEGIN { OTHER = 0; ENCVEC = 1; DECVEC = 2; DECVEC_TAIL = 3; mode = OTHER }
/^static const struct cipher_testvec.*_enc_/ { sub("_enc", ""); mode = ENCVEC }
/^static const struct cipher_testvec.*_dec_/ { mode = DECVEC }
mode == ENCVEC && !/\.ilen[[:space:]]*=/ {
sub(/\.input[[:space:]]*=$/, ".ptext =")
sub(/\.input[[:space:]]*=/, ".ptext\t=")
sub(/\.result[[:space:]]*=$/, ".ctext =")
sub(/\.result[[:space:]]*=/, ".ctext\t=")
sub(/\.rlen[[:space:]]*=/, ".len\t=")
print
}
mode == DECVEC_TAIL && /[^[:space:]]/ { mode = OTHER }
mode == OTHER { print }
mode == ENCVEC && /^};/ { mode = OTHER }
mode == DECVEC && /^};/ { mode = DECVEC_TAIL }
Note that git's default diff algorithm gets confused by the testmgr.h
portion of this patch, and reports too many lines added and removed.
It's better viewed with 'git diff --minimal' (or 'git show --minimal'),
which reports "2 files changed, 919 insertions(+), 11723 deletions(-)".
Signed-off-by: Eric Biggers <ebiggers@google.com>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
2018-05-21 08:50:29 +03:00
|
|
|
.cipher = __VECS(des3_ede_tv_template)
|
2008-07-31 13:08:25 +04:00
|
|
|
}
|
2013-01-19 15:31:36 +04:00
|
|
|
}, {
|
|
|
|
.alg = "ecb(fcrypt)",
|
|
|
|
.test = alg_test_skcipher,
|
|
|
|
.suite = {
|
|
|
|
.cipher = {
|
crypto: testmgr - eliminate redundant decryption test vectors
Currently testmgr has separate encryption and decryption test vectors
for symmetric ciphers. That's massively redundant, since with few
exceptions (mostly mistakes, apparently), all decryption tests are
identical to the encryption tests, just with the input/result flipped.
Therefore, eliminate the redundancy by removing the decryption test
vectors and updating testmgr to test both encryption and decryption
using what used to be the encryption test vectors. Naming is adjusted
accordingly: each cipher_testvec now has a 'ptext' (plaintext), 'ctext'
(ciphertext), and 'len' instead of an 'input', 'result', 'ilen', and
'rlen'. Note that it was always the case that 'ilen == rlen'.
AES keywrap ("kw(aes)") is special because its IV is generated by the
encryption. Previously this was handled by specifying 'iv_out' for
encryption and 'iv' for decryption. To make it work cleanly with only
one set of test vectors, put the IV in 'iv', remove 'iv_out', and add a
boolean that indicates that the IV is generated by the encryption.
In total, this removes over 10000 lines from testmgr.h, with no
reduction in test coverage since prior patches already copied the few
unique decryption test vectors into the encryption test vectors.
This covers all algorithms that used 'struct cipher_testvec', e.g. any
block cipher in the ECB, CBC, CTR, XTS, LRW, CTS-CBC, PCBC, OFB, or
keywrap modes, and Salsa20 and ChaCha20. No change is made to AEAD
tests, though we probably can eliminate a similar redundancy there too.
The testmgr.h portion of this patch was automatically generated using
the following awk script, with some slight manual fixups on top (updated
'struct cipher_testvec' definition, updated a few comments, and fixed up
the AES keywrap test vectors):
BEGIN { OTHER = 0; ENCVEC = 1; DECVEC = 2; DECVEC_TAIL = 3; mode = OTHER }
/^static const struct cipher_testvec.*_enc_/ { sub("_enc", ""); mode = ENCVEC }
/^static const struct cipher_testvec.*_dec_/ { mode = DECVEC }
mode == ENCVEC && !/\.ilen[[:space:]]*=/ {
sub(/\.input[[:space:]]*=$/, ".ptext =")
sub(/\.input[[:space:]]*=/, ".ptext\t=")
sub(/\.result[[:space:]]*=$/, ".ctext =")
sub(/\.result[[:space:]]*=/, ".ctext\t=")
sub(/\.rlen[[:space:]]*=/, ".len\t=")
print
}
mode == DECVEC_TAIL && /[^[:space:]]/ { mode = OTHER }
mode == OTHER { print }
mode == ENCVEC && /^};/ { mode = OTHER }
mode == DECVEC && /^};/ { mode = DECVEC_TAIL }
Note that git's default diff algorithm gets confused by the testmgr.h
portion of this patch, and reports too many lines added and removed.
It's better viewed with 'git diff --minimal' (or 'git show --minimal'),
which reports "2 files changed, 919 insertions(+), 11723 deletions(-)".
Signed-off-by: Eric Biggers <ebiggers@google.com>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
2018-05-21 08:50:29 +03:00
|
|
|
.vecs = fcrypt_pcbc_tv_template,
|
|
|
|
.count = 1
|
2013-01-19 15:31:36 +04:00
|
|
|
}
|
|
|
|
}
|
2008-07-31 13:08:25 +04:00
|
|
|
}, {
|
|
|
|
.alg = "ecb(khazad)",
|
2008-08-17 11:01:56 +04:00
|
|
|
.test = alg_test_skcipher,
|
2008-07-31 13:08:25 +04:00
|
|
|
.suite = {
|
crypto: testmgr - eliminate redundant decryption test vectors
Currently testmgr has separate encryption and decryption test vectors
for symmetric ciphers. That's massively redundant, since with few
exceptions (mostly mistakes, apparently), all decryption tests are
identical to the encryption tests, just with the input/result flipped.
Therefore, eliminate the redundancy by removing the decryption test
vectors and updating testmgr to test both encryption and decryption
using what used to be the encryption test vectors. Naming is adjusted
accordingly: each cipher_testvec now has a 'ptext' (plaintext), 'ctext'
(ciphertext), and 'len' instead of an 'input', 'result', 'ilen', and
'rlen'. Note that it was always the case that 'ilen == rlen'.
AES keywrap ("kw(aes)") is special because its IV is generated by the
encryption. Previously this was handled by specifying 'iv_out' for
encryption and 'iv' for decryption. To make it work cleanly with only
one set of test vectors, put the IV in 'iv', remove 'iv_out', and add a
boolean that indicates that the IV is generated by the encryption.
In total, this removes over 10000 lines from testmgr.h, with no
reduction in test coverage since prior patches already copied the few
unique decryption test vectors into the encryption test vectors.
This covers all algorithms that used 'struct cipher_testvec', e.g. any
block cipher in the ECB, CBC, CTR, XTS, LRW, CTS-CBC, PCBC, OFB, or
keywrap modes, and Salsa20 and ChaCha20. No change is made to AEAD
tests, though we probably can eliminate a similar redundancy there too.
The testmgr.h portion of this patch was automatically generated using
the following awk script, with some slight manual fixups on top (updated
'struct cipher_testvec' definition, updated a few comments, and fixed up
the AES keywrap test vectors):
BEGIN { OTHER = 0; ENCVEC = 1; DECVEC = 2; DECVEC_TAIL = 3; mode = OTHER }
/^static const struct cipher_testvec.*_enc_/ { sub("_enc", ""); mode = ENCVEC }
/^static const struct cipher_testvec.*_dec_/ { mode = DECVEC }
mode == ENCVEC && !/\.ilen[[:space:]]*=/ {
sub(/\.input[[:space:]]*=$/, ".ptext =")
sub(/\.input[[:space:]]*=/, ".ptext\t=")
sub(/\.result[[:space:]]*=$/, ".ctext =")
sub(/\.result[[:space:]]*=/, ".ctext\t=")
sub(/\.rlen[[:space:]]*=/, ".len\t=")
print
}
mode == DECVEC_TAIL && /[^[:space:]]/ { mode = OTHER }
mode == OTHER { print }
mode == ENCVEC && /^};/ { mode = OTHER }
mode == DECVEC && /^};/ { mode = DECVEC_TAIL }
Note that git's default diff algorithm gets confused by the testmgr.h
portion of this patch, and reports too many lines added and removed.
It's better viewed with 'git diff --minimal' (or 'git show --minimal'),
which reports "2 files changed, 919 insertions(+), 11723 deletions(-)".
Signed-off-by: Eric Biggers <ebiggers@google.com>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
2018-05-21 08:50:29 +03:00
|
|
|
.cipher = __VECS(khazad_tv_template)
|
2008-07-31 13:08:25 +04:00
|
|
|
}
|
2018-05-11 11:04:06 +03:00
|
|
|
}, {
|
|
|
|
/* Same as ecb(aes) except the key is stored in
|
|
|
|
* hardware secure memory which we reference by index
|
|
|
|
*/
|
|
|
|
.alg = "ecb(paes)",
|
|
|
|
.test = alg_test_null,
|
|
|
|
.fips_allowed = 1,
|
2008-07-31 13:08:25 +04:00
|
|
|
}, {
|
|
|
|
.alg = "ecb(seed)",
|
2008-08-17 11:01:56 +04:00
|
|
|
.test = alg_test_skcipher,
|
2008-07-31 13:08:25 +04:00
|
|
|
.suite = {
|
crypto: testmgr - eliminate redundant decryption test vectors
Currently testmgr has separate encryption and decryption test vectors
for symmetric ciphers. That's massively redundant, since with few
exceptions (mostly mistakes, apparently), all decryption tests are
identical to the encryption tests, just with the input/result flipped.
Therefore, eliminate the redundancy by removing the decryption test
vectors and updating testmgr to test both encryption and decryption
using what used to be the encryption test vectors. Naming is adjusted
accordingly: each cipher_testvec now has a 'ptext' (plaintext), 'ctext'
(ciphertext), and 'len' instead of an 'input', 'result', 'ilen', and
'rlen'. Note that it was always the case that 'ilen == rlen'.
AES keywrap ("kw(aes)") is special because its IV is generated by the
encryption. Previously this was handled by specifying 'iv_out' for
encryption and 'iv' for decryption. To make it work cleanly with only
one set of test vectors, put the IV in 'iv', remove 'iv_out', and add a
boolean that indicates that the IV is generated by the encryption.
In total, this removes over 10000 lines from testmgr.h, with no
reduction in test coverage since prior patches already copied the few
unique decryption test vectors into the encryption test vectors.
This covers all algorithms that used 'struct cipher_testvec', e.g. any
block cipher in the ECB, CBC, CTR, XTS, LRW, CTS-CBC, PCBC, OFB, or
keywrap modes, and Salsa20 and ChaCha20. No change is made to AEAD
tests, though we probably can eliminate a similar redundancy there too.
The testmgr.h portion of this patch was automatically generated using
the following awk script, with some slight manual fixups on top (updated
'struct cipher_testvec' definition, updated a few comments, and fixed up
the AES keywrap test vectors):
BEGIN { OTHER = 0; ENCVEC = 1; DECVEC = 2; DECVEC_TAIL = 3; mode = OTHER }
/^static const struct cipher_testvec.*_enc_/ { sub("_enc", ""); mode = ENCVEC }
/^static const struct cipher_testvec.*_dec_/ { mode = DECVEC }
mode == ENCVEC && !/\.ilen[[:space:]]*=/ {
sub(/\.input[[:space:]]*=$/, ".ptext =")
sub(/\.input[[:space:]]*=/, ".ptext\t=")
sub(/\.result[[:space:]]*=$/, ".ctext =")
sub(/\.result[[:space:]]*=/, ".ctext\t=")
sub(/\.rlen[[:space:]]*=/, ".len\t=")
print
}
mode == DECVEC_TAIL && /[^[:space:]]/ { mode = OTHER }
mode == OTHER { print }
mode == ENCVEC && /^};/ { mode = OTHER }
mode == DECVEC && /^};/ { mode = DECVEC_TAIL }
Note that git's default diff algorithm gets confused by the testmgr.h
portion of this patch, and reports too many lines added and removed.
It's better viewed with 'git diff --minimal' (or 'git show --minimal'),
which reports "2 files changed, 919 insertions(+), 11723 deletions(-)".
Signed-off-by: Eric Biggers <ebiggers@google.com>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
2018-05-21 08:50:29 +03:00
|
|
|
.cipher = __VECS(seed_tv_template)
|
2008-07-31 13:08:25 +04:00
|
|
|
}
|
|
|
|
}, {
|
|
|
|
.alg = "ecb(serpent)",
|
2008-08-17 11:01:56 +04:00
|
|
|
.test = alg_test_skcipher,
|
2008-07-31 13:08:25 +04:00
|
|
|
.suite = {
|
crypto: testmgr - eliminate redundant decryption test vectors
Currently testmgr has separate encryption and decryption test vectors
for symmetric ciphers. That's massively redundant, since with few
exceptions (mostly mistakes, apparently), all decryption tests are
identical to the encryption tests, just with the input/result flipped.
Therefore, eliminate the redundancy by removing the decryption test
vectors and updating testmgr to test both encryption and decryption
using what used to be the encryption test vectors. Naming is adjusted
accordingly: each cipher_testvec now has a 'ptext' (plaintext), 'ctext'
(ciphertext), and 'len' instead of an 'input', 'result', 'ilen', and
'rlen'. Note that it was always the case that 'ilen == rlen'.
AES keywrap ("kw(aes)") is special because its IV is generated by the
encryption. Previously this was handled by specifying 'iv_out' for
encryption and 'iv' for decryption. To make it work cleanly with only
one set of test vectors, put the IV in 'iv', remove 'iv_out', and add a
boolean that indicates that the IV is generated by the encryption.
In total, this removes over 10000 lines from testmgr.h, with no
reduction in test coverage since prior patches already copied the few
unique decryption test vectors into the encryption test vectors.
This covers all algorithms that used 'struct cipher_testvec', e.g. any
block cipher in the ECB, CBC, CTR, XTS, LRW, CTS-CBC, PCBC, OFB, or
keywrap modes, and Salsa20 and ChaCha20. No change is made to AEAD
tests, though we probably can eliminate a similar redundancy there too.
The testmgr.h portion of this patch was automatically generated using
the following awk script, with some slight manual fixups on top (updated
'struct cipher_testvec' definition, updated a few comments, and fixed up
the AES keywrap test vectors):
BEGIN { OTHER = 0; ENCVEC = 1; DECVEC = 2; DECVEC_TAIL = 3; mode = OTHER }
/^static const struct cipher_testvec.*_enc_/ { sub("_enc", ""); mode = ENCVEC }
/^static const struct cipher_testvec.*_dec_/ { mode = DECVEC }
mode == ENCVEC && !/\.ilen[[:space:]]*=/ {
sub(/\.input[[:space:]]*=$/, ".ptext =")
sub(/\.input[[:space:]]*=/, ".ptext\t=")
sub(/\.result[[:space:]]*=$/, ".ctext =")
sub(/\.result[[:space:]]*=/, ".ctext\t=")
sub(/\.rlen[[:space:]]*=/, ".len\t=")
print
}
mode == DECVEC_TAIL && /[^[:space:]]/ { mode = OTHER }
mode == OTHER { print }
mode == ENCVEC && /^};/ { mode = OTHER }
mode == DECVEC && /^};/ { mode = DECVEC_TAIL }
Note that git's default diff algorithm gets confused by the testmgr.h
portion of this patch, and reports too many lines added and removed.
It's better viewed with 'git diff --minimal' (or 'git show --minimal'),
which reports "2 files changed, 919 insertions(+), 11723 deletions(-)".
Signed-off-by: Eric Biggers <ebiggers@google.com>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
2018-05-21 08:50:29 +03:00
|
|
|
.cipher = __VECS(serpent_tv_template)
|
2008-07-31 13:08:25 +04:00
|
|
|
}
|
2018-03-06 12:44:43 +03:00
|
|
|
}, {
|
|
|
|
.alg = "ecb(sm4)",
|
|
|
|
.test = alg_test_skcipher,
|
|
|
|
.suite = {
|
crypto: testmgr - eliminate redundant decryption test vectors
Currently testmgr has separate encryption and decryption test vectors
for symmetric ciphers. That's massively redundant, since with few
exceptions (mostly mistakes, apparently), all decryption tests are
identical to the encryption tests, just with the input/result flipped.
Therefore, eliminate the redundancy by removing the decryption test
vectors and updating testmgr to test both encryption and decryption
using what used to be the encryption test vectors. Naming is adjusted
accordingly: each cipher_testvec now has a 'ptext' (plaintext), 'ctext'
(ciphertext), and 'len' instead of an 'input', 'result', 'ilen', and
'rlen'. Note that it was always the case that 'ilen == rlen'.
AES keywrap ("kw(aes)") is special because its IV is generated by the
encryption. Previously this was handled by specifying 'iv_out' for
encryption and 'iv' for decryption. To make it work cleanly with only
one set of test vectors, put the IV in 'iv', remove 'iv_out', and add a
boolean that indicates that the IV is generated by the encryption.
In total, this removes over 10000 lines from testmgr.h, with no
reduction in test coverage since prior patches already copied the few
unique decryption test vectors into the encryption test vectors.
This covers all algorithms that used 'struct cipher_testvec', e.g. any
block cipher in the ECB, CBC, CTR, XTS, LRW, CTS-CBC, PCBC, OFB, or
keywrap modes, and Salsa20 and ChaCha20. No change is made to AEAD
tests, though we probably can eliminate a similar redundancy there too.
The testmgr.h portion of this patch was automatically generated using
the following awk script, with some slight manual fixups on top (updated
'struct cipher_testvec' definition, updated a few comments, and fixed up
the AES keywrap test vectors):
BEGIN { OTHER = 0; ENCVEC = 1; DECVEC = 2; DECVEC_TAIL = 3; mode = OTHER }
/^static const struct cipher_testvec.*_enc_/ { sub("_enc", ""); mode = ENCVEC }
/^static const struct cipher_testvec.*_dec_/ { mode = DECVEC }
mode == ENCVEC && !/\.ilen[[:space:]]*=/ {
sub(/\.input[[:space:]]*=$/, ".ptext =")
sub(/\.input[[:space:]]*=/, ".ptext\t=")
sub(/\.result[[:space:]]*=$/, ".ctext =")
sub(/\.result[[:space:]]*=/, ".ctext\t=")
sub(/\.rlen[[:space:]]*=/, ".len\t=")
print
}
mode == DECVEC_TAIL && /[^[:space:]]/ { mode = OTHER }
mode == OTHER { print }
mode == ENCVEC && /^};/ { mode = OTHER }
mode == DECVEC && /^};/ { mode = DECVEC_TAIL }
Note that git's default diff algorithm gets confused by the testmgr.h
portion of this patch, and reports too many lines added and removed.
It's better viewed with 'git diff --minimal' (or 'git show --minimal'),
which reports "2 files changed, 919 insertions(+), 11723 deletions(-)".
Signed-off-by: Eric Biggers <ebiggers@google.com>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
2018-05-21 08:50:29 +03:00
|
|
|
.cipher = __VECS(sm4_tv_template)
|
2018-03-06 12:44:43 +03:00
|
|
|
}
|
2008-07-31 13:08:25 +04:00
|
|
|
}, {
|
|
|
|
.alg = "ecb(tea)",
|
2008-08-17 11:01:56 +04:00
|
|
|
.test = alg_test_skcipher,
|
2008-07-31 13:08:25 +04:00
|
|
|
.suite = {
|
crypto: testmgr - eliminate redundant decryption test vectors
Currently testmgr has separate encryption and decryption test vectors
for symmetric ciphers. That's massively redundant, since with few
exceptions (mostly mistakes, apparently), all decryption tests are
identical to the encryption tests, just with the input/result flipped.
Therefore, eliminate the redundancy by removing the decryption test
vectors and updating testmgr to test both encryption and decryption
using what used to be the encryption test vectors. Naming is adjusted
accordingly: each cipher_testvec now has a 'ptext' (plaintext), 'ctext'
(ciphertext), and 'len' instead of an 'input', 'result', 'ilen', and
'rlen'. Note that it was always the case that 'ilen == rlen'.
AES keywrap ("kw(aes)") is special because its IV is generated by the
encryption. Previously this was handled by specifying 'iv_out' for
encryption and 'iv' for decryption. To make it work cleanly with only
one set of test vectors, put the IV in 'iv', remove 'iv_out', and add a
boolean that indicates that the IV is generated by the encryption.
In total, this removes over 10000 lines from testmgr.h, with no
reduction in test coverage since prior patches already copied the few
unique decryption test vectors into the encryption test vectors.
This covers all algorithms that used 'struct cipher_testvec', e.g. any
block cipher in the ECB, CBC, CTR, XTS, LRW, CTS-CBC, PCBC, OFB, or
keywrap modes, and Salsa20 and ChaCha20. No change is made to AEAD
tests, though we probably can eliminate a similar redundancy there too.
The testmgr.h portion of this patch was automatically generated using
the following awk script, with some slight manual fixups on top (updated
'struct cipher_testvec' definition, updated a few comments, and fixed up
the AES keywrap test vectors):
BEGIN { OTHER = 0; ENCVEC = 1; DECVEC = 2; DECVEC_TAIL = 3; mode = OTHER }
/^static const struct cipher_testvec.*_enc_/ { sub("_enc", ""); mode = ENCVEC }
/^static const struct cipher_testvec.*_dec_/ { mode = DECVEC }
mode == ENCVEC && !/\.ilen[[:space:]]*=/ {
sub(/\.input[[:space:]]*=$/, ".ptext =")
sub(/\.input[[:space:]]*=/, ".ptext\t=")
sub(/\.result[[:space:]]*=$/, ".ctext =")
sub(/\.result[[:space:]]*=/, ".ctext\t=")
sub(/\.rlen[[:space:]]*=/, ".len\t=")
print
}
mode == DECVEC_TAIL && /[^[:space:]]/ { mode = OTHER }
mode == OTHER { print }
mode == ENCVEC && /^};/ { mode = OTHER }
mode == DECVEC && /^};/ { mode = DECVEC_TAIL }
Note that git's default diff algorithm gets confused by the testmgr.h
portion of this patch, and reports too many lines added and removed.
It's better viewed with 'git diff --minimal' (or 'git show --minimal'),
which reports "2 files changed, 919 insertions(+), 11723 deletions(-)".
Signed-off-by: Eric Biggers <ebiggers@google.com>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
2018-05-21 08:50:29 +03:00
|
|
|
.cipher = __VECS(tea_tv_template)
|
2008-07-31 13:08:25 +04:00
|
|
|
}
|
|
|
|
}, {
|
|
|
|
.alg = "ecb(tnepres)",
|
2008-08-17 11:01:56 +04:00
|
|
|
.test = alg_test_skcipher,
|
2008-07-31 13:08:25 +04:00
|
|
|
.suite = {
|
crypto: testmgr - eliminate redundant decryption test vectors
Currently testmgr has separate encryption and decryption test vectors
for symmetric ciphers. That's massively redundant, since with few
exceptions (mostly mistakes, apparently), all decryption tests are
identical to the encryption tests, just with the input/result flipped.
Therefore, eliminate the redundancy by removing the decryption test
vectors and updating testmgr to test both encryption and decryption
using what used to be the encryption test vectors. Naming is adjusted
accordingly: each cipher_testvec now has a 'ptext' (plaintext), 'ctext'
(ciphertext), and 'len' instead of an 'input', 'result', 'ilen', and
'rlen'. Note that it was always the case that 'ilen == rlen'.
AES keywrap ("kw(aes)") is special because its IV is generated by the
encryption. Previously this was handled by specifying 'iv_out' for
encryption and 'iv' for decryption. To make it work cleanly with only
one set of test vectors, put the IV in 'iv', remove 'iv_out', and add a
boolean that indicates that the IV is generated by the encryption.
In total, this removes over 10000 lines from testmgr.h, with no
reduction in test coverage since prior patches already copied the few
unique decryption test vectors into the encryption test vectors.
This covers all algorithms that used 'struct cipher_testvec', e.g. any
block cipher in the ECB, CBC, CTR, XTS, LRW, CTS-CBC, PCBC, OFB, or
keywrap modes, and Salsa20 and ChaCha20. No change is made to AEAD
tests, though we probably can eliminate a similar redundancy there too.
The testmgr.h portion of this patch was automatically generated using
the following awk script, with some slight manual fixups on top (updated
'struct cipher_testvec' definition, updated a few comments, and fixed up
the AES keywrap test vectors):
BEGIN { OTHER = 0; ENCVEC = 1; DECVEC = 2; DECVEC_TAIL = 3; mode = OTHER }
/^static const struct cipher_testvec.*_enc_/ { sub("_enc", ""); mode = ENCVEC }
/^static const struct cipher_testvec.*_dec_/ { mode = DECVEC }
mode == ENCVEC && !/\.ilen[[:space:]]*=/ {
sub(/\.input[[:space:]]*=$/, ".ptext =")
sub(/\.input[[:space:]]*=/, ".ptext\t=")
sub(/\.result[[:space:]]*=$/, ".ctext =")
sub(/\.result[[:space:]]*=/, ".ctext\t=")
sub(/\.rlen[[:space:]]*=/, ".len\t=")
print
}
mode == DECVEC_TAIL && /[^[:space:]]/ { mode = OTHER }
mode == OTHER { print }
mode == ENCVEC && /^};/ { mode = OTHER }
mode == DECVEC && /^};/ { mode = DECVEC_TAIL }
Note that git's default diff algorithm gets confused by the testmgr.h
portion of this patch, and reports too many lines added and removed.
It's better viewed with 'git diff --minimal' (or 'git show --minimal'),
which reports "2 files changed, 919 insertions(+), 11723 deletions(-)".
Signed-off-by: Eric Biggers <ebiggers@google.com>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
2018-05-21 08:50:29 +03:00
|
|
|
.cipher = __VECS(tnepres_tv_template)
|
2008-07-31 13:08:25 +04:00
|
|
|
}
|
|
|
|
}, {
|
|
|
|
.alg = "ecb(twofish)",
|
2008-08-17 11:01:56 +04:00
|
|
|
.test = alg_test_skcipher,
|
2008-07-31 13:08:25 +04:00
|
|
|
.suite = {
|
crypto: testmgr - eliminate redundant decryption test vectors
Currently testmgr has separate encryption and decryption test vectors
for symmetric ciphers. That's massively redundant, since with few
exceptions (mostly mistakes, apparently), all decryption tests are
identical to the encryption tests, just with the input/result flipped.
Therefore, eliminate the redundancy by removing the decryption test
vectors and updating testmgr to test both encryption and decryption
using what used to be the encryption test vectors. Naming is adjusted
accordingly: each cipher_testvec now has a 'ptext' (plaintext), 'ctext'
(ciphertext), and 'len' instead of an 'input', 'result', 'ilen', and
'rlen'. Note that it was always the case that 'ilen == rlen'.
AES keywrap ("kw(aes)") is special because its IV is generated by the
encryption. Previously this was handled by specifying 'iv_out' for
encryption and 'iv' for decryption. To make it work cleanly with only
one set of test vectors, put the IV in 'iv', remove 'iv_out', and add a
boolean that indicates that the IV is generated by the encryption.
In total, this removes over 10000 lines from testmgr.h, with no
reduction in test coverage since prior patches already copied the few
unique decryption test vectors into the encryption test vectors.
This covers all algorithms that used 'struct cipher_testvec', e.g. any
block cipher in the ECB, CBC, CTR, XTS, LRW, CTS-CBC, PCBC, OFB, or
keywrap modes, and Salsa20 and ChaCha20. No change is made to AEAD
tests, though we probably can eliminate a similar redundancy there too.
The testmgr.h portion of this patch was automatically generated using
the following awk script, with some slight manual fixups on top (updated
'struct cipher_testvec' definition, updated a few comments, and fixed up
the AES keywrap test vectors):
BEGIN { OTHER = 0; ENCVEC = 1; DECVEC = 2; DECVEC_TAIL = 3; mode = OTHER }
/^static const struct cipher_testvec.*_enc_/ { sub("_enc", ""); mode = ENCVEC }
/^static const struct cipher_testvec.*_dec_/ { mode = DECVEC }
mode == ENCVEC && !/\.ilen[[:space:]]*=/ {
sub(/\.input[[:space:]]*=$/, ".ptext =")
sub(/\.input[[:space:]]*=/, ".ptext\t=")
sub(/\.result[[:space:]]*=$/, ".ctext =")
sub(/\.result[[:space:]]*=/, ".ctext\t=")
sub(/\.rlen[[:space:]]*=/, ".len\t=")
print
}
mode == DECVEC_TAIL && /[^[:space:]]/ { mode = OTHER }
mode == OTHER { print }
mode == ENCVEC && /^};/ { mode = OTHER }
mode == DECVEC && /^};/ { mode = DECVEC_TAIL }
Note that git's default diff algorithm gets confused by the testmgr.h
portion of this patch, and reports too many lines added and removed.
It's better viewed with 'git diff --minimal' (or 'git show --minimal'),
which reports "2 files changed, 919 insertions(+), 11723 deletions(-)".
Signed-off-by: Eric Biggers <ebiggers@google.com>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
2018-05-21 08:50:29 +03:00
|
|
|
.cipher = __VECS(tf_tv_template)
|
2008-07-31 13:08:25 +04:00
|
|
|
}
|
|
|
|
}, {
|
|
|
|
.alg = "ecb(xeta)",
|
2008-08-17 11:01:56 +04:00
|
|
|
.test = alg_test_skcipher,
|
2008-07-31 13:08:25 +04:00
|
|
|
.suite = {
|
crypto: testmgr - eliminate redundant decryption test vectors
Currently testmgr has separate encryption and decryption test vectors
for symmetric ciphers. That's massively redundant, since with few
exceptions (mostly mistakes, apparently), all decryption tests are
identical to the encryption tests, just with the input/result flipped.
Therefore, eliminate the redundancy by removing the decryption test
vectors and updating testmgr to test both encryption and decryption
using what used to be the encryption test vectors. Naming is adjusted
accordingly: each cipher_testvec now has a 'ptext' (plaintext), 'ctext'
(ciphertext), and 'len' instead of an 'input', 'result', 'ilen', and
'rlen'. Note that it was always the case that 'ilen == rlen'.
AES keywrap ("kw(aes)") is special because its IV is generated by the
encryption. Previously this was handled by specifying 'iv_out' for
encryption and 'iv' for decryption. To make it work cleanly with only
one set of test vectors, put the IV in 'iv', remove 'iv_out', and add a
boolean that indicates that the IV is generated by the encryption.
In total, this removes over 10000 lines from testmgr.h, with no
reduction in test coverage since prior patches already copied the few
unique decryption test vectors into the encryption test vectors.
This covers all algorithms that used 'struct cipher_testvec', e.g. any
block cipher in the ECB, CBC, CTR, XTS, LRW, CTS-CBC, PCBC, OFB, or
keywrap modes, and Salsa20 and ChaCha20. No change is made to AEAD
tests, though we probably can eliminate a similar redundancy there too.
The testmgr.h portion of this patch was automatically generated using
the following awk script, with some slight manual fixups on top (updated
'struct cipher_testvec' definition, updated a few comments, and fixed up
the AES keywrap test vectors):
BEGIN { OTHER = 0; ENCVEC = 1; DECVEC = 2; DECVEC_TAIL = 3; mode = OTHER }
/^static const struct cipher_testvec.*_enc_/ { sub("_enc", ""); mode = ENCVEC }
/^static const struct cipher_testvec.*_dec_/ { mode = DECVEC }
mode == ENCVEC && !/\.ilen[[:space:]]*=/ {
sub(/\.input[[:space:]]*=$/, ".ptext =")
sub(/\.input[[:space:]]*=/, ".ptext\t=")
sub(/\.result[[:space:]]*=$/, ".ctext =")
sub(/\.result[[:space:]]*=/, ".ctext\t=")
sub(/\.rlen[[:space:]]*=/, ".len\t=")
print
}
mode == DECVEC_TAIL && /[^[:space:]]/ { mode = OTHER }
mode == OTHER { print }
mode == ENCVEC && /^};/ { mode = OTHER }
mode == DECVEC && /^};/ { mode = DECVEC_TAIL }
Note that git's default diff algorithm gets confused by the testmgr.h
portion of this patch, and reports too many lines added and removed.
It's better viewed with 'git diff --minimal' (or 'git show --minimal'),
which reports "2 files changed, 919 insertions(+), 11723 deletions(-)".
Signed-off-by: Eric Biggers <ebiggers@google.com>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
2018-05-21 08:50:29 +03:00
|
|
|
.cipher = __VECS(xeta_tv_template)
|
2008-07-31 13:08:25 +04:00
|
|
|
}
|
|
|
|
}, {
|
|
|
|
.alg = "ecb(xtea)",
|
2008-08-17 11:01:56 +04:00
|
|
|
.test = alg_test_skcipher,
|
2008-07-31 13:08:25 +04:00
|
|
|
.suite = {
|
crypto: testmgr - eliminate redundant decryption test vectors
Currently testmgr has separate encryption and decryption test vectors
for symmetric ciphers. That's massively redundant, since with few
exceptions (mostly mistakes, apparently), all decryption tests are
identical to the encryption tests, just with the input/result flipped.
Therefore, eliminate the redundancy by removing the decryption test
vectors and updating testmgr to test both encryption and decryption
using what used to be the encryption test vectors. Naming is adjusted
accordingly: each cipher_testvec now has a 'ptext' (plaintext), 'ctext'
(ciphertext), and 'len' instead of an 'input', 'result', 'ilen', and
'rlen'. Note that it was always the case that 'ilen == rlen'.
AES keywrap ("kw(aes)") is special because its IV is generated by the
encryption. Previously this was handled by specifying 'iv_out' for
encryption and 'iv' for decryption. To make it work cleanly with only
one set of test vectors, put the IV in 'iv', remove 'iv_out', and add a
boolean that indicates that the IV is generated by the encryption.
In total, this removes over 10000 lines from testmgr.h, with no
reduction in test coverage since prior patches already copied the few
unique decryption test vectors into the encryption test vectors.
This covers all algorithms that used 'struct cipher_testvec', e.g. any
block cipher in the ECB, CBC, CTR, XTS, LRW, CTS-CBC, PCBC, OFB, or
keywrap modes, and Salsa20 and ChaCha20. No change is made to AEAD
tests, though we probably can eliminate a similar redundancy there too.
The testmgr.h portion of this patch was automatically generated using
the following awk script, with some slight manual fixups on top (updated
'struct cipher_testvec' definition, updated a few comments, and fixed up
the AES keywrap test vectors):
BEGIN { OTHER = 0; ENCVEC = 1; DECVEC = 2; DECVEC_TAIL = 3; mode = OTHER }
/^static const struct cipher_testvec.*_enc_/ { sub("_enc", ""); mode = ENCVEC }
/^static const struct cipher_testvec.*_dec_/ { mode = DECVEC }
mode == ENCVEC && !/\.ilen[[:space:]]*=/ {
sub(/\.input[[:space:]]*=$/, ".ptext =")
sub(/\.input[[:space:]]*=/, ".ptext\t=")
sub(/\.result[[:space:]]*=$/, ".ctext =")
sub(/\.result[[:space:]]*=/, ".ctext\t=")
sub(/\.rlen[[:space:]]*=/, ".len\t=")
print
}
mode == DECVEC_TAIL && /[^[:space:]]/ { mode = OTHER }
mode == OTHER { print }
mode == ENCVEC && /^};/ { mode = OTHER }
mode == DECVEC && /^};/ { mode = DECVEC_TAIL }
Note that git's default diff algorithm gets confused by the testmgr.h
portion of this patch, and reports too many lines added and removed.
It's better viewed with 'git diff --minimal' (or 'git show --minimal'),
which reports "2 files changed, 919 insertions(+), 11723 deletions(-)".
Signed-off-by: Eric Biggers <ebiggers@google.com>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
2018-05-21 08:50:29 +03:00
|
|
|
.cipher = __VECS(xtea_tv_template)
|
2008-07-31 13:08:25 +04:00
|
|
|
}
|
2016-06-22 19:49:15 +03:00
|
|
|
}, {
|
|
|
|
.alg = "ecdh",
|
|
|
|
.test = alg_test_kpp,
|
|
|
|
.fips_allowed = 1,
|
|
|
|
.suite = {
|
2017-01-12 16:40:39 +03:00
|
|
|
.kpp = __VECS(ecdh_tv_template)
|
2016-06-22 19:49:15 +03:00
|
|
|
}
|
2008-07-31 13:08:25 +04:00
|
|
|
}, {
|
|
|
|
.alg = "gcm(aes)",
|
|
|
|
.test = alg_test_aead,
|
2009-05-15 09:16:03 +04:00
|
|
|
.fips_allowed = 1,
|
2008-07-31 13:08:25 +04:00
|
|
|
.suite = {
|
|
|
|
.aead = {
|
2017-01-12 16:40:39 +03:00
|
|
|
.enc = __VECS(aes_gcm_enc_tv_template),
|
|
|
|
.dec = __VECS(aes_gcm_dec_tv_template)
|
2008-07-31 13:08:25 +04:00
|
|
|
}
|
|
|
|
}
|
2009-11-23 15:23:04 +03:00
|
|
|
}, {
|
|
|
|
.alg = "ghash",
|
|
|
|
.test = alg_test_hash,
|
crypto: testmgr - mark ghash as fips_allowed
A self-test failure in fips mode means a panic. Well, gcm(aes)
self-tests currently fail in fips mode, as gcm is dependent on ghash,
which semi-recently got self-test vectors added, but wasn't marked as a
fips_allowed algorithm. Because of gcm's dependence on what is now seen
as a non-fips_allowed algorithm, its self-tests refuse to run.
Previously, ghash got a pass in fips mode, due to the lack of any test
vectors at all, and thus gcm self-tests were able to run. After this
patch, a 'modprobe tcrypt mode=35' no longer panics in fips mode, and
successful self-test of gcm(aes) is reported.
Signed-off-by: Jarod Wilson <jarod@redhat.com>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
2011-01-29 07:14:35 +03:00
|
|
|
.fips_allowed = 1,
|
2009-11-23 15:23:04 +03:00
|
|
|
.suite = {
|
2017-01-12 16:40:39 +03:00
|
|
|
.hash = __VECS(ghash_tv_template)
|
2009-11-23 15:23:04 +03:00
|
|
|
}
|
2008-07-31 13:08:25 +04:00
|
|
|
}, {
|
|
|
|
.alg = "hmac(md5)",
|
|
|
|
.test = alg_test_hash,
|
|
|
|
.suite = {
|
2017-01-12 16:40:39 +03:00
|
|
|
.hash = __VECS(hmac_md5_tv_template)
|
2008-07-31 13:08:25 +04:00
|
|
|
}
|
|
|
|
}, {
|
|
|
|
.alg = "hmac(rmd128)",
|
|
|
|
.test = alg_test_hash,
|
|
|
|
.suite = {
|
2017-01-12 16:40:39 +03:00
|
|
|
.hash = __VECS(hmac_rmd128_tv_template)
|
2008-07-31 13:08:25 +04:00
|
|
|
}
|
|
|
|
}, {
|
|
|
|
.alg = "hmac(rmd160)",
|
|
|
|
.test = alg_test_hash,
|
|
|
|
.suite = {
|
2017-01-12 16:40:39 +03:00
|
|
|
.hash = __VECS(hmac_rmd160_tv_template)
|
2008-07-31 13:08:25 +04:00
|
|
|
}
|
|
|
|
}, {
|
|
|
|
.alg = "hmac(sha1)",
|
|
|
|
.test = alg_test_hash,
|
2009-05-15 09:16:03 +04:00
|
|
|
.fips_allowed = 1,
|
2008-07-31 13:08:25 +04:00
|
|
|
.suite = {
|
2017-01-12 16:40:39 +03:00
|
|
|
.hash = __VECS(hmac_sha1_tv_template)
|
2008-07-31 13:08:25 +04:00
|
|
|
}
|
|
|
|
}, {
|
|
|
|
.alg = "hmac(sha224)",
|
|
|
|
.test = alg_test_hash,
|
2009-05-15 09:16:03 +04:00
|
|
|
.fips_allowed = 1,
|
2008-07-31 13:08:25 +04:00
|
|
|
.suite = {
|
2017-01-12 16:40:39 +03:00
|
|
|
.hash = __VECS(hmac_sha224_tv_template)
|
2008-07-31 13:08:25 +04:00
|
|
|
}
|
|
|
|
}, {
|
|
|
|
.alg = "hmac(sha256)",
|
|
|
|
.test = alg_test_hash,
|
2009-05-15 09:16:03 +04:00
|
|
|
.fips_allowed = 1,
|
2008-07-31 13:08:25 +04:00
|
|
|
.suite = {
|
2017-01-12 16:40:39 +03:00
|
|
|
.hash = __VECS(hmac_sha256_tv_template)
|
2008-07-31 13:08:25 +04:00
|
|
|
}
|
2016-07-01 08:46:54 +03:00
|
|
|
}, {
|
|
|
|
.alg = "hmac(sha3-224)",
|
|
|
|
.test = alg_test_hash,
|
|
|
|
.fips_allowed = 1,
|
|
|
|
.suite = {
|
2017-01-12 16:40:39 +03:00
|
|
|
.hash = __VECS(hmac_sha3_224_tv_template)
|
2016-07-01 08:46:54 +03:00
|
|
|
}
|
|
|
|
}, {
|
|
|
|
.alg = "hmac(sha3-256)",
|
|
|
|
.test = alg_test_hash,
|
|
|
|
.fips_allowed = 1,
|
|
|
|
.suite = {
|
2017-01-12 16:40:39 +03:00
|
|
|
.hash = __VECS(hmac_sha3_256_tv_template)
|
2016-07-01 08:46:54 +03:00
|
|
|
}
|
|
|
|
}, {
|
|
|
|
.alg = "hmac(sha3-384)",
|
|
|
|
.test = alg_test_hash,
|
|
|
|
.fips_allowed = 1,
|
|
|
|
.suite = {
|
2017-01-12 16:40:39 +03:00
|
|
|
.hash = __VECS(hmac_sha3_384_tv_template)
|
2016-07-01 08:46:54 +03:00
|
|
|
}
|
|
|
|
}, {
|
|
|
|
.alg = "hmac(sha3-512)",
|
|
|
|
.test = alg_test_hash,
|
|
|
|
.fips_allowed = 1,
|
|
|
|
.suite = {
|
2017-01-12 16:40:39 +03:00
|
|
|
.hash = __VECS(hmac_sha3_512_tv_template)
|
2016-07-01 08:46:54 +03:00
|
|
|
}
|
2008-07-31 13:08:25 +04:00
|
|
|
}, {
|
|
|
|
.alg = "hmac(sha384)",
|
|
|
|
.test = alg_test_hash,
|
2009-05-15 09:16:03 +04:00
|
|
|
.fips_allowed = 1,
|
2008-07-31 13:08:25 +04:00
|
|
|
.suite = {
|
2017-01-12 16:40:39 +03:00
|
|
|
.hash = __VECS(hmac_sha384_tv_template)
|
2008-07-31 13:08:25 +04:00
|
|
|
}
|
|
|
|
}, {
|
|
|
|
.alg = "hmac(sha512)",
|
|
|
|
.test = alg_test_hash,
|
2009-05-15 09:16:03 +04:00
|
|
|
.fips_allowed = 1,
|
2008-07-31 13:08:25 +04:00
|
|
|
.suite = {
|
2017-01-12 16:40:39 +03:00
|
|
|
.hash = __VECS(hmac_sha512_tv_template)
|
2008-07-31 13:08:25 +04:00
|
|
|
}
|
2018-11-07 00:00:03 +03:00
|
|
|
}, {
|
|
|
|
.alg = "hmac(streebog256)",
|
|
|
|
.test = alg_test_hash,
|
|
|
|
.suite = {
|
|
|
|
.hash = __VECS(hmac_streebog256_tv_template)
|
|
|
|
}
|
|
|
|
}, {
|
|
|
|
.alg = "hmac(streebog512)",
|
|
|
|
.test = alg_test_hash,
|
|
|
|
.suite = {
|
|
|
|
.hash = __VECS(hmac_streebog512_tv_template)
|
|
|
|
}
|
2015-05-25 16:10:20 +03:00
|
|
|
}, {
|
|
|
|
.alg = "jitterentropy_rng",
|
|
|
|
.fips_allowed = 1,
|
|
|
|
.test = alg_test_null,
|
2015-09-21 21:59:56 +03:00
|
|
|
}, {
|
|
|
|
.alg = "kw(aes)",
|
|
|
|
.test = alg_test_skcipher,
|
|
|
|
.fips_allowed = 1,
|
|
|
|
.suite = {
|
crypto: testmgr - eliminate redundant decryption test vectors
Currently testmgr has separate encryption and decryption test vectors
for symmetric ciphers. That's massively redundant, since with few
exceptions (mostly mistakes, apparently), all decryption tests are
identical to the encryption tests, just with the input/result flipped.
Therefore, eliminate the redundancy by removing the decryption test
vectors and updating testmgr to test both encryption and decryption
using what used to be the encryption test vectors. Naming is adjusted
accordingly: each cipher_testvec now has a 'ptext' (plaintext), 'ctext'
(ciphertext), and 'len' instead of an 'input', 'result', 'ilen', and
'rlen'. Note that it was always the case that 'ilen == rlen'.
AES keywrap ("kw(aes)") is special because its IV is generated by the
encryption. Previously this was handled by specifying 'iv_out' for
encryption and 'iv' for decryption. To make it work cleanly with only
one set of test vectors, put the IV in 'iv', remove 'iv_out', and add a
boolean that indicates that the IV is generated by the encryption.
In total, this removes over 10000 lines from testmgr.h, with no
reduction in test coverage since prior patches already copied the few
unique decryption test vectors into the encryption test vectors.
This covers all algorithms that used 'struct cipher_testvec', e.g. any
block cipher in the ECB, CBC, CTR, XTS, LRW, CTS-CBC, PCBC, OFB, or
keywrap modes, and Salsa20 and ChaCha20. No change is made to AEAD
tests, though we probably can eliminate a similar redundancy there too.
The testmgr.h portion of this patch was automatically generated using
the following awk script, with some slight manual fixups on top (updated
'struct cipher_testvec' definition, updated a few comments, and fixed up
the AES keywrap test vectors):
BEGIN { OTHER = 0; ENCVEC = 1; DECVEC = 2; DECVEC_TAIL = 3; mode = OTHER }
/^static const struct cipher_testvec.*_enc_/ { sub("_enc", ""); mode = ENCVEC }
/^static const struct cipher_testvec.*_dec_/ { mode = DECVEC }
mode == ENCVEC && !/\.ilen[[:space:]]*=/ {
sub(/\.input[[:space:]]*=$/, ".ptext =")
sub(/\.input[[:space:]]*=/, ".ptext\t=")
sub(/\.result[[:space:]]*=$/, ".ctext =")
sub(/\.result[[:space:]]*=/, ".ctext\t=")
sub(/\.rlen[[:space:]]*=/, ".len\t=")
print
}
mode == DECVEC_TAIL && /[^[:space:]]/ { mode = OTHER }
mode == OTHER { print }
mode == ENCVEC && /^};/ { mode = OTHER }
mode == DECVEC && /^};/ { mode = DECVEC_TAIL }
Note that git's default diff algorithm gets confused by the testmgr.h
portion of this patch, and reports too many lines added and removed.
It's better viewed with 'git diff --minimal' (or 'git show --minimal'),
which reports "2 files changed, 919 insertions(+), 11723 deletions(-)".
Signed-off-by: Eric Biggers <ebiggers@google.com>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
2018-05-21 08:50:29 +03:00
|
|
|
.cipher = __VECS(aes_kw_tv_template)
|
2015-09-21 21:59:56 +03:00
|
|
|
}
|
2008-07-31 13:08:25 +04:00
|
|
|
}, {
|
|
|
|
.alg = "lrw(aes)",
|
2008-08-17 11:01:56 +04:00
|
|
|
.test = alg_test_skcipher,
|
2008-07-31 13:08:25 +04:00
|
|
|
.suite = {
|
crypto: testmgr - eliminate redundant decryption test vectors
Currently testmgr has separate encryption and decryption test vectors
for symmetric ciphers. That's massively redundant, since with few
exceptions (mostly mistakes, apparently), all decryption tests are
identical to the encryption tests, just with the input/result flipped.
Therefore, eliminate the redundancy by removing the decryption test
vectors and updating testmgr to test both encryption and decryption
using what used to be the encryption test vectors. Naming is adjusted
accordingly: each cipher_testvec now has a 'ptext' (plaintext), 'ctext'
(ciphertext), and 'len' instead of an 'input', 'result', 'ilen', and
'rlen'. Note that it was always the case that 'ilen == rlen'.
AES keywrap ("kw(aes)") is special because its IV is generated by the
encryption. Previously this was handled by specifying 'iv_out' for
encryption and 'iv' for decryption. To make it work cleanly with only
one set of test vectors, put the IV in 'iv', remove 'iv_out', and add a
boolean that indicates that the IV is generated by the encryption.
In total, this removes over 10000 lines from testmgr.h, with no
reduction in test coverage since prior patches already copied the few
unique decryption test vectors into the encryption test vectors.
This covers all algorithms that used 'struct cipher_testvec', e.g. any
block cipher in the ECB, CBC, CTR, XTS, LRW, CTS-CBC, PCBC, OFB, or
keywrap modes, and Salsa20 and ChaCha20. No change is made to AEAD
tests, though we probably can eliminate a similar redundancy there too.
The testmgr.h portion of this patch was automatically generated using
the following awk script, with some slight manual fixups on top (updated
'struct cipher_testvec' definition, updated a few comments, and fixed up
the AES keywrap test vectors):
BEGIN { OTHER = 0; ENCVEC = 1; DECVEC = 2; DECVEC_TAIL = 3; mode = OTHER }
/^static const struct cipher_testvec.*_enc_/ { sub("_enc", ""); mode = ENCVEC }
/^static const struct cipher_testvec.*_dec_/ { mode = DECVEC }
mode == ENCVEC && !/\.ilen[[:space:]]*=/ {
sub(/\.input[[:space:]]*=$/, ".ptext =")
sub(/\.input[[:space:]]*=/, ".ptext\t=")
sub(/\.result[[:space:]]*=$/, ".ctext =")
sub(/\.result[[:space:]]*=/, ".ctext\t=")
sub(/\.rlen[[:space:]]*=/, ".len\t=")
print
}
mode == DECVEC_TAIL && /[^[:space:]]/ { mode = OTHER }
mode == OTHER { print }
mode == ENCVEC && /^};/ { mode = OTHER }
mode == DECVEC && /^};/ { mode = DECVEC_TAIL }
Note that git's default diff algorithm gets confused by the testmgr.h
portion of this patch, and reports too many lines added and removed.
It's better viewed with 'git diff --minimal' (or 'git show --minimal'),
which reports "2 files changed, 919 insertions(+), 11723 deletions(-)".
Signed-off-by: Eric Biggers <ebiggers@google.com>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
2018-05-21 08:50:29 +03:00
|
|
|
.cipher = __VECS(aes_lrw_tv_template)
|
2008-07-31 13:08:25 +04:00
|
|
|
}
|
2012-03-05 22:26:21 +04:00
|
|
|
}, {
|
|
|
|
.alg = "lrw(camellia)",
|
|
|
|
.test = alg_test_skcipher,
|
|
|
|
.suite = {
|
crypto: testmgr - eliminate redundant decryption test vectors
Currently testmgr has separate encryption and decryption test vectors
for symmetric ciphers. That's massively redundant, since with few
exceptions (mostly mistakes, apparently), all decryption tests are
identical to the encryption tests, just with the input/result flipped.
Therefore, eliminate the redundancy by removing the decryption test
vectors and updating testmgr to test both encryption and decryption
using what used to be the encryption test vectors. Naming is adjusted
accordingly: each cipher_testvec now has a 'ptext' (plaintext), 'ctext'
(ciphertext), and 'len' instead of an 'input', 'result', 'ilen', and
'rlen'. Note that it was always the case that 'ilen == rlen'.
AES keywrap ("kw(aes)") is special because its IV is generated by the
encryption. Previously this was handled by specifying 'iv_out' for
encryption and 'iv' for decryption. To make it work cleanly with only
one set of test vectors, put the IV in 'iv', remove 'iv_out', and add a
boolean that indicates that the IV is generated by the encryption.
In total, this removes over 10000 lines from testmgr.h, with no
reduction in test coverage since prior patches already copied the few
unique decryption test vectors into the encryption test vectors.
This covers all algorithms that used 'struct cipher_testvec', e.g. any
block cipher in the ECB, CBC, CTR, XTS, LRW, CTS-CBC, PCBC, OFB, or
keywrap modes, and Salsa20 and ChaCha20. No change is made to AEAD
tests, though we probably can eliminate a similar redundancy there too.
The testmgr.h portion of this patch was automatically generated using
the following awk script, with some slight manual fixups on top (updated
'struct cipher_testvec' definition, updated a few comments, and fixed up
the AES keywrap test vectors):
BEGIN { OTHER = 0; ENCVEC = 1; DECVEC = 2; DECVEC_TAIL = 3; mode = OTHER }
/^static const struct cipher_testvec.*_enc_/ { sub("_enc", ""); mode = ENCVEC }
/^static const struct cipher_testvec.*_dec_/ { mode = DECVEC }
mode == ENCVEC && !/\.ilen[[:space:]]*=/ {
sub(/\.input[[:space:]]*=$/, ".ptext =")
sub(/\.input[[:space:]]*=/, ".ptext\t=")
sub(/\.result[[:space:]]*=$/, ".ctext =")
sub(/\.result[[:space:]]*=/, ".ctext\t=")
sub(/\.rlen[[:space:]]*=/, ".len\t=")
print
}
mode == DECVEC_TAIL && /[^[:space:]]/ { mode = OTHER }
mode == OTHER { print }
mode == ENCVEC && /^};/ { mode = OTHER }
mode == DECVEC && /^};/ { mode = DECVEC_TAIL }
Note that git's default diff algorithm gets confused by the testmgr.h
portion of this patch, and reports too many lines added and removed.
It's better viewed with 'git diff --minimal' (or 'git show --minimal'),
which reports "2 files changed, 919 insertions(+), 11723 deletions(-)".
Signed-off-by: Eric Biggers <ebiggers@google.com>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
2018-05-21 08:50:29 +03:00
|
|
|
.cipher = __VECS(camellia_lrw_tv_template)
|
2012-03-05 22:26:21 +04:00
|
|
|
}
|
2012-07-11 21:38:29 +04:00
|
|
|
}, {
|
|
|
|
.alg = "lrw(cast6)",
|
|
|
|
.test = alg_test_skcipher,
|
|
|
|
.suite = {
|
crypto: testmgr - eliminate redundant decryption test vectors
Currently testmgr has separate encryption and decryption test vectors
for symmetric ciphers. That's massively redundant, since with few
exceptions (mostly mistakes, apparently), all decryption tests are
identical to the encryption tests, just with the input/result flipped.
Therefore, eliminate the redundancy by removing the decryption test
vectors and updating testmgr to test both encryption and decryption
using what used to be the encryption test vectors. Naming is adjusted
accordingly: each cipher_testvec now has a 'ptext' (plaintext), 'ctext'
(ciphertext), and 'len' instead of an 'input', 'result', 'ilen', and
'rlen'. Note that it was always the case that 'ilen == rlen'.
AES keywrap ("kw(aes)") is special because its IV is generated by the
encryption. Previously this was handled by specifying 'iv_out' for
encryption and 'iv' for decryption. To make it work cleanly with only
one set of test vectors, put the IV in 'iv', remove 'iv_out', and add a
boolean that indicates that the IV is generated by the encryption.
In total, this removes over 10000 lines from testmgr.h, with no
reduction in test coverage since prior patches already copied the few
unique decryption test vectors into the encryption test vectors.
This covers all algorithms that used 'struct cipher_testvec', e.g. any
block cipher in the ECB, CBC, CTR, XTS, LRW, CTS-CBC, PCBC, OFB, or
keywrap modes, and Salsa20 and ChaCha20. No change is made to AEAD
tests, though we probably can eliminate a similar redundancy there too.
The testmgr.h portion of this patch was automatically generated using
the following awk script, with some slight manual fixups on top (updated
'struct cipher_testvec' definition, updated a few comments, and fixed up
the AES keywrap test vectors):
BEGIN { OTHER = 0; ENCVEC = 1; DECVEC = 2; DECVEC_TAIL = 3; mode = OTHER }
/^static const struct cipher_testvec.*_enc_/ { sub("_enc", ""); mode = ENCVEC }
/^static const struct cipher_testvec.*_dec_/ { mode = DECVEC }
mode == ENCVEC && !/\.ilen[[:space:]]*=/ {
sub(/\.input[[:space:]]*=$/, ".ptext =")
sub(/\.input[[:space:]]*=/, ".ptext\t=")
sub(/\.result[[:space:]]*=$/, ".ctext =")
sub(/\.result[[:space:]]*=/, ".ctext\t=")
sub(/\.rlen[[:space:]]*=/, ".len\t=")
print
}
mode == DECVEC_TAIL && /[^[:space:]]/ { mode = OTHER }
mode == OTHER { print }
mode == ENCVEC && /^};/ { mode = OTHER }
mode == DECVEC && /^};/ { mode = DECVEC_TAIL }
Note that git's default diff algorithm gets confused by the testmgr.h
portion of this patch, and reports too many lines added and removed.
It's better viewed with 'git diff --minimal' (or 'git show --minimal'),
which reports "2 files changed, 919 insertions(+), 11723 deletions(-)".
Signed-off-by: Eric Biggers <ebiggers@google.com>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
2018-05-21 08:50:29 +03:00
|
|
|
.cipher = __VECS(cast6_lrw_tv_template)
|
2012-07-11 21:38:29 +04:00
|
|
|
}
|
2011-10-18 14:32:34 +04:00
|
|
|
}, {
|
|
|
|
.alg = "lrw(serpent)",
|
|
|
|
.test = alg_test_skcipher,
|
|
|
|
.suite = {
|
crypto: testmgr - eliminate redundant decryption test vectors
Currently testmgr has separate encryption and decryption test vectors
for symmetric ciphers. That's massively redundant, since with few
exceptions (mostly mistakes, apparently), all decryption tests are
identical to the encryption tests, just with the input/result flipped.
Therefore, eliminate the redundancy by removing the decryption test
vectors and updating testmgr to test both encryption and decryption
using what used to be the encryption test vectors. Naming is adjusted
accordingly: each cipher_testvec now has a 'ptext' (plaintext), 'ctext'
(ciphertext), and 'len' instead of an 'input', 'result', 'ilen', and
'rlen'. Note that it was always the case that 'ilen == rlen'.
AES keywrap ("kw(aes)") is special because its IV is generated by the
encryption. Previously this was handled by specifying 'iv_out' for
encryption and 'iv' for decryption. To make it work cleanly with only
one set of test vectors, put the IV in 'iv', remove 'iv_out', and add a
boolean that indicates that the IV is generated by the encryption.
In total, this removes over 10000 lines from testmgr.h, with no
reduction in test coverage since prior patches already copied the few
unique decryption test vectors into the encryption test vectors.
This covers all algorithms that used 'struct cipher_testvec', e.g. any
block cipher in the ECB, CBC, CTR, XTS, LRW, CTS-CBC, PCBC, OFB, or
keywrap modes, and Salsa20 and ChaCha20. No change is made to AEAD
tests, though we probably can eliminate a similar redundancy there too.
The testmgr.h portion of this patch was automatically generated using
the following awk script, with some slight manual fixups on top (updated
'struct cipher_testvec' definition, updated a few comments, and fixed up
the AES keywrap test vectors):
BEGIN { OTHER = 0; ENCVEC = 1; DECVEC = 2; DECVEC_TAIL = 3; mode = OTHER }
/^static const struct cipher_testvec.*_enc_/ { sub("_enc", ""); mode = ENCVEC }
/^static const struct cipher_testvec.*_dec_/ { mode = DECVEC }
mode == ENCVEC && !/\.ilen[[:space:]]*=/ {
sub(/\.input[[:space:]]*=$/, ".ptext =")
sub(/\.input[[:space:]]*=/, ".ptext\t=")
sub(/\.result[[:space:]]*=$/, ".ctext =")
sub(/\.result[[:space:]]*=/, ".ctext\t=")
sub(/\.rlen[[:space:]]*=/, ".len\t=")
print
}
mode == DECVEC_TAIL && /[^[:space:]]/ { mode = OTHER }
mode == OTHER { print }
mode == ENCVEC && /^};/ { mode = OTHER }
mode == DECVEC && /^};/ { mode = DECVEC_TAIL }
Note that git's default diff algorithm gets confused by the testmgr.h
portion of this patch, and reports too many lines added and removed.
It's better viewed with 'git diff --minimal' (or 'git show --minimal'),
which reports "2 files changed, 919 insertions(+), 11723 deletions(-)".
Signed-off-by: Eric Biggers <ebiggers@google.com>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
2018-05-21 08:50:29 +03:00
|
|
|
.cipher = __VECS(serpent_lrw_tv_template)
|
2011-10-18 14:32:34 +04:00
|
|
|
}
|
2011-10-18 14:32:50 +04:00
|
|
|
}, {
|
|
|
|
.alg = "lrw(twofish)",
|
|
|
|
.test = alg_test_skcipher,
|
|
|
|
.suite = {
|
crypto: testmgr - eliminate redundant decryption test vectors
Currently testmgr has separate encryption and decryption test vectors
for symmetric ciphers. That's massively redundant, since with few
exceptions (mostly mistakes, apparently), all decryption tests are
identical to the encryption tests, just with the input/result flipped.
Therefore, eliminate the redundancy by removing the decryption test
vectors and updating testmgr to test both encryption and decryption
using what used to be the encryption test vectors. Naming is adjusted
accordingly: each cipher_testvec now has a 'ptext' (plaintext), 'ctext'
(ciphertext), and 'len' instead of an 'input', 'result', 'ilen', and
'rlen'. Note that it was always the case that 'ilen == rlen'.
AES keywrap ("kw(aes)") is special because its IV is generated by the
encryption. Previously this was handled by specifying 'iv_out' for
encryption and 'iv' for decryption. To make it work cleanly with only
one set of test vectors, put the IV in 'iv', remove 'iv_out', and add a
boolean that indicates that the IV is generated by the encryption.
In total, this removes over 10000 lines from testmgr.h, with no
reduction in test coverage since prior patches already copied the few
unique decryption test vectors into the encryption test vectors.
This covers all algorithms that used 'struct cipher_testvec', e.g. any
block cipher in the ECB, CBC, CTR, XTS, LRW, CTS-CBC, PCBC, OFB, or
keywrap modes, and Salsa20 and ChaCha20. No change is made to AEAD
tests, though we probably can eliminate a similar redundancy there too.
The testmgr.h portion of this patch was automatically generated using
the following awk script, with some slight manual fixups on top (updated
'struct cipher_testvec' definition, updated a few comments, and fixed up
the AES keywrap test vectors):
BEGIN { OTHER = 0; ENCVEC = 1; DECVEC = 2; DECVEC_TAIL = 3; mode = OTHER }
/^static const struct cipher_testvec.*_enc_/ { sub("_enc", ""); mode = ENCVEC }
/^static const struct cipher_testvec.*_dec_/ { mode = DECVEC }
mode == ENCVEC && !/\.ilen[[:space:]]*=/ {
sub(/\.input[[:space:]]*=$/, ".ptext =")
sub(/\.input[[:space:]]*=/, ".ptext\t=")
sub(/\.result[[:space:]]*=$/, ".ctext =")
sub(/\.result[[:space:]]*=/, ".ctext\t=")
sub(/\.rlen[[:space:]]*=/, ".len\t=")
print
}
mode == DECVEC_TAIL && /[^[:space:]]/ { mode = OTHER }
mode == OTHER { print }
mode == ENCVEC && /^};/ { mode = OTHER }
mode == DECVEC && /^};/ { mode = DECVEC_TAIL }
Note that git's default diff algorithm gets confused by the testmgr.h
portion of this patch, and reports too many lines added and removed.
It's better viewed with 'git diff --minimal' (or 'git show --minimal'),
which reports "2 files changed, 919 insertions(+), 11723 deletions(-)".
Signed-off-by: Eric Biggers <ebiggers@google.com>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
2018-05-21 08:50:29 +03:00
|
|
|
.cipher = __VECS(tf_lrw_tv_template)
|
2011-10-18 14:32:50 +04:00
|
|
|
}
|
2014-08-22 12:44:36 +04:00
|
|
|
}, {
|
|
|
|
.alg = "lz4",
|
|
|
|
.test = alg_test_comp,
|
|
|
|
.fips_allowed = 1,
|
|
|
|
.suite = {
|
|
|
|
.comp = {
|
2017-01-12 16:40:39 +03:00
|
|
|
.comp = __VECS(lz4_comp_tv_template),
|
|
|
|
.decomp = __VECS(lz4_decomp_tv_template)
|
2014-08-22 12:44:36 +04:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}, {
|
|
|
|
.alg = "lz4hc",
|
|
|
|
.test = alg_test_comp,
|
|
|
|
.fips_allowed = 1,
|
|
|
|
.suite = {
|
|
|
|
.comp = {
|
2017-01-12 16:40:39 +03:00
|
|
|
.comp = __VECS(lz4hc_comp_tv_template),
|
|
|
|
.decomp = __VECS(lz4hc_decomp_tv_template)
|
2014-08-22 12:44:36 +04:00
|
|
|
}
|
|
|
|
}
|
2008-07-31 13:08:25 +04:00
|
|
|
}, {
|
|
|
|
.alg = "lzo",
|
|
|
|
.test = alg_test_comp,
|
2012-12-06 13:16:28 +04:00
|
|
|
.fips_allowed = 1,
|
2008-07-31 13:08:25 +04:00
|
|
|
.suite = {
|
|
|
|
.comp = {
|
2017-01-12 16:40:39 +03:00
|
|
|
.comp = __VECS(lzo_comp_tv_template),
|
|
|
|
.decomp = __VECS(lzo_decomp_tv_template)
|
2008-07-31 13:08:25 +04:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}, {
|
|
|
|
.alg = "md4",
|
|
|
|
.test = alg_test_hash,
|
|
|
|
.suite = {
|
2017-01-12 16:40:39 +03:00
|
|
|
.hash = __VECS(md4_tv_template)
|
2008-07-31 13:08:25 +04:00
|
|
|
}
|
|
|
|
}, {
|
|
|
|
.alg = "md5",
|
|
|
|
.test = alg_test_hash,
|
|
|
|
.suite = {
|
2017-01-12 16:40:39 +03:00
|
|
|
.hash = __VECS(md5_tv_template)
|
2008-07-31 13:08:25 +04:00
|
|
|
}
|
|
|
|
}, {
|
|
|
|
.alg = "michael_mic",
|
|
|
|
.test = alg_test_hash,
|
|
|
|
.suite = {
|
2017-01-12 16:40:39 +03:00
|
|
|
.hash = __VECS(michael_mic_tv_template)
|
2008-07-31 13:08:25 +04:00
|
|
|
}
|
2018-05-11 15:19:10 +03:00
|
|
|
}, {
|
|
|
|
.alg = "morus1280",
|
|
|
|
.test = alg_test_aead,
|
|
|
|
.suite = {
|
|
|
|
.aead = {
|
|
|
|
.enc = __VECS(morus1280_enc_tv_template),
|
|
|
|
.dec = __VECS(morus1280_dec_tv_template),
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}, {
|
|
|
|
.alg = "morus640",
|
|
|
|
.test = alg_test_aead,
|
|
|
|
.suite = {
|
|
|
|
.aead = {
|
|
|
|
.enc = __VECS(morus640_enc_tv_template),
|
|
|
|
.dec = __VECS(morus640_dec_tv_template),
|
|
|
|
}
|
|
|
|
}
|
2018-11-17 04:26:29 +03:00
|
|
|
}, {
|
|
|
|
.alg = "nhpoly1305",
|
|
|
|
.test = alg_test_hash,
|
|
|
|
.suite = {
|
|
|
|
.hash = __VECS(nhpoly1305_tv_template)
|
|
|
|
}
|
2011-05-04 09:04:10 +04:00
|
|
|
}, {
|
|
|
|
.alg = "ofb(aes)",
|
|
|
|
.test = alg_test_skcipher,
|
|
|
|
.fips_allowed = 1,
|
|
|
|
.suite = {
|
crypto: testmgr - eliminate redundant decryption test vectors
Currently testmgr has separate encryption and decryption test vectors
for symmetric ciphers. That's massively redundant, since with few
exceptions (mostly mistakes, apparently), all decryption tests are
identical to the encryption tests, just with the input/result flipped.
Therefore, eliminate the redundancy by removing the decryption test
vectors and updating testmgr to test both encryption and decryption
using what used to be the encryption test vectors. Naming is adjusted
accordingly: each cipher_testvec now has a 'ptext' (plaintext), 'ctext'
(ciphertext), and 'len' instead of an 'input', 'result', 'ilen', and
'rlen'. Note that it was always the case that 'ilen == rlen'.
AES keywrap ("kw(aes)") is special because its IV is generated by the
encryption. Previously this was handled by specifying 'iv_out' for
encryption and 'iv' for decryption. To make it work cleanly with only
one set of test vectors, put the IV in 'iv', remove 'iv_out', and add a
boolean that indicates that the IV is generated by the encryption.
In total, this removes over 10000 lines from testmgr.h, with no
reduction in test coverage since prior patches already copied the few
unique decryption test vectors into the encryption test vectors.
This covers all algorithms that used 'struct cipher_testvec', e.g. any
block cipher in the ECB, CBC, CTR, XTS, LRW, CTS-CBC, PCBC, OFB, or
keywrap modes, and Salsa20 and ChaCha20. No change is made to AEAD
tests, though we probably can eliminate a similar redundancy there too.
The testmgr.h portion of this patch was automatically generated using
the following awk script, with some slight manual fixups on top (updated
'struct cipher_testvec' definition, updated a few comments, and fixed up
the AES keywrap test vectors):
BEGIN { OTHER = 0; ENCVEC = 1; DECVEC = 2; DECVEC_TAIL = 3; mode = OTHER }
/^static const struct cipher_testvec.*_enc_/ { sub("_enc", ""); mode = ENCVEC }
/^static const struct cipher_testvec.*_dec_/ { mode = DECVEC }
mode == ENCVEC && !/\.ilen[[:space:]]*=/ {
sub(/\.input[[:space:]]*=$/, ".ptext =")
sub(/\.input[[:space:]]*=/, ".ptext\t=")
sub(/\.result[[:space:]]*=$/, ".ctext =")
sub(/\.result[[:space:]]*=/, ".ctext\t=")
sub(/\.rlen[[:space:]]*=/, ".len\t=")
print
}
mode == DECVEC_TAIL && /[^[:space:]]/ { mode = OTHER }
mode == OTHER { print }
mode == ENCVEC && /^};/ { mode = OTHER }
mode == DECVEC && /^};/ { mode = DECVEC_TAIL }
Note that git's default diff algorithm gets confused by the testmgr.h
portion of this patch, and reports too many lines added and removed.
It's better viewed with 'git diff --minimal' (or 'git show --minimal'),
which reports "2 files changed, 919 insertions(+), 11723 deletions(-)".
Signed-off-by: Eric Biggers <ebiggers@google.com>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
2018-05-21 08:50:29 +03:00
|
|
|
.cipher = __VECS(aes_ofb_tv_template)
|
2011-05-04 09:04:10 +04:00
|
|
|
}
|
2018-04-23 10:25:14 +03:00
|
|
|
}, {
|
|
|
|
/* Same as ofb(aes) except the key is stored in
|
|
|
|
* hardware secure memory which we reference by index
|
|
|
|
*/
|
|
|
|
.alg = "ofb(paes)",
|
|
|
|
.test = alg_test_null,
|
|
|
|
.fips_allowed = 1,
|
2008-07-31 13:08:25 +04:00
|
|
|
}, {
|
|
|
|
.alg = "pcbc(fcrypt)",
|
2008-08-17 11:01:56 +04:00
|
|
|
.test = alg_test_skcipher,
|
2008-07-31 13:08:25 +04:00
|
|
|
.suite = {
|
crypto: testmgr - eliminate redundant decryption test vectors
Currently testmgr has separate encryption and decryption test vectors
for symmetric ciphers. That's massively redundant, since with few
exceptions (mostly mistakes, apparently), all decryption tests are
identical to the encryption tests, just with the input/result flipped.
Therefore, eliminate the redundancy by removing the decryption test
vectors and updating testmgr to test both encryption and decryption
using what used to be the encryption test vectors. Naming is adjusted
accordingly: each cipher_testvec now has a 'ptext' (plaintext), 'ctext'
(ciphertext), and 'len' instead of an 'input', 'result', 'ilen', and
'rlen'. Note that it was always the case that 'ilen == rlen'.
AES keywrap ("kw(aes)") is special because its IV is generated by the
encryption. Previously this was handled by specifying 'iv_out' for
encryption and 'iv' for decryption. To make it work cleanly with only
one set of test vectors, put the IV in 'iv', remove 'iv_out', and add a
boolean that indicates that the IV is generated by the encryption.
In total, this removes over 10000 lines from testmgr.h, with no
reduction in test coverage since prior patches already copied the few
unique decryption test vectors into the encryption test vectors.
This covers all algorithms that used 'struct cipher_testvec', e.g. any
block cipher in the ECB, CBC, CTR, XTS, LRW, CTS-CBC, PCBC, OFB, or
keywrap modes, and Salsa20 and ChaCha20. No change is made to AEAD
tests, though we probably can eliminate a similar redundancy there too.
The testmgr.h portion of this patch was automatically generated using
the following awk script, with some slight manual fixups on top (updated
'struct cipher_testvec' definition, updated a few comments, and fixed up
the AES keywrap test vectors):
BEGIN { OTHER = 0; ENCVEC = 1; DECVEC = 2; DECVEC_TAIL = 3; mode = OTHER }
/^static const struct cipher_testvec.*_enc_/ { sub("_enc", ""); mode = ENCVEC }
/^static const struct cipher_testvec.*_dec_/ { mode = DECVEC }
mode == ENCVEC && !/\.ilen[[:space:]]*=/ {
sub(/\.input[[:space:]]*=$/, ".ptext =")
sub(/\.input[[:space:]]*=/, ".ptext\t=")
sub(/\.result[[:space:]]*=$/, ".ctext =")
sub(/\.result[[:space:]]*=/, ".ctext\t=")
sub(/\.rlen[[:space:]]*=/, ".len\t=")
print
}
mode == DECVEC_TAIL && /[^[:space:]]/ { mode = OTHER }
mode == OTHER { print }
mode == ENCVEC && /^};/ { mode = OTHER }
mode == DECVEC && /^};/ { mode = DECVEC_TAIL }
Note that git's default diff algorithm gets confused by the testmgr.h
portion of this patch, and reports too many lines added and removed.
It's better viewed with 'git diff --minimal' (or 'git show --minimal'),
which reports "2 files changed, 919 insertions(+), 11723 deletions(-)".
Signed-off-by: Eric Biggers <ebiggers@google.com>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
2018-05-21 08:50:29 +03:00
|
|
|
.cipher = __VECS(fcrypt_pcbc_tv_template)
|
2008-07-31 13:08:25 +04:00
|
|
|
}
|
2017-06-13 00:27:51 +03:00
|
|
|
}, {
|
|
|
|
.alg = "pkcs1pad(rsa,sha224)",
|
|
|
|
.test = alg_test_null,
|
|
|
|
.fips_allowed = 1,
|
|
|
|
}, {
|
|
|
|
.alg = "pkcs1pad(rsa,sha256)",
|
|
|
|
.test = alg_test_akcipher,
|
|
|
|
.fips_allowed = 1,
|
|
|
|
.suite = {
|
|
|
|
.akcipher = __VECS(pkcs1pad_rsa_tv_template)
|
|
|
|
}
|
|
|
|
}, {
|
|
|
|
.alg = "pkcs1pad(rsa,sha384)",
|
|
|
|
.test = alg_test_null,
|
|
|
|
.fips_allowed = 1,
|
|
|
|
}, {
|
|
|
|
.alg = "pkcs1pad(rsa,sha512)",
|
|
|
|
.test = alg_test_null,
|
|
|
|
.fips_allowed = 1,
|
2015-06-01 14:43:59 +03:00
|
|
|
}, {
|
|
|
|
.alg = "poly1305",
|
|
|
|
.test = alg_test_hash,
|
|
|
|
.suite = {
|
2017-01-12 16:40:39 +03:00
|
|
|
.hash = __VECS(poly1305_tv_template)
|
2015-06-01 14:43:59 +03:00
|
|
|
}
|
2008-07-31 13:08:25 +04:00
|
|
|
}, {
|
|
|
|
.alg = "rfc3686(ctr(aes))",
|
2008-08-17 11:01:56 +04:00
|
|
|
.test = alg_test_skcipher,
|
2009-05-15 09:16:03 +04:00
|
|
|
.fips_allowed = 1,
|
2008-07-31 13:08:25 +04:00
|
|
|
.suite = {
|
crypto: testmgr - eliminate redundant decryption test vectors
Currently testmgr has separate encryption and decryption test vectors
for symmetric ciphers. That's massively redundant, since with few
exceptions (mostly mistakes, apparently), all decryption tests are
identical to the encryption tests, just with the input/result flipped.
Therefore, eliminate the redundancy by removing the decryption test
vectors and updating testmgr to test both encryption and decryption
using what used to be the encryption test vectors. Naming is adjusted
accordingly: each cipher_testvec now has a 'ptext' (plaintext), 'ctext'
(ciphertext), and 'len' instead of an 'input', 'result', 'ilen', and
'rlen'. Note that it was always the case that 'ilen == rlen'.
AES keywrap ("kw(aes)") is special because its IV is generated by the
encryption. Previously this was handled by specifying 'iv_out' for
encryption and 'iv' for decryption. To make it work cleanly with only
one set of test vectors, put the IV in 'iv', remove 'iv_out', and add a
boolean that indicates that the IV is generated by the encryption.
In total, this removes over 10000 lines from testmgr.h, with no
reduction in test coverage since prior patches already copied the few
unique decryption test vectors into the encryption test vectors.
This covers all algorithms that used 'struct cipher_testvec', e.g. any
block cipher in the ECB, CBC, CTR, XTS, LRW, CTS-CBC, PCBC, OFB, or
keywrap modes, and Salsa20 and ChaCha20. No change is made to AEAD
tests, though we probably can eliminate a similar redundancy there too.
The testmgr.h portion of this patch was automatically generated using
the following awk script, with some slight manual fixups on top (updated
'struct cipher_testvec' definition, updated a few comments, and fixed up
the AES keywrap test vectors):
BEGIN { OTHER = 0; ENCVEC = 1; DECVEC = 2; DECVEC_TAIL = 3; mode = OTHER }
/^static const struct cipher_testvec.*_enc_/ { sub("_enc", ""); mode = ENCVEC }
/^static const struct cipher_testvec.*_dec_/ { mode = DECVEC }
mode == ENCVEC && !/\.ilen[[:space:]]*=/ {
sub(/\.input[[:space:]]*=$/, ".ptext =")
sub(/\.input[[:space:]]*=/, ".ptext\t=")
sub(/\.result[[:space:]]*=$/, ".ctext =")
sub(/\.result[[:space:]]*=/, ".ctext\t=")
sub(/\.rlen[[:space:]]*=/, ".len\t=")
print
}
mode == DECVEC_TAIL && /[^[:space:]]/ { mode = OTHER }
mode == OTHER { print }
mode == ENCVEC && /^};/ { mode = OTHER }
mode == DECVEC && /^};/ { mode = DECVEC_TAIL }
Note that git's default diff algorithm gets confused by the testmgr.h
portion of this patch, and reports too many lines added and removed.
It's better viewed with 'git diff --minimal' (or 'git show --minimal'),
which reports "2 files changed, 919 insertions(+), 11723 deletions(-)".
Signed-off-by: Eric Biggers <ebiggers@google.com>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
2018-05-21 08:50:29 +03:00
|
|
|
.cipher = __VECS(aes_ctr_rfc3686_tv_template)
|
2008-07-31 13:08:25 +04:00
|
|
|
}
|
2009-05-04 15:23:40 +04:00
|
|
|
}, {
|
2015-07-09 02:17:34 +03:00
|
|
|
.alg = "rfc4106(gcm(aes))",
|
2010-11-04 22:02:04 +03:00
|
|
|
.test = alg_test_aead,
|
2015-01-23 20:42:15 +03:00
|
|
|
.fips_allowed = 1,
|
2010-11-04 22:02:04 +03:00
|
|
|
.suite = {
|
|
|
|
.aead = {
|
2017-01-12 16:40:39 +03:00
|
|
|
.enc = __VECS(aes_gcm_rfc4106_enc_tv_template),
|
|
|
|
.dec = __VECS(aes_gcm_rfc4106_dec_tv_template)
|
2010-11-04 22:02:04 +03:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}, {
|
2015-07-14 11:53:22 +03:00
|
|
|
.alg = "rfc4309(ccm(aes))",
|
2009-05-04 15:23:40 +04:00
|
|
|
.test = alg_test_aead,
|
2009-05-15 09:16:03 +04:00
|
|
|
.fips_allowed = 1,
|
2009-05-04 15:23:40 +04:00
|
|
|
.suite = {
|
|
|
|
.aead = {
|
2017-01-12 16:40:39 +03:00
|
|
|
.enc = __VECS(aes_ccm_rfc4309_enc_tv_template),
|
|
|
|
.dec = __VECS(aes_ccm_rfc4309_dec_tv_template)
|
2009-05-04 15:23:40 +04:00
|
|
|
}
|
|
|
|
}
|
2013-04-07 17:43:51 +04:00
|
|
|
}, {
|
2015-06-16 08:54:24 +03:00
|
|
|
.alg = "rfc4543(gcm(aes))",
|
2013-04-07 17:43:51 +04:00
|
|
|
.test = alg_test_aead,
|
|
|
|
.suite = {
|
|
|
|
.aead = {
|
2017-01-12 16:40:39 +03:00
|
|
|
.enc = __VECS(aes_gcm_rfc4543_enc_tv_template),
|
|
|
|
.dec = __VECS(aes_gcm_rfc4543_dec_tv_template),
|
2013-04-07 17:43:51 +04:00
|
|
|
}
|
|
|
|
}
|
2015-06-01 14:44:01 +03:00
|
|
|
}, {
|
|
|
|
.alg = "rfc7539(chacha20,poly1305)",
|
|
|
|
.test = alg_test_aead,
|
|
|
|
.suite = {
|
|
|
|
.aead = {
|
2017-01-12 16:40:39 +03:00
|
|
|
.enc = __VECS(rfc7539_enc_tv_template),
|
|
|
|
.dec = __VECS(rfc7539_dec_tv_template),
|
2015-06-01 14:44:01 +03:00
|
|
|
}
|
|
|
|
}
|
2015-06-01 14:44:03 +03:00
|
|
|
}, {
|
|
|
|
.alg = "rfc7539esp(chacha20,poly1305)",
|
|
|
|
.test = alg_test_aead,
|
|
|
|
.suite = {
|
|
|
|
.aead = {
|
2017-01-12 16:40:39 +03:00
|
|
|
.enc = __VECS(rfc7539esp_enc_tv_template),
|
|
|
|
.dec = __VECS(rfc7539esp_dec_tv_template),
|
2015-06-01 14:44:03 +03:00
|
|
|
}
|
|
|
|
}
|
2008-07-31 13:08:25 +04:00
|
|
|
}, {
|
|
|
|
.alg = "rmd128",
|
|
|
|
.test = alg_test_hash,
|
|
|
|
.suite = {
|
2017-01-12 16:40:39 +03:00
|
|
|
.hash = __VECS(rmd128_tv_template)
|
2008-07-31 13:08:25 +04:00
|
|
|
}
|
|
|
|
}, {
|
|
|
|
.alg = "rmd160",
|
|
|
|
.test = alg_test_hash,
|
|
|
|
.suite = {
|
2017-01-12 16:40:39 +03:00
|
|
|
.hash = __VECS(rmd160_tv_template)
|
2008-07-31 13:08:25 +04:00
|
|
|
}
|
|
|
|
}, {
|
|
|
|
.alg = "rmd256",
|
|
|
|
.test = alg_test_hash,
|
|
|
|
.suite = {
|
2017-01-12 16:40:39 +03:00
|
|
|
.hash = __VECS(rmd256_tv_template)
|
2008-07-31 13:08:25 +04:00
|
|
|
}
|
|
|
|
}, {
|
|
|
|
.alg = "rmd320",
|
|
|
|
.test = alg_test_hash,
|
|
|
|
.suite = {
|
2017-01-12 16:40:39 +03:00
|
|
|
.hash = __VECS(rmd320_tv_template)
|
2008-07-31 13:08:25 +04:00
|
|
|
}
|
2015-06-16 20:31:06 +03:00
|
|
|
}, {
|
|
|
|
.alg = "rsa",
|
|
|
|
.test = alg_test_akcipher,
|
|
|
|
.fips_allowed = 1,
|
|
|
|
.suite = {
|
2017-01-12 16:40:39 +03:00
|
|
|
.akcipher = __VECS(rsa_tv_template)
|
2015-06-16 20:31:06 +03:00
|
|
|
}
|
2008-07-31 13:08:25 +04:00
|
|
|
}, {
|
|
|
|
.alg = "salsa20",
|
2008-08-17 11:01:56 +04:00
|
|
|
.test = alg_test_skcipher,
|
2008-07-31 13:08:25 +04:00
|
|
|
.suite = {
|
crypto: testmgr - eliminate redundant decryption test vectors
Currently testmgr has separate encryption and decryption test vectors
for symmetric ciphers. That's massively redundant, since with few
exceptions (mostly mistakes, apparently), all decryption tests are
identical to the encryption tests, just with the input/result flipped.
Therefore, eliminate the redundancy by removing the decryption test
vectors and updating testmgr to test both encryption and decryption
using what used to be the encryption test vectors. Naming is adjusted
accordingly: each cipher_testvec now has a 'ptext' (plaintext), 'ctext'
(ciphertext), and 'len' instead of an 'input', 'result', 'ilen', and
'rlen'. Note that it was always the case that 'ilen == rlen'.
AES keywrap ("kw(aes)") is special because its IV is generated by the
encryption. Previously this was handled by specifying 'iv_out' for
encryption and 'iv' for decryption. To make it work cleanly with only
one set of test vectors, put the IV in 'iv', remove 'iv_out', and add a
boolean that indicates that the IV is generated by the encryption.
In total, this removes over 10000 lines from testmgr.h, with no
reduction in test coverage since prior patches already copied the few
unique decryption test vectors into the encryption test vectors.
This covers all algorithms that used 'struct cipher_testvec', e.g. any
block cipher in the ECB, CBC, CTR, XTS, LRW, CTS-CBC, PCBC, OFB, or
keywrap modes, and Salsa20 and ChaCha20. No change is made to AEAD
tests, though we probably can eliminate a similar redundancy there too.
The testmgr.h portion of this patch was automatically generated using
the following awk script, with some slight manual fixups on top (updated
'struct cipher_testvec' definition, updated a few comments, and fixed up
the AES keywrap test vectors):
BEGIN { OTHER = 0; ENCVEC = 1; DECVEC = 2; DECVEC_TAIL = 3; mode = OTHER }
/^static const struct cipher_testvec.*_enc_/ { sub("_enc", ""); mode = ENCVEC }
/^static const struct cipher_testvec.*_dec_/ { mode = DECVEC }
mode == ENCVEC && !/\.ilen[[:space:]]*=/ {
sub(/\.input[[:space:]]*=$/, ".ptext =")
sub(/\.input[[:space:]]*=/, ".ptext\t=")
sub(/\.result[[:space:]]*=$/, ".ctext =")
sub(/\.result[[:space:]]*=/, ".ctext\t=")
sub(/\.rlen[[:space:]]*=/, ".len\t=")
print
}
mode == DECVEC_TAIL && /[^[:space:]]/ { mode = OTHER }
mode == OTHER { print }
mode == ENCVEC && /^};/ { mode = OTHER }
mode == DECVEC && /^};/ { mode = DECVEC_TAIL }
Note that git's default diff algorithm gets confused by the testmgr.h
portion of this patch, and reports too many lines added and removed.
It's better viewed with 'git diff --minimal' (or 'git show --minimal'),
which reports "2 files changed, 919 insertions(+), 11723 deletions(-)".
Signed-off-by: Eric Biggers <ebiggers@google.com>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
2018-05-21 08:50:29 +03:00
|
|
|
.cipher = __VECS(salsa20_stream_tv_template)
|
2008-07-31 13:08:25 +04:00
|
|
|
}
|
|
|
|
}, {
|
|
|
|
.alg = "sha1",
|
|
|
|
.test = alg_test_hash,
|
2009-05-15 09:16:03 +04:00
|
|
|
.fips_allowed = 1,
|
2008-07-31 13:08:25 +04:00
|
|
|
.suite = {
|
2017-01-12 16:40:39 +03:00
|
|
|
.hash = __VECS(sha1_tv_template)
|
2008-07-31 13:08:25 +04:00
|
|
|
}
|
|
|
|
}, {
|
|
|
|
.alg = "sha224",
|
|
|
|
.test = alg_test_hash,
|
2009-05-15 09:16:03 +04:00
|
|
|
.fips_allowed = 1,
|
2008-07-31 13:08:25 +04:00
|
|
|
.suite = {
|
2017-01-12 16:40:39 +03:00
|
|
|
.hash = __VECS(sha224_tv_template)
|
2008-07-31 13:08:25 +04:00
|
|
|
}
|
|
|
|
}, {
|
|
|
|
.alg = "sha256",
|
|
|
|
.test = alg_test_hash,
|
2009-05-15 09:16:03 +04:00
|
|
|
.fips_allowed = 1,
|
2008-07-31 13:08:25 +04:00
|
|
|
.suite = {
|
2017-01-12 16:40:39 +03:00
|
|
|
.hash = __VECS(sha256_tv_template)
|
2008-07-31 13:08:25 +04:00
|
|
|
}
|
2016-06-17 08:00:36 +03:00
|
|
|
}, {
|
|
|
|
.alg = "sha3-224",
|
|
|
|
.test = alg_test_hash,
|
|
|
|
.fips_allowed = 1,
|
|
|
|
.suite = {
|
2017-01-12 16:40:39 +03:00
|
|
|
.hash = __VECS(sha3_224_tv_template)
|
2016-06-17 08:00:36 +03:00
|
|
|
}
|
|
|
|
}, {
|
|
|
|
.alg = "sha3-256",
|
|
|
|
.test = alg_test_hash,
|
|
|
|
.fips_allowed = 1,
|
|
|
|
.suite = {
|
2017-01-12 16:40:39 +03:00
|
|
|
.hash = __VECS(sha3_256_tv_template)
|
2016-06-17 08:00:36 +03:00
|
|
|
}
|
|
|
|
}, {
|
|
|
|
.alg = "sha3-384",
|
|
|
|
.test = alg_test_hash,
|
|
|
|
.fips_allowed = 1,
|
|
|
|
.suite = {
|
2017-01-12 16:40:39 +03:00
|
|
|
.hash = __VECS(sha3_384_tv_template)
|
2016-06-17 08:00:36 +03:00
|
|
|
}
|
|
|
|
}, {
|
|
|
|
.alg = "sha3-512",
|
|
|
|
.test = alg_test_hash,
|
|
|
|
.fips_allowed = 1,
|
|
|
|
.suite = {
|
2017-01-12 16:40:39 +03:00
|
|
|
.hash = __VECS(sha3_512_tv_template)
|
2016-06-17 08:00:36 +03:00
|
|
|
}
|
2008-07-31 13:08:25 +04:00
|
|
|
}, {
|
|
|
|
.alg = "sha384",
|
|
|
|
.test = alg_test_hash,
|
2009-05-15 09:16:03 +04:00
|
|
|
.fips_allowed = 1,
|
2008-07-31 13:08:25 +04:00
|
|
|
.suite = {
|
2017-01-12 16:40:39 +03:00
|
|
|
.hash = __VECS(sha384_tv_template)
|
2008-07-31 13:08:25 +04:00
|
|
|
}
|
|
|
|
}, {
|
|
|
|
.alg = "sha512",
|
|
|
|
.test = alg_test_hash,
|
2009-05-15 09:16:03 +04:00
|
|
|
.fips_allowed = 1,
|
2008-07-31 13:08:25 +04:00
|
|
|
.suite = {
|
2017-01-12 16:40:39 +03:00
|
|
|
.hash = __VECS(sha512_tv_template)
|
2008-07-31 13:08:25 +04:00
|
|
|
}
|
2017-08-21 13:51:29 +03:00
|
|
|
}, {
|
|
|
|
.alg = "sm3",
|
|
|
|
.test = alg_test_hash,
|
|
|
|
.suite = {
|
|
|
|
.hash = __VECS(sm3_tv_template)
|
|
|
|
}
|
2018-11-07 00:00:03 +03:00
|
|
|
}, {
|
|
|
|
.alg = "streebog256",
|
|
|
|
.test = alg_test_hash,
|
|
|
|
.suite = {
|
|
|
|
.hash = __VECS(streebog256_tv_template)
|
|
|
|
}
|
|
|
|
}, {
|
|
|
|
.alg = "streebog512",
|
|
|
|
.test = alg_test_hash,
|
|
|
|
.suite = {
|
|
|
|
.hash = __VECS(streebog512_tv_template)
|
|
|
|
}
|
2008-07-31 13:08:25 +04:00
|
|
|
}, {
|
|
|
|
.alg = "tgr128",
|
|
|
|
.test = alg_test_hash,
|
|
|
|
.suite = {
|
2017-01-12 16:40:39 +03:00
|
|
|
.hash = __VECS(tgr128_tv_template)
|
2008-07-31 13:08:25 +04:00
|
|
|
}
|
|
|
|
}, {
|
|
|
|
.alg = "tgr160",
|
|
|
|
.test = alg_test_hash,
|
|
|
|
.suite = {
|
2017-01-12 16:40:39 +03:00
|
|
|
.hash = __VECS(tgr160_tv_template)
|
2008-07-31 13:08:25 +04:00
|
|
|
}
|
|
|
|
}, {
|
|
|
|
.alg = "tgr192",
|
|
|
|
.test = alg_test_hash,
|
|
|
|
.suite = {
|
2017-01-12 16:40:39 +03:00
|
|
|
.hash = __VECS(tgr192_tv_template)
|
2008-07-31 13:08:25 +04:00
|
|
|
}
|
2018-06-18 20:22:39 +03:00
|
|
|
}, {
|
|
|
|
.alg = "vmac64(aes)",
|
|
|
|
.test = alg_test_hash,
|
|
|
|
.suite = {
|
|
|
|
.hash = __VECS(vmac64_aes_tv_template)
|
|
|
|
}
|
2008-07-31 13:08:25 +04:00
|
|
|
}, {
|
|
|
|
.alg = "wp256",
|
|
|
|
.test = alg_test_hash,
|
|
|
|
.suite = {
|
2017-01-12 16:40:39 +03:00
|
|
|
.hash = __VECS(wp256_tv_template)
|
2008-07-31 13:08:25 +04:00
|
|
|
}
|
|
|
|
}, {
|
|
|
|
.alg = "wp384",
|
|
|
|
.test = alg_test_hash,
|
|
|
|
.suite = {
|
2017-01-12 16:40:39 +03:00
|
|
|
.hash = __VECS(wp384_tv_template)
|
2008-07-31 13:08:25 +04:00
|
|
|
}
|
|
|
|
}, {
|
|
|
|
.alg = "wp512",
|
|
|
|
.test = alg_test_hash,
|
|
|
|
.suite = {
|
2017-01-12 16:40:39 +03:00
|
|
|
.hash = __VECS(wp512_tv_template)
|
2008-07-31 13:08:25 +04:00
|
|
|
}
|
|
|
|
}, {
|
|
|
|
.alg = "xcbc(aes)",
|
|
|
|
.test = alg_test_hash,
|
|
|
|
.suite = {
|
2017-01-12 16:40:39 +03:00
|
|
|
.hash = __VECS(aes_xcbc128_tv_template)
|
2008-07-31 13:08:25 +04:00
|
|
|
}
|
crypto: chacha - add XChaCha12 support
Now that the generic implementation of ChaCha20 has been refactored to
allow varying the number of rounds, add support for XChaCha12, which is
the XSalsa construction applied to ChaCha12. ChaCha12 is one of the
three ciphers specified by the original ChaCha paper
(https://cr.yp.to/chacha/chacha-20080128.pdf: "ChaCha, a variant of
Salsa20"), alongside ChaCha8 and ChaCha20. ChaCha12 is faster than
ChaCha20 but has a lower, but still large, security margin.
We need XChaCha12 support so that it can be used in the Adiantum
encryption mode, which enables disk/file encryption on low-end mobile
devices where AES-XTS is too slow as the CPUs lack AES instructions.
We'd prefer XChaCha20 (the more popular variant), but it's too slow on
some of our target devices, so at least in some cases we do need the
XChaCha12-based version. In more detail, the problem is that Adiantum
is still much slower than we're happy with, and encryption still has a
quite noticeable effect on the feel of low-end devices. Users and
vendors push back hard against encryption that degrades the user
experience, which always risks encryption being disabled entirely. So
we need to choose the fastest option that gives us a solid margin of
security, and here that's XChaCha12. The best known attack on ChaCha
breaks only 7 rounds and has 2^235 time complexity, so ChaCha12's
security margin is still better than AES-256's. Much has been learned
about cryptanalysis of ARX ciphers since Salsa20 was originally designed
in 2005, and it now seems we can be comfortable with a smaller number of
rounds. The eSTREAM project also suggests the 12-round version of
Salsa20 as providing the best balance among the different variants:
combining very good performance with a "comfortable margin of security".
Note that it would be trivial to add vanilla ChaCha12 in addition to
XChaCha12. However, it's unneeded for now and therefore is omitted.
As discussed in the patch that introduced XChaCha20 support, I
considered splitting the code into separate chacha-common, chacha20,
xchacha20, and xchacha12 modules, so that these algorithms could be
enabled/disabled independently. However, since nearly all the code is
shared anyway, I ultimately decided there would have been little benefit
to the added complexity.
Reviewed-by: Ard Biesheuvel <ard.biesheuvel@linaro.org>
Acked-by: Martin Willi <martin@strongswan.org>
Signed-off-by: Eric Biggers <ebiggers@google.com>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
2018-11-17 04:26:22 +03:00
|
|
|
}, {
|
|
|
|
.alg = "xchacha12",
|
|
|
|
.test = alg_test_skcipher,
|
|
|
|
.suite = {
|
|
|
|
.cipher = __VECS(xchacha12_tv_template)
|
|
|
|
},
|
crypto: chacha20-generic - add XChaCha20 support
Add support for the XChaCha20 stream cipher. XChaCha20 is the
application of the XSalsa20 construction
(https://cr.yp.to/snuffle/xsalsa-20081128.pdf) to ChaCha20 rather than
to Salsa20. XChaCha20 extends ChaCha20's nonce length from 64 bits (or
96 bits, depending on convention) to 192 bits, while provably retaining
ChaCha20's security. XChaCha20 uses the ChaCha20 permutation to map the
key and first 128 nonce bits to a 256-bit subkey. Then, it does the
ChaCha20 stream cipher with the subkey and remaining 64 bits of nonce.
We need XChaCha support in order to add support for the Adiantum
encryption mode. Note that to meet our performance requirements, we
actually plan to primarily use the variant XChaCha12. But we believe
it's wise to first add XChaCha20 as a baseline with a higher security
margin, in case there are any situations where it can be used.
Supporting both variants is straightforward.
Since XChaCha20's subkey differs for each request, XChaCha20 can't be a
template that wraps ChaCha20; that would require re-keying the
underlying ChaCha20 for every request, which wouldn't be thread-safe.
Instead, we make XChaCha20 its own top-level algorithm which calls the
ChaCha20 streaming implementation internally.
Similar to the existing ChaCha20 implementation, we define the IV to be
the nonce and stream position concatenated together. This allows users
to seek to any position in the stream.
I considered splitting the code into separate chacha20-common, chacha20,
and xchacha20 modules, so that chacha20 and xchacha20 could be
enabled/disabled independently. However, since nearly all the code is
shared anyway, I ultimately decided there would have been little benefit
to the added complexity of separate modules.
Reviewed-by: Ard Biesheuvel <ard.biesheuvel@linaro.org>
Acked-by: Martin Willi <martin@strongswan.org>
Signed-off-by: Eric Biggers <ebiggers@google.com>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
2018-11-17 04:26:20 +03:00
|
|
|
}, {
|
|
|
|
.alg = "xchacha20",
|
|
|
|
.test = alg_test_skcipher,
|
|
|
|
.suite = {
|
|
|
|
.cipher = __VECS(xchacha20_tv_template)
|
|
|
|
},
|
2008-07-31 13:08:25 +04:00
|
|
|
}, {
|
|
|
|
.alg = "xts(aes)",
|
2008-08-17 11:01:56 +04:00
|
|
|
.test = alg_test_skcipher,
|
2011-01-29 07:14:01 +03:00
|
|
|
.fips_allowed = 1,
|
2008-07-31 13:08:25 +04:00
|
|
|
.suite = {
|
crypto: testmgr - eliminate redundant decryption test vectors
Currently testmgr has separate encryption and decryption test vectors
for symmetric ciphers. That's massively redundant, since with few
exceptions (mostly mistakes, apparently), all decryption tests are
identical to the encryption tests, just with the input/result flipped.
Therefore, eliminate the redundancy by removing the decryption test
vectors and updating testmgr to test both encryption and decryption
using what used to be the encryption test vectors. Naming is adjusted
accordingly: each cipher_testvec now has a 'ptext' (plaintext), 'ctext'
(ciphertext), and 'len' instead of an 'input', 'result', 'ilen', and
'rlen'. Note that it was always the case that 'ilen == rlen'.
AES keywrap ("kw(aes)") is special because its IV is generated by the
encryption. Previously this was handled by specifying 'iv_out' for
encryption and 'iv' for decryption. To make it work cleanly with only
one set of test vectors, put the IV in 'iv', remove 'iv_out', and add a
boolean that indicates that the IV is generated by the encryption.
In total, this removes over 10000 lines from testmgr.h, with no
reduction in test coverage since prior patches already copied the few
unique decryption test vectors into the encryption test vectors.
This covers all algorithms that used 'struct cipher_testvec', e.g. any
block cipher in the ECB, CBC, CTR, XTS, LRW, CTS-CBC, PCBC, OFB, or
keywrap modes, and Salsa20 and ChaCha20. No change is made to AEAD
tests, though we probably can eliminate a similar redundancy there too.
The testmgr.h portion of this patch was automatically generated using
the following awk script, with some slight manual fixups on top (updated
'struct cipher_testvec' definition, updated a few comments, and fixed up
the AES keywrap test vectors):
BEGIN { OTHER = 0; ENCVEC = 1; DECVEC = 2; DECVEC_TAIL = 3; mode = OTHER }
/^static const struct cipher_testvec.*_enc_/ { sub("_enc", ""); mode = ENCVEC }
/^static const struct cipher_testvec.*_dec_/ { mode = DECVEC }
mode == ENCVEC && !/\.ilen[[:space:]]*=/ {
sub(/\.input[[:space:]]*=$/, ".ptext =")
sub(/\.input[[:space:]]*=/, ".ptext\t=")
sub(/\.result[[:space:]]*=$/, ".ctext =")
sub(/\.result[[:space:]]*=/, ".ctext\t=")
sub(/\.rlen[[:space:]]*=/, ".len\t=")
print
}
mode == DECVEC_TAIL && /[^[:space:]]/ { mode = OTHER }
mode == OTHER { print }
mode == ENCVEC && /^};/ { mode = OTHER }
mode == DECVEC && /^};/ { mode = DECVEC_TAIL }
Note that git's default diff algorithm gets confused by the testmgr.h
portion of this patch, and reports too many lines added and removed.
It's better viewed with 'git diff --minimal' (or 'git show --minimal'),
which reports "2 files changed, 919 insertions(+), 11723 deletions(-)".
Signed-off-by: Eric Biggers <ebiggers@google.com>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
2018-05-21 08:50:29 +03:00
|
|
|
.cipher = __VECS(aes_xts_tv_template)
|
2008-07-31 13:08:25 +04:00
|
|
|
}
|
2012-03-05 22:26:21 +04:00
|
|
|
}, {
|
|
|
|
.alg = "xts(camellia)",
|
|
|
|
.test = alg_test_skcipher,
|
|
|
|
.suite = {
|
crypto: testmgr - eliminate redundant decryption test vectors
Currently testmgr has separate encryption and decryption test vectors
for symmetric ciphers. That's massively redundant, since with few
exceptions (mostly mistakes, apparently), all decryption tests are
identical to the encryption tests, just with the input/result flipped.
Therefore, eliminate the redundancy by removing the decryption test
vectors and updating testmgr to test both encryption and decryption
using what used to be the encryption test vectors. Naming is adjusted
accordingly: each cipher_testvec now has a 'ptext' (plaintext), 'ctext'
(ciphertext), and 'len' instead of an 'input', 'result', 'ilen', and
'rlen'. Note that it was always the case that 'ilen == rlen'.
AES keywrap ("kw(aes)") is special because its IV is generated by the
encryption. Previously this was handled by specifying 'iv_out' for
encryption and 'iv' for decryption. To make it work cleanly with only
one set of test vectors, put the IV in 'iv', remove 'iv_out', and add a
boolean that indicates that the IV is generated by the encryption.
In total, this removes over 10000 lines from testmgr.h, with no
reduction in test coverage since prior patches already copied the few
unique decryption test vectors into the encryption test vectors.
This covers all algorithms that used 'struct cipher_testvec', e.g. any
block cipher in the ECB, CBC, CTR, XTS, LRW, CTS-CBC, PCBC, OFB, or
keywrap modes, and Salsa20 and ChaCha20. No change is made to AEAD
tests, though we probably can eliminate a similar redundancy there too.
The testmgr.h portion of this patch was automatically generated using
the following awk script, with some slight manual fixups on top (updated
'struct cipher_testvec' definition, updated a few comments, and fixed up
the AES keywrap test vectors):
BEGIN { OTHER = 0; ENCVEC = 1; DECVEC = 2; DECVEC_TAIL = 3; mode = OTHER }
/^static const struct cipher_testvec.*_enc_/ { sub("_enc", ""); mode = ENCVEC }
/^static const struct cipher_testvec.*_dec_/ { mode = DECVEC }
mode == ENCVEC && !/\.ilen[[:space:]]*=/ {
sub(/\.input[[:space:]]*=$/, ".ptext =")
sub(/\.input[[:space:]]*=/, ".ptext\t=")
sub(/\.result[[:space:]]*=$/, ".ctext =")
sub(/\.result[[:space:]]*=/, ".ctext\t=")
sub(/\.rlen[[:space:]]*=/, ".len\t=")
print
}
mode == DECVEC_TAIL && /[^[:space:]]/ { mode = OTHER }
mode == OTHER { print }
mode == ENCVEC && /^};/ { mode = OTHER }
mode == DECVEC && /^};/ { mode = DECVEC_TAIL }
Note that git's default diff algorithm gets confused by the testmgr.h
portion of this patch, and reports too many lines added and removed.
It's better viewed with 'git diff --minimal' (or 'git show --minimal'),
which reports "2 files changed, 919 insertions(+), 11723 deletions(-)".
Signed-off-by: Eric Biggers <ebiggers@google.com>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
2018-05-21 08:50:29 +03:00
|
|
|
.cipher = __VECS(camellia_xts_tv_template)
|
2012-03-05 22:26:21 +04:00
|
|
|
}
|
2012-07-11 21:38:29 +04:00
|
|
|
}, {
|
|
|
|
.alg = "xts(cast6)",
|
|
|
|
.test = alg_test_skcipher,
|
|
|
|
.suite = {
|
crypto: testmgr - eliminate redundant decryption test vectors
Currently testmgr has separate encryption and decryption test vectors
for symmetric ciphers. That's massively redundant, since with few
exceptions (mostly mistakes, apparently), all decryption tests are
identical to the encryption tests, just with the input/result flipped.
Therefore, eliminate the redundancy by removing the decryption test
vectors and updating testmgr to test both encryption and decryption
using what used to be the encryption test vectors. Naming is adjusted
accordingly: each cipher_testvec now has a 'ptext' (plaintext), 'ctext'
(ciphertext), and 'len' instead of an 'input', 'result', 'ilen', and
'rlen'. Note that it was always the case that 'ilen == rlen'.
AES keywrap ("kw(aes)") is special because its IV is generated by the
encryption. Previously this was handled by specifying 'iv_out' for
encryption and 'iv' for decryption. To make it work cleanly with only
one set of test vectors, put the IV in 'iv', remove 'iv_out', and add a
boolean that indicates that the IV is generated by the encryption.
In total, this removes over 10000 lines from testmgr.h, with no
reduction in test coverage since prior patches already copied the few
unique decryption test vectors into the encryption test vectors.
This covers all algorithms that used 'struct cipher_testvec', e.g. any
block cipher in the ECB, CBC, CTR, XTS, LRW, CTS-CBC, PCBC, OFB, or
keywrap modes, and Salsa20 and ChaCha20. No change is made to AEAD
tests, though we probably can eliminate a similar redundancy there too.
The testmgr.h portion of this patch was automatically generated using
the following awk script, with some slight manual fixups on top (updated
'struct cipher_testvec' definition, updated a few comments, and fixed up
the AES keywrap test vectors):
BEGIN { OTHER = 0; ENCVEC = 1; DECVEC = 2; DECVEC_TAIL = 3; mode = OTHER }
/^static const struct cipher_testvec.*_enc_/ { sub("_enc", ""); mode = ENCVEC }
/^static const struct cipher_testvec.*_dec_/ { mode = DECVEC }
mode == ENCVEC && !/\.ilen[[:space:]]*=/ {
sub(/\.input[[:space:]]*=$/, ".ptext =")
sub(/\.input[[:space:]]*=/, ".ptext\t=")
sub(/\.result[[:space:]]*=$/, ".ctext =")
sub(/\.result[[:space:]]*=/, ".ctext\t=")
sub(/\.rlen[[:space:]]*=/, ".len\t=")
print
}
mode == DECVEC_TAIL && /[^[:space:]]/ { mode = OTHER }
mode == OTHER { print }
mode == ENCVEC && /^};/ { mode = OTHER }
mode == DECVEC && /^};/ { mode = DECVEC_TAIL }
Note that git's default diff algorithm gets confused by the testmgr.h
portion of this patch, and reports too many lines added and removed.
It's better viewed with 'git diff --minimal' (or 'git show --minimal'),
which reports "2 files changed, 919 insertions(+), 11723 deletions(-)".
Signed-off-by: Eric Biggers <ebiggers@google.com>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
2018-05-21 08:50:29 +03:00
|
|
|
.cipher = __VECS(cast6_xts_tv_template)
|
2012-07-11 21:38:29 +04:00
|
|
|
}
|
2018-05-11 11:04:06 +03:00
|
|
|
}, {
|
|
|
|
/* Same as xts(aes) except the key is stored in
|
|
|
|
* hardware secure memory which we reference by index
|
|
|
|
*/
|
|
|
|
.alg = "xts(paes)",
|
|
|
|
.test = alg_test_null,
|
|
|
|
.fips_allowed = 1,
|
2011-10-18 14:33:17 +04:00
|
|
|
}, {
|
|
|
|
.alg = "xts(serpent)",
|
|
|
|
.test = alg_test_skcipher,
|
|
|
|
.suite = {
|
crypto: testmgr - eliminate redundant decryption test vectors
Currently testmgr has separate encryption and decryption test vectors
for symmetric ciphers. That's massively redundant, since with few
exceptions (mostly mistakes, apparently), all decryption tests are
identical to the encryption tests, just with the input/result flipped.
Therefore, eliminate the redundancy by removing the decryption test
vectors and updating testmgr to test both encryption and decryption
using what used to be the encryption test vectors. Naming is adjusted
accordingly: each cipher_testvec now has a 'ptext' (plaintext), 'ctext'
(ciphertext), and 'len' instead of an 'input', 'result', 'ilen', and
'rlen'. Note that it was always the case that 'ilen == rlen'.
AES keywrap ("kw(aes)") is special because its IV is generated by the
encryption. Previously this was handled by specifying 'iv_out' for
encryption and 'iv' for decryption. To make it work cleanly with only
one set of test vectors, put the IV in 'iv', remove 'iv_out', and add a
boolean that indicates that the IV is generated by the encryption.
In total, this removes over 10000 lines from testmgr.h, with no
reduction in test coverage since prior patches already copied the few
unique decryption test vectors into the encryption test vectors.
This covers all algorithms that used 'struct cipher_testvec', e.g. any
block cipher in the ECB, CBC, CTR, XTS, LRW, CTS-CBC, PCBC, OFB, or
keywrap modes, and Salsa20 and ChaCha20. No change is made to AEAD
tests, though we probably can eliminate a similar redundancy there too.
The testmgr.h portion of this patch was automatically generated using
the following awk script, with some slight manual fixups on top (updated
'struct cipher_testvec' definition, updated a few comments, and fixed up
the AES keywrap test vectors):
BEGIN { OTHER = 0; ENCVEC = 1; DECVEC = 2; DECVEC_TAIL = 3; mode = OTHER }
/^static const struct cipher_testvec.*_enc_/ { sub("_enc", ""); mode = ENCVEC }
/^static const struct cipher_testvec.*_dec_/ { mode = DECVEC }
mode == ENCVEC && !/\.ilen[[:space:]]*=/ {
sub(/\.input[[:space:]]*=$/, ".ptext =")
sub(/\.input[[:space:]]*=/, ".ptext\t=")
sub(/\.result[[:space:]]*=$/, ".ctext =")
sub(/\.result[[:space:]]*=/, ".ctext\t=")
sub(/\.rlen[[:space:]]*=/, ".len\t=")
print
}
mode == DECVEC_TAIL && /[^[:space:]]/ { mode = OTHER }
mode == OTHER { print }
mode == ENCVEC && /^};/ { mode = OTHER }
mode == DECVEC && /^};/ { mode = DECVEC_TAIL }
Note that git's default diff algorithm gets confused by the testmgr.h
portion of this patch, and reports too many lines added and removed.
It's better viewed with 'git diff --minimal' (or 'git show --minimal'),
which reports "2 files changed, 919 insertions(+), 11723 deletions(-)".
Signed-off-by: Eric Biggers <ebiggers@google.com>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
2018-05-21 08:50:29 +03:00
|
|
|
.cipher = __VECS(serpent_xts_tv_template)
|
2011-10-18 14:33:17 +04:00
|
|
|
}
|
2011-10-18 14:33:33 +04:00
|
|
|
}, {
|
|
|
|
.alg = "xts(twofish)",
|
|
|
|
.test = alg_test_skcipher,
|
|
|
|
.suite = {
|
crypto: testmgr - eliminate redundant decryption test vectors
Currently testmgr has separate encryption and decryption test vectors
for symmetric ciphers. That's massively redundant, since with few
exceptions (mostly mistakes, apparently), all decryption tests are
identical to the encryption tests, just with the input/result flipped.
Therefore, eliminate the redundancy by removing the decryption test
vectors and updating testmgr to test both encryption and decryption
using what used to be the encryption test vectors. Naming is adjusted
accordingly: each cipher_testvec now has a 'ptext' (plaintext), 'ctext'
(ciphertext), and 'len' instead of an 'input', 'result', 'ilen', and
'rlen'. Note that it was always the case that 'ilen == rlen'.
AES keywrap ("kw(aes)") is special because its IV is generated by the
encryption. Previously this was handled by specifying 'iv_out' for
encryption and 'iv' for decryption. To make it work cleanly with only
one set of test vectors, put the IV in 'iv', remove 'iv_out', and add a
boolean that indicates that the IV is generated by the encryption.
In total, this removes over 10000 lines from testmgr.h, with no
reduction in test coverage since prior patches already copied the few
unique decryption test vectors into the encryption test vectors.
This covers all algorithms that used 'struct cipher_testvec', e.g. any
block cipher in the ECB, CBC, CTR, XTS, LRW, CTS-CBC, PCBC, OFB, or
keywrap modes, and Salsa20 and ChaCha20. No change is made to AEAD
tests, though we probably can eliminate a similar redundancy there too.
The testmgr.h portion of this patch was automatically generated using
the following awk script, with some slight manual fixups on top (updated
'struct cipher_testvec' definition, updated a few comments, and fixed up
the AES keywrap test vectors):
BEGIN { OTHER = 0; ENCVEC = 1; DECVEC = 2; DECVEC_TAIL = 3; mode = OTHER }
/^static const struct cipher_testvec.*_enc_/ { sub("_enc", ""); mode = ENCVEC }
/^static const struct cipher_testvec.*_dec_/ { mode = DECVEC }
mode == ENCVEC && !/\.ilen[[:space:]]*=/ {
sub(/\.input[[:space:]]*=$/, ".ptext =")
sub(/\.input[[:space:]]*=/, ".ptext\t=")
sub(/\.result[[:space:]]*=$/, ".ctext =")
sub(/\.result[[:space:]]*=/, ".ctext\t=")
sub(/\.rlen[[:space:]]*=/, ".len\t=")
print
}
mode == DECVEC_TAIL && /[^[:space:]]/ { mode = OTHER }
mode == OTHER { print }
mode == ENCVEC && /^};/ { mode = OTHER }
mode == DECVEC && /^};/ { mode = DECVEC_TAIL }
Note that git's default diff algorithm gets confused by the testmgr.h
portion of this patch, and reports too many lines added and removed.
It's better viewed with 'git diff --minimal' (or 'git show --minimal'),
which reports "2 files changed, 919 insertions(+), 11723 deletions(-)".
Signed-off-by: Eric Biggers <ebiggers@google.com>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
2018-05-21 08:50:29 +03:00
|
|
|
.cipher = __VECS(tf_xts_tv_template)
|
2011-10-18 14:33:33 +04:00
|
|
|
}
|
2018-05-11 11:04:06 +03:00
|
|
|
}, {
|
|
|
|
.alg = "xts4096(paes)",
|
|
|
|
.test = alg_test_null,
|
|
|
|
.fips_allowed = 1,
|
|
|
|
}, {
|
|
|
|
.alg = "xts512(paes)",
|
|
|
|
.test = alg_test_null,
|
|
|
|
.fips_allowed = 1,
|
2017-04-21 23:54:30 +03:00
|
|
|
}, {
|
|
|
|
.alg = "zlib-deflate",
|
|
|
|
.test = alg_test_comp,
|
|
|
|
.fips_allowed = 1,
|
|
|
|
.suite = {
|
|
|
|
.comp = {
|
|
|
|
.comp = __VECS(zlib_deflate_comp_tv_template),
|
|
|
|
.decomp = __VECS(zlib_deflate_decomp_tv_template)
|
|
|
|
}
|
|
|
|
}
|
2018-03-30 22:14:53 +03:00
|
|
|
}, {
|
|
|
|
.alg = "zstd",
|
|
|
|
.test = alg_test_comp,
|
|
|
|
.fips_allowed = 1,
|
|
|
|
.suite = {
|
|
|
|
.comp = {
|
|
|
|
.comp = __VECS(zstd_comp_tv_template),
|
|
|
|
.decomp = __VECS(zstd_decomp_tv_template)
|
|
|
|
}
|
|
|
|
}
|
2008-07-31 13:08:25 +04:00
|
|
|
}
|
|
|
|
};
|
|
|
|
|
2013-06-13 18:37:40 +04:00
|
|
|
static bool alg_test_descs_checked;
|
|
|
|
|
|
|
|
static void alg_test_descs_check_order(void)
|
|
|
|
{
|
|
|
|
int i;
|
|
|
|
|
|
|
|
/* only check once */
|
|
|
|
if (alg_test_descs_checked)
|
|
|
|
return;
|
|
|
|
|
|
|
|
alg_test_descs_checked = true;
|
|
|
|
|
|
|
|
for (i = 1; i < ARRAY_SIZE(alg_test_descs); i++) {
|
|
|
|
int diff = strcmp(alg_test_descs[i - 1].alg,
|
|
|
|
alg_test_descs[i].alg);
|
|
|
|
|
|
|
|
if (WARN_ON(diff > 0)) {
|
|
|
|
pr_warn("testmgr: alg_test_descs entries in wrong order: '%s' before '%s'\n",
|
|
|
|
alg_test_descs[i - 1].alg,
|
|
|
|
alg_test_descs[i].alg);
|
|
|
|
}
|
|
|
|
|
|
|
|
if (WARN_ON(diff == 0)) {
|
|
|
|
pr_warn("testmgr: duplicate alg_test_descs entry: '%s'\n",
|
|
|
|
alg_test_descs[i].alg);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2008-08-17 11:01:56 +04:00
|
|
|
static int alg_find_test(const char *alg)
|
2008-07-31 13:08:25 +04:00
|
|
|
{
|
|
|
|
int start = 0;
|
|
|
|
int end = ARRAY_SIZE(alg_test_descs);
|
|
|
|
|
|
|
|
while (start < end) {
|
|
|
|
int i = (start + end) / 2;
|
|
|
|
int diff = strcmp(alg_test_descs[i].alg, alg);
|
|
|
|
|
|
|
|
if (diff > 0) {
|
|
|
|
end = i;
|
|
|
|
continue;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (diff < 0) {
|
|
|
|
start = i + 1;
|
|
|
|
continue;
|
|
|
|
}
|
|
|
|
|
2008-08-17 11:01:56 +04:00
|
|
|
return i;
|
|
|
|
}
|
|
|
|
|
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
|
|
|
|
int alg_test(const char *driver, const char *alg, u32 type, u32 mask)
|
|
|
|
{
|
|
|
|
int i;
|
2009-07-02 12:32:12 +04:00
|
|
|
int j;
|
2008-10-12 16:36:51 +04:00
|
|
|
int rc;
|
2008-08-17 11:01:56 +04:00
|
|
|
|
2016-05-03 12:00:17 +03:00
|
|
|
if (!fips_enabled && notests) {
|
|
|
|
printk_once(KERN_INFO "alg: self-tests disabled\n");
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2013-06-13 18:37:40 +04:00
|
|
|
alg_test_descs_check_order();
|
|
|
|
|
2008-08-17 11:01:56 +04:00
|
|
|
if ((type & CRYPTO_ALG_TYPE_MASK) == CRYPTO_ALG_TYPE_CIPHER) {
|
|
|
|
char nalg[CRYPTO_MAX_ALG_NAME];
|
|
|
|
|
|
|
|
if (snprintf(nalg, sizeof(nalg), "ecb(%s)", alg) >=
|
|
|
|
sizeof(nalg))
|
|
|
|
return -ENAMETOOLONG;
|
|
|
|
|
|
|
|
i = alg_find_test(nalg);
|
|
|
|
if (i < 0)
|
|
|
|
goto notest;
|
|
|
|
|
2009-05-15 09:17:05 +04:00
|
|
|
if (fips_enabled && !alg_test_descs[i].fips_allowed)
|
|
|
|
goto non_fips_alg;
|
|
|
|
|
2009-05-04 15:49:23 +04:00
|
|
|
rc = alg_test_cipher(alg_test_descs + i, driver, type, mask);
|
|
|
|
goto test_done;
|
2008-07-31 13:08:25 +04:00
|
|
|
}
|
|
|
|
|
2008-08-17 11:01:56 +04:00
|
|
|
i = alg_find_test(alg);
|
2009-07-02 12:32:12 +04:00
|
|
|
j = alg_find_test(driver);
|
|
|
|
if (i < 0 && j < 0)
|
2008-08-17 11:01:56 +04:00
|
|
|
goto notest;
|
|
|
|
|
2009-07-02 12:32:12 +04:00
|
|
|
if (fips_enabled && ((i >= 0 && !alg_test_descs[i].fips_allowed) ||
|
|
|
|
(j >= 0 && !alg_test_descs[j].fips_allowed)))
|
2009-05-15 09:17:05 +04:00
|
|
|
goto non_fips_alg;
|
|
|
|
|
2009-07-02 12:32:12 +04:00
|
|
|
rc = 0;
|
|
|
|
if (i >= 0)
|
|
|
|
rc |= alg_test_descs[i].test(alg_test_descs + i, driver,
|
|
|
|
type, mask);
|
2013-07-18 19:57:07 +04:00
|
|
|
if (j >= 0 && j != i)
|
2009-07-02 12:32:12 +04:00
|
|
|
rc |= alg_test_descs[j].test(alg_test_descs + j, driver,
|
|
|
|
type, mask);
|
|
|
|
|
2009-05-04 15:49:23 +04:00
|
|
|
test_done:
|
2008-10-12 16:36:51 +04:00
|
|
|
if (fips_enabled && rc)
|
|
|
|
panic("%s: %s alg self test failed in fips mode!\n", driver, alg);
|
|
|
|
|
2009-05-04 15:51:17 +04:00
|
|
|
if (fips_enabled && !rc)
|
2014-10-06 19:37:54 +04:00
|
|
|
pr_info("alg: self-tests for %s (%s) passed\n", driver, alg);
|
2009-05-04 15:51:17 +04:00
|
|
|
|
2008-10-12 16:36:51 +04:00
|
|
|
return rc;
|
2008-08-17 11:01:56 +04:00
|
|
|
|
|
|
|
notest:
|
2008-07-31 13:08:25 +04:00
|
|
|
printk(KERN_INFO "alg: No test for %s (%s)\n", alg, driver);
|
|
|
|
return 0;
|
2009-05-15 09:17:05 +04:00
|
|
|
non_fips_alg:
|
|
|
|
return -EINVAL;
|
2008-07-31 13:08:25 +04:00
|
|
|
}
|
2010-06-03 14:53:43 +04:00
|
|
|
|
2010-08-06 05:40:28 +04:00
|
|
|
#endif /* CONFIG_CRYPTO_MANAGER_DISABLE_TESTS */
|
2010-06-03 14:53:43 +04:00
|
|
|
|
2008-07-31 13:08:25 +04:00
|
|
|
EXPORT_SYMBOL_GPL(alg_test);
|