1.  
  2. const unsigned int delta[16] = {
  3. 0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5,
  4. 0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5,
  5. 0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3,
  6. 0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174
  7. };
  8.  
  9. const unsigned int FORK_IV[8] = {
  10. 0x6a09e667, 0xbb67ae85, 0x3c6ef372, 0xa54ff53a,
  11. 0x510e527f, 0x9b05688c, 0x1f83d9ab, 0x5be0cd19
  12. };
  13.  
  14. #define ROL(x,n) (((x) << n) | ((x) >> (32-n))) /* n-bit rotation left */
  15.  
  16. #define f(x) ( (x) + (ROL(x,7) ^ ROL(x,22)) )
  17.  
  18. #define g(x) ( (x) ^ (ROL(x,13) + ROL(x,27)) )
  19.  
  20. #define step(A,B,C,D,E,F,G,H,M1,M2,D1,D2) \
  21. temp = (H + ROL(g(E+M2),21)) ^ ROL(f(E+M2+D2),17); \
  22. H = (G + ROL(g(E+M2),9)) ^ ROL(f(E+M2+D2),5); \
  23. G = (F + g(E+M2)) ^ f(E+M2+D2); \
  24. F = E + M2 + D2; \
  25. E = (D + ROL(f(A+M1),17)) ^ ROL(g(A+M1+D1),21); \
  26. D = (C + ROL(f(A+M1),5)) ^ ROL(g(A+M1+D1),9); \
  27. C = (B + f(A+M1)) ^ g(A+M1+D1); \
  28. B = A + M1 + D1; \
  29. A = temp;
  30.  
  31. void FORK256_compress(unsigned int CV[8], const unsigned int M[16])
  32. {
  33. unsigned int A1,B1,C1,D1,E1,F1,G1,H1;
  34. unsigned int A2,B2,C2,D2,E2,F2,G2,H2;
  35. unsigned int A3,B3,C3,D3,E3,F3,G3,H3;
  36. unsigned int A4,B4,C4,D4,E4,F4,G4,H4;
  37. unsigned int temp;
  38. A1 = A2 = A3 = A4 = CV[0]; B1 = B2 = B3 = B4 = CV[1];
  39. C1 = C2 = C3 = C4 = CV[2]; D1 = D2 = D3 = D4 = CV[3];
  40. E1 = E2 = E3 = E4 = CV[4]; F1 = F2 = F3 = F4 = CV[5];
  41. G1 = G2 = G3 = G4 = CV[6]; H1 = H2 = H3 = H4 = CV[7];
  42. /* BRANCH1(CV,M) */
  43. step(A1,B1,C1,D1,E1,F1,G1,H1,M[0],M[1],delta[0],delta[1]);
  44. step(A1,B1,C1,D1,E1,F1,G1,H1,M[2],M[3],delta[2],delta[3]);
  45. step(A1,B1,C1,D1,E1,F1,G1,H1,M[4],M[5],delta[4],delta[5]);
  46. step(A1,B1,C1,D1,E1,F1,G1,H1,M[6],M[7],delta[6],delta[7]);
  47. step(A1,B1,C1,D1,E1,F1,G1,H1,M[8],M[9],delta[8],delta[9]);
  48. step(A1,B1,C1,D1,E1,F1,G1,H1,M[10],M[11],delta[10],delta[11]);
  49. step(A1,B1,C1,D1,E1,F1,G1,H1,M[12],M[13],delta[12],delta[13]);
  50. step(A1,B1,C1,D1,E1,F1,G1,H1,M[14],M[15],delta[14],delta[15]);
  51. /* BRANCH2(CV,M) */
  52. step(A2,B2,C2,D2,E2,F2,G2,H2,M[14],M[15],delta[15],delta[14]);
  53. step(A2,B2,C2,D2,E2,F2,G2,H2,M[11],M[9],delta[13],delta[12]);
  54. step(A2,B2,C2,D2,E2,F2,G2,H2,M[8],M[10],delta[11],delta[10]);
  55. step(A2,B2,C2,D2,E2,F2,G2,H2,M[3],M[4],delta[9],delta[8]);
  56. step(A2,B2,C2,D2,E2,F2,G2,H2,M[2],M[13],delta[7],delta[6]);
  57. step(A2,B2,C2,D2,E2,F2,G2,H2,M[0],M[5],delta[5],delta[4]);
  58. step(A2,B2,C2,D2,E2,F2,G2,H2,M[6],M[7],delta[3],delta[2]);
  59. step(A2,B2,C2,D2,E2,F2,G2,H2,M[12],M[1],delta[1],delta[0]);
  60. /* BRANCH3(CV,M) */
  61. step(A3,B3,C3,D3,E3,F3,G3,H3,M[7],M[6],delta[1],delta[0]);
  62. step(A3,B3,C3,D3,E3,F3,G3,H3,M[10],M[14],delta[3],delta[2]);
  63. step(A3,B3,C3,D3,E3,F3,G3,H3,M[13],M[2],delta[5],delta[4]);
  64. step(A3,B3,C3,D3,E3,F3,G3,H3,M[9],M[12],delta[7],delta[6]);
  65. step(A3,B3,C3,D3,E3,F3,G3,H3,M[11],M[4],delta[9],delta[8]);
  66. step(A3,B3,C3,D3,E3,F3,G3,H3,M[15],M[8],delta[11],delta[10]);
  67. step(A3,B3,C3,D3,E3,F3,G3,H3,M[5],M[0],delta[13],delta[12]);
  68. step(A3,B3,C3,D3,E3,F3,G3,H3,M[1],M[3],delta[15],delta[14]);
  69. /* BRANCH4(CV,M) */
  70. step(A4,B4,C4,D4,E4,F4,G4,H4,M[5],M[12],delta[14],delta[15]);
  71. step(A4,B4,C4,D4,E4,F4,G4,H4,M[1],M[8],delta[12],delta[13]);
  72. step(A4,B4,C4,D4,E4,F4,G4,H4,M[15],M[0],delta[10],delta[11]);
  73. step(A4,B4,C4,D4,E4,F4,G4,H4,M[13],M[11],delta[8],delta[9]);
  74. step(A4,B4,C4,D4,E4,F4,G4,H4,M[3],M[10],delta[6],delta[7]);
  75. step(A4,B4,C4,D4,E4,F4,G4,H4,M[9],M[2],delta[4],delta[5]);
  76. step(A4,B4,C4,D4,E4,F4,G4,H4,M[7],M[14],delta[2],delta[3]);
  77. step(A4,B4,C4,D4,E4,F4,G4,H4,M[4],M[6],delta[0],delta[1]);
  78. /* output */
  79. CV[0] = CV[0] + ((A1 + A2) ^ (A3 + A4));
  80. CV[1] = CV[1] + ((B1 + B2) ^ (B3 + B4));
  81. CV[2] = CV[2] + ((C1 + C2) ^ (C3 + C4));
  82. CV[3] = CV[3] + ((D1 + D2) ^ (D3 + D4));
  83. CV[4] = CV[4] + ((E1 + E2) ^ (E3 + E4));
  84. CV[5] = CV[5] + ((F1 + F2) ^ (F3 + F4));
  85. CV[6] = CV[6] + ((G1 + G2) ^ (G3 + G4));
  86. CV[7] = CV[7] + ((H1 + H2) ^ (H3 + H4));
  87. }
  88.