sha1_glue.c 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176
  1. /*
  2. * Cryptographic API.
  3. * Glue code for the SHA1 Secure Hash Algorithm assembler implementation
  4. *
  5. * This file is based on sha1_generic.c and sha1_ssse3_glue.c
  6. *
  7. * Copyright (c) Alan Smithee.
  8. * Copyright (c) Andrew McDonald <andrew@mcdonald.org.uk>
  9. * Copyright (c) Jean-Francois Dive <jef@linuxbe.org>
  10. * Copyright (c) Mathias Krause <minipli@googlemail.com>
  11. *
  12. * This program is free software; you can redistribute it and/or modify it
  13. * under the terms of the GNU General Public License as published by the Free
  14. * Software Foundation; either version 2 of the License, or (at your option)
  15. * any later version.
  16. *
  17. */
  18. #include <crypto/internal/hash.h>
  19. #include <linux/init.h>
  20. #include <linux/module.h>
  21. #include <linux/cryptohash.h>
  22. #include <linux/types.h>
  23. #include <crypto/sha.h>
  24. #include <asm/byteorder.h>
  25. #include <asm/crypto/sha1.h>
  26. asmlinkage void sha1_block_data_order(u32 *digest,
  27. const unsigned char *data, unsigned int rounds);
  28. static int sha1_init(struct shash_desc *desc)
  29. {
  30. struct sha1_state *sctx = shash_desc_ctx(desc);
  31. *sctx = (struct sha1_state){
  32. .state = { SHA1_H0, SHA1_H1, SHA1_H2, SHA1_H3, SHA1_H4 },
  33. };
  34. return 0;
  35. }
  36. static int __sha1_update(struct sha1_state *sctx, const u8 *data,
  37. unsigned int len, unsigned int partial)
  38. {
  39. unsigned int done = 0;
  40. sctx->count += len;
  41. if (partial) {
  42. done = SHA1_BLOCK_SIZE - partial;
  43. memcpy(sctx->buffer + partial, data, done);
  44. sha1_block_data_order(sctx->state, sctx->buffer, 1);
  45. }
  46. if (len - done >= SHA1_BLOCK_SIZE) {
  47. const unsigned int rounds = (len - done) / SHA1_BLOCK_SIZE;
  48. sha1_block_data_order(sctx->state, data + done, rounds);
  49. done += rounds * SHA1_BLOCK_SIZE;
  50. }
  51. memcpy(sctx->buffer, data + done, len - done);
  52. return 0;
  53. }
  54. int sha1_update_arm(struct shash_desc *desc, const u8 *data,
  55. unsigned int len)
  56. {
  57. struct sha1_state *sctx = shash_desc_ctx(desc);
  58. unsigned int partial = sctx->count % SHA1_BLOCK_SIZE;
  59. int res;
  60. /* Handle the fast case right here */
  61. if (partial + len < SHA1_BLOCK_SIZE) {
  62. sctx->count += len;
  63. memcpy(sctx->buffer + partial, data, len);
  64. return 0;
  65. }
  66. res = __sha1_update(sctx, data, len, partial);
  67. return res;
  68. }
  69. EXPORT_SYMBOL_GPL(sha1_update_arm);
  70. /* Add padding and return the message digest. */
  71. static int sha1_final(struct shash_desc *desc, u8 *out)
  72. {
  73. struct sha1_state *sctx = shash_desc_ctx(desc);
  74. unsigned int i, index, padlen;
  75. __be32 *dst = (__be32 *)out;
  76. __be64 bits;
  77. static const u8 padding[SHA1_BLOCK_SIZE] = { 0x80, };
  78. bits = cpu_to_be64(sctx->count << 3);
  79. /* Pad out to 56 mod 64 and append length */
  80. index = sctx->count % SHA1_BLOCK_SIZE;
  81. padlen = (index < 56) ? (56 - index) : ((SHA1_BLOCK_SIZE+56) - index);
  82. /* We need to fill a whole block for __sha1_update() */
  83. if (padlen <= 56) {
  84. sctx->count += padlen;
  85. memcpy(sctx->buffer + index, padding, padlen);
  86. } else {
  87. __sha1_update(sctx, padding, padlen, index);
  88. }
  89. __sha1_update(sctx, (const u8 *)&bits, sizeof(bits), 56);
  90. /* Store state in digest */
  91. for (i = 0; i < 5; i++)
  92. dst[i] = cpu_to_be32(sctx->state[i]);
  93. /* Wipe context */
  94. memset(sctx, 0, sizeof(*sctx));
  95. return 0;
  96. }
  97. static int sha1_export(struct shash_desc *desc, void *out)
  98. {
  99. struct sha1_state *sctx = shash_desc_ctx(desc);
  100. memcpy(out, sctx, sizeof(*sctx));
  101. return 0;
  102. }
  103. static int sha1_import(struct shash_desc *desc, const void *in)
  104. {
  105. struct sha1_state *sctx = shash_desc_ctx(desc);
  106. memcpy(sctx, in, sizeof(*sctx));
  107. return 0;
  108. }
  109. static struct shash_alg alg = {
  110. .digestsize = SHA1_DIGEST_SIZE,
  111. .init = sha1_init,
  112. .update = sha1_update_arm,
  113. .final = sha1_final,
  114. .export = sha1_export,
  115. .import = sha1_import,
  116. .descsize = sizeof(struct sha1_state),
  117. .statesize = sizeof(struct sha1_state),
  118. .base = {
  119. .cra_name = "sha1",
  120. .cra_driver_name= "sha1-asm",
  121. .cra_priority = 150,
  122. .cra_flags = CRYPTO_ALG_TYPE_SHASH,
  123. .cra_blocksize = SHA1_BLOCK_SIZE,
  124. .cra_module = THIS_MODULE,
  125. }
  126. };
  127. static int __init sha1_mod_init(void)
  128. {
  129. return crypto_register_shash(&alg);
  130. }
  131. static void __exit sha1_mod_fini(void)
  132. {
  133. crypto_unregister_shash(&alg);
  134. }
  135. module_init(sha1_mod_init);
  136. module_exit(sha1_mod_fini);
  137. MODULE_LICENSE("GPL");
  138. MODULE_DESCRIPTION("SHA1 Secure Hash Algorithm (ARM)");
  139. MODULE_ALIAS("sha1");
  140. MODULE_AUTHOR("David McCullough <ucdevel@gmail.com>");