28#define FLEXHASH_INTERNAL_SIZE static_cast<size_t>(20)
30FlexHash::FlexHash(
size_t output_octets) : m_Output(output_octets) {}
32void FlexHash::Reset(
void) { sha1_starts(&this->m_Context); }
34void FlexHash::Update(
const void* input,
size_t input_octets) {
35 sha1_update(&this->m_Context,
reinterpret_cast<const unsigned char*
>(input),
39void FlexHash::Finish(
void) {
40 unsigned char output[FLEXHASH_INTERNAL_SIZE];
41 sha1_finish(&this->m_Context, output);
42 if (this->m_Output.size() <= FLEXHASH_INTERNAL_SIZE) {
43 memcpy(&this->m_Output[0], output, this->m_Output.size());
45 memcpy(&this->m_Output[0], output, FLEXHASH_INTERNAL_SIZE);
46 size_t available_octets = FLEXHASH_INTERNAL_SIZE;
47 size_t remaining_octets = this->m_Output.size() - available_octets;
48 while (remaining_octets) {
49 size_t current_octets =
50 ((remaining_octets > FLEXHASH_INTERNAL_SIZE) ? FLEXHASH_INTERNAL_SIZE
52 sha1_starts(&this->m_Context);
53 sha1_update(&this->m_Context,
54 reinterpret_cast<const unsigned char*
>(&this->m_Output[0]),
56 sha1_finish(&this->m_Context, output);
57 memcpy(&this->m_Output[available_octets], output, current_octets);
58 available_octets += FLEXHASH_INTERNAL_SIZE;
59 remaining_octets -= current_octets;
64void FlexHash::Receive(
void* output) {
65 memcpy(output, &this->m_Output[0], this->m_Output.size());
68void FlexHash::Compute(
const void* input,
size_t input_octets,
void* output) {
70 this->Update(input, input_octets);
72 this->Receive(output);
75void FlexHash::Compute(
const void* input,
size_t input_octets,
void* output,
76 size_t output_octets) {
78 hasher.Compute(input, input_octets, output);
81bool FlexHash::Test(
void) {
83 static unsigned char input[] = {
84 0x54, 0x68, 0x65, 0x20, 0x71, 0x75, 0x69, 0x63, 0x6b, 0x20, 0x62,
85 0x72, 0x6f, 0x77, 0x6e, 0x20, 0x66, 0x6f, 0x78, 0x20, 0x6a, 0x75,
86 0x6d, 0x70, 0x73, 0x20, 0x6f, 0x76, 0x65, 0x72, 0x20, 0x74, 0x68,
87 0x65, 0x20, 0x6c, 0x61, 0x7a, 0x79, 0x20, 0x64, 0x6f, 0x67};
89 static unsigned char output_reference[] = {
90 0x2f, 0xd4, 0xe1, 0xc6, 0x7a, 0x2d, 0x28, 0xfc, 0xed, 0x84, 0x9e,
91 0xe1, 0xbb, 0x76, 0xe7, 0x39, 0x1b, 0x93, 0xeb, 0x12, 0xa4, 0xe4,
92 0xd2, 0x6f, 0xd0, 0xc6, 0x45, 0x5e, 0x23, 0xe2, 0x18, 0x7c};
93 char output_current[(
sizeof output_reference)];
94 Compute(input, (
sizeof input), output_current, (
sizeof output_current));
95 return (memcmp(output_current, output_reference, (
sizeof output_reference)) ==
Class for computing hash of arbitrary length.
Hash of arbitrary length.