Bez popisu

sha1.c 7.2KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217
  1. /*
  2. SHA-1 in C
  3. By Steve Reid <steve@edmweb.com>
  4. 100% Public Domain
  5. Test Vectors (from FIPS PUB 180-1)
  6. "abc"
  7. A9993E36 4706816A BA3E2571 7850C26C 9CD0D89D
  8. "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq"
  9. 84983E44 1C3BD26E BAAE4AA1 F95129E5 E54670F1
  10. A million repetitions of "a"
  11. 34AA973C D4C4DAA4 F61EEB2B DBAD2731 6534016F
  12. */
  13. #include <stdint.h>
  14. #include <pokeagb/pokeagb.h>
  15. #include <sha1.h>
  16. #define rol(value, bits) (((value) << (bits)) | ((value) >> (32 - (bits))))
  17. #define blk0(i) (block->l[i] = (rol(block->l[i], 24) & 0xFF00FF00) | (rol(block->l[i], 8) & 0x00FF00FF))
  18. #define blk(i) \
  19. (block->l[i & 15] = \
  20. rol(block->l[(i + 13) & 15] ^ block->l[(i + 8) & 15] ^ block->l[(i + 2) & 15] ^ block->l[i & 15], 1))
  21. /* (R0+R1), R2, R3, R4 are the different operations used in SHA1 */
  22. #define R0(v, w, x, y, z, i) \
  23. z += ((w & (x ^ y)) ^ y) + blk0(i) + 0x5A827999 + rol(v, 5); \
  24. w = rol(w, 30);
  25. #define R1(v, w, x, y, z, i) \
  26. z += ((w & (x ^ y)) ^ y) + blk(i) + 0x5A827999 + rol(v, 5); \
  27. w = rol(w, 30);
  28. #define R2(v, w, x, y, z, i) \
  29. z += (w ^ x ^ y) + blk(i) + 0x6ED9EBA1 + rol(v, 5); \
  30. w = rol(w, 30);
  31. #define R3(v, w, x, y, z, i) \
  32. z += (((w | x) & y) | (w & x)) + blk(i) + 0x8F1BBCDC + rol(v, 5); \
  33. w = rol(w, 30);
  34. #define R4(v, w, x, y, z, i) \
  35. z += (w ^ x ^ y) + blk(i) + 0xCA62C1D6 + rol(v, 5); \
  36. w = rol(w, 30);
  37. void SHA1Transform(uint32_t state[5], const unsigned char buffer[64]) {
  38. uint32_t a, b, c, d, e;
  39. typedef union {
  40. unsigned char c[64];
  41. uint32_t l[16];
  42. } CHAR64LONG16;
  43. CHAR64LONG16 block[1]; /* use array to appear as a pointer */
  44. memcpy(block, buffer, 64);
  45. /* Copy context->state[] to working vars */
  46. a = state[0];
  47. b = state[1];
  48. c = state[2];
  49. d = state[3];
  50. e = state[4];
  51. /* 4 rounds of 20 operations each. Loop unrolled. */
  52. R0(a, b, c, d, e, 0);
  53. R0(e, a, b, c, d, 1);
  54. R0(d, e, a, b, c, 2);
  55. R0(c, d, e, a, b, 3);
  56. R0(b, c, d, e, a, 4);
  57. R0(a, b, c, d, e, 5);
  58. R0(e, a, b, c, d, 6);
  59. R0(d, e, a, b, c, 7);
  60. R0(c, d, e, a, b, 8);
  61. R0(b, c, d, e, a, 9);
  62. R0(a, b, c, d, e, 10);
  63. R0(e, a, b, c, d, 11);
  64. R0(d, e, a, b, c, 12);
  65. R0(c, d, e, a, b, 13);
  66. R0(b, c, d, e, a, 14);
  67. R0(a, b, c, d, e, 15);
  68. R1(e, a, b, c, d, 16);
  69. R1(d, e, a, b, c, 17);
  70. R1(c, d, e, a, b, 18);
  71. R1(b, c, d, e, a, 19);
  72. R2(a, b, c, d, e, 20);
  73. R2(e, a, b, c, d, 21);
  74. R2(d, e, a, b, c, 22);
  75. R2(c, d, e, a, b, 23);
  76. R2(b, c, d, e, a, 24);
  77. R2(a, b, c, d, e, 25);
  78. R2(e, a, b, c, d, 26);
  79. R2(d, e, a, b, c, 27);
  80. R2(c, d, e, a, b, 28);
  81. R2(b, c, d, e, a, 29);
  82. R2(a, b, c, d, e, 30);
  83. R2(e, a, b, c, d, 31);
  84. R2(d, e, a, b, c, 32);
  85. R2(c, d, e, a, b, 33);
  86. R2(b, c, d, e, a, 34);
  87. R2(a, b, c, d, e, 35);
  88. R2(e, a, b, c, d, 36);
  89. R2(d, e, a, b, c, 37);
  90. R2(c, d, e, a, b, 38);
  91. R2(b, c, d, e, a, 39);
  92. R3(a, b, c, d, e, 40);
  93. R3(e, a, b, c, d, 41);
  94. R3(d, e, a, b, c, 42);
  95. R3(c, d, e, a, b, 43);
  96. R3(b, c, d, e, a, 44);
  97. R3(a, b, c, d, e, 45);
  98. R3(e, a, b, c, d, 46);
  99. R3(d, e, a, b, c, 47);
  100. R3(c, d, e, a, b, 48);
  101. R3(b, c, d, e, a, 49);
  102. R3(a, b, c, d, e, 50);
  103. R3(e, a, b, c, d, 51);
  104. R3(d, e, a, b, c, 52);
  105. R3(c, d, e, a, b, 53);
  106. R3(b, c, d, e, a, 54);
  107. R3(a, b, c, d, e, 55);
  108. R3(e, a, b, c, d, 56);
  109. R3(d, e, a, b, c, 57);
  110. R3(c, d, e, a, b, 58);
  111. R3(b, c, d, e, a, 59);
  112. R4(a, b, c, d, e, 60);
  113. R4(e, a, b, c, d, 61);
  114. R4(d, e, a, b, c, 62);
  115. R4(c, d, e, a, b, 63);
  116. R4(b, c, d, e, a, 64);
  117. R4(a, b, c, d, e, 65);
  118. R4(e, a, b, c, d, 66);
  119. R4(d, e, a, b, c, 67);
  120. R4(c, d, e, a, b, 68);
  121. R4(b, c, d, e, a, 69);
  122. R4(a, b, c, d, e, 70);
  123. R4(e, a, b, c, d, 71);
  124. R4(d, e, a, b, c, 72);
  125. R4(c, d, e, a, b, 73);
  126. R4(b, c, d, e, a, 74);
  127. R4(a, b, c, d, e, 75);
  128. R4(e, a, b, c, d, 76);
  129. R4(d, e, a, b, c, 77);
  130. R4(c, d, e, a, b, 78);
  131. R4(b, c, d, e, a, 79);
  132. /* Add the working vars back into context.state[] */
  133. state[0] += a;
  134. state[1] += b;
  135. state[2] += c;
  136. state[3] += d;
  137. state[4] += e;
  138. /* Wipe variables */
  139. a = b = c = d = e = 0;
  140. memset(block, '\0', sizeof(block));
  141. }
  142. void SHA1Init(SHA1_CTX *context) {
  143. /* SHA1 initialization constants */
  144. context->state[0] = 0x67452301;
  145. context->state[1] = 0xEFCDAB89;
  146. context->state[2] = 0x98BADCFE;
  147. context->state[3] = 0x10325476;
  148. context->state[4] = 0xC3D2E1F0;
  149. context->count[0] = context->count[1] = 0;
  150. }
  151. void SHA1Update(SHA1_CTX *context, const unsigned char *data, uint32_t len) {
  152. uint32_t i;
  153. uint32_t j;
  154. j = context->count[0];
  155. if ((context->count[0] += len << 3) < j)
  156. context->count[1]++;
  157. context->count[1] += (len >> 29);
  158. j = (j >> 3) & 63;
  159. if ((j + len) > 63) {
  160. memcpy(&context->buffer[j], data, (i = 64 - j));
  161. SHA1Transform(context->state, context->buffer);
  162. for (; i + 63 < len; i += 64) {
  163. SHA1Transform(context->state, &data[i]);
  164. }
  165. j = 0;
  166. } else
  167. i = 0;
  168. memcpy(&context->buffer[j], &data[i], len - i);
  169. }
  170. void SHA1Final(unsigned char digest[20], SHA1_CTX *context) {
  171. unsigned i;
  172. unsigned char finalcount[8];
  173. unsigned char c;
  174. for (i = 0; i < 8; i++) {
  175. finalcount[i] = (unsigned char)((context->count[(i >= 4 ? 0 : 1)] >> ((3 - (i & 3)) * 8)) & 255);
  176. }
  177. c = 0200;
  178. SHA1Update(context, &c, 1);
  179. while ((context->count[0] & 504) != 448) {
  180. c = 0000;
  181. SHA1Update(context, &c, 1);
  182. }
  183. SHA1Update(context, finalcount, 8); /* Should cause a SHA1Transform() */
  184. for (i = 0; i < 20; i++) {
  185. digest[i] = (unsigned char)((context->state[i >> 2] >> ((3 - (i & 3)) * 8)) & 255);
  186. }
  187. /* Wipe variables */
  188. memset(context, '\0', sizeof(*context));
  189. memset(&finalcount, '\0', sizeof(finalcount));
  190. }
  191. void SHA1(char *hash_out, const char *str, uint32_t len) {
  192. SHA1_CTX ctx;
  193. uint32_t ii;
  194. SHA1Init(&ctx);
  195. for (ii = 0; ii < len; ii += 1)
  196. SHA1Update(&ctx, (const unsigned char *)str + ii, 1);
  197. SHA1Final((unsigned char *)hash_out, &ctx);
  198. hash_out[20] = '\0';
  199. }