10a497c17fee428604e06320272ff74415eacdc31Jan Glauber/* 20a497c17fee428604e06320272ff74415eacdc31Jan Glauber * Cryptographic API. 30a497c17fee428604e06320272ff74415eacdc31Jan Glauber * 4e3b4f515c43553a9950017d8d052541ccb8081faJan Glauber * s390 implementation of the SHA256 and SHA224 Secure Hash Algorithm. 50a497c17fee428604e06320272ff74415eacdc31Jan Glauber * 60a497c17fee428604e06320272ff74415eacdc31Jan Glauber * s390 Version: 7a53c8fab3f87c995c30ac226a03af95361243144Heiko Carstens * Copyright IBM Corp. 2005, 2011 80a497c17fee428604e06320272ff74415eacdc31Jan Glauber * Author(s): Jan Glauber (jang@de.ibm.com) 90a497c17fee428604e06320272ff74415eacdc31Jan Glauber * 100a497c17fee428604e06320272ff74415eacdc31Jan Glauber * This program is free software; you can redistribute it and/or modify it 110a497c17fee428604e06320272ff74415eacdc31Jan Glauber * under the terms of the GNU General Public License as published by the Free 120a497c17fee428604e06320272ff74415eacdc31Jan Glauber * Software Foundation; either version 2 of the License, or (at your option) 130a497c17fee428604e06320272ff74415eacdc31Jan Glauber * any later version. 140a497c17fee428604e06320272ff74415eacdc31Jan Glauber * 150a497c17fee428604e06320272ff74415eacdc31Jan Glauber */ 16563f346d04e8373739240604a51ce8529dd9f07eHerbert Xu#include <crypto/internal/hash.h> 170a497c17fee428604e06320272ff74415eacdc31Jan Glauber#include <linux/init.h> 180a497c17fee428604e06320272ff74415eacdc31Jan Glauber#include <linux/module.h> 195265eeb2b036835021591173ac64e624baaff55cJan Glauber#include <crypto/sha.h> 200a497c17fee428604e06320272ff74415eacdc31Jan Glauber 210a497c17fee428604e06320272ff74415eacdc31Jan Glauber#include "crypt_s390.h" 22604973f1fe41b817c1badb3df2008fe641e50ae6Jan Glauber#include "sha.h" 230a497c17fee428604e06320272ff74415eacdc31Jan Glauber 24563f346d04e8373739240604a51ce8529dd9f07eHerbert Xustatic int sha256_init(struct shash_desc *desc) 250a497c17fee428604e06320272ff74415eacdc31Jan Glauber{ 26563f346d04e8373739240604a51ce8529dd9f07eHerbert Xu struct s390_sha_ctx *sctx = shash_desc_ctx(desc); 270a497c17fee428604e06320272ff74415eacdc31Jan Glauber 285265eeb2b036835021591173ac64e624baaff55cJan Glauber sctx->state[0] = SHA256_H0; 295265eeb2b036835021591173ac64e624baaff55cJan Glauber sctx->state[1] = SHA256_H1; 305265eeb2b036835021591173ac64e624baaff55cJan Glauber sctx->state[2] = SHA256_H2; 315265eeb2b036835021591173ac64e624baaff55cJan Glauber sctx->state[3] = SHA256_H3; 325265eeb2b036835021591173ac64e624baaff55cJan Glauber sctx->state[4] = SHA256_H4; 335265eeb2b036835021591173ac64e624baaff55cJan Glauber sctx->state[5] = SHA256_H5; 345265eeb2b036835021591173ac64e624baaff55cJan Glauber sctx->state[6] = SHA256_H6; 355265eeb2b036835021591173ac64e624baaff55cJan Glauber sctx->state[7] = SHA256_H7; 360a497c17fee428604e06320272ff74415eacdc31Jan Glauber sctx->count = 0; 37604973f1fe41b817c1badb3df2008fe641e50ae6Jan Glauber sctx->func = KIMD_SHA_256; 38563f346d04e8373739240604a51ce8529dd9f07eHerbert Xu 39563f346d04e8373739240604a51ce8529dd9f07eHerbert Xu return 0; 400a497c17fee428604e06320272ff74415eacdc31Jan Glauber} 410a497c17fee428604e06320272ff74415eacdc31Jan Glauber 42f63559bef380a95093408691c1081f07da755b74Herbert Xustatic int sha256_export(struct shash_desc *desc, void *out) 43f63559bef380a95093408691c1081f07da755b74Herbert Xu{ 44f63559bef380a95093408691c1081f07da755b74Herbert Xu struct s390_sha_ctx *sctx = shash_desc_ctx(desc); 45f63559bef380a95093408691c1081f07da755b74Herbert Xu struct sha256_state *octx = out; 46f63559bef380a95093408691c1081f07da755b74Herbert Xu 47f63559bef380a95093408691c1081f07da755b74Herbert Xu octx->count = sctx->count; 48f63559bef380a95093408691c1081f07da755b74Herbert Xu memcpy(octx->state, sctx->state, sizeof(octx->state)); 49f63559bef380a95093408691c1081f07da755b74Herbert Xu memcpy(octx->buf, sctx->buf, sizeof(octx->buf)); 50f63559bef380a95093408691c1081f07da755b74Herbert Xu return 0; 51f63559bef380a95093408691c1081f07da755b74Herbert Xu} 52f63559bef380a95093408691c1081f07da755b74Herbert Xu 5381bd5f6c966cf2f137c2759dfc78abdffcff055eJan Glauberstatic int sha256_import(struct shash_desc *desc, const void *in) 54f63559bef380a95093408691c1081f07da755b74Herbert Xu{ 552a549c364aa11e658ae14b71861d25474e5808cfSachin Sant struct s390_sha_ctx *sctx = shash_desc_ctx(desc); 5681bd5f6c966cf2f137c2759dfc78abdffcff055eJan Glauber const struct sha256_state *ictx = in; 57f63559bef380a95093408691c1081f07da755b74Herbert Xu 58f63559bef380a95093408691c1081f07da755b74Herbert Xu sctx->count = ictx->count; 59f63559bef380a95093408691c1081f07da755b74Herbert Xu memcpy(sctx->state, ictx->state, sizeof(ictx->state)); 60f63559bef380a95093408691c1081f07da755b74Herbert Xu memcpy(sctx->buf, ictx->buf, sizeof(ictx->buf)); 61f63559bef380a95093408691c1081f07da755b74Herbert Xu sctx->func = KIMD_SHA_256; 62f63559bef380a95093408691c1081f07da755b74Herbert Xu return 0; 63f63559bef380a95093408691c1081f07da755b74Herbert Xu} 64f63559bef380a95093408691c1081f07da755b74Herbert Xu 65e3b4f515c43553a9950017d8d052541ccb8081faJan Glauberstatic struct shash_alg sha256_alg = { 66563f346d04e8373739240604a51ce8529dd9f07eHerbert Xu .digestsize = SHA256_DIGEST_SIZE, 67563f346d04e8373739240604a51ce8529dd9f07eHerbert Xu .init = sha256_init, 68563f346d04e8373739240604a51ce8529dd9f07eHerbert Xu .update = s390_sha_update, 69563f346d04e8373739240604a51ce8529dd9f07eHerbert Xu .final = s390_sha_final, 70f63559bef380a95093408691c1081f07da755b74Herbert Xu .export = sha256_export, 71f63559bef380a95093408691c1081f07da755b74Herbert Xu .import = sha256_import, 72563f346d04e8373739240604a51ce8529dd9f07eHerbert Xu .descsize = sizeof(struct s390_sha_ctx), 73f63559bef380a95093408691c1081f07da755b74Herbert Xu .statesize = sizeof(struct sha256_state), 74563f346d04e8373739240604a51ce8529dd9f07eHerbert Xu .base = { 75563f346d04e8373739240604a51ce8529dd9f07eHerbert Xu .cra_name = "sha256", 76563f346d04e8373739240604a51ce8529dd9f07eHerbert Xu .cra_driver_name= "sha256-s390", 77563f346d04e8373739240604a51ce8529dd9f07eHerbert Xu .cra_priority = CRYPT_S390_PRIORITY, 78563f346d04e8373739240604a51ce8529dd9f07eHerbert Xu .cra_flags = CRYPTO_ALG_TYPE_SHASH, 79563f346d04e8373739240604a51ce8529dd9f07eHerbert Xu .cra_blocksize = SHA256_BLOCK_SIZE, 80563f346d04e8373739240604a51ce8529dd9f07eHerbert Xu .cra_module = THIS_MODULE, 81563f346d04e8373739240604a51ce8529dd9f07eHerbert Xu } 820a497c17fee428604e06320272ff74415eacdc31Jan Glauber}; 830a497c17fee428604e06320272ff74415eacdc31Jan Glauber 84e3b4f515c43553a9950017d8d052541ccb8081faJan Glauberstatic int sha224_init(struct shash_desc *desc) 850a497c17fee428604e06320272ff74415eacdc31Jan Glauber{ 86e3b4f515c43553a9950017d8d052541ccb8081faJan Glauber struct s390_sha_ctx *sctx = shash_desc_ctx(desc); 87e3b4f515c43553a9950017d8d052541ccb8081faJan Glauber 88e3b4f515c43553a9950017d8d052541ccb8081faJan Glauber sctx->state[0] = SHA224_H0; 89e3b4f515c43553a9950017d8d052541ccb8081faJan Glauber sctx->state[1] = SHA224_H1; 90e3b4f515c43553a9950017d8d052541ccb8081faJan Glauber sctx->state[2] = SHA224_H2; 91e3b4f515c43553a9950017d8d052541ccb8081faJan Glauber sctx->state[3] = SHA224_H3; 92e3b4f515c43553a9950017d8d052541ccb8081faJan Glauber sctx->state[4] = SHA224_H4; 93e3b4f515c43553a9950017d8d052541ccb8081faJan Glauber sctx->state[5] = SHA224_H5; 94e3b4f515c43553a9950017d8d052541ccb8081faJan Glauber sctx->state[6] = SHA224_H6; 95e3b4f515c43553a9950017d8d052541ccb8081faJan Glauber sctx->state[7] = SHA224_H7; 96e3b4f515c43553a9950017d8d052541ccb8081faJan Glauber sctx->count = 0; 97e3b4f515c43553a9950017d8d052541ccb8081faJan Glauber sctx->func = KIMD_SHA_256; 98e3b4f515c43553a9950017d8d052541ccb8081faJan Glauber 99e3b4f515c43553a9950017d8d052541ccb8081faJan Glauber return 0; 100e3b4f515c43553a9950017d8d052541ccb8081faJan Glauber} 101e3b4f515c43553a9950017d8d052541ccb8081faJan Glauber 102e3b4f515c43553a9950017d8d052541ccb8081faJan Glauberstatic struct shash_alg sha224_alg = { 103e3b4f515c43553a9950017d8d052541ccb8081faJan Glauber .digestsize = SHA224_DIGEST_SIZE, 104e3b4f515c43553a9950017d8d052541ccb8081faJan Glauber .init = sha224_init, 105e3b4f515c43553a9950017d8d052541ccb8081faJan Glauber .update = s390_sha_update, 106e3b4f515c43553a9950017d8d052541ccb8081faJan Glauber .final = s390_sha_final, 107e3b4f515c43553a9950017d8d052541ccb8081faJan Glauber .export = sha256_export, 108e3b4f515c43553a9950017d8d052541ccb8081faJan Glauber .import = sha256_import, 109e3b4f515c43553a9950017d8d052541ccb8081faJan Glauber .descsize = sizeof(struct s390_sha_ctx), 110e3b4f515c43553a9950017d8d052541ccb8081faJan Glauber .statesize = sizeof(struct sha256_state), 111e3b4f515c43553a9950017d8d052541ccb8081faJan Glauber .base = { 112e3b4f515c43553a9950017d8d052541ccb8081faJan Glauber .cra_name = "sha224", 113e3b4f515c43553a9950017d8d052541ccb8081faJan Glauber .cra_driver_name= "sha224-s390", 114e3b4f515c43553a9950017d8d052541ccb8081faJan Glauber .cra_priority = CRYPT_S390_PRIORITY, 115e3b4f515c43553a9950017d8d052541ccb8081faJan Glauber .cra_flags = CRYPTO_ALG_TYPE_SHASH, 116e3b4f515c43553a9950017d8d052541ccb8081faJan Glauber .cra_blocksize = SHA224_BLOCK_SIZE, 117e3b4f515c43553a9950017d8d052541ccb8081faJan Glauber .cra_module = THIS_MODULE, 118e3b4f515c43553a9950017d8d052541ccb8081faJan Glauber } 119e3b4f515c43553a9950017d8d052541ccb8081faJan Glauber}; 120e3b4f515c43553a9950017d8d052541ccb8081faJan Glauber 121e3b4f515c43553a9950017d8d052541ccb8081faJan Glauberstatic int __init sha256_s390_init(void) 122e3b4f515c43553a9950017d8d052541ccb8081faJan Glauber{ 123e3b4f515c43553a9950017d8d052541ccb8081faJan Glauber int ret; 124e3b4f515c43553a9950017d8d052541ccb8081faJan Glauber 1251822bc9093e05059e4144d6041b0f5450ad275e1Jan Glauber if (!crypt_s390_func_available(KIMD_SHA_256, CRYPT_S390_MSA)) 12686aa9fc2456d8a662f299a70bdb70987209170f0Jan Glauber return -EOPNOTSUPP; 127e3b4f515c43553a9950017d8d052541ccb8081faJan Glauber ret = crypto_register_shash(&sha256_alg); 128e3b4f515c43553a9950017d8d052541ccb8081faJan Glauber if (ret < 0) 129e3b4f515c43553a9950017d8d052541ccb8081faJan Glauber goto out; 130e3b4f515c43553a9950017d8d052541ccb8081faJan Glauber ret = crypto_register_shash(&sha224_alg); 131e3b4f515c43553a9950017d8d052541ccb8081faJan Glauber if (ret < 0) 132e3b4f515c43553a9950017d8d052541ccb8081faJan Glauber crypto_unregister_shash(&sha256_alg); 133e3b4f515c43553a9950017d8d052541ccb8081faJan Glauberout: 134e3b4f515c43553a9950017d8d052541ccb8081faJan Glauber return ret; 1350a497c17fee428604e06320272ff74415eacdc31Jan Glauber} 1360a497c17fee428604e06320272ff74415eacdc31Jan Glauber 1379f7819c1e51d5310d012426599a5f49d8678119dHeiko Carstensstatic void __exit sha256_s390_fini(void) 1380a497c17fee428604e06320272ff74415eacdc31Jan Glauber{ 139e3b4f515c43553a9950017d8d052541ccb8081faJan Glauber crypto_unregister_shash(&sha224_alg); 140e3b4f515c43553a9950017d8d052541ccb8081faJan Glauber crypto_unregister_shash(&sha256_alg); 1410a497c17fee428604e06320272ff74415eacdc31Jan Glauber} 1420a497c17fee428604e06320272ff74415eacdc31Jan Glauber 1439f7819c1e51d5310d012426599a5f49d8678119dHeiko Carstensmodule_init(sha256_s390_init); 1449f7819c1e51d5310d012426599a5f49d8678119dHeiko Carstensmodule_exit(sha256_s390_fini); 1450a497c17fee428604e06320272ff74415eacdc31Jan Glauber 1460a497c17fee428604e06320272ff74415eacdc31Jan GlauberMODULE_ALIAS("sha256"); 147e3b4f515c43553a9950017d8d052541ccb8081faJan GlauberMODULE_ALIAS("sha224"); 1480a497c17fee428604e06320272ff74415eacdc31Jan GlauberMODULE_LICENSE("GPL"); 149e3b4f515c43553a9950017d8d052541ccb8081faJan GlauberMODULE_DESCRIPTION("SHA256 and SHA224 Secure Hash Algorithm"); 150