SHA512.cpp 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358
  1. /*
  2. * ZeroTier One - Global Peer to Peer Ethernet
  3. * Copyright (C) 2011-2014 ZeroTier Networks LLC
  4. *
  5. * This program is free software: you can redistribute it and/or modify
  6. * it under the terms of the GNU General Public License as published by
  7. * the Free Software Foundation, either version 3 of the License, or
  8. * (at your option) any later version.
  9. *
  10. * This program is distributed in the hope that it will be useful,
  11. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  12. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  13. * GNU General Public License for more details.
  14. *
  15. * You should have received a copy of the GNU General Public License
  16. * along with this program. If not, see <http://www.gnu.org/licenses/>.
  17. *
  18. * --
  19. *
  20. * ZeroTier may be used and distributed under the terms of the GPLv3, which
  21. * are available at: http://www.gnu.org/licenses/gpl-3.0.html
  22. *
  23. * If you would like to embed ZeroTier into a commercial application or
  24. * redistribute it in a modified binary form, please contact ZeroTier Networks
  25. * LLC. Start here: http://www.zerotier.com/
  26. */
  27. #include <stdint.h>
  28. #include <stdlib.h>
  29. #include <string.h>
  30. #include "SHA512.hpp"
  31. #include "Utils.hpp"
  32. namespace ZeroTier {
  33. //////////////////////////////////////////////////////////////////////////////
  34. //////////////////////////////////////////////////////////////////////////////
  35. // Code taken from NaCl by D. J. Bernstein and others
  36. // Public domain
  37. /*
  38. 20080913
  39. D. J. Bernstein
  40. Public domain.
  41. */
  42. #define uint64 uint64_t
  43. #define load_bigendian(x) Utils::ntoh(*((const uint64_t *)(x)))
  44. #define store_bigendian(x,u) (*((uint64_t *)(x)) = Utils::hton((u)))
  45. #if 0
  46. static uint64 load_bigendian(const unsigned char *x)
  47. {
  48. return
  49. (uint64) (x[7]) \
  50. | (((uint64) (x[6])) << 8) \
  51. | (((uint64) (x[5])) << 16) \
  52. | (((uint64) (x[4])) << 24) \
  53. | (((uint64) (x[3])) << 32) \
  54. | (((uint64) (x[2])) << 40) \
  55. | (((uint64) (x[1])) << 48) \
  56. | (((uint64) (x[0])) << 56)
  57. ;
  58. }
  59. static void store_bigendian(unsigned char *x,uint64 u)
  60. {
  61. x[7] = u; u >>= 8;
  62. x[6] = u; u >>= 8;
  63. x[5] = u; u >>= 8;
  64. x[4] = u; u >>= 8;
  65. x[3] = u; u >>= 8;
  66. x[2] = u; u >>= 8;
  67. x[1] = u; u >>= 8;
  68. x[0] = u;
  69. }
  70. #endif
  71. #define SHR(x,c) ((x) >> (c))
  72. #define ROTR(x,c) (((x) >> (c)) | ((x) << (64 - (c))))
  73. #define Ch(x,y,z) ((x & y) ^ (~x & z))
  74. #define Maj(x,y,z) ((x & y) ^ (x & z) ^ (y & z))
  75. #define Sigma0(x) (ROTR(x,28) ^ ROTR(x,34) ^ ROTR(x,39))
  76. #define Sigma1(x) (ROTR(x,14) ^ ROTR(x,18) ^ ROTR(x,41))
  77. #define sigma0(x) (ROTR(x, 1) ^ ROTR(x, 8) ^ SHR(x,7))
  78. #define sigma1(x) (ROTR(x,19) ^ ROTR(x,61) ^ SHR(x,6))
  79. #define M(w0,w14,w9,w1) w0 = sigma1(w14) + w9 + sigma0(w1) + w0;
  80. #define EXPAND \
  81. M(w0 ,w14,w9 ,w1 ) \
  82. M(w1 ,w15,w10,w2 ) \
  83. M(w2 ,w0 ,w11,w3 ) \
  84. M(w3 ,w1 ,w12,w4 ) \
  85. M(w4 ,w2 ,w13,w5 ) \
  86. M(w5 ,w3 ,w14,w6 ) \
  87. M(w6 ,w4 ,w15,w7 ) \
  88. M(w7 ,w5 ,w0 ,w8 ) \
  89. M(w8 ,w6 ,w1 ,w9 ) \
  90. M(w9 ,w7 ,w2 ,w10) \
  91. M(w10,w8 ,w3 ,w11) \
  92. M(w11,w9 ,w4 ,w12) \
  93. M(w12,w10,w5 ,w13) \
  94. M(w13,w11,w6 ,w14) \
  95. M(w14,w12,w7 ,w15) \
  96. M(w15,w13,w8 ,w0 )
  97. #define F(w,k) \
  98. T1 = h + Sigma1(e) + Ch(e,f,g) + k + w; \
  99. T2 = Sigma0(a) + Maj(a,b,c); \
  100. h = g; \
  101. g = f; \
  102. f = e; \
  103. e = d + T1; \
  104. d = c; \
  105. c = b; \
  106. b = a; \
  107. a = T1 + T2;
  108. static inline int crypto_hashblocks(unsigned char *statebytes,const unsigned char *in,unsigned long long inlen)
  109. {
  110. uint64 state[8];
  111. uint64 a;
  112. uint64 b;
  113. uint64 c;
  114. uint64 d;
  115. uint64 e;
  116. uint64 f;
  117. uint64 g;
  118. uint64 h;
  119. uint64 T1;
  120. uint64 T2;
  121. a = load_bigendian(statebytes + 0); state[0] = a;
  122. b = load_bigendian(statebytes + 8); state[1] = b;
  123. c = load_bigendian(statebytes + 16); state[2] = c;
  124. d = load_bigendian(statebytes + 24); state[3] = d;
  125. e = load_bigendian(statebytes + 32); state[4] = e;
  126. f = load_bigendian(statebytes + 40); state[5] = f;
  127. g = load_bigendian(statebytes + 48); state[6] = g;
  128. h = load_bigendian(statebytes + 56); state[7] = h;
  129. while (inlen >= 128) {
  130. uint64 w0 = load_bigendian(in + 0);
  131. uint64 w1 = load_bigendian(in + 8);
  132. uint64 w2 = load_bigendian(in + 16);
  133. uint64 w3 = load_bigendian(in + 24);
  134. uint64 w4 = load_bigendian(in + 32);
  135. uint64 w5 = load_bigendian(in + 40);
  136. uint64 w6 = load_bigendian(in + 48);
  137. uint64 w7 = load_bigendian(in + 56);
  138. uint64 w8 = load_bigendian(in + 64);
  139. uint64 w9 = load_bigendian(in + 72);
  140. uint64 w10 = load_bigendian(in + 80);
  141. uint64 w11 = load_bigendian(in + 88);
  142. uint64 w12 = load_bigendian(in + 96);
  143. uint64 w13 = load_bigendian(in + 104);
  144. uint64 w14 = load_bigendian(in + 112);
  145. uint64 w15 = load_bigendian(in + 120);
  146. F(w0 ,0x428a2f98d728ae22ULL)
  147. F(w1 ,0x7137449123ef65cdULL)
  148. F(w2 ,0xb5c0fbcfec4d3b2fULL)
  149. F(w3 ,0xe9b5dba58189dbbcULL)
  150. F(w4 ,0x3956c25bf348b538ULL)
  151. F(w5 ,0x59f111f1b605d019ULL)
  152. F(w6 ,0x923f82a4af194f9bULL)
  153. F(w7 ,0xab1c5ed5da6d8118ULL)
  154. F(w8 ,0xd807aa98a3030242ULL)
  155. F(w9 ,0x12835b0145706fbeULL)
  156. F(w10,0x243185be4ee4b28cULL)
  157. F(w11,0x550c7dc3d5ffb4e2ULL)
  158. F(w12,0x72be5d74f27b896fULL)
  159. F(w13,0x80deb1fe3b1696b1ULL)
  160. F(w14,0x9bdc06a725c71235ULL)
  161. F(w15,0xc19bf174cf692694ULL)
  162. EXPAND
  163. F(w0 ,0xe49b69c19ef14ad2ULL)
  164. F(w1 ,0xefbe4786384f25e3ULL)
  165. F(w2 ,0x0fc19dc68b8cd5b5ULL)
  166. F(w3 ,0x240ca1cc77ac9c65ULL)
  167. F(w4 ,0x2de92c6f592b0275ULL)
  168. F(w5 ,0x4a7484aa6ea6e483ULL)
  169. F(w6 ,0x5cb0a9dcbd41fbd4ULL)
  170. F(w7 ,0x76f988da831153b5ULL)
  171. F(w8 ,0x983e5152ee66dfabULL)
  172. F(w9 ,0xa831c66d2db43210ULL)
  173. F(w10,0xb00327c898fb213fULL)
  174. F(w11,0xbf597fc7beef0ee4ULL)
  175. F(w12,0xc6e00bf33da88fc2ULL)
  176. F(w13,0xd5a79147930aa725ULL)
  177. F(w14,0x06ca6351e003826fULL)
  178. F(w15,0x142929670a0e6e70ULL)
  179. EXPAND
  180. F(w0 ,0x27b70a8546d22ffcULL)
  181. F(w1 ,0x2e1b21385c26c926ULL)
  182. F(w2 ,0x4d2c6dfc5ac42aedULL)
  183. F(w3 ,0x53380d139d95b3dfULL)
  184. F(w4 ,0x650a73548baf63deULL)
  185. F(w5 ,0x766a0abb3c77b2a8ULL)
  186. F(w6 ,0x81c2c92e47edaee6ULL)
  187. F(w7 ,0x92722c851482353bULL)
  188. F(w8 ,0xa2bfe8a14cf10364ULL)
  189. F(w9 ,0xa81a664bbc423001ULL)
  190. F(w10,0xc24b8b70d0f89791ULL)
  191. F(w11,0xc76c51a30654be30ULL)
  192. F(w12,0xd192e819d6ef5218ULL)
  193. F(w13,0xd69906245565a910ULL)
  194. F(w14,0xf40e35855771202aULL)
  195. F(w15,0x106aa07032bbd1b8ULL)
  196. EXPAND
  197. F(w0 ,0x19a4c116b8d2d0c8ULL)
  198. F(w1 ,0x1e376c085141ab53ULL)
  199. F(w2 ,0x2748774cdf8eeb99ULL)
  200. F(w3 ,0x34b0bcb5e19b48a8ULL)
  201. F(w4 ,0x391c0cb3c5c95a63ULL)
  202. F(w5 ,0x4ed8aa4ae3418acbULL)
  203. F(w6 ,0x5b9cca4f7763e373ULL)
  204. F(w7 ,0x682e6ff3d6b2b8a3ULL)
  205. F(w8 ,0x748f82ee5defb2fcULL)
  206. F(w9 ,0x78a5636f43172f60ULL)
  207. F(w10,0x84c87814a1f0ab72ULL)
  208. F(w11,0x8cc702081a6439ecULL)
  209. F(w12,0x90befffa23631e28ULL)
  210. F(w13,0xa4506cebde82bde9ULL)
  211. F(w14,0xbef9a3f7b2c67915ULL)
  212. F(w15,0xc67178f2e372532bULL)
  213. EXPAND
  214. F(w0 ,0xca273eceea26619cULL)
  215. F(w1 ,0xd186b8c721c0c207ULL)
  216. F(w2 ,0xeada7dd6cde0eb1eULL)
  217. F(w3 ,0xf57d4f7fee6ed178ULL)
  218. F(w4 ,0x06f067aa72176fbaULL)
  219. F(w5 ,0x0a637dc5a2c898a6ULL)
  220. F(w6 ,0x113f9804bef90daeULL)
  221. F(w7 ,0x1b710b35131c471bULL)
  222. F(w8 ,0x28db77f523047d84ULL)
  223. F(w9 ,0x32caab7b40c72493ULL)
  224. F(w10,0x3c9ebe0a15c9bebcULL)
  225. F(w11,0x431d67c49c100d4cULL)
  226. F(w12,0x4cc5d4becb3e42b6ULL)
  227. F(w13,0x597f299cfc657e2aULL)
  228. F(w14,0x5fcb6fab3ad6faecULL)
  229. F(w15,0x6c44198c4a475817ULL)
  230. a += state[0];
  231. b += state[1];
  232. c += state[2];
  233. d += state[3];
  234. e += state[4];
  235. f += state[5];
  236. g += state[6];
  237. h += state[7];
  238. state[0] = a;
  239. state[1] = b;
  240. state[2] = c;
  241. state[3] = d;
  242. state[4] = e;
  243. state[5] = f;
  244. state[6] = g;
  245. state[7] = h;
  246. in += 128;
  247. inlen -= 128;
  248. }
  249. store_bigendian(statebytes + 0,state[0]);
  250. store_bigendian(statebytes + 8,state[1]);
  251. store_bigendian(statebytes + 16,state[2]);
  252. store_bigendian(statebytes + 24,state[3]);
  253. store_bigendian(statebytes + 32,state[4]);
  254. store_bigendian(statebytes + 40,state[5]);
  255. store_bigendian(statebytes + 48,state[6]);
  256. store_bigendian(statebytes + 56,state[7]);
  257. return 0;
  258. }
  259. #define blocks crypto_hashblocks
  260. static const unsigned char iv[64] = {
  261. 0x6a,0x09,0xe6,0x67,0xf3,0xbc,0xc9,0x08,
  262. 0xbb,0x67,0xae,0x85,0x84,0xca,0xa7,0x3b,
  263. 0x3c,0x6e,0xf3,0x72,0xfe,0x94,0xf8,0x2b,
  264. 0xa5,0x4f,0xf5,0x3a,0x5f,0x1d,0x36,0xf1,
  265. 0x51,0x0e,0x52,0x7f,0xad,0xe6,0x82,0xd1,
  266. 0x9b,0x05,0x68,0x8c,0x2b,0x3e,0x6c,0x1f,
  267. 0x1f,0x83,0xd9,0xab,0xfb,0x41,0xbd,0x6b,
  268. 0x5b,0xe0,0xcd,0x19,0x13,0x7e,0x21,0x79
  269. };
  270. //////////////////////////////////////////////////////////////////////////////
  271. //////////////////////////////////////////////////////////////////////////////
  272. void SHA512::hash(void *digest,const void *data,unsigned int len)
  273. {
  274. unsigned char h[64];
  275. unsigned char padded[256];
  276. int i;
  277. uint64_t bytes = len;
  278. const unsigned char *in = (const unsigned char *)data;
  279. unsigned int inlen = len;
  280. for (i = 0;i < 64;++i) h[i] = iv[i];
  281. blocks(h,in,inlen);
  282. in += inlen;
  283. inlen &= 127;
  284. in -= inlen;
  285. for (i = 0;i < (int)inlen;++i) padded[i] = in[i];
  286. padded[inlen] = 0x80;
  287. if (inlen < 112) {
  288. for (i = inlen + 1;i < 119;++i) padded[i] = 0;
  289. padded[119] = (unsigned char)((bytes >> 61) & 0xff);
  290. padded[120] = (unsigned char)((bytes >> 53) & 0xff);
  291. padded[121] = (unsigned char)((bytes >> 45) & 0xff);
  292. padded[122] = (unsigned char)((bytes >> 37) & 0xff);
  293. padded[123] = (unsigned char)((bytes >> 29) & 0xff);
  294. padded[124] = (unsigned char)((bytes >> 21) & 0xff);
  295. padded[125] = (unsigned char)((bytes >> 13) & 0xff);
  296. padded[126] = (unsigned char)((bytes >> 5) & 0xff);
  297. padded[127] = (unsigned char)((bytes << 3) & 0xff);
  298. blocks(h,padded,128);
  299. } else {
  300. for (i = inlen + 1;i < 247;++i) padded[i] = 0;
  301. padded[247] = (unsigned char)((bytes >> 61) & 0xff);
  302. padded[248] = (unsigned char)((bytes >> 53) & 0xff);
  303. padded[249] = (unsigned char)((bytes >> 45) & 0xff);
  304. padded[250] = (unsigned char)((bytes >> 37) & 0xff);
  305. padded[251] = (unsigned char)((bytes >> 29) & 0xff);
  306. padded[252] = (unsigned char)((bytes >> 21) & 0xff);
  307. padded[253] = (unsigned char)((bytes >> 13) & 0xff);
  308. padded[254] = (unsigned char)((bytes >> 5) & 0xff);
  309. padded[255] = (unsigned char)((bytes << 3) & 0xff);
  310. blocks(h,padded,256);
  311. }
  312. for (i = 0;i < 64;++i) ((unsigned char *)digest)[i] = h[i];
  313. }
  314. } // namespace ZeroTier