-static void hexdump(unsigned char *buf, unsigned int len)
-{
- print_hex_dump(KERN_CONT, "", DUMP_PREFIX_OFFSET,
- 16, 1,
- buf, len, false);
-}
-
-static void tcrypt_complete(struct crypto_async_request *req, int err)
-{
- struct tcrypt_result *res = req->data;
-
- if (err == -EINPROGRESS)
- return;
-
- res->err = err;
- complete(&res->completion);
-}
-
-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;
- int ret;
- void *hash_buff;
-
- printk("\ntesting %s\n", algo);
-
- 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);
-
- hash_buff = kzalloc(template[i].psize, GFP_KERNEL);
- if (!hash_buff)
- continue;
-
- memcpy(hash_buff, template[i].plaintext, template[i].psize);
- sg_init_one(&sg[0], hash_buff, template[i].psize);
-
- if (template[i].ksize) {
- ret = crypto_hash_setkey(tfm, template[i].key,
- template[i].ksize);
- if (ret) {
- printk("setkey() failed ret=%d\n", ret);
- kfree(hash_buff);
- goto out;
- }
- }
-
- ret = crypto_hash_digest(&desc, sg, template[i].psize, result);
- if (ret) {
- printk("digest () failed ret=%d\n", ret);
- kfree(hash_buff);
- goto out;
- }
-
- hexdump(result, crypto_hash_digestsize(tfm));
- printk("%s\n",
- memcmp(result, template[i].digest,
- crypto_hash_digestsize(tfm)) ?
- "fail" : "pass");
- kfree(hash_buff);
- }
-
- 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 (template[i].np) {
- j++;
- printk("test %u:\n", j);
- memset(result, 0, 64);
-
- temp = 0;
- sg_init_table(sg, template[i].np);
- for (k = 0; k < template[i].np; k++) {
- memcpy(&xbuf[IDX[k]],
- template[i].plaintext + temp,
- template[i].tap[k]);
- temp += template[i].tap[k];
- sg_set_buf(&sg[k], &xbuf[IDX[k]],
- template[i].tap[k]);
- }
-
- if (template[i].ksize) {
- ret = crypto_hash_setkey(tfm, template[i].key,
- template[i].ksize);
-
- if (ret) {
- printk("setkey() failed ret=%d\n", ret);
- goto out;
- }
- }
-
- ret = crypto_hash_digest(&desc, sg, template[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, template[i].digest,
- crypto_hash_digestsize(tfm)) ?
- "fail" : "pass");
- }
- }
-
-out:
- crypto_free_hash(tfm);
-}
-
-static void test_aead(char *algo, int enc, struct aead_testvec *template,
- unsigned int tcount)
-{
- unsigned int ret, i, j, k, temp;
- char *q;
- struct crypto_aead *tfm;
- char *key;
- struct aead_request *req;
- struct scatterlist sg[8];
- struct scatterlist asg[8];
- const char *e;
- struct tcrypt_result result;
- unsigned int authsize;
- void *input;
- void *assoc;
- char iv[MAX_IVLEN];
-
- if (enc == ENCRYPT)
- e = "encryption";
- else
- e = "decryption";
-
- printk(KERN_INFO "\ntesting %s %s\n", algo, e);
-
- init_completion(&result.completion);
-
- tfm = crypto_alloc_aead(algo, 0, 0);
-
- if (IS_ERR(tfm)) {
- printk(KERN_INFO "failed to load transform for %s: %ld\n",
- algo, PTR_ERR(tfm));
- return;
- }
-
- req = aead_request_alloc(tfm, GFP_KERNEL);
- if (!req) {
- printk(KERN_INFO "failed to allocate request for %s\n", algo);
- goto out;
- }
-
- aead_request_set_callback(req, CRYPTO_TFM_REQ_MAY_BACKLOG,
- tcrypt_complete, &result);
-
- for (i = 0, j = 0; i < tcount; i++) {
- if (!template[i].np) {
- printk(KERN_INFO "test %u (%d bit key):\n",
- ++j, template[i].klen * 8);
-
- /* some tepmplates have no input data but they will
- * touch input
- */
- input = kzalloc(template[i].ilen + template[i].rlen, GFP_KERNEL);
- if (!input)
- continue;
-
- assoc = kzalloc(template[i].alen, GFP_KERNEL);
- if (!assoc) {
- kfree(input);
- continue;
- }
-
- memcpy(input, template[i].input, template[i].ilen);
- memcpy(assoc, template[i].assoc, template[i].alen);
- if (template[i].iv)
- memcpy(iv, template[i].iv, MAX_IVLEN);
- 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].key)
- key = template[i].key;
- else
- key = kzalloc(template[i].klen, GFP_KERNEL);
-
- ret = crypto_aead_setkey(tfm, key,
- template[i].klen);
- if (ret) {
- printk(KERN_INFO "setkey() failed flags=%x\n",
- crypto_aead_get_flags(tfm));
-
- if (!template[i].fail)
- goto next_one;
- }
-
- authsize = abs(template[i].rlen - template[i].ilen);
- ret = crypto_aead_setauthsize(tfm, authsize);
- if (ret) {
- printk(KERN_INFO
- "failed to set authsize = %u\n",
- authsize);
- goto next_one;
- }
-
- sg_init_one(&sg[0], input,
- template[i].ilen + (enc ? authsize : 0));
-
- sg_init_one(&asg[0], assoc, template[i].alen);
-
- aead_request_set_crypt(req, sg, sg,
- template[i].ilen, iv);
-
- aead_request_set_assoc(req, asg, template[i].alen);
-
- ret = enc ?
- crypto_aead_encrypt(req) :
- crypto_aead_decrypt(req);
-
- switch (ret) {
- case 0:
- break;
- case -EINPROGRESS:
- case -EBUSY:
- ret = wait_for_completion_interruptible(
- &result.completion);
- if (!ret && !(ret = result.err)) {
- INIT_COMPLETION(result.completion);
- break;
- }
- /* fall through */
- default:
- printk(KERN_INFO "%s () failed err=%d\n",
- e, -ret);
- goto next_one;
- }
-
- q = kmap(sg_page(&sg[0])) + sg[0].offset;
- hexdump(q, template[i].rlen);
-
- printk(KERN_INFO "enc/dec: %s\n",
- memcmp(q, template[i].result,
- template[i].rlen) ? "fail" : "pass");
- kunmap(sg_page(&sg[0]));
-next_one:
- if (!template[i].key)
- kfree(key);
- kfree(assoc);
- kfree(input);
- }
- }
-
- 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++) {
- if (template[i].np) {
- printk(KERN_INFO "test %u (%d bit key):\n",
- ++j, template[i].klen * 8);
-
- if (template[i].iv)
- memcpy(iv, template[i].iv, MAX_IVLEN);
- 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);
- key = template[i].key;
-
- ret = crypto_aead_setkey(tfm, key, template[i].klen);
- if (ret) {
- printk(KERN_INFO "setkey() failed flags=%x\n",
- crypto_aead_get_flags(tfm));
-
- if (!template[i].fail)
- goto out;
- }
-
- sg_init_table(sg, template[i].np);
- for (k = 0, temp = 0; k < template[i].np; k++) {
- memcpy(&xbuf[IDX[k]],
- template[i].input + temp,
- template[i].tap[k]);
- temp += template[i].tap[k];
- sg_set_buf(&sg[k], &xbuf[IDX[k]],
- template[i].tap[k]);
- }
-
- authsize = abs(template[i].rlen - template[i].ilen);
- ret = crypto_aead_setauthsize(tfm, authsize);
- if (ret) {
- printk(KERN_INFO
- "failed to set authsize = %u\n",
- authsize);
- goto out;
- }
-
- if (enc)
- sg[k - 1].length += authsize;
-
- sg_init_table(asg, template[i].anp);
- for (k = 0, temp = 0; k < template[i].anp; k++) {
- memcpy(&axbuf[IDX[k]],
- template[i].assoc + temp,
- template[i].atap[k]);
- temp += template[i].atap[k];
- sg_set_buf(&asg[k], &axbuf[IDX[k]],
- template[i].atap[k]);
- }
-
- aead_request_set_crypt(req, sg, sg,
- template[i].ilen,
- iv);
-
- aead_request_set_assoc(req, asg, template[i].alen);
-
- ret = enc ?
- crypto_aead_encrypt(req) :
- crypto_aead_decrypt(req);
-
- switch (ret) {
- case 0:
- break;
- case -EINPROGRESS:
- case -EBUSY:
- ret = wait_for_completion_interruptible(
- &result.completion);
- if (!ret && !(ret = result.err)) {
- INIT_COMPLETION(result.completion);
- break;
- }
- /* fall through */
- default:
- printk(KERN_INFO "%s () failed err=%d\n",
- e, -ret);
- goto out;
- }
-
- for (k = 0, temp = 0; k < template[i].np; k++) {
- printk(KERN_INFO "page %u\n", k);
- q = kmap(sg_page(&sg[k])) + sg[k].offset;
- hexdump(q, template[i].tap[k]);
- printk(KERN_INFO "%s\n",
- memcmp(q, template[i].result + temp,
- template[i].tap[k] -
- (k < template[i].np - 1 || enc ?
- 0 : authsize)) ?
- "fail" : "pass");
-
- temp += template[i].tap[k];
- kunmap(sg_page(&sg[k]));
- }
- }
- }
-
-out:
- crypto_free_aead(tfm);
- aead_request_free(req);
-}
-
-static void test_cipher(char *algo, int enc,
- struct cipher_testvec *template, unsigned int tcount)
-{
- unsigned int ret, i, j, k, temp;
- char *q;
- struct crypto_ablkcipher *tfm;
- struct ablkcipher_request *req;
- struct scatterlist sg[8];
- const char *e;
- struct tcrypt_result result;
- void *data;
- char iv[MAX_IVLEN];
-
- if (enc == ENCRYPT)
- e = "encryption";
- else
- e = "decryption";
-
- printk("\ntesting %s %s\n", algo, e);
-
- init_completion(&result.completion);
- tfm = crypto_alloc_ablkcipher(algo, 0, 0);
-
- if (IS_ERR(tfm)) {
- printk("failed to load transform for %s: %ld\n", algo,
- PTR_ERR(tfm));
- return;
- }
-
- req = ablkcipher_request_alloc(tfm, GFP_KERNEL);
- if (!req) {
- printk("failed to allocate request for %s\n", algo);
- goto out;
- }
-
- ablkcipher_request_set_callback(req, CRYPTO_TFM_REQ_MAY_BACKLOG,
- tcrypt_complete, &result);
-
- j = 0;
- for (i = 0; i < tcount; i++) {
-
- data = kzalloc(template[i].ilen, GFP_KERNEL);
- if (!data)
- continue;
-
- memcpy(data, template[i].input, template[i].ilen);
- if (template[i].iv)
- memcpy(iv, template[i].iv, MAX_IVLEN);
- else
- memset(iv, 0, MAX_IVLEN);
-
- if (!(template[i].np)) {
- j++;
- printk("test %u (%d bit key):\n",
- j, template[i].klen * 8);
-
- crypto_ablkcipher_clear_flags(tfm, ~0);
- if (template[i].wk)
- crypto_ablkcipher_set_flags(
- tfm, CRYPTO_TFM_REQ_WEAK_KEY);
-
- ret = crypto_ablkcipher_setkey(tfm, template[i].key,
- template[i].klen);
- if (ret) {
- printk("setkey() failed flags=%x\n",
- crypto_ablkcipher_get_flags(tfm));
-
- if (!template[i].fail) {
- kfree(data);
- goto out;
- }
- }
-
- sg_init_one(&sg[0], data, template[i].ilen);
-
- ablkcipher_request_set_crypt(req, sg, sg,
- template[i].ilen, iv);
- ret = enc ?
- crypto_ablkcipher_encrypt(req) :
- crypto_ablkcipher_decrypt(req);
-
- switch (ret) {
- case 0:
- break;
- case -EINPROGRESS:
- case -EBUSY:
- ret = wait_for_completion_interruptible(
- &result.completion);
- if (!ret && !((ret = result.err))) {
- INIT_COMPLETION(result.completion);
- break;
- }
- /* fall through */
- default:
- printk("%s () failed err=%d\n", e, -ret);
- kfree(data);
- goto out;
- }
-
- q = kmap(sg_page(&sg[0])) + sg[0].offset;
- hexdump(q, template[i].rlen);
-
- printk("%s\n",
- memcmp(q, template[i].result,
- template[i].rlen) ? "fail" : "pass");
- kunmap(sg_page(&sg[0]));
- }
- kfree(data);
- }
-
- printk("\ntesting %s %s across pages (chunking)\n", algo, e);
- memset(xbuf, 0, XBUFSIZE);
-
- j = 0;
- for (i = 0; i < tcount; i++) {
-
- data = kzalloc(template[i].ilen, GFP_KERNEL);
- if (!data)
- continue;
-
- memcpy(data, template[i].input, template[i].ilen);
-
- if (template[i].iv)
- memcpy(iv, template[i].iv, MAX_IVLEN);
- else
- memset(iv, 0, MAX_IVLEN);
-
- if (template[i].np) {
- j++;
- printk("test %u (%d bit key):\n",
- j, template[i].klen * 8);
-
- crypto_ablkcipher_clear_flags(tfm, ~0);
- if (template[i].wk)
- crypto_ablkcipher_set_flags(
- tfm, CRYPTO_TFM_REQ_WEAK_KEY);
-
- ret = crypto_ablkcipher_setkey(tfm, template[i].key,
- template[i].klen);
- if (ret) {
- printk("setkey() failed flags=%x\n",
- crypto_ablkcipher_get_flags(tfm));
-
- if (!template[i].fail) {
- kfree(data);
- goto out;
- }
- }
-
- temp = 0;
- sg_init_table(sg, template[i].np);
- for (k = 0; k < template[i].np; k++) {
- memcpy(&xbuf[IDX[k]],
- template[i].input + temp,
- template[i].tap[k]);
- temp += template[i].tap[k];
- sg_set_buf(&sg[k], &xbuf[IDX[k]],
- template[i].tap[k]);
- }
-
- ablkcipher_request_set_crypt(req, sg, sg,
- template[i].ilen, iv);
-
- ret = enc ?
- crypto_ablkcipher_encrypt(req) :
- crypto_ablkcipher_decrypt(req);
-
- switch (ret) {
- case 0:
- break;
- case -EINPROGRESS:
- case -EBUSY:
- ret = wait_for_completion_interruptible(
- &result.completion);
- if (!ret && !((ret = result.err))) {
- INIT_COMPLETION(result.completion);
- break;
- }
- /* fall through */
- default:
- printk("%s () failed err=%d\n", e, -ret);
- goto out;
- }
-
- temp = 0;
- for (k = 0; k < template[i].np; k++) {
- printk("page %u\n", k);
- q = kmap(sg_page(&sg[k])) + sg[k].offset;
- hexdump(q, template[i].tap[k]);
- printk("%s\n",
- memcmp(q, template[i].result + temp,
- template[i].tap[k]) ? "fail" :
- "pass");
- temp += template[i].tap[k];
- kunmap(sg_page(&sg[k]));
- }
- }
- }
-out:
- crypto_free_ablkcipher(tfm);
- ablkcipher_request_free(req);
-}
-
-static int test_cipher_jiffies(struct blkcipher_desc *desc, int enc, char *p,
- int blen, int sec)