2008-07-10 12:01:22 +04:00
/*
* Hash : Hash algorithms under the crypto API
*
* Copyright ( c ) 2008 Herbert Xu < herbert @ gondor . apana . org . au >
*
* This program is free software ; you can redistribute it and / or modify it
* under the terms of the GNU General Public License as published by the Free
* Software Foundation ; either version 2 of the License , or ( at your option )
* any later version .
*
*/
# ifndef _CRYPTO_HASH_H
# define _CRYPTO_HASH_H
# include <linux/crypto.h>
2009-07-14 08:28:26 +04:00
struct crypto_ahash ;
struct hash_alg_common {
unsigned int digestsize ;
unsigned int statesize ;
struct crypto_alg base ;
} ;
struct ahash_request {
struct crypto_async_request base ;
unsigned int nbytes ;
struct scatterlist * src ;
u8 * result ;
2009-07-15 08:40:40 +04:00
/* This field may only be used by the ahash API code. */
void * priv ;
2009-07-14 08:28:26 +04:00
void * __ctx [ ] CRYPTO_MINALIGN_ATTR ;
} ;
struct ahash_alg {
int ( * init ) ( struct ahash_request * req ) ;
int ( * update ) ( struct ahash_request * req ) ;
int ( * final ) ( struct ahash_request * req ) ;
int ( * finup ) ( struct ahash_request * req ) ;
int ( * digest ) ( struct ahash_request * req ) ;
int ( * export ) ( struct ahash_request * req , void * out ) ;
int ( * import ) ( struct ahash_request * req , const void * in ) ;
int ( * setkey ) ( struct crypto_ahash * tfm , const u8 * key ,
unsigned int keylen ) ;
struct hash_alg_common halg ;
} ;
2008-08-31 09:47:27 +04:00
struct shash_desc {
struct crypto_shash * tfm ;
u32 flags ;
void * __ctx [ ] CRYPTO_MINALIGN_ATTR ;
} ;
struct shash_alg {
int ( * init ) ( struct shash_desc * desc ) ;
int ( * update ) ( struct shash_desc * desc , const u8 * data ,
unsigned int len ) ;
int ( * final ) ( struct shash_desc * desc , u8 * out ) ;
int ( * finup ) ( struct shash_desc * desc , const u8 * data ,
unsigned int len , u8 * out ) ;
int ( * digest ) ( struct shash_desc * desc , const u8 * data ,
unsigned int len , u8 * out ) ;
2009-07-09 16:30:57 +04:00
int ( * export ) ( struct shash_desc * desc , void * out ) ;
int ( * import ) ( struct shash_desc * desc , const void * in ) ;
2008-08-31 09:47:27 +04:00
int ( * setkey ) ( struct crypto_shash * tfm , const u8 * key ,
unsigned int keylen ) ;
unsigned int descsize ;
2009-07-14 08:28:26 +04:00
/* These fields must match hash_alg_common. */
2009-07-15 17:16:05 +04:00
unsigned int digestsize
__attribute__ ( ( aligned ( __alignof__ ( struct hash_alg_common ) ) ) ) ;
2009-07-09 16:30:57 +04:00
unsigned int statesize ;
2008-08-31 09:47:27 +04:00
struct crypto_alg base ;
} ;
2008-07-10 12:01:22 +04:00
struct crypto_ahash {
2009-07-14 08:28:26 +04:00
int ( * init ) ( struct ahash_request * req ) ;
int ( * update ) ( struct ahash_request * req ) ;
int ( * final ) ( struct ahash_request * req ) ;
int ( * finup ) ( struct ahash_request * req ) ;
int ( * digest ) ( struct ahash_request * req ) ;
int ( * export ) ( struct ahash_request * req , void * out ) ;
int ( * import ) ( struct ahash_request * req , const void * in ) ;
int ( * setkey ) ( struct crypto_ahash * tfm , const u8 * key ,
unsigned int keylen ) ;
unsigned int reqsize ;
2008-07-10 12:01:22 +04:00
struct crypto_tfm base ;
} ;
2008-08-31 09:47:27 +04:00
struct crypto_shash {
2009-07-14 08:50:12 +04:00
unsigned int descsize ;
2008-08-31 09:47:27 +04:00
struct crypto_tfm base ;
} ;
2008-07-10 12:01:22 +04:00
static inline struct crypto_ahash * __crypto_ahash_cast ( struct crypto_tfm * tfm )
{
2009-07-14 08:28:26 +04:00
return container_of ( tfm , struct crypto_ahash , base ) ;
2008-07-10 12:01:22 +04:00
}
2009-07-14 08:28:26 +04:00
struct crypto_ahash * crypto_alloc_ahash ( const char * alg_name , u32 type ,
u32 mask ) ;
2008-07-10 12:01:22 +04:00
static inline struct crypto_tfm * crypto_ahash_tfm ( struct crypto_ahash * tfm )
{
return & tfm - > base ;
}
static inline void crypto_free_ahash ( struct crypto_ahash * tfm )
{
2009-07-14 08:28:26 +04:00
crypto_destroy_tfm ( tfm , crypto_ahash_tfm ( tfm ) ) ;
2008-07-10 12:01:22 +04:00
}
static inline unsigned int crypto_ahash_alignmask (
struct crypto_ahash * tfm )
{
return crypto_tfm_alg_alignmask ( crypto_ahash_tfm ( tfm ) ) ;
}
2009-07-14 08:28:26 +04:00
static inline struct hash_alg_common * __crypto_hash_alg_common (
struct crypto_alg * alg )
{
return container_of ( alg , struct hash_alg_common , base ) ;
}
static inline struct hash_alg_common * crypto_hash_alg_common (
struct crypto_ahash * tfm )
2008-07-10 12:01:22 +04:00
{
2009-07-14 08:28:26 +04:00
return __crypto_hash_alg_common ( crypto_ahash_tfm ( tfm ) - > __crt_alg ) ;
2008-07-10 12:01:22 +04:00
}
static inline unsigned int crypto_ahash_digestsize ( struct crypto_ahash * tfm )
{
2009-07-14 16:29:57 +04:00
return crypto_hash_alg_common ( tfm ) - > digestsize ;
2009-07-14 08:28:26 +04:00
}
static inline unsigned int crypto_ahash_statesize ( struct crypto_ahash * tfm )
{
return crypto_hash_alg_common ( tfm ) - > statesize ;
2008-07-10 12:01:22 +04:00
}
static inline u32 crypto_ahash_get_flags ( struct crypto_ahash * tfm )
{
return crypto_tfm_get_flags ( crypto_ahash_tfm ( tfm ) ) ;
}
static inline void crypto_ahash_set_flags ( struct crypto_ahash * tfm , u32 flags )
{
crypto_tfm_set_flags ( crypto_ahash_tfm ( tfm ) , flags ) ;
}
static inline void crypto_ahash_clear_flags ( struct crypto_ahash * tfm , u32 flags )
{
crypto_tfm_clear_flags ( crypto_ahash_tfm ( tfm ) , flags ) ;
}
static inline struct crypto_ahash * crypto_ahash_reqtfm (
struct ahash_request * req )
{
return __crypto_ahash_cast ( req - > base . tfm ) ;
}
static inline unsigned int crypto_ahash_reqsize ( struct crypto_ahash * tfm )
{
2009-07-14 08:28:26 +04:00
return tfm - > reqsize ;
2008-07-10 12:01:22 +04:00
}
2008-11-02 16:38:11 +03:00
static inline void * ahash_request_ctx ( struct ahash_request * req )
{
return req - > __ctx ;
}
2009-07-15 08:40:40 +04:00
int crypto_ahash_setkey ( struct crypto_ahash * tfm , const u8 * key ,
unsigned int keylen ) ;
int crypto_ahash_finup ( struct ahash_request * req ) ;
int crypto_ahash_final ( struct ahash_request * req ) ;
int crypto_ahash_digest ( struct ahash_request * req ) ;
2008-07-10 12:01:22 +04:00
2009-07-14 08:28:26 +04:00
static inline int crypto_ahash_export ( struct ahash_request * req , void * out )
2008-11-02 16:38:11 +03:00
{
2009-07-14 08:28:26 +04:00
return crypto_ahash_reqtfm ( req ) - > export ( req , out ) ;
2008-11-02 16:38:11 +03:00
}
2009-07-14 08:28:26 +04:00
static inline int crypto_ahash_import ( struct ahash_request * req , const void * in )
{
return crypto_ahash_reqtfm ( req ) - > import ( req , in ) ;
}
2008-11-02 16:38:11 +03:00
2008-08-05 09:34:30 +04:00
static inline int crypto_ahash_init ( struct ahash_request * req )
{
2009-07-14 08:28:26 +04:00
return crypto_ahash_reqtfm ( req ) - > init ( req ) ;
2008-08-05 09:34:30 +04:00
}
static inline int crypto_ahash_update ( struct ahash_request * req )
{
2009-07-14 08:28:26 +04:00
return crypto_ahash_reqtfm ( req ) - > update ( req ) ;
2008-08-05 09:34:30 +04:00
}
2008-07-10 12:01:22 +04:00
static inline void ahash_request_set_tfm ( struct ahash_request * req ,
struct crypto_ahash * tfm )
{
req - > base . tfm = crypto_ahash_tfm ( tfm ) ;
}
static inline struct ahash_request * ahash_request_alloc (
struct crypto_ahash * tfm , gfp_t gfp )
{
struct ahash_request * req ;
req = kmalloc ( sizeof ( struct ahash_request ) +
crypto_ahash_reqsize ( tfm ) , gfp ) ;
if ( likely ( req ) )
ahash_request_set_tfm ( req , tfm ) ;
return req ;
}
static inline void ahash_request_free ( struct ahash_request * req )
{
2009-07-11 18:22:14 +04:00
kzfree ( req ) ;
2008-07-10 12:01:22 +04:00
}
static inline struct ahash_request * ahash_request_cast (
struct crypto_async_request * req )
{
return container_of ( req , struct ahash_request , base ) ;
}
static inline void ahash_request_set_callback ( struct ahash_request * req ,
u32 flags ,
crypto_completion_t complete ,
void * data )
{
req - > base . complete = complete ;
req - > base . data = data ;
req - > base . flags = flags ;
}
static inline void ahash_request_set_crypt ( struct ahash_request * req ,
struct scatterlist * src , u8 * result ,
unsigned int nbytes )
{
req - > src = src ;
req - > nbytes = nbytes ;
req - > result = result ;
}
2008-08-31 09:47:27 +04:00
struct crypto_shash * crypto_alloc_shash ( const char * alg_name , u32 type ,
u32 mask ) ;
static inline struct crypto_tfm * crypto_shash_tfm ( struct crypto_shash * tfm )
{
return & tfm - > base ;
}
static inline void crypto_free_shash ( struct crypto_shash * tfm )
{
2009-02-05 08:51:25 +03:00
crypto_destroy_tfm ( tfm , crypto_shash_tfm ( tfm ) ) ;
2008-08-31 09:47:27 +04:00
}
static inline unsigned int crypto_shash_alignmask (
struct crypto_shash * tfm )
{
return crypto_tfm_alg_alignmask ( crypto_shash_tfm ( tfm ) ) ;
}
2009-02-03 04:47:44 +03:00
static inline unsigned int crypto_shash_blocksize ( struct crypto_shash * tfm )
{
return crypto_tfm_alg_blocksize ( crypto_shash_tfm ( tfm ) ) ;
}
2008-08-31 09:47:27 +04:00
static inline struct shash_alg * __crypto_shash_alg ( struct crypto_alg * alg )
{
return container_of ( alg , struct shash_alg , base ) ;
}
static inline struct shash_alg * crypto_shash_alg ( struct crypto_shash * tfm )
{
return __crypto_shash_alg ( crypto_shash_tfm ( tfm ) - > __crt_alg ) ;
}
static inline unsigned int crypto_shash_digestsize ( struct crypto_shash * tfm )
{
return crypto_shash_alg ( tfm ) - > digestsize ;
}
2009-07-09 16:30:57 +04:00
static inline unsigned int crypto_shash_statesize ( struct crypto_shash * tfm )
{
return crypto_shash_alg ( tfm ) - > statesize ;
}
2008-08-31 09:47:27 +04:00
static inline u32 crypto_shash_get_flags ( struct crypto_shash * tfm )
{
return crypto_tfm_get_flags ( crypto_shash_tfm ( tfm ) ) ;
}
static inline void crypto_shash_set_flags ( struct crypto_shash * tfm , u32 flags )
{
crypto_tfm_set_flags ( crypto_shash_tfm ( tfm ) , flags ) ;
}
static inline void crypto_shash_clear_flags ( struct crypto_shash * tfm , u32 flags )
{
crypto_tfm_clear_flags ( crypto_shash_tfm ( tfm ) , flags ) ;
}
static inline unsigned int crypto_shash_descsize ( struct crypto_shash * tfm )
{
2009-07-14 08:50:12 +04:00
return tfm - > descsize ;
2008-08-31 09:47:27 +04:00
}
static inline void * shash_desc_ctx ( struct shash_desc * desc )
{
return desc - > __ctx ;
}
int crypto_shash_setkey ( struct crypto_shash * tfm , const u8 * key ,
unsigned int keylen ) ;
int crypto_shash_digest ( struct shash_desc * desc , const u8 * data ,
unsigned int len , u8 * out ) ;
2009-07-09 16:30:57 +04:00
static inline int crypto_shash_export ( struct shash_desc * desc , void * out )
2008-11-02 16:38:11 +03:00
{
2009-07-09 16:30:57 +04:00
return crypto_shash_alg ( desc - > tfm ) - > export ( desc , out ) ;
2008-11-02 16:38:11 +03:00
}
2009-07-09 16:30:57 +04:00
static inline int crypto_shash_import ( struct shash_desc * desc , const void * in )
{
return crypto_shash_alg ( desc - > tfm ) - > import ( desc , in ) ;
}
2008-11-02 16:38:11 +03:00
2008-08-31 09:47:27 +04:00
static inline int crypto_shash_init ( struct shash_desc * desc )
{
return crypto_shash_alg ( desc - > tfm ) - > init ( desc ) ;
}
int crypto_shash_update ( struct shash_desc * desc , const u8 * data ,
unsigned int len ) ;
int crypto_shash_final ( struct shash_desc * desc , u8 * out ) ;
int crypto_shash_finup ( struct shash_desc * desc , const u8 * data ,
unsigned int len , u8 * out ) ;
2008-07-10 12:01:22 +04:00
# endif /* _CRYPTO_HASH_H */