libcryfs/vendor/cryptopp/vendor_cryptopp/keccak.cpp

68 lines
2.0 KiB
C++
Raw Normal View History

// 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.
2018-05-19 20:22:51 +02: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/
Implementation by Ronny Van Keer, hereby denoted as "the implementer".
2018-05-19 20:22:51 +02: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-28 01:36:30 +01:00
// The Keccak core function
extern void KeccakF1600(word64 *state);
2018-05-19 20:22:51 +02:00
void Keccak::Update(const byte *input, size_t length)
{
CRYPTOPP_ASSERT(!(input == NULLPTR && length != 0));
if (length == 0) { return; }
2018-05-19 20:22:51 +02: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;
}
if (length)
xorbuf(m_state.BytePtr() + m_counter, input, length);
m_counter += (unsigned int)length;
}
void Keccak::Restart()
{
memset(m_state, 0, m_state.SizeInBytes());
m_counter = 0;
}
void Keccak::TruncatedFinal(byte *hash, size_t size)
{
2019-02-28 01:36:30 +01:00
CRYPTOPP_ASSERT(hash != NULLPTR);
2018-05-19 20:22:51 +02:00
ThrowIfInvalidTruncatedSize(size);
2019-02-28 01:36:30 +01:00
m_state.BytePtr()[m_counter] ^= 0x01;
2018-05-19 20:22:51 +02:00
m_state.BytePtr()[r()-1] ^= 0x80;
KeccakF1600(m_state);
2019-02-28 01:36:30 +01:00
std::memcpy(hash, m_state, size);
2018-05-19 20:22:51 +02:00
Restart();
}
NAMESPACE_END