Skip to content

Commit

Permalink
[CRYPTO] tcrypt: Catch cipher destination memory corruption
Browse files Browse the repository at this point in the history
    
Check whether the destination buffer is written to beyond the last
byte contained in the scatterlist.
    
Also change IDX1 of the cross-page access offsets to a multiple of 4.
This triggers a corruption in the HIFN driver and doesn't seem to
negatively impact other testcases.
    
Signed-off-by: Patrick McHardy <[email protected]>
Signed-off-by: Herbert Xu <[email protected]>
  • Loading branch information
kaber authored and herbertx committed Jul 10, 2008
1 parent 692af5d commit a558f1d
Showing 1 changed file with 21 additions and 5 deletions.
26 changes: 21 additions & 5 deletions crypto/tcrypt.c
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,7 @@
/*
* Indexes into the xbuf to simulate cross-page access.
*/
#define IDX1 37
#define IDX1 32
#define IDX2 32400
#define IDX3 1
#define IDX4 8193
Expand Down Expand Up @@ -211,7 +211,7 @@ static void test_hash(char *algo, struct hash_testvec *template,
static void test_aead(char *algo, int enc, struct aead_testvec *template,
unsigned int tcount)
{
unsigned int ret, i, j, k, temp;
unsigned int ret, i, j, k, n, temp;
char *q;
struct crypto_aead *tfm;
char *key;
Expand Down Expand Up @@ -353,7 +353,6 @@ static void test_aead(char *algo, int enc, struct aead_testvec *template,
}

printk(KERN_INFO "\ntesting %s %s across pages (chunking)\n", algo, e);
memset(xbuf, 0, XBUFSIZE);
memset(axbuf, 0, XBUFSIZE);

for (i = 0, j = 0; i < tcount; i++) {
Expand Down Expand Up @@ -381,6 +380,7 @@ static void test_aead(char *algo, int enc, struct aead_testvec *template,
goto out;
}

memset(xbuf, 0, XBUFSIZE);
sg_init_table(sg, template[i].np);
for (k = 0, temp = 0; k < template[i].np; k++) {
memcpy(&xbuf[IDX[k]],
Expand Down Expand Up @@ -452,6 +452,14 @@ static void test_aead(char *algo, int enc, struct aead_testvec *template,
0 : authsize)) ?
"fail" : "pass");

for (n = 0; q[template[i].tap[k] + n]; n++)
;
if (n) {
printk("Result buffer corruption %u "
"bytes:\n", n);
hexdump(&q[template[i].tap[k]], n);
}

temp += template[i].tap[k];
kunmap(sg_page(&sg[k]));
}
Expand All @@ -466,7 +474,7 @@ static void test_aead(char *algo, int enc, struct aead_testvec *template,
static void test_cipher(char *algo, int enc,
struct cipher_testvec *template, unsigned int tcount)
{
unsigned int ret, i, j, k, temp;
unsigned int ret, i, j, k, n, temp;
char *q;
struct crypto_ablkcipher *tfm;
struct ablkcipher_request *req;
Expand Down Expand Up @@ -574,7 +582,6 @@ static void test_cipher(char *algo, int enc,
}

printk("\ntesting %s %s across pages (chunking)\n", algo, e);
memset(xbuf, 0, XBUFSIZE);

j = 0;
for (i = 0; i < tcount; i++) {
Expand All @@ -589,6 +596,7 @@ static void test_cipher(char *algo, int enc,
printk("test %u (%d bit key):\n",
j, template[i].klen * 8);

memset(xbuf, 0, XBUFSIZE);
crypto_ablkcipher_clear_flags(tfm, ~0);
if (template[i].wk)
crypto_ablkcipher_set_flags(
Expand Down Expand Up @@ -648,6 +656,14 @@ static void test_cipher(char *algo, int enc,
memcmp(q, template[i].result + temp,
template[i].tap[k]) ? "fail" :
"pass");

for (n = 0; q[template[i].tap[k] + n]; n++)
;
if (n) {
printk("Result buffer corruption %u "
"bytes:\n", n);
hexdump(&q[template[i].tap[k]], n);
}
temp += template[i].tap[k];
kunmap(sg_page(&sg[k]));
}
Expand Down

0 comments on commit a558f1d

Please sign in to comment.