2018-08-22 04:40:30 +00:00
|
|
|
// keccak.cpp - modified by Wei Dai from Ronny Van Keer's public domain
|
|
|
|
// sha3-simple.c. All modifications here are placed in the
|
|
|
|
// public domain by Wei Dai.
|
|
|
|
// Keccack core function moved to keccakc.cpp in AUG 2018
|
|
|
|
// by Jeffrey Walton. Separating the core file allows both
|
|
|
|
// SHA3 and Keccack to share the core implementation.
|
2016-09-09 00:24:25 +00:00
|
|
|
|
|
|
|
/*
|
|
|
|
The Keccak sponge function, designed by Guido Bertoni, Joan Daemen,
|
|
|
|
Michael Peeters and Gilles Van Assche. For more information, feedback or
|
|
|
|
questions, please refer to our website: http://keccak.noekeon.org/
|
|
|
|
|
2018-08-22 04:40:30 +00:00
|
|
|
Implementation by Ronny Van Keer, hereby denoted as "the implementer".
|
2016-09-09 00:24:25 +00:00
|
|
|
|
|
|
|
To the extent possible under law, the implementer has waived all copyright
|
|
|
|
and related or neighboring rights to the source code in this file.
|
|
|
|
http://creativecommons.org/publicdomain/zero/1.0/
|
|
|
|
*/
|
|
|
|
|
|
|
|
#include "pch.h"
|
|
|
|
#include "keccak.h"
|
|
|
|
|
|
|
|
NAMESPACE_BEGIN(CryptoPP)
|
|
|
|
|
2019-02-13 00:51:37 +00:00
|
|
|
// The Keccak core function
|
|
|
|
extern void KeccakF1600(word64 *state);
|
|
|
|
|
2016-09-09 00:24:25 +00:00
|
|
|
void Keccak::Update(const byte *input, size_t length)
|
|
|
|
{
|
2018-05-06 02:56:15 +00:00
|
|
|
CRYPTOPP_ASSERT(!(input == NULLPTR && length != 0));
|
|
|
|
if (length == 0) { return; }
|
2016-09-09 00:24:25 +00:00
|
|
|
|
2016-09-22 14:35:57 +00:00
|
|
|
size_t spaceLeft;
|
|
|
|
while (length >= (spaceLeft = r() - m_counter))
|
|
|
|
{
|
|
|
|
if (spaceLeft)
|
|
|
|
xorbuf(m_state.BytePtr() + m_counter, input, spaceLeft);
|
|
|
|
KeccakF1600(m_state);
|
|
|
|
input += spaceLeft;
|
|
|
|
length -= spaceLeft;
|
|
|
|
m_counter = 0;
|
|
|
|
}
|
2016-09-09 00:24:25 +00:00
|
|
|
|
2016-09-22 14:35:57 +00:00
|
|
|
if (length)
|
|
|
|
xorbuf(m_state.BytePtr() + m_counter, input, length);
|
|
|
|
m_counter += (unsigned int)length;
|
2016-09-09 00:24:25 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
void Keccak::Restart()
|
|
|
|
{
|
2023-04-15 20:45:02 +00:00
|
|
|
std::memset(m_state, 0, m_state.SizeInBytes());
|
2016-09-22 14:35:57 +00:00
|
|
|
m_counter = 0;
|
2016-09-09 00:24:25 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
void Keccak::TruncatedFinal(byte *hash, size_t size)
|
|
|
|
{
|
2019-02-13 00:51:37 +00:00
|
|
|
CRYPTOPP_ASSERT(hash != NULLPTR);
|
2016-09-22 14:35:57 +00:00
|
|
|
ThrowIfInvalidTruncatedSize(size);
|
2016-09-09 00:24:25 +00:00
|
|
|
|
2019-02-13 00:51:37 +00:00
|
|
|
m_state.BytePtr()[m_counter] ^= 0x01;
|
2016-09-22 14:35:57 +00:00
|
|
|
m_state.BytePtr()[r()-1] ^= 0x80;
|
|
|
|
KeccakF1600(m_state);
|
2019-02-13 00:51:37 +00:00
|
|
|
std::memcpy(hash, m_state, size);
|
2016-09-22 14:35:57 +00:00
|
|
|
Restart();
|
2016-09-09 00:24:25 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
NAMESPACE_END
|