Browse Source

sha3_shake_done another be fix

Karel Miko 8 years ago
parent
commit
da8501f55a
1 changed files with 17 additions and 5 deletions
  1. 17 5
      src/hashes/sha3.c

+ 17 - 5
src/hashes/sha3.c

@@ -256,8 +256,11 @@ int sha3_done(hash_state *md, unsigned char *hash)
 
 
 int sha3_shake_done(hash_state *md, unsigned char *out, unsigned long outlen)
 int sha3_shake_done(hash_state *md, unsigned char *out, unsigned long outlen)
 {
 {
-   unsigned long idx = 0;
-   /* sha3_shake_done can be called many times */
+   /* IMPORTANT NOTE: sha3_shake_done can be called many times */
+   unsigned long idx;
+#ifndef ENDIAN_LITTLE
+   unsigned i;
+#endif
 
 
    if (outlen == 0) return CRYPT_OK; /* nothing to do */
    if (outlen == 0) return CRYPT_OK; /* nothing to do */
    LTC_ARGCHK(md  != NULL);
    LTC_ARGCHK(md  != NULL);
@@ -270,7 +273,6 @@ int sha3_shake_done(hash_state *md, unsigned char *out, unsigned long outlen)
       keccakf(md->sha3.s);
       keccakf(md->sha3.s);
 #ifndef ENDIAN_LITTLE
 #ifndef ENDIAN_LITTLE
       {
       {
-         unsigned i;
          for(i = 0; i < SHA3_KECCAK_SPONGE_WORDS; i++) {
          for(i = 0; i < SHA3_KECCAK_SPONGE_WORDS; i++) {
             const ulong32 t1 = (ulong32)(md->sha3.s[i] & CONST64(0xFFFFFFFF));
             const ulong32 t1 = (ulong32)(md->sha3.s[i] & CONST64(0xFFFFFFFF));
             const ulong32 t2 = (ulong32)(md->sha3.s[i] >> 32);
             const ulong32 t2 = (ulong32)(md->sha3.s[i] >> 32);
@@ -283,12 +285,22 @@ int sha3_shake_done(hash_state *md, unsigned char *out, unsigned long outlen)
       md->sha3.xof_flag = 1;
       md->sha3.xof_flag = 1;
    }
    }
 
 
-   while (idx < outlen) {
+   for (idx = 0; idx < outlen; idx++) {
       if(md->sha3.byte_index >= (SHA3_KECCAK_SPONGE_WORDS - md->sha3.capacity_words) * 8) {
       if(md->sha3.byte_index >= (SHA3_KECCAK_SPONGE_WORDS - md->sha3.capacity_words) * 8) {
          keccakf(md->sha3.s);
          keccakf(md->sha3.s);
+#ifndef ENDIAN_LITTLE
+         {
+            for(i = 0; i < SHA3_KECCAK_SPONGE_WORDS; i++) {
+               const ulong32 t1 = (ulong32)(md->sha3.s[i] & CONST64(0xFFFFFFFF));
+               const ulong32 t2 = (ulong32)(md->sha3.s[i] >> 32);
+               STORE32L(t1, md->sha3.sb + i * 8);
+               STORE32L(t2, md->sha3.sb + i * 8 + 4);
+            }
+         }
+#endif
          md->sha3.byte_index = 0;
          md->sha3.byte_index = 0;
       }
       }
-      out[idx++] = md->sha3.sb[md->sha3.byte_index++];
+      out[idx] = md->sha3.sb[md->sha3.byte_index++];
    }
    }
    return CRYPT_OK;
    return CRYPT_OK;
 }
 }