forked from mirrors/linux
		
	crypto: drbg - use aligned buffers
Hardware cipher implementation may require aligned buffers. All buffers that potentially are processed with a cipher are now aligned. Signed-off-by: Stephan Mueller <smueller@chronox.de> Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
This commit is contained in:
		
							parent
							
								
									3559128521
								
							
						
					
					
						commit
						3cfc3b9721
					
				
					 2 changed files with 27 additions and 20 deletions
				
			
		| 
						 | 
					@ -1139,11 +1139,11 @@ static inline void drbg_dealloc_state(struct drbg_state *drbg)
 | 
				
			||||||
	if (!drbg)
 | 
						if (!drbg)
 | 
				
			||||||
		return;
 | 
							return;
 | 
				
			||||||
	kzfree(drbg->V);
 | 
						kzfree(drbg->V);
 | 
				
			||||||
	drbg->V = NULL;
 | 
						drbg->Vbuf = NULL;
 | 
				
			||||||
	kzfree(drbg->C);
 | 
						kzfree(drbg->C);
 | 
				
			||||||
	drbg->C = NULL;
 | 
						drbg->Cbuf = NULL;
 | 
				
			||||||
	kzfree(drbg->scratchpad);
 | 
						kzfree(drbg->scratchpadbuf);
 | 
				
			||||||
	drbg->scratchpad = NULL;
 | 
						drbg->scratchpadbuf = NULL;
 | 
				
			||||||
	drbg->reseed_ctr = 0;
 | 
						drbg->reseed_ctr = 0;
 | 
				
			||||||
	drbg->d_ops = NULL;
 | 
						drbg->d_ops = NULL;
 | 
				
			||||||
	drbg->core = NULL;
 | 
						drbg->core = NULL;
 | 
				
			||||||
| 
						 | 
					@ -1179,12 +1179,18 @@ static inline int drbg_alloc_state(struct drbg_state *drbg)
 | 
				
			||||||
		goto err;
 | 
							goto err;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	drbg->V = kmalloc(drbg_statelen(drbg), GFP_KERNEL);
 | 
						ret = drbg->d_ops->crypto_init(drbg);
 | 
				
			||||||
	if (!drbg->V)
 | 
						if (ret < 0)
 | 
				
			||||||
		goto err;
 | 
					 | 
				
			||||||
	drbg->C = kmalloc(drbg_statelen(drbg), GFP_KERNEL);
 | 
					 | 
				
			||||||
	if (!drbg->C)
 | 
					 | 
				
			||||||
		goto err;
 | 
							goto err;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						drbg->Vbuf = kmalloc(drbg_statelen(drbg) + ret, GFP_KERNEL);
 | 
				
			||||||
 | 
						if (!drbg->Vbuf)
 | 
				
			||||||
 | 
							goto fini;
 | 
				
			||||||
 | 
						drbg->V = PTR_ALIGN(drbg->Vbuf, ret + 1);
 | 
				
			||||||
 | 
						drbg->Cbuf = kmalloc(drbg_statelen(drbg) + ret, GFP_KERNEL);
 | 
				
			||||||
 | 
						if (!drbg->Cbuf)
 | 
				
			||||||
 | 
							goto fini;
 | 
				
			||||||
 | 
						drbg->C = PTR_ALIGN(drbg->Cbuf, ret + 1);
 | 
				
			||||||
	/* scratchpad is only generated for CTR and Hash */
 | 
						/* scratchpad is only generated for CTR and Hash */
 | 
				
			||||||
	if (drbg->core->flags & DRBG_HMAC)
 | 
						if (drbg->core->flags & DRBG_HMAC)
 | 
				
			||||||
		sb_size = 0;
 | 
							sb_size = 0;
 | 
				
			||||||
| 
						 | 
					@ -1198,13 +1204,16 @@ static inline int drbg_alloc_state(struct drbg_state *drbg)
 | 
				
			||||||
		sb_size = drbg_statelen(drbg) + drbg_blocklen(drbg);
 | 
							sb_size = drbg_statelen(drbg) + drbg_blocklen(drbg);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (0 < sb_size) {
 | 
						if (0 < sb_size) {
 | 
				
			||||||
		drbg->scratchpad = kzalloc(sb_size, GFP_KERNEL);
 | 
							drbg->scratchpadbuf = kzalloc(sb_size + ret, GFP_KERNEL);
 | 
				
			||||||
		if (!drbg->scratchpad)
 | 
							if (!drbg->scratchpadbuf)
 | 
				
			||||||
			goto err;
 | 
								goto fini;
 | 
				
			||||||
 | 
							drbg->scratchpad = PTR_ALIGN(drbg->scratchpadbuf, ret + 1);
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	return 0;
 | 
						return 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					fini:
 | 
				
			||||||
 | 
						drbg->d_ops->crypto_fini(drbg);
 | 
				
			||||||
err:
 | 
					err:
 | 
				
			||||||
	drbg_dealloc_state(drbg);
 | 
						drbg_dealloc_state(drbg);
 | 
				
			||||||
	return ret;
 | 
						return ret;
 | 
				
			||||||
| 
						 | 
					@ -1472,10 +1481,6 @@ static int drbg_instantiate(struct drbg_state *drbg, struct drbg_string *pers,
 | 
				
			||||||
		if (ret)
 | 
							if (ret)
 | 
				
			||||||
			goto unlock;
 | 
								goto unlock;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		ret = -EFAULT;
 | 
					 | 
				
			||||||
		if (drbg->d_ops->crypto_init(drbg))
 | 
					 | 
				
			||||||
			goto err;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		ret = drbg_prepare_hrng(drbg);
 | 
							ret = drbg_prepare_hrng(drbg);
 | 
				
			||||||
		if (ret)
 | 
							if (ret)
 | 
				
			||||||
			goto free_everything;
 | 
								goto free_everything;
 | 
				
			||||||
| 
						 | 
					@ -1499,8 +1504,6 @@ static int drbg_instantiate(struct drbg_state *drbg, struct drbg_string *pers,
 | 
				
			||||||
	mutex_unlock(&drbg->drbg_mutex);
 | 
						mutex_unlock(&drbg->drbg_mutex);
 | 
				
			||||||
	return ret;
 | 
						return ret;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
err:
 | 
					 | 
				
			||||||
	drbg_dealloc_state(drbg);
 | 
					 | 
				
			||||||
unlock:
 | 
					unlock:
 | 
				
			||||||
	mutex_unlock(&drbg->drbg_mutex);
 | 
						mutex_unlock(&drbg->drbg_mutex);
 | 
				
			||||||
	return ret;
 | 
						return ret;
 | 
				
			||||||
| 
						 | 
					@ -1585,7 +1588,8 @@ static int drbg_init_hash_kernel(struct drbg_state *drbg)
 | 
				
			||||||
	sdesc->shash.tfm = tfm;
 | 
						sdesc->shash.tfm = tfm;
 | 
				
			||||||
	sdesc->shash.flags = 0;
 | 
						sdesc->shash.flags = 0;
 | 
				
			||||||
	drbg->priv_data = sdesc;
 | 
						drbg->priv_data = sdesc;
 | 
				
			||||||
	return 0;
 | 
					
 | 
				
			||||||
 | 
						return crypto_shash_alignmask(tfm);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static int drbg_fini_hash_kernel(struct drbg_state *drbg)
 | 
					static int drbg_fini_hash_kernel(struct drbg_state *drbg)
 | 
				
			||||||
| 
						 | 
					@ -1705,7 +1709,7 @@ static int drbg_init_sym_kernel(struct drbg_state *drbg)
 | 
				
			||||||
	drbg->ctr_null_value = (u8 *)PTR_ALIGN(drbg->ctr_null_value_buf,
 | 
						drbg->ctr_null_value = (u8 *)PTR_ALIGN(drbg->ctr_null_value_buf,
 | 
				
			||||||
					       alignmask + 1);
 | 
										       alignmask + 1);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	return 0;
 | 
						return alignmask;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void drbg_kcapi_symsetkey(struct drbg_state *drbg,
 | 
					static void drbg_kcapi_symsetkey(struct drbg_state *drbg,
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -108,13 +108,16 @@ struct drbg_test_data {
 | 
				
			||||||
struct drbg_state {
 | 
					struct drbg_state {
 | 
				
			||||||
	struct mutex drbg_mutex;	/* lock around DRBG */
 | 
						struct mutex drbg_mutex;	/* lock around DRBG */
 | 
				
			||||||
	unsigned char *V;	/* internal state 10.1.1.1 1a) */
 | 
						unsigned char *V;	/* internal state 10.1.1.1 1a) */
 | 
				
			||||||
 | 
						unsigned char *Vbuf;
 | 
				
			||||||
	/* hash: static value 10.1.1.1 1b) hmac / ctr: key */
 | 
						/* hash: static value 10.1.1.1 1b) hmac / ctr: key */
 | 
				
			||||||
	unsigned char *C;
 | 
						unsigned char *C;
 | 
				
			||||||
 | 
						unsigned char *Cbuf;
 | 
				
			||||||
	/* Number of RNG requests since last reseed -- 10.1.1.1 1c) */
 | 
						/* Number of RNG requests since last reseed -- 10.1.1.1 1c) */
 | 
				
			||||||
	size_t reseed_ctr;
 | 
						size_t reseed_ctr;
 | 
				
			||||||
	size_t reseed_threshold;
 | 
						size_t reseed_threshold;
 | 
				
			||||||
	 /* some memory the DRBG can use for its operation */
 | 
						 /* some memory the DRBG can use for its operation */
 | 
				
			||||||
	unsigned char *scratchpad;
 | 
						unsigned char *scratchpad;
 | 
				
			||||||
 | 
						unsigned char *scratchpadbuf;
 | 
				
			||||||
	void *priv_data;	/* Cipher handle */
 | 
						void *priv_data;	/* Cipher handle */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	struct crypto_skcipher *ctr_handle;	/* CTR mode cipher handle */
 | 
						struct crypto_skcipher *ctr_handle;	/* CTR mode cipher handle */
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in a new issue