-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
s390/crypto: Support for SHA3 via CPACF (MSA6)
This patch introduces sha3 support for s390. - Rework the s390-specific SHA1 and SHA2 related code to provide the basis for SHA3. - Provide two new kernel modules sha3_256_s390 and sha3_512_s390 together with new kernel options. Signed-off-by: Joerg Schmidbauer <jschmidb@de.ibm.com> Reviewed-by: Ingo Franzki <ifranzki@linux.ibm.com> Reviewed-by: Harald Freudenberger <freude@linux.ibm.com> Signed-off-by: Heiko Carstens <heiko.carstens@de.ibm.com>
- Loading branch information
Joerg Schmidbauer
authored and
Heiko Carstens
committed
Sep 13, 2019
1 parent
724dc33
commit 3c2eb6b
Showing
9 changed files
with
395 additions
and
28 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,147 @@ | ||
// SPDX-License-Identifier: GPL-2.0+ | ||
/* | ||
* Cryptographic API. | ||
* | ||
* s390 implementation of the SHA256 and SHA224 Secure Hash Algorithm. | ||
* | ||
* s390 Version: | ||
* Copyright IBM Corp. 2019 | ||
* Author(s): Joerg Schmidbauer (jschmidb@de.ibm.com) | ||
*/ | ||
#include <crypto/internal/hash.h> | ||
#include <linux/init.h> | ||
#include <linux/module.h> | ||
#include <linux/cpufeature.h> | ||
#include <crypto/sha.h> | ||
#include <crypto/sha3.h> | ||
#include <asm/cpacf.h> | ||
|
||
#include "sha.h" | ||
|
||
static int sha3_256_init(struct shash_desc *desc) | ||
{ | ||
struct s390_sha_ctx *sctx = shash_desc_ctx(desc); | ||
|
||
memset(sctx->state, 0, sizeof(sctx->state)); | ||
sctx->count = 0; | ||
sctx->func = CPACF_KIMD_SHA3_256; | ||
|
||
return 0; | ||
} | ||
|
||
static int sha3_256_export(struct shash_desc *desc, void *out) | ||
{ | ||
struct s390_sha_ctx *sctx = shash_desc_ctx(desc); | ||
struct sha3_state *octx = out; | ||
|
||
octx->rsiz = sctx->count; | ||
memcpy(octx->st, sctx->state, sizeof(octx->st)); | ||
memcpy(octx->buf, sctx->buf, sizeof(octx->buf)); | ||
|
||
return 0; | ||
} | ||
|
||
static int sha3_256_import(struct shash_desc *desc, const void *in) | ||
{ | ||
struct s390_sha_ctx *sctx = shash_desc_ctx(desc); | ||
const struct sha3_state *ictx = in; | ||
|
||
sctx->count = ictx->rsiz; | ||
memcpy(sctx->state, ictx->st, sizeof(ictx->st)); | ||
memcpy(sctx->buf, ictx->buf, sizeof(ictx->buf)); | ||
sctx->func = CPACF_KIMD_SHA3_256; | ||
|
||
return 0; | ||
} | ||
|
||
static int sha3_224_import(struct shash_desc *desc, const void *in) | ||
{ | ||
struct s390_sha_ctx *sctx = shash_desc_ctx(desc); | ||
const struct sha3_state *ictx = in; | ||
|
||
sctx->count = ictx->rsiz; | ||
memcpy(sctx->state, ictx->st, sizeof(ictx->st)); | ||
memcpy(sctx->buf, ictx->buf, sizeof(ictx->buf)); | ||
sctx->func = CPACF_KIMD_SHA3_224; | ||
|
||
return 0; | ||
} | ||
|
||
static struct shash_alg sha3_256_alg = { | ||
.digestsize = SHA3_256_DIGEST_SIZE, /* = 32 */ | ||
.init = sha3_256_init, | ||
.update = s390_sha_update, | ||
.final = s390_sha_final, | ||
.export = sha3_256_export, | ||
.import = sha3_256_import, | ||
.descsize = sizeof(struct s390_sha_ctx), | ||
.statesize = sizeof(struct sha3_state), | ||
.base = { | ||
.cra_name = "sha3-256", | ||
.cra_driver_name = "sha3-256-s390", | ||
.cra_priority = 300, | ||
.cra_blocksize = SHA3_256_BLOCK_SIZE, | ||
.cra_module = THIS_MODULE, | ||
} | ||
}; | ||
|
||
static int sha3_224_init(struct shash_desc *desc) | ||
{ | ||
struct s390_sha_ctx *sctx = shash_desc_ctx(desc); | ||
|
||
memset(sctx->state, 0, sizeof(sctx->state)); | ||
sctx->count = 0; | ||
sctx->func = CPACF_KIMD_SHA3_224; | ||
|
||
return 0; | ||
} | ||
|
||
static struct shash_alg sha3_224_alg = { | ||
.digestsize = SHA3_224_DIGEST_SIZE, | ||
.init = sha3_224_init, | ||
.update = s390_sha_update, | ||
.final = s390_sha_final, | ||
.export = sha3_256_export, /* same as for 256 */ | ||
.import = sha3_224_import, /* function code different! */ | ||
.descsize = sizeof(struct s390_sha_ctx), | ||
.statesize = sizeof(struct sha3_state), | ||
.base = { | ||
.cra_name = "sha3-224", | ||
.cra_driver_name = "sha3-224-s390", | ||
.cra_priority = 300, | ||
.cra_blocksize = SHA3_224_BLOCK_SIZE, | ||
.cra_module = THIS_MODULE, | ||
} | ||
}; | ||
|
||
static int __init sha3_256_s390_init(void) | ||
{ | ||
int ret; | ||
|
||
if (!cpacf_query_func(CPACF_KIMD, CPACF_KIMD_SHA3_256)) | ||
return -ENODEV; | ||
|
||
ret = crypto_register_shash(&sha3_256_alg); | ||
if (ret < 0) | ||
goto out; | ||
|
||
ret = crypto_register_shash(&sha3_224_alg); | ||
if (ret < 0) | ||
crypto_unregister_shash(&sha3_256_alg); | ||
out: | ||
return ret; | ||
} | ||
|
||
static void __exit sha3_256_s390_fini(void) | ||
{ | ||
crypto_unregister_shash(&sha3_224_alg); | ||
crypto_unregister_shash(&sha3_256_alg); | ||
} | ||
|
||
module_cpu_feature_match(MSA, sha3_256_s390_init); | ||
module_exit(sha3_256_s390_fini); | ||
|
||
MODULE_ALIAS_CRYPTO("sha3-256"); | ||
MODULE_ALIAS_CRYPTO("sha3-224"); | ||
MODULE_LICENSE("GPL"); | ||
MODULE_DESCRIPTION("SHA3-256 and SHA3-224 Secure Hash Algorithm"); |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,155 @@ | ||
// SPDX-License-Identifier: GPL-2.0+ | ||
/* | ||
* Cryptographic API. | ||
* | ||
* s390 implementation of the SHA512 and SHA384 Secure Hash Algorithm. | ||
* | ||
* Copyright IBM Corp. 2019 | ||
* Author(s): Joerg Schmidbauer (jschmidb@de.ibm.com) | ||
*/ | ||
#include <crypto/internal/hash.h> | ||
#include <linux/init.h> | ||
#include <linux/module.h> | ||
#include <linux/cpufeature.h> | ||
#include <crypto/sha.h> | ||
#include <crypto/sha3.h> | ||
#include <asm/cpacf.h> | ||
|
||
#include "sha.h" | ||
|
||
static int sha3_512_init(struct shash_desc *desc) | ||
{ | ||
struct s390_sha_ctx *sctx = shash_desc_ctx(desc); | ||
|
||
memset(sctx->state, 0, sizeof(sctx->state)); | ||
sctx->count = 0; | ||
sctx->func = CPACF_KIMD_SHA3_512; | ||
|
||
return 0; | ||
} | ||
|
||
static int sha3_512_export(struct shash_desc *desc, void *out) | ||
{ | ||
struct s390_sha_ctx *sctx = shash_desc_ctx(desc); | ||
struct sha3_state *octx = out; | ||
|
||
octx->rsiz = sctx->count; | ||
octx->rsizw = sctx->count >> 32; | ||
|
||
memcpy(octx->st, sctx->state, sizeof(octx->st)); | ||
memcpy(octx->buf, sctx->buf, sizeof(octx->buf)); | ||
|
||
return 0; | ||
} | ||
|
||
static int sha3_512_import(struct shash_desc *desc, const void *in) | ||
{ | ||
struct s390_sha_ctx *sctx = shash_desc_ctx(desc); | ||
const struct sha3_state *ictx = in; | ||
|
||
if (unlikely(ictx->rsizw)) | ||
return -ERANGE; | ||
sctx->count = ictx->rsiz; | ||
|
||
memcpy(sctx->state, ictx->st, sizeof(ictx->st)); | ||
memcpy(sctx->buf, ictx->buf, sizeof(ictx->buf)); | ||
sctx->func = CPACF_KIMD_SHA3_512; | ||
|
||
return 0; | ||
} | ||
|
||
static int sha3_384_import(struct shash_desc *desc, const void *in) | ||
{ | ||
struct s390_sha_ctx *sctx = shash_desc_ctx(desc); | ||
const struct sha3_state *ictx = in; | ||
|
||
if (unlikely(ictx->rsizw)) | ||
return -ERANGE; | ||
sctx->count = ictx->rsiz; | ||
|
||
memcpy(sctx->state, ictx->st, sizeof(ictx->st)); | ||
memcpy(sctx->buf, ictx->buf, sizeof(ictx->buf)); | ||
sctx->func = CPACF_KIMD_SHA3_384; | ||
|
||
return 0; | ||
} | ||
|
||
static struct shash_alg sha3_512_alg = { | ||
.digestsize = SHA3_512_DIGEST_SIZE, | ||
.init = sha3_512_init, | ||
.update = s390_sha_update, | ||
.final = s390_sha_final, | ||
.export = sha3_512_export, | ||
.import = sha3_512_import, | ||
.descsize = sizeof(struct s390_sha_ctx), | ||
.statesize = sizeof(struct sha3_state), | ||
.base = { | ||
.cra_name = "sha3-512", | ||
.cra_driver_name = "sha3-512-s390", | ||
.cra_priority = 300, | ||
.cra_blocksize = SHA3_512_BLOCK_SIZE, | ||
.cra_module = THIS_MODULE, | ||
} | ||
}; | ||
|
||
MODULE_ALIAS_CRYPTO("sha3-512"); | ||
|
||
static int sha3_384_init(struct shash_desc *desc) | ||
{ | ||
struct s390_sha_ctx *sctx = shash_desc_ctx(desc); | ||
|
||
memset(sctx->state, 0, sizeof(sctx->state)); | ||
sctx->count = 0; | ||
sctx->func = CPACF_KIMD_SHA3_384; | ||
|
||
return 0; | ||
} | ||
|
||
static struct shash_alg sha3_384_alg = { | ||
.digestsize = SHA3_384_DIGEST_SIZE, | ||
.init = sha3_384_init, | ||
.update = s390_sha_update, | ||
.final = s390_sha_final, | ||
.export = sha3_512_export, /* same as for 512 */ | ||
.import = sha3_384_import, /* function code different! */ | ||
.descsize = sizeof(struct s390_sha_ctx), | ||
.statesize = sizeof(struct sha3_state), | ||
.base = { | ||
.cra_name = "sha3-384", | ||
.cra_driver_name = "sha3-384-s390", | ||
.cra_priority = 300, | ||
.cra_blocksize = SHA3_384_BLOCK_SIZE, | ||
.cra_ctxsize = sizeof(struct s390_sha_ctx), | ||
.cra_module = THIS_MODULE, | ||
} | ||
}; | ||
|
||
MODULE_ALIAS_CRYPTO("sha3-384"); | ||
|
||
static int __init init(void) | ||
{ | ||
int ret; | ||
|
||
if (!cpacf_query_func(CPACF_KIMD, CPACF_KIMD_SHA3_512)) | ||
return -ENODEV; | ||
ret = crypto_register_shash(&sha3_512_alg); | ||
if (ret < 0) | ||
goto out; | ||
ret = crypto_register_shash(&sha3_384_alg); | ||
if (ret < 0) | ||
crypto_unregister_shash(&sha3_512_alg); | ||
out: | ||
return ret; | ||
} | ||
|
||
static void __exit fini(void) | ||
{ | ||
crypto_unregister_shash(&sha3_512_alg); | ||
crypto_unregister_shash(&sha3_384_alg); | ||
} | ||
|
||
module_cpu_feature_match(MSA, init); | ||
module_exit(fini); | ||
|
||
MODULE_LICENSE("GPL"); | ||
MODULE_DESCRIPTION("SHA3-512 and SHA3-384 Secure Hash Algorithm"); |
Oops, something went wrong.