mirror of
https://github.com/BobTheBlinker/android_kernel_motorola_sm6375.git
synced 2026-10-29 19:21:31 -04:00
Merge git://git.kernel.org/pub/scm/linux/kernel/git/herbert/crypto-2.6
Pull crypto update from Herbert Xu: - CTR(AES) optimisation on x86_64 using "by8" AVX. - arm64 support to ccp - Intel QAT crypto driver - Qualcomm crypto engine driver - x86-64 assembly optimisation for 3DES - CTR(3DES) speed test - move FIPS panic from module.c so that it only triggers on crypto modules - SP800-90A Deterministic Random Bit Generator (drbg). - more test vectors for ghash. - tweak self tests to catch partial block bugs. - misc fixes. * git://git.kernel.org/pub/scm/linux/kernel/git/herbert/crypto-2.6: (94 commits) crypto: drbg - fix failure of generating multiple of 2**16 bytes crypto: ccp - Do not sign extend input data to CCP crypto: testmgr - add missing spaces to drbg error strings crypto: atmel-tdes - Switch to managed version of kzalloc crypto: atmel-sha - Switch to managed version of kzalloc crypto: testmgr - use chunks smaller than algo block size in chunk tests crypto: qat - Fixed SKU1 dev issue crypto: qat - Use hweight for bit counting crypto: qat - Updated print outputs crypto: qat - change ae_num to ae_id crypto: qat - change slice->regions to slice->region crypto: qat - use min_t macro crypto: qat - remove unnecessary parentheses crypto: qat - remove unneeded header crypto: qat - checkpatch blank lines crypto: qat - remove unnecessary return codes crypto: Resolve shadow warnings crypto: ccp - Remove "select OF" from Kconfig crypto: caam - fix DECO RSR polling crypto: qce - Let 'DEV_QCE' depend on both HAS_DMA and HAS_IOMEM ...
This commit is contained in:
commit
3e7a716a92
108 changed files with 20473 additions and 583 deletions
|
|
@ -23,7 +23,8 @@ comment "Crypto core or helper"
|
|||
|
||||
config CRYPTO_FIPS
|
||||
bool "FIPS 200 compliance"
|
||||
depends on CRYPTO_ANSI_CPRNG && !CRYPTO_MANAGER_DISABLE_TESTS
|
||||
depends on (CRYPTO_ANSI_CPRNG || CRYPTO_DRBG) && !CRYPTO_MANAGER_DISABLE_TESTS
|
||||
depends on MODULE_SIG
|
||||
help
|
||||
This options enables the fips boot option which is
|
||||
required if you want to system to operate in a FIPS 200
|
||||
|
|
@ -1019,6 +1020,19 @@ config CRYPTO_DES_SPARC64
|
|||
DES cipher algorithm (FIPS 46-2), and Triple DES EDE (FIPS 46-3),
|
||||
optimized using SPARC64 crypto opcodes.
|
||||
|
||||
config CRYPTO_DES3_EDE_X86_64
|
||||
tristate "Triple DES EDE cipher algorithm (x86-64)"
|
||||
depends on X86 && 64BIT
|
||||
select CRYPTO_ALGAPI
|
||||
select CRYPTO_DES
|
||||
help
|
||||
Triple DES EDE (FIPS 46-3) algorithm.
|
||||
|
||||
This module provides implementation of the Triple DES EDE cipher
|
||||
algorithm that is optimized for x86-64 processors. Two versions of
|
||||
algorithm are provided; regular processing one input block and
|
||||
one that processes three blocks parallel.
|
||||
|
||||
config CRYPTO_FCRYPT
|
||||
tristate "FCrypt cipher algorithm"
|
||||
select CRYPTO_ALGAPI
|
||||
|
|
@ -1380,6 +1394,40 @@ config CRYPTO_ANSI_CPRNG
|
|||
ANSI X9.31 A.2.4. Note that this option must be enabled if
|
||||
CRYPTO_FIPS is selected
|
||||
|
||||
menuconfig CRYPTO_DRBG_MENU
|
||||
tristate "NIST SP800-90A DRBG"
|
||||
help
|
||||
NIST SP800-90A compliant DRBG. In the following submenu, one or
|
||||
more of the DRBG types must be selected.
|
||||
|
||||
if CRYPTO_DRBG_MENU
|
||||
|
||||
config CRYPTO_DRBG_HMAC
|
||||
bool "Enable HMAC DRBG"
|
||||
default y
|
||||
select CRYPTO_HMAC
|
||||
help
|
||||
Enable the HMAC DRBG variant as defined in NIST SP800-90A.
|
||||
|
||||
config CRYPTO_DRBG_HASH
|
||||
bool "Enable Hash DRBG"
|
||||
select CRYPTO_HASH
|
||||
help
|
||||
Enable the Hash DRBG variant as defined in NIST SP800-90A.
|
||||
|
||||
config CRYPTO_DRBG_CTR
|
||||
bool "Enable CTR DRBG"
|
||||
select CRYPTO_AES
|
||||
help
|
||||
Enable the CTR DRBG variant as defined in NIST SP800-90A.
|
||||
|
||||
config CRYPTO_DRBG
|
||||
tristate
|
||||
default CRYPTO_DRBG_MENU if (CRYPTO_DRBG_HMAC || CRYPTO_DRBG_HASH || CRYPTO_DRBG_CTR)
|
||||
select CRYPTO_RNG
|
||||
|
||||
endif # if CRYPTO_DRBG_MENU
|
||||
|
||||
config CRYPTO_USER_API
|
||||
tristate
|
||||
|
||||
|
|
|
|||
|
|
@ -92,6 +92,7 @@ obj-$(CONFIG_CRYPTO_842) += 842.o
|
|||
obj-$(CONFIG_CRYPTO_RNG2) += rng.o
|
||||
obj-$(CONFIG_CRYPTO_RNG2) += krng.o
|
||||
obj-$(CONFIG_CRYPTO_ANSI_CPRNG) += ansi_cprng.o
|
||||
obj-$(CONFIG_CRYPTO_DRBG) += drbg.o
|
||||
obj-$(CONFIG_CRYPTO_TEST) += tcrypt.o
|
||||
obj-$(CONFIG_CRYPTO_GHASH) += ghash-generic.o
|
||||
obj-$(CONFIG_CRYPTO_USER_API) += af_alg.o
|
||||
|
|
|
|||
|
|
@ -41,8 +41,20 @@ static inline int crypto_set_driver_name(struct crypto_alg *alg)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static inline void crypto_check_module_sig(struct module *mod)
|
||||
{
|
||||
#ifdef CONFIG_CRYPTO_FIPS
|
||||
if (fips_enabled && mod && !mod->sig_ok)
|
||||
panic("Module %s signature verification failed in FIPS mode\n",
|
||||
mod->name);
|
||||
#endif
|
||||
return;
|
||||
}
|
||||
|
||||
static int crypto_check_alg(struct crypto_alg *alg)
|
||||
{
|
||||
crypto_check_module_sig(alg->cra_module);
|
||||
|
||||
if (alg->cra_alignmask & (alg->cra_alignmask + 1))
|
||||
return -EINVAL;
|
||||
|
||||
|
|
@ -430,6 +442,8 @@ int crypto_register_template(struct crypto_template *tmpl)
|
|||
|
||||
down_write(&crypto_alg_sem);
|
||||
|
||||
crypto_check_module_sig(tmpl->module);
|
||||
|
||||
list_for_each_entry(q, &crypto_template_list, list) {
|
||||
if (q == tmpl)
|
||||
goto out;
|
||||
|
|
|
|||
|
|
@ -233,7 +233,7 @@ static void cryptd_blkcipher_decrypt(struct crypto_async_request *req, int err)
|
|||
}
|
||||
|
||||
static int cryptd_blkcipher_enqueue(struct ablkcipher_request *req,
|
||||
crypto_completion_t complete)
|
||||
crypto_completion_t compl)
|
||||
{
|
||||
struct cryptd_blkcipher_request_ctx *rctx = ablkcipher_request_ctx(req);
|
||||
struct crypto_ablkcipher *tfm = crypto_ablkcipher_reqtfm(req);
|
||||
|
|
@ -241,7 +241,7 @@ static int cryptd_blkcipher_enqueue(struct ablkcipher_request *req,
|
|||
|
||||
queue = cryptd_get_queue(crypto_ablkcipher_tfm(tfm));
|
||||
rctx->complete = req->base.complete;
|
||||
req->base.complete = complete;
|
||||
req->base.complete = compl;
|
||||
|
||||
return cryptd_enqueue_request(queue, &req->base);
|
||||
}
|
||||
|
|
@ -414,7 +414,7 @@ static int cryptd_hash_setkey(struct crypto_ahash *parent,
|
|||
}
|
||||
|
||||
static int cryptd_hash_enqueue(struct ahash_request *req,
|
||||
crypto_completion_t complete)
|
||||
crypto_completion_t compl)
|
||||
{
|
||||
struct cryptd_hash_request_ctx *rctx = ahash_request_ctx(req);
|
||||
struct crypto_ahash *tfm = crypto_ahash_reqtfm(req);
|
||||
|
|
@ -422,7 +422,7 @@ static int cryptd_hash_enqueue(struct ahash_request *req,
|
|||
cryptd_get_queue(crypto_ahash_tfm(tfm));
|
||||
|
||||
rctx->complete = req->base.complete;
|
||||
req->base.complete = complete;
|
||||
req->base.complete = compl;
|
||||
|
||||
return cryptd_enqueue_request(queue, &req->base);
|
||||
}
|
||||
|
|
@ -667,14 +667,14 @@ static void cryptd_aead_decrypt(struct crypto_async_request *areq, int err)
|
|||
}
|
||||
|
||||
static int cryptd_aead_enqueue(struct aead_request *req,
|
||||
crypto_completion_t complete)
|
||||
crypto_completion_t compl)
|
||||
{
|
||||
struct cryptd_aead_request_ctx *rctx = aead_request_ctx(req);
|
||||
struct crypto_aead *tfm = crypto_aead_reqtfm(req);
|
||||
struct cryptd_queue *queue = cryptd_get_queue(crypto_aead_tfm(tfm));
|
||||
|
||||
rctx->complete = req->base.complete;
|
||||
req->base.complete = complete;
|
||||
req->base.complete = compl;
|
||||
return cryptd_enqueue_request(queue, &req->base);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -859,13 +859,10 @@ static void des_decrypt(struct crypto_tfm *tfm, u8 *dst, const u8 *src)
|
|||
* property.
|
||||
*
|
||||
*/
|
||||
static int des3_ede_setkey(struct crypto_tfm *tfm, const u8 *key,
|
||||
unsigned int keylen)
|
||||
int __des3_ede_setkey(u32 *expkey, u32 *flags, const u8 *key,
|
||||
unsigned int keylen)
|
||||
{
|
||||
const u32 *K = (const u32 *)key;
|
||||
struct des3_ede_ctx *dctx = crypto_tfm_ctx(tfm);
|
||||
u32 *expkey = dctx->expkey;
|
||||
u32 *flags = &tfm->crt_flags;
|
||||
|
||||
if (unlikely(!((K[0] ^ K[2]) | (K[1] ^ K[3])) ||
|
||||
!((K[2] ^ K[4]) | (K[3] ^ K[5]))) &&
|
||||
|
|
@ -880,6 +877,17 @@ static int des3_ede_setkey(struct crypto_tfm *tfm, const u8 *key,
|
|||
|
||||
return 0;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(__des3_ede_setkey);
|
||||
|
||||
static int des3_ede_setkey(struct crypto_tfm *tfm, const u8 *key,
|
||||
unsigned int keylen)
|
||||
{
|
||||
struct des3_ede_ctx *dctx = crypto_tfm_ctx(tfm);
|
||||
u32 *flags = &tfm->crt_flags;
|
||||
u32 *expkey = dctx->expkey;
|
||||
|
||||
return __des3_ede_setkey(expkey, flags, key, keylen);
|
||||
}
|
||||
|
||||
static void des3_ede_encrypt(struct crypto_tfm *tfm, u8 *dst, const u8 *src)
|
||||
{
|
||||
|
|
@ -945,6 +953,8 @@ static void des3_ede_decrypt(struct crypto_tfm *tfm, u8 *dst, const u8 *src)
|
|||
|
||||
static struct crypto_alg des_algs[2] = { {
|
||||
.cra_name = "des",
|
||||
.cra_driver_name = "des-generic",
|
||||
.cra_priority = 100,
|
||||
.cra_flags = CRYPTO_ALG_TYPE_CIPHER,
|
||||
.cra_blocksize = DES_BLOCK_SIZE,
|
||||
.cra_ctxsize = sizeof(struct des_ctx),
|
||||
|
|
@ -958,6 +968,8 @@ static struct crypto_alg des_algs[2] = { {
|
|||
.cia_decrypt = des_decrypt } }
|
||||
}, {
|
||||
.cra_name = "des3_ede",
|
||||
.cra_driver_name = "des3_ede-generic",
|
||||
.cra_priority = 100,
|
||||
.cra_flags = CRYPTO_ALG_TYPE_CIPHER,
|
||||
.cra_blocksize = DES3_EDE_BLOCK_SIZE,
|
||||
.cra_ctxsize = sizeof(struct des3_ede_ctx),
|
||||
|
|
|
|||
2044
crypto/drbg.c
Normal file
2044
crypto/drbg.c
Normal file
File diff suppressed because it is too large
Load diff
|
|
@ -68,7 +68,7 @@ static int eseqiv_givencrypt(struct skcipher_givcrypt_request *req)
|
|||
struct eseqiv_ctx *ctx = crypto_ablkcipher_ctx(geniv);
|
||||
struct eseqiv_request_ctx *reqctx = skcipher_givcrypt_reqctx(req);
|
||||
struct ablkcipher_request *subreq;
|
||||
crypto_completion_t complete;
|
||||
crypto_completion_t compl;
|
||||
void *data;
|
||||
struct scatterlist *osrc, *odst;
|
||||
struct scatterlist *dst;
|
||||
|
|
@ -86,7 +86,7 @@ static int eseqiv_givencrypt(struct skcipher_givcrypt_request *req)
|
|||
ablkcipher_request_set_tfm(subreq, skcipher_geniv_cipher(geniv));
|
||||
|
||||
giv = req->giv;
|
||||
complete = req->creq.base.complete;
|
||||
compl = req->creq.base.complete;
|
||||
data = req->creq.base.data;
|
||||
|
||||
osrc = req->creq.src;
|
||||
|
|
@ -101,11 +101,11 @@ static int eseqiv_givencrypt(struct skcipher_givcrypt_request *req)
|
|||
if (vsrc != giv + ivsize && vdst != giv + ivsize) {
|
||||
giv = PTR_ALIGN((u8 *)reqctx->tail,
|
||||
crypto_ablkcipher_alignmask(geniv) + 1);
|
||||
complete = eseqiv_complete;
|
||||
compl = eseqiv_complete;
|
||||
data = req;
|
||||
}
|
||||
|
||||
ablkcipher_request_set_callback(subreq, req->creq.base.flags, complete,
|
||||
ablkcipher_request_set_callback(subreq, req->creq.base.flags, compl,
|
||||
data);
|
||||
|
||||
sg_init_table(reqctx->src, 2);
|
||||
|
|
|
|||
30
crypto/gcm.c
30
crypto/gcm.c
|
|
@ -228,14 +228,14 @@ static void gcm_hash_final_done(struct crypto_async_request *areq, int err);
|
|||
|
||||
static int gcm_hash_update(struct aead_request *req,
|
||||
struct crypto_gcm_req_priv_ctx *pctx,
|
||||
crypto_completion_t complete,
|
||||
crypto_completion_t compl,
|
||||
struct scatterlist *src,
|
||||
unsigned int len)
|
||||
{
|
||||
struct ahash_request *ahreq = &pctx->u.ahreq;
|
||||
|
||||
ahash_request_set_callback(ahreq, aead_request_flags(req),
|
||||
complete, req);
|
||||
compl, req);
|
||||
ahash_request_set_crypt(ahreq, src, NULL, len);
|
||||
|
||||
return crypto_ahash_update(ahreq);
|
||||
|
|
@ -244,12 +244,12 @@ static int gcm_hash_update(struct aead_request *req,
|
|||
static int gcm_hash_remain(struct aead_request *req,
|
||||
struct crypto_gcm_req_priv_ctx *pctx,
|
||||
unsigned int remain,
|
||||
crypto_completion_t complete)
|
||||
crypto_completion_t compl)
|
||||
{
|
||||
struct ahash_request *ahreq = &pctx->u.ahreq;
|
||||
|
||||
ahash_request_set_callback(ahreq, aead_request_flags(req),
|
||||
complete, req);
|
||||
compl, req);
|
||||
sg_init_one(pctx->src, gcm_zeroes, remain);
|
||||
ahash_request_set_crypt(ahreq, pctx->src, NULL, remain);
|
||||
|
||||
|
|
@ -375,14 +375,14 @@ static void __gcm_hash_assoc_remain_done(struct aead_request *req, int err)
|
|||
{
|
||||
struct crypto_gcm_req_priv_ctx *pctx = crypto_gcm_reqctx(req);
|
||||
struct crypto_gcm_ghash_ctx *gctx = &pctx->ghash_ctx;
|
||||
crypto_completion_t complete;
|
||||
crypto_completion_t compl;
|
||||
unsigned int remain = 0;
|
||||
|
||||
if (!err && gctx->cryptlen) {
|
||||
remain = gcm_remain(gctx->cryptlen);
|
||||
complete = remain ? gcm_hash_crypt_done :
|
||||
compl = remain ? gcm_hash_crypt_done :
|
||||
gcm_hash_crypt_remain_done;
|
||||
err = gcm_hash_update(req, pctx, complete,
|
||||
err = gcm_hash_update(req, pctx, compl,
|
||||
gctx->src, gctx->cryptlen);
|
||||
if (err == -EINPROGRESS || err == -EBUSY)
|
||||
return;
|
||||
|
|
@ -429,14 +429,14 @@ static void gcm_hash_assoc_done(struct crypto_async_request *areq, int err)
|
|||
static void __gcm_hash_init_done(struct aead_request *req, int err)
|
||||
{
|
||||
struct crypto_gcm_req_priv_ctx *pctx = crypto_gcm_reqctx(req);
|
||||
crypto_completion_t complete;
|
||||
crypto_completion_t compl;
|
||||
unsigned int remain = 0;
|
||||
|
||||
if (!err && req->assoclen) {
|
||||
remain = gcm_remain(req->assoclen);
|
||||
complete = remain ? gcm_hash_assoc_done :
|
||||
compl = remain ? gcm_hash_assoc_done :
|
||||
gcm_hash_assoc_remain_done;
|
||||
err = gcm_hash_update(req, pctx, complete,
|
||||
err = gcm_hash_update(req, pctx, compl,
|
||||
req->assoc, req->assoclen);
|
||||
if (err == -EINPROGRESS || err == -EBUSY)
|
||||
return;
|
||||
|
|
@ -462,7 +462,7 @@ static int gcm_hash(struct aead_request *req,
|
|||
struct crypto_gcm_ghash_ctx *gctx = &pctx->ghash_ctx;
|
||||
struct crypto_gcm_ctx *ctx = crypto_tfm_ctx(req->base.tfm);
|
||||
unsigned int remain;
|
||||
crypto_completion_t complete;
|
||||
crypto_completion_t compl;
|
||||
int err;
|
||||
|
||||
ahash_request_set_tfm(ahreq, ctx->ghash);
|
||||
|
|
@ -473,8 +473,8 @@ static int gcm_hash(struct aead_request *req,
|
|||
if (err)
|
||||
return err;
|
||||
remain = gcm_remain(req->assoclen);
|
||||
complete = remain ? gcm_hash_assoc_done : gcm_hash_assoc_remain_done;
|
||||
err = gcm_hash_update(req, pctx, complete, req->assoc, req->assoclen);
|
||||
compl = remain ? gcm_hash_assoc_done : gcm_hash_assoc_remain_done;
|
||||
err = gcm_hash_update(req, pctx, compl, req->assoc, req->assoclen);
|
||||
if (err)
|
||||
return err;
|
||||
if (remain) {
|
||||
|
|
@ -484,8 +484,8 @@ static int gcm_hash(struct aead_request *req,
|
|||
return err;
|
||||
}
|
||||
remain = gcm_remain(gctx->cryptlen);
|
||||
complete = remain ? gcm_hash_crypt_done : gcm_hash_crypt_remain_done;
|
||||
err = gcm_hash_update(req, pctx, complete, gctx->src, gctx->cryptlen);
|
||||
compl = remain ? gcm_hash_crypt_done : gcm_hash_crypt_remain_done;
|
||||
err = gcm_hash_update(req, pctx, compl, gctx->src, gctx->cryptlen);
|
||||
if (err)
|
||||
return err;
|
||||
if (remain) {
|
||||
|
|
|
|||
|
|
@ -20,6 +20,7 @@
|
|||
#include <linux/module.h>
|
||||
#include <linux/crypto.h>
|
||||
#include <linux/vmalloc.h>
|
||||
#include <linux/mm.h>
|
||||
#include <linux/lzo.h>
|
||||
|
||||
struct lzo_ctx {
|
||||
|
|
@ -30,7 +31,10 @@ static int lzo_init(struct crypto_tfm *tfm)
|
|||
{
|
||||
struct lzo_ctx *ctx = crypto_tfm_ctx(tfm);
|
||||
|
||||
ctx->lzo_comp_mem = vmalloc(LZO1X_MEM_COMPRESS);
|
||||
ctx->lzo_comp_mem = kmalloc(LZO1X_MEM_COMPRESS,
|
||||
GFP_KERNEL | __GFP_NOWARN | __GFP_REPEAT);
|
||||
if (!ctx->lzo_comp_mem)
|
||||
ctx->lzo_comp_mem = vmalloc(LZO1X_MEM_COMPRESS);
|
||||
if (!ctx->lzo_comp_mem)
|
||||
return -ENOMEM;
|
||||
|
||||
|
|
@ -41,7 +45,7 @@ static void lzo_exit(struct crypto_tfm *tfm)
|
|||
{
|
||||
struct lzo_ctx *ctx = crypto_tfm_ctx(tfm);
|
||||
|
||||
vfree(ctx->lzo_comp_mem);
|
||||
kvfree(ctx->lzo_comp_mem);
|
||||
}
|
||||
|
||||
static int lzo_compress(struct crypto_tfm *tfm, const u8 *src,
|
||||
|
|
|
|||
|
|
@ -100,7 +100,7 @@ static int seqiv_givencrypt(struct skcipher_givcrypt_request *req)
|
|||
struct crypto_ablkcipher *geniv = skcipher_givcrypt_reqtfm(req);
|
||||
struct seqiv_ctx *ctx = crypto_ablkcipher_ctx(geniv);
|
||||
struct ablkcipher_request *subreq = skcipher_givcrypt_reqctx(req);
|
||||
crypto_completion_t complete;
|
||||
crypto_completion_t compl;
|
||||
void *data;
|
||||
u8 *info;
|
||||
unsigned int ivsize;
|
||||
|
|
@ -108,7 +108,7 @@ static int seqiv_givencrypt(struct skcipher_givcrypt_request *req)
|
|||
|
||||
ablkcipher_request_set_tfm(subreq, skcipher_geniv_cipher(geniv));
|
||||
|
||||
complete = req->creq.base.complete;
|
||||
compl = req->creq.base.complete;
|
||||
data = req->creq.base.data;
|
||||
info = req->creq.info;
|
||||
|
||||
|
|
@ -122,11 +122,11 @@ static int seqiv_givencrypt(struct skcipher_givcrypt_request *req)
|
|||
if (!info)
|
||||
return -ENOMEM;
|
||||
|
||||
complete = seqiv_complete;
|
||||
compl = seqiv_complete;
|
||||
data = req;
|
||||
}
|
||||
|
||||
ablkcipher_request_set_callback(subreq, req->creq.base.flags, complete,
|
||||
ablkcipher_request_set_callback(subreq, req->creq.base.flags, compl,
|
||||
data);
|
||||
ablkcipher_request_set_crypt(subreq, req->creq.src, req->creq.dst,
|
||||
req->creq.nbytes, info);
|
||||
|
|
@ -146,7 +146,7 @@ static int seqiv_aead_givencrypt(struct aead_givcrypt_request *req)
|
|||
struct seqiv_ctx *ctx = crypto_aead_ctx(geniv);
|
||||
struct aead_request *areq = &req->areq;
|
||||
struct aead_request *subreq = aead_givcrypt_reqctx(req);
|
||||
crypto_completion_t complete;
|
||||
crypto_completion_t compl;
|
||||
void *data;
|
||||
u8 *info;
|
||||
unsigned int ivsize;
|
||||
|
|
@ -154,7 +154,7 @@ static int seqiv_aead_givencrypt(struct aead_givcrypt_request *req)
|
|||
|
||||
aead_request_set_tfm(subreq, aead_geniv_base(geniv));
|
||||
|
||||
complete = areq->base.complete;
|
||||
compl = areq->base.complete;
|
||||
data = areq->base.data;
|
||||
info = areq->iv;
|
||||
|
||||
|
|
@ -168,11 +168,11 @@ static int seqiv_aead_givencrypt(struct aead_givcrypt_request *req)
|
|||
if (!info)
|
||||
return -ENOMEM;
|
||||
|
||||
complete = seqiv_aead_complete;
|
||||
compl = seqiv_aead_complete;
|
||||
data = req;
|
||||
}
|
||||
|
||||
aead_request_set_callback(subreq, areq->base.flags, complete, data);
|
||||
aead_request_set_callback(subreq, areq->base.flags, compl, data);
|
||||
aead_request_set_crypt(subreq, areq->src, areq->dst, areq->cryptlen,
|
||||
info);
|
||||
aead_request_set_assoc(subreq, areq->assoc, areq->assoclen);
|
||||
|
|
|
|||
114
crypto/tcrypt.c
114
crypto/tcrypt.c
|
|
@ -47,6 +47,11 @@
|
|||
#define ENCRYPT 1
|
||||
#define DECRYPT 0
|
||||
|
||||
/*
|
||||
* return a string with the driver name
|
||||
*/
|
||||
#define get_driver_name(tfm_type, tfm) crypto_tfm_alg_driver_name(tfm_type ## _tfm(tfm))
|
||||
|
||||
/*
|
||||
* Used by test_cipher_speed()
|
||||
*/
|
||||
|
|
@ -68,13 +73,13 @@ static char *check[] = {
|
|||
};
|
||||
|
||||
static int test_cipher_jiffies(struct blkcipher_desc *desc, int enc,
|
||||
struct scatterlist *sg, int blen, int sec)
|
||||
struct scatterlist *sg, int blen, int secs)
|
||||
{
|
||||
unsigned long start, end;
|
||||
int bcount;
|
||||
int ret;
|
||||
|
||||
for (start = jiffies, end = start + sec * HZ, bcount = 0;
|
||||
for (start = jiffies, end = start + secs * HZ, bcount = 0;
|
||||
time_before(jiffies, end); bcount++) {
|
||||
if (enc)
|
||||
ret = crypto_blkcipher_encrypt(desc, sg, sg, blen);
|
||||
|
|
@ -86,7 +91,7 @@ static int test_cipher_jiffies(struct blkcipher_desc *desc, int enc,
|
|||
}
|
||||
|
||||
printk("%d operations in %d seconds (%ld bytes)\n",
|
||||
bcount, sec, (long)bcount * blen);
|
||||
bcount, secs, (long)bcount * blen);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
@ -138,13 +143,13 @@ out:
|
|||
}
|
||||
|
||||
static int test_aead_jiffies(struct aead_request *req, int enc,
|
||||
int blen, int sec)
|
||||
int blen, int secs)
|
||||
{
|
||||
unsigned long start, end;
|
||||
int bcount;
|
||||
int ret;
|
||||
|
||||
for (start = jiffies, end = start + sec * HZ, bcount = 0;
|
||||
for (start = jiffies, end = start + secs * HZ, bcount = 0;
|
||||
time_before(jiffies, end); bcount++) {
|
||||
if (enc)
|
||||
ret = crypto_aead_encrypt(req);
|
||||
|
|
@ -156,7 +161,7 @@ static int test_aead_jiffies(struct aead_request *req, int enc,
|
|||
}
|
||||
|
||||
printk("%d operations in %d seconds (%ld bytes)\n",
|
||||
bcount, sec, (long)bcount * blen);
|
||||
bcount, secs, (long)bcount * blen);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
@ -260,7 +265,7 @@ static void sg_init_aead(struct scatterlist *sg, char *xbuf[XBUFSIZE],
|
|||
}
|
||||
}
|
||||
|
||||
static void test_aead_speed(const char *algo, int enc, unsigned int sec,
|
||||
static void test_aead_speed(const char *algo, int enc, unsigned int secs,
|
||||
struct aead_speed_template *template,
|
||||
unsigned int tcount, u8 authsize,
|
||||
unsigned int aad_size, u8 *keysize)
|
||||
|
|
@ -305,9 +310,6 @@ static void test_aead_speed(const char *algo, int enc, unsigned int sec,
|
|||
asg = &sg[8];
|
||||
sgout = &asg[8];
|
||||
|
||||
|
||||
printk(KERN_INFO "\ntesting speed of %s %s\n", algo, e);
|
||||
|
||||
tfm = crypto_alloc_aead(algo, 0, 0);
|
||||
|
||||
if (IS_ERR(tfm)) {
|
||||
|
|
@ -316,6 +318,9 @@ static void test_aead_speed(const char *algo, int enc, unsigned int sec,
|
|||
goto out_notfm;
|
||||
}
|
||||
|
||||
printk(KERN_INFO "\ntesting speed of %s (%s) %s\n", algo,
|
||||
get_driver_name(crypto_aead, tfm), e);
|
||||
|
||||
req = aead_request_alloc(tfm, GFP_KERNEL);
|
||||
if (!req) {
|
||||
pr_err("alg: aead: Failed to allocate request for %s\n",
|
||||
|
|
@ -374,8 +379,9 @@ static void test_aead_speed(const char *algo, int enc, unsigned int sec,
|
|||
aead_request_set_crypt(req, sg, sgout, *b_size, iv);
|
||||
aead_request_set_assoc(req, asg, aad_size);
|
||||
|
||||
if (sec)
|
||||
ret = test_aead_jiffies(req, enc, *b_size, sec);
|
||||
if (secs)
|
||||
ret = test_aead_jiffies(req, enc, *b_size,
|
||||
secs);
|
||||
else
|
||||
ret = test_aead_cycles(req, enc, *b_size);
|
||||
|
||||
|
|
@ -405,7 +411,7 @@ out_noxbuf:
|
|||
return;
|
||||
}
|
||||
|
||||
static void test_cipher_speed(const char *algo, int enc, unsigned int sec,
|
||||
static void test_cipher_speed(const char *algo, int enc, unsigned int secs,
|
||||
struct cipher_speed_template *template,
|
||||
unsigned int tcount, u8 *keysize)
|
||||
{
|
||||
|
|
@ -422,8 +428,6 @@ static void test_cipher_speed(const char *algo, int enc, unsigned int sec,
|
|||
else
|
||||
e = "decryption";
|
||||
|
||||
printk("\ntesting speed of %s %s\n", algo, e);
|
||||
|
||||
tfm = crypto_alloc_blkcipher(algo, 0, CRYPTO_ALG_ASYNC);
|
||||
|
||||
if (IS_ERR(tfm)) {
|
||||
|
|
@ -434,6 +438,9 @@ static void test_cipher_speed(const char *algo, int enc, unsigned int sec,
|
|||
desc.tfm = tfm;
|
||||
desc.flags = 0;
|
||||
|
||||
printk(KERN_INFO "\ntesting speed of %s (%s) %s\n", algo,
|
||||
get_driver_name(crypto_blkcipher, tfm), e);
|
||||
|
||||
i = 0;
|
||||
do {
|
||||
|
||||
|
|
@ -483,9 +490,9 @@ static void test_cipher_speed(const char *algo, int enc, unsigned int sec,
|
|||
crypto_blkcipher_set_iv(tfm, iv, iv_len);
|
||||
}
|
||||
|
||||
if (sec)
|
||||
if (secs)
|
||||
ret = test_cipher_jiffies(&desc, enc, sg,
|
||||
*b_size, sec);
|
||||
*b_size, secs);
|
||||
else
|
||||
ret = test_cipher_cycles(&desc, enc, sg,
|
||||
*b_size);
|
||||
|
|
@ -506,13 +513,13 @@ out:
|
|||
|
||||
static int test_hash_jiffies_digest(struct hash_desc *desc,
|
||||
struct scatterlist *sg, int blen,
|
||||
char *out, int sec)
|
||||
char *out, int secs)
|
||||
{
|
||||
unsigned long start, end;
|
||||
int bcount;
|
||||
int ret;
|
||||
|
||||
for (start = jiffies, end = start + sec * HZ, bcount = 0;
|
||||
for (start = jiffies, end = start + secs * HZ, bcount = 0;
|
||||
time_before(jiffies, end); bcount++) {
|
||||
ret = crypto_hash_digest(desc, sg, blen, out);
|
||||
if (ret)
|
||||
|
|
@ -520,22 +527,22 @@ static int test_hash_jiffies_digest(struct hash_desc *desc,
|
|||
}
|
||||
|
||||
printk("%6u opers/sec, %9lu bytes/sec\n",
|
||||
bcount / sec, ((long)bcount * blen) / sec);
|
||||
bcount / secs, ((long)bcount * blen) / secs);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int test_hash_jiffies(struct hash_desc *desc, struct scatterlist *sg,
|
||||
int blen, int plen, char *out, int sec)
|
||||
int blen, int plen, char *out, int secs)
|
||||
{
|
||||
unsigned long start, end;
|
||||
int bcount, pcount;
|
||||
int ret;
|
||||
|
||||
if (plen == blen)
|
||||
return test_hash_jiffies_digest(desc, sg, blen, out, sec);
|
||||
return test_hash_jiffies_digest(desc, sg, blen, out, secs);
|
||||
|
||||
for (start = jiffies, end = start + sec * HZ, bcount = 0;
|
||||
for (start = jiffies, end = start + secs * HZ, bcount = 0;
|
||||
time_before(jiffies, end); bcount++) {
|
||||
ret = crypto_hash_init(desc);
|
||||
if (ret)
|
||||
|
|
@ -552,7 +559,7 @@ static int test_hash_jiffies(struct hash_desc *desc, struct scatterlist *sg,
|
|||
}
|
||||
|
||||
printk("%6u opers/sec, %9lu bytes/sec\n",
|
||||
bcount / sec, ((long)bcount * blen) / sec);
|
||||
bcount / secs, ((long)bcount * blen) / secs);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
|
@ -673,7 +680,7 @@ static void test_hash_sg_init(struct scatterlist *sg)
|
|||
}
|
||||
}
|
||||
|
||||
static void test_hash_speed(const char *algo, unsigned int sec,
|
||||
static void test_hash_speed(const char *algo, unsigned int secs,
|
||||
struct hash_speed *speed)
|
||||
{
|
||||
struct scatterlist sg[TVMEMSIZE];
|
||||
|
|
@ -683,8 +690,6 @@ static void test_hash_speed(const char *algo, unsigned int sec,
|
|||
int i;
|
||||
int ret;
|
||||
|
||||
printk(KERN_INFO "\ntesting speed of %s\n", algo);
|
||||
|
||||
tfm = crypto_alloc_hash(algo, 0, CRYPTO_ALG_ASYNC);
|
||||
|
||||
if (IS_ERR(tfm)) {
|
||||
|
|
@ -693,6 +698,9 @@ static void test_hash_speed(const char *algo, unsigned int sec,
|
|||
return;
|
||||
}
|
||||
|
||||
printk(KERN_INFO "\ntesting speed of %s (%s)\n", algo,
|
||||
get_driver_name(crypto_hash, tfm));
|
||||
|
||||
desc.tfm = tfm;
|
||||
desc.flags = 0;
|
||||
|
||||
|
|
@ -718,9 +726,9 @@ static void test_hash_speed(const char *algo, unsigned int sec,
|
|||
"(%5u byte blocks,%5u bytes per update,%4u updates): ",
|
||||
i, speed[i].blen, speed[i].plen, speed[i].blen / speed[i].plen);
|
||||
|
||||
if (sec)
|
||||
if (secs)
|
||||
ret = test_hash_jiffies(&desc, sg, speed[i].blen,
|
||||
speed[i].plen, output, sec);
|
||||
speed[i].plen, output, secs);
|
||||
else
|
||||
ret = test_hash_cycles(&desc, sg, speed[i].blen,
|
||||
speed[i].plen, output);
|
||||
|
|
@ -765,13 +773,13 @@ static inline int do_one_ahash_op(struct ahash_request *req, int ret)
|
|||
}
|
||||
|
||||
static int test_ahash_jiffies_digest(struct ahash_request *req, int blen,
|
||||
char *out, int sec)
|
||||
char *out, int secs)
|
||||
{
|
||||
unsigned long start, end;
|
||||
int bcount;
|
||||
int ret;
|
||||
|
||||
for (start = jiffies, end = start + sec * HZ, bcount = 0;
|
||||
for (start = jiffies, end = start + secs * HZ, bcount = 0;
|
||||
time_before(jiffies, end); bcount++) {
|
||||
ret = do_one_ahash_op(req, crypto_ahash_digest(req));
|
||||
if (ret)
|
||||
|
|
@ -779,22 +787,22 @@ static int test_ahash_jiffies_digest(struct ahash_request *req, int blen,
|
|||
}
|
||||
|
||||
printk("%6u opers/sec, %9lu bytes/sec\n",
|
||||
bcount / sec, ((long)bcount * blen) / sec);
|
||||
bcount / secs, ((long)bcount * blen) / secs);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int test_ahash_jiffies(struct ahash_request *req, int blen,
|
||||
int plen, char *out, int sec)
|
||||
int plen, char *out, int secs)
|
||||
{
|
||||
unsigned long start, end;
|
||||
int bcount, pcount;
|
||||
int ret;
|
||||
|
||||
if (plen == blen)
|
||||
return test_ahash_jiffies_digest(req, blen, out, sec);
|
||||
return test_ahash_jiffies_digest(req, blen, out, secs);
|
||||
|
||||
for (start = jiffies, end = start + sec * HZ, bcount = 0;
|
||||
for (start = jiffies, end = start + secs * HZ, bcount = 0;
|
||||
time_before(jiffies, end); bcount++) {
|
||||
ret = crypto_ahash_init(req);
|
||||
if (ret)
|
||||
|
|
@ -811,7 +819,7 @@ static int test_ahash_jiffies(struct ahash_request *req, int blen,
|
|||
}
|
||||
|
||||
pr_cont("%6u opers/sec, %9lu bytes/sec\n",
|
||||
bcount / sec, ((long)bcount * blen) / sec);
|
||||
bcount / secs, ((long)bcount * blen) / secs);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
|
@ -911,7 +919,7 @@ out:
|
|||
return 0;
|
||||
}
|
||||
|
||||
static void test_ahash_speed(const char *algo, unsigned int sec,
|
||||
static void test_ahash_speed(const char *algo, unsigned int secs,
|
||||
struct hash_speed *speed)
|
||||
{
|
||||
struct scatterlist sg[TVMEMSIZE];
|
||||
|
|
@ -921,8 +929,6 @@ static void test_ahash_speed(const char *algo, unsigned int sec,
|
|||
static char output[1024];
|
||||
int i, ret;
|
||||
|
||||
printk(KERN_INFO "\ntesting speed of async %s\n", algo);
|
||||
|
||||
tfm = crypto_alloc_ahash(algo, 0, 0);
|
||||
if (IS_ERR(tfm)) {
|
||||
pr_err("failed to load transform for %s: %ld\n",
|
||||
|
|
@ -930,6 +936,9 @@ static void test_ahash_speed(const char *algo, unsigned int sec,
|
|||
return;
|
||||
}
|
||||
|
||||
printk(KERN_INFO "\ntesting speed of async %s (%s)\n", algo,
|
||||
get_driver_name(crypto_ahash, tfm));
|
||||
|
||||
if (crypto_ahash_digestsize(tfm) > sizeof(output)) {
|
||||
pr_err("digestsize(%u) > outputbuffer(%zu)\n",
|
||||
crypto_ahash_digestsize(tfm), sizeof(output));
|
||||
|
|
@ -960,9 +969,9 @@ static void test_ahash_speed(const char *algo, unsigned int sec,
|
|||
|
||||
ahash_request_set_crypt(req, sg, output, speed[i].plen);
|
||||
|
||||
if (sec)
|
||||
if (secs)
|
||||
ret = test_ahash_jiffies(req, speed[i].blen,
|
||||
speed[i].plen, output, sec);
|
||||
speed[i].plen, output, secs);
|
||||
else
|
||||
ret = test_ahash_cycles(req, speed[i].blen,
|
||||
speed[i].plen, output);
|
||||
|
|
@ -994,13 +1003,13 @@ static inline int do_one_acipher_op(struct ablkcipher_request *req, int ret)
|
|||
}
|
||||
|
||||
static int test_acipher_jiffies(struct ablkcipher_request *req, int enc,
|
||||
int blen, int sec)
|
||||
int blen, int secs)
|
||||
{
|
||||
unsigned long start, end;
|
||||
int bcount;
|
||||
int ret;
|
||||
|
||||
for (start = jiffies, end = start + sec * HZ, bcount = 0;
|
||||
for (start = jiffies, end = start + secs * HZ, bcount = 0;
|
||||
time_before(jiffies, end); bcount++) {
|
||||
if (enc)
|
||||
ret = do_one_acipher_op(req,
|
||||
|
|
@ -1014,7 +1023,7 @@ static int test_acipher_jiffies(struct ablkcipher_request *req, int enc,
|
|||
}
|
||||
|
||||
pr_cont("%d operations in %d seconds (%ld bytes)\n",
|
||||
bcount, sec, (long)bcount * blen);
|
||||
bcount, secs, (long)bcount * blen);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
@ -1065,7 +1074,7 @@ out:
|
|||
return ret;
|
||||
}
|
||||
|
||||
static void test_acipher_speed(const char *algo, int enc, unsigned int sec,
|
||||
static void test_acipher_speed(const char *algo, int enc, unsigned int secs,
|
||||
struct cipher_speed_template *template,
|
||||
unsigned int tcount, u8 *keysize)
|
||||
{
|
||||
|
|
@ -1083,8 +1092,6 @@ static void test_acipher_speed(const char *algo, int enc, unsigned int sec,
|
|||
else
|
||||
e = "decryption";
|
||||
|
||||
pr_info("\ntesting speed of async %s %s\n", algo, e);
|
||||
|
||||
init_completion(&tresult.completion);
|
||||
|
||||
tfm = crypto_alloc_ablkcipher(algo, 0, 0);
|
||||
|
|
@ -1095,6 +1102,9 @@ static void test_acipher_speed(const char *algo, int enc, unsigned int sec,
|
|||
return;
|
||||
}
|
||||
|
||||
pr_info("\ntesting speed of async %s (%s) %s\n", algo,
|
||||
get_driver_name(crypto_ablkcipher, tfm), e);
|
||||
|
||||
req = ablkcipher_request_alloc(tfm, GFP_KERNEL);
|
||||
if (!req) {
|
||||
pr_err("tcrypt: skcipher: Failed to allocate request for %s\n",
|
||||
|
|
@ -1168,9 +1178,9 @@ static void test_acipher_speed(const char *algo, int enc, unsigned int sec,
|
|||
|
||||
ablkcipher_request_set_crypt(req, sg, sg, *b_size, iv);
|
||||
|
||||
if (sec)
|
||||
if (secs)
|
||||
ret = test_acipher_jiffies(req, enc,
|
||||
*b_size, sec);
|
||||
*b_size, secs);
|
||||
else
|
||||
ret = test_acipher_cycles(req, enc,
|
||||
*b_size);
|
||||
|
|
@ -1585,6 +1595,12 @@ static int do_test(int m)
|
|||
test_cipher_speed("cbc(des3_ede)", DECRYPT, sec,
|
||||
des3_speed_template, DES3_SPEED_VECTORS,
|
||||
speed_template_24);
|
||||
test_cipher_speed("ctr(des3_ede)", ENCRYPT, sec,
|
||||
des3_speed_template, DES3_SPEED_VECTORS,
|
||||
speed_template_24);
|
||||
test_cipher_speed("ctr(des3_ede)", DECRYPT, sec,
|
||||
des3_speed_template, DES3_SPEED_VECTORS,
|
||||
speed_template_24);
|
||||
break;
|
||||
|
||||
case 202:
|
||||
|
|
|
|||
304
crypto/testmgr.c
304
crypto/testmgr.c
|
|
@ -27,6 +27,7 @@
|
|||
#include <linux/slab.h>
|
||||
#include <linux/string.h>
|
||||
#include <crypto/rng.h>
|
||||
#include <crypto/drbg.h>
|
||||
|
||||
#include "internal.h"
|
||||
|
||||
|
|
@ -108,6 +109,11 @@ struct cprng_test_suite {
|
|||
unsigned int count;
|
||||
};
|
||||
|
||||
struct drbg_test_suite {
|
||||
struct drbg_testvec *vecs;
|
||||
unsigned int count;
|
||||
};
|
||||
|
||||
struct alg_test_desc {
|
||||
const char *alg;
|
||||
int (*test)(const struct alg_test_desc *desc, const char *driver,
|
||||
|
|
@ -121,6 +127,7 @@ struct alg_test_desc {
|
|||
struct pcomp_test_suite pcomp;
|
||||
struct hash_test_suite hash;
|
||||
struct cprng_test_suite cprng;
|
||||
struct drbg_test_suite drbg;
|
||||
} suite;
|
||||
};
|
||||
|
||||
|
|
@ -191,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;
|
||||
|
||||
|
|
@ -222,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;
|
||||
|
|
@ -232,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,
|
||||
|
|
@ -293,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);
|
||||
|
|
@ -312,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) {
|
||||
|
|
@ -365,6 +393,8 @@ out:
|
|||
out_noreq:
|
||||
testmgr_free_buf(xbuf);
|
||||
out_nobuf:
|
||||
kfree(key);
|
||||
kfree(result);
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
|
@ -422,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))
|
||||
|
|
@ -486,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);
|
||||
|
|
@ -587,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) {
|
||||
|
|
@ -769,6 +816,7 @@ out_nooutbuf:
|
|||
out_noaxbuf:
|
||||
testmgr_free_buf(xbuf);
|
||||
out_noxbuf:
|
||||
kfree(key);
|
||||
kfree(iv);
|
||||
return ret;
|
||||
}
|
||||
|
|
@ -1715,6 +1763,100 @@ static int alg_test_cprng(const struct alg_test_desc *desc, const char *driver,
|
|||
return err;
|
||||
}
|
||||
|
||||
|
||||
static int drbg_cavs_test(struct drbg_testvec *test, int pr,
|
||||
const char *driver, u32 type, u32 mask)
|
||||
{
|
||||
int ret = -EAGAIN;
|
||||
struct crypto_rng *drng;
|
||||
struct drbg_test_data test_data;
|
||||
struct drbg_string addtl, pers, testentropy;
|
||||
unsigned char *buf = kzalloc(test->expectedlen, GFP_KERNEL);
|
||||
|
||||
if (!buf)
|
||||
return -ENOMEM;
|
||||
|
||||
drng = crypto_alloc_rng(driver, type, mask);
|
||||
if (IS_ERR(drng)) {
|
||||
printk(KERN_ERR "alg: drbg: could not allocate DRNG handle for "
|
||||
"%s\n", driver);
|
||||
kzfree(buf);
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
test_data.testentropy = &testentropy;
|
||||
drbg_string_fill(&testentropy, test->entropy, test->entropylen);
|
||||
drbg_string_fill(&pers, test->pers, test->perslen);
|
||||
ret = crypto_drbg_reset_test(drng, &pers, &test_data);
|
||||
if (ret) {
|
||||
printk(KERN_ERR "alg: drbg: Failed to reset rng\n");
|
||||
goto outbuf;
|
||||
}
|
||||
|
||||
drbg_string_fill(&addtl, test->addtla, test->addtllen);
|
||||
if (pr) {
|
||||
drbg_string_fill(&testentropy, test->entpra, test->entprlen);
|
||||
ret = crypto_drbg_get_bytes_addtl_test(drng,
|
||||
buf, test->expectedlen, &addtl, &test_data);
|
||||
} else {
|
||||
ret = crypto_drbg_get_bytes_addtl(drng,
|
||||
buf, test->expectedlen, &addtl);
|
||||
}
|
||||
if (ret <= 0) {
|
||||
printk(KERN_ERR "alg: drbg: could not obtain random data for "
|
||||
"driver %s\n", driver);
|
||||
goto outbuf;
|
||||
}
|
||||
|
||||
drbg_string_fill(&addtl, test->addtlb, test->addtllen);
|
||||
if (pr) {
|
||||
drbg_string_fill(&testentropy, test->entprb, test->entprlen);
|
||||
ret = crypto_drbg_get_bytes_addtl_test(drng,
|
||||
buf, test->expectedlen, &addtl, &test_data);
|
||||
} else {
|
||||
ret = crypto_drbg_get_bytes_addtl(drng,
|
||||
buf, test->expectedlen, &addtl);
|
||||
}
|
||||
if (ret <= 0) {
|
||||
printk(KERN_ERR "alg: drbg: could not obtain random data for "
|
||||
"driver %s\n", driver);
|
||||
goto outbuf;
|
||||
}
|
||||
|
||||
ret = memcmp(test->expected, buf, test->expectedlen);
|
||||
|
||||
outbuf:
|
||||
crypto_free_rng(drng);
|
||||
kzfree(buf);
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
static int alg_test_drbg(const struct alg_test_desc *desc, const char *driver,
|
||||
u32 type, u32 mask)
|
||||
{
|
||||
int err = 0;
|
||||
int pr = 0;
|
||||
int i = 0;
|
||||
struct drbg_testvec *template = desc->suite.drbg.vecs;
|
||||
unsigned int tcount = desc->suite.drbg.count;
|
||||
|
||||
if (0 == memcmp(driver, "drbg_pr_", 8))
|
||||
pr = 1;
|
||||
|
||||
for (i = 0; i < tcount; i++) {
|
||||
err = drbg_cavs_test(&template[i], pr, driver, type, mask);
|
||||
if (err) {
|
||||
printk(KERN_ERR "alg: drbg: Test %d failed for %s\n",
|
||||
i, driver);
|
||||
err = -EINVAL;
|
||||
break;
|
||||
}
|
||||
}
|
||||
return err;
|
||||
|
||||
}
|
||||
|
||||
static int alg_test_null(const struct alg_test_desc *desc,
|
||||
const char *driver, u32 type, u32 mask)
|
||||
{
|
||||
|
|
@ -2457,6 +2599,152 @@ static const struct alg_test_desc alg_test_descs[] = {
|
|||
}, {
|
||||
.alg = "digest_null",
|
||||
.test = alg_test_null,
|
||||
}, {
|
||||
.alg = "drbg_nopr_ctr_aes128",
|
||||
.test = alg_test_drbg,
|
||||
.fips_allowed = 1,
|
||||
.suite = {
|
||||
.drbg = {
|
||||
.vecs = drbg_nopr_ctr_aes128_tv_template,
|
||||
.count = ARRAY_SIZE(drbg_nopr_ctr_aes128_tv_template)
|
||||
}
|
||||
}
|
||||
}, {
|
||||
.alg = "drbg_nopr_ctr_aes192",
|
||||
.test = alg_test_drbg,
|
||||
.fips_allowed = 1,
|
||||
.suite = {
|
||||
.drbg = {
|
||||
.vecs = drbg_nopr_ctr_aes192_tv_template,
|
||||
.count = ARRAY_SIZE(drbg_nopr_ctr_aes192_tv_template)
|
||||
}
|
||||
}
|
||||
}, {
|
||||
.alg = "drbg_nopr_ctr_aes256",
|
||||
.test = alg_test_drbg,
|
||||
.fips_allowed = 1,
|
||||
.suite = {
|
||||
.drbg = {
|
||||
.vecs = drbg_nopr_ctr_aes256_tv_template,
|
||||
.count = ARRAY_SIZE(drbg_nopr_ctr_aes256_tv_template)
|
||||
}
|
||||
}
|
||||
}, {
|
||||
/*
|
||||
* There is no need to specifically test the DRBG with every
|
||||
* backend cipher -- covered by drbg_nopr_hmac_sha256 test
|
||||
*/
|
||||
.alg = "drbg_nopr_hmac_sha1",
|
||||
.fips_allowed = 1,
|
||||
.test = alg_test_null,
|
||||
}, {
|
||||
.alg = "drbg_nopr_hmac_sha256",
|
||||
.test = alg_test_drbg,
|
||||
.fips_allowed = 1,
|
||||
.suite = {
|
||||
.drbg = {
|
||||
.vecs = drbg_nopr_hmac_sha256_tv_template,
|
||||
.count =
|
||||
ARRAY_SIZE(drbg_nopr_hmac_sha256_tv_template)
|
||||
}
|
||||
}
|
||||
}, {
|
||||
/* covered by drbg_nopr_hmac_sha256 test */
|
||||
.alg = "drbg_nopr_hmac_sha384",
|
||||
.fips_allowed = 1,
|
||||
.test = alg_test_null,
|
||||
}, {
|
||||
.alg = "drbg_nopr_hmac_sha512",
|
||||
.test = alg_test_null,
|
||||
.fips_allowed = 1,
|
||||
}, {
|
||||
.alg = "drbg_nopr_sha1",
|
||||
.fips_allowed = 1,
|
||||
.test = alg_test_null,
|
||||
}, {
|
||||
.alg = "drbg_nopr_sha256",
|
||||
.test = alg_test_drbg,
|
||||
.fips_allowed = 1,
|
||||
.suite = {
|
||||
.drbg = {
|
||||
.vecs = drbg_nopr_sha256_tv_template,
|
||||
.count = ARRAY_SIZE(drbg_nopr_sha256_tv_template)
|
||||
}
|
||||
}
|
||||
}, {
|
||||
/* covered by drbg_nopr_sha256 test */
|
||||
.alg = "drbg_nopr_sha384",
|
||||
.fips_allowed = 1,
|
||||
.test = alg_test_null,
|
||||
}, {
|
||||
.alg = "drbg_nopr_sha512",
|
||||
.fips_allowed = 1,
|
||||
.test = alg_test_null,
|
||||
}, {
|
||||
.alg = "drbg_pr_ctr_aes128",
|
||||
.test = alg_test_drbg,
|
||||
.fips_allowed = 1,
|
||||
.suite = {
|
||||
.drbg = {
|
||||
.vecs = drbg_pr_ctr_aes128_tv_template,
|
||||
.count = ARRAY_SIZE(drbg_pr_ctr_aes128_tv_template)
|
||||
}
|
||||
}
|
||||
}, {
|
||||
/* covered by drbg_pr_ctr_aes128 test */
|
||||
.alg = "drbg_pr_ctr_aes192",
|
||||
.fips_allowed = 1,
|
||||
.test = alg_test_null,
|
||||
}, {
|
||||
.alg = "drbg_pr_ctr_aes256",
|
||||
.fips_allowed = 1,
|
||||
.test = alg_test_null,
|
||||
}, {
|
||||
.alg = "drbg_pr_hmac_sha1",
|
||||
.fips_allowed = 1,
|
||||
.test = alg_test_null,
|
||||
}, {
|
||||
.alg = "drbg_pr_hmac_sha256",
|
||||
.test = alg_test_drbg,
|
||||
.fips_allowed = 1,
|
||||
.suite = {
|
||||
.drbg = {
|
||||
.vecs = drbg_pr_hmac_sha256_tv_template,
|
||||
.count = ARRAY_SIZE(drbg_pr_hmac_sha256_tv_template)
|
||||
}
|
||||
}
|
||||
}, {
|
||||
/* covered by drbg_pr_hmac_sha256 test */
|
||||
.alg = "drbg_pr_hmac_sha384",
|
||||
.fips_allowed = 1,
|
||||
.test = alg_test_null,
|
||||
}, {
|
||||
.alg = "drbg_pr_hmac_sha512",
|
||||
.test = alg_test_null,
|
||||
.fips_allowed = 1,
|
||||
}, {
|
||||
.alg = "drbg_pr_sha1",
|
||||
.fips_allowed = 1,
|
||||
.test = alg_test_null,
|
||||
}, {
|
||||
.alg = "drbg_pr_sha256",
|
||||
.test = alg_test_drbg,
|
||||
.fips_allowed = 1,
|
||||
.suite = {
|
||||
.drbg = {
|
||||
.vecs = drbg_pr_sha256_tv_template,
|
||||
.count = ARRAY_SIZE(drbg_pr_sha256_tv_template)
|
||||
}
|
||||
}
|
||||
}, {
|
||||
/* covered by drbg_pr_sha256 test */
|
||||
.alg = "drbg_pr_sha384",
|
||||
.fips_allowed = 1,
|
||||
.test = alg_test_null,
|
||||
}, {
|
||||
.alg = "drbg_pr_sha512",
|
||||
.fips_allowed = 1,
|
||||
.test = alg_test_null,
|
||||
}, {
|
||||
.alg = "ecb(__aes-aesni)",
|
||||
.test = alg_test_null,
|
||||
|
|
|
|||
1158
crypto/testmgr.h
1158
crypto/testmgr.h
File diff suppressed because it is too large
Load diff
Loading…
Reference in a new issue