Guest User

Untitled

a guest
Nov 1st, 2017
63
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1.         private static uint f0(uint B, uint C, uint D) => ((B & C) | ((~B) & D));
  2.         private static uint f1(uint B, uint C, uint D) => (B ^ C ^ D);
  3.         private static uint f2(uint B, uint C, uint D) => ((B & C) | (B & D) | (C & D));
  4.         private static uint f3(uint B, uint C, uint D) => (B ^ C ^ D);
  5.  
  6.         static void SHA1ProcessMessageBlock(SHA1Context context)
  7.         {
  8.             uint[] W = InitializeWordSequence(context.Message_Block);
  9.  
  10.             var hash = context.Intermediate_Hash;
  11.             Func<uint, uint, uint, uint>[] f = { f0, f1, f2, f3 };
  12.             UInt32[] K = { 0x5A827999, 0x6ED9EBA1, 0x8F1BBCDC, 0xCA62C1D6 };
  13.             var (A, B, C, D, E) = (hash[0], hash[1], hash[2], hash[3], hash[4]);
  14.  
  15.             for (var i = 1; i <= 4; i++)
  16.             {
  17.                 (A, B, C, D, E) = DoIntermediateHashCalculationRounds(i * 20, (i + 1) * 20, K[i], f[i], W, A, B, C, D, E);
  18.             }
  19.  
  20.             hash[0] += A;
  21.             hash[1] += B;
  22.             hash[2] += C;
  23.             hash[3] += D;
  24.             hash[4] += E;
  25.  
  26.             context.Message_Block_Index = 0;
  27.         }
  28.  
  29.         private static uint[] InitializeWordSequence(byte[] messageBlock)
  30.         {
  31.             var W = new UInt32[80];  /* Word sequence               */
  32.             /* Initialize the first 16 words in the array W    */
  33.             InitializeFirst16WordsInW(messageBlock, W);
  34.             FillRestOfWFromFirst16(W);
  35.             return W;
  36.         }
  37.  
  38.         private static void InitializeFirst16WordsInW(byte[] messageBlock, uint[] W)
  39.         {
  40.             for (var i = 0; i < 16; i++)
  41.             {
  42.                 W[i] = (UInt32)messageBlock[i * 4] << 24;
  43.                 W[i] |= (UInt32)messageBlock[i * 4 + 1] << 16;
  44.                 W[i] |= (UInt32)messageBlock[i * 4 + 2] << 8;
  45.                 W[i] |= (UInt32)messageBlock[i * 4 + 3];
  46.             }
  47.         }
  48.  
  49.         private static void FillRestOfWFromFirst16(uint[] W)
  50.         {
  51.             for (var i = 16; i < 80; i++)
  52.             {
  53.                 W[i] = SHA1CircularShift(1, W[i - 3] ^ W[i - 8] ^ W[i - 14] ^ W[i - 16]);
  54.             }
  55.         }
  56.  
  57.         private static (UInt32 A, UInt32 B, UInt32 C, UInt32 D, UInt32 E) DoIntermediateHashCalculationRounds(
  58.             int startIndex,
  59.             int firstIndexAfterEnd,
  60.             uint K,
  61.             Func<uint, uint, uint, uint> f,
  62.             uint[] W,
  63.             uint A,
  64.             uint B,
  65.             uint C,
  66.             uint D,
  67.             uint E)
  68.         {
  69.             for (var i = startIndex; i < firstIndexAfterEnd; i++)
  70.             {
  71.                 var nextA = SHA1CircularShift(5, A) + f(B, C, D) + E + W[i] + K;
  72.                 E = D;
  73.                 D = C;
  74.                 C = SHA1CircularShift(30, B);
  75.                 B = A;
  76.                 A = nextA;
  77.             }
  78.             return (A, B, C, D, E);
  79.         }
RAW Paste Data