@@ -171,7 +171,7 @@ int SpongeAbsorb(SpongeInstance *instance, const unsigned char *data, size_t dat
171171 i = 0;
172172 curData = data;
173173while(i < dataByteLen) {
174-if ((instance->byteIOIndex == 0) && (dataByteLen >= (i + rateInBytes))) {
174+if ((instance->byteIOIndex == 0) && (dataByteLen-i >= rateInBytes)) {
175175#ifdef SnP_FastLoop_Absorb
176176/* processing full blocks first */
177177@@ -199,10 +199,10 @@ int SpongeAbsorb(SpongeInstance *instance, const unsigned char *data, size_t dat
199199 }
200200else {
201201/* normal lane: using the message queue */
202-203- partialBlock = (unsigned int)(dataByteLen - i);
204-if (partialBlock+instance->byteIOIndex > rateInBytes)
202+if (dataByteLen-i > rateInBytes-instance->byteIOIndex)
205203 partialBlock = rateInBytes-instance->byteIOIndex;
204+else
205+ partialBlock = (unsigned int)(dataByteLen - i);
206206 #ifdef KeccakReference
207207displayBytes(1, "Block to be absorbed (part)", curData, partialBlock);
208208 #endif
@@ -281,7 +281,7 @@ int SpongeSqueeze(SpongeInstance *instance, unsigned char *data, size_t dataByte
281281 i = 0;
282282 curData = data;
283283while(i < dataByteLen) {
284-if ((instance->byteIOIndex == rateInBytes) && (dataByteLen >= (i + rateInBytes))) {
284+if ((instance->byteIOIndex == rateInBytes) && (dataByteLen-i >= rateInBytes)) {
285285for(j=dataByteLen-i; j>=rateInBytes; j-=rateInBytes) {
286286SnP_Permute(instance->state);
287287SnP_ExtractBytes(instance->state, curData, 0, rateInBytes);
@@ -299,9 +299,10 @@ int SpongeSqueeze(SpongeInstance *instance, unsigned char *data, size_t dataByte
299299SnP_Permute(instance->state);
300300 instance->byteIOIndex = 0;
301301 }
302- partialBlock = (unsigned int)(dataByteLen - i);
303-if (partialBlock+instance->byteIOIndex > rateInBytes)
302+if (dataByteLen-i > rateInBytes-instance->byteIOIndex)
304303 partialBlock = rateInBytes-instance->byteIOIndex;
304+else
305+ partialBlock = (unsigned int)(dataByteLen - i);
305306 i += partialBlock;
306307307308SnP_ExtractBytes(instance->state, curData, instance->byteIOIndex, partialBlock);