Advertisement
FlyFar

libs/SHA256/sha256.cpp

Mar 24th, 2024
536
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 6.45 KB | Cybersecurity | 0 0
  1. /*
  2. *   SHA-256 implementation.
  3. *
  4. *   Copyright (c) 2010 Ilya O. Levin, http://www.literatecode.com
  5. *
  6. *   Permission to use, copy, modify, and distribute this software for any
  7. *   purpose with or without fee is hereby granted, provided that the above
  8. *   copyright notice and this permission notice appear in all copies.
  9. *
  10. *   THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
  11. *   WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
  12. *   MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
  13. *   ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
  14. *   WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
  15. *   ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
  16. *   OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
  17. */
  18. #define SWAP_BYTES
  19. // #define USE_STD_MEMCPY
  20.  
  21. #ifdef USE_STD_MEMCPY
  22. #include <string.h>
  23. #endif
  24. #include "sha256.h"
  25.  
  26. #ifdef __cplusplus
  27. extern "C" {
  28. #endif
  29.  
  30. #define RL(x,n)   (((x) << n) | ((x) >> (32 - n)))
  31. #define RR(x,n)   (((x) >> n) | ((x) << (32 - n)))
  32.  
  33. #define S0(x)  (RR((x), 2) ^ RR((x),13) ^ RR((x),22))
  34. #define S1(x)  (RR((x), 6) ^ RR((x),11) ^ RR((x),25))
  35. #define G0(x)  (RR((x), 7) ^ RR((x),18) ^ ((x) >> 3))
  36. #define G1(x)  (RR((x),17) ^ RR((x),19) ^ ((x) >> 10))
  37.  
  38. #ifdef SWAP_BYTES
  39. #define BSWP(x,y)  _bswapw((uint32_t *)(x), (uint32_t)(y))
  40. #else
  41. #define BSWP(p,n)
  42. #endif
  43. #ifdef USE_STD_MEMCPY
  44. #define MEMCP(x,y,z) memcpy((x),(y),(z))
  45. #else
  46. #define MEMCP(x,y,z) _memcp((x),(y),(z))
  47. #endif
  48.  
  49. #ifndef __cdecl
  50. #define __cdecl
  51. #endif
  52.  
  53. static const uint32_t K[64] = {
  54.      0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5,
  55.      0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5,
  56.      0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3,
  57.      0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174,
  58.      0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc,
  59.      0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da,
  60.      0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7,
  61.      0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967,
  62.      0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13,
  63.      0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85,
  64.      0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3,
  65.      0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070,
  66.      0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5,
  67.      0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, 0x682e6ff3,
  68.      0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208,
  69.      0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2
  70. };
  71.  
  72. /* -------------------------------------------------------------------------- */
  73. static void _bswapw(uint32_t *p, uint32_t i)
  74. {
  75.     while (i--) p[i] = (RR(p[i],24) & 0x00ff00ff) | (RR(p[i],8) & 0xff00ff00);
  76.  
  77. } /* _bswapw */
  78.  
  79. /* -------------------------------------------------------------------------- */
  80. #ifndef USE_STD_MEMCPY
  81. void * __cdecl _memcp (void *d, const void *s, uint32_t sz)
  82. {
  83.     void *rv = d;
  84.  
  85.     while (sz--) *(char *)d = *(char *)s, d = (char *)d + 1,  s = (char *)s + 1;
  86.  
  87.     return(rv);
  88. } /* _memcp */
  89. #endif
  90.  
  91. /* -------------------------------------------------------------------------- */
  92. static void _rtrf(uint32_t *b, uint32_t *p, uint32_t i, uint32_t j)
  93. {
  94.     #define B(x, y) b[(x-y) & 7]
  95.     #define P(x, y) p[(x+y) & 15]
  96.  
  97.     B(7,i) += (j ? (p[i & 15] += G1(P(i,14)) + P(i,9) + G0(P(i,1))) : p[i & 15])
  98.               + K[i+j] + S1(B(4,i))
  99.               + (B(6,i) ^ (B(4,i) & (B(5,i) ^ B(6,i))));
  100.     B(3,i) += B(7,i);
  101.     B(7,i) += S0(B(0,i)) + ( (B(0,i) & B(1,i)) | (B(2,i) & (B(0,i) ^ B(1,i))) );
  102.  
  103.     #undef P
  104.     #undef B
  105. } /* _rtrf */
  106.  
  107. /* -------------------------------------------------------------------------- */
  108. static void _hash(sha256_context *ctx)
  109. {
  110.     uint32_t b[8], *p, j;
  111.  
  112.     b[0] = ctx->hash[0]; b[1] = ctx->hash[1]; b[2] = ctx->hash[2];
  113.     b[3] = ctx->hash[3]; b[4] = ctx->hash[4]; b[5] = ctx->hash[5];
  114.     b[6] = ctx->hash[6]; b[7] = ctx->hash[7];
  115.  
  116.     for (p = ctx->buf, j = 0; j < 64; j += 16)
  117.         _rtrf(b, p,  0, j), _rtrf(b, p,  1, j), _rtrf(b, p,  2, j),
  118.         _rtrf(b, p,  3, j), _rtrf(b, p,  4, j), _rtrf(b, p,  5, j),
  119.         _rtrf(b, p,  6, j), _rtrf(b, p,  7, j), _rtrf(b, p,  8, j),
  120.         _rtrf(b, p,  9, j), _rtrf(b, p, 10, j), _rtrf(b, p, 11, j),
  121.         _rtrf(b, p, 12, j), _rtrf(b, p, 13, j), _rtrf(b, p, 14, j),
  122.         _rtrf(b, p, 15, j);
  123.  
  124.     ctx->hash[0] += b[0]; ctx->hash[1] += b[1]; ctx->hash[2] += b[2];
  125.     ctx->hash[3] += b[3]; ctx->hash[4] += b[4]; ctx->hash[5] += b[5];
  126.     ctx->hash[6] += b[6]; ctx->hash[7] += b[7];
  127.  
  128. } /* _hash */
  129.  
  130. /* -------------------------------------------------------------------------- */
  131. void sha256_init(sha256_context *ctx)
  132. {
  133.     ctx->len[0] = ctx->len[1] = 0;
  134.     ctx->hash[0] = 0x6a09e667; ctx->hash[1] = 0xbb67ae85;
  135.     ctx->hash[2] = 0x3c6ef372; ctx->hash[3] = 0xa54ff53a;
  136.     ctx->hash[4] = 0x510e527f; ctx->hash[5] = 0x9b05688c;
  137.     ctx->hash[6] = 0x1f83d9ab; ctx->hash[7] = 0x5be0cd19;
  138.  
  139. } /* sha256_init */
  140.  
  141. /* -------------------------------------------------------------------------- */
  142. void sha256_hash(sha256_context *ctx, uint8_t *dat, uint32_t sz)
  143. {
  144.     register uint32_t i = ctx->len[0] & 63, l, j;
  145.  
  146.     if ((ctx->len[0] += sz) < sz)  ++(ctx->len[1]);
  147.  
  148.     for (j = 0, l = 64-i; sz >= l; j += l, sz -= l, l = 64, i = 0)
  149.     {
  150.         MEMCP((char *)ctx->buf + i, &dat[j], l);
  151.         BSWP(ctx->buf, 16 );
  152.         _hash(ctx);
  153.     }
  154.     MEMCP((char *)ctx->buf + i, &dat[j], sz);
  155.  
  156. } /* _hash */
  157.  
  158. /* -------------------------------------------------------------------------- */
  159. void sha256_done(sha256_context *ctx, uint8_t *buf)
  160. {
  161.     uint32_t i = (uint32_t)(ctx->len[0] & 63), j = ((~i) & 3) << 3;
  162.  
  163.     BSWP(ctx->buf, (i + 3) >> 2);
  164.  
  165.     ctx->buf[i >> 2] &= 0xffffff80 << j;  /* add padding */
  166.     ctx->buf[i >> 2] |= 0x00000080 << j;
  167.  
  168.     if (i < 56) i = (i >> 2) + 1;
  169.        else ctx->buf[15] ^= (i < 60) ? ctx->buf[15] : 0, _hash(ctx), i = 0;
  170.  
  171.     while (i < 14) ctx->buf[i++] = 0;
  172.  
  173.     ctx->buf[14] = (ctx->len[1] << 3)|(ctx->len[0] >> 29); /* add length */
  174.     ctx->buf[15] = ctx->len[0] << 3;
  175.  
  176.     _hash(ctx);
  177.  
  178.     for (i = 0; i < 32; i++)
  179.        ctx->buf[i % 16] = 0, /* may remove this line in case of a DIY cleanup */
  180.        buf[i] = (uint8_t)(ctx->hash[i >> 2] >> ((~i & 3) << 3));
  181.  
  182. } /* sha256_done */
  183.  
  184. void sha256(uint8_t *output, uint8_t *input, int inlen)
  185. {
  186.     sha256_context ctx;
  187.    
  188.     sha256_init(&ctx);
  189.     sha256_hash(&ctx, input, inlen);
  190.     return sha256_done(&ctx, output);
  191. }
  192.  
  193. #ifdef __cplusplus
  194. }
  195. #endif
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement