crypto_internal.c 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212
  1. #ifndef CONFIG
  2. #define CONFIG "config.h"
  3. #endif // CONFIG
  4. #include CONFIG
  5. #if !defined(_CRYPTO_OPENSSL) && !defined(_CRYPTO_POLARSSL) && !defined(_CRYPTO_WINDOWS)
  6. #include "crypto_internal.h"
  7. #include "endian.h"
  8. #define F0(x, y, z) ( ((x) & (y)) | (~(x) & (z)) )
  9. #define F1(x, y, z) ( ((x) & (y)) | ((x) & (z)) | ((y) & (z)) )
  10. #define SI1(x) ( ROR32(x, 2 ) ^ ROR32(x, 13) ^ ROR32(x, 22) )
  11. #define SI2(x) ( ROR32(x, 6 ) ^ ROR32(x, 11) ^ ROR32(x, 25) )
  12. #define SI3(x) ( ROR32(x, 7 ) ^ ROR32(x, 18) ^ ((x) >> 3 ) )
  13. #define SI4(x) ( ROR32(x, 17) ^ ROR32(x, 19) ^ ((x) >> 10) )
  14. static const DWORD k[] = {
  15. 0x428A2F98, 0x71374491, 0xB5C0FBCF, 0xE9B5DBA5, 0x3956C25B, 0x59F111F1,
  16. 0x923F82A4, 0xAB1C5ED5, 0xD807AA98, 0x12835B01, 0x243185BE, 0x550C7DC3,
  17. 0x72BE5D74, 0x80DEB1FE, 0x9BDC06A7, 0xC19BF174, 0xE49B69C1, 0xEFBE4786,
  18. 0x0FC19DC6, 0x240CA1CC, 0x2DE92C6F, 0x4A7484AA, 0x5CB0A9DC, 0x76F988DA,
  19. 0x983E5152, 0xA831C66D, 0xB00327C8, 0xBF597FC7, 0xC6E00BF3, 0xD5A79147,
  20. 0x06CA6351, 0x14292967, 0x27B70A85, 0x2E1B2138, 0x4D2C6DFC, 0x53380D13,
  21. 0x650A7354, 0x766A0ABB, 0x81C2C92E, 0x92722C85, 0xA2BFE8A1, 0xA81A664B,
  22. 0xC24B8B70, 0xC76C51A3, 0xD192E819, 0xD6990624, 0xF40E3585, 0x106AA070,
  23. 0x19A4C116, 0x1E376C08, 0x2748774C, 0x34B0BCB5, 0x391C0CB3, 0x4ED8AA4A,
  24. 0x5B9CCA4F, 0x682E6FF3, 0x748F82EE, 0x78A5636F, 0x84C87814, 0x8CC70208,
  25. 0x90BEFFFA, 0xA4506CEB, 0xBEF9A3F7, 0xC67178F2
  26. };
  27. static void Sha256Init(Sha256Ctx *Ctx)
  28. {
  29. Ctx->State[0] = 0x6A09E667;
  30. Ctx->State[1] = 0xBB67AE85;
  31. Ctx->State[2] = 0x3C6EF372;
  32. Ctx->State[3] = 0xA54FF53A;
  33. Ctx->State[4] = 0x510E527F;
  34. Ctx->State[5] = 0x9B05688C;
  35. Ctx->State[6] = 0x1F83D9AB;
  36. Ctx->State[7] = 0x5BE0CD19;
  37. Ctx->Len = 0;
  38. }
  39. static void Sha256ProcessBlock(Sha256Ctx *Ctx, BYTE *block)
  40. {
  41. unsigned int i;
  42. DWORD w[64], temp1, temp2;
  43. DWORD a = Ctx->State[0];
  44. DWORD b = Ctx->State[1];
  45. DWORD c = Ctx->State[2];
  46. DWORD d = Ctx->State[3];
  47. DWORD e = Ctx->State[4];
  48. DWORD f = Ctx->State[5];
  49. DWORD g = Ctx->State[6];
  50. DWORD h = Ctx->State[7];
  51. for (i = 0; i < 16; i++)
  52. //w[ i ] = GET_UAA32BE(block, i);
  53. w[i] = BE32(((DWORD*)block)[i]);
  54. for (i = 16; i < 64; i++)
  55. w[ i ] = SI4(w[ i - 2 ]) + w[ i - 7 ] + SI3(w[ i - 15 ]) + w[ i - 16 ];
  56. for (i = 0; i < 64; i++)
  57. {
  58. temp1 = h + SI2(e) + F0(e, f, g) + k[ i ] + w[ i ];
  59. temp2 = SI1(a) + F1(a, b, c);
  60. h = g;
  61. g = f;
  62. f = e;
  63. e = d + temp1;
  64. d = c;
  65. c = b;
  66. b = a;
  67. a = temp1 + temp2;
  68. }
  69. Ctx->State[0] += a;
  70. Ctx->State[1] += b;
  71. Ctx->State[2] += c;
  72. Ctx->State[3] += d;
  73. Ctx->State[4] += e;
  74. Ctx->State[5] += f;
  75. Ctx->State[6] += g;
  76. Ctx->State[7] += h;
  77. }
  78. static void Sha256Update(Sha256Ctx *Ctx, BYTE *data, size_t len)
  79. {
  80. unsigned int b_len = Ctx->Len & 63,
  81. r_len = (b_len ^ 63) + 1;
  82. Ctx->Len += (unsigned int)len;
  83. if ( len < r_len )
  84. {
  85. memcpy(Ctx->Buffer + b_len, data, len);
  86. return;
  87. }
  88. if ( r_len < 64 )
  89. {
  90. memcpy(Ctx->Buffer + b_len, data, r_len);
  91. len -= r_len;
  92. data += r_len;
  93. Sha256ProcessBlock(Ctx, Ctx->Buffer);
  94. }
  95. for (; len >= 64; len -= 64, data += 64)
  96. Sha256ProcessBlock(Ctx, data);
  97. if ( len ) memcpy(Ctx->Buffer, data, len);
  98. }
  99. static void Sha256Finish(Sha256Ctx *Ctx, BYTE *hash)
  100. {
  101. unsigned int i, b_len = Ctx->Len & 63;
  102. Ctx->Buffer[ b_len ] = 0x80;
  103. if ( b_len ^ 63 ) memset(Ctx->Buffer + b_len + 1, 0, b_len ^ 63);
  104. if ( b_len >= 56 )
  105. {
  106. Sha256ProcessBlock(Ctx, Ctx->Buffer);
  107. memset(Ctx->Buffer, 0, 56);
  108. }
  109. //PUT_UAA64BE(Ctx->Buffer, (unsigned long long)(Ctx->Len * 8), 7);
  110. ((uint64_t*)Ctx->Buffer)[7] = BE64((uint64_t)Ctx->Len << 3);
  111. Sha256ProcessBlock(Ctx, Ctx->Buffer);
  112. for (i = 0; i < 8; i++)
  113. //PUT_UAA32BE(hash, Ctx->State[i], i);
  114. ((DWORD*)hash)[i] = BE32(Ctx->State[i]);
  115. }
  116. void Sha256(BYTE *data, size_t len, BYTE *hash)
  117. {
  118. Sha256Ctx Ctx;
  119. Sha256Init(&Ctx);
  120. Sha256Update(&Ctx, data, len);
  121. Sha256Finish(&Ctx, hash);
  122. }
  123. static void _Sha256HmacInit(Sha256HmacCtx *Ctx, BYTE *key, size_t klen)
  124. {
  125. BYTE IPad[64];
  126. unsigned int i;
  127. memset(IPad, 0x36, sizeof(IPad));
  128. memset(Ctx->OPad, 0x5C, sizeof(Ctx->OPad));
  129. if ( klen > 64 )
  130. {
  131. BYTE *temp = (BYTE*)alloca(32);
  132. Sha256(key, klen, temp);
  133. klen = 32;
  134. key = temp;
  135. }
  136. for (i = 0; i < klen; i++)
  137. {
  138. IPad[ i ] ^= key[ i ];
  139. Ctx->OPad[ i ] ^= key[ i ];
  140. }
  141. Sha256Init(&Ctx->ShaCtx);
  142. Sha256Update(&Ctx->ShaCtx, IPad, sizeof(IPad));
  143. }
  144. static void _Sha256HmacUpdate(Sha256HmacCtx *Ctx, BYTE *data, size_t len)
  145. {
  146. Sha256Update(&Ctx->ShaCtx, data, len);
  147. }
  148. static void _Sha256HmacFinish(Sha256HmacCtx *Ctx, BYTE *hmac)
  149. {
  150. BYTE temp[32];
  151. Sha256Finish(&Ctx->ShaCtx, temp);
  152. Sha256Init(&Ctx->ShaCtx);
  153. Sha256Update(&Ctx->ShaCtx, Ctx->OPad, sizeof(Ctx->OPad));
  154. Sha256Update(&Ctx->ShaCtx, temp, sizeof(temp));
  155. Sha256Finish(&Ctx->ShaCtx, hmac);
  156. }
  157. int_fast8_t Sha256Hmac(BYTE* key, BYTE* restrict data, DWORD len, BYTE* restrict hmac)
  158. {
  159. Sha256HmacCtx Ctx;
  160. _Sha256HmacInit(&Ctx, key, 16);
  161. _Sha256HmacUpdate(&Ctx, data, len);
  162. _Sha256HmacFinish(&Ctx, hmac);
  163. return TRUE;
  164. }
  165. #endif // No external Crypto