You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 

254 lines
6.8 KiB

  1. /* Based on DJB's crypto_hashblocks/ref implementation.
  2. * Public domain.
  3. */
  4. #include <decaf/sha512.h>
  5. #include <string.h>
  6. #include <assert.h>
  7. static uint64_t load_bigendian(const uint8_t *x)
  8. {
  9. return
  10. (uint64_t) (x[7]) \
  11. | (((uint64_t) (x[6])) << 8) \
  12. | (((uint64_t) (x[5])) << 16) \
  13. | (((uint64_t) (x[4])) << 24) \
  14. | (((uint64_t) (x[3])) << 32) \
  15. | (((uint64_t) (x[2])) << 40) \
  16. | (((uint64_t) (x[1])) << 48) \
  17. | (((uint64_t) (x[0])) << 56)
  18. ;
  19. }
  20. #define SHR(x,c) ((x) >> (c))
  21. #define ROTR(x,c) (((x) >> (c)) | ((x) << (64 - (c))))
  22. #define Ch(x,y,z) ((x & y) ^ (~x & z))
  23. #define Maj(x,y,z) ((x & y) ^ (x & z) ^ (y & z))
  24. #define Sigma0(x) (ROTR(x,28) ^ ROTR(x,34) ^ ROTR(x,39))
  25. #define Sigma1(x) (ROTR(x,14) ^ ROTR(x,18) ^ ROTR(x,41))
  26. #define sigma0(x) (ROTR(x, 1) ^ ROTR(x, 8) ^ SHR(x,7))
  27. #define sigma1(x) (ROTR(x,19) ^ ROTR(x,61) ^ SHR(x,6))
  28. #define M(w0,w14,w9,w1) w0 = sigma1(w14) + w9 + sigma0(w1) + w0;
  29. #define EXPAND \
  30. M(w0 ,w14,w9 ,w1 ) \
  31. M(w1 ,w15,w10,w2 ) \
  32. M(w2 ,w0 ,w11,w3 ) \
  33. M(w3 ,w1 ,w12,w4 ) \
  34. M(w4 ,w2 ,w13,w5 ) \
  35. M(w5 ,w3 ,w14,w6 ) \
  36. M(w6 ,w4 ,w15,w7 ) \
  37. M(w7 ,w5 ,w0 ,w8 ) \
  38. M(w8 ,w6 ,w1 ,w9 ) \
  39. M(w9 ,w7 ,w2 ,w10) \
  40. M(w10,w8 ,w3 ,w11) \
  41. M(w11,w9 ,w4 ,w12) \
  42. M(w12,w10,w5 ,w13) \
  43. M(w13,w11,w6 ,w14) \
  44. M(w14,w12,w7 ,w15) \
  45. M(w15,w13,w8 ,w0 )
  46. #define F(w,k) \
  47. T1 = h + Sigma1(e) + Ch(e,f,g) + k + w; \
  48. T2 = Sigma0(a) + Maj(a,b,c); \
  49. h = g; \
  50. g = f; \
  51. f = e; \
  52. e = d + T1; \
  53. d = c; \
  54. c = b; \
  55. b = a; \
  56. a = T1 + T2;
  57. static NOINLINE void hashblock(decaf_sha512_ctx_t ctx) {
  58. const uint8_t *in = ctx->block;
  59. uint64_t a = ctx->state[0];
  60. uint64_t b = ctx->state[1];
  61. uint64_t c = ctx->state[2];
  62. uint64_t d = ctx->state[3];
  63. uint64_t e = ctx->state[4];
  64. uint64_t f = ctx->state[5];
  65. uint64_t g = ctx->state[6];
  66. uint64_t h = ctx->state[7];
  67. uint64_t T1;
  68. uint64_t T2;
  69. uint64_t w0 = load_bigendian(in + 0);
  70. uint64_t w1 = load_bigendian(in + 8);
  71. uint64_t w2 = load_bigendian(in + 16);
  72. uint64_t w3 = load_bigendian(in + 24);
  73. uint64_t w4 = load_bigendian(in + 32);
  74. uint64_t w5 = load_bigendian(in + 40);
  75. uint64_t w6 = load_bigendian(in + 48);
  76. uint64_t w7 = load_bigendian(in + 56);
  77. uint64_t w8 = load_bigendian(in + 64);
  78. uint64_t w9 = load_bigendian(in + 72);
  79. uint64_t w10 = load_bigendian(in + 80);
  80. uint64_t w11 = load_bigendian(in + 88);
  81. uint64_t w12 = load_bigendian(in + 96);
  82. uint64_t w13 = load_bigendian(in + 104);
  83. uint64_t w14 = load_bigendian(in + 112);
  84. uint64_t w15 = load_bigendian(in + 120);
  85. F(w0 ,0x428a2f98d728ae22ULL)
  86. F(w1 ,0x7137449123ef65cdULL)
  87. F(w2 ,0xb5c0fbcfec4d3b2fULL)
  88. F(w3 ,0xe9b5dba58189dbbcULL)
  89. F(w4 ,0x3956c25bf348b538ULL)
  90. F(w5 ,0x59f111f1b605d019ULL)
  91. F(w6 ,0x923f82a4af194f9bULL)
  92. F(w7 ,0xab1c5ed5da6d8118ULL)
  93. F(w8 ,0xd807aa98a3030242ULL)
  94. F(w9 ,0x12835b0145706fbeULL)
  95. F(w10,0x243185be4ee4b28cULL)
  96. F(w11,0x550c7dc3d5ffb4e2ULL)
  97. F(w12,0x72be5d74f27b896fULL)
  98. F(w13,0x80deb1fe3b1696b1ULL)
  99. F(w14,0x9bdc06a725c71235ULL)
  100. F(w15,0xc19bf174cf692694ULL)
  101. EXPAND
  102. F(w0 ,0xe49b69c19ef14ad2ULL)
  103. F(w1 ,0xefbe4786384f25e3ULL)
  104. F(w2 ,0x0fc19dc68b8cd5b5ULL)
  105. F(w3 ,0x240ca1cc77ac9c65ULL)
  106. F(w4 ,0x2de92c6f592b0275ULL)
  107. F(w5 ,0x4a7484aa6ea6e483ULL)
  108. F(w6 ,0x5cb0a9dcbd41fbd4ULL)
  109. F(w7 ,0x76f988da831153b5ULL)
  110. F(w8 ,0x983e5152ee66dfabULL)
  111. F(w9 ,0xa831c66d2db43210ULL)
  112. F(w10,0xb00327c898fb213fULL)
  113. F(w11,0xbf597fc7beef0ee4ULL)
  114. F(w12,0xc6e00bf33da88fc2ULL)
  115. F(w13,0xd5a79147930aa725ULL)
  116. F(w14,0x06ca6351e003826fULL)
  117. F(w15,0x142929670a0e6e70ULL)
  118. EXPAND
  119. F(w0 ,0x27b70a8546d22ffcULL)
  120. F(w1 ,0x2e1b21385c26c926ULL)
  121. F(w2 ,0x4d2c6dfc5ac42aedULL)
  122. F(w3 ,0x53380d139d95b3dfULL)
  123. F(w4 ,0x650a73548baf63deULL)
  124. F(w5 ,0x766a0abb3c77b2a8ULL)
  125. F(w6 ,0x81c2c92e47edaee6ULL)
  126. F(w7 ,0x92722c851482353bULL)
  127. F(w8 ,0xa2bfe8a14cf10364ULL)
  128. F(w9 ,0xa81a664bbc423001ULL)
  129. F(w10,0xc24b8b70d0f89791ULL)
  130. F(w11,0xc76c51a30654be30ULL)
  131. F(w12,0xd192e819d6ef5218ULL)
  132. F(w13,0xd69906245565a910ULL)
  133. F(w14,0xf40e35855771202aULL)
  134. F(w15,0x106aa07032bbd1b8ULL)
  135. EXPAND
  136. F(w0 ,0x19a4c116b8d2d0c8ULL)
  137. F(w1 ,0x1e376c085141ab53ULL)
  138. F(w2 ,0x2748774cdf8eeb99ULL)
  139. F(w3 ,0x34b0bcb5e19b48a8ULL)
  140. F(w4 ,0x391c0cb3c5c95a63ULL)
  141. F(w5 ,0x4ed8aa4ae3418acbULL)
  142. F(w6 ,0x5b9cca4f7763e373ULL)
  143. F(w7 ,0x682e6ff3d6b2b8a3ULL)
  144. F(w8 ,0x748f82ee5defb2fcULL)
  145. F(w9 ,0x78a5636f43172f60ULL)
  146. F(w10,0x84c87814a1f0ab72ULL)
  147. F(w11,0x8cc702081a6439ecULL)
  148. F(w12,0x90befffa23631e28ULL)
  149. F(w13,0xa4506cebde82bde9ULL)
  150. F(w14,0xbef9a3f7b2c67915ULL)
  151. F(w15,0xc67178f2e372532bULL)
  152. EXPAND
  153. F(w0 ,0xca273eceea26619cULL)
  154. F(w1 ,0xd186b8c721c0c207ULL)
  155. F(w2 ,0xeada7dd6cde0eb1eULL)
  156. F(w3 ,0xf57d4f7fee6ed178ULL)
  157. F(w4 ,0x06f067aa72176fbaULL)
  158. F(w5 ,0x0a637dc5a2c898a6ULL)
  159. F(w6 ,0x113f9804bef90daeULL)
  160. F(w7 ,0x1b710b35131c471bULL)
  161. F(w8 ,0x28db77f523047d84ULL)
  162. F(w9 ,0x32caab7b40c72493ULL)
  163. F(w10,0x3c9ebe0a15c9bebcULL)
  164. F(w11,0x431d67c49c100d4cULL)
  165. F(w12,0x4cc5d4becb3e42b6ULL)
  166. F(w13,0x597f299cfc657e2aULL)
  167. F(w14,0x5fcb6fab3ad6faecULL)
  168. F(w15,0x6c44198c4a475817ULL)
  169. ctx->state[0] += a;
  170. ctx->state[1] += b;
  171. ctx->state[2] += c;
  172. ctx->state[3] += d;
  173. ctx->state[4] += e;
  174. ctx->state[5] += f;
  175. ctx->state[6] += g;
  176. ctx->state[7] += h;
  177. }
  178. void decaf_sha512_init(decaf_sha512_ctx_t ctx) {
  179. static const uint64_t iv[8] = {
  180. 0x6a09e667f3bcc908,
  181. 0xbb67ae8584caa73b,
  182. 0x3c6ef372fe94f82b,
  183. 0xa54ff53a5f1d36f1,
  184. 0x510e527fade682d1,
  185. 0x9b05688c2b3e6c1f,
  186. 0x1f83d9abfb41bd6b,
  187. 0x5be0cd19137e2179
  188. };
  189. memcpy(ctx->state,iv,sizeof(iv));
  190. memset(ctx->block,0,sizeof(ctx->block));
  191. ctx->bytes_processed = 0;
  192. }
  193. void decaf_sha512_update(decaf_sha512_ctx_t ctx, const uint8_t *message, size_t length) {
  194. while (length > 0) {
  195. size_t grab = length, off = ctx->bytes_processed % 128;
  196. if (grab > 128-off) grab = 128-off;
  197. memcpy(&ctx->block[off], message, grab);
  198. ctx->bytes_processed += grab;
  199. length -= grab;
  200. message += grab;
  201. if (grab == 128 - off) {
  202. hashblock(ctx);
  203. }
  204. }
  205. }
  206. void decaf_sha512_final(decaf_sha512_ctx_t ctx, uint8_t *out, size_t length) {
  207. assert(length <= 512/8);
  208. size_t off = ctx->bytes_processed % 128, bp = ctx->bytes_processed * 8;
  209. ctx->block[off] = 0x80;
  210. memset(&ctx->block[off+1], 0, 128-off-1);
  211. if (off >= 112) {
  212. hashblock(ctx);
  213. memset(&ctx->block,0,128);
  214. }
  215. for (size_t i=0; i<8; i++)
  216. ctx->block[120 + i] = bp >> (56 - 8*i);
  217. hashblock(ctx);
  218. for (size_t i=0; i<length; i++) {
  219. out[i] = ctx->state[i/8] >> (56 - 8*(i%8));
  220. }
  221. decaf_sha512_init(ctx);
  222. }