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
2011-07-27 03:09:06 +04:00
# include <linux/atomic.h>
2005-04-17 02:20:36 +04:00
# include <linux/init.h>
# include <linux/crypto.h>
2011-05-27 22:41:48 +04:00
# include <linux/module.h> /* for module_name() */
2005-04-17 02:20:36 +04:00
# include <linux/rwsem.h>
# include <linux/proc_fs.h>
# include <linux/seq_file.h>
# include "internal.h"
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 " ) ;
2015-03-30 22:57:42 +03:00
seq_printf ( m , " internal : %s \n " ,
( alg - > cra_flags & CRYPTO_ALG_INTERNAL ) ?
" yes " : " no " ) ;
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 ) ;
2005-04-17 02:20:36 +04:00
}
2006-08-21 15:08:13 +04:00
void __exit crypto_exit_proc ( void )
{
remove_proc_entry ( " crypto " , NULL ) ;
}