| 69 | } |
| 70 | |
| 71 | static inline void threefry(uint k[2], uint c[2], uint X[2]) { |
| 72 | uint ks[3]; |
| 73 | |
| 74 | ks[2] = SKEIN_KS_PARITY; |
| 75 | ks[0] = k[0]; |
| 76 | X[0] = c[0]; |
| 77 | ks[2] ^= k[0]; |
| 78 | ks[1] = k[1]; |
| 79 | X[1] = c[1]; |
| 80 | ks[2] ^= k[1]; |
| 81 | |
| 82 | X[0] += ks[0]; |
| 83 | X[1] += ks[1]; |
| 84 | |
| 85 | X[0] += X[1]; |
| 86 | X[1] = rotL(X[1], R0); |
| 87 | X[1] ^= X[0]; |
| 88 | X[0] += X[1]; |
| 89 | X[1] = rotL(X[1], R1); |
| 90 | X[1] ^= X[0]; |
| 91 | X[0] += X[1]; |
| 92 | X[1] = rotL(X[1], R2); |
| 93 | X[1] ^= X[0]; |
| 94 | X[0] += X[1]; |
| 95 | X[1] = rotL(X[1], R3); |
| 96 | X[1] ^= X[0]; |
| 97 | |
| 98 | /* InjectKey(r=1) */ |
| 99 | X[0] += ks[1]; |
| 100 | X[1] += ks[2]; |
| 101 | X[1] += 1; /* X[2-1] += r */ |
| 102 | |
| 103 | X[0] += X[1]; |
| 104 | X[1] = rotL(X[1], R4); |
| 105 | X[1] ^= X[0]; |
| 106 | X[0] += X[1]; |
| 107 | X[1] = rotL(X[1], R5); |
| 108 | X[1] ^= X[0]; |
| 109 | X[0] += X[1]; |
| 110 | X[1] = rotL(X[1], R6); |
| 111 | X[1] ^= X[0]; |
| 112 | X[0] += X[1]; |
| 113 | X[1] = rotL(X[1], R7); |
| 114 | X[1] ^= X[0]; |
| 115 | |
| 116 | /* InjectKey(r=2) */ |
| 117 | X[0] += ks[2]; |
| 118 | X[1] += ks[0]; |
| 119 | X[1] += 2; |
| 120 | |
| 121 | X[0] += X[1]; |
| 122 | X[1] = rotL(X[1], R0); |
| 123 | X[1] ^= X[0]; |
| 124 | X[0] += X[1]; |
| 125 | X[1] = rotL(X[1], R1); |
| 126 | X[1] ^= X[0]; |
| 127 | X[0] += X[1]; |
| 128 | X[1] = rotL(X[1], R2); |
no test coverage detected