Advertisement
Guest User

Untitled

a guest
Feb 5th, 2014
252
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.19 KB | None | 0 0
  1. __constant ulong keccak_round_constants[24] = {
  2. 0x0000000000000001UL, 0x0000000000008082UL,
  3. 0x800000000000808aUL, 0x8000000080008000UL,
  4. 0x000000000000808bUL, 0x0000000080000001UL,
  5. 0x8000000080008081UL, 0x8000000000008009UL,
  6. 0x000000000000008aUL, 0x0000000000000088UL,
  7. 0x0000000080008009UL, 0x000000008000000aUL,
  8. 0x000000008000808bUL, 0x800000000000008bUL,
  9. 0x8000000000008089UL, 0x8000000000008003UL,
  10. 0x8000000000008002UL, 0x8000000000000080UL,
  11. 0x000000000000800aUL, 0x800000008000000aUL,
  12. 0x8000000080008081UL, 0x8000000000008080UL,
  13. 0x0000000080000001UL, 0x8000000080008008UL
  14. };
  15.  
  16.  
  17. static void
  18. keccak_block_core(hash_state *S) {
  19. uint2 t[5];
  20. uint2 u[5];
  21. uint2 v;
  22. uint2 w;
  23. uint4 *s4 = S->state4;
  24. uint i;
  25.  
  26. for (i = 0; i < 24; i++) {
  27. /* theta: c = a[0,i] ^ a[1,i] ^ .. a[4,i] */
  28. t[0] = s4[0].xy ^ s4[2].zw ^ s4[5].xy ^ s4[7].zw ^ s4[10].xy;
  29. t[1] = s4[0].zw ^ s4[3].xy ^ s4[5].zw ^ s4[8].xy ^ s4[10].zw;
  30. t[2] = s4[1].xy ^ s4[3].zw ^ s4[6].xy ^ s4[8].zw ^ s4[11].xy;
  31. t[3] = s4[1].zw ^ s4[4].xy ^ s4[6].zw ^ s4[9].xy ^ s4[11].zw;
  32. t[4] = s4[2].xy ^ s4[4].zw ^ s4[7].xy ^ s4[9].zw ^ s4[12].xy;
  33.  
  34. /* theta: d[i] = c[i+4] ^ rotl(c[i+1],1) */
  35. u[0] = t[4] ^ ROTL64(t[1], 1UL);
  36. u[1] = t[0] ^ ROTL64(t[2], 1UL);
  37. u[2] = t[1] ^ ROTL64(t[3], 1UL);
  38. u[3] = t[2] ^ ROTL64(t[4], 1UL);
  39. u[4] = t[3] ^ ROTL64(t[0], 1UL);
  40.  
  41. /* theta: a[0,i], a[1,i], .. a[4,i] ^= d[i] */
  42. s4[0].xy ^= u[0]; s4[2].zw ^= u[0]; s4[5].xy ^= u[0]; s4[7].zw ^= u[0]; s4[10].xy ^= u[0];
  43. s4[0].zw ^= u[1]; s4[3].xy ^= u[1]; s4[5].zw ^= u[1]; s4[8].xy ^= u[1]; s4[10].zw ^= u[1];
  44. s4[1].xy ^= u[2]; s4[3].zw ^= u[2]; s4[6].xy ^= u[2]; s4[8].zw ^= u[2]; s4[11].xy ^= u[2];
  45. s4[1].zw ^= u[3]; s4[4].xy ^= u[3]; s4[6].zw ^= u[3]; s4[9].xy ^= u[3]; s4[11].zw ^= u[3];
  46. s4[2].xy ^= u[4]; s4[4].zw ^= u[4]; s4[7].xy ^= u[4]; s4[9].zw ^= u[4]; s4[12].xy ^= u[4];
  47.  
  48. /* rho pi: b[..] = rotl(a[..], ..) */
  49. v = s4[0].zw;
  50. s4[ 0].zw = ROTL64(s4[ 3].xy, 44UL);
  51. s4[ 3].xy = ROTL64(s4[ 4].zw, 20UL);
  52. s4[ 4].zw = ROTL64(s4[11].xy, 61UL);
  53. s4[11].xy = ROTL64(s4[ 7].xy, 39UL);
  54. s4[ 7].xy = ROTL64(s4[10].xy, 18UL);
  55. s4[10].xy = ROTL64(s4[ 1].xy, 62UL);
  56. s4[ 1].xy = ROTL64(s4[ 6].xy, 43UL);
  57. s4[ 6].xy = ROTL64(s4[ 6].zw, 25UL);
  58. s4[ 6].zw = ROTL64(s4[ 9].zw, 8UL);
  59. s4[ 9].zw = ROTL64(s4[11].zw, 56UL);
  60. s4[11].zw = ROTL64(s4[ 7].zw, 41UL);
  61. s4[ 7].zw = ROTL64(s4[ 2].xy, 27UL);
  62. s4[ 2].xy = ROTL64(s4[12].xy, 14UL);
  63. s4[12].xy = ROTL64(s4[10].zw, 2UL);
  64. s4[10].zw = ROTL64(s4[ 4].xy, 55UL);
  65. s4[ 4].xy = ROTL64(s4[ 8].xy, 45UL);
  66. s4[ 8].xy = ROTL64(s4[ 2].zw, 36UL);
  67. s4[ 2].zw = ROTL64(s4[ 1].zw, 28UL);
  68. s4[ 1].zw = ROTL64(s4[ 9].xy, 21UL);
  69. s4[ 9].xy = ROTL64(s4[ 8].zw, 15UL);
  70. s4[ 8].zw = ROTL64(s4[ 5].zw, 10UL);
  71. s4[ 5].zw = ROTL64(s4[ 3].zw, 6UL);
  72. s4[ 3].zw = ROTL64(s4[ 5].xy, 3UL);
  73. s4[ 5].xy = ROTL64( v, 1UL);
  74.  
  75. /* chi: a[i,j] ^= ~b[i,j+1] & b[i,j+2] */
  76. v = s4[ 0].xy; w = s4[ 0].zw; s4[ 0].xy ^= (~w) & s4[ 1].xy; s4[ 0].zw ^= (~s4[ 1].xy) & s4[ 1].zw; s4[ 1].xy ^= (~s4[ 1].zw) & s4[ 2].xy; s4[ 1].zw ^= (~s4[ 2].xy) & v; s4[ 2].xy ^= (~v) & w;
  77. v = s4[ 2].zw; w = s4[ 3].xy; s4[ 2].zw ^= (~w) & s4[ 3].zw; s4[ 3].xy ^= (~s4[ 3].zw) & s4[ 4].xy; s4[ 3].zw ^= (~s4[ 4].xy) & s4[ 4].zw; s4[ 4].xy ^= (~s4[ 4].zw) & v; s4[ 4].zw ^= (~v) & w;
  78. v = s4[ 5].xy; w = s4[ 5].zw; s4[ 5].xy ^= (~w) & s4[ 6].xy; s4[ 5].zw ^= (~s4[ 6].xy) & s4[ 6].zw; s4[ 6].xy ^= (~s4[ 6].zw) & s4[ 7].xy; s4[ 6].zw ^= (~s4[ 7].xy) & v; s4[ 7].xy ^= (~v) & w;
  79. v = s4[ 7].zw; w = s4[ 8].xy; s4[ 7].zw ^= (~w) & s4[ 8].zw; s4[ 8].xy ^= (~s4[ 8].zw) & s4[ 9].xy; s4[ 8].zw ^= (~s4[ 9].xy) & s4[ 9].zw; s4[ 9].xy ^= (~s4[ 9].zw) & v; s4[ 9].zw ^= (~v) & w;
  80. v = s4[10].xy; w = s4[10].zw; s4[10].xy ^= (~w) & s4[11].xy; s4[10].zw ^= (~s4[11].xy) & s4[11].zw; s4[11].xy ^= (~s4[11].zw) & s4[12].xy; s4[11].zw ^= (~s4[12].xy) & v; s4[12].xy ^= (~v) & w;
  81.  
  82. /* iota: a[0,0] ^= round constant */
  83. s4[0].xy ^= as_uint2(keccak_round_constants[i]);
  84. }
  85. }
  86.  
  87. static void
  88. keccak_block(hash_state *S, const uint4 *in4) {
  89. uint4 *s4 = S->state4;
  90. uint i;
  91.  
  92. /* absorb input */
  93. #pragma unroll
  94. for (i = 0; i < 4; i++) {
  95. s4[i] ^= in4[i];
  96. }
  97. s4[4].xy ^= in4[4].xy;
  98.  
  99. keccak_block_core(S);
  100. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement