diff options
author | Jan Glauber <jang@linux.vnet.ibm.com> | 2011-07-04 08:06:01 -0400 |
---|---|---|
committer | Herbert Xu <herbert@gondor.apana.org.au> | 2011-07-04 08:06:01 -0400 |
commit | e3b4f515c43553a9950017d8d052541ccb8081fa (patch) | |
tree | c3c3cbc20f333990a8afd8085f20cfae738362a4 /arch/s390 | |
parent | 269230e7c52623cda279010c8032a6f5b59caaaf (diff) |
crypto: s390 - support hardware accelerated SHA-224
On recent s390 machines hardware acceleration is available for SHA-256.
SHA-224 is based on SHA-256 so it can also be accelerated by hardware.
Do this by adding the proper algorithm description and initialization.
Signed-off-by: Jan Glauber <jang@linux.vnet.ibm.com>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
Diffstat (limited to 'arch/s390')
-rw-r--r-- | arch/s390/crypto/sha256_s390.c | 66 |
1 files changed, 55 insertions, 11 deletions
diff --git a/arch/s390/crypto/sha256_s390.c b/arch/s390/crypto/sha256_s390.c index 5ed8d64fc2ed..0317a3547cb9 100644 --- a/arch/s390/crypto/sha256_s390.c +++ b/arch/s390/crypto/sha256_s390.c | |||
@@ -1,15 +1,12 @@ | |||
1 | /* | 1 | /* |
2 | * Cryptographic API. | 2 | * Cryptographic API. |
3 | * | 3 | * |
4 | * s390 implementation of the SHA256 Secure Hash Algorithm. | 4 | * s390 implementation of the SHA256 and SHA224 Secure Hash Algorithm. |
5 | * | 5 | * |
6 | * s390 Version: | 6 | * s390 Version: |
7 | * Copyright IBM Corp. 2005,2007 | 7 | * Copyright IBM Corp. 2005,2011 |
8 | * Author(s): Jan Glauber (jang@de.ibm.com) | 8 | * Author(s): Jan Glauber (jang@de.ibm.com) |
9 | * | 9 | * |
10 | * Derived from "crypto/sha256_generic.c" | ||
11 | * and "arch/s390/crypto/sha1_s390.c" | ||
12 | * | ||
13 | * This program is free software; you can redistribute it and/or modify it | 10 | * This program is free software; you can redistribute it and/or modify it |
14 | * under the terms of the GNU General Public License as published by the Free | 11 | * under the terms of the GNU General Public License as published by the Free |
15 | * Software Foundation; either version 2 of the License, or (at your option) | 12 | * Software Foundation; either version 2 of the License, or (at your option) |
@@ -65,7 +62,7 @@ static int sha256_import(struct shash_desc *desc, const void *in) | |||
65 | return 0; | 62 | return 0; |
66 | } | 63 | } |
67 | 64 | ||
68 | static struct shash_alg alg = { | 65 | static struct shash_alg sha256_alg = { |
69 | .digestsize = SHA256_DIGEST_SIZE, | 66 | .digestsize = SHA256_DIGEST_SIZE, |
70 | .init = sha256_init, | 67 | .init = sha256_init, |
71 | .update = s390_sha_update, | 68 | .update = s390_sha_update, |
@@ -84,22 +81,69 @@ static struct shash_alg alg = { | |||
84 | } | 81 | } |
85 | }; | 82 | }; |
86 | 83 | ||
87 | static int sha256_s390_init(void) | 84 | static int sha224_init(struct shash_desc *desc) |
88 | { | 85 | { |
86 | struct s390_sha_ctx *sctx = shash_desc_ctx(desc); | ||
87 | |||
88 | sctx->state[0] = SHA224_H0; | ||
89 | sctx->state[1] = SHA224_H1; | ||
90 | sctx->state[2] = SHA224_H2; | ||
91 | sctx->state[3] = SHA224_H3; | ||
92 | sctx->state[4] = SHA224_H4; | ||
93 | sctx->state[5] = SHA224_H5; | ||
94 | sctx->state[6] = SHA224_H6; | ||
95 | sctx->state[7] = SHA224_H7; | ||
96 | sctx->count = 0; | ||
97 | sctx->func = KIMD_SHA_256; | ||
98 | |||
99 | return 0; | ||
100 | } | ||
101 | |||
102 | static struct shash_alg sha224_alg = { | ||
103 | .digestsize = SHA224_DIGEST_SIZE, | ||
104 | .init = sha224_init, | ||
105 | .update = s390_sha_update, | ||
106 | .final = s390_sha_final, | ||
107 | .export = sha256_export, | ||
108 | .import = sha256_import, | ||
109 | .descsize = sizeof(struct s390_sha_ctx), | ||
110 | .statesize = sizeof(struct sha256_state), | ||
111 | .base = { | ||
112 | .cra_name = "sha224", | ||
113 | .cra_driver_name= "sha224-s390", | ||
114 | .cra_priority = CRYPT_S390_PRIORITY, | ||
115 | .cra_flags = CRYPTO_ALG_TYPE_SHASH, | ||
116 | .cra_blocksize = SHA224_BLOCK_SIZE, | ||
117 | .cra_module = THIS_MODULE, | ||
118 | } | ||
119 | }; | ||
120 | |||
121 | static int __init sha256_s390_init(void) | ||
122 | { | ||
123 | int ret; | ||
124 | |||
89 | if (!crypt_s390_func_available(KIMD_SHA_256, CRYPT_S390_MSA)) | 125 | if (!crypt_s390_func_available(KIMD_SHA_256, CRYPT_S390_MSA)) |
90 | return -EOPNOTSUPP; | 126 | return -EOPNOTSUPP; |
91 | 127 | ret = crypto_register_shash(&sha256_alg); | |
92 | return crypto_register_shash(&alg); | 128 | if (ret < 0) |
129 | goto out; | ||
130 | ret = crypto_register_shash(&sha224_alg); | ||
131 | if (ret < 0) | ||
132 | crypto_unregister_shash(&sha256_alg); | ||
133 | out: | ||
134 | return ret; | ||
93 | } | 135 | } |
94 | 136 | ||
95 | static void __exit sha256_s390_fini(void) | 137 | static void __exit sha256_s390_fini(void) |
96 | { | 138 | { |
97 | crypto_unregister_shash(&alg); | 139 | crypto_unregister_shash(&sha224_alg); |
140 | crypto_unregister_shash(&sha256_alg); | ||
98 | } | 141 | } |
99 | 142 | ||
100 | module_init(sha256_s390_init); | 143 | module_init(sha256_s390_init); |
101 | module_exit(sha256_s390_fini); | 144 | module_exit(sha256_s390_fini); |
102 | 145 | ||
103 | MODULE_ALIAS("sha256"); | 146 | MODULE_ALIAS("sha256"); |
147 | MODULE_ALIAS("sha224"); | ||
104 | MODULE_LICENSE("GPL"); | 148 | MODULE_LICENSE("GPL"); |
105 | MODULE_DESCRIPTION("SHA256 Secure Hash Algorithm"); | 149 | MODULE_DESCRIPTION("SHA256 and SHA224 Secure Hash Algorithm"); |