📄 whrlpool.cpp
字号:
// Whrlpool.cpp - modified by Kevin Springle from
// Paulo Barreto and Vincent Rijmen's public domain code, whirlpool.c.
// Any modifications are placed in the public domain
// This is the original introductory comment:
/**
* The Whirlpool hashing function.
*
* <P>
* <b>References</b>
*
* <P>
* The Whirlpool algorithm was developed by
* <a href="mailto:pbarreto@scopus.com.br">Paulo S. L. M. Barreto</a> and
* <a href="mailto:vincent.rijmen@cryptomathic.com">Vincent Rijmen</a>.
*
* See
* P.S.L.M. Barreto, V. Rijmen,
* ``The Whirlpool hashing function,''
* NESSIE submission, 2000 (tweaked version, 2001),
* <https://www.cosic.esat.kuleuven.ac.be/nessie/workshop/submissions/whirlpool.zip>
*
* @author Paulo S.L.M. Barreto
* @author Vincent Rijmen.
*
* @version 2.1 (2001.09.01)
*
* =============================================================================
*
* Differences from version 1.0:
*
* - Original S-box replaced by the tweaked, hardware-efficient version.
*
* =============================================================================
*
* THIS SOFTWARE IS PROVIDED BY THE AUTHORS ''AS IS'' AND ANY EXPRESS
* OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
* BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
* OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
* EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
*/
#include "pch.h"
#ifdef WORD64_AVAILABLE
#include "whrlpool.h"
#include "misc.h"
NAMESPACE_BEGIN(CryptoPP)
void Whirlpool_TestInstantiations()
{
Whirlpool x;
}
void Whirlpool::InitState(HashWordType *state)
{
memset(state, 0, 8*sizeof(state[0]));
}
void Whirlpool::TruncatedFinal(byte *hash, unsigned int size)
{
ThrowIfInvalidTruncatedSize(size);
PadLastBlock(32);
CorrectEndianess(m_data, m_data, 32);
m_data[m_data.size()-4] = 0;
m_data[m_data.size()-3] = 0;
m_data[m_data.size()-2] = GetBitCountHi();
m_data[m_data.size()-1] = GetBitCountLo();
Transform(m_digest, m_data);
CorrectEndianess(m_digest, m_digest, DigestSize());
memcpy(hash, m_digest, size);
Restart(); // reinit for next use
}
/*
* The number of rounds of the internal dedicated block cipher.
*/
#define R 10
/*
* Though Whirlpool is endianness-neutral, the encryption tables are listed
* in BIG-ENDIAN format, which is adopted throughout this implementation
* (but little-endian notation would be equally suitable if consistently
* employed).
*/
static const word64 C0[256] = {
W64LIT(0x1818281878c0d878), W64LIT(0x23236523af0526af),
W64LIT(0xc6c657c6f97eb8f9), W64LIT(0xe8e825e86f13fb6f),
W64LIT(0x87879487a14ccba1), W64LIT(0xb8b8d5b862a91162),
W64LIT(0x0101030105080905), W64LIT(0x4f4fd14f6e420d6e),
W64LIT(0x36365a36eead9bee), W64LIT(0xa6a6f7a60459ff04),
W64LIT(0xd2d26bd2bdde0cbd), W64LIT(0xf5f502f506fb0e06),
W64LIT(0x79798b7980ef9680), W64LIT(0x6f6fb16fce5f30ce),
W64LIT(0x9191ae91effc6def), W64LIT(0x5252f65207aaf807),
W64LIT(0x6060a060fd2747fd), W64LIT(0xbcbcd9bc76893576),
W64LIT(0x9b9bb09bcdac37cd), W64LIT(0x8e8e8f8e8c048a8c),
W64LIT(0xa3a3f8a31571d215), W64LIT(0x0c0c140c3c606c3c),
W64LIT(0x7b7b8d7b8aff848a), W64LIT(0x35355f35e1b580e1),
W64LIT(0x1d1d271d69e8f569), W64LIT(0xe0e03de04753b347),
W64LIT(0xd7d764d7acf621ac), W64LIT(0xc2c25bc2ed5e9ced),
W64LIT(0x2e2e722e966d4396), W64LIT(0x4b4bdd4b7a62297a),
W64LIT(0xfefe1ffe21a35d21), W64LIT(0x5757f9571682d516),
W64LIT(0x15153f1541a8bd41), W64LIT(0x77779977b69fe8b6),
W64LIT(0x37375937eba592eb), W64LIT(0xe5e532e5567b9e56),
W64LIT(0x9f9fbc9fd98c13d9), W64LIT(0xf0f00df017d32317),
W64LIT(0x4a4ade4a7f6a207f), W64LIT(0xdada73da959e4495),
W64LIT(0x5858e85825faa225), W64LIT(0xc9c946c9ca06cfca),
W64LIT(0x29297b298d557c8d), W64LIT(0x0a0a1e0a22505a22),
W64LIT(0xb1b1ceb14fe1504f), W64LIT(0xa0a0fda01a69c91a),
W64LIT(0x6b6bbd6bda7f14da), W64LIT(0x85859285ab5cd9ab),
W64LIT(0xbdbddabd73813c73), W64LIT(0x5d5de75d34d28f34),
W64LIT(0x1010301050809050), W64LIT(0xf4f401f403f30703),
W64LIT(0xcbcb40cbc016ddc0), W64LIT(0x3e3e423ec6edd3c6),
W64LIT(0x05050f0511282d11), W64LIT(0x6767a967e61f78e6),
W64LIT(0xe4e431e453739753), W64LIT(0x27276927bb2502bb),
W64LIT(0x4141c34158327358), W64LIT(0x8b8b808b9d2ca79d),
W64LIT(0xa7a7f4a70151f601), W64LIT(0x7d7d877d94cfb294),
W64LIT(0x9595a295fbdc49fb), W64LIT(0xd8d875d89f8e569f),
W64LIT(0xfbfb10fb308b7030), W64LIT(0xeeee2fee7123cd71),
W64LIT(0x7c7c847c91c7bb91), W64LIT(0x6666aa66e31771e3),
W64LIT(0xdddd7add8ea67b8e), W64LIT(0x171739174bb8af4b),
W64LIT(0x4747c94746024546), W64LIT(0x9e9ebf9edc841adc),
W64LIT(0xcaca43cac51ed4c5), W64LIT(0x2d2d772d99755899),
W64LIT(0xbfbfdcbf79912e79), W64LIT(0x070709071b383f1b),
W64LIT(0xadadeaad2301ac23), W64LIT(0x5a5aee5a2feab02f),
W64LIT(0x83839883b56cefb5), W64LIT(0x33335533ff85b6ff),
W64LIT(0x6363a563f23f5cf2), W64LIT(0x020206020a10120a),
W64LIT(0xaaaae3aa38399338), W64LIT(0x71719371a8afdea8),
W64LIT(0xc8c845c8cf0ec6cf), W64LIT(0x19192b197dc8d17d),
W64LIT(0x4949db4970723b70), W64LIT(0xd9d976d99a865f9a),
W64LIT(0xf2f20bf21dc3311d), W64LIT(0xe3e338e3484ba848),
W64LIT(0x5b5bed5b2ae2b92a), W64LIT(0x888885889234bc92),
W64LIT(0x9a9ab39ac8a43ec8), W64LIT(0x26266a26be2d0bbe),
W64LIT(0x32325632fa8dbffa), W64LIT(0xb0b0cdb04ae9594a),
W64LIT(0xe9e926e96a1bf26a), W64LIT(0x0f0f110f33787733),
W64LIT(0xd5d562d5a6e633a6), W64LIT(0x80809d80ba74f4ba),
W64LIT(0xbebedfbe7c99277c), W64LIT(0xcdcd4acdde26ebde),
W64LIT(0x34345c34e4bd89e4), W64LIT(0x4848d848757a3275),
W64LIT(0xffff1cff24ab5424), W64LIT(0x7a7a8e7a8ff78d8f),
W64LIT(0x9090ad90eaf464ea), W64LIT(0x5f5fe15f3ec29d3e),
W64LIT(0x20206020a01d3da0), W64LIT(0x6868b868d5670fd5),
W64LIT(0x1a1a2e1a72d0ca72), W64LIT(0xaeaeefae2c19b72c),
W64LIT(0xb4b4c1b45ec97d5e), W64LIT(0x5454fc54199ace19),
W64LIT(0x9393a893e5ec7fe5), W64LIT(0x22226622aa0d2faa),
W64LIT(0x6464ac64e90763e9), W64LIT(0xf1f10ef112db2a12),
W64LIT(0x73739573a2bfcca2), W64LIT(0x121236125a90825a),
W64LIT(0x4040c0405d3a7a5d), W64LIT(0x0808180828404828),
W64LIT(0xc3c358c3e85695e8), W64LIT(0xecec29ec7b33df7b),
W64LIT(0xdbdb70db90964d90), W64LIT(0xa1a1fea11f61c01f),
W64LIT(0x8d8d8a8d831c9183), W64LIT(0x3d3d473dc9f5c8c9),
W64LIT(0x9797a497f1cc5bf1), W64LIT(0x0000000000000000),
W64LIT(0xcfcf4ccfd436f9d4), W64LIT(0x2b2b7d2b87456e87),
W64LIT(0x76769a76b397e1b3), W64LIT(0x82829b82b064e6b0),
W64LIT(0xd6d667d6a9fe28a9), W64LIT(0x1b1b2d1b77d8c377),
W64LIT(0xb5b5c2b55bc1745b), W64LIT(0xafafecaf2911be29),
W64LIT(0x6a6abe6adf771ddf), W64LIT(0x5050f0500dbaea0d),
W64LIT(0x4545cf454c12574c), W64LIT(0xf3f308f318cb3818),
W64LIT(0x30305030f09dadf0), W64LIT(0xefef2cef742bc474),
W64LIT(0x3f3f413fc3e5dac3), W64LIT(0x5555ff551c92c71c),
W64LIT(0xa2a2fba21079db10), W64LIT(0xeaea23ea6503e965),
W64LIT(0x6565af65ec0f6aec), W64LIT(0xbabad3ba68b90368),
W64LIT(0x2f2f712f93654a93), W64LIT(0xc0c05dc0e74e8ee7),
W64LIT(0xdede7fde81be6081), W64LIT(0x1c1c241c6ce0fc6c),
W64LIT(0xfdfd1afd2ebb462e), W64LIT(0x4d4dd74d64521f64),
W64LIT(0x9292ab92e0e476e0), W64LIT(0x75759f75bc8ffabc),
W64LIT(0x06060a061e30361e), W64LIT(0x8a8a838a9824ae98),
W64LIT(0xb2b2cbb240f94b40), W64LIT(0xe6e637e659638559),
W64LIT(0x0e0e120e36707e36), W64LIT(0x1f1f211f63f8e763),
W64LIT(0x6262a662f73755f7), W64LIT(0xd4d461d4a3ee3aa3),
W64LIT(0xa8a8e5a832298132), W64LIT(0x9696a796f4c452f4),
W64LIT(0xf9f916f93a9b623a), W64LIT(0xc5c552c5f666a3f6),
W64LIT(0x25256f25b13510b1), W64LIT(0x5959eb5920f2ab20),
W64LIT(0x84849184ae54d0ae), W64LIT(0x72729672a7b7c5a7),
W64LIT(0x39394b39ddd5ecdd), W64LIT(0x4c4cd44c615a1661),
W64LIT(0x5e5ee25e3bca943b), W64LIT(0x7878887885e79f85),
W64LIT(0x38384838d8dde5d8), W64LIT(0x8c8c898c86149886),
W64LIT(0xd1d16ed1b2c617b2), W64LIT(0xa5a5f2a50b41e40b),
W64LIT(0xe2e23be24d43a14d), W64LIT(0x6161a361f82f4ef8),
W64LIT(0xb3b3c8b345f14245), W64LIT(0x21216321a51534a5),
W64LIT(0x9c9cb99cd69408d6), W64LIT(0x1e1e221e66f0ee66),
W64LIT(0x4343c54352226152), W64LIT(0xc7c754c7fc76b1fc),
W64LIT(0xfcfc19fc2bb34f2b), W64LIT(0x04040c0414202414),
W64LIT(0x5151f35108b2e308), W64LIT(0x9999b699c7bc25c7),
W64LIT(0x6d6db76dc44f22c4), W64LIT(0x0d0d170d39686539),
W64LIT(0xfafa13fa35837935), W64LIT(0xdfdf7cdf84b66984),
W64LIT(0x7e7e827e9bd7a99b), W64LIT(0x24246c24b43d19b4),
W64LIT(0x3b3b4d3bd7c5fed7), W64LIT(0xababe0ab3d319a3d),
W64LIT(0xcece4fced13ef0d1), W64LIT(0x1111331155889955),
W64LIT(0x8f8f8c8f890c8389), W64LIT(0x4e4ed24e6b4a046b),
W64LIT(0xb7b7c4b751d16651), W64LIT(0xebeb20eb600be060),
W64LIT(0x3c3c443cccfdc1cc), W64LIT(0x81819e81bf7cfdbf),
W64LIT(0x9494a194fed440fe), W64LIT(0xf7f704f70ceb1c0c),
W64LIT(0xb9b9d6b967a11867), W64LIT(0x131335135f988b5f),
W64LIT(0x2c2c742c9c7d519c), W64LIT(0xd3d368d3b8d605b8),
W64LIT(0xe7e734e75c6b8c5c), W64LIT(0x6e6eb26ecb5739cb),
W64LIT(0xc4c451c4f36eaaf3), W64LIT(0x030305030f181b0f),
W64LIT(0x5656fa56138adc13), W64LIT(0x4444cc44491a5e49),
W64LIT(0x7f7f817f9edfa09e), W64LIT(0xa9a9e6a937218837),
W64LIT(0x2a2a7e2a824d6782), W64LIT(0xbbbbd0bb6db10a6d),
W64LIT(0xc1c15ec1e24687e2), W64LIT(0x5353f55302a2f102),
W64LIT(0xdcdc79dc8bae728b), W64LIT(0x0b0b1d0b27585327),
W64LIT(0x9d9dba9dd39c01d3), W64LIT(0x6c6cb46cc1472bc1),
W64LIT(0x31315331f595a4f5), W64LIT(0x74749c74b987f3b9),
W64LIT(0xf6f607f609e31509), W64LIT(0x4646ca46430a4c43),
W64LIT(0xacace9ac2609a526), W64LIT(0x89898689973cb597),
W64LIT(0x14143c1444a0b444), W64LIT(0xe1e13ee1425bba42),
W64LIT(0x16163a164eb0a64e), W64LIT(0x3a3a4e3ad2cdf7d2),
W64LIT(0x6969bb69d06f06d0), W64LIT(0x09091b092d48412d),
W64LIT(0x70709070ada7d7ad), W64LIT(0xb6b6c7b654d96f54),
W64LIT(0xd0d06dd0b7ce1eb7), W64LIT(0xeded2aed7e3bd67e),
W64LIT(0xcccc49ccdb2ee2db), W64LIT(0x4242c642572a6857),
W64LIT(0x9898b598c2b42cc2), W64LIT(0xa4a4f1a40e49ed0e),
W64LIT(0x28287828885d7588), W64LIT(0x5c5ce45c31da8631),
W64LIT(0xf8f815f83f936b3f), W64LIT(0x86869786a444c2a4),
};
static const word64 C1[256] = {
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -