2 * Algorithm testing framework and tests.
4 * Copyright (c) 2002 James Morris <jmorris@intercode.com.au>
5 * Copyright (c) 2002 Jean-Francois Dive <jef@linuxbe.org>
6 * Copyright (c) 2007 Nokia Siemens Networks
7 * Copyright (c) 2008 Herbert Xu <herbert@gondor.apana.org.au>
9 * Updated RFC4106 AES-GCM testing.
10 * Authors: Aidan O'Mahony (aidan.o.mahony@intel.com)
11 * Adrian Hoban <adrian.hoban@intel.com>
12 * Gabriele Paoloni <gabriele.paoloni@intel.com>
13 * Tadeusz Struk (tadeusz.struk@intel.com)
14 * Copyright (c) 2010, Intel Corporation.
16 * This program is free software; you can redistribute it and/or modify it
17 * under the terms of the GNU General Public License as published by the Free
18 * Software Foundation; either version 2 of the License, or (at your option)
23 #include <crypto/aead.h>
24 #include <crypto/hash.h>
25 #include <crypto/skcipher.h>
26 #include <linux/err.h>
27 #include <linux/fips.h>
28 #include <linux/module.h>
29 #include <linux/scatterlist.h>
30 #include <linux/slab.h>
31 #include <linux/string.h>
32 #include <crypto/rng.h>
33 #include <crypto/drbg.h>
34 #include <crypto/akcipher.h>
35 #include <crypto/kpp.h>
36 #include <crypto/acompress.h>
41 module_param(notests
, bool, 0644);
42 MODULE_PARM_DESC(notests
, "disable crypto self-tests");
44 #ifdef CONFIG_CRYPTO_MANAGER_DISABLE_TESTS
47 int alg_test(const char *driver
, const char *alg
, u32 type
, u32 mask
)
57 * Need slab memory for testing (size in number of pages).
62 * Indexes into the xbuf to simulate cross-page access.
74 * Used by test_cipher()
79 struct aead_test_suite
{
81 const struct aead_testvec
*vecs
;
86 struct cipher_test_suite
{
88 const struct cipher_testvec
*vecs
;
93 struct comp_test_suite
{
95 const struct comp_testvec
*vecs
;
100 struct hash_test_suite
{
101 const struct hash_testvec
*vecs
;
105 struct cprng_test_suite
{
106 const struct cprng_testvec
*vecs
;
110 struct drbg_test_suite
{
111 const struct drbg_testvec
*vecs
;
115 struct akcipher_test_suite
{
116 const struct akcipher_testvec
*vecs
;
120 struct kpp_test_suite
{
121 const struct kpp_testvec
*vecs
;
125 struct alg_test_desc
{
127 int (*test
)(const struct alg_test_desc
*desc
, const char *driver
,
129 int fips_allowed
; /* set if alg is allowed in fips mode */
132 struct aead_test_suite aead
;
133 struct cipher_test_suite cipher
;
134 struct comp_test_suite comp
;
135 struct hash_test_suite hash
;
136 struct cprng_test_suite cprng
;
137 struct drbg_test_suite drbg
;
138 struct akcipher_test_suite akcipher
;
139 struct kpp_test_suite kpp
;
143 static const unsigned int IDX
[8] = {
144 IDX1
, IDX2
, IDX3
, IDX4
, IDX5
, IDX6
, IDX7
, IDX8
};
146 static void hexdump(unsigned char *buf
, unsigned int len
)
148 print_hex_dump(KERN_CONT
, "", DUMP_PREFIX_OFFSET
,
153 static int testmgr_alloc_buf(char *buf
[XBUFSIZE
])
157 for (i
= 0; i
< XBUFSIZE
; i
++) {
158 buf
[i
] = (void *)__get_free_page(GFP_KERNEL
);
167 free_page((unsigned long)buf
[i
]);
172 static void testmgr_free_buf(char *buf
[XBUFSIZE
])
176 for (i
= 0; i
< XBUFSIZE
; i
++)
177 free_page((unsigned long)buf
[i
]);
180 static int ahash_guard_result(char *result
, char c
, int size
)
184 for (i
= 0; i
< size
; i
++) {
192 static int ahash_partial_update(struct ahash_request
**preq
,
193 struct crypto_ahash
*tfm
, const struct hash_testvec
*template,
194 void *hash_buff
, int k
, int temp
, struct scatterlist
*sg
,
195 const char *algo
, char *result
, struct crypto_wait
*wait
)
198 struct ahash_request
*req
;
199 int statesize
, ret
= -EINVAL
;
200 static const unsigned char guard
[] = { 0x00, 0xba, 0xad, 0x00 };
201 int digestsize
= crypto_ahash_digestsize(tfm
);
204 statesize
= crypto_ahash_statesize(
205 crypto_ahash_reqtfm(req
));
206 state
= kmalloc(statesize
+ sizeof(guard
), GFP_KERNEL
);
208 pr_err("alg: hash: Failed to alloc state for %s\n", algo
);
211 memcpy(state
+ statesize
, guard
, sizeof(guard
));
212 memset(result
, 1, digestsize
);
213 ret
= crypto_ahash_export(req
, state
);
214 WARN_ON(memcmp(state
+ statesize
, guard
, sizeof(guard
)));
216 pr_err("alg: hash: Failed to export() for %s\n", algo
);
219 ret
= ahash_guard_result(result
, 1, digestsize
);
221 pr_err("alg: hash: Failed, export used req->result for %s\n",
225 ahash_request_free(req
);
226 req
= ahash_request_alloc(tfm
, GFP_KERNEL
);
228 pr_err("alg: hash: Failed to alloc request for %s\n", algo
);
231 ahash_request_set_callback(req
,
232 CRYPTO_TFM_REQ_MAY_BACKLOG
,
233 crypto_req_done
, wait
);
235 memcpy(hash_buff
, template->plaintext
+ temp
,
237 sg_init_one(&sg
[0], hash_buff
, template->tap
[k
]);
238 ahash_request_set_crypt(req
, sg
, result
, template->tap
[k
]);
239 ret
= crypto_ahash_import(req
, state
);
241 pr_err("alg: hash: Failed to import() for %s\n", algo
);
244 ret
= ahash_guard_result(result
, 1, digestsize
);
246 pr_err("alg: hash: Failed, import used req->result for %s\n",
250 ret
= crypto_wait_req(crypto_ahash_update(req
), wait
);
257 ahash_request_free(req
);
264 static int __test_hash(struct crypto_ahash
*tfm
,
265 const struct hash_testvec
*template, unsigned int tcount
,
266 bool use_digest
, const int align_offset
)
268 const char *algo
= crypto_tfm_alg_driver_name(crypto_ahash_tfm(tfm
));
269 size_t digest_size
= crypto_ahash_digestsize(tfm
);
270 unsigned int i
, j
, k
, temp
;
271 struct scatterlist sg
[8];
274 struct ahash_request
*req
;
275 struct crypto_wait wait
;
277 char *xbuf
[XBUFSIZE
];
280 result
= kmalloc(digest_size
, GFP_KERNEL
);
283 key
= kmalloc(MAX_KEYLEN
, GFP_KERNEL
);
286 if (testmgr_alloc_buf(xbuf
))
289 crypto_init_wait(&wait
);
291 req
= ahash_request_alloc(tfm
, GFP_KERNEL
);
293 printk(KERN_ERR
"alg: hash: Failed to allocate request for "
297 ahash_request_set_callback(req
, CRYPTO_TFM_REQ_MAY_BACKLOG
,
298 crypto_req_done
, &wait
);
301 for (i
= 0; i
< tcount
; i
++) {
306 if (WARN_ON(align_offset
+ template[i
].psize
> PAGE_SIZE
))
310 memset(result
, 0, digest_size
);
313 hash_buff
+= align_offset
;
315 memcpy(hash_buff
, template[i
].plaintext
, template[i
].psize
);
316 sg_init_one(&sg
[0], hash_buff
, template[i
].psize
);
318 if (template[i
].ksize
) {
319 crypto_ahash_clear_flags(tfm
, ~0);
320 if (template[i
].ksize
> MAX_KEYLEN
) {
321 pr_err("alg: hash: setkey failed on test %d for %s: key size %d > %d\n",
322 j
, algo
, template[i
].ksize
, MAX_KEYLEN
);
326 memcpy(key
, template[i
].key
, template[i
].ksize
);
327 ret
= crypto_ahash_setkey(tfm
, key
, template[i
].ksize
);
329 printk(KERN_ERR
"alg: hash: setkey failed on "
330 "test %d for %s: ret=%d\n", j
, algo
,
336 ahash_request_set_crypt(req
, sg
, result
, template[i
].psize
);
338 ret
= crypto_wait_req(crypto_ahash_digest(req
), &wait
);
340 pr_err("alg: hash: digest failed on test %d "
341 "for %s: ret=%d\n", j
, algo
, -ret
);
345 memset(result
, 1, digest_size
);
346 ret
= crypto_wait_req(crypto_ahash_init(req
), &wait
);
348 pr_err("alg: hash: init failed on test %d "
349 "for %s: ret=%d\n", j
, algo
, -ret
);
352 ret
= ahash_guard_result(result
, 1, digest_size
);
354 pr_err("alg: hash: init failed on test %d "
355 "for %s: used req->result\n", j
, algo
);
358 ret
= crypto_wait_req(crypto_ahash_update(req
), &wait
);
360 pr_err("alg: hash: update failed on test %d "
361 "for %s: ret=%d\n", j
, algo
, -ret
);
364 ret
= ahash_guard_result(result
, 1, digest_size
);
366 pr_err("alg: hash: update failed on test %d "
367 "for %s: used req->result\n", j
, algo
);
370 ret
= crypto_wait_req(crypto_ahash_final(req
), &wait
);
372 pr_err("alg: hash: final failed on test %d "
373 "for %s: ret=%d\n", j
, algo
, -ret
);
378 if (memcmp(result
, template[i
].digest
,
379 crypto_ahash_digestsize(tfm
))) {
380 printk(KERN_ERR
"alg: hash: Test %d failed for %s\n",
382 hexdump(result
, crypto_ahash_digestsize(tfm
));
389 for (i
= 0; i
< tcount
; i
++) {
390 /* alignment tests are only done with continuous buffers */
391 if (align_offset
!= 0)
398 memset(result
, 0, digest_size
);
401 sg_init_table(sg
, template[i
].np
);
403 for (k
= 0; k
< template[i
].np
; k
++) {
404 if (WARN_ON(offset_in_page(IDX
[k
]) +
405 template[i
].tap
[k
] > PAGE_SIZE
))
408 memcpy(xbuf
[IDX
[k
] >> PAGE_SHIFT
] +
409 offset_in_page(IDX
[k
]),
410 template[i
].plaintext
+ temp
,
413 temp
+= template[i
].tap
[k
];
416 if (template[i
].ksize
) {
417 if (template[i
].ksize
> MAX_KEYLEN
) {
418 pr_err("alg: hash: setkey failed on test %d for %s: key size %d > %d\n",
419 j
, algo
, template[i
].ksize
, MAX_KEYLEN
);
423 crypto_ahash_clear_flags(tfm
, ~0);
424 memcpy(key
, template[i
].key
, template[i
].ksize
);
425 ret
= crypto_ahash_setkey(tfm
, key
, template[i
].ksize
);
428 printk(KERN_ERR
"alg: hash: setkey "
429 "failed on chunking test %d "
430 "for %s: ret=%d\n", j
, algo
, -ret
);
435 ahash_request_set_crypt(req
, sg
, result
, template[i
].psize
);
436 ret
= crypto_wait_req(crypto_ahash_digest(req
), &wait
);
438 pr_err("alg: hash: digest failed on chunking test %d for %s: ret=%d\n",
443 if (memcmp(result
, template[i
].digest
,
444 crypto_ahash_digestsize(tfm
))) {
445 printk(KERN_ERR
"alg: hash: Chunking test %d "
446 "failed for %s\n", j
, algo
);
447 hexdump(result
, crypto_ahash_digestsize(tfm
));
453 /* partial update exercise */
455 for (i
= 0; i
< tcount
; i
++) {
456 /* alignment tests are only done with continuous buffers */
457 if (align_offset
!= 0)
460 if (template[i
].np
< 2)
464 memset(result
, 0, digest_size
);
468 memcpy(hash_buff
, template[i
].plaintext
,
470 sg_init_one(&sg
[0], hash_buff
, template[i
].tap
[0]);
472 if (template[i
].ksize
) {
473 crypto_ahash_clear_flags(tfm
, ~0);
474 if (template[i
].ksize
> MAX_KEYLEN
) {
475 pr_err("alg: hash: setkey failed on test %d for %s: key size %d > %d\n",
476 j
, algo
, template[i
].ksize
, MAX_KEYLEN
);
480 memcpy(key
, template[i
].key
, template[i
].ksize
);
481 ret
= crypto_ahash_setkey(tfm
, key
, template[i
].ksize
);
483 pr_err("alg: hash: setkey failed on test %d for %s: ret=%d\n",
489 ahash_request_set_crypt(req
, sg
, result
, template[i
].tap
[0]);
490 ret
= crypto_wait_req(crypto_ahash_init(req
), &wait
);
492 pr_err("alg: hash: init failed on test %d for %s: ret=%d\n",
496 ret
= crypto_wait_req(crypto_ahash_update(req
), &wait
);
498 pr_err("alg: hash: update failed on test %d for %s: ret=%d\n",
503 temp
= template[i
].tap
[0];
504 for (k
= 1; k
< template[i
].np
; k
++) {
505 ret
= ahash_partial_update(&req
, tfm
, &template[i
],
506 hash_buff
, k
, temp
, &sg
[0], algo
, result
,
509 pr_err("alg: hash: partial update failed on test %d for %s: ret=%d\n",
513 temp
+= template[i
].tap
[k
];
515 ret
= crypto_wait_req(crypto_ahash_final(req
), &wait
);
517 pr_err("alg: hash: final failed on test %d for %s: ret=%d\n",
521 if (memcmp(result
, template[i
].digest
,
522 crypto_ahash_digestsize(tfm
))) {
523 pr_err("alg: hash: Partial Test %d failed for %s\n",
525 hexdump(result
, crypto_ahash_digestsize(tfm
));
534 ahash_request_free(req
);
536 testmgr_free_buf(xbuf
);
543 static int test_hash(struct crypto_ahash
*tfm
,
544 const struct hash_testvec
*template,
545 unsigned int tcount
, bool use_digest
)
547 unsigned int alignmask
;
550 ret
= __test_hash(tfm
, template, tcount
, use_digest
, 0);
554 /* test unaligned buffers, check with one byte offset */
555 ret
= __test_hash(tfm
, template, tcount
, use_digest
, 1);
559 alignmask
= crypto_tfm_alg_alignmask(&tfm
->base
);
561 /* Check if alignment mask for tfm is correctly set. */
562 ret
= __test_hash(tfm
, template, tcount
, use_digest
,
571 static int __test_aead(struct crypto_aead
*tfm
, int enc
,
572 const struct aead_testvec
*template, unsigned int tcount
,
573 const bool diff_dst
, const int align_offset
)
575 const char *algo
= crypto_tfm_alg_driver_name(crypto_aead_tfm(tfm
));
576 unsigned int i
, j
, k
, n
, temp
;
580 struct aead_request
*req
;
581 struct scatterlist
*sg
;
582 struct scatterlist
*sgout
;
584 struct crypto_wait wait
;
585 unsigned int authsize
, iv_len
;
590 char *xbuf
[XBUFSIZE
];
591 char *xoutbuf
[XBUFSIZE
];
592 char *axbuf
[XBUFSIZE
];
594 iv
= kzalloc(MAX_IVLEN
, GFP_KERNEL
);
597 key
= kmalloc(MAX_KEYLEN
, GFP_KERNEL
);
600 if (testmgr_alloc_buf(xbuf
))
602 if (testmgr_alloc_buf(axbuf
))
604 if (diff_dst
&& testmgr_alloc_buf(xoutbuf
))
607 /* avoid "the frame size is larger than 1024 bytes" compiler warning */
608 sg
= kmalloc(sizeof(*sg
) * 8 * (diff_dst
? 4 : 2), GFP_KERNEL
);
623 crypto_init_wait(&wait
);
625 req
= aead_request_alloc(tfm
, GFP_KERNEL
);
627 pr_err("alg: aead%s: Failed to allocate request for %s\n",
632 aead_request_set_callback(req
, CRYPTO_TFM_REQ_MAY_BACKLOG
,
633 crypto_req_done
, &wait
);
635 iv_len
= crypto_aead_ivsize(tfm
);
637 for (i
= 0, j
= 0; i
< tcount
; i
++) {
643 /* some templates have no input data but they will
647 input
+= align_offset
;
651 if (WARN_ON(align_offset
+ template[i
].ilen
>
652 PAGE_SIZE
|| template[i
].alen
> PAGE_SIZE
))
655 memcpy(input
, template[i
].input
, template[i
].ilen
);
656 memcpy(assoc
, template[i
].assoc
, template[i
].alen
);
658 memcpy(iv
, template[i
].iv
, iv_len
);
660 memset(iv
, 0, iv_len
);
662 crypto_aead_clear_flags(tfm
, ~0);
664 crypto_aead_set_flags(tfm
, CRYPTO_TFM_REQ_WEAK_KEY
);
666 if (template[i
].klen
> MAX_KEYLEN
) {
667 pr_err("alg: aead%s: setkey failed on test %d for %s: key size %d > %d\n",
668 d
, j
, algo
, template[i
].klen
,
673 memcpy(key
, template[i
].key
, template[i
].klen
);
675 ret
= crypto_aead_setkey(tfm
, key
, template[i
].klen
);
676 if (template[i
].fail
== !ret
) {
677 pr_err("alg: aead%s: setkey failed on test %d for %s: flags=%x\n",
678 d
, j
, algo
, crypto_aead_get_flags(tfm
));
683 authsize
= abs(template[i
].rlen
- template[i
].ilen
);
684 ret
= crypto_aead_setauthsize(tfm
, authsize
);
686 pr_err("alg: aead%s: Failed to set authsize to %u on test %d for %s\n",
687 d
, authsize
, j
, algo
);
691 k
= !!template[i
].alen
;
692 sg_init_table(sg
, k
+ 1);
693 sg_set_buf(&sg
[0], assoc
, template[i
].alen
);
694 sg_set_buf(&sg
[k
], input
,
695 template[i
].ilen
+ (enc
? authsize
: 0));
699 sg_init_table(sgout
, k
+ 1);
700 sg_set_buf(&sgout
[0], assoc
, template[i
].alen
);
703 output
+= align_offset
;
704 sg_set_buf(&sgout
[k
], output
,
705 template[i
].rlen
+ (enc
? 0 : authsize
));
708 aead_request_set_crypt(req
, sg
, (diff_dst
) ? sgout
: sg
,
709 template[i
].ilen
, iv
);
711 aead_request_set_ad(req
, template[i
].alen
);
713 ret
= crypto_wait_req(enc
? crypto_aead_encrypt(req
)
714 : crypto_aead_decrypt(req
), &wait
);
718 if (template[i
].novrfy
) {
719 /* verification was supposed to fail */
720 pr_err("alg: aead%s: %s failed on test %d for %s: ret was 0, expected -EBADMSG\n",
722 /* so really, we got a bad message */
728 if (template[i
].novrfy
)
729 /* verification failure was expected */
733 pr_err("alg: aead%s: %s failed on test %d for %s: ret=%d\n",
734 d
, e
, j
, algo
, -ret
);
739 if (memcmp(q
, template[i
].result
, template[i
].rlen
)) {
740 pr_err("alg: aead%s: Test %d failed on %s for %s\n",
742 hexdump(q
, template[i
].rlen
);
748 for (i
= 0, j
= 0; i
< tcount
; i
++) {
749 /* alignment tests are only done with continuous buffers */
750 if (align_offset
!= 0)
759 memcpy(iv
, template[i
].iv
, iv_len
);
761 memset(iv
, 0, MAX_IVLEN
);
763 crypto_aead_clear_flags(tfm
, ~0);
765 crypto_aead_set_flags(tfm
, CRYPTO_TFM_REQ_WEAK_KEY
);
766 if (template[i
].klen
> MAX_KEYLEN
) {
767 pr_err("alg: aead%s: setkey failed on test %d for %s: key size %d > %d\n",
768 d
, j
, algo
, template[i
].klen
, MAX_KEYLEN
);
772 memcpy(key
, template[i
].key
, template[i
].klen
);
774 ret
= crypto_aead_setkey(tfm
, key
, template[i
].klen
);
775 if (template[i
].fail
== !ret
) {
776 pr_err("alg: aead%s: setkey failed on chunk test %d for %s: flags=%x\n",
777 d
, j
, algo
, crypto_aead_get_flags(tfm
));
782 authsize
= abs(template[i
].rlen
- template[i
].ilen
);
785 sg_init_table(sg
, template[i
].anp
+ template[i
].np
);
787 sg_init_table(sgout
, template[i
].anp
+ template[i
].np
);
790 for (k
= 0, temp
= 0; k
< template[i
].anp
; k
++) {
791 if (WARN_ON(offset_in_page(IDX
[k
]) +
792 template[i
].atap
[k
] > PAGE_SIZE
))
795 memcpy(axbuf
[IDX
[k
] >> PAGE_SHIFT
] +
796 offset_in_page(IDX
[k
]),
797 template[i
].assoc
+ temp
,
798 template[i
].atap
[k
]),
799 template[i
].atap
[k
]);
801 sg_set_buf(&sgout
[k
],
802 axbuf
[IDX
[k
] >> PAGE_SHIFT
] +
803 offset_in_page(IDX
[k
]),
804 template[i
].atap
[k
]);
805 temp
+= template[i
].atap
[k
];
808 for (k
= 0, temp
= 0; k
< template[i
].np
; k
++) {
809 if (WARN_ON(offset_in_page(IDX
[k
]) +
810 template[i
].tap
[k
] > PAGE_SIZE
))
813 q
= xbuf
[IDX
[k
] >> PAGE_SHIFT
] + offset_in_page(IDX
[k
]);
814 memcpy(q
, template[i
].input
+ temp
, template[i
].tap
[k
]);
815 sg_set_buf(&sg
[template[i
].anp
+ k
],
816 q
, template[i
].tap
[k
]);
819 q
= xoutbuf
[IDX
[k
] >> PAGE_SHIFT
] +
820 offset_in_page(IDX
[k
]);
822 memset(q
, 0, template[i
].tap
[k
]);
824 sg_set_buf(&sgout
[template[i
].anp
+ k
],
825 q
, template[i
].tap
[k
]);
828 n
= template[i
].tap
[k
];
829 if (k
== template[i
].np
- 1 && enc
)
831 if (offset_in_page(q
) + n
< PAGE_SIZE
)
834 temp
+= template[i
].tap
[k
];
837 ret
= crypto_aead_setauthsize(tfm
, authsize
);
839 pr_err("alg: aead%s: Failed to set authsize to %u on chunk test %d for %s\n",
840 d
, authsize
, j
, algo
);
845 if (WARN_ON(sg
[template[i
].anp
+ k
- 1].offset
+
846 sg
[template[i
].anp
+ k
- 1].length
+
847 authsize
> PAGE_SIZE
)) {
853 sgout
[template[i
].anp
+ k
- 1].length
+=
855 sg
[template[i
].anp
+ k
- 1].length
+= authsize
;
858 aead_request_set_crypt(req
, sg
, (diff_dst
) ? sgout
: sg
,
862 aead_request_set_ad(req
, template[i
].alen
);
864 ret
= crypto_wait_req(enc
? crypto_aead_encrypt(req
)
865 : crypto_aead_decrypt(req
), &wait
);
869 if (template[i
].novrfy
) {
870 /* verification was supposed to fail */
871 pr_err("alg: aead%s: %s failed on chunk test %d for %s: ret was 0, expected -EBADMSG\n",
873 /* so really, we got a bad message */
879 if (template[i
].novrfy
)
880 /* verification failure was expected */
884 pr_err("alg: aead%s: %s failed on chunk test %d for %s: ret=%d\n",
885 d
, e
, j
, algo
, -ret
);
890 for (k
= 0, temp
= 0; k
< template[i
].np
; k
++) {
892 q
= xoutbuf
[IDX
[k
] >> PAGE_SHIFT
] +
893 offset_in_page(IDX
[k
]);
895 q
= xbuf
[IDX
[k
] >> PAGE_SHIFT
] +
896 offset_in_page(IDX
[k
]);
898 n
= template[i
].tap
[k
];
899 if (k
== template[i
].np
- 1)
900 n
+= enc
? authsize
: -authsize
;
902 if (memcmp(q
, template[i
].result
+ temp
, n
)) {
903 pr_err("alg: aead%s: Chunk test %d failed on %s at page %u for %s\n",
910 if (k
== template[i
].np
- 1 && !enc
) {
912 memcmp(q
, template[i
].input
+
918 for (n
= 0; offset_in_page(q
+ n
) && q
[n
]; n
++)
922 pr_err("alg: aead%s: Result buffer corruption in chunk test %d on %s at page %u for %s: %u bytes:\n",
923 d
, j
, e
, k
, algo
, n
);
928 temp
+= template[i
].tap
[k
];
935 aead_request_free(req
);
939 testmgr_free_buf(xoutbuf
);
941 testmgr_free_buf(axbuf
);
943 testmgr_free_buf(xbuf
);
950 static int test_aead(struct crypto_aead
*tfm
, int enc
,
951 const struct aead_testvec
*template, unsigned int tcount
)
953 unsigned int alignmask
;
956 /* test 'dst == src' case */
957 ret
= __test_aead(tfm
, enc
, template, tcount
, false, 0);
961 /* test 'dst != src' case */
962 ret
= __test_aead(tfm
, enc
, template, tcount
, true, 0);
966 /* test unaligned buffers, check with one byte offset */
967 ret
= __test_aead(tfm
, enc
, template, tcount
, true, 1);
971 alignmask
= crypto_tfm_alg_alignmask(&tfm
->base
);
973 /* Check if alignment mask for tfm is correctly set. */
974 ret
= __test_aead(tfm
, enc
, template, tcount
, true,
983 static int test_cipher(struct crypto_cipher
*tfm
, int enc
,
984 const struct cipher_testvec
*template,
987 const char *algo
= crypto_tfm_alg_driver_name(crypto_cipher_tfm(tfm
));
988 unsigned int i
, j
, k
;
992 char *xbuf
[XBUFSIZE
];
995 if (testmgr_alloc_buf(xbuf
))
1004 for (i
= 0; i
< tcount
; i
++) {
1008 if (fips_enabled
&& template[i
].fips_skip
)
1014 if (WARN_ON(template[i
].ilen
> PAGE_SIZE
))
1018 memcpy(data
, template[i
].input
, template[i
].ilen
);
1020 crypto_cipher_clear_flags(tfm
, ~0);
1022 crypto_cipher_set_flags(tfm
, CRYPTO_TFM_REQ_WEAK_KEY
);
1024 ret
= crypto_cipher_setkey(tfm
, template[i
].key
,
1026 if (template[i
].fail
== !ret
) {
1027 printk(KERN_ERR
"alg: cipher: setkey failed "
1028 "on test %d for %s: flags=%x\n", j
,
1029 algo
, crypto_cipher_get_flags(tfm
));
1034 for (k
= 0; k
< template[i
].ilen
;
1035 k
+= crypto_cipher_blocksize(tfm
)) {
1037 crypto_cipher_encrypt_one(tfm
, data
+ k
,
1040 crypto_cipher_decrypt_one(tfm
, data
+ k
,
1045 if (memcmp(q
, template[i
].result
, template[i
].rlen
)) {
1046 printk(KERN_ERR
"alg: cipher: Test %d failed "
1047 "on %s for %s\n", j
, e
, algo
);
1048 hexdump(q
, template[i
].rlen
);
1057 testmgr_free_buf(xbuf
);
1062 static int __test_skcipher(struct crypto_skcipher
*tfm
, int enc
,
1063 const struct cipher_testvec
*template,
1064 unsigned int tcount
,
1065 const bool diff_dst
, const int align_offset
)
1068 crypto_tfm_alg_driver_name(crypto_skcipher_tfm(tfm
));
1069 unsigned int i
, j
, k
, n
, temp
;
1071 struct skcipher_request
*req
;
1072 struct scatterlist sg
[8];
1073 struct scatterlist sgout
[8];
1075 struct crypto_wait wait
;
1078 char *xbuf
[XBUFSIZE
];
1079 char *xoutbuf
[XBUFSIZE
];
1081 unsigned int ivsize
= crypto_skcipher_ivsize(tfm
);
1083 if (testmgr_alloc_buf(xbuf
))
1086 if (diff_dst
&& testmgr_alloc_buf(xoutbuf
))
1099 crypto_init_wait(&wait
);
1101 req
= skcipher_request_alloc(tfm
, GFP_KERNEL
);
1103 pr_err("alg: skcipher%s: Failed to allocate request for %s\n",
1108 skcipher_request_set_callback(req
, CRYPTO_TFM_REQ_MAY_BACKLOG
,
1109 crypto_req_done
, &wait
);
1112 for (i
= 0; i
< tcount
; i
++) {
1113 if (template[i
].np
&& !template[i
].also_non_np
)
1116 if (fips_enabled
&& template[i
].fips_skip
)
1120 memcpy(iv
, template[i
].iv
, ivsize
);
1122 memset(iv
, 0, MAX_IVLEN
);
1126 if (WARN_ON(align_offset
+ template[i
].ilen
> PAGE_SIZE
))
1130 data
+= align_offset
;
1131 memcpy(data
, template[i
].input
, template[i
].ilen
);
1133 crypto_skcipher_clear_flags(tfm
, ~0);
1135 crypto_skcipher_set_flags(tfm
,
1136 CRYPTO_TFM_REQ_WEAK_KEY
);
1138 ret
= crypto_skcipher_setkey(tfm
, template[i
].key
,
1140 if (template[i
].fail
== !ret
) {
1141 pr_err("alg: skcipher%s: setkey failed on test %d for %s: flags=%x\n",
1142 d
, j
, algo
, crypto_skcipher_get_flags(tfm
));
1147 sg_init_one(&sg
[0], data
, template[i
].ilen
);
1150 data
+= align_offset
;
1151 sg_init_one(&sgout
[0], data
, template[i
].ilen
);
1154 skcipher_request_set_crypt(req
, sg
, (diff_dst
) ? sgout
: sg
,
1155 template[i
].ilen
, iv
);
1156 ret
= crypto_wait_req(enc
? crypto_skcipher_encrypt(req
) :
1157 crypto_skcipher_decrypt(req
), &wait
);
1160 pr_err("alg: skcipher%s: %s failed on test %d for %s: ret=%d\n",
1161 d
, e
, j
, algo
, -ret
);
1166 if (memcmp(q
, template[i
].result
, template[i
].rlen
)) {
1167 pr_err("alg: skcipher%s: Test %d failed (invalid result) on %s for %s\n",
1169 hexdump(q
, template[i
].rlen
);
1174 if (template[i
].iv_out
&&
1175 memcmp(iv
, template[i
].iv_out
,
1176 crypto_skcipher_ivsize(tfm
))) {
1177 pr_err("alg: skcipher%s: Test %d failed (invalid output IV) on %s for %s\n",
1179 hexdump(iv
, crypto_skcipher_ivsize(tfm
));
1186 for (i
= 0; i
< tcount
; i
++) {
1187 /* alignment tests are only done with continuous buffers */
1188 if (align_offset
!= 0)
1191 if (!template[i
].np
)
1194 if (fips_enabled
&& template[i
].fips_skip
)
1198 memcpy(iv
, template[i
].iv
, ivsize
);
1200 memset(iv
, 0, MAX_IVLEN
);
1203 crypto_skcipher_clear_flags(tfm
, ~0);
1205 crypto_skcipher_set_flags(tfm
,
1206 CRYPTO_TFM_REQ_WEAK_KEY
);
1208 ret
= crypto_skcipher_setkey(tfm
, template[i
].key
,
1210 if (template[i
].fail
== !ret
) {
1211 pr_err("alg: skcipher%s: setkey failed on chunk test %d for %s: flags=%x\n",
1212 d
, j
, algo
, crypto_skcipher_get_flags(tfm
));
1219 sg_init_table(sg
, template[i
].np
);
1221 sg_init_table(sgout
, template[i
].np
);
1222 for (k
= 0; k
< template[i
].np
; k
++) {
1223 if (WARN_ON(offset_in_page(IDX
[k
]) +
1224 template[i
].tap
[k
] > PAGE_SIZE
))
1227 q
= xbuf
[IDX
[k
] >> PAGE_SHIFT
] + offset_in_page(IDX
[k
]);
1229 memcpy(q
, template[i
].input
+ temp
, template[i
].tap
[k
]);
1231 if (offset_in_page(q
) + template[i
].tap
[k
] < PAGE_SIZE
)
1232 q
[template[i
].tap
[k
]] = 0;
1234 sg_set_buf(&sg
[k
], q
, template[i
].tap
[k
]);
1236 q
= xoutbuf
[IDX
[k
] >> PAGE_SHIFT
] +
1237 offset_in_page(IDX
[k
]);
1239 sg_set_buf(&sgout
[k
], q
, template[i
].tap
[k
]);
1241 memset(q
, 0, template[i
].tap
[k
]);
1242 if (offset_in_page(q
) +
1243 template[i
].tap
[k
] < PAGE_SIZE
)
1244 q
[template[i
].tap
[k
]] = 0;
1247 temp
+= template[i
].tap
[k
];
1250 skcipher_request_set_crypt(req
, sg
, (diff_dst
) ? sgout
: sg
,
1251 template[i
].ilen
, iv
);
1253 ret
= crypto_wait_req(enc
? crypto_skcipher_encrypt(req
) :
1254 crypto_skcipher_decrypt(req
), &wait
);
1257 pr_err("alg: skcipher%s: %s failed on chunk test %d for %s: ret=%d\n",
1258 d
, e
, j
, algo
, -ret
);
1264 for (k
= 0; k
< template[i
].np
; k
++) {
1266 q
= xoutbuf
[IDX
[k
] >> PAGE_SHIFT
] +
1267 offset_in_page(IDX
[k
]);
1269 q
= xbuf
[IDX
[k
] >> PAGE_SHIFT
] +
1270 offset_in_page(IDX
[k
]);
1272 if (memcmp(q
, template[i
].result
+ temp
,
1273 template[i
].tap
[k
])) {
1274 pr_err("alg: skcipher%s: Chunk test %d failed on %s at page %u for %s\n",
1276 hexdump(q
, template[i
].tap
[k
]);
1280 q
+= template[i
].tap
[k
];
1281 for (n
= 0; offset_in_page(q
+ n
) && q
[n
]; n
++)
1284 pr_err("alg: skcipher%s: Result buffer corruption in chunk test %d on %s at page %u for %s: %u bytes:\n",
1285 d
, j
, e
, k
, algo
, n
);
1289 temp
+= template[i
].tap
[k
];
1296 skcipher_request_free(req
);
1298 testmgr_free_buf(xoutbuf
);
1300 testmgr_free_buf(xbuf
);
1305 static int test_skcipher(struct crypto_skcipher
*tfm
, int enc
,
1306 const struct cipher_testvec
*template,
1307 unsigned int tcount
)
1309 unsigned int alignmask
;
1312 /* test 'dst == src' case */
1313 ret
= __test_skcipher(tfm
, enc
, template, tcount
, false, 0);
1317 /* test 'dst != src' case */
1318 ret
= __test_skcipher(tfm
, enc
, template, tcount
, true, 0);
1322 /* test unaligned buffers, check with one byte offset */
1323 ret
= __test_skcipher(tfm
, enc
, template, tcount
, true, 1);
1327 alignmask
= crypto_tfm_alg_alignmask(&tfm
->base
);
1329 /* Check if alignment mask for tfm is correctly set. */
1330 ret
= __test_skcipher(tfm
, enc
, template, tcount
, true,
1339 static int test_comp(struct crypto_comp
*tfm
,
1340 const struct comp_testvec
*ctemplate
,
1341 const struct comp_testvec
*dtemplate
,
1342 int ctcount
, int dtcount
)
1344 const char *algo
= crypto_tfm_alg_driver_name(crypto_comp_tfm(tfm
));
1346 char result
[COMP_BUF_SIZE
];
1349 for (i
= 0; i
< ctcount
; i
++) {
1351 unsigned int dlen
= COMP_BUF_SIZE
;
1353 memset(result
, 0, sizeof (result
));
1355 ilen
= ctemplate
[i
].inlen
;
1356 ret
= crypto_comp_compress(tfm
, ctemplate
[i
].input
,
1357 ilen
, result
, &dlen
);
1359 printk(KERN_ERR
"alg: comp: compression failed "
1360 "on test %d for %s: ret=%d\n", i
+ 1, algo
,
1365 if (dlen
!= ctemplate
[i
].outlen
) {
1366 printk(KERN_ERR
"alg: comp: Compression test %d "
1367 "failed for %s: output len = %d\n", i
+ 1, algo
,
1373 if (memcmp(result
, ctemplate
[i
].output
, dlen
)) {
1374 printk(KERN_ERR
"alg: comp: Compression test %d "
1375 "failed for %s\n", i
+ 1, algo
);
1376 hexdump(result
, dlen
);
1382 for (i
= 0; i
< dtcount
; i
++) {
1384 unsigned int dlen
= COMP_BUF_SIZE
;
1386 memset(result
, 0, sizeof (result
));
1388 ilen
= dtemplate
[i
].inlen
;
1389 ret
= crypto_comp_decompress(tfm
, dtemplate
[i
].input
,
1390 ilen
, result
, &dlen
);
1392 printk(KERN_ERR
"alg: comp: decompression failed "
1393 "on test %d for %s: ret=%d\n", i
+ 1, algo
,
1398 if (dlen
!= dtemplate
[i
].outlen
) {
1399 printk(KERN_ERR
"alg: comp: Decompression test %d "
1400 "failed for %s: output len = %d\n", i
+ 1, algo
,
1406 if (memcmp(result
, dtemplate
[i
].output
, dlen
)) {
1407 printk(KERN_ERR
"alg: comp: Decompression test %d "
1408 "failed for %s\n", i
+ 1, algo
);
1409 hexdump(result
, dlen
);
1421 static int test_acomp(struct crypto_acomp
*tfm
,
1422 const struct comp_testvec
*ctemplate
,
1423 const struct comp_testvec
*dtemplate
,
1424 int ctcount
, int dtcount
)
1426 const char *algo
= crypto_tfm_alg_driver_name(crypto_acomp_tfm(tfm
));
1428 char *output
, *decomp_out
;
1430 struct scatterlist src
, dst
;
1431 struct acomp_req
*req
;
1432 struct crypto_wait wait
;
1434 output
= kmalloc(COMP_BUF_SIZE
, GFP_KERNEL
);
1438 decomp_out
= kmalloc(COMP_BUF_SIZE
, GFP_KERNEL
);
1444 for (i
= 0; i
< ctcount
; i
++) {
1445 unsigned int dlen
= COMP_BUF_SIZE
;
1446 int ilen
= ctemplate
[i
].inlen
;
1449 input_vec
= kmemdup(ctemplate
[i
].input
, ilen
, GFP_KERNEL
);
1455 memset(output
, 0, dlen
);
1456 crypto_init_wait(&wait
);
1457 sg_init_one(&src
, input_vec
, ilen
);
1458 sg_init_one(&dst
, output
, dlen
);
1460 req
= acomp_request_alloc(tfm
);
1462 pr_err("alg: acomp: request alloc failed for %s\n",
1469 acomp_request_set_params(req
, &src
, &dst
, ilen
, dlen
);
1470 acomp_request_set_callback(req
, CRYPTO_TFM_REQ_MAY_BACKLOG
,
1471 crypto_req_done
, &wait
);
1473 ret
= crypto_wait_req(crypto_acomp_compress(req
), &wait
);
1475 pr_err("alg: acomp: compression failed on test %d for %s: ret=%d\n",
1478 acomp_request_free(req
);
1483 dlen
= COMP_BUF_SIZE
;
1484 sg_init_one(&src
, output
, ilen
);
1485 sg_init_one(&dst
, decomp_out
, dlen
);
1486 crypto_init_wait(&wait
);
1487 acomp_request_set_params(req
, &src
, &dst
, ilen
, dlen
);
1489 ret
= crypto_wait_req(crypto_acomp_decompress(req
), &wait
);
1491 pr_err("alg: acomp: compression failed on test %d for %s: ret=%d\n",
1494 acomp_request_free(req
);
1498 if (req
->dlen
!= ctemplate
[i
].inlen
) {
1499 pr_err("alg: acomp: Compression test %d failed for %s: output len = %d\n",
1500 i
+ 1, algo
, req
->dlen
);
1503 acomp_request_free(req
);
1507 if (memcmp(input_vec
, decomp_out
, req
->dlen
)) {
1508 pr_err("alg: acomp: Compression test %d failed for %s\n",
1510 hexdump(output
, req
->dlen
);
1513 acomp_request_free(req
);
1518 acomp_request_free(req
);
1521 for (i
= 0; i
< dtcount
; i
++) {
1522 unsigned int dlen
= COMP_BUF_SIZE
;
1523 int ilen
= dtemplate
[i
].inlen
;
1526 input_vec
= kmemdup(dtemplate
[i
].input
, ilen
, GFP_KERNEL
);
1532 memset(output
, 0, dlen
);
1533 crypto_init_wait(&wait
);
1534 sg_init_one(&src
, input_vec
, ilen
);
1535 sg_init_one(&dst
, output
, dlen
);
1537 req
= acomp_request_alloc(tfm
);
1539 pr_err("alg: acomp: request alloc failed for %s\n",
1546 acomp_request_set_params(req
, &src
, &dst
, ilen
, dlen
);
1547 acomp_request_set_callback(req
, CRYPTO_TFM_REQ_MAY_BACKLOG
,
1548 crypto_req_done
, &wait
);
1550 ret
= crypto_wait_req(crypto_acomp_decompress(req
), &wait
);
1552 pr_err("alg: acomp: decompression failed on test %d for %s: ret=%d\n",
1555 acomp_request_free(req
);
1559 if (req
->dlen
!= dtemplate
[i
].outlen
) {
1560 pr_err("alg: acomp: Decompression test %d failed for %s: output len = %d\n",
1561 i
+ 1, algo
, req
->dlen
);
1564 acomp_request_free(req
);
1568 if (memcmp(output
, dtemplate
[i
].output
, req
->dlen
)) {
1569 pr_err("alg: acomp: Decompression test %d failed for %s\n",
1571 hexdump(output
, req
->dlen
);
1574 acomp_request_free(req
);
1579 acomp_request_free(req
);
1590 static int test_cprng(struct crypto_rng
*tfm
,
1591 const struct cprng_testvec
*template,
1592 unsigned int tcount
)
1594 const char *algo
= crypto_tfm_alg_driver_name(crypto_rng_tfm(tfm
));
1595 int err
= 0, i
, j
, seedsize
;
1599 seedsize
= crypto_rng_seedsize(tfm
);
1601 seed
= kmalloc(seedsize
, GFP_KERNEL
);
1603 printk(KERN_ERR
"alg: cprng: Failed to allocate seed space "
1608 for (i
= 0; i
< tcount
; i
++) {
1609 memset(result
, 0, 32);
1611 memcpy(seed
, template[i
].v
, template[i
].vlen
);
1612 memcpy(seed
+ template[i
].vlen
, template[i
].key
,
1614 memcpy(seed
+ template[i
].vlen
+ template[i
].klen
,
1615 template[i
].dt
, template[i
].dtlen
);
1617 err
= crypto_rng_reset(tfm
, seed
, seedsize
);
1619 printk(KERN_ERR
"alg: cprng: Failed to reset rng "
1624 for (j
= 0; j
< template[i
].loops
; j
++) {
1625 err
= crypto_rng_get_bytes(tfm
, result
,
1628 printk(KERN_ERR
"alg: cprng: Failed to obtain "
1629 "the correct amount of random data for "
1630 "%s (requested %d)\n", algo
,
1636 err
= memcmp(result
, template[i
].result
,
1639 printk(KERN_ERR
"alg: cprng: Test %d failed for %s\n",
1641 hexdump(result
, template[i
].rlen
);
1652 static int alg_test_aead(const struct alg_test_desc
*desc
, const char *driver
,
1655 struct crypto_aead
*tfm
;
1658 tfm
= crypto_alloc_aead(driver
, type
, mask
);
1660 printk(KERN_ERR
"alg: aead: Failed to load transform for %s: "
1661 "%ld\n", driver
, PTR_ERR(tfm
));
1662 return PTR_ERR(tfm
);
1665 if (desc
->suite
.aead
.enc
.vecs
) {
1666 err
= test_aead(tfm
, ENCRYPT
, desc
->suite
.aead
.enc
.vecs
,
1667 desc
->suite
.aead
.enc
.count
);
1672 if (!err
&& desc
->suite
.aead
.dec
.vecs
)
1673 err
= test_aead(tfm
, DECRYPT
, desc
->suite
.aead
.dec
.vecs
,
1674 desc
->suite
.aead
.dec
.count
);
1677 crypto_free_aead(tfm
);
1681 static int alg_test_cipher(const struct alg_test_desc
*desc
,
1682 const char *driver
, u32 type
, u32 mask
)
1684 struct crypto_cipher
*tfm
;
1687 tfm
= crypto_alloc_cipher(driver
, type
, mask
);
1689 printk(KERN_ERR
"alg: cipher: Failed to load transform for "
1690 "%s: %ld\n", driver
, PTR_ERR(tfm
));
1691 return PTR_ERR(tfm
);
1694 if (desc
->suite
.cipher
.enc
.vecs
) {
1695 err
= test_cipher(tfm
, ENCRYPT
, desc
->suite
.cipher
.enc
.vecs
,
1696 desc
->suite
.cipher
.enc
.count
);
1701 if (desc
->suite
.cipher
.dec
.vecs
)
1702 err
= test_cipher(tfm
, DECRYPT
, desc
->suite
.cipher
.dec
.vecs
,
1703 desc
->suite
.cipher
.dec
.count
);
1706 crypto_free_cipher(tfm
);
1710 static int alg_test_skcipher(const struct alg_test_desc
*desc
,
1711 const char *driver
, u32 type
, u32 mask
)
1713 struct crypto_skcipher
*tfm
;
1716 tfm
= crypto_alloc_skcipher(driver
, type
, mask
);
1718 printk(KERN_ERR
"alg: skcipher: Failed to load transform for "
1719 "%s: %ld\n", driver
, PTR_ERR(tfm
));
1720 return PTR_ERR(tfm
);
1723 if (desc
->suite
.cipher
.enc
.vecs
) {
1724 err
= test_skcipher(tfm
, ENCRYPT
, desc
->suite
.cipher
.enc
.vecs
,
1725 desc
->suite
.cipher
.enc
.count
);
1730 if (desc
->suite
.cipher
.dec
.vecs
)
1731 err
= test_skcipher(tfm
, DECRYPT
, desc
->suite
.cipher
.dec
.vecs
,
1732 desc
->suite
.cipher
.dec
.count
);
1735 crypto_free_skcipher(tfm
);
1739 static int alg_test_comp(const struct alg_test_desc
*desc
, const char *driver
,
1742 struct crypto_comp
*comp
;
1743 struct crypto_acomp
*acomp
;
1745 u32 algo_type
= type
& CRYPTO_ALG_TYPE_ACOMPRESS_MASK
;
1747 if (algo_type
== CRYPTO_ALG_TYPE_ACOMPRESS
) {
1748 acomp
= crypto_alloc_acomp(driver
, type
, mask
);
1749 if (IS_ERR(acomp
)) {
1750 pr_err("alg: acomp: Failed to load transform for %s: %ld\n",
1751 driver
, PTR_ERR(acomp
));
1752 return PTR_ERR(acomp
);
1754 err
= test_acomp(acomp
, desc
->suite
.comp
.comp
.vecs
,
1755 desc
->suite
.comp
.decomp
.vecs
,
1756 desc
->suite
.comp
.comp
.count
,
1757 desc
->suite
.comp
.decomp
.count
);
1758 crypto_free_acomp(acomp
);
1760 comp
= crypto_alloc_comp(driver
, type
, mask
);
1762 pr_err("alg: comp: Failed to load transform for %s: %ld\n",
1763 driver
, PTR_ERR(comp
));
1764 return PTR_ERR(comp
);
1767 err
= test_comp(comp
, desc
->suite
.comp
.comp
.vecs
,
1768 desc
->suite
.comp
.decomp
.vecs
,
1769 desc
->suite
.comp
.comp
.count
,
1770 desc
->suite
.comp
.decomp
.count
);
1772 crypto_free_comp(comp
);
1777 static int alg_test_hash(const struct alg_test_desc
*desc
, const char *driver
,
1780 struct crypto_ahash
*tfm
;
1783 tfm
= crypto_alloc_ahash(driver
, type
, mask
);
1785 printk(KERN_ERR
"alg: hash: Failed to load transform for %s: "
1786 "%ld\n", driver
, PTR_ERR(tfm
));
1787 return PTR_ERR(tfm
);
1790 err
= test_hash(tfm
, desc
->suite
.hash
.vecs
,
1791 desc
->suite
.hash
.count
, true);
1793 err
= test_hash(tfm
, desc
->suite
.hash
.vecs
,
1794 desc
->suite
.hash
.count
, false);
1796 crypto_free_ahash(tfm
);
1800 static int alg_test_crc32c(const struct alg_test_desc
*desc
,
1801 const char *driver
, u32 type
, u32 mask
)
1803 struct crypto_shash
*tfm
;
1807 err
= alg_test_hash(desc
, driver
, type
, mask
);
1811 tfm
= crypto_alloc_shash(driver
, type
, mask
);
1813 printk(KERN_ERR
"alg: crc32c: Failed to load transform for %s: "
1814 "%ld\n", driver
, PTR_ERR(tfm
));
1820 SHASH_DESC_ON_STACK(shash
, tfm
);
1821 u32
*ctx
= (u32
*)shash_desc_ctx(shash
);
1826 *ctx
= le32_to_cpu(420553207);
1827 err
= crypto_shash_final(shash
, (u8
*)&val
);
1829 printk(KERN_ERR
"alg: crc32c: Operation failed for "
1830 "%s: %d\n", driver
, err
);
1834 if (val
!= ~420553207) {
1835 printk(KERN_ERR
"alg: crc32c: Test failed for %s: "
1836 "%d\n", driver
, val
);
1841 crypto_free_shash(tfm
);
1847 static int alg_test_cprng(const struct alg_test_desc
*desc
, const char *driver
,
1850 struct crypto_rng
*rng
;
1853 rng
= crypto_alloc_rng(driver
, type
, mask
);
1855 printk(KERN_ERR
"alg: cprng: Failed to load transform for %s: "
1856 "%ld\n", driver
, PTR_ERR(rng
));
1857 return PTR_ERR(rng
);
1860 err
= test_cprng(rng
, desc
->suite
.cprng
.vecs
, desc
->suite
.cprng
.count
);
1862 crypto_free_rng(rng
);
1868 static int drbg_cavs_test(const struct drbg_testvec
*test
, int pr
,
1869 const char *driver
, u32 type
, u32 mask
)
1872 struct crypto_rng
*drng
;
1873 struct drbg_test_data test_data
;
1874 struct drbg_string addtl
, pers
, testentropy
;
1875 unsigned char *buf
= kzalloc(test
->expectedlen
, GFP_KERNEL
);
1880 drng
= crypto_alloc_rng(driver
, type
, mask
);
1882 printk(KERN_ERR
"alg: drbg: could not allocate DRNG handle for "
1888 test_data
.testentropy
= &testentropy
;
1889 drbg_string_fill(&testentropy
, test
->entropy
, test
->entropylen
);
1890 drbg_string_fill(&pers
, test
->pers
, test
->perslen
);
1891 ret
= crypto_drbg_reset_test(drng
, &pers
, &test_data
);
1893 printk(KERN_ERR
"alg: drbg: Failed to reset rng\n");
1897 drbg_string_fill(&addtl
, test
->addtla
, test
->addtllen
);
1899 drbg_string_fill(&testentropy
, test
->entpra
, test
->entprlen
);
1900 ret
= crypto_drbg_get_bytes_addtl_test(drng
,
1901 buf
, test
->expectedlen
, &addtl
, &test_data
);
1903 ret
= crypto_drbg_get_bytes_addtl(drng
,
1904 buf
, test
->expectedlen
, &addtl
);
1907 printk(KERN_ERR
"alg: drbg: could not obtain random data for "
1908 "driver %s\n", driver
);
1912 drbg_string_fill(&addtl
, test
->addtlb
, test
->addtllen
);
1914 drbg_string_fill(&testentropy
, test
->entprb
, test
->entprlen
);
1915 ret
= crypto_drbg_get_bytes_addtl_test(drng
,
1916 buf
, test
->expectedlen
, &addtl
, &test_data
);
1918 ret
= crypto_drbg_get_bytes_addtl(drng
,
1919 buf
, test
->expectedlen
, &addtl
);
1922 printk(KERN_ERR
"alg: drbg: could not obtain random data for "
1923 "driver %s\n", driver
);
1927 ret
= memcmp(test
->expected
, buf
, test
->expectedlen
);
1930 crypto_free_rng(drng
);
1936 static int alg_test_drbg(const struct alg_test_desc
*desc
, const char *driver
,
1942 const struct drbg_testvec
*template = desc
->suite
.drbg
.vecs
;
1943 unsigned int tcount
= desc
->suite
.drbg
.count
;
1945 if (0 == memcmp(driver
, "drbg_pr_", 8))
1948 for (i
= 0; i
< tcount
; i
++) {
1949 err
= drbg_cavs_test(&template[i
], pr
, driver
, type
, mask
);
1951 printk(KERN_ERR
"alg: drbg: Test %d failed for %s\n",
1961 static int do_test_kpp(struct crypto_kpp
*tfm
, const struct kpp_testvec
*vec
,
1964 struct kpp_request
*req
;
1965 void *input_buf
= NULL
;
1966 void *output_buf
= NULL
;
1967 void *a_public
= NULL
;
1969 void *shared_secret
= NULL
;
1970 struct crypto_wait wait
;
1971 unsigned int out_len_max
;
1973 struct scatterlist src
, dst
;
1975 req
= kpp_request_alloc(tfm
, GFP_KERNEL
);
1979 crypto_init_wait(&wait
);
1981 err
= crypto_kpp_set_secret(tfm
, vec
->secret
, vec
->secret_size
);
1985 out_len_max
= crypto_kpp_maxsize(tfm
);
1986 output_buf
= kzalloc(out_len_max
, GFP_KERNEL
);
1992 /* Use appropriate parameter as base */
1993 kpp_request_set_input(req
, NULL
, 0);
1994 sg_init_one(&dst
, output_buf
, out_len_max
);
1995 kpp_request_set_output(req
, &dst
, out_len_max
);
1996 kpp_request_set_callback(req
, CRYPTO_TFM_REQ_MAY_BACKLOG
,
1997 crypto_req_done
, &wait
);
1999 /* Compute party A's public key */
2000 err
= crypto_wait_req(crypto_kpp_generate_public_key(req
), &wait
);
2002 pr_err("alg: %s: Party A: generate public key test failed. err %d\n",
2008 /* Save party A's public key */
2009 a_public
= kzalloc(out_len_max
, GFP_KERNEL
);
2014 memcpy(a_public
, sg_virt(req
->dst
), out_len_max
);
2016 /* Verify calculated public key */
2017 if (memcmp(vec
->expected_a_public
, sg_virt(req
->dst
),
2018 vec
->expected_a_public_size
)) {
2019 pr_err("alg: %s: Party A: generate public key test failed. Invalid output\n",
2026 /* Calculate shared secret key by using counter part (b) public key. */
2027 input_buf
= kzalloc(vec
->b_public_size
, GFP_KERNEL
);
2033 memcpy(input_buf
, vec
->b_public
, vec
->b_public_size
);
2034 sg_init_one(&src
, input_buf
, vec
->b_public_size
);
2035 sg_init_one(&dst
, output_buf
, out_len_max
);
2036 kpp_request_set_input(req
, &src
, vec
->b_public_size
);
2037 kpp_request_set_output(req
, &dst
, out_len_max
);
2038 kpp_request_set_callback(req
, CRYPTO_TFM_REQ_MAY_BACKLOG
,
2039 crypto_req_done
, &wait
);
2040 err
= crypto_wait_req(crypto_kpp_compute_shared_secret(req
), &wait
);
2042 pr_err("alg: %s: Party A: compute shared secret test failed. err %d\n",
2048 /* Save the shared secret obtained by party A */
2049 a_ss
= kzalloc(vec
->expected_ss_size
, GFP_KERNEL
);
2054 memcpy(a_ss
, sg_virt(req
->dst
), vec
->expected_ss_size
);
2057 * Calculate party B's shared secret by using party A's
2060 err
= crypto_kpp_set_secret(tfm
, vec
->b_secret
,
2061 vec
->b_secret_size
);
2065 sg_init_one(&src
, a_public
, vec
->expected_a_public_size
);
2066 sg_init_one(&dst
, output_buf
, out_len_max
);
2067 kpp_request_set_input(req
, &src
, vec
->expected_a_public_size
);
2068 kpp_request_set_output(req
, &dst
, out_len_max
);
2069 kpp_request_set_callback(req
, CRYPTO_TFM_REQ_MAY_BACKLOG
,
2070 crypto_req_done
, &wait
);
2071 err
= crypto_wait_req(crypto_kpp_compute_shared_secret(req
),
2074 pr_err("alg: %s: Party B: compute shared secret failed. err %d\n",
2079 shared_secret
= a_ss
;
2081 shared_secret
= (void *)vec
->expected_ss
;
2085 * verify shared secret from which the user will derive
2086 * secret key by executing whatever hash it has chosen
2088 if (memcmp(shared_secret
, sg_virt(req
->dst
),
2089 vec
->expected_ss_size
)) {
2090 pr_err("alg: %s: compute shared secret test failed. Invalid output\n",
2102 kpp_request_free(req
);
2106 static int test_kpp(struct crypto_kpp
*tfm
, const char *alg
,
2107 const struct kpp_testvec
*vecs
, unsigned int tcount
)
2111 for (i
= 0; i
< tcount
; i
++) {
2112 ret
= do_test_kpp(tfm
, vecs
++, alg
);
2114 pr_err("alg: %s: test failed on vector %d, err=%d\n",
2122 static int alg_test_kpp(const struct alg_test_desc
*desc
, const char *driver
,
2125 struct crypto_kpp
*tfm
;
2128 tfm
= crypto_alloc_kpp(driver
, type
, mask
);
2130 pr_err("alg: kpp: Failed to load tfm for %s: %ld\n",
2131 driver
, PTR_ERR(tfm
));
2132 return PTR_ERR(tfm
);
2134 if (desc
->suite
.kpp
.vecs
)
2135 err
= test_kpp(tfm
, desc
->alg
, desc
->suite
.kpp
.vecs
,
2136 desc
->suite
.kpp
.count
);
2138 crypto_free_kpp(tfm
);
2142 static int test_akcipher_one(struct crypto_akcipher
*tfm
,
2143 const struct akcipher_testvec
*vecs
)
2145 char *xbuf
[XBUFSIZE
];
2146 struct akcipher_request
*req
;
2147 void *outbuf_enc
= NULL
;
2148 void *outbuf_dec
= NULL
;
2149 struct crypto_wait wait
;
2150 unsigned int out_len_max
, out_len
= 0;
2152 struct scatterlist src
, dst
, src_tab
[2];
2154 if (testmgr_alloc_buf(xbuf
))
2157 req
= akcipher_request_alloc(tfm
, GFP_KERNEL
);
2161 crypto_init_wait(&wait
);
2163 if (vecs
->public_key_vec
)
2164 err
= crypto_akcipher_set_pub_key(tfm
, vecs
->key
,
2167 err
= crypto_akcipher_set_priv_key(tfm
, vecs
->key
,
2173 out_len_max
= crypto_akcipher_maxsize(tfm
);
2174 outbuf_enc
= kzalloc(out_len_max
, GFP_KERNEL
);
2178 if (WARN_ON(vecs
->m_size
> PAGE_SIZE
))
2181 memcpy(xbuf
[0], vecs
->m
, vecs
->m_size
);
2183 sg_init_table(src_tab
, 2);
2184 sg_set_buf(&src_tab
[0], xbuf
[0], 8);
2185 sg_set_buf(&src_tab
[1], xbuf
[0] + 8, vecs
->m_size
- 8);
2186 sg_init_one(&dst
, outbuf_enc
, out_len_max
);
2187 akcipher_request_set_crypt(req
, src_tab
, &dst
, vecs
->m_size
,
2189 akcipher_request_set_callback(req
, CRYPTO_TFM_REQ_MAY_BACKLOG
,
2190 crypto_req_done
, &wait
);
2192 err
= crypto_wait_req(vecs
->siggen_sigver_test
?
2193 /* Run asymmetric signature generation */
2194 crypto_akcipher_sign(req
) :
2195 /* Run asymmetric encrypt */
2196 crypto_akcipher_encrypt(req
), &wait
);
2198 pr_err("alg: akcipher: encrypt test failed. err %d\n", err
);
2201 if (req
->dst_len
!= vecs
->c_size
) {
2202 pr_err("alg: akcipher: encrypt test failed. Invalid output len\n");
2206 /* verify that encrypted message is equal to expected */
2207 if (memcmp(vecs
->c
, outbuf_enc
, vecs
->c_size
)) {
2208 pr_err("alg: akcipher: encrypt test failed. Invalid output\n");
2209 hexdump(outbuf_enc
, vecs
->c_size
);
2213 /* Don't invoke decrypt for vectors with public key */
2214 if (vecs
->public_key_vec
) {
2218 outbuf_dec
= kzalloc(out_len_max
, GFP_KERNEL
);
2224 if (WARN_ON(vecs
->c_size
> PAGE_SIZE
))
2227 memcpy(xbuf
[0], vecs
->c
, vecs
->c_size
);
2229 sg_init_one(&src
, xbuf
[0], vecs
->c_size
);
2230 sg_init_one(&dst
, outbuf_dec
, out_len_max
);
2231 crypto_init_wait(&wait
);
2232 akcipher_request_set_crypt(req
, &src
, &dst
, vecs
->c_size
, out_len_max
);
2234 err
= crypto_wait_req(vecs
->siggen_sigver_test
?
2235 /* Run asymmetric signature verification */
2236 crypto_akcipher_verify(req
) :
2237 /* Run asymmetric decrypt */
2238 crypto_akcipher_decrypt(req
), &wait
);
2240 pr_err("alg: akcipher: decrypt test failed. err %d\n", err
);
2243 out_len
= req
->dst_len
;
2244 if (out_len
< vecs
->m_size
) {
2245 pr_err("alg: akcipher: decrypt test failed. "
2246 "Invalid output len %u\n", out_len
);
2250 /* verify that decrypted message is equal to the original msg */
2251 if (memchr_inv(outbuf_dec
, 0, out_len
- vecs
->m_size
) ||
2252 memcmp(vecs
->m
, outbuf_dec
+ out_len
- vecs
->m_size
,
2254 pr_err("alg: akcipher: decrypt test failed. Invalid output\n");
2255 hexdump(outbuf_dec
, out_len
);
2262 akcipher_request_free(req
);
2264 testmgr_free_buf(xbuf
);
2268 static int test_akcipher(struct crypto_akcipher
*tfm
, const char *alg
,
2269 const struct akcipher_testvec
*vecs
,
2270 unsigned int tcount
)
2273 crypto_tfm_alg_driver_name(crypto_akcipher_tfm(tfm
));
2276 for (i
= 0; i
< tcount
; i
++) {
2277 ret
= test_akcipher_one(tfm
, vecs
++);
2281 pr_err("alg: akcipher: test %d failed for %s, err=%d\n",
2288 static int alg_test_akcipher(const struct alg_test_desc
*desc
,
2289 const char *driver
, u32 type
, u32 mask
)
2291 struct crypto_akcipher
*tfm
;
2294 tfm
= crypto_alloc_akcipher(driver
, type
, mask
);
2296 pr_err("alg: akcipher: Failed to load tfm for %s: %ld\n",
2297 driver
, PTR_ERR(tfm
));
2298 return PTR_ERR(tfm
);
2300 if (desc
->suite
.akcipher
.vecs
)
2301 err
= test_akcipher(tfm
, desc
->alg
, desc
->suite
.akcipher
.vecs
,
2302 desc
->suite
.akcipher
.count
);
2304 crypto_free_akcipher(tfm
);
2308 static int alg_test_null(const struct alg_test_desc
*desc
,
2309 const char *driver
, u32 type
, u32 mask
)
2314 #define __VECS(tv) { .vecs = tv, .count = ARRAY_SIZE(tv) }
2316 /* Please keep this list sorted by algorithm name. */
2317 static const struct alg_test_desc alg_test_descs
[] = {
2319 .alg
= "ansi_cprng",
2320 .test
= alg_test_cprng
,
2322 .cprng
= __VECS(ansi_cprng_aes_tv_template
)
2325 .alg
= "authenc(hmac(md5),ecb(cipher_null))",
2326 .test
= alg_test_aead
,
2329 .enc
= __VECS(hmac_md5_ecb_cipher_null_enc_tv_template
),
2330 .dec
= __VECS(hmac_md5_ecb_cipher_null_dec_tv_template
)
2334 .alg
= "authenc(hmac(sha1),cbc(aes))",
2335 .test
= alg_test_aead
,
2339 .enc
= __VECS(hmac_sha1_aes_cbc_enc_tv_temp
)
2343 .alg
= "authenc(hmac(sha1),cbc(des))",
2344 .test
= alg_test_aead
,
2347 .enc
= __VECS(hmac_sha1_des_cbc_enc_tv_temp
)
2351 .alg
= "authenc(hmac(sha1),cbc(des3_ede))",
2352 .test
= alg_test_aead
,
2356 .enc
= __VECS(hmac_sha1_des3_ede_cbc_enc_tv_temp
)
2360 .alg
= "authenc(hmac(sha1),ctr(aes))",
2361 .test
= alg_test_null
,
2364 .alg
= "authenc(hmac(sha1),ecb(cipher_null))",
2365 .test
= alg_test_aead
,
2368 .enc
= __VECS(hmac_sha1_ecb_cipher_null_enc_tv_temp
),
2369 .dec
= __VECS(hmac_sha1_ecb_cipher_null_dec_tv_temp
)
2373 .alg
= "authenc(hmac(sha1),rfc3686(ctr(aes)))",
2374 .test
= alg_test_null
,
2377 .alg
= "authenc(hmac(sha224),cbc(des))",
2378 .test
= alg_test_aead
,
2381 .enc
= __VECS(hmac_sha224_des_cbc_enc_tv_temp
)
2385 .alg
= "authenc(hmac(sha224),cbc(des3_ede))",
2386 .test
= alg_test_aead
,
2390 .enc
= __VECS(hmac_sha224_des3_ede_cbc_enc_tv_temp
)
2394 .alg
= "authenc(hmac(sha256),cbc(aes))",
2395 .test
= alg_test_aead
,
2399 .enc
= __VECS(hmac_sha256_aes_cbc_enc_tv_temp
)
2403 .alg
= "authenc(hmac(sha256),cbc(des))",
2404 .test
= alg_test_aead
,
2407 .enc
= __VECS(hmac_sha256_des_cbc_enc_tv_temp
)
2411 .alg
= "authenc(hmac(sha256),cbc(des3_ede))",
2412 .test
= alg_test_aead
,
2416 .enc
= __VECS(hmac_sha256_des3_ede_cbc_enc_tv_temp
)
2420 .alg
= "authenc(hmac(sha256),ctr(aes))",
2421 .test
= alg_test_null
,
2424 .alg
= "authenc(hmac(sha256),rfc3686(ctr(aes)))",
2425 .test
= alg_test_null
,
2428 .alg
= "authenc(hmac(sha384),cbc(des))",
2429 .test
= alg_test_aead
,
2432 .enc
= __VECS(hmac_sha384_des_cbc_enc_tv_temp
)
2436 .alg
= "authenc(hmac(sha384),cbc(des3_ede))",
2437 .test
= alg_test_aead
,
2441 .enc
= __VECS(hmac_sha384_des3_ede_cbc_enc_tv_temp
)
2445 .alg
= "authenc(hmac(sha384),ctr(aes))",
2446 .test
= alg_test_null
,
2449 .alg
= "authenc(hmac(sha384),rfc3686(ctr(aes)))",
2450 .test
= alg_test_null
,
2453 .alg
= "authenc(hmac(sha512),cbc(aes))",
2455 .test
= alg_test_aead
,
2458 .enc
= __VECS(hmac_sha512_aes_cbc_enc_tv_temp
)
2462 .alg
= "authenc(hmac(sha512),cbc(des))",
2463 .test
= alg_test_aead
,
2466 .enc
= __VECS(hmac_sha512_des_cbc_enc_tv_temp
)
2470 .alg
= "authenc(hmac(sha512),cbc(des3_ede))",
2471 .test
= alg_test_aead
,
2475 .enc
= __VECS(hmac_sha512_des3_ede_cbc_enc_tv_temp
)
2479 .alg
= "authenc(hmac(sha512),ctr(aes))",
2480 .test
= alg_test_null
,
2483 .alg
= "authenc(hmac(sha512),rfc3686(ctr(aes)))",
2484 .test
= alg_test_null
,
2488 .test
= alg_test_skcipher
,
2492 .enc
= __VECS(aes_cbc_enc_tv_template
),
2493 .dec
= __VECS(aes_cbc_dec_tv_template
)
2497 .alg
= "cbc(anubis)",
2498 .test
= alg_test_skcipher
,
2501 .enc
= __VECS(anubis_cbc_enc_tv_template
),
2502 .dec
= __VECS(anubis_cbc_dec_tv_template
)
2506 .alg
= "cbc(blowfish)",
2507 .test
= alg_test_skcipher
,
2510 .enc
= __VECS(bf_cbc_enc_tv_template
),
2511 .dec
= __VECS(bf_cbc_dec_tv_template
)
2515 .alg
= "cbc(camellia)",
2516 .test
= alg_test_skcipher
,
2519 .enc
= __VECS(camellia_cbc_enc_tv_template
),
2520 .dec
= __VECS(camellia_cbc_dec_tv_template
)
2524 .alg
= "cbc(cast5)",
2525 .test
= alg_test_skcipher
,
2528 .enc
= __VECS(cast5_cbc_enc_tv_template
),
2529 .dec
= __VECS(cast5_cbc_dec_tv_template
)
2533 .alg
= "cbc(cast6)",
2534 .test
= alg_test_skcipher
,
2537 .enc
= __VECS(cast6_cbc_enc_tv_template
),
2538 .dec
= __VECS(cast6_cbc_dec_tv_template
)
2543 .test
= alg_test_skcipher
,
2546 .enc
= __VECS(des_cbc_enc_tv_template
),
2547 .dec
= __VECS(des_cbc_dec_tv_template
)
2551 .alg
= "cbc(des3_ede)",
2552 .test
= alg_test_skcipher
,
2556 .enc
= __VECS(des3_ede_cbc_enc_tv_template
),
2557 .dec
= __VECS(des3_ede_cbc_dec_tv_template
)
2561 .alg
= "cbc(serpent)",
2562 .test
= alg_test_skcipher
,
2565 .enc
= __VECS(serpent_cbc_enc_tv_template
),
2566 .dec
= __VECS(serpent_cbc_dec_tv_template
)
2570 .alg
= "cbc(twofish)",
2571 .test
= alg_test_skcipher
,
2574 .enc
= __VECS(tf_cbc_enc_tv_template
),
2575 .dec
= __VECS(tf_cbc_dec_tv_template
)
2579 .alg
= "cbcmac(aes)",
2581 .test
= alg_test_hash
,
2583 .hash
= __VECS(aes_cbcmac_tv_template
)
2587 .test
= alg_test_aead
,
2591 .enc
= __VECS(aes_ccm_enc_tv_template
),
2592 .dec
= __VECS(aes_ccm_dec_tv_template
)
2597 .test
= alg_test_skcipher
,
2600 .enc
= __VECS(chacha20_enc_tv_template
),
2601 .dec
= __VECS(chacha20_enc_tv_template
),
2607 .test
= alg_test_hash
,
2609 .hash
= __VECS(aes_cmac128_tv_template
)
2612 .alg
= "cmac(des3_ede)",
2614 .test
= alg_test_hash
,
2616 .hash
= __VECS(des3_ede_cmac64_tv_template
)
2619 .alg
= "compress_null",
2620 .test
= alg_test_null
,
2623 .test
= alg_test_hash
,
2625 .hash
= __VECS(crc32_tv_template
)
2629 .test
= alg_test_crc32c
,
2632 .hash
= __VECS(crc32c_tv_template
)
2636 .test
= alg_test_hash
,
2639 .hash
= __VECS(crct10dif_tv_template
)
2643 .test
= alg_test_skcipher
,
2647 .enc
= __VECS(aes_ctr_enc_tv_template
),
2648 .dec
= __VECS(aes_ctr_dec_tv_template
)
2652 .alg
= "ctr(blowfish)",
2653 .test
= alg_test_skcipher
,
2656 .enc
= __VECS(bf_ctr_enc_tv_template
),
2657 .dec
= __VECS(bf_ctr_dec_tv_template
)
2661 .alg
= "ctr(camellia)",
2662 .test
= alg_test_skcipher
,
2665 .enc
= __VECS(camellia_ctr_enc_tv_template
),
2666 .dec
= __VECS(camellia_ctr_dec_tv_template
)
2670 .alg
= "ctr(cast5)",
2671 .test
= alg_test_skcipher
,
2674 .enc
= __VECS(cast5_ctr_enc_tv_template
),
2675 .dec
= __VECS(cast5_ctr_dec_tv_template
)
2679 .alg
= "ctr(cast6)",
2680 .test
= alg_test_skcipher
,
2683 .enc
= __VECS(cast6_ctr_enc_tv_template
),
2684 .dec
= __VECS(cast6_ctr_dec_tv_template
)
2689 .test
= alg_test_skcipher
,
2692 .enc
= __VECS(des_ctr_enc_tv_template
),
2693 .dec
= __VECS(des_ctr_dec_tv_template
)
2697 .alg
= "ctr(des3_ede)",
2698 .test
= alg_test_skcipher
,
2702 .enc
= __VECS(des3_ede_ctr_enc_tv_template
),
2703 .dec
= __VECS(des3_ede_ctr_dec_tv_template
)
2707 .alg
= "ctr(serpent)",
2708 .test
= alg_test_skcipher
,
2711 .enc
= __VECS(serpent_ctr_enc_tv_template
),
2712 .dec
= __VECS(serpent_ctr_dec_tv_template
)
2716 .alg
= "ctr(twofish)",
2717 .test
= alg_test_skcipher
,
2720 .enc
= __VECS(tf_ctr_enc_tv_template
),
2721 .dec
= __VECS(tf_ctr_dec_tv_template
)
2725 .alg
= "cts(cbc(aes))",
2726 .test
= alg_test_skcipher
,
2729 .enc
= __VECS(cts_mode_enc_tv_template
),
2730 .dec
= __VECS(cts_mode_dec_tv_template
)
2735 .test
= alg_test_comp
,
2739 .comp
= __VECS(deflate_comp_tv_template
),
2740 .decomp
= __VECS(deflate_decomp_tv_template
)
2745 .test
= alg_test_kpp
,
2748 .kpp
= __VECS(dh_tv_template
)
2751 .alg
= "digest_null",
2752 .test
= alg_test_null
,
2754 .alg
= "drbg_nopr_ctr_aes128",
2755 .test
= alg_test_drbg
,
2758 .drbg
= __VECS(drbg_nopr_ctr_aes128_tv_template
)
2761 .alg
= "drbg_nopr_ctr_aes192",
2762 .test
= alg_test_drbg
,
2765 .drbg
= __VECS(drbg_nopr_ctr_aes192_tv_template
)
2768 .alg
= "drbg_nopr_ctr_aes256",
2769 .test
= alg_test_drbg
,
2772 .drbg
= __VECS(drbg_nopr_ctr_aes256_tv_template
)
2776 * There is no need to specifically test the DRBG with every
2777 * backend cipher -- covered by drbg_nopr_hmac_sha256 test
2779 .alg
= "drbg_nopr_hmac_sha1",
2781 .test
= alg_test_null
,
2783 .alg
= "drbg_nopr_hmac_sha256",
2784 .test
= alg_test_drbg
,
2787 .drbg
= __VECS(drbg_nopr_hmac_sha256_tv_template
)
2790 /* covered by drbg_nopr_hmac_sha256 test */
2791 .alg
= "drbg_nopr_hmac_sha384",
2793 .test
= alg_test_null
,
2795 .alg
= "drbg_nopr_hmac_sha512",
2796 .test
= alg_test_null
,
2799 .alg
= "drbg_nopr_sha1",
2801 .test
= alg_test_null
,
2803 .alg
= "drbg_nopr_sha256",
2804 .test
= alg_test_drbg
,
2807 .drbg
= __VECS(drbg_nopr_sha256_tv_template
)
2810 /* covered by drbg_nopr_sha256 test */
2811 .alg
= "drbg_nopr_sha384",
2813 .test
= alg_test_null
,
2815 .alg
= "drbg_nopr_sha512",
2817 .test
= alg_test_null
,
2819 .alg
= "drbg_pr_ctr_aes128",
2820 .test
= alg_test_drbg
,
2823 .drbg
= __VECS(drbg_pr_ctr_aes128_tv_template
)
2826 /* covered by drbg_pr_ctr_aes128 test */
2827 .alg
= "drbg_pr_ctr_aes192",
2829 .test
= alg_test_null
,
2831 .alg
= "drbg_pr_ctr_aes256",
2833 .test
= alg_test_null
,
2835 .alg
= "drbg_pr_hmac_sha1",
2837 .test
= alg_test_null
,
2839 .alg
= "drbg_pr_hmac_sha256",
2840 .test
= alg_test_drbg
,
2843 .drbg
= __VECS(drbg_pr_hmac_sha256_tv_template
)
2846 /* covered by drbg_pr_hmac_sha256 test */
2847 .alg
= "drbg_pr_hmac_sha384",
2849 .test
= alg_test_null
,
2851 .alg
= "drbg_pr_hmac_sha512",
2852 .test
= alg_test_null
,
2855 .alg
= "drbg_pr_sha1",
2857 .test
= alg_test_null
,
2859 .alg
= "drbg_pr_sha256",
2860 .test
= alg_test_drbg
,
2863 .drbg
= __VECS(drbg_pr_sha256_tv_template
)
2866 /* covered by drbg_pr_sha256 test */
2867 .alg
= "drbg_pr_sha384",
2869 .test
= alg_test_null
,
2871 .alg
= "drbg_pr_sha512",
2873 .test
= alg_test_null
,
2876 .test
= alg_test_skcipher
,
2880 .enc
= __VECS(aes_enc_tv_template
),
2881 .dec
= __VECS(aes_dec_tv_template
)
2885 .alg
= "ecb(anubis)",
2886 .test
= alg_test_skcipher
,
2889 .enc
= __VECS(anubis_enc_tv_template
),
2890 .dec
= __VECS(anubis_dec_tv_template
)
2895 .test
= alg_test_skcipher
,
2898 .enc
= __VECS(arc4_enc_tv_template
),
2899 .dec
= __VECS(arc4_dec_tv_template
)
2903 .alg
= "ecb(blowfish)",
2904 .test
= alg_test_skcipher
,
2907 .enc
= __VECS(bf_enc_tv_template
),
2908 .dec
= __VECS(bf_dec_tv_template
)
2912 .alg
= "ecb(camellia)",
2913 .test
= alg_test_skcipher
,
2916 .enc
= __VECS(camellia_enc_tv_template
),
2917 .dec
= __VECS(camellia_dec_tv_template
)
2921 .alg
= "ecb(cast5)",
2922 .test
= alg_test_skcipher
,
2925 .enc
= __VECS(cast5_enc_tv_template
),
2926 .dec
= __VECS(cast5_dec_tv_template
)
2930 .alg
= "ecb(cast6)",
2931 .test
= alg_test_skcipher
,
2934 .enc
= __VECS(cast6_enc_tv_template
),
2935 .dec
= __VECS(cast6_dec_tv_template
)
2939 .alg
= "ecb(cipher_null)",
2940 .test
= alg_test_null
,
2944 .test
= alg_test_skcipher
,
2947 .enc
= __VECS(des_enc_tv_template
),
2948 .dec
= __VECS(des_dec_tv_template
)
2952 .alg
= "ecb(des3_ede)",
2953 .test
= alg_test_skcipher
,
2957 .enc
= __VECS(des3_ede_enc_tv_template
),
2958 .dec
= __VECS(des3_ede_dec_tv_template
)
2962 .alg
= "ecb(fcrypt)",
2963 .test
= alg_test_skcipher
,
2967 .vecs
= fcrypt_pcbc_enc_tv_template
,
2971 .vecs
= fcrypt_pcbc_dec_tv_template
,
2977 .alg
= "ecb(khazad)",
2978 .test
= alg_test_skcipher
,
2981 .enc
= __VECS(khazad_enc_tv_template
),
2982 .dec
= __VECS(khazad_dec_tv_template
)
2987 .test
= alg_test_skcipher
,
2990 .enc
= __VECS(seed_enc_tv_template
),
2991 .dec
= __VECS(seed_dec_tv_template
)
2995 .alg
= "ecb(serpent)",
2996 .test
= alg_test_skcipher
,
2999 .enc
= __VECS(serpent_enc_tv_template
),
3000 .dec
= __VECS(serpent_dec_tv_template
)
3005 .test
= alg_test_skcipher
,
3008 .enc
= __VECS(tea_enc_tv_template
),
3009 .dec
= __VECS(tea_dec_tv_template
)
3013 .alg
= "ecb(tnepres)",
3014 .test
= alg_test_skcipher
,
3017 .enc
= __VECS(tnepres_enc_tv_template
),
3018 .dec
= __VECS(tnepres_dec_tv_template
)
3022 .alg
= "ecb(twofish)",
3023 .test
= alg_test_skcipher
,
3026 .enc
= __VECS(tf_enc_tv_template
),
3027 .dec
= __VECS(tf_dec_tv_template
)
3032 .test
= alg_test_skcipher
,
3035 .enc
= __VECS(xeta_enc_tv_template
),
3036 .dec
= __VECS(xeta_dec_tv_template
)
3041 .test
= alg_test_skcipher
,
3044 .enc
= __VECS(xtea_enc_tv_template
),
3045 .dec
= __VECS(xtea_dec_tv_template
)
3050 .test
= alg_test_kpp
,
3053 .kpp
= __VECS(ecdh_tv_template
)
3057 .test
= alg_test_aead
,
3061 .enc
= __VECS(aes_gcm_enc_tv_template
),
3062 .dec
= __VECS(aes_gcm_dec_tv_template
)
3067 .test
= alg_test_hash
,
3070 .hash
= __VECS(ghash_tv_template
)
3073 .alg
= "hmac(crc32)",
3074 .test
= alg_test_hash
,
3076 .hash
= __VECS(bfin_crc_tv_template
)
3080 .test
= alg_test_hash
,
3082 .hash
= __VECS(hmac_md5_tv_template
)
3085 .alg
= "hmac(rmd128)",
3086 .test
= alg_test_hash
,
3088 .hash
= __VECS(hmac_rmd128_tv_template
)
3091 .alg
= "hmac(rmd160)",
3092 .test
= alg_test_hash
,
3094 .hash
= __VECS(hmac_rmd160_tv_template
)
3097 .alg
= "hmac(sha1)",
3098 .test
= alg_test_hash
,
3101 .hash
= __VECS(hmac_sha1_tv_template
)
3104 .alg
= "hmac(sha224)",
3105 .test
= alg_test_hash
,
3108 .hash
= __VECS(hmac_sha224_tv_template
)
3111 .alg
= "hmac(sha256)",
3112 .test
= alg_test_hash
,
3115 .hash
= __VECS(hmac_sha256_tv_template
)
3118 .alg
= "hmac(sha3-224)",
3119 .test
= alg_test_hash
,
3122 .hash
= __VECS(hmac_sha3_224_tv_template
)
3125 .alg
= "hmac(sha3-256)",
3126 .test
= alg_test_hash
,
3129 .hash
= __VECS(hmac_sha3_256_tv_template
)
3132 .alg
= "hmac(sha3-384)",
3133 .test
= alg_test_hash
,
3136 .hash
= __VECS(hmac_sha3_384_tv_template
)
3139 .alg
= "hmac(sha3-512)",
3140 .test
= alg_test_hash
,
3143 .hash
= __VECS(hmac_sha3_512_tv_template
)
3146 .alg
= "hmac(sha384)",
3147 .test
= alg_test_hash
,
3150 .hash
= __VECS(hmac_sha384_tv_template
)
3153 .alg
= "hmac(sha512)",
3154 .test
= alg_test_hash
,
3157 .hash
= __VECS(hmac_sha512_tv_template
)
3160 .alg
= "jitterentropy_rng",
3162 .test
= alg_test_null
,
3165 .test
= alg_test_skcipher
,
3169 .enc
= __VECS(aes_kw_enc_tv_template
),
3170 .dec
= __VECS(aes_kw_dec_tv_template
)
3175 .test
= alg_test_skcipher
,
3178 .enc
= __VECS(aes_lrw_enc_tv_template
),
3179 .dec
= __VECS(aes_lrw_dec_tv_template
)
3183 .alg
= "lrw(camellia)",
3184 .test
= alg_test_skcipher
,
3187 .enc
= __VECS(camellia_lrw_enc_tv_template
),
3188 .dec
= __VECS(camellia_lrw_dec_tv_template
)
3192 .alg
= "lrw(cast6)",
3193 .test
= alg_test_skcipher
,
3196 .enc
= __VECS(cast6_lrw_enc_tv_template
),
3197 .dec
= __VECS(cast6_lrw_dec_tv_template
)
3201 .alg
= "lrw(serpent)",
3202 .test
= alg_test_skcipher
,
3205 .enc
= __VECS(serpent_lrw_enc_tv_template
),
3206 .dec
= __VECS(serpent_lrw_dec_tv_template
)
3210 .alg
= "lrw(twofish)",
3211 .test
= alg_test_skcipher
,
3214 .enc
= __VECS(tf_lrw_enc_tv_template
),
3215 .dec
= __VECS(tf_lrw_dec_tv_template
)
3220 .test
= alg_test_comp
,
3224 .comp
= __VECS(lz4_comp_tv_template
),
3225 .decomp
= __VECS(lz4_decomp_tv_template
)
3230 .test
= alg_test_comp
,
3234 .comp
= __VECS(lz4hc_comp_tv_template
),
3235 .decomp
= __VECS(lz4hc_decomp_tv_template
)
3240 .test
= alg_test_comp
,
3244 .comp
= __VECS(lzo_comp_tv_template
),
3245 .decomp
= __VECS(lzo_decomp_tv_template
)
3250 .test
= alg_test_hash
,
3252 .hash
= __VECS(md4_tv_template
)
3256 .test
= alg_test_hash
,
3258 .hash
= __VECS(md5_tv_template
)
3261 .alg
= "michael_mic",
3262 .test
= alg_test_hash
,
3264 .hash
= __VECS(michael_mic_tv_template
)
3268 .test
= alg_test_skcipher
,
3272 .enc
= __VECS(aes_ofb_enc_tv_template
),
3273 .dec
= __VECS(aes_ofb_dec_tv_template
)
3277 .alg
= "pcbc(fcrypt)",
3278 .test
= alg_test_skcipher
,
3281 .enc
= __VECS(fcrypt_pcbc_enc_tv_template
),
3282 .dec
= __VECS(fcrypt_pcbc_dec_tv_template
)
3286 .alg
= "pkcs1pad(rsa,sha224)",
3287 .test
= alg_test_null
,
3290 .alg
= "pkcs1pad(rsa,sha256)",
3291 .test
= alg_test_akcipher
,
3294 .akcipher
= __VECS(pkcs1pad_rsa_tv_template
)
3297 .alg
= "pkcs1pad(rsa,sha384)",
3298 .test
= alg_test_null
,
3301 .alg
= "pkcs1pad(rsa,sha512)",
3302 .test
= alg_test_null
,
3306 .test
= alg_test_hash
,
3308 .hash
= __VECS(poly1305_tv_template
)
3311 .alg
= "rfc3686(ctr(aes))",
3312 .test
= alg_test_skcipher
,
3316 .enc
= __VECS(aes_ctr_rfc3686_enc_tv_template
),
3317 .dec
= __VECS(aes_ctr_rfc3686_dec_tv_template
)
3321 .alg
= "rfc4106(gcm(aes))",
3322 .test
= alg_test_aead
,
3326 .enc
= __VECS(aes_gcm_rfc4106_enc_tv_template
),
3327 .dec
= __VECS(aes_gcm_rfc4106_dec_tv_template
)
3331 .alg
= "rfc4309(ccm(aes))",
3332 .test
= alg_test_aead
,
3336 .enc
= __VECS(aes_ccm_rfc4309_enc_tv_template
),
3337 .dec
= __VECS(aes_ccm_rfc4309_dec_tv_template
)
3341 .alg
= "rfc4543(gcm(aes))",
3342 .test
= alg_test_aead
,
3345 .enc
= __VECS(aes_gcm_rfc4543_enc_tv_template
),
3346 .dec
= __VECS(aes_gcm_rfc4543_dec_tv_template
),
3350 .alg
= "rfc7539(chacha20,poly1305)",
3351 .test
= alg_test_aead
,
3354 .enc
= __VECS(rfc7539_enc_tv_template
),
3355 .dec
= __VECS(rfc7539_dec_tv_template
),
3359 .alg
= "rfc7539esp(chacha20,poly1305)",
3360 .test
= alg_test_aead
,
3363 .enc
= __VECS(rfc7539esp_enc_tv_template
),
3364 .dec
= __VECS(rfc7539esp_dec_tv_template
),
3369 .test
= alg_test_hash
,
3371 .hash
= __VECS(rmd128_tv_template
)
3375 .test
= alg_test_hash
,
3377 .hash
= __VECS(rmd160_tv_template
)
3381 .test
= alg_test_hash
,
3383 .hash
= __VECS(rmd256_tv_template
)
3387 .test
= alg_test_hash
,
3389 .hash
= __VECS(rmd320_tv_template
)
3393 .test
= alg_test_akcipher
,
3396 .akcipher
= __VECS(rsa_tv_template
)
3400 .test
= alg_test_skcipher
,
3403 .enc
= __VECS(salsa20_stream_enc_tv_template
)
3408 .test
= alg_test_hash
,
3411 .hash
= __VECS(sha1_tv_template
)
3415 .test
= alg_test_hash
,
3418 .hash
= __VECS(sha224_tv_template
)
3422 .test
= alg_test_hash
,
3425 .hash
= __VECS(sha256_tv_template
)
3429 .test
= alg_test_hash
,
3432 .hash
= __VECS(sha3_224_tv_template
)
3436 .test
= alg_test_hash
,
3439 .hash
= __VECS(sha3_256_tv_template
)
3443 .test
= alg_test_hash
,
3446 .hash
= __VECS(sha3_384_tv_template
)
3450 .test
= alg_test_hash
,
3453 .hash
= __VECS(sha3_512_tv_template
)
3457 .test
= alg_test_hash
,
3460 .hash
= __VECS(sha384_tv_template
)
3464 .test
= alg_test_hash
,
3467 .hash
= __VECS(sha512_tv_template
)
3471 .test
= alg_test_hash
,
3473 .hash
= __VECS(sm3_tv_template
)
3477 .test
= alg_test_hash
,
3479 .hash
= __VECS(tgr128_tv_template
)
3483 .test
= alg_test_hash
,
3485 .hash
= __VECS(tgr160_tv_template
)
3489 .test
= alg_test_hash
,
3491 .hash
= __VECS(tgr192_tv_template
)
3495 .test
= alg_test_hash
,
3497 .hash
= __VECS(aes_vmac128_tv_template
)
3501 .test
= alg_test_hash
,
3503 .hash
= __VECS(wp256_tv_template
)
3507 .test
= alg_test_hash
,
3509 .hash
= __VECS(wp384_tv_template
)
3513 .test
= alg_test_hash
,
3515 .hash
= __VECS(wp512_tv_template
)
3519 .test
= alg_test_hash
,
3521 .hash
= __VECS(aes_xcbc128_tv_template
)
3525 .test
= alg_test_skcipher
,
3529 .enc
= __VECS(aes_xts_enc_tv_template
),
3530 .dec
= __VECS(aes_xts_dec_tv_template
)
3534 .alg
= "xts(camellia)",
3535 .test
= alg_test_skcipher
,
3538 .enc
= __VECS(camellia_xts_enc_tv_template
),
3539 .dec
= __VECS(camellia_xts_dec_tv_template
)
3543 .alg
= "xts(cast6)",
3544 .test
= alg_test_skcipher
,
3547 .enc
= __VECS(cast6_xts_enc_tv_template
),
3548 .dec
= __VECS(cast6_xts_dec_tv_template
)
3552 .alg
= "xts(serpent)",
3553 .test
= alg_test_skcipher
,
3556 .enc
= __VECS(serpent_xts_enc_tv_template
),
3557 .dec
= __VECS(serpent_xts_dec_tv_template
)
3561 .alg
= "xts(twofish)",
3562 .test
= alg_test_skcipher
,
3565 .enc
= __VECS(tf_xts_enc_tv_template
),
3566 .dec
= __VECS(tf_xts_dec_tv_template
)
3570 .alg
= "zlib-deflate",
3571 .test
= alg_test_comp
,
3575 .comp
= __VECS(zlib_deflate_comp_tv_template
),
3576 .decomp
= __VECS(zlib_deflate_decomp_tv_template
)
3582 static bool alg_test_descs_checked
;
3584 static void alg_test_descs_check_order(void)
3588 /* only check once */
3589 if (alg_test_descs_checked
)
3592 alg_test_descs_checked
= true;
3594 for (i
= 1; i
< ARRAY_SIZE(alg_test_descs
); i
++) {
3595 int diff
= strcmp(alg_test_descs
[i
- 1].alg
,
3596 alg_test_descs
[i
].alg
);
3598 if (WARN_ON(diff
> 0)) {
3599 pr_warn("testmgr: alg_test_descs entries in wrong order: '%s' before '%s'\n",
3600 alg_test_descs
[i
- 1].alg
,
3601 alg_test_descs
[i
].alg
);
3604 if (WARN_ON(diff
== 0)) {
3605 pr_warn("testmgr: duplicate alg_test_descs entry: '%s'\n",
3606 alg_test_descs
[i
].alg
);
3611 static int alg_find_test(const char *alg
)
3614 int end
= ARRAY_SIZE(alg_test_descs
);
3616 while (start
< end
) {
3617 int i
= (start
+ end
) / 2;
3618 int diff
= strcmp(alg_test_descs
[i
].alg
, alg
);
3636 int alg_test(const char *driver
, const char *alg
, u32 type
, u32 mask
)
3642 if (!fips_enabled
&& notests
) {
3643 printk_once(KERN_INFO
"alg: self-tests disabled\n");
3647 alg_test_descs_check_order();
3649 if ((type
& CRYPTO_ALG_TYPE_MASK
) == CRYPTO_ALG_TYPE_CIPHER
) {
3650 char nalg
[CRYPTO_MAX_ALG_NAME
];
3652 if (snprintf(nalg
, sizeof(nalg
), "ecb(%s)", alg
) >=
3654 return -ENAMETOOLONG
;
3656 i
= alg_find_test(nalg
);
3660 if (fips_enabled
&& !alg_test_descs
[i
].fips_allowed
)
3663 rc
= alg_test_cipher(alg_test_descs
+ i
, driver
, type
, mask
);
3667 i
= alg_find_test(alg
);
3668 j
= alg_find_test(driver
);
3672 if (fips_enabled
&& ((i
>= 0 && !alg_test_descs
[i
].fips_allowed
) ||
3673 (j
>= 0 && !alg_test_descs
[j
].fips_allowed
)))
3678 rc
|= alg_test_descs
[i
].test(alg_test_descs
+ i
, driver
,
3680 if (j
>= 0 && j
!= i
)
3681 rc
|= alg_test_descs
[j
].test(alg_test_descs
+ j
, driver
,
3685 if (fips_enabled
&& rc
)
3686 panic("%s: %s alg self test failed in fips mode!\n", driver
, alg
);
3688 if (fips_enabled
&& !rc
)
3689 pr_info("alg: self-tests for %s (%s) passed\n", driver
, alg
);
3694 printk(KERN_INFO
"alg: No test for %s (%s)\n", alg
, driver
);
3700 #endif /* CONFIG_CRYPTO_MANAGER_DISABLE_TESTS */
3702 EXPORT_SYMBOL_GPL(alg_test
);