-static void hexdump(unsigned char *buf, unsigned int len)
-{
- while (len--)
- printk("%02x", *buf++);
-
- printk("\n");
-}
-
-static void test_hash(char *algo, struct hash_testvec *template,
- unsigned int tcount)
-{
- unsigned int i, j, k, temp;
- struct scatterlist sg[8];
- char result[64];
- struct crypto_hash *tfm;
- struct hash_desc desc;
- struct hash_testvec *hash_tv;
- unsigned int tsize;
- int ret;
-
- printk("\ntesting %s\n", algo);
-
- tsize = sizeof(struct hash_testvec);
- tsize *= tcount;
-
- if (tsize > TVMEMSIZE) {
- printk("template (%u) too big for tvmem (%u)\n", tsize, TVMEMSIZE);
- return;
- }
-
- memcpy(tvmem, template, tsize);
- hash_tv = (void *)tvmem;
-
- tfm = crypto_alloc_hash(algo, 0, CRYPTO_ALG_ASYNC);
- if (IS_ERR(tfm)) {
- printk("failed to load transform for %s: %ld\n", algo,
- PTR_ERR(tfm));
- return;
- }
-
- desc.tfm = tfm;
- desc.flags = 0;
-
- for (i = 0; i < tcount; i++) {
- printk("test %u:\n", i + 1);
- memset(result, 0, 64);
-
- sg_set_buf(&sg[0], hash_tv[i].plaintext, hash_tv[i].psize);
-
- if (hash_tv[i].ksize) {
- ret = crypto_hash_setkey(tfm, hash_tv[i].key,
- hash_tv[i].ksize);
- if (ret) {
- printk("setkey() failed ret=%d\n", ret);
- goto out;
- }
- }
-
- ret = crypto_hash_digest(&desc, sg, hash_tv[i].psize, result);
- if (ret) {
- printk("digest () failed ret=%d\n", ret);
- goto out;
- }
-
- hexdump(result, crypto_hash_digestsize(tfm));
- printk("%s\n",
- memcmp(result, hash_tv[i].digest,
- crypto_hash_digestsize(tfm)) ?
- "fail" : "pass");
- }
-
- printk("testing %s across pages\n", algo);
-
- /* setup the dummy buffer first */
- memset(xbuf, 0, XBUFSIZE);
-
- j = 0;
- for (i = 0; i < tcount; i++) {
- if (hash_tv[i].np) {
- j++;
- printk("test %u:\n", j);
- memset(result, 0, 64);
-
- temp = 0;
- for (k = 0; k < hash_tv[i].np; k++) {
- memcpy(&xbuf[IDX[k]],
- hash_tv[i].plaintext + temp,
- hash_tv[i].tap[k]);
- temp += hash_tv[i].tap[k];
- sg_set_buf(&sg[k], &xbuf[IDX[k]],
- hash_tv[i].tap[k]);
- }
-
- if (hash_tv[i].ksize) {
- ret = crypto_hash_setkey(tfm, hash_tv[i].key,
- hash_tv[i].ksize);
-
- if (ret) {
- printk("setkey() failed ret=%d\n", ret);
- goto out;
- }
- }
-
- ret = crypto_hash_digest(&desc, sg, hash_tv[i].psize,
- result);
- if (ret) {
- printk("digest () failed ret=%d\n", ret);
- goto out;
- }
-
- hexdump(result, crypto_hash_digestsize(tfm));
- printk("%s\n",
- memcmp(result, hash_tv[i].digest,
- crypto_hash_digestsize(tfm)) ?
- "fail" : "pass");
- }
- }
-
-out:
- crypto_free_hash(tfm);
-}
-
-static void test_cipher(char *algo, int enc,
- struct cipher_testvec *template, unsigned int tcount)
-{
- unsigned int ret, i, j, k, temp;
- unsigned int tsize;
- unsigned int iv_len;
- unsigned int len;
- char *q;
- struct crypto_blkcipher *tfm;
- char *key;
- struct cipher_testvec *cipher_tv;
- struct blkcipher_desc desc;
- struct scatterlist sg[8];
- const char *e;
-
- if (enc == ENCRYPT)
- e = "encryption";
- else
- e = "decryption";
-
- printk("\ntesting %s %s\n", algo, e);
-
- tsize = sizeof (struct cipher_testvec);
- tsize *= tcount;
-
- if (tsize > TVMEMSIZE) {
- printk("template (%u) too big for tvmem (%u)\n", tsize,
- TVMEMSIZE);
- return;
- }
-
- memcpy(tvmem, template, tsize);
- cipher_tv = (void *)tvmem;
-
- tfm = crypto_alloc_blkcipher(algo, 0, CRYPTO_ALG_ASYNC);
-
- if (IS_ERR(tfm)) {
- printk("failed to load transform for %s: %ld\n", algo,
- PTR_ERR(tfm));
- return;
- }
- desc.tfm = tfm;
- desc.flags = 0;
-
- j = 0;
- for (i = 0; i < tcount; i++) {
- if (!(cipher_tv[i].np)) {
- j++;
- printk("test %u (%d bit key):\n",
- j, cipher_tv[i].klen * 8);
-
- crypto_blkcipher_clear_flags(tfm, ~0);
- if (cipher_tv[i].wk)
- crypto_blkcipher_set_flags(
- tfm, CRYPTO_TFM_REQ_WEAK_KEY);
- key = cipher_tv[i].key;
-
- ret = crypto_blkcipher_setkey(tfm, key,
- cipher_tv[i].klen);
- if (ret) {
- printk("setkey() failed flags=%x\n",
- crypto_blkcipher_get_flags(tfm));
-
- if (!cipher_tv[i].fail)
- goto out;
- }
-
- sg_set_buf(&sg[0], cipher_tv[i].input,
- cipher_tv[i].ilen);
-
- iv_len = crypto_blkcipher_ivsize(tfm);
- if (iv_len)
- crypto_blkcipher_set_iv(tfm, cipher_tv[i].iv,
- iv_len);
-
- len = cipher_tv[i].ilen;
- ret = enc ?
- crypto_blkcipher_encrypt(&desc, sg, sg, len) :
- crypto_blkcipher_decrypt(&desc, sg, sg, len);
-
- if (ret) {
- printk("%s () failed flags=%x\n", e,
- desc.flags);
- goto out;
- }
-
- q = kmap(sg[0].page) + sg[0].offset;
- hexdump(q, cipher_tv[i].rlen);
-
- printk("%s\n",
- memcmp(q, cipher_tv[i].result,
- cipher_tv[i].rlen) ? "fail" : "pass");
- }
- }
-
- printk("\ntesting %s %s across pages (chunking)\n", algo, e);
- memset(xbuf, 0, XBUFSIZE);
-
- j = 0;
- for (i = 0; i < tcount; i++) {
- if (cipher_tv[i].np) {
- j++;
- printk("test %u (%d bit key):\n",
- j, cipher_tv[i].klen * 8);
-
- crypto_blkcipher_clear_flags(tfm, ~0);
- if (cipher_tv[i].wk)
- crypto_blkcipher_set_flags(
- tfm, CRYPTO_TFM_REQ_WEAK_KEY);
- key = cipher_tv[i].key;
-
- ret = crypto_blkcipher_setkey(tfm, key,
- cipher_tv[i].klen);
- if (ret) {
- printk("setkey() failed flags=%x\n",
- crypto_blkcipher_get_flags(tfm));
-
- if (!cipher_tv[i].fail)
- goto out;
- }
-
- temp = 0;
- for (k = 0; k < cipher_tv[i].np; k++) {
- memcpy(&xbuf[IDX[k]],
- cipher_tv[i].input + temp,
- cipher_tv[i].tap[k]);
- temp += cipher_tv[i].tap[k];
- sg_set_buf(&sg[k], &xbuf[IDX[k]],
- cipher_tv[i].tap[k]);
- }
-
- iv_len = crypto_blkcipher_ivsize(tfm);
- if (iv_len)
- crypto_blkcipher_set_iv(tfm, cipher_tv[i].iv,
- iv_len);
-
- len = cipher_tv[i].ilen;
- ret = enc ?
- crypto_blkcipher_encrypt(&desc, sg, sg, len) :
- crypto_blkcipher_decrypt(&desc, sg, sg, len);
-
- if (ret) {
- printk("%s () failed flags=%x\n", e,
- desc.flags);
- goto out;
- }
-
- temp = 0;
- for (k = 0; k < cipher_tv[i].np; k++) {
- printk("page %u\n", k);
- q = kmap(sg[k].page) + sg[k].offset;
- hexdump(q, cipher_tv[i].tap[k]);
- printk("%s\n",
- memcmp(q, cipher_tv[i].result + temp,
- cipher_tv[i].tap[k]) ? "fail" :
- "pass");
- temp += cipher_tv[i].tap[k];
- }
- }
- }
-
-out:
- crypto_free_blkcipher(tfm);
-}
-
-static int test_cipher_jiffies(struct blkcipher_desc *desc, int enc, char *p,
- int blen, int sec)