webmcp

changeset 505:b53dee61a930

Keccak initialization in separate function (to allow for variable size output)
author jbe
date Tue Aug 15 21:00:51 2017 +0200 (2017-08-15)
parents cf948f219056
children 83b3882dc31b
files libraries/moonhash/moonhash_sha3.c
line diff
     1.1 --- a/libraries/moonhash/moonhash_sha3.c	Tue Aug 15 20:47:55 2017 +0200
     1.2 +++ b/libraries/moonhash/moonhash_sha3.c	Tue Aug 15 21:00:51 2017 +0200
     1.3 @@ -40,10 +40,13 @@
     1.4          /*ι*/ FOR(j,7) if (LFSR86540(&R)) XL(0,0,(u64)1<<((1<<j)-1));
     1.5      }
     1.6  }
     1.7 +static void KeccakF1600Init(u8 *s, ui R, const u8 *in, u64 inLen, u8 sfx) {
     1.8 +    /*initialize*/ ui i,b=0; FOR(i,200) s[i]=0;
     1.9 +    /*absorb*/ while(inLen>0) { b=(inLen<R)?inLen:R; FOR(i,b) s[i]^=in[i]; in+=b; inLen-=b; if (b==R) { KeccakF1600(s); b=0; } }
    1.10 +    /*pad*/ s[b]^=sfx; if((sfx&0x80)&&(b==(R-1))) KeccakF1600(s); s[R-1]^=0x80; KeccakF1600(s);
    1.11 +}
    1.12  static void Keccak(ui r, ui c, const u8 *in, u64 inLen, u8 sfx, u8 *out, u64 outLen)
    1.13  {
    1.14 -    /*initialize*/ u8 s[200]; ui R=r/8; ui i,b=0; FOR(i,200) s[i]=0;
    1.15 -    /*absorb*/ while(inLen>0) { b=(inLen<R)?inLen:R; FOR(i,b) s[i]^=in[i]; in+=b; inLen-=b; if (b==R) { KeccakF1600(s); b=0; } }
    1.16 -    /*pad*/ s[b]^=sfx; if((sfx&0x80)&&(b==(R-1))) KeccakF1600(s); s[R-1]^=0x80; KeccakF1600(s);
    1.17 +    /*initialize*/ u8 s[200]; ui R=r/8; ui i,b; KeccakF1600Init(s, R, in, inLen, sfx);
    1.18      /*squeeze*/ while(outLen>0) { b=(outLen<R)?outLen:R; FOR(i,b) out[i]=s[i]; out+=b; outLen-=b; if(outLen>0) KeccakF1600(s); }
    1.19  }

Impressum / About Us