@ -258,7 +258,10 @@ static int drbg_kcapi_sym(struct drbg_state *drbg, unsigned char *outval,
const struct drbg_string * in ) ;
static int drbg_init_sym_kernel ( struct drbg_state * drbg ) ;
static int drbg_fini_sym_kernel ( struct drbg_state * drbg ) ;
static int drbg_kcapi_sym_ctr ( struct drbg_state * drbg , u8 * outbuf , u32 outlen ) ;
static int drbg_kcapi_sym_ctr ( struct drbg_state * drbg ,
u8 * inbuf , u32 inbuflen ,
u8 * outbuf , u32 outlen ) ;
# define DRBG_CTR_NULL_LEN 128
/* BCC function for CTR DRBG as defined in 10.4.3 */
static int drbg_ctr_bcc ( struct drbg_state * drbg ,
@ -481,8 +484,6 @@ static int drbg_ctr_update(struct drbg_state *drbg, struct list_head *seed,
unsigned char * temp = drbg - > scratchpad ;
unsigned char * df_data = drbg - > scratchpad + drbg_statelen ( drbg ) +
drbg_blocklen ( drbg ) ;
unsigned char * temp_p , * df_data_p ; /* pointer to iterate over buffers */
unsigned int len = 0 ;
if ( 3 > reseed )
memset ( df_data , 0 , drbg_statelen ( drbg ) ) ;
@ -510,18 +511,11 @@ static int drbg_ctr_update(struct drbg_state *drbg, struct list_head *seed,
goto out ;
}
ret = drbg_kcapi_sym_ctr ( drbg , temp , drbg_statelen ( drbg ) ) ;
ret = drbg_kcapi_sym_ctr ( drbg , df_data , drbg_statelen ( drbg ) ,
temp , drbg_statelen ( drbg ) ) ;
if ( ret )
return ret ;
/* 10.2.1.2 step 4 */
temp_p = temp ;
df_data_p = df_data ;
for ( len = 0 ; len < drbg_statelen ( drbg ) ; len + + ) {
* temp_p ^ = * df_data_p ;
df_data_p + + ; temp_p + + ;
}
/* 10.2.1.2 step 5 */
memcpy ( drbg - > C , temp , drbg_keylen ( drbg ) ) ;
ret = crypto_skcipher_setkey ( drbg - > ctr_handle , drbg - > C ,
@ -561,7 +555,8 @@ static int drbg_ctr_generate(struct drbg_state *drbg,
}
/* 10.2.1.5.2 step 4.1 */
ret = drbg_kcapi_sym_ctr ( drbg , buf , len ) ;
ret = drbg_kcapi_sym_ctr ( drbg , drbg - > ctr_null_value , DRBG_CTR_NULL_LEN ,
buf , len ) ;
if ( ret )
return ret ;
@ -1657,7 +1652,6 @@ static void drbg_skcipher_cb(struct crypto_async_request *req, int error)
complete ( & drbg - > ctr_completion ) ;
}
# define DRBG_CTR_NULL_LEN 128
static int drbg_init_sym_kernel ( struct drbg_state * drbg )
{
struct crypto_cipher * tfm ;
@ -1733,14 +1727,16 @@ static int drbg_kcapi_sym(struct drbg_state *drbg, unsigned char *outval,
return 0 ;
}
static int drbg_kcapi_sym_ctr ( struct drbg_state * drbg , u8 * outbuf , u32 outlen )
static int drbg_kcapi_sym_ctr ( struct drbg_state * drbg ,
u8 * inbuf , u32 inlen ,
u8 * outbuf , u32 outlen )
{
struct scatterlist sg_in ;
sg_init_one ( & sg_in , drbg - > ctr_null_value , DRBG_CTR_NULL_LEN ) ;
sg_init_one ( & sg_in , inbuf , inlen ) ;
while ( outlen ) {
u32 cryptlen = min_t ( u32 , outlen , DRBG_CTR_NULL_LEN ) ;
u32 cryptlen = min_t ( u32 , inlen , outlen ) ;
struct scatterlist sg_out ;
int ret ;