SHA512.cpp 9.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367
  1. // Code taken from NaCl by D. J. Bernstein and others
  2. // Public domain
  3. /*
  4. 20080913
  5. D. J. Bernstein
  6. Public domain.
  7. */
  8. #include <stdint.h>
  9. #include <stdlib.h>
  10. #include <string.h>
  11. #include "SHA512.hpp"
  12. #include "Utils.hpp"
  13. #ifdef __APPLE__
  14. #include <CommonCrypto/CommonDigest.h>
  15. #define ZT_HAVE_NATIVE_SHA512
  16. namespace ZeroTier {
  17. void SHA512::hash(void *digest,const void *data,unsigned int len)
  18. {
  19. CC_SHA512_CTX ctx;
  20. CC_SHA512_Init(&ctx);
  21. CC_SHA512_Update(&ctx,data,len);
  22. CC_SHA512_Final(reinterpret_cast<unsigned char *>(digest),&ctx);
  23. }
  24. }
  25. #endif
  26. #ifdef ZT_USE_LIBCRYPTO
  27. #include <openssl/sha.h>
  28. #define ZT_HAVE_NATIVE_SHA512
  29. namespace ZeroTier {
  30. void SHA512::hash(void *digest,const void *data,unsigned int len)
  31. {
  32. SHA512_CTX ctx;
  33. SHA512_Init(&ctx);
  34. SHA512_Update(&ctx,data,len);
  35. SHA512_Final(reinterpret_cast<unsigned char *>(digest),&ctx);
  36. }
  37. }
  38. #endif
  39. #ifndef ZT_HAVE_NATIVE_SHA512
  40. namespace ZeroTier {
  41. #define uint64 uint64_t
  42. #ifdef ZT_NO_TYPE_PUNNING
  43. static uint64 load_bigendian(const unsigned char *x)
  44. {
  45. return
  46. (uint64) (x[7]) \
  47. | (((uint64) (x[6])) << 8) \
  48. | (((uint64) (x[5])) << 16) \
  49. | (((uint64) (x[4])) << 24) \
  50. | (((uint64) (x[3])) << 32) \
  51. | (((uint64) (x[2])) << 40) \
  52. | (((uint64) (x[1])) << 48) \
  53. | (((uint64) (x[0])) << 56)
  54. ;
  55. }
  56. static void store_bigendian(unsigned char *x,uint64 u)
  57. {
  58. x[7] = u; u >>= 8;
  59. x[6] = u; u >>= 8;
  60. x[5] = u; u >>= 8;
  61. x[4] = u; u >>= 8;
  62. x[3] = u; u >>= 8;
  63. x[2] = u; u >>= 8;
  64. x[1] = u; u >>= 8;
  65. x[0] = u;
  66. }
  67. #else // !ZT_NO_TYPE_PUNNING
  68. #define load_bigendian(x) Utils::ntoh(*((const uint64_t *)(x)))
  69. #define store_bigendian(x,u) (*((uint64_t *)(x)) = Utils::hton((u)))
  70. #endif // ZT_NO_TYPE_PUNNING
  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. void SHA512::hash(void *digest,const void *data,unsigned int len)
  271. {
  272. unsigned char h[64];
  273. unsigned char padded[256];
  274. int i;
  275. uint64_t bytes = len;
  276. const unsigned char *in = (const unsigned char *)data;
  277. unsigned int inlen = len;
  278. for (i = 0;i < 64;++i) h[i] = iv[i];
  279. blocks(h,in,inlen);
  280. in += inlen;
  281. inlen &= 127;
  282. in -= inlen;
  283. for (i = 0;i < (int)inlen;++i) padded[i] = in[i];
  284. padded[inlen] = 0x80;
  285. if (inlen < 112) {
  286. for (i = inlen + 1;i < 119;++i) padded[i] = 0;
  287. padded[119] = (unsigned char)((bytes >> 61) & 0xff);
  288. padded[120] = (unsigned char)((bytes >> 53) & 0xff);
  289. padded[121] = (unsigned char)((bytes >> 45) & 0xff);
  290. padded[122] = (unsigned char)((bytes >> 37) & 0xff);
  291. padded[123] = (unsigned char)((bytes >> 29) & 0xff);
  292. padded[124] = (unsigned char)((bytes >> 21) & 0xff);
  293. padded[125] = (unsigned char)((bytes >> 13) & 0xff);
  294. padded[126] = (unsigned char)((bytes >> 5) & 0xff);
  295. padded[127] = (unsigned char)((bytes << 3) & 0xff);
  296. blocks(h,padded,128);
  297. } else {
  298. for (i = inlen + 1;i < 247;++i) padded[i] = 0;
  299. padded[247] = (unsigned char)((bytes >> 61) & 0xff);
  300. padded[248] = (unsigned char)((bytes >> 53) & 0xff);
  301. padded[249] = (unsigned char)((bytes >> 45) & 0xff);
  302. padded[250] = (unsigned char)((bytes >> 37) & 0xff);
  303. padded[251] = (unsigned char)((bytes >> 29) & 0xff);
  304. padded[252] = (unsigned char)((bytes >> 21) & 0xff);
  305. padded[253] = (unsigned char)((bytes >> 13) & 0xff);
  306. padded[254] = (unsigned char)((bytes >> 5) & 0xff);
  307. padded[255] = (unsigned char)((bytes << 3) & 0xff);
  308. blocks(h,padded,256);
  309. }
  310. for (i = 0;i < 64;++i) ((unsigned char *)digest)[i] = h[i];
  311. }
  312. } // namespace ZeroTier
  313. #endif // !ZT_HAVE_NATIVE_SHA512
  314. // Internally re-export to included C code, which includes some fast crypto code ported in on some platforms.
  315. // This eliminates the need to link against a third party SHA512() from this code
  316. extern "C" void ZT_sha512internal(void *digest,const void *data,unsigned int len)
  317. {
  318. ZeroTier::SHA512::hash(digest,data,len);
  319. }