2005-04-17 02:20:36 +04:00
/*
* Cryptographic API .
*
* SHA1 Secure Hash Algorithm .
*
* Derived from cryptoapi implementation , adapted for in - place
* scatterlist interface .
*
* Copyright ( c ) Alan Smithee .
* Copyright ( c ) Andrew McDonald < andrew @ mcdonald . org . uk >
* Copyright ( c ) Jean - Francois Dive < jef @ linuxbe . org >
*
* 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 .
*
*/
2008-12-02 16:08:20 +03:00
# include <crypto/internal/hash.h>
2005-04-17 02:20:36 +04:00
# include <linux/init.h>
# include <linux/module.h>
# include <linux/mm.h>
# include <linux/cryptohash.h>
2005-10-30 13:25:15 +03:00
# include <linux/types.h>
2007-10-09 18:43:13 +04:00
# include <crypto/sha.h>
2015-04-09 13:55:36 +03:00
# include <crypto/sha1_base.h>
2005-04-17 02:20:36 +04:00
# include <asm/byteorder.h>
2015-12-17 15:45:39 +03:00
const u8 sha1_zero_message_hash [ SHA1_DIGEST_SIZE ] = {
0xda , 0x39 , 0xa3 , 0xee , 0x5e , 0x6b , 0x4b , 0x0d ,
0x32 , 0x55 , 0xbf , 0xef , 0x95 , 0x60 , 0x18 , 0x90 ,
0xaf , 0xd8 , 0x07 , 0x09
} ;
EXPORT_SYMBOL_GPL ( sha1_zero_message_hash ) ;
2015-04-09 13:55:36 +03:00
static void sha1_generic_block_fn ( struct sha1_state * sst , u8 const * src ,
int blocks )
2005-04-17 02:20:36 +04:00
{
2015-04-09 13:55:36 +03:00
u32 temp [ SHA_WORKSPACE_WORDS ] ;
2008-12-02 16:08:20 +03:00
2015-04-09 13:55:36 +03:00
while ( blocks - - ) {
sha_transform ( sst - > state , src , temp ) ;
src + = SHA1_BLOCK_SIZE ;
}
memzero_explicit ( temp , sizeof ( temp ) ) ;
2005-04-17 02:20:36 +04:00
}
2011-08-04 22:19:24 +04:00
int crypto_sha1_update ( struct shash_desc * desc , const u8 * data ,
2015-04-09 13:55:36 +03:00
unsigned int len )
2005-04-17 02:20:36 +04:00
{
2015-04-09 13:55:36 +03:00
return sha1_base_do_update ( desc , data , len , sha1_generic_block_fn ) ;
2005-04-17 02:20:36 +04:00
}
2011-08-04 22:19:24 +04:00
EXPORT_SYMBOL ( crypto_sha1_update ) ;
2005-04-17 02:20:36 +04:00
2008-12-02 16:08:20 +03:00
static int sha1_final ( struct shash_desc * desc , u8 * out )
2005-04-17 02:20:36 +04:00
{
2015-04-09 13:55:36 +03:00
sha1_base_do_finalize ( desc , sha1_generic_block_fn ) ;
return sha1_base_finish ( desc , out ) ;
2005-04-17 02:20:36 +04:00
}
2015-04-09 13:55:36 +03:00
int crypto_sha1_finup ( struct shash_desc * desc , const u8 * data ,
unsigned int len , u8 * out )
2009-07-09 17:27:13 +04:00
{
2015-04-09 13:55:36 +03:00
sha1_base_do_update ( desc , data , len , sha1_generic_block_fn ) ;
return sha1_final ( desc , out ) ;
2009-07-09 17:27:13 +04:00
}
2015-04-09 13:55:36 +03:00
EXPORT_SYMBOL ( crypto_sha1_finup ) ;
2009-07-09 17:27:13 +04:00
2008-12-02 16:08:20 +03:00
static struct shash_alg alg = {
. digestsize = SHA1_DIGEST_SIZE ,
2015-04-09 13:55:36 +03:00
. init = sha1_base_init ,
2011-08-04 22:19:24 +04:00
. update = crypto_sha1_update ,
2008-12-02 16:08:20 +03:00
. final = sha1_final ,
2015-04-09 13:55:36 +03:00
. finup = crypto_sha1_finup ,
2009-07-09 17:27:13 +04:00
. descsize = sizeof ( struct sha1_state ) ,
2008-12-02 16:08:20 +03:00
. base = {
. cra_name = " sha1 " ,
. cra_driver_name = " sha1-generic " ,
. cra_flags = CRYPTO_ALG_TYPE_SHASH ,
. cra_blocksize = SHA1_BLOCK_SIZE ,
. cra_module = THIS_MODULE ,
}
2005-04-17 02:20:36 +04:00
} ;
2008-04-05 17:00:57 +04:00
static int __init sha1_generic_mod_init ( void )
2005-04-17 02:20:36 +04:00
{
2008-12-02 16:08:20 +03:00
return crypto_register_shash ( & alg ) ;
2005-04-17 02:20:36 +04:00
}
2008-04-05 17:00:57 +04:00
static void __exit sha1_generic_mod_fini ( void )
2005-04-17 02:20:36 +04:00
{
2008-12-02 16:08:20 +03:00
crypto_unregister_shash ( & alg ) ;
2005-04-17 02:20:36 +04:00
}
2008-04-05 17:00:57 +04:00
module_init ( sha1_generic_mod_init ) ;
module_exit ( sha1_generic_mod_fini ) ;
2005-04-17 02:20:36 +04:00
MODULE_LICENSE ( " GPL " ) ;
MODULE_DESCRIPTION ( " SHA1 Secure Hash Algorithm " ) ;
2006-07-09 02:59:38 +04:00
2014-11-21 04:05:53 +03:00
MODULE_ALIAS_CRYPTO ( " sha1 " ) ;
2015-01-11 20:17:42 +03:00
MODULE_ALIAS_CRYPTO ( " sha1-generic " ) ;