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
# include <asm/kmap_types.h>
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
static inline enum km_type crypto_kmap_type ( int out )
{
2007-09-01 12:52:13 +04:00
enum km_type type ;
if ( in_softirq ( ) )
type = out * ( KM_SOFTIRQ1 - KM_SOFTIRQ0 ) + KM_SOFTIRQ0 ;
else
type = out * ( KM_USER1 - KM_USER0 ) + KM_USER0 ;
return type ;
2005-04-17 02:20:36 +04:00
}
static inline void * crypto_kmap ( struct page * page , int out )
{
return kmap_atomic ( page , crypto_kmap_type ( out ) ) ;
}
static inline void crypto_kunmap ( void * vaddr , int out )
{
kunmap_atomic ( vaddr , crypto_kmap_type ( out ) ) ;
}
2006-07-30 05:53:45 +04:00
static inline void crypto_yield ( u32 flags )
2005-04-17 02:20:36 +04:00
{
2006-07-30 05:53:45 +04:00
if ( flags & CRYPTO_TFM_REQ_MAY_SLEEP )
2005-04-17 02:20:36 +04:00
cond_resched ( ) ;
}
# 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 */