From 352083b1d06f73ea571ff4804d4169630e3eab88 Mon Sep 17 00:00:00 2001 From: Jeffrey Walton Date: Thu, 25 Oct 2018 08:24:13 -0400 Subject: Cleanup HC128 and HC256 OperateKeystream --- hc256.cpp | 34 +++++++++++++++++++++------------- 1 file changed, 21 insertions(+), 13 deletions(-) (limited to 'hc256.cpp') 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()); - - // 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); + 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, BYTES_PER_ITERATION); + input += BYTES_PER_ITERATION; + } + + output += BYTES_PER_ITERATION; + } } void HC256Policy::CipherResynchronize(byte *keystreamBuffer, const byte *iv, size_t length) -- cgit v1.2.1