From 352083b1d06f73ea571ff4804d4169630e3eab88 Mon Sep 17 00:00:00 2001 From: Jeffrey Walton Date: Thu, 25 Oct 2018 08:24:13 -0400 Subject: [PATCH] Cleanup HC128 and HC256 OperateKeystream --- hc128.cpp | 10 ++++++---- hc256.cpp | 32 ++++++++++++++++++++------------ 2 files changed, 26 insertions(+), 16 deletions(-) diff --git a/hc128.cpp b/hc128.cpp index 682344c5..b734d6e5 100644 --- a/hc128.cpp +++ b/hc128.cpp @@ -200,8 +200,7 @@ void HC128Policy::CipherSetKey(const NameValuePairs ¶ms, const byte *userKey void HC128Policy::OperateKeystream(KeystreamOperation operation, byte *output, const byte *input, size_t iterationCount) { - size_t msglen = GetBytesPerIteration() * iterationCount; - while (msglen >= 64) + while (iterationCount--) { word32 keystream[16]; GenerateKeystream(keystream); @@ -231,9 +230,12 @@ void HC128Policy::OperateKeystream(KeystreamOperation operation, byte *output, c // keystream is written to the output buffer. The optional part is // adding the input buffer and keystream. if ((operation & INPUT_NULL) != INPUT_NULL) - xorbuf(output, input, 64); + { + xorbuf(output, input, BYTES_PER_ITERATION); + input += BYTES_PER_ITERATION; + } - msglen -= 64; input += 64; output += 64; + output += BYTES_PER_ITERATION; } } diff --git a/hc256.cpp b/hc256.cpp index aa64c648..f8ec989f 100644 --- a/hc256.cpp +++ b/hc256.cpp @@ -94,19 +94,27 @@ void HC256Policy::CipherSetKey(const NameValuePairs ¶ms, const byte *userKey void HC256Policy::OperateKeystream(KeystreamOperation operation, byte *output, const byte *input, size_t iterationCount) { - size_t msglen = GetBytesPerIteration() * iterationCount; - byte* out = output; - for (size_t i = 0; i < (msglen >> 2); i++, out += 4) - PutWord(false, LITTLE_ENDIAN_ORDER, out, Generate()); + while (iterationCount--) + { + PutWord(false, LITTLE_ENDIAN_ORDER, output + 0, Generate()); + PutWord(false, LITTLE_ENDIAN_ORDER, output + 4, Generate()); + PutWord(false, LITTLE_ENDIAN_ORDER, output + 8, Generate()); + PutWord(false, LITTLE_ENDIAN_ORDER, output + 12, Generate()); - // If AdditiveCipherTemplate does not have an accumulated keystream - // then it will ask OperateKeystream to generate one. Optionally it - // will ask for an XOR of the input with the keystream while - // writing the result to the output buffer. In all cases the - // keystream is written to the output buffer. The optional part is - // adding the input buffer and keystream. - if ((operation & INPUT_NULL) != INPUT_NULL) - xorbuf(output, input, msglen); + // If AdditiveCipherTemplate does not have an accumulated keystream + // then it will ask OperateKeystream to generate one. Optionally it + // will ask for an XOR of the input with the keystream while + // writing the result to the output buffer. In all cases the + // keystream is written to the output buffer. The optional part is + // adding the input buffer and keystream. + if ((operation & INPUT_NULL) != INPUT_NULL) + { + xorbuf(output, input, BYTES_PER_ITERATION); + input += BYTES_PER_ITERATION; + } + + output += BYTES_PER_ITERATION; + } } void HC256Policy::CipherResynchronize(byte *keystreamBuffer, const byte *iv, size_t length)