2005-04-17 02:20:36 +04:00
/*
* Cryptographic API .
*
* Copyright ( c ) 2002 James Morris < jmorris @ intercode . com . au >
2005-11-05 08:58:14 +03:00
* Copyright ( c ) 2005 Herbert Xu < herbert @ gondor . apana . org . au >
2005-04-17 02:20:36 +04:00
*
* 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_INTERNAL_H
# define _CRYPTO_INTERNAL_H
2006-08-21 15:08:13 +04:00
# include <crypto/algapi.h>
2006-08-06 15:23:26 +04:00
# include <linux/completion.h>
2005-04-17 02:20:36 +04:00
# include <linux/mm.h>
# include <linux/highmem.h>
# include <linux/interrupt.h>
# include <linux/init.h>
2005-11-05 08:58:14 +03:00
# include <linux/list.h>
2006-08-06 15:16:34 +04:00
# include <linux/module.h>
2005-07-07 00:53:29 +04:00
# include <linux/kernel.h>
2006-08-06 15:23:26 +04:00
# include <linux/notifier.h>
2005-11-05 08:58:14 +03:00
# include <linux/rwsem.h>
2005-09-02 04:43:05 +04:00
# include <linux/slab.h>
2005-04-17 02:20:36 +04:00
2006-08-06 15:23:26 +04:00
/* Crypto notification events. */
enum {
CRYPTO_MSG_ALG_REQUEST ,
CRYPTO_MSG_ALG_REGISTER ,
CRYPTO_MSG_ALG_UNREGISTER ,
CRYPTO_MSG_TMPL_REGISTER ,
CRYPTO_MSG_TMPL_UNREGISTER ,
} ;
2006-08-06 15:16:34 +04:00
struct crypto_instance ;
struct crypto_template ;
2006-08-06 15:23:26 +04:00
struct crypto_larval {
struct crypto_alg alg ;
struct crypto_alg * adult ;
struct completion completion ;
2006-09-21 05:35:17 +04:00
u32 mask ;
2006-08-06 15:23:26 +04:00
} ;
2005-11-05 08:58:14 +03:00
extern struct list_head crypto_alg_list ;
extern struct rw_semaphore crypto_alg_sem ;
2006-08-06 15:23:26 +04:00
extern struct blocking_notifier_head crypto_chain ;
2005-11-05 08:58:14 +03:00
2005-04-17 02:20:36 +04:00
# ifdef CONFIG_PROC_FS
void __init crypto_init_proc ( void ) ;
2006-08-21 15:08:13 +04:00
void __exit crypto_exit_proc ( void ) ;
2005-04-17 02:20:36 +04:00
# else
static inline void crypto_init_proc ( void )
{ }
2006-08-21 15:08:13 +04:00
static inline void crypto_exit_proc ( void )
{ }
2005-04-17 02:20:36 +04:00
# endif
2007-01-27 02:05:15 +03:00
static inline unsigned int crypto_digest_ctxsize ( struct crypto_alg * alg )
2005-07-07 00:53:29 +04:00
{
2006-07-09 08:49:42 +04:00
unsigned int len = alg - > cra_ctxsize ;
if ( alg - > cra_alignmask ) {
len = ALIGN ( len , ( unsigned long ) alg - > cra_alignmask + 1 ) ;
len + = alg - > cra_digest . dia_digestsize ;
}
return len ;
2005-07-07 00:53:29 +04:00
}
2007-01-27 02:05:15 +03:00
static inline unsigned int crypto_cipher_ctxsize ( struct crypto_alg * alg )
2005-07-07 00:53:29 +04:00
{
2007-01-27 02:05:15 +03:00
return alg - > cra_ctxsize ;
2005-07-07 00:53:29 +04:00
}
2007-01-27 02:05:15 +03:00
static inline unsigned int crypto_compress_ctxsize ( struct crypto_alg * alg )
2005-07-07 00:53:29 +04:00
{
return alg - > cra_ctxsize ;
}
2006-08-06 15:23:26 +04:00
struct crypto_alg * crypto_mod_get ( struct crypto_alg * alg ) ;
2006-09-21 05:35:17 +04:00
struct crypto_alg * __crypto_alg_lookup ( const char * name , u32 type , u32 mask ) ;
struct crypto_alg * crypto_alg_mod_lookup ( const char * name , u32 type , u32 mask ) ;
2006-08-06 15:23:26 +04:00
2005-04-17 02:20:36 +04:00
int crypto_init_digest_ops ( struct crypto_tfm * tfm ) ;
int crypto_init_cipher_ops ( struct crypto_tfm * tfm ) ;
int crypto_init_compress_ops ( struct crypto_tfm * tfm ) ;
void crypto_exit_digest_ops ( struct crypto_tfm * tfm ) ;
void crypto_exit_cipher_ops ( struct crypto_tfm * tfm ) ;
void crypto_exit_compress_ops ( struct crypto_tfm * tfm ) ;
2006-09-21 05:35:17 +04:00
void crypto_larval_error ( const char * name , u32 type , u32 mask ) ;
2006-08-06 15:23:26 +04:00
2006-09-21 05:39:29 +04:00
void crypto_shoot_alg ( struct crypto_alg * alg ) ;
2007-01-24 12:50:26 +03:00
struct crypto_tfm * __crypto_alloc_tfm ( struct crypto_alg * alg , u32 type ,
u32 mask ) ;
2006-09-21 05:39:29 +04:00
2006-08-06 15:16:34 +04:00
int crypto_register_instance ( struct crypto_template * tmpl ,
struct crypto_instance * inst ) ;
2006-08-06 15:23:26 +04:00
int crypto_register_notifier ( struct notifier_block * nb ) ;
int crypto_unregister_notifier ( struct notifier_block * nb ) ;
2006-09-21 05:39:29 +04:00
static inline void crypto_alg_put ( struct crypto_alg * alg )
{
if ( atomic_dec_and_test ( & alg - > cra_refcnt ) & & alg - > cra_destroy )
alg - > cra_destroy ( alg ) ;
}
2006-08-06 15:16:34 +04:00
static inline int crypto_tmpl_get ( struct crypto_template * tmpl )
{
return try_module_get ( tmpl - > module ) ;
}
static inline void crypto_tmpl_put ( struct crypto_template * tmpl )
{
module_put ( tmpl - > module ) ;
}
2006-08-06 15:23:26 +04:00
static inline int crypto_is_larval ( struct crypto_alg * alg )
{
return alg - > cra_flags & CRYPTO_ALG_LARVAL ;
}
2006-09-21 05:39:29 +04:00
static inline int crypto_is_dead ( struct crypto_alg * alg )
{
return alg - > cra_flags & CRYPTO_ALG_DEAD ;
}
static inline int crypto_is_moribund ( struct crypto_alg * alg )
{
return alg - > cra_flags & ( CRYPTO_ALG_DEAD | CRYPTO_ALG_DYING ) ;
}
2006-08-06 15:23:26 +04:00
static inline int crypto_notify ( unsigned long val , void * v )
{
return blocking_notifier_call_chain ( & crypto_chain , val , v ) ;
}
2005-04-17 02:20:36 +04:00
# endif /* _CRYPTO_INTERNAL_H */