📄 whrlpool.cpp
字号:
W64LIT(0xf0d1cece4fced13e), W64LIT(0x9955111133115588),
W64LIT(0x83898f8f8c8f890c), W64LIT(0x046b4e4ed24e6b4a),
W64LIT(0x6651b7b7c4b751d1), W64LIT(0xe060ebeb20eb600b),
W64LIT(0xc1cc3c3c443cccfd), W64LIT(0xfdbf81819e81bf7c),
W64LIT(0x40fe9494a194fed4), W64LIT(0x1c0cf7f704f70ceb),
W64LIT(0x1867b9b9d6b967a1), W64LIT(0x8b5f131335135f98),
W64LIT(0x519c2c2c742c9c7d), W64LIT(0x05b8d3d368d3b8d6),
W64LIT(0x8c5ce7e734e75c6b), W64LIT(0x39cb6e6eb26ecb57),
W64LIT(0xaaf3c4c451c4f36e), W64LIT(0x1b0f030305030f18),
W64LIT(0xdc135656fa56138a), W64LIT(0x5e494444cc44491a),
W64LIT(0xa09e7f7f817f9edf), W64LIT(0x8837a9a9e6a93721),
W64LIT(0x67822a2a7e2a824d), W64LIT(0x0a6dbbbbd0bb6db1),
W64LIT(0x87e2c1c15ec1e246), W64LIT(0xf1025353f55302a2),
W64LIT(0x728bdcdc79dc8bae), W64LIT(0x53270b0b1d0b2758),
W64LIT(0x01d39d9dba9dd39c), W64LIT(0x2bc16c6cb46cc147),
W64LIT(0xa4f531315331f595), W64LIT(0xf3b974749c74b987),
W64LIT(0x1509f6f607f609e3), W64LIT(0x4c434646ca46430a),
W64LIT(0xa526acace9ac2609), W64LIT(0xb59789898689973c),
W64LIT(0xb44414143c1444a0), W64LIT(0xba42e1e13ee1425b),
W64LIT(0xa64e16163a164eb0), W64LIT(0xf7d23a3a4e3ad2cd),
W64LIT(0x06d06969bb69d06f), W64LIT(0x412d09091b092d48),
W64LIT(0xd7ad70709070ada7), W64LIT(0x6f54b6b6c7b654d9),
W64LIT(0x1eb7d0d06dd0b7ce), W64LIT(0xd67eeded2aed7e3b),
W64LIT(0xe2dbcccc49ccdb2e), W64LIT(0x68574242c642572a),
W64LIT(0x2cc29898b598c2b4), W64LIT(0xed0ea4a4f1a40e49),
W64LIT(0x758828287828885d), W64LIT(0x86315c5ce45c31da),
W64LIT(0x6b3ff8f815f83f93), W64LIT(0xc2a486869786a444),
};
static const word64 C3[256] = {
W64LIT(0xc0d8781818281878), W64LIT(0x0526af23236523af),
W64LIT(0x7eb8f9c6c657c6f9), W64LIT(0x13fb6fe8e825e86f),
W64LIT(0x4ccba187879487a1), W64LIT(0xa91162b8b8d5b862),
W64LIT(0x0809050101030105), W64LIT(0x420d6e4f4fd14f6e),
W64LIT(0xad9bee36365a36ee), W64LIT(0x59ff04a6a6f7a604),
W64LIT(0xde0cbdd2d26bd2bd), W64LIT(0xfb0e06f5f502f506),
W64LIT(0xef968079798b7980), W64LIT(0x5f30ce6f6fb16fce),
W64LIT(0xfc6def9191ae91ef), W64LIT(0xaaf8075252f65207),
W64LIT(0x2747fd6060a060fd), W64LIT(0x893576bcbcd9bc76),
W64LIT(0xac37cd9b9bb09bcd), W64LIT(0x048a8c8e8e8f8e8c),
W64LIT(0x71d215a3a3f8a315), W64LIT(0x606c3c0c0c140c3c),
W64LIT(0xff848a7b7b8d7b8a), W64LIT(0xb580e135355f35e1),
W64LIT(0xe8f5691d1d271d69), W64LIT(0x53b347e0e03de047),
W64LIT(0xf621acd7d764d7ac), W64LIT(0x5e9cedc2c25bc2ed),
W64LIT(0x6d43962e2e722e96), W64LIT(0x62297a4b4bdd4b7a),
W64LIT(0xa35d21fefe1ffe21), W64LIT(0x82d5165757f95716),
W64LIT(0xa8bd4115153f1541), W64LIT(0x9fe8b677779977b6),
W64LIT(0xa592eb37375937eb), W64LIT(0x7b9e56e5e532e556),
W64LIT(0x8c13d99f9fbc9fd9), W64LIT(0xd32317f0f00df017),
W64LIT(0x6a207f4a4ade4a7f), W64LIT(0x9e4495dada73da95),
W64LIT(0xfaa2255858e85825), W64LIT(0x06cfcac9c946c9ca),
W64LIT(0x557c8d29297b298d), W64LIT(0x505a220a0a1e0a22),
W64LIT(0xe1504fb1b1ceb14f), W64LIT(0x69c91aa0a0fda01a),
W64LIT(0x7f14da6b6bbd6bda), W64LIT(0x5cd9ab85859285ab),
W64LIT(0x813c73bdbddabd73), W64LIT(0xd28f345d5de75d34),
W64LIT(0x8090501010301050), W64LIT(0xf30703f4f401f403),
W64LIT(0x16ddc0cbcb40cbc0), W64LIT(0xedd3c63e3e423ec6),
W64LIT(0x282d1105050f0511), W64LIT(0x1f78e66767a967e6),
W64LIT(0x739753e4e431e453), W64LIT(0x2502bb27276927bb),
W64LIT(0x3273584141c34158), W64LIT(0x2ca79d8b8b808b9d),
W64LIT(0x51f601a7a7f4a701), W64LIT(0xcfb2947d7d877d94),
W64LIT(0xdc49fb9595a295fb), W64LIT(0x8e569fd8d875d89f),
W64LIT(0x8b7030fbfb10fb30), W64LIT(0x23cd71eeee2fee71),
W64LIT(0xc7bb917c7c847c91), W64LIT(0x1771e36666aa66e3),
W64LIT(0xa67b8edddd7add8e), W64LIT(0xb8af4b171739174b),
W64LIT(0x0245464747c94746), W64LIT(0x841adc9e9ebf9edc),
W64LIT(0x1ed4c5caca43cac5), W64LIT(0x7558992d2d772d99),
W64LIT(0x912e79bfbfdcbf79), W64LIT(0x383f1b070709071b),
W64LIT(0x01ac23adadeaad23), W64LIT(0xeab02f5a5aee5a2f),
W64LIT(0x6cefb583839883b5), W64LIT(0x85b6ff33335533ff),
W64LIT(0x3f5cf26363a563f2), W64LIT(0x10120a020206020a),
W64LIT(0x399338aaaae3aa38), W64LIT(0xafdea871719371a8),
W64LIT(0x0ec6cfc8c845c8cf), W64LIT(0xc8d17d19192b197d),
W64LIT(0x723b704949db4970), W64LIT(0x865f9ad9d976d99a),
W64LIT(0xc3311df2f20bf21d), W64LIT(0x4ba848e3e338e348),
W64LIT(0xe2b92a5b5bed5b2a), W64LIT(0x34bc928888858892),
W64LIT(0xa43ec89a9ab39ac8), W64LIT(0x2d0bbe26266a26be),
W64LIT(0x8dbffa32325632fa), W64LIT(0xe9594ab0b0cdb04a),
W64LIT(0x1bf26ae9e926e96a), W64LIT(0x7877330f0f110f33),
W64LIT(0xe633a6d5d562d5a6), W64LIT(0x74f4ba80809d80ba),
W64LIT(0x99277cbebedfbe7c), W64LIT(0x26ebdecdcd4acdde),
W64LIT(0xbd89e434345c34e4), W64LIT(0x7a32754848d84875),
W64LIT(0xab5424ffff1cff24), W64LIT(0xf78d8f7a7a8e7a8f),
W64LIT(0xf464ea9090ad90ea), W64LIT(0xc29d3e5f5fe15f3e),
W64LIT(0x1d3da020206020a0), W64LIT(0x670fd56868b868d5),
W64LIT(0xd0ca721a1a2e1a72), W64LIT(0x19b72caeaeefae2c),
W64LIT(0xc97d5eb4b4c1b45e), W64LIT(0x9ace195454fc5419),
W64LIT(0xec7fe59393a893e5), W64LIT(0x0d2faa22226622aa),
W64LIT(0x0763e96464ac64e9), W64LIT(0xdb2a12f1f10ef112),
W64LIT(0xbfcca273739573a2), W64LIT(0x90825a121236125a),
W64LIT(0x3a7a5d4040c0405d), W64LIT(0x4048280808180828),
W64LIT(0x5695e8c3c358c3e8), W64LIT(0x33df7becec29ec7b),
W64LIT(0x964d90dbdb70db90), W64LIT(0x61c01fa1a1fea11f),
W64LIT(0x1c91838d8d8a8d83), W64LIT(0xf5c8c93d3d473dc9),
W64LIT(0xcc5bf19797a497f1), W64LIT(0x0000000000000000),
W64LIT(0x36f9d4cfcf4ccfd4), W64LIT(0x456e872b2b7d2b87),
W64LIT(0x97e1b376769a76b3), W64LIT(0x64e6b082829b82b0),
W64LIT(0xfe28a9d6d667d6a9), W64LIT(0xd8c3771b1b2d1b77),
W64LIT(0xc1745bb5b5c2b55b), W64LIT(0x11be29afafecaf29),
W64LIT(0x771ddf6a6abe6adf), W64LIT(0xbaea0d5050f0500d),
W64LIT(0x12574c4545cf454c), W64LIT(0xcb3818f3f308f318),
W64LIT(0x9dadf030305030f0), W64LIT(0x2bc474efef2cef74),
W64LIT(0xe5dac33f3f413fc3), W64LIT(0x92c71c5555ff551c),
W64LIT(0x79db10a2a2fba210), W64LIT(0x03e965eaea23ea65),
W64LIT(0x0f6aec6565af65ec), W64LIT(0xb90368babad3ba68),
W64LIT(0x654a932f2f712f93), W64LIT(0x4e8ee7c0c05dc0e7),
W64LIT(0xbe6081dede7fde81), W64LIT(0xe0fc6c1c1c241c6c),
W64LIT(0xbb462efdfd1afd2e), W64LIT(0x521f644d4dd74d64),
W64LIT(0xe476e09292ab92e0), W64LIT(0x8ffabc75759f75bc),
W64LIT(0x30361e06060a061e), W64LIT(0x24ae988a8a838a98),
W64LIT(0xf94b40b2b2cbb240), W64LIT(0x638559e6e637e659),
W64LIT(0x707e360e0e120e36), W64LIT(0xf8e7631f1f211f63),
W64LIT(0x3755f76262a662f7), W64LIT(0xee3aa3d4d461d4a3),
W64LIT(0x298132a8a8e5a832), W64LIT(0xc452f49696a796f4),
W64LIT(0x9b623af9f916f93a), W64LIT(0x66a3f6c5c552c5f6),
W64LIT(0x3510b125256f25b1), W64LIT(0xf2ab205959eb5920),
W64LIT(0x54d0ae84849184ae), W64LIT(0xb7c5a772729672a7),
W64LIT(0xd5ecdd39394b39dd), W64LIT(0x5a16614c4cd44c61),
W64LIT(0xca943b5e5ee25e3b), W64LIT(0xe79f857878887885),
W64LIT(0xdde5d838384838d8), W64LIT(0x1498868c8c898c86),
W64LIT(0xc617b2d1d16ed1b2), W64LIT(0x41e40ba5a5f2a50b),
W64LIT(0x43a14de2e23be24d), W64LIT(0x2f4ef86161a361f8),
W64LIT(0xf14245b3b3c8b345), W64LIT(0x1534a521216321a5),
W64LIT(0x9408d69c9cb99cd6), W64LIT(0xf0ee661e1e221e66),
W64LIT(0x2261524343c54352), W64LIT(0x76b1fcc7c754c7fc),
W64LIT(0xb34f2bfcfc19fc2b), W64LIT(0x20241404040c0414),
W64LIT(0xb2e3085151f35108), W64LIT(0xbc25c79999b699c7),
W64LIT(0x4f22c46d6db76dc4), W64LIT(0x6865390d0d170d39),
W64LIT(0x837935fafa13fa35), W64LIT(0xb66984dfdf7cdf84),
W64LIT(0xd7a99b7e7e827e9b), W64LIT(0x3d19b424246c24b4),
W64LIT(0xc5fed73b3b4d3bd7), W64LIT(0x319a3dababe0ab3d),
W64LIT(0x3ef0d1cece4fced1), W64LIT(0x8899551111331155),
W64LIT(0x0c83898f8f8c8f89), W64LIT(0x4a046b4e4ed24e6b),
W64LIT(0xd16651b7b7c4b751), W64LIT(0x0be060ebeb20eb60),
W64LIT(0xfdc1cc3c3c443ccc), W64LIT(0x7cfdbf81819e81bf),
W64LIT(0xd440fe9494a194fe), W64LIT(0xeb1c0cf7f704f70c),
W64LIT(0xa11867b9b9d6b967), W64LIT(0x988b5f131335135f),
W64LIT(0x7d519c2c2c742c9c), W64LIT(0xd605b8d3d368d3b8),
W64LIT(0x6b8c5ce7e734e75c), W64LIT(0x5739cb6e6eb26ecb),
W64LIT(0x6eaaf3c4c451c4f3), W64LIT(0x181b0f030305030f),
W64LIT(0x8adc135656fa5613), W64LIT(0x1a5e494444cc4449),
W64LIT(0xdfa09e7f7f817f9e), W64LIT(0x218837a9a9e6a937),
W64LIT(0x4d67822a2a7e2a82), W64LIT(0xb10a6dbbbbd0bb6d),
W64LIT(0x4687e2c1c15ec1e2), W64LIT(0xa2f1025353f55302),
W64LIT(0xae728bdcdc79dc8b), W64LIT(0x5853270b0b1d0b27),
W64LIT(0x9c01d39d9dba9dd3), W64LIT(0x472bc16c6cb46cc1),
W64LIT(0x95a4f531315331f5), W64LIT(0x87f3b974749c74b9),
W64LIT(0xe31509f6f607f609), W64LIT(0x0a4c434646ca4643),
W64LIT(0x09a526acace9ac26), W64LIT(0x3cb5978989868997),
W64LIT(0xa0b44414143c1444), W64LIT(0x5bba42e1e13ee142),
W64LIT(0xb0a64e16163a164e), W64LIT(0xcdf7d23a3a4e3ad2),
W64LIT(0x6f06d06969bb69d0), W64LIT(0x48412d09091b092d),
W64LIT(0xa7d7ad70709070ad), W64LIT(0xd96f54b6b6c7b654),
W64LIT(0xce1eb7d0d06dd0b7), W64LIT(0x3bd67eeded2aed7e),
W64LIT(0x2ee2dbcccc49ccdb), W64LIT(0x2a68574242c64257),
W64LIT(0xb42cc29898b598c2), W64LIT(0x49ed0ea4a4f1a40e),
W64LIT(0x5d75882828782888), W64LIT(0xda86315c5ce45c31),
W64LIT(0x936b3ff8f815f83f), W64LIT(0x44c2a486869786a4),
};
static const word64 rc[R] = {
W64LIT(0x1823c6e887b8014f),
W64LIT(0x36a6d2f5796f9152),
W64LIT(0x60bc9b8ea30c7b35),
W64LIT(0x1de0d7c22e4bfe57),
W64LIT(0x157737e59ff04ada),
W64LIT(0x58c9290ab1a06b85),
W64LIT(0xbd5d10f4cb3e0567),
W64LIT(0xe427418ba77d95d8),
W64LIT(0xfbee7c66dd17479e),
W64LIT(0xca2dbf07ad5a8333)
};
// Whirlpool basic transformation. Transforms state based on block.
void Whirlpool::Transform(word64 *digest, const word64 *block)
{
word64 w[8]; // temporary storage
word64 s[8]; // the cipher state
word64 k[8]; // the round key
// Compute and apply K^0 to the cipher state
// Also apply part of the Miyaguchi-Preneel compression function
digest[0] = s[0] = block[0] ^ (k[0] = digest[0]);
digest[1] = s[1] = block[1] ^ (k[1] = digest[1]);
digest[2] = s[2] = block[2] ^ (k[2] = digest[2]);
digest[3] = s[3] = block[3] ^ (k[3] = digest[3]);
digest[4] = s[4] = block[4] ^ (k[4] = digest[4]);
digest[5] = s[5] = block[5] ^ (k[5] = digest[5]);
digest[6] = s[6] = block[6] ^ (k[6] = digest[6]);
digest[7] = s[7] = block[7] ^ (k[7] = digest[7]);
// Iterate over all rounds:
for (int r = 0; r < R; r++)
{
word64 t;
// Compute K^r from K^{r-1}:
#define K(i,j) GETBYTE(k[(i+j+1)%8], j)
#define KS(i) \
t = C0[K(i,3)] ^ C1[K(i,2)] ^ C2[K(i,1)] ^ C3[K(i,0)]; \
w[i] = (t >> 32) ^ (t << 32) ^ C0[K(i,7)] ^ C1[K(i,6)] ^ C2[K(i,5)] ^ C3[K(i,4)];
KS(0); KS(1); KS(2); KS(3); KS(4); KS(5); KS(6); KS(7);
k[0] = w[0] ^ rc[r];
k[1] = w[1]; k[2] = w[2]; k[3] = w[3]; k[4] = w[4]; k[5] = w[5]; k[6] = w[6]; k[7] = w[7];
// Apply the r-th round transformation:
#define S(i,j) GETBYTE(s[(i+j+1)%8], j)
#define TS(i) \
t = C0[S(i,3)] ^ C1[S(i,2)] ^ C2[S(i,1)] ^ C3[S(i,0)]; \
w[i] = (t >> 32) ^ (t << 32) ^ C0[S(i,7)] ^ C1[S(i,6)] ^ C2[S(i,5)] ^ C3[S(i,4)] ^ k[i];
TS(0); TS(1); TS(2); TS(3); TS(4); TS(5); TS(6); TS(7);
s[0] = w[0]; s[1] = w[1]; s[2] = w[2]; s[3] = w[3]; s[4] = w[4]; s[5] = w[5]; s[6] = w[6]; s[7] = w[7];
}
// Apply the rest of the Miyaguchi-Preneel compression function:
digest[0] ^= s[0];
digest[1] ^= s[1];
digest[2] ^= s[2];
digest[3] ^= s[3];
digest[4] ^= s[4];
digest[5] ^= s[5];
digest[6] ^= s[6];
digest[7] ^= s[7];
}
NAMESPACE_END
#endif // WORD64_AVAILABLE
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -