1 /* 2 * Cryptographic API. 3 * 4 * s390 implementation of the SHA512 and SHA38 Secure Hash Algorithm. 5 * 6 * Copyright IBM Corp. 2007 7 * Author(s): Jan Glauber (jang@de.ibm.com) 8 * 9 * This program is free software; you can redistribute it and/or modify it 10 * under the terms of the GNU General Public License as published by the Free 11 * Software Foundation; either version 2 of the License, or (at your option) 12 * any later version. 13 * 14 */ 15 #include <crypto/internal/hash.h> 16 #include <linux/init.h> 17 #include <linux/module.h> 18 19 #include "sha.h" 20 #include "crypt_s390.h" 21 22 static int sha512_init(struct shash_desc *desc) 23 { 24 struct s390_sha_ctx *ctx = shash_desc_ctx(desc); 25 26 *(__u64 *)&ctx->state[0] = 0x6a09e667f3bcc908ULL; 27 *(__u64 *)&ctx->state[2] = 0xbb67ae8584caa73bULL; 28 *(__u64 *)&ctx->state[4] = 0x3c6ef372fe94f82bULL; 29 *(__u64 *)&ctx->state[6] = 0xa54ff53a5f1d36f1ULL; 30 *(__u64 *)&ctx->state[8] = 0x510e527fade682d1ULL; 31 *(__u64 *)&ctx->state[10] = 0x9b05688c2b3e6c1fULL; 32 *(__u64 *)&ctx->state[12] = 0x1f83d9abfb41bd6bULL; 33 *(__u64 *)&ctx->state[14] = 0x5be0cd19137e2179ULL; 34 ctx->count = 0; 35 ctx->func = KIMD_SHA_512; 36 37 return 0; 38 } 39 40 static struct shash_alg sha512_alg = { 41 .digestsize = SHA512_DIGEST_SIZE, 42 .init = sha512_init, 43 .update = s390_sha_update, 44 .final = s390_sha_final, 45 .descsize = sizeof(struct s390_sha_ctx), 46 .base = { 47 .cra_name = "sha512", 48 .cra_driver_name= "sha512-s390", 49 .cra_priority = CRYPT_S390_PRIORITY, 50 .cra_flags = CRYPTO_ALG_TYPE_SHASH, 51 .cra_blocksize = SHA512_BLOCK_SIZE, 52 .cra_module = THIS_MODULE, 53 } 54 }; 55 56 MODULE_ALIAS("sha512"); 57 58 static int sha384_init(struct shash_desc *desc) 59 { 60 struct s390_sha_ctx *ctx = shash_desc_ctx(desc); 61 62 *(__u64 *)&ctx->state[0] = 0xcbbb9d5dc1059ed8ULL; 63 *(__u64 *)&ctx->state[2] = 0x629a292a367cd507ULL; 64 *(__u64 *)&ctx->state[4] = 0x9159015a3070dd17ULL; 65 *(__u64 *)&ctx->state[6] = 0x152fecd8f70e5939ULL; 66 *(__u64 *)&ctx->state[8] = 0x67332667ffc00b31ULL; 67 *(__u64 *)&ctx->state[10] = 0x8eb44a8768581511ULL; 68 *(__u64 *)&ctx->state[12] = 0xdb0c2e0d64f98fa7ULL; 69 *(__u64 *)&ctx->state[14] = 0x47b5481dbefa4fa4ULL; 70 ctx->count = 0; 71 ctx->func = KIMD_SHA_512; 72 73 return 0; 74 } 75 76 static struct shash_alg sha384_alg = { 77 .digestsize = SHA384_DIGEST_SIZE, 78 .init = sha384_init, 79 .update = s390_sha_update, 80 .final = s390_sha_final, 81 .descsize = sizeof(struct s390_sha_ctx), 82 .base = { 83 .cra_name = "sha384", 84 .cra_driver_name= "sha384-s390", 85 .cra_priority = CRYPT_S390_PRIORITY, 86 .cra_flags = CRYPTO_ALG_TYPE_SHASH, 87 .cra_blocksize = SHA384_BLOCK_SIZE, 88 .cra_ctxsize = sizeof(struct s390_sha_ctx), 89 .cra_module = THIS_MODULE, 90 } 91 }; 92 93 MODULE_ALIAS("sha384"); 94 95 static int __init init(void) 96 { 97 int ret; 98 99 if (!crypt_s390_func_available(KIMD_SHA_512)) 100 return -EOPNOTSUPP; 101 if ((ret = crypto_register_shash(&sha512_alg)) < 0) 102 goto out; 103 if ((ret = crypto_register_shash(&sha384_alg)) < 0) 104 crypto_unregister_shash(&sha512_alg); 105 out: 106 return ret; 107 } 108 109 static void __exit fini(void) 110 { 111 crypto_unregister_shash(&sha512_alg); 112 crypto_unregister_shash(&sha384_alg); 113 } 114 115 module_init(init); 116 module_exit(fini); 117 118 MODULE_LICENSE("GPL"); 119 MODULE_DESCRIPTION("SHA512 and SHA-384 Secure Hash Algorithm"); 120