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 }