git://ftp.safe.ca
/
safe
/
jmp
/
linux-2.6
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Merge commit 'v2.6.32-rc8' into HEAD
[safe/jmp/linux-2.6]
/
crypto
/
testmgr.c
diff --git
a/crypto/testmgr.c
b/crypto/testmgr.c
index
f93b26d
..
6d5b746
100644
(file)
--- a/
crypto/testmgr.c
+++ b/
crypto/testmgr.c
@@
-180,7
+180,12
@@
static int test_hash(struct crypto_ahash *tfm, struct hash_testvec *template,
ahash_request_set_callback(req, CRYPTO_TFM_REQ_MAY_BACKLOG,
tcrypt_complete, &tresult);
ahash_request_set_callback(req, CRYPTO_TFM_REQ_MAY_BACKLOG,
tcrypt_complete, &tresult);
+ j = 0;
for (i = 0; i < tcount; i++) {
for (i = 0; i < tcount; i++) {
+ if (template[i].np)
+ continue;
+
+ j++;
memset(result, 0, 64);
hash_buff = xbuf[0];
memset(result, 0, 64);
hash_buff = xbuf[0];
@@
-194,7
+199,7
@@
static int test_hash(struct crypto_ahash *tfm, struct hash_testvec *template,
template[i].ksize);
if (ret) {
printk(KERN_ERR "alg: hash: setkey failed on "
template[i].ksize);
if (ret) {
printk(KERN_ERR "alg: hash: setkey failed on "
- "test %d for %s: ret=%d\n",
i + 1
, algo,
+ "test %d for %s: ret=%d\n",
j
, algo,
-ret);
goto out;
}
-ret);
goto out;
}
@@
-216,14
+221,14
@@
static int test_hash(struct crypto_ahash *tfm, struct hash_testvec *template,
/* fall through */
default:
printk(KERN_ERR "alg: hash: digest failed on test %d "
/* fall through */
default:
printk(KERN_ERR "alg: hash: digest failed on test %d "
- "for %s: ret=%d\n",
i + 1
, algo, -ret);
+ "for %s: ret=%d\n",
j
, algo, -ret);
goto out;
}
if (memcmp(result, template[i].digest,
crypto_ahash_digestsize(tfm))) {
printk(KERN_ERR "alg: hash: Test %d failed for %s\n",
goto out;
}
if (memcmp(result, template[i].digest,
crypto_ahash_digestsize(tfm))) {
printk(KERN_ERR "alg: hash: Test %d failed for %s\n",
-
i + 1
, algo);
+
j
, algo);
hexdump(result, crypto_ahash_digestsize(tfm));
ret = -EINVAL;
goto out;
hexdump(result, crypto_ahash_digestsize(tfm));
ret = -EINVAL;
goto out;
@@
-238,7
+243,11
@@
static int test_hash(struct crypto_ahash *tfm, struct hash_testvec *template,
temp = 0;
sg_init_table(sg, template[i].np);
temp = 0;
sg_init_table(sg, template[i].np);
+ ret = -EINVAL;
for (k = 0; k < template[i].np; k++) {
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]),
sg_set_buf(&sg[k],
memcpy(xbuf[IDX[k] >> PAGE_SHIFT] +
offset_in_page(IDX[k]),
@@
-357,6
+366,11
@@
static int test_aead(struct crypto_aead *tfm, int enc,
input = xbuf[0];
assoc = axbuf[0];
input = xbuf[0];
assoc = axbuf[0];
+ ret = -EINVAL;
+ if (WARN_ON(template[i].ilen > PAGE_SIZE ||
+ template[i].alen > PAGE_SIZE))
+ goto out;
+
memcpy(input, template[i].input, template[i].ilen);
memcpy(assoc, template[i].assoc, template[i].alen);
if (template[i].iv)
memcpy(input, template[i].input, template[i].ilen);
memcpy(assoc, template[i].assoc, template[i].alen);
if (template[i].iv)
@@
-516,7
+530,11
@@
static int test_aead(struct crypto_aead *tfm, int enc,
}
sg_init_table(asg, template[i].anp);
}
sg_init_table(asg, template[i].anp);
+ ret = -EINVAL;
for (k = 0, temp = 0; k < template[i].anp; k++) {
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(&asg[k],
memcpy(axbuf[IDX[k] >> PAGE_SHIFT] +
offset_in_page(IDX[k]),
sg_set_buf(&asg[k],
memcpy(axbuf[IDX[k] >> PAGE_SHIFT] +
offset_in_page(IDX[k]),
@@
-650,6
+668,10
@@
static int test_cipher(struct crypto_cipher *tfm, int enc,
j++;
j++;
+ ret = -EINVAL;
+ if (WARN_ON(template[i].ilen > PAGE_SIZE))
+ goto out;
+
data = xbuf[0];
memcpy(data, template[i].input, template[i].ilen);
data = xbuf[0];
memcpy(data, template[i].input, template[i].ilen);
@@
-741,6
+763,10
@@
static int test_skcipher(struct crypto_ablkcipher *tfm, int enc,
if (!(template[i].np)) {
j++;
if (!(template[i].np)) {
j++;
+ ret = -EINVAL;
+ if (WARN_ON(template[i].ilen > PAGE_SIZE))
+ goto out;
+
data = xbuf[0];
memcpy(data, template[i].input, template[i].ilen);
data = xbuf[0];
memcpy(data, template[i].input, template[i].ilen);
@@
-1002,24
+1028,25
@@
static int test_pcomp(struct crypto_pcomp *tfm,
const char *algo = crypto_tfm_alg_driver_name(crypto_pcomp_tfm(tfm));
unsigned int i;
char result[COMP_BUF_SIZE];
const char *algo = crypto_tfm_alg_driver_name(crypto_pcomp_tfm(tfm));
unsigned int i;
char result[COMP_BUF_SIZE];
- int
error
;
+ int
res
;
for (i = 0; i < ctcount; i++) {
struct comp_request req;
for (i = 0; i < ctcount; i++) {
struct comp_request req;
+ unsigned int produced = 0;
-
error
= crypto_compress_setup(tfm, ctemplate[i].params,
-
ctemplate[i].paramsize);
- if (
error
) {
+
res
= crypto_compress_setup(tfm, ctemplate[i].params,
+ ctemplate[i].paramsize);
+ if (
res
) {
pr_err("alg: pcomp: compression setup failed on test "
pr_err("alg: pcomp: compression setup failed on test "
- "%d for %s: error=%d\n", i + 1, algo,
error
);
- return
error
;
+ "%d for %s: error=%d\n", i + 1, algo,
res
);
+ return
res
;
}
}
-
error
= crypto_compress_init(tfm);
- if (
error
) {
+
res
= crypto_compress_init(tfm);
+ if (
res
) {
pr_err("alg: pcomp: compression init failed on test "
pr_err("alg: pcomp: compression init failed on test "
- "%d for %s: error=%d\n", i + 1, algo,
error
);
- return
error
;
+ "%d for %s: error=%d\n", i + 1, algo,
res
);
+ return
res
;
}
memset(result, 0, sizeof(result));
}
memset(result, 0, sizeof(result));
@@
-1029,32
+1056,37
@@
static int test_pcomp(struct crypto_pcomp *tfm,
req.next_out = result;
req.avail_out = ctemplate[i].outlen / 2;
req.next_out = result;
req.avail_out = ctemplate[i].outlen / 2;
-
error
= crypto_compress_update(tfm, &req);
- if (
error && (error
!= -EAGAIN || req.avail_in)) {
+
res
= crypto_compress_update(tfm, &req);
+ if (
res < 0 && (res
!= -EAGAIN || req.avail_in)) {
pr_err("alg: pcomp: compression update failed on test "
pr_err("alg: pcomp: compression update failed on test "
- "%d for %s: error=%d\n", i + 1, algo,
error
);
- return
error
;
+ "%d for %s: error=%d\n", i + 1, algo,
res
);
+ return
res
;
}
}
+ if (res > 0)
+ produced += res;
/* Add remaining input data */
req.avail_in += (ctemplate[i].inlen + 1) / 2;
/* Add remaining input data */
req.avail_in += (ctemplate[i].inlen + 1) / 2;
-
error
= crypto_compress_update(tfm, &req);
- if (
error && (error
!= -EAGAIN || req.avail_in)) {
+
res
= crypto_compress_update(tfm, &req);
+ if (
res < 0 && (res
!= -EAGAIN || req.avail_in)) {
pr_err("alg: pcomp: compression update failed on test "
pr_err("alg: pcomp: compression update failed on test "
- "%d for %s: error=%d\n", i + 1, algo,
error
);
- return
error
;
+ "%d for %s: error=%d\n", i + 1, algo,
res
);
+ return
res
;
}
}
+ if (res > 0)
+ produced += res;
/* Provide remaining output space */
req.avail_out += COMP_BUF_SIZE - ctemplate[i].outlen / 2;
/* Provide remaining output space */
req.avail_out += COMP_BUF_SIZE - ctemplate[i].outlen / 2;
-
error
= crypto_compress_final(tfm, &req);
- if (
error
) {
+
res
= crypto_compress_final(tfm, &req);
+ if (
res < 0
) {
pr_err("alg: pcomp: compression final failed on test "
pr_err("alg: pcomp: compression final failed on test "
- "%d for %s: error=%d\n", i + 1, algo,
error
);
- return
error
;
+ "%d for %s: error=%d\n", i + 1, algo,
res
);
+ return
res
;
}
}
+ produced += res;
if (COMP_BUF_SIZE - req.avail_out != ctemplate[i].outlen) {
pr_err("alg: comp: Compression test %d failed for %s: "
if (COMP_BUF_SIZE - req.avail_out != ctemplate[i].outlen) {
pr_err("alg: comp: Compression test %d failed for %s: "
@@
-1064,6
+1096,13
@@
static int test_pcomp(struct crypto_pcomp *tfm,
return -EINVAL;
}
return -EINVAL;
}
+ if (produced != ctemplate[i].outlen) {
+ pr_err("alg: comp: Compression test %d failed for %s: "
+ "returned len = %u (expected %d)\n", i + 1,
+ algo, produced, ctemplate[i].outlen);
+ return -EINVAL;
+ }
+
if (memcmp(result, ctemplate[i].output, ctemplate[i].outlen)) {
pr_err("alg: pcomp: Compression test %d failed for "
"%s\n", i + 1, algo);
if (memcmp(result, ctemplate[i].output, ctemplate[i].outlen)) {
pr_err("alg: pcomp: Compression test %d failed for "
"%s\n", i + 1, algo);
@@
-1074,21
+1113,21
@@
static int test_pcomp(struct crypto_pcomp *tfm,
for (i = 0; i < dtcount; i++) {
struct comp_request req;
for (i = 0; i < dtcount; i++) {
struct comp_request req;
+ unsigned int produced = 0;
-
error
= crypto_decompress_setup(tfm, dtemplate[i].params,
-
dtemplate[i].paramsize);
- if (
error
) {
+
res
= crypto_decompress_setup(tfm, dtemplate[i].params,
+ dtemplate[i].paramsize);
+ if (
res
) {
pr_err("alg: pcomp: decompression setup failed on "
pr_err("alg: pcomp: decompression setup failed on "
- "test %d for %s: error=%d\n", i + 1, algo,
- error);
- return error;
+ "test %d for %s: error=%d\n", i + 1, algo, res);
+ return res;
}
}
-
error
= crypto_decompress_init(tfm);
- if (
error
) {
+
res
= crypto_decompress_init(tfm);
+ if (
res
) {
pr_err("alg: pcomp: decompression init failed on test "
pr_err("alg: pcomp: decompression init failed on test "
- "%d for %s: error=%d\n", i + 1, algo,
error
);
- return
error
;
+ "%d for %s: error=%d\n", i + 1, algo,
res
);
+ return
res
;
}
memset(result, 0, sizeof(result));
}
memset(result, 0, sizeof(result));
@@
-1098,35
+1137,38
@@
static int test_pcomp(struct crypto_pcomp *tfm,
req.next_out = result;
req.avail_out = dtemplate[i].outlen / 2;
req.next_out = result;
req.avail_out = dtemplate[i].outlen / 2;
-
error
= crypto_decompress_update(tfm, &req);
- if (
error && (error
!= -EAGAIN || req.avail_in)) {
+
res
= crypto_decompress_update(tfm, &req);
+ if (
res < 0 && (res
!= -EAGAIN || req.avail_in)) {
pr_err("alg: pcomp: decompression update failed on "
pr_err("alg: pcomp: decompression update failed on "
- "test %d for %s: error=%d\n", i + 1, algo,
- error);
- return error;
+ "test %d for %s: error=%d\n", i + 1, algo, res);
+ return res;
}
}
+ if (res > 0)
+ produced += res;
/* Add remaining input data */
req.avail_in += (dtemplate[i].inlen + 1) / 2;
/* Add remaining input data */
req.avail_in += (dtemplate[i].inlen + 1) / 2;
-
error
= crypto_decompress_update(tfm, &req);
- if (
error && (error
!= -EAGAIN || req.avail_in)) {
+
res
= crypto_decompress_update(tfm, &req);
+ if (
res < 0 && (res
!= -EAGAIN || req.avail_in)) {
pr_err("alg: pcomp: decompression update failed on "
pr_err("alg: pcomp: decompression update failed on "
- "test %d for %s: error=%d\n", i + 1, algo,
- error);
- return error;
+ "test %d for %s: error=%d\n", i + 1, algo, res);
+ return res;
}
}
+ if (res > 0)
+ produced += res;
/* Provide remaining output space */
req.avail_out += COMP_BUF_SIZE - dtemplate[i].outlen / 2;
/* Provide remaining output space */
req.avail_out += COMP_BUF_SIZE - dtemplate[i].outlen / 2;
-
error
= crypto_decompress_final(tfm, &req);
- if (
error && (error
!= -EAGAIN || req.avail_in)) {
+
res
= crypto_decompress_final(tfm, &req);
+ if (
res < 0 && (res
!= -EAGAIN || req.avail_in)) {
pr_err("alg: pcomp: decompression final failed on "
pr_err("alg: pcomp: decompression final failed on "
- "test %d for %s: error=%d\n", i + 1, algo,
- error);
- return error;
+ "test %d for %s: error=%d\n", i + 1, algo, res);
+ return res;
}
}
+ if (res > 0)
+ produced += res;
if (COMP_BUF_SIZE - req.avail_out != dtemplate[i].outlen) {
pr_err("alg: comp: Decompression test %d failed for "
if (COMP_BUF_SIZE - req.avail_out != dtemplate[i].outlen) {
pr_err("alg: comp: Decompression test %d failed for "
@@
-1136,6
+1178,13
@@
static int test_pcomp(struct crypto_pcomp *tfm,
return -EINVAL;
}
return -EINVAL;
}
+ if (produced != dtemplate[i].outlen) {
+ pr_err("alg: comp: Decompression test %d failed for "
+ "%s: returned len = %u (expected %d)\n", i + 1,
+ algo, produced, dtemplate[i].outlen);
+ return -EINVAL;
+ }
+
if (memcmp(result, dtemplate[i].output, dtemplate[i].outlen)) {
pr_err("alg: pcomp: Decompression test %d failed for "
"%s\n", i + 1, algo);
if (memcmp(result, dtemplate[i].output, dtemplate[i].outlen)) {
pr_err("alg: pcomp: Decompression test %d failed for "
"%s\n", i + 1, algo);
@@
-2199,6
+2248,15
@@
static const struct alg_test_desc alg_test_descs[] = {
}
}
}, {
}
}
}, {
+ .alg = "vmac(aes)",
+ .test = alg_test_hash,
+ .suite = {
+ .hash = {
+ .vecs = aes_vmac128_tv_template,
+ .count = VMAC_AES_TEST_VECTORS
+ }
+ }
+ }, {
.alg = "wp256",
.test = alg_test_hash,
.suite = {
.alg = "wp256",
.test = alg_test_hash,
.suite = {
@@
-2295,6
+2353,7
@@
static int alg_find_test(const char *alg)
int alg_test(const char *driver, const char *alg, u32 type, u32 mask)
{
int i;
int alg_test(const char *driver, const char *alg, u32 type, u32 mask)
{
int i;
+ int j;
int rc;
if ((type & CRYPTO_ALG_TYPE_MASK) == CRYPTO_ALG_TYPE_CIPHER) {
int rc;
if ((type & CRYPTO_ALG_TYPE_MASK) == CRYPTO_ALG_TYPE_CIPHER) {
@@
-2316,14
+2375,22
@@
int alg_test(const char *driver, const char *alg, u32 type, u32 mask)
}
i = alg_find_test(alg);
}
i = alg_find_test(alg);
- if (i < 0)
+ j = alg_find_test(driver);
+ if (i < 0 && j < 0)
goto notest;
goto notest;
- if (fips_enabled && !alg_test_descs[i].fips_allowed)
+ if (fips_enabled && ((i >= 0 && !alg_test_descs[i].fips_allowed) ||
+ (j >= 0 && !alg_test_descs[j].fips_allowed)))
goto non_fips_alg;
goto non_fips_alg;
- rc = alg_test_descs[i].test(alg_test_descs + i, driver,
- type, mask);
+ rc = 0;
+ if (i >= 0)
+ rc |= alg_test_descs[i].test(alg_test_descs + i, driver,
+ type, mask);
+ if (j >= 0)
+ rc |= alg_test_descs[j].test(alg_test_descs + j, driver,
+ type, mask);
+
test_done:
if (fips_enabled && rc)
panic("%s: %s alg self test failed in fips mode!\n", driver, alg);
test_done:
if (fips_enabled && rc)
panic("%s: %s alg self test failed in fips mode!\n", driver, alg);