2005-04-17 02:20:36 +04:00
/*
* Scatterlist Cryptographic API .
*
* Procfs information .
*
* 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 .
*
*/
2006-08-06 14:28:44 +04:00
# include <asm/atomic.h>
2005-04-17 02:20:36 +04:00
# include <linux/init.h>
# include <linux/crypto.h>
# include <linux/rwsem.h>
# include <linux/proc_fs.h>
# include <linux/seq_file.h>
2008-08-05 10:13:08 +04:00
# include <linux/sysctl.h>
2005-04-17 02:20:36 +04:00
# include "internal.h"
2008-08-05 10:13:08 +04:00
# ifdef CONFIG_CRYPTO_FIPS
static struct ctl_table crypto_sysctl_table [ ] = {
{
. procname = " fips_enabled " ,
. data = & fips_enabled ,
. maxlen = sizeof ( int ) ,
. mode = 0444 ,
2009-11-16 14:11:48 +03:00
. proc_handler = proc_dointvec
2008-08-05 10:13:08 +04:00
} ,
2009-04-03 16:29:19 +04:00
{ }
2008-08-05 10:13:08 +04:00
} ;
static struct ctl_table crypto_dir_table [ ] = {
{
. procname = " crypto " ,
. mode = 0555 ,
. child = crypto_sysctl_table
} ,
2009-04-03 16:29:19 +04:00
{ }
2008-08-05 10:13:08 +04:00
} ;
static struct ctl_table_header * crypto_sysctls ;
static void crypto_proc_fips_init ( void )
{
crypto_sysctls = register_sysctl_table ( crypto_dir_table ) ;
}
static void crypto_proc_fips_exit ( void )
{
if ( crypto_sysctls )
unregister_sysctl_table ( crypto_sysctls ) ;
}
# else
# define crypto_proc_fips_init()
# define crypto_proc_fips_exit()
# endif
2005-04-17 02:20:36 +04:00
static void * c_start ( struct seq_file * m , loff_t * pos )
{
down_read ( & crypto_alg_sem ) ;
2007-07-16 10:39:53 +04:00
return seq_list_start ( & crypto_alg_list , * pos ) ;
2005-04-17 02:20:36 +04:00
}
static void * c_next ( struct seq_file * m , void * p , loff_t * pos )
{
2007-07-16 10:39:53 +04:00
return seq_list_next ( p , & crypto_alg_list , pos ) ;
2005-04-17 02:20:36 +04:00
}
static void c_stop ( struct seq_file * m , void * p )
{
up_read ( & crypto_alg_sem ) ;
}
static int c_show ( struct seq_file * m , void * p )
{
2007-07-16 10:39:53 +04:00
struct crypto_alg * alg = list_entry ( p , struct crypto_alg , cra_list ) ;
2005-04-17 02:20:36 +04:00
seq_printf ( m , " name : %s \n " , alg - > cra_name ) ;
2005-11-05 08:58:14 +03:00
seq_printf ( m , " driver : %s \n " , alg - > cra_driver_name ) ;
2005-04-17 02:20:36 +04:00
seq_printf ( m , " module : %s \n " , module_name ( alg - > cra_module ) ) ;
2005-11-05 08:58:14 +03:00
seq_printf ( m , " priority : %d \n " , alg - > cra_priority ) ;
2006-08-06 14:28:44 +04:00
seq_printf ( m , " refcnt : %d \n " , atomic_read ( & alg - > cra_refcnt ) ) ;
2008-08-03 17:15:23 +04:00
seq_printf ( m , " selftest : %s \n " ,
( alg - > cra_flags & CRYPTO_ALG_TESTED ) ?
" passed " : " unknown " ) ;
2008-11-06 09:39:16 +03:00
if ( alg - > cra_flags & CRYPTO_ALG_LARVAL ) {
seq_printf ( m , " type : larval \n " ) ;
seq_printf ( m , " flags : 0x%x \n " , alg - > cra_flags ) ;
goto out ;
}
if ( alg - > cra_type & & alg - > cra_type - > show ) {
alg - > cra_type - > show ( m , alg ) ;
goto out ;
}
2005-04-17 02:20:36 +04:00
2008-08-04 10:22:29 +04:00
switch ( alg - > cra_flags & ( CRYPTO_ALG_TYPE_MASK | CRYPTO_ALG_LARVAL ) ) {
2005-04-17 02:20:36 +04:00
case CRYPTO_ALG_TYPE_CIPHER :
seq_printf ( m , " type : cipher \n " ) ;
seq_printf ( m , " blocksize : %u \n " , alg - > cra_blocksize ) ;
seq_printf ( m , " min keysize : %u \n " ,
alg - > cra_cipher . cia_min_keysize ) ;
seq_printf ( m , " max keysize : %u \n " ,
alg - > cra_cipher . cia_max_keysize ) ;
break ;
case CRYPTO_ALG_TYPE_COMPRESS :
seq_printf ( m , " type : compression \n " ) ;
break ;
default :
2008-11-06 09:39:16 +03:00
seq_printf ( m , " type : unknown \n " ) ;
2005-04-17 02:20:36 +04:00
break ;
}
2008-11-06 09:39:16 +03:00
out :
2005-04-17 02:20:36 +04:00
seq_putc ( m , ' \n ' ) ;
return 0 ;
}
2008-03-13 14:37:45 +03:00
static const struct seq_operations crypto_seq_ops = {
2005-04-17 02:20:36 +04:00
. start = c_start ,
. next = c_next ,
. stop = c_stop ,
. show = c_show
} ;
static int crypto_info_open ( struct inode * inode , struct file * file )
{
return seq_open ( file , & crypto_seq_ops ) ;
}
2007-02-12 11:55:32 +03:00
static const struct file_operations proc_crypto_ops = {
2005-04-17 02:20:36 +04:00
. open = crypto_info_open ,
. read = seq_read ,
. llseek = seq_lseek ,
. release = seq_release
} ;
void __init crypto_init_proc ( void )
{
2008-03-05 14:27:51 +03:00
proc_create ( " crypto " , 0 , NULL , & proc_crypto_ops ) ;
2008-08-05 10:13:08 +04:00
crypto_proc_fips_init ( ) ;
2005-04-17 02:20:36 +04:00
}
2006-08-21 15:08:13 +04:00
void __exit crypto_exit_proc ( void )
{
2008-08-05 10:13:08 +04:00
crypto_proc_fips_exit ( ) ;
2006-08-21 15:08:13 +04:00
remove_proc_entry ( " crypto " , NULL ) ;
}