sha512_s390.c 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114
  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 <linux/init.h>
  16. #include <linux/module.h>
  17. #include <linux/crypto.h>
  18. #include "sha.h"
  19. #include "crypt_s390.h"
  20. static void sha512_init(struct crypto_tfm *tfm)
  21. {
  22. struct s390_sha_ctx *ctx = crypto_tfm_ctx(tfm);
  23. *(__u64 *)&ctx->state[0] = 0x6a09e667f3bcc908ULL;
  24. *(__u64 *)&ctx->state[2] = 0xbb67ae8584caa73bULL;
  25. *(__u64 *)&ctx->state[4] = 0x3c6ef372fe94f82bULL;
  26. *(__u64 *)&ctx->state[6] = 0xa54ff53a5f1d36f1ULL;
  27. *(__u64 *)&ctx->state[8] = 0x510e527fade682d1ULL;
  28. *(__u64 *)&ctx->state[10] = 0x9b05688c2b3e6c1fULL;
  29. *(__u64 *)&ctx->state[12] = 0x1f83d9abfb41bd6bULL;
  30. *(__u64 *)&ctx->state[14] = 0x5be0cd19137e2179ULL;
  31. ctx->count = 0;
  32. ctx->func = KIMD_SHA_512;
  33. }
  34. static struct crypto_alg sha512_alg = {
  35. .cra_name = "sha512",
  36. .cra_driver_name = "sha512-s390",
  37. .cra_priority = CRYPT_S390_PRIORITY,
  38. .cra_flags = CRYPTO_ALG_TYPE_DIGEST,
  39. .cra_blocksize = SHA512_BLOCK_SIZE,
  40. .cra_ctxsize = sizeof(struct s390_sha_ctx),
  41. .cra_module = THIS_MODULE,
  42. .cra_list = LIST_HEAD_INIT(sha512_alg.cra_list),
  43. .cra_u = { .digest = {
  44. .dia_digestsize = SHA512_DIGEST_SIZE,
  45. .dia_init = sha512_init,
  46. .dia_update = s390_sha_update,
  47. .dia_final = s390_sha_final } }
  48. };
  49. MODULE_ALIAS("sha512");
  50. static void sha384_init(struct crypto_tfm *tfm)
  51. {
  52. struct s390_sha_ctx *ctx = crypto_tfm_ctx(tfm);
  53. *(__u64 *)&ctx->state[0] = 0xcbbb9d5dc1059ed8ULL;
  54. *(__u64 *)&ctx->state[2] = 0x629a292a367cd507ULL;
  55. *(__u64 *)&ctx->state[4] = 0x9159015a3070dd17ULL;
  56. *(__u64 *)&ctx->state[6] = 0x152fecd8f70e5939ULL;
  57. *(__u64 *)&ctx->state[8] = 0x67332667ffc00b31ULL;
  58. *(__u64 *)&ctx->state[10] = 0x8eb44a8768581511ULL;
  59. *(__u64 *)&ctx->state[12] = 0xdb0c2e0d64f98fa7ULL;
  60. *(__u64 *)&ctx->state[14] = 0x47b5481dbefa4fa4ULL;
  61. ctx->count = 0;
  62. ctx->func = KIMD_SHA_512;
  63. }
  64. static struct crypto_alg sha384_alg = {
  65. .cra_name = "sha384",
  66. .cra_driver_name = "sha384-s390",
  67. .cra_priority = CRYPT_S390_PRIORITY,
  68. .cra_flags = CRYPTO_ALG_TYPE_DIGEST,
  69. .cra_blocksize = SHA384_BLOCK_SIZE,
  70. .cra_ctxsize = sizeof(struct s390_sha_ctx),
  71. .cra_module = THIS_MODULE,
  72. .cra_list = LIST_HEAD_INIT(sha384_alg.cra_list),
  73. .cra_u = { .digest = {
  74. .dia_digestsize = SHA384_DIGEST_SIZE,
  75. .dia_init = sha384_init,
  76. .dia_update = s390_sha_update,
  77. .dia_final = s390_sha_final } }
  78. };
  79. MODULE_ALIAS("sha384");
  80. static int __init init(void)
  81. {
  82. int ret;
  83. if (!crypt_s390_func_available(KIMD_SHA_512))
  84. return -EOPNOTSUPP;
  85. if ((ret = crypto_register_alg(&sha512_alg)) < 0)
  86. goto out;
  87. if ((ret = crypto_register_alg(&sha384_alg)) < 0)
  88. crypto_unregister_alg(&sha512_alg);
  89. out:
  90. return ret;
  91. }
  92. static void __exit fini(void)
  93. {
  94. crypto_unregister_alg(&sha512_alg);
  95. crypto_unregister_alg(&sha384_alg);
  96. }
  97. module_init(init);
  98. module_exit(fini);
  99. MODULE_LICENSE("GPL");
  100. MODULE_DESCRIPTION("SHA512 and SHA-384 Secure Hash Algorithm");