|
@@ -198,13 +198,20 @@ static int __test_hash(struct crypto_ahash *tfm, struct hash_testvec *template,
|
|
|
const char *algo = crypto_tfm_alg_driver_name(crypto_ahash_tfm(tfm));
|
|
|
unsigned int i, j, k, temp;
|
|
|
struct scatterlist sg[8];
|
|
|
- char result[64];
|
|
|
+ char *result;
|
|
|
+ char *key;
|
|
|
struct ahash_request *req;
|
|
|
struct tcrypt_result tresult;
|
|
|
void *hash_buff;
|
|
|
char *xbuf[XBUFSIZE];
|
|
|
int ret = -ENOMEM;
|
|
|
|
|
|
+ result = kmalloc(MAX_DIGEST_SIZE, GFP_KERNEL);
|
|
|
+ if (!result)
|
|
|
+ return ret;
|
|
|
+ key = kmalloc(MAX_KEYLEN, GFP_KERNEL);
|
|
|
+ if (!key)
|
|
|
+ goto out_nobuf;
|
|
|
if (testmgr_alloc_buf(xbuf))
|
|
|
goto out_nobuf;
|
|
|
|
|
@@ -229,7 +236,7 @@ static int __test_hash(struct crypto_ahash *tfm, struct hash_testvec *template,
|
|
|
goto out;
|
|
|
|
|
|
j++;
|
|
|
- memset(result, 0, 64);
|
|
|
+ memset(result, 0, MAX_DIGEST_SIZE);
|
|
|
|
|
|
hash_buff = xbuf[0];
|
|
|
hash_buff += align_offset;
|
|
@@ -239,8 +246,14 @@ static int __test_hash(struct crypto_ahash *tfm, struct hash_testvec *template,
|
|
|
|
|
|
if (template[i].ksize) {
|
|
|
crypto_ahash_clear_flags(tfm, ~0);
|
|
|
- ret = crypto_ahash_setkey(tfm, template[i].key,
|
|
|
- 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;
|
|
|
+ goto out;
|
|
|
+ }
|
|
|
+ memcpy(key, template[i].key, template[i].ksize);
|
|
|
+ ret = crypto_ahash_setkey(tfm, key, template[i].ksize);
|
|
|
if (ret) {
|
|
|
printk(KERN_ERR "alg: hash: setkey failed on "
|
|
|
"test %d for %s: ret=%d\n", j, algo,
|
|
@@ -300,7 +313,7 @@ static int __test_hash(struct crypto_ahash *tfm, struct hash_testvec *template,
|
|
|
|
|
|
if (template[i].np) {
|
|
|
j++;
|
|
|
- memset(result, 0, 64);
|
|
|
+ memset(result, 0, MAX_DIGEST_SIZE);
|
|
|
|
|
|
temp = 0;
|
|
|
sg_init_table(sg, template[i].np);
|
|
@@ -319,8 +332,16 @@ static int __test_hash(struct crypto_ahash *tfm, struct hash_testvec *template,
|
|
|
}
|
|
|
|
|
|
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;
|
|
|
+ goto out;
|
|
|
+ }
|
|
|
crypto_ahash_clear_flags(tfm, ~0);
|
|
|
- ret = crypto_ahash_setkey(tfm, template[i].key,
|
|
|
+ memcpy(key, template[i].key, template[i].ksize);
|
|
|
+ ret = crypto_ahash_setkey(tfm, key,
|
|
|
template[i].ksize);
|
|
|
|
|
|
if (ret) {
|
|
@@ -372,6 +393,8 @@ out:
|
|
|
out_noreq:
|
|
|
testmgr_free_buf(xbuf);
|
|
|
out_nobuf:
|
|
|
+ kfree(key);
|
|
|
+ kfree(result);
|
|
|
return ret;
|
|
|
}
|
|
|
|
|
@@ -429,6 +452,9 @@ static int __test_aead(struct crypto_aead *tfm, int enc,
|
|
|
iv = kzalloc(MAX_IVLEN, GFP_KERNEL);
|
|
|
if (!iv)
|
|
|
return ret;
|
|
|
+ key = kmalloc(MAX_KEYLEN, GFP_KERNEL);
|
|
|
+ if (!key)
|
|
|
+ goto out_noxbuf;
|
|
|
if (testmgr_alloc_buf(xbuf))
|
|
|
goto out_noxbuf;
|
|
|
if (testmgr_alloc_buf(axbuf))
|
|
@@ -493,7 +519,14 @@ static int __test_aead(struct crypto_aead *tfm, int enc,
|
|
|
crypto_aead_set_flags(
|
|
|
tfm, CRYPTO_TFM_REQ_WEAK_KEY);
|
|
|
|
|
|
- key = template[i].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);
|
|
|
|
|
|
ret = crypto_aead_setkey(tfm, key,
|
|
|
template[i].klen);
|
|
@@ -594,7 +627,14 @@ static int __test_aead(struct crypto_aead *tfm, int enc,
|
|
|
if (template[i].wk)
|
|
|
crypto_aead_set_flags(
|
|
|
tfm, CRYPTO_TFM_REQ_WEAK_KEY);
|
|
|
- key = template[i].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);
|
|
|
|
|
|
ret = crypto_aead_setkey(tfm, key, template[i].klen);
|
|
|
if (!ret == template[i].fail) {
|
|
@@ -776,6 +816,7 @@ out_nooutbuf:
|
|
|
out_noaxbuf:
|
|
|
testmgr_free_buf(xbuf);
|
|
|
out_noxbuf:
|
|
|
+ kfree(key);
|
|
|
kfree(iv);
|
|
|
return ret;
|
|
|
}
|