@ -190,55 +190,12 @@ static inline unsigned int ahash_align_buffer_size(unsigned len,
return len + ( mask & ~ ( crypto_tfm_ctx_alignment ( ) - 1 ) ) ;
}
static void ahash_op_unaligned_finish ( struct ahash_request * req , int err )
{
struct ahash_request_priv * priv = req - > priv ;
if ( err = = - EINPROGRESS )
return ;
if ( ! err )
memcpy ( priv - > result , req - > result ,
crypto_ahash_digestsize ( crypto_ahash_reqtfm ( req ) ) ) ;
/* Restore the original crypto request. */
req - > result = priv - > result ;
req - > base . complete = priv - > complete ;
req - > base . data = priv - > data ;
req - > priv = NULL ;
/* Free the req->priv.priv from the ADJUSTED request. */
kzfree ( priv ) ;
}
static void ahash_op_unaligned_done ( struct crypto_async_request * req , int err )
{
struct ahash_request * areq = req - > data ;
/*
* Restore the original request , see ahash_op_unaligned ( ) for what
* goes where .
*
* The " struct ahash_request *req " here is in fact the " req.base "
* from the ADJUSTED request from ahash_op_unaligned ( ) , thus as it
* is a pointer to self , it is also the ADJUSTED " req " .
*/
/* First copy areq->result into areq->priv.result */
ahash_op_unaligned_finish ( areq , err ) ;
/* Complete the ORIGINAL request. */
areq - > base . complete ( & areq - > base , err ) ;
}
static int ahash_op_unaligned ( struct ahash_request * req ,
int ( * op ) ( struct ahash_request * ) )
static int ahash_save_req ( struct ahash_request * req , crypto_completion_t cplt )
{
struct crypto_ahash * tfm = crypto_ahash_reqtfm ( req ) ;
unsigned long alignmask = crypto_ahash_alignmask ( tfm ) ;
unsigned int ds = crypto_ahash_digestsize ( tfm ) ;
struct ahash_request_priv * priv ;
int err ;
priv = kmalloc ( sizeof ( * priv ) + ahash_align_buffer_size ( ds , alignmask ) ,
( req - > base . flags & CRYPTO_TFM_REQ_MAY_SLEEP ) ?
@ -281,10 +238,70 @@ static int ahash_op_unaligned(struct ahash_request *req,
*/
req - > result = PTR_ALIGN ( ( u8 * ) priv - > ubuf , alignmask + 1 ) ;
req - > base . complete = ahash_op_unaligned_done ;
req - > base . complete = cplt ;
req - > base . data = req ;
req - > priv = priv ;
return 0 ;
}
static void ahash_restore_req ( struct ahash_request * req )
{
struct ahash_request_priv * priv = req - > priv ;
/* Restore the original crypto request. */
req - > result = priv - > result ;
req - > base . complete = priv - > complete ;
req - > base . data = priv - > data ;
req - > priv = NULL ;
/* Free the req->priv.priv from the ADJUSTED request. */
kzfree ( priv ) ;
}
static void ahash_op_unaligned_finish ( struct ahash_request * req , int err )
{
struct ahash_request_priv * priv = req - > priv ;
if ( err = = - EINPROGRESS )
return ;
if ( ! err )
memcpy ( priv - > result , req - > result ,
crypto_ahash_digestsize ( crypto_ahash_reqtfm ( req ) ) ) ;
ahash_restore_req ( req ) ;
}
static void ahash_op_unaligned_done ( struct crypto_async_request * req , int err )
{
struct ahash_request * areq = req - > data ;
/*
* Restore the original request , see ahash_op_unaligned ( ) for what
* goes where .
*
* The " struct ahash_request *req " here is in fact the " req.base "
* from the ADJUSTED request from ahash_op_unaligned ( ) , thus as it
* is a pointer to self , it is also the ADJUSTED " req " .
*/
/* First copy req->result into req->priv.result */
ahash_op_unaligned_finish ( areq , err ) ;
/* Complete the ORIGINAL request. */
areq - > base . complete ( & areq - > base , err ) ;
}
static int ahash_op_unaligned ( struct ahash_request * req ,
int ( * op ) ( struct ahash_request * ) )
{
int err ;
err = ahash_save_req ( req , ahash_op_unaligned_done ) ;
if ( err )
return err ;
err = op ( req ) ;
ahash_op_unaligned_finish ( req , err ) ;