2017-11-24 15:00:34 +01:00
// SPDX-License-Identifier: GPL-2.0+
2006-01-06 00:19:18 -08:00
/*
* Cryptographic API .
*
2011-07-04 20:06:01 +08:00
* s390 implementation of the SHA256 and SHA224 Secure Hash Algorithm .
2006-01-06 00:19:18 -08:00
*
* s390 Version :
2012-07-20 11:15:04 +02:00
* Copyright IBM Corp . 2005 , 2011
2006-01-06 00:19:18 -08:00
* Author ( s ) : Jan Glauber ( jang @ de . ibm . com )
*/
2009-01-18 20:33:33 +11:00
# include <crypto/internal/hash.h>
2006-01-06 00:19:18 -08:00
# include <linux/init.h>
# include <linux/module.h>
2015-02-19 17:34:07 +01:00
# include <linux/cpufeature.h>
2020-11-12 21:20:21 -08:00
# include <crypto/sha2.h>
2016-03-17 15:22:12 +01:00
# include <asm/cpacf.h>
2006-01-06 00:19:18 -08:00
2008-03-06 19:50:20 +08:00
# include "sha.h"
2006-01-06 00:19:18 -08:00
2019-09-01 22:35:26 +02:00
static int s390_sha256_init ( struct shash_desc * desc )
2006-01-06 00:19:18 -08:00
{
2009-01-18 20:33:33 +11:00
struct s390_sha_ctx * sctx = shash_desc_ctx ( desc ) ;
2006-01-06 00:19:18 -08:00
2007-10-09 22:43:13 +08:00
sctx - > state [ 0 ] = SHA256_H0 ;
sctx - > state [ 1 ] = SHA256_H1 ;
sctx - > state [ 2 ] = SHA256_H2 ;
sctx - > state [ 3 ] = SHA256_H3 ;
sctx - > state [ 4 ] = SHA256_H4 ;
sctx - > state [ 5 ] = SHA256_H5 ;
sctx - > state [ 6 ] = SHA256_H6 ;
sctx - > state [ 7 ] = SHA256_H7 ;
2006-01-06 00:19:18 -08:00
sctx - > count = 0 ;
2016-03-17 15:22:12 +01:00
sctx - > func = CPACF_KIMD_SHA_256 ;
2009-01-18 20:33:33 +11:00
return 0 ;
2006-01-06 00:19:18 -08:00
}
2009-07-10 13:20:32 +08:00
static int sha256_export ( struct shash_desc * desc , void * out )
{
struct s390_sha_ctx * sctx = shash_desc_ctx ( desc ) ;
struct sha256_state * octx = out ;
octx - > count = sctx - > count ;
memcpy ( octx - > state , sctx - > state , sizeof ( octx - > state ) ) ;
memcpy ( octx - > buf , sctx - > buf , sizeof ( octx - > buf ) ) ;
return 0 ;
}
2009-09-05 16:27:35 +10:00
static int sha256_import ( struct shash_desc * desc , const void * in )
2009-07-10 13:20:32 +08:00
{
2009-07-16 19:58:42 +08:00
struct s390_sha_ctx * sctx = shash_desc_ctx ( desc ) ;
2009-09-05 16:27:35 +10:00
const struct sha256_state * ictx = in ;
2009-07-10 13:20:32 +08:00
sctx - > count = ictx - > count ;
memcpy ( sctx - > state , ictx - > state , sizeof ( ictx - > state ) ) ;
memcpy ( sctx - > buf , ictx - > buf , sizeof ( ictx - > buf ) ) ;
2016-03-17 15:22:12 +01:00
sctx - > func = CPACF_KIMD_SHA_256 ;
2009-07-10 13:20:32 +08:00
return 0 ;
}
2011-07-04 20:06:01 +08:00
static struct shash_alg sha256_alg = {
2009-01-18 20:33:33 +11:00
. digestsize = SHA256_DIGEST_SIZE ,
2019-09-01 22:35:26 +02:00
. init = s390_sha256_init ,
2009-01-18 20:33:33 +11:00
. update = s390_sha_update ,
. final = s390_sha_final ,
2009-07-10 13:20:32 +08:00
. export = sha256_export ,
. import = sha256_import ,
2009-01-18 20:33:33 +11:00
. descsize = sizeof ( struct s390_sha_ctx ) ,
2009-07-10 13:20:32 +08:00
. statesize = sizeof ( struct sha256_state ) ,
2009-01-18 20:33:33 +11:00
. base = {
. cra_name = " sha256 " ,
. cra_driver_name = " sha256-s390 " ,
2016-03-17 15:22:12 +01:00
. cra_priority = 300 ,
2009-01-18 20:33:33 +11:00
. cra_blocksize = SHA256_BLOCK_SIZE ,
. cra_module = THIS_MODULE ,
}
2006-01-06 00:19:18 -08:00
} ;
2019-09-01 22:35:26 +02:00
static int s390_sha224_init ( struct shash_desc * desc )
2006-01-06 00:19:18 -08:00
{
2011-07-04 20:06:01 +08:00
struct s390_sha_ctx * sctx = shash_desc_ctx ( desc ) ;
sctx - > state [ 0 ] = SHA224_H0 ;
sctx - > state [ 1 ] = SHA224_H1 ;
sctx - > state [ 2 ] = SHA224_H2 ;
sctx - > state [ 3 ] = SHA224_H3 ;
sctx - > state [ 4 ] = SHA224_H4 ;
sctx - > state [ 5 ] = SHA224_H5 ;
sctx - > state [ 6 ] = SHA224_H6 ;
sctx - > state [ 7 ] = SHA224_H7 ;
sctx - > count = 0 ;
2016-03-17 15:22:12 +01:00
sctx - > func = CPACF_KIMD_SHA_256 ;
2011-07-04 20:06:01 +08:00
return 0 ;
}
static struct shash_alg sha224_alg = {
. digestsize = SHA224_DIGEST_SIZE ,
2019-09-01 22:35:26 +02:00
. init = s390_sha224_init ,
2011-07-04 20:06:01 +08:00
. update = s390_sha_update ,
. final = s390_sha_final ,
. export = sha256_export ,
. import = sha256_import ,
. descsize = sizeof ( struct s390_sha_ctx ) ,
. statesize = sizeof ( struct sha256_state ) ,
. base = {
. cra_name = " sha224 " ,
. cra_driver_name = " sha224-s390 " ,
2016-03-17 15:22:12 +01:00
. cra_priority = 300 ,
2011-07-04 20:06:01 +08:00
. cra_blocksize = SHA224_BLOCK_SIZE ,
. cra_module = THIS_MODULE ,
}
} ;
static int __init sha256_s390_init ( void )
{
int ret ;
2016-08-18 12:59:46 +02:00
if ( ! cpacf_query_func ( CPACF_KIMD , CPACF_KIMD_SHA_256 ) )
2019-06-12 15:33:06 +02:00
return - ENODEV ;
2011-07-04 20:06:01 +08:00
ret = crypto_register_shash ( & sha256_alg ) ;
if ( ret < 0 )
goto out ;
ret = crypto_register_shash ( & sha224_alg ) ;
if ( ret < 0 )
crypto_unregister_shash ( & sha256_alg ) ;
out :
return ret ;
2006-01-06 00:19:18 -08:00
}
2008-04-17 07:46:17 +02:00
static void __exit sha256_s390_fini ( void )
2006-01-06 00:19:18 -08:00
{
2011-07-04 20:06:01 +08:00
crypto_unregister_shash ( & sha224_alg ) ;
crypto_unregister_shash ( & sha256_alg ) ;
2006-01-06 00:19:18 -08:00
}
2022-07-13 14:56:42 +02:00
module_cpu_feature_match ( S390_CPU_FEATURE_MSA , sha256_s390_init ) ;
2008-04-17 07:46:17 +02:00
module_exit ( sha256_s390_fini ) ;
2006-01-06 00:19:18 -08:00
2014-11-20 17:05:53 -08:00
MODULE_ALIAS_CRYPTO ( " sha256 " ) ;
MODULE_ALIAS_CRYPTO ( " sha224 " ) ;
2006-01-06 00:19:18 -08:00
MODULE_LICENSE ( " GPL " ) ;
2011-07-04 20:06:01 +08:00
MODULE_DESCRIPTION ( " SHA256 and SHA224 Secure Hash Algorithm " ) ;