sha1.cpp 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470
  1. #include "util/sha1.h"
  2. #include <string.h>
  3. #include <iostream>
  4. #include <sstream>
  5. #include "util/string_util.h"
  6. namespace qcloud_cos {
  7. Sha1::Sha1() { ShaInit(&m_sha); }
  8. Sha1::~Sha1() {}
  9. void Sha1::Append(const char *data, unsigned int size) {
  10. ShaUpdate(&m_sha, (SHA_BYTE *)data, size);
  11. }
  12. std::string Sha1::Final() {
  13. char key[SHA_DIGESTSIZE] = {0};
  14. ShaFinal((unsigned char *)key, &m_sha);
  15. char out[64] = {0};
  16. ShaOutput((unsigned char *)key, (unsigned char *)out);
  17. return out;
  18. }
  19. /* UNRAVEL should be fastest & biggest */
  20. /* UNROLL_LOOPS should be just as big, but slightly slower */
  21. /* both undefined should be smallest and slowest */
  22. #define UNRAVEL
  23. /* #define UNROLL_LOOPS */
  24. /* SHA f()-functions */
  25. #define f1(x, y, z) ((x & y) | (~x & z))
  26. #define f2(x, y, z) (x ^ y ^ z)
  27. #define f3(x, y, z) ((x & y) | (x & z) | (y & z))
  28. #define f4(x, y, z) (x ^ y ^ z)
  29. /* SHA constants */
  30. #define CONST1 0x5a827999L
  31. #define CONST2 0x6ed9eba1L
  32. #define CONST3 0x8f1bbcdcL
  33. #define CONST4 0xca62c1d6L
  34. /* truncate to 32 bits -- should be a null op on 32-bit machines */
  35. #define T32(x) ((x)&0xffffffffL)
  36. /* 32-bit rotate */
  37. #define R32(x, n) T32(((x << n) | (x >> (32 - n))))
  38. /* the generic case, for when the overall rotation is not unraveled */
  39. #define FG(n) \
  40. T = T32(R32(A, 5) + f##n(B, C, D) + E + *WP++ + CONST##n); \
  41. E = D; \
  42. D = C; \
  43. C = R32(B, 30); \
  44. B = A; \
  45. A = T
  46. /* specific cases, for when the overall rotation is unraveled */
  47. #define FA(n) \
  48. T = T32(R32(A, 5) + f##n(B, C, D) + E + *WP++ + CONST##n); \
  49. B = R32(B, 30)
  50. #define FB(n) \
  51. E = T32(R32(T, 5) + f##n(A, B, C) + D + *WP++ + CONST##n); \
  52. A = R32(A, 30)
  53. #define FC(n) \
  54. D = T32(R32(E, 5) + f##n(T, A, B) + C + *WP++ + CONST##n); \
  55. T = R32(T, 30)
  56. #define FD(n) \
  57. C = T32(R32(D, 5) + f##n(E, T, A) + B + *WP++ + CONST##n); \
  58. E = R32(E, 30)
  59. #define FE(n) \
  60. B = T32(R32(C, 5) + f##n(D, E, T) + A + *WP++ + CONST##n); \
  61. D = R32(D, 30)
  62. #define FT(n) \
  63. A = T32(R32(B, 5) + f##n(C, D, E) + T + *WP++ + CONST##n); \
  64. C = R32(C, 30)
  65. /* do SHA transformation */
  66. static void ShaTransform(SHA_INFO *sha_info) {
  67. int i;
  68. SHA_BYTE *dp;
  69. SHA_LONG T, A, B, C, D, E, W[80], *WP;
  70. dp = sha_info->data;
  71. /*
  72. the following makes sure that at least one code block below is
  73. traversed or an error is reported, without the necessity for nested
  74. preprocessor if/else/endif blocks, which are a great pain in the
  75. nether regions of the anatomy...
  76. */
  77. #undef SWAP_DONE
  78. #if (SHA_BYTE_ORDER == 1234)
  79. #define SWAP_DONE
  80. for (i = 0; i < 16; ++i) {
  81. T = *((SHA_LONG *)dp);
  82. dp += 4;
  83. W[i] = ((T << 24) & 0xff000000) | ((T << 8) & 0x00ff0000) |
  84. ((T >> 8) & 0x0000ff00) | ((T >> 24) & 0x000000ff);
  85. }
  86. #endif /* SHA_BYTE_ORDER == 1234 */
  87. #if (SHA_BYTE_ORDER == 4321)
  88. #define SWAP_DONE
  89. for (i = 0; i < 16; ++i) {
  90. T = *((SHA_LONG *)dp);
  91. dp += 4;
  92. W[i] = T32(T);
  93. }
  94. #endif /* SHA_BYTE_ORDER == 4321 */
  95. #if (SHA_BYTE_ORDER == 12345678)
  96. #define SWAP_DONE
  97. for (i = 0; i < 16; i += 2) {
  98. T = *((SHA_LONG *)dp);
  99. dp += 8;
  100. W[i] = ((T << 24) & 0xff000000) | ((T << 8) & 0x00ff0000) |
  101. ((T >> 8) & 0x0000ff00) | ((T >> 24) & 0x000000ff);
  102. T >>= 32;
  103. W[i + 1] = ((T << 24) & 0xff000000) | ((T << 8) & 0x00ff0000) |
  104. ((T >> 8) & 0x0000ff00) | ((T >> 24) & 0x000000ff);
  105. }
  106. #endif /* SHA_BYTE_ORDER == 12345678 */
  107. #if (SHA_BYTE_ORDER == 87654321)
  108. #define SWAP_DONE
  109. for (i = 0; i < 16; i += 2) {
  110. T = *((SHA_LONG *)dp);
  111. dp += 8;
  112. W[i] = T32(T >> 32);
  113. W[i + 1] = T32(T);
  114. }
  115. #endif /* SHA_BYTE_ORDER == 87654321 */
  116. #ifndef SWAP_DONE
  117. #error Unknown byte order -- you need to add code here
  118. #endif /* SWAP_DONE */
  119. for (i = 16; i < 80; ++i) {
  120. W[i] = W[i - 3] ^ W[i - 8] ^ W[i - 14] ^ W[i - 16];
  121. #if (SHA_VERSION == 1)
  122. W[i] = R32(W[i], 1);
  123. #endif /* SHA_VERSION */
  124. }
  125. A = sha_info->digest[0];
  126. B = sha_info->digest[1];
  127. C = sha_info->digest[2];
  128. D = sha_info->digest[3];
  129. E = sha_info->digest[4];
  130. WP = W;
  131. #ifdef UNRAVEL
  132. FA(1);
  133. FB(1);
  134. FC(1);
  135. FD(1);
  136. FE(1);
  137. FT(1);
  138. FA(1);
  139. FB(1);
  140. FC(1);
  141. FD(1);
  142. FE(1);
  143. FT(1);
  144. FA(1);
  145. FB(1);
  146. FC(1);
  147. FD(1);
  148. FE(1);
  149. FT(1);
  150. FA(1);
  151. FB(1);
  152. FC(2);
  153. FD(2);
  154. FE(2);
  155. FT(2);
  156. FA(2);
  157. FB(2);
  158. FC(2);
  159. FD(2);
  160. FE(2);
  161. FT(2);
  162. FA(2);
  163. FB(2);
  164. FC(2);
  165. FD(2);
  166. FE(2);
  167. FT(2);
  168. FA(2);
  169. FB(2);
  170. FC(2);
  171. FD(2);
  172. FE(3);
  173. FT(3);
  174. FA(3);
  175. FB(3);
  176. FC(3);
  177. FD(3);
  178. FE(3);
  179. FT(3);
  180. FA(3);
  181. FB(3);
  182. FC(3);
  183. FD(3);
  184. FE(3);
  185. FT(3);
  186. FA(3);
  187. FB(3);
  188. FC(3);
  189. FD(3);
  190. FE(3);
  191. FT(3);
  192. FA(4);
  193. FB(4);
  194. FC(4);
  195. FD(4);
  196. FE(4);
  197. FT(4);
  198. FA(4);
  199. FB(4);
  200. FC(4);
  201. FD(4);
  202. FE(4);
  203. FT(4);
  204. FA(4);
  205. FB(4);
  206. FC(4);
  207. FD(4);
  208. FE(4);
  209. FT(4);
  210. FA(4);
  211. FB(4);
  212. sha_info->digest[0] = T32(sha_info->digest[0] + E);
  213. sha_info->digest[1] = T32(sha_info->digest[1] + T);
  214. sha_info->digest[2] = T32(sha_info->digest[2] + A);
  215. sha_info->digest[3] = T32(sha_info->digest[3] + B);
  216. sha_info->digest[4] = T32(sha_info->digest[4] + C);
  217. #else /* !UNRAVEL */
  218. #ifdef UNROLL_LOOPS
  219. FG(1);
  220. FG(1);
  221. FG(1);
  222. FG(1);
  223. FG(1);
  224. FG(1);
  225. FG(1);
  226. FG(1);
  227. FG(1);
  228. FG(1);
  229. FG(1);
  230. FG(1);
  231. FG(1);
  232. FG(1);
  233. FG(1);
  234. FG(1);
  235. FG(1);
  236. FG(1);
  237. FG(1);
  238. FG(1);
  239. FG(2);
  240. FG(2);
  241. FG(2);
  242. FG(2);
  243. FG(2);
  244. FG(2);
  245. FG(2);
  246. FG(2);
  247. FG(2);
  248. FG(2);
  249. FG(2);
  250. FG(2);
  251. FG(2);
  252. FG(2);
  253. FG(2);
  254. FG(2);
  255. FG(2);
  256. FG(2);
  257. FG(2);
  258. FG(2);
  259. FG(3);
  260. FG(3);
  261. FG(3);
  262. FG(3);
  263. FG(3);
  264. FG(3);
  265. FG(3);
  266. FG(3);
  267. FG(3);
  268. FG(3);
  269. FG(3);
  270. FG(3);
  271. FG(3);
  272. FG(3);
  273. FG(3);
  274. FG(3);
  275. FG(3);
  276. FG(3);
  277. FG(3);
  278. FG(3);
  279. FG(4);
  280. FG(4);
  281. FG(4);
  282. FG(4);
  283. FG(4);
  284. FG(4);
  285. FG(4);
  286. FG(4);
  287. FG(4);
  288. FG(4);
  289. FG(4);
  290. FG(4);
  291. FG(4);
  292. FG(4);
  293. FG(4);
  294. FG(4);
  295. FG(4);
  296. FG(4);
  297. FG(4);
  298. FG(4);
  299. #else /* !UNROLL_LOOPS */
  300. for (i = 0; i < 20; ++i) {
  301. FG(1);
  302. }
  303. for (i = 20; i < 40; ++i) {
  304. FG(2);
  305. }
  306. for (i = 40; i < 60; ++i) {
  307. FG(3);
  308. }
  309. for (i = 60; i < 80; ++i) {
  310. FG(4);
  311. }
  312. #endif /* !UNROLL_LOOPS */
  313. sha_info->digest[0] = T32(sha_info->digest[0] + A);
  314. sha_info->digest[1] = T32(sha_info->digest[1] + B);
  315. sha_info->digest[2] = T32(sha_info->digest[2] + C);
  316. sha_info->digest[3] = T32(sha_info->digest[3] + D);
  317. sha_info->digest[4] = T32(sha_info->digest[4] + E);
  318. #endif /* !UNRAVEL */
  319. }
  320. void ShaInit(SHA_INFO *sha_info) {
  321. sha_info->digest[0] = 0x67452301L;
  322. sha_info->digest[1] = 0xefcdab89L;
  323. sha_info->digest[2] = 0x98badcfeL;
  324. sha_info->digest[3] = 0x10325476L;
  325. sha_info->digest[4] = 0xc3d2e1f0L;
  326. sha_info->count_lo = 0L;
  327. sha_info->count_hi = 0L;
  328. sha_info->local = 0;
  329. }
  330. /* update the SHA digest */
  331. void ShaUpdate(SHA_INFO *sha_info, SHA_BYTE *buffer, int count) {
  332. int i;
  333. SHA_LONG clo;
  334. clo = T32(sha_info->count_lo + ((SHA_LONG)count << 3));
  335. if (clo < sha_info->count_lo) {
  336. ++sha_info->count_hi;
  337. }
  338. sha_info->count_lo = clo;
  339. sha_info->count_hi += (SHA_LONG)count >> 29;
  340. if (sha_info->local) {
  341. i = SHA_BLOCKSIZE - sha_info->local;
  342. if (i > count) {
  343. i = count;
  344. }
  345. memcpy(((SHA_BYTE *)sha_info->data) + sha_info->local, buffer, i);
  346. count -= i;
  347. buffer += i;
  348. sha_info->local += i;
  349. if (sha_info->local == SHA_BLOCKSIZE) {
  350. ShaTransform(sha_info);
  351. } else {
  352. return;
  353. }
  354. }
  355. while (count >= SHA_BLOCKSIZE) {
  356. memcpy(sha_info->data, buffer, SHA_BLOCKSIZE);
  357. buffer += SHA_BLOCKSIZE;
  358. count -= SHA_BLOCKSIZE;
  359. ShaTransform(sha_info);
  360. }
  361. memcpy(sha_info->data, buffer, count);
  362. sha_info->local = count;
  363. }
  364. /* finish computing the SHA digest */
  365. void ShaFinal(unsigned char digest[20], SHA_INFO *sha_info) {
  366. int count;
  367. SHA_LONG lo_bit_count, hi_bit_count;
  368. lo_bit_count = sha_info->count_lo;
  369. hi_bit_count = sha_info->count_hi;
  370. count = (int)((lo_bit_count >> 3) & 0x3f);
  371. ((SHA_BYTE *)sha_info->data)[count++] = 0x80;
  372. if (count > SHA_BLOCKSIZE - 8) {
  373. memset(((SHA_BYTE *)sha_info->data) + count, 0, SHA_BLOCKSIZE - count);
  374. ShaTransform(sha_info);
  375. memset((SHA_BYTE *)sha_info->data, 0, SHA_BLOCKSIZE - 8);
  376. } else {
  377. memset(((SHA_BYTE *)sha_info->data) + count, 0, SHA_BLOCKSIZE - 8 - count);
  378. }
  379. sha_info->data[56] = (unsigned char)((hi_bit_count >> 24) & 0xff);
  380. sha_info->data[57] = (unsigned char)((hi_bit_count >> 16) & 0xff);
  381. sha_info->data[58] = (unsigned char)((hi_bit_count >> 8) & 0xff);
  382. sha_info->data[59] = (unsigned char)((hi_bit_count >> 0) & 0xff);
  383. sha_info->data[60] = (unsigned char)((lo_bit_count >> 24) & 0xff);
  384. sha_info->data[61] = (unsigned char)((lo_bit_count >> 16) & 0xff);
  385. sha_info->data[62] = (unsigned char)((lo_bit_count >> 8) & 0xff);
  386. sha_info->data[63] = (unsigned char)((lo_bit_count >> 0) & 0xff);
  387. ShaTransform(sha_info);
  388. digest[0] = (unsigned char)((sha_info->digest[0] >> 24) & 0xff);
  389. digest[1] = (unsigned char)((sha_info->digest[0] >> 16) & 0xff);
  390. digest[2] = (unsigned char)((sha_info->digest[0] >> 8) & 0xff);
  391. digest[3] = (unsigned char)((sha_info->digest[0]) & 0xff);
  392. digest[4] = (unsigned char)((sha_info->digest[1] >> 24) & 0xff);
  393. digest[5] = (unsigned char)((sha_info->digest[1] >> 16) & 0xff);
  394. digest[6] = (unsigned char)((sha_info->digest[1] >> 8) & 0xff);
  395. digest[7] = (unsigned char)((sha_info->digest[1]) & 0xff);
  396. digest[8] = (unsigned char)((sha_info->digest[2] >> 24) & 0xff);
  397. digest[9] = (unsigned char)((sha_info->digest[2] >> 16) & 0xff);
  398. digest[10] = (unsigned char)((sha_info->digest[2] >> 8) & 0xff);
  399. digest[11] = (unsigned char)((sha_info->digest[2]) & 0xff);
  400. digest[12] = (unsigned char)((sha_info->digest[3] >> 24) & 0xff);
  401. digest[13] = (unsigned char)((sha_info->digest[3] >> 16) & 0xff);
  402. digest[14] = (unsigned char)((sha_info->digest[3] >> 8) & 0xff);
  403. digest[15] = (unsigned char)((sha_info->digest[3]) & 0xff);
  404. digest[16] = (unsigned char)((sha_info->digest[4] >> 24) & 0xff);
  405. digest[17] = (unsigned char)((sha_info->digest[4] >> 16) & 0xff);
  406. digest[18] = (unsigned char)((sha_info->digest[4] >> 8) & 0xff);
  407. digest[19] = (unsigned char)((sha_info->digest[4]) & 0xff);
  408. }
  409. /* compute the SHA digest of a FILE stream */
  410. void ShaOutput(unsigned char digest[20], unsigned char output[40]) {
  411. int i = 0;
  412. for (i = 0; i < 20; ++i) {
  413. sprintf((char *)(output + i * 2), "%02x", digest[i]);
  414. }
  415. }
  416. const char *ShaVersion(void) {
  417. #if (SHA_VERSION == 1)
  418. return "SHA-1";
  419. #else
  420. return "SHA";
  421. #endif
  422. }
  423. } // namespace qcloud_cos