162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0+ 262306a36Sopenharmony_ci/* 362306a36Sopenharmony_ci * Cryptographic API. 462306a36Sopenharmony_ci * 562306a36Sopenharmony_ci * s390 implementation of the SHA1 Secure Hash Algorithm. 662306a36Sopenharmony_ci * 762306a36Sopenharmony_ci * Derived from cryptoapi implementation, adapted for in-place 862306a36Sopenharmony_ci * scatterlist interface. Originally based on the public domain 962306a36Sopenharmony_ci * implementation written by Steve Reid. 1062306a36Sopenharmony_ci * 1162306a36Sopenharmony_ci * s390 Version: 1262306a36Sopenharmony_ci * Copyright IBM Corp. 2003, 2007 1362306a36Sopenharmony_ci * Author(s): Thomas Spatzier 1462306a36Sopenharmony_ci * Jan Glauber (jan.glauber@de.ibm.com) 1562306a36Sopenharmony_ci * 1662306a36Sopenharmony_ci * Derived from "crypto/sha1_generic.c" 1762306a36Sopenharmony_ci * Copyright (c) Alan Smithee. 1862306a36Sopenharmony_ci * Copyright (c) Andrew McDonald <andrew@mcdonald.org.uk> 1962306a36Sopenharmony_ci * Copyright (c) Jean-Francois Dive <jef@linuxbe.org> 2062306a36Sopenharmony_ci */ 2162306a36Sopenharmony_ci#include <crypto/internal/hash.h> 2262306a36Sopenharmony_ci#include <linux/init.h> 2362306a36Sopenharmony_ci#include <linux/module.h> 2462306a36Sopenharmony_ci#include <linux/cpufeature.h> 2562306a36Sopenharmony_ci#include <crypto/sha1.h> 2662306a36Sopenharmony_ci#include <asm/cpacf.h> 2762306a36Sopenharmony_ci 2862306a36Sopenharmony_ci#include "sha.h" 2962306a36Sopenharmony_ci 3062306a36Sopenharmony_cistatic int s390_sha1_init(struct shash_desc *desc) 3162306a36Sopenharmony_ci{ 3262306a36Sopenharmony_ci struct s390_sha_ctx *sctx = shash_desc_ctx(desc); 3362306a36Sopenharmony_ci 3462306a36Sopenharmony_ci sctx->state[0] = SHA1_H0; 3562306a36Sopenharmony_ci sctx->state[1] = SHA1_H1; 3662306a36Sopenharmony_ci sctx->state[2] = SHA1_H2; 3762306a36Sopenharmony_ci sctx->state[3] = SHA1_H3; 3862306a36Sopenharmony_ci sctx->state[4] = SHA1_H4; 3962306a36Sopenharmony_ci sctx->count = 0; 4062306a36Sopenharmony_ci sctx->func = CPACF_KIMD_SHA_1; 4162306a36Sopenharmony_ci 4262306a36Sopenharmony_ci return 0; 4362306a36Sopenharmony_ci} 4462306a36Sopenharmony_ci 4562306a36Sopenharmony_cistatic int s390_sha1_export(struct shash_desc *desc, void *out) 4662306a36Sopenharmony_ci{ 4762306a36Sopenharmony_ci struct s390_sha_ctx *sctx = shash_desc_ctx(desc); 4862306a36Sopenharmony_ci struct sha1_state *octx = out; 4962306a36Sopenharmony_ci 5062306a36Sopenharmony_ci octx->count = sctx->count; 5162306a36Sopenharmony_ci memcpy(octx->state, sctx->state, sizeof(octx->state)); 5262306a36Sopenharmony_ci memcpy(octx->buffer, sctx->buf, sizeof(octx->buffer)); 5362306a36Sopenharmony_ci return 0; 5462306a36Sopenharmony_ci} 5562306a36Sopenharmony_ci 5662306a36Sopenharmony_cistatic int s390_sha1_import(struct shash_desc *desc, const void *in) 5762306a36Sopenharmony_ci{ 5862306a36Sopenharmony_ci struct s390_sha_ctx *sctx = shash_desc_ctx(desc); 5962306a36Sopenharmony_ci const struct sha1_state *ictx = in; 6062306a36Sopenharmony_ci 6162306a36Sopenharmony_ci sctx->count = ictx->count; 6262306a36Sopenharmony_ci memcpy(sctx->state, ictx->state, sizeof(ictx->state)); 6362306a36Sopenharmony_ci memcpy(sctx->buf, ictx->buffer, sizeof(ictx->buffer)); 6462306a36Sopenharmony_ci sctx->func = CPACF_KIMD_SHA_1; 6562306a36Sopenharmony_ci return 0; 6662306a36Sopenharmony_ci} 6762306a36Sopenharmony_ci 6862306a36Sopenharmony_cistatic struct shash_alg alg = { 6962306a36Sopenharmony_ci .digestsize = SHA1_DIGEST_SIZE, 7062306a36Sopenharmony_ci .init = s390_sha1_init, 7162306a36Sopenharmony_ci .update = s390_sha_update, 7262306a36Sopenharmony_ci .final = s390_sha_final, 7362306a36Sopenharmony_ci .export = s390_sha1_export, 7462306a36Sopenharmony_ci .import = s390_sha1_import, 7562306a36Sopenharmony_ci .descsize = sizeof(struct s390_sha_ctx), 7662306a36Sopenharmony_ci .statesize = sizeof(struct sha1_state), 7762306a36Sopenharmony_ci .base = { 7862306a36Sopenharmony_ci .cra_name = "sha1", 7962306a36Sopenharmony_ci .cra_driver_name= "sha1-s390", 8062306a36Sopenharmony_ci .cra_priority = 300, 8162306a36Sopenharmony_ci .cra_blocksize = SHA1_BLOCK_SIZE, 8262306a36Sopenharmony_ci .cra_module = THIS_MODULE, 8362306a36Sopenharmony_ci } 8462306a36Sopenharmony_ci}; 8562306a36Sopenharmony_ci 8662306a36Sopenharmony_cistatic int __init sha1_s390_init(void) 8762306a36Sopenharmony_ci{ 8862306a36Sopenharmony_ci if (!cpacf_query_func(CPACF_KIMD, CPACF_KIMD_SHA_1)) 8962306a36Sopenharmony_ci return -ENODEV; 9062306a36Sopenharmony_ci return crypto_register_shash(&alg); 9162306a36Sopenharmony_ci} 9262306a36Sopenharmony_ci 9362306a36Sopenharmony_cistatic void __exit sha1_s390_fini(void) 9462306a36Sopenharmony_ci{ 9562306a36Sopenharmony_ci crypto_unregister_shash(&alg); 9662306a36Sopenharmony_ci} 9762306a36Sopenharmony_ci 9862306a36Sopenharmony_cimodule_cpu_feature_match(S390_CPU_FEATURE_MSA, sha1_s390_init); 9962306a36Sopenharmony_cimodule_exit(sha1_s390_fini); 10062306a36Sopenharmony_ci 10162306a36Sopenharmony_ciMODULE_ALIAS_CRYPTO("sha1"); 10262306a36Sopenharmony_ciMODULE_LICENSE("GPL"); 10362306a36Sopenharmony_ciMODULE_DESCRIPTION("SHA1 Secure Hash Algorithm"); 104