diff options
Diffstat (limited to 'crypto/ansi_cprng.c')
| -rw-r--r-- | crypto/ansi_cprng.c | 77 | 
1 files changed, 34 insertions, 43 deletions
diff --git a/crypto/ansi_cprng.c b/crypto/ansi_cprng.c index 2bc33214284..666f1962a16 100644 --- a/crypto/ansi_cprng.c +++ b/crypto/ansi_cprng.c @@ -83,7 +83,7 @@ static void xor_vectors(unsigned char *in1, unsigned char *in2,  }  /*   * Returns DEFAULT_BLK_SZ bytes of random data per call - * returns 0 if generation succeded, <0 if something went wrong + * returns 0 if generation succeeded, <0 if something went wrong   */  static int _get_more_prng_bytes(struct prng_context *ctx, int cont_test)  { @@ -230,11 +230,11 @@ remainder:  	 */  	if (byte_count < DEFAULT_BLK_SZ) {  empty_rbuf: -		for (; ctx->rand_data_valid < DEFAULT_BLK_SZ; -			ctx->rand_data_valid++) { +		while (ctx->rand_data_valid < DEFAULT_BLK_SZ) {  			*ptr = ctx->rand_data[ctx->rand_data_valid];  			ptr++;  			byte_count--; +			ctx->rand_data_valid++;  			if (byte_count == 0)  				goto done;  		} @@ -382,26 +382,6 @@ static int cprng_reset(struct crypto_rng *tfm, u8 *seed, unsigned int slen)  	return 0;  } -static struct crypto_alg rng_alg = { -	.cra_name		= "stdrng", -	.cra_driver_name	= "ansi_cprng", -	.cra_priority		= 100, -	.cra_flags		= CRYPTO_ALG_TYPE_RNG, -	.cra_ctxsize		= sizeof(struct prng_context), -	.cra_type		= &crypto_rng_type, -	.cra_module		= THIS_MODULE, -	.cra_list		= LIST_HEAD_INIT(rng_alg.cra_list), -	.cra_init		= cprng_init, -	.cra_exit		= cprng_exit, -	.cra_u			= { -		.rng = { -			.rng_make_random	= cprng_get_random, -			.rng_reset		= cprng_reset, -			.seedsize = DEFAULT_PRNG_KSZ + 2*DEFAULT_BLK_SZ, -		} -	} -}; -  #ifdef CONFIG_CRYPTO_FIPS  static int fips_cprng_get_random(struct crypto_rng *tfm, u8 *rdata,  			    unsigned int dlen) @@ -414,10 +394,18 @@ static int fips_cprng_get_random(struct crypto_rng *tfm, u8 *rdata,  static int fips_cprng_reset(struct crypto_rng *tfm, u8 *seed, unsigned int slen)  {  	u8 rdata[DEFAULT_BLK_SZ]; +	u8 *key = seed + DEFAULT_BLK_SZ;  	int rc;  	struct prng_context *prng = crypto_rng_ctx(tfm); +	if (slen < DEFAULT_PRNG_KSZ + DEFAULT_BLK_SZ) +		return -EINVAL; + +	/* fips strictly requires seed != key */ +	if (!memcmp(seed, key, DEFAULT_PRNG_KSZ)) +		return -EINVAL; +  	rc = cprng_reset(tfm, seed, slen);  	if (!rc) @@ -430,8 +418,27 @@ static int fips_cprng_reset(struct crypto_rng *tfm, u8 *seed, unsigned int slen)  out:  	return rc;  } +#endif -static struct crypto_alg fips_rng_alg = { +static struct crypto_alg rng_algs[] = { { +	.cra_name		= "stdrng", +	.cra_driver_name	= "ansi_cprng", +	.cra_priority		= 100, +	.cra_flags		= CRYPTO_ALG_TYPE_RNG, +	.cra_ctxsize		= sizeof(struct prng_context), +	.cra_type		= &crypto_rng_type, +	.cra_module		= THIS_MODULE, +	.cra_init		= cprng_init, +	.cra_exit		= cprng_exit, +	.cra_u			= { +		.rng = { +			.rng_make_random	= cprng_get_random, +			.rng_reset		= cprng_reset, +			.seedsize = DEFAULT_PRNG_KSZ + 2*DEFAULT_BLK_SZ, +		} +	} +#ifdef CONFIG_CRYPTO_FIPS +}, {  	.cra_name		= "fips(ansi_cprng)",  	.cra_driver_name	= "fips_ansi_cprng",  	.cra_priority		= 300, @@ -439,7 +446,6 @@ static struct crypto_alg fips_rng_alg = {  	.cra_ctxsize		= sizeof(struct prng_context),  	.cra_type		= &crypto_rng_type,  	.cra_module		= THIS_MODULE, -	.cra_list		= LIST_HEAD_INIT(rng_alg.cra_list),  	.cra_init		= cprng_init,  	.cra_exit		= cprng_exit,  	.cra_u			= { @@ -449,33 +455,18 @@ static struct crypto_alg fips_rng_alg = {  			.seedsize = DEFAULT_PRNG_KSZ + 2*DEFAULT_BLK_SZ,  		}  	} -};  #endif +} };  /* Module initalization */  static int __init prng_mod_init(void)  { -	int rc = 0; - -	rc = crypto_register_alg(&rng_alg); -#ifdef CONFIG_CRYPTO_FIPS -	if (rc) -		goto out; - -	rc = crypto_register_alg(&fips_rng_alg); - -out: -#endif -	return rc; +	return crypto_register_algs(rng_algs, ARRAY_SIZE(rng_algs));  }  static void __exit prng_mod_fini(void)  { -	crypto_unregister_alg(&rng_alg); -#ifdef CONFIG_CRYPTO_FIPS -	crypto_unregister_alg(&fips_rng_alg); -#endif -	return; +	crypto_unregister_algs(rng_algs, ARRAY_SIZE(rng_algs));  }  MODULE_LICENSE("GPL");  | 
