556 lines
15 KiB
Plaintext
556 lines
15 KiB
Plaintext
/*
|
|
The Keccak sponge function, designed by Guido Bertoni, Joan Daemen,
|
|
Michaël Peeters and Gilles Van Assche. For more information, feedback or
|
|
questions, please refer to our website: http://keccak.noekeon.org/
|
|
|
|
Implementation by Ronny Van Keer,
|
|
hereby denoted as "the implementer".
|
|
|
|
To the extent possible under law, the implementer has waived all copyright
|
|
and related or neighboring rights to the source code in this file.
|
|
http://creativecommons.org/publicdomain/zero/1.0/
|
|
*/
|
|
|
|
static const UINT32 KeccakF1600RoundConstants_int2[2*24] =
|
|
{
|
|
0x00000001UL, 0x00000000UL,
|
|
0x00000000UL, 0x00000089UL,
|
|
0x00000000UL, 0x8000008bUL,
|
|
0x00000000UL, 0x80008080UL,
|
|
0x00000001UL, 0x0000008bUL,
|
|
0x00000001UL, 0x00008000UL,
|
|
0x00000001UL, 0x80008088UL,
|
|
0x00000001UL, 0x80000082UL,
|
|
0x00000000UL, 0x0000000bUL,
|
|
0x00000000UL, 0x0000000aUL,
|
|
0x00000001UL, 0x00008082UL,
|
|
0x00000000UL, 0x00008003UL,
|
|
0x00000001UL, 0x0000808bUL,
|
|
0x00000001UL, 0x8000000bUL,
|
|
0x00000001UL, 0x8000008aUL,
|
|
0x00000001UL, 0x80000081UL,
|
|
0x00000000UL, 0x80000081UL,
|
|
0x00000000UL, 0x80000008UL,
|
|
0x00000000UL, 0x00000083UL,
|
|
0x00000000UL, 0x80008003UL,
|
|
0x00000001UL, 0x80008088UL,
|
|
0x00000000UL, 0x80000088UL,
|
|
0x00000001UL, 0x00008000UL,
|
|
0x00000000UL, 0x80008082UL
|
|
};
|
|
|
|
#undef rounds
|
|
|
|
#define rounds \
|
|
{ \
|
|
UINT32 Da0, De0, Di0, Do0, Du0; \
|
|
UINT32 Da1, De1, Di1, Do1, Du1; \
|
|
UINT32 Ba, Be, Bi, Bo, Bu; \
|
|
UINT32 Aba0, Abe0, Abi0, Abo0, Abu0; \
|
|
UINT32 Aba1, Abe1, Abi1, Abo1, Abu1; \
|
|
UINT32 Aga0, Age0, Agi0, Ago0, Agu0; \
|
|
UINT32 Aga1, Age1, Agi1, Ago1, Agu1; \
|
|
UINT32 Aka0, Ake0, Aki0, Ako0, Aku0; \
|
|
UINT32 Aka1, Ake1, Aki1, Ako1, Aku1; \
|
|
UINT32 Ama0, Ame0, Ami0, Amo0, Amu0; \
|
|
UINT32 Ama1, Ame1, Ami1, Amo1, Amu1; \
|
|
UINT32 Asa0, Ase0, Asi0, Aso0, Asu0; \
|
|
UINT32 Asa1, Ase1, Asi1, Aso1, Asu1; \
|
|
UINT32 Cw, Cx, Cy, Cz; \
|
|
UINT32 Eba0, Ebe0, Ebi0, Ebo0, Ebu0; \
|
|
UINT32 Eba1, Ebe1, Ebi1, Ebo1, Ebu1; \
|
|
UINT32 Ega0, Ege0, Egi0, Ego0, Egu0; \
|
|
UINT32 Ega1, Ege1, Egi1, Ego1, Egu1; \
|
|
UINT32 Eka0, Eke0, Eki0, Eko0, Eku0; \
|
|
UINT32 Eka1, Eke1, Eki1, Eko1, Eku1; \
|
|
UINT32 Ema0, Eme0, Emi0, Emo0, Emu0; \
|
|
UINT32 Ema1, Eme1, Emi1, Emo1, Emu1; \
|
|
UINT32 Esa0, Ese0, Esi0, Eso0, Esu0; \
|
|
UINT32 Esa1, Ese1, Esi1, Eso1, Esu1; \
|
|
const UINT32 * pRoundConstants = KeccakF1600RoundConstants_int2; \
|
|
UINT32 i; \
|
|
\
|
|
copyFromState(A, state) \
|
|
\
|
|
for( i = 12; i != 0; --i ) { \
|
|
Cx = Abu0^Agu0^Aku0^Amu0^Asu0; \
|
|
Du1 = Abe1^Age1^Ake1^Ame1^Ase1; \
|
|
Da0 = Cx^ROL32(Du1, 1); \
|
|
Cz = Abu1^Agu1^Aku1^Amu1^Asu1; \
|
|
Du0 = Abe0^Age0^Ake0^Ame0^Ase0; \
|
|
Da1 = Cz^Du0; \
|
|
\
|
|
Cw = Abi0^Agi0^Aki0^Ami0^Asi0; \
|
|
Do0 = Cw^ROL32(Cz, 1); \
|
|
Cy = Abi1^Agi1^Aki1^Ami1^Asi1; \
|
|
Do1 = Cy^Cx; \
|
|
\
|
|
Cx = Aba0^Aga0^Aka0^Ama0^Asa0; \
|
|
De0 = Cx^ROL32(Cy, 1); \
|
|
Cz = Aba1^Aga1^Aka1^Ama1^Asa1; \
|
|
De1 = Cz^Cw; \
|
|
\
|
|
Cy = Abo1^Ago1^Ako1^Amo1^Aso1; \
|
|
Di0 = Du0^ROL32(Cy, 1); \
|
|
Cw = Abo0^Ago0^Ako0^Amo0^Aso0; \
|
|
Di1 = Du1^Cw; \
|
|
\
|
|
Du0 = Cw^ROL32(Cz, 1); \
|
|
Du1 = Cy^Cx; \
|
|
\
|
|
Aba0 ^= Da0; \
|
|
Ba = Aba0; \
|
|
Age0 ^= De0; \
|
|
Be = ROL32(Age0, 22); \
|
|
Aki1 ^= Di1; \
|
|
Bi = ROL32(Aki1, 22); \
|
|
Amo1 ^= Do1; \
|
|
Bo = ROL32(Amo1, 11); \
|
|
Asu0 ^= Du0; \
|
|
Bu = ROL32(Asu0, 7); \
|
|
Eba0 = Ba ^((~Be)& Bi ) ^ *(pRoundConstants++); \
|
|
Ebe0 = Be ^((~Bi)& Bo ); \
|
|
Ebi0 = Bi ^((~Bo)& Bu ); \
|
|
Ebo0 = Bo ^((~Bu)& Ba ); \
|
|
Ebu0 = Bu ^((~Ba)& Be ); \
|
|
\
|
|
Abo0 ^= Do0; \
|
|
Ba = ROL32(Abo0, 14); \
|
|
Agu0 ^= Du0; \
|
|
Be = ROL32(Agu0, 10); \
|
|
Aka1 ^= Da1; \
|
|
Bi = ROL32(Aka1, 2); \
|
|
Ame1 ^= De1; \
|
|
Bo = ROL32(Ame1, 23); \
|
|
Asi1 ^= Di1; \
|
|
Bu = ROL32(Asi1, 31); \
|
|
Ega0 = Ba ^((~Be)& Bi ); \
|
|
Ege0 = Be ^((~Bi)& Bo ); \
|
|
Egi0 = Bi ^((~Bo)& Bu ); \
|
|
Ego0 = Bo ^((~Bu)& Ba ); \
|
|
Egu0 = Bu ^((~Ba)& Be ); \
|
|
\
|
|
Abe1 ^= De1; \
|
|
Ba = ROL32(Abe1, 1); \
|
|
Agi0 ^= Di0; \
|
|
Be = ROL32(Agi0, 3); \
|
|
Ako1 ^= Do1; \
|
|
Bi = ROL32(Ako1, 13); \
|
|
Amu0 ^= Du0; \
|
|
Bo = ROL32(Amu0, 4); \
|
|
Asa0 ^= Da0; \
|
|
Bu = ROL32(Asa0, 9); \
|
|
Eka0 = Ba ^((~Be)& Bi ); \
|
|
Eke0 = Be ^((~Bi)& Bo ); \
|
|
Eki0 = Bi ^((~Bo)& Bu ); \
|
|
Eko0 = Bo ^((~Bu)& Ba ); \
|
|
Eku0 = Bu ^((~Ba)& Be ); \
|
|
\
|
|
Abu1 ^= Du1; \
|
|
Ba = ROL32(Abu1, 14); \
|
|
Aga0 ^= Da0; \
|
|
Be = ROL32(Aga0, 18); \
|
|
Ake0 ^= De0; \
|
|
Bi = ROL32(Ake0, 5); \
|
|
Ami1 ^= Di1; \
|
|
Bo = ROL32(Ami1, 8); \
|
|
Aso0 ^= Do0; \
|
|
Bu = ROL32(Aso0, 28); \
|
|
Ema0 = Ba ^((~Be)& Bi ); \
|
|
Eme0 = Be ^((~Bi)& Bo ); \
|
|
Emi0 = Bi ^((~Bo)& Bu ); \
|
|
Emo0 = Bo ^((~Bu)& Ba ); \
|
|
Emu0 = Bu ^((~Ba)& Be ); \
|
|
\
|
|
Abi0 ^= Di0; \
|
|
Ba = ROL32(Abi0, 31); \
|
|
Ago1 ^= Do1; \
|
|
Be = ROL32(Ago1, 28); \
|
|
Aku1 ^= Du1; \
|
|
Bi = ROL32(Aku1, 20); \
|
|
Ama1 ^= Da1; \
|
|
Bo = ROL32(Ama1, 21); \
|
|
Ase0 ^= De0; \
|
|
Bu = ROL32(Ase0, 1); \
|
|
Esa0 = Ba ^((~Be)& Bi ); \
|
|
Ese0 = Be ^((~Bi)& Bo ); \
|
|
Esi0 = Bi ^((~Bo)& Bu ); \
|
|
Eso0 = Bo ^((~Bu)& Ba ); \
|
|
Esu0 = Bu ^((~Ba)& Be ); \
|
|
\
|
|
Aba1 ^= Da1; \
|
|
Ba = Aba1; \
|
|
Age1 ^= De1; \
|
|
Be = ROL32(Age1, 22); \
|
|
Aki0 ^= Di0; \
|
|
Bi = ROL32(Aki0, 21); \
|
|
Amo0 ^= Do0; \
|
|
Bo = ROL32(Amo0, 10); \
|
|
Asu1 ^= Du1; \
|
|
Bu = ROL32(Asu1, 7); \
|
|
Eba1 = Ba ^((~Be)& Bi ); \
|
|
Eba1 ^= *(pRoundConstants++); \
|
|
Ebe1 = Be ^((~Bi)& Bo ); \
|
|
Ebi1 = Bi ^((~Bo)& Bu ); \
|
|
Ebo1 = Bo ^((~Bu)& Ba ); \
|
|
Ebu1 = Bu ^((~Ba)& Be ); \
|
|
\
|
|
Abo1 ^= Do1; \
|
|
Ba = ROL32(Abo1, 14); \
|
|
Agu1 ^= Du1; \
|
|
Be = ROL32(Agu1, 10); \
|
|
Aka0 ^= Da0; \
|
|
Bi = ROL32(Aka0, 1); \
|
|
Ame0 ^= De0; \
|
|
Bo = ROL32(Ame0, 22); \
|
|
Asi0 ^= Di0; \
|
|
Bu = ROL32(Asi0, 30); \
|
|
Ega1 = Ba ^((~Be)& Bi ); \
|
|
Ege1 = Be ^((~Bi)& Bo ); \
|
|
Egi1 = Bi ^((~Bo)& Bu ); \
|
|
Ego1 = Bo ^((~Bu)& Ba ); \
|
|
Egu1 = Bu ^((~Ba)& Be ); \
|
|
\
|
|
Abe0 ^= De0; \
|
|
Ba = Abe0; \
|
|
Agi1 ^= Di1; \
|
|
Be = ROL32(Agi1, 3); \
|
|
Ako0 ^= Do0; \
|
|
Bi = ROL32(Ako0, 12); \
|
|
Amu1 ^= Du1; \
|
|
Bo = ROL32(Amu1, 4); \
|
|
Asa1 ^= Da1; \
|
|
Bu = ROL32(Asa1, 9); \
|
|
Eka1 = Ba ^((~Be)& Bi ); \
|
|
Eke1 = Be ^((~Bi)& Bo ); \
|
|
Eki1 = Bi ^((~Bo)& Bu ); \
|
|
Eko1 = Bo ^((~Bu)& Ba ); \
|
|
Eku1 = Bu ^((~Ba)& Be ); \
|
|
\
|
|
Abu0 ^= Du0; \
|
|
Ba = ROL32(Abu0, 13); \
|
|
Aga1 ^= Da1; \
|
|
Be = ROL32(Aga1, 18); \
|
|
Ake1 ^= De1; \
|
|
Bi = ROL32(Ake1, 5); \
|
|
Ami0 ^= Di0; \
|
|
Bo = ROL32(Ami0, 7); \
|
|
Aso1 ^= Do1; \
|
|
Bu = ROL32(Aso1, 28); \
|
|
Ema1 = Ba ^((~Be)& Bi ); \
|
|
Eme1 = Be ^((~Bi)& Bo ); \
|
|
Emi1 = Bi ^((~Bo)& Bu ); \
|
|
Emo1 = Bo ^((~Bu)& Ba ); \
|
|
Emu1 = Bu ^((~Ba)& Be ); \
|
|
\
|
|
Abi1 ^= Di1; \
|
|
Ba = ROL32(Abi1, 31); \
|
|
Ago0 ^= Do0; \
|
|
Be = ROL32(Ago0, 27); \
|
|
Aku0 ^= Du0; \
|
|
Bi = ROL32(Aku0, 19); \
|
|
Ama0 ^= Da0; \
|
|
Bo = ROL32(Ama0, 20); \
|
|
Ase1 ^= De1; \
|
|
Bu = ROL32(Ase1, 1); \
|
|
Esa1 = Ba ^((~Be)& Bi ); \
|
|
Ese1 = Be ^((~Bi)& Bo ); \
|
|
Esi1 = Bi ^((~Bo)& Bu ); \
|
|
Eso1 = Bo ^((~Bu)& Ba ); \
|
|
Esu1 = Bu ^((~Ba)& Be ); \
|
|
\
|
|
Cx = Ebu0^Egu0^Eku0^Emu0^Esu0; \
|
|
Du1 = Ebe1^Ege1^Eke1^Eme1^Ese1; \
|
|
Da0 = Cx^ROL32(Du1, 1); \
|
|
Cz = Ebu1^Egu1^Eku1^Emu1^Esu1; \
|
|
Du0 = Ebe0^Ege0^Eke0^Eme0^Ese0; \
|
|
Da1 = Cz^Du0; \
|
|
\
|
|
Cw = Ebi0^Egi0^Eki0^Emi0^Esi0; \
|
|
Do0 = Cw^ROL32(Cz, 1); \
|
|
Cy = Ebi1^Egi1^Eki1^Emi1^Esi1; \
|
|
Do1 = Cy^Cx; \
|
|
\
|
|
Cx = Eba0^Ega0^Eka0^Ema0^Esa0; \
|
|
De0 = Cx^ROL32(Cy, 1); \
|
|
Cz = Eba1^Ega1^Eka1^Ema1^Esa1; \
|
|
De1 = Cz^Cw; \
|
|
\
|
|
Cy = Ebo1^Ego1^Eko1^Emo1^Eso1; \
|
|
Di0 = Du0^ROL32(Cy, 1); \
|
|
Cw = Ebo0^Ego0^Eko0^Emo0^Eso0; \
|
|
Di1 = Du1^Cw; \
|
|
\
|
|
Du0 = Cw^ROL32(Cz, 1); \
|
|
Du1 = Cy^Cx; \
|
|
\
|
|
Eba0 ^= Da0; \
|
|
Ba = Eba0; \
|
|
Ege0 ^= De0; \
|
|
Be = ROL32(Ege0, 22); \
|
|
Eki1 ^= Di1; \
|
|
Bi = ROL32(Eki1, 22); \
|
|
Emo1 ^= Do1; \
|
|
Bo = ROL32(Emo1, 11); \
|
|
Esu0 ^= Du0; \
|
|
Bu = ROL32(Esu0, 7); \
|
|
Aba0 = Ba ^((~Be)& Bi ); \
|
|
Aba0 ^= *(pRoundConstants++); \
|
|
Abe0 = Be ^((~Bi)& Bo ); \
|
|
Abi0 = Bi ^((~Bo)& Bu ); \
|
|
Abo0 = Bo ^((~Bu)& Ba ); \
|
|
Abu0 = Bu ^((~Ba)& Be ); \
|
|
\
|
|
Ebo0 ^= Do0; \
|
|
Ba = ROL32(Ebo0, 14); \
|
|
Egu0 ^= Du0; \
|
|
Be = ROL32(Egu0, 10); \
|
|
Eka1 ^= Da1; \
|
|
Bi = ROL32(Eka1, 2); \
|
|
Eme1 ^= De1; \
|
|
Bo = ROL32(Eme1, 23); \
|
|
Esi1 ^= Di1; \
|
|
Bu = ROL32(Esi1, 31); \
|
|
Aga0 = Ba ^((~Be)& Bi ); \
|
|
Age0 = Be ^((~Bi)& Bo ); \
|
|
Agi0 = Bi ^((~Bo)& Bu ); \
|
|
Ago0 = Bo ^((~Bu)& Ba ); \
|
|
Agu0 = Bu ^((~Ba)& Be ); \
|
|
\
|
|
Ebe1 ^= De1; \
|
|
Ba = ROL32(Ebe1, 1); \
|
|
Egi0 ^= Di0; \
|
|
Be = ROL32(Egi0, 3); \
|
|
Eko1 ^= Do1; \
|
|
Bi = ROL32(Eko1, 13); \
|
|
Emu0 ^= Du0; \
|
|
Bo = ROL32(Emu0, 4); \
|
|
Esa0 ^= Da0; \
|
|
Bu = ROL32(Esa0, 9); \
|
|
Aka0 = Ba ^((~Be)& Bi ); \
|
|
Ake0 = Be ^((~Bi)& Bo ); \
|
|
Aki0 = Bi ^((~Bo)& Bu ); \
|
|
Ako0 = Bo ^((~Bu)& Ba ); \
|
|
Aku0 = Bu ^((~Ba)& Be ); \
|
|
\
|
|
Ebu1 ^= Du1; \
|
|
Ba = ROL32(Ebu1, 14); \
|
|
Ega0 ^= Da0; \
|
|
Be = ROL32(Ega0, 18); \
|
|
Eke0 ^= De0; \
|
|
Bi = ROL32(Eke0, 5); \
|
|
Emi1 ^= Di1; \
|
|
Bo = ROL32(Emi1, 8); \
|
|
Eso0 ^= Do0; \
|
|
Bu = ROL32(Eso0, 28); \
|
|
Ama0 = Ba ^((~Be)& Bi ); \
|
|
Ame0 = Be ^((~Bi)& Bo ); \
|
|
Ami0 = Bi ^((~Bo)& Bu ); \
|
|
Amo0 = Bo ^((~Bu)& Ba ); \
|
|
Amu0 = Bu ^((~Ba)& Be ); \
|
|
\
|
|
Ebi0 ^= Di0; \
|
|
Ba = ROL32(Ebi0, 31); \
|
|
Ego1 ^= Do1; \
|
|
Be = ROL32(Ego1, 28); \
|
|
Eku1 ^= Du1; \
|
|
Bi = ROL32(Eku1, 20); \
|
|
Ema1 ^= Da1; \
|
|
Bo = ROL32(Ema1, 21); \
|
|
Ese0 ^= De0; \
|
|
Bu = ROL32(Ese0, 1); \
|
|
Asa0 = Ba ^((~Be)& Bi ); \
|
|
Ase0 = Be ^((~Bi)& Bo ); \
|
|
Asi0 = Bi ^((~Bo)& Bu ); \
|
|
Aso0 = Bo ^((~Bu)& Ba ); \
|
|
Asu0 = Bu ^((~Ba)& Be ); \
|
|
\
|
|
Eba1 ^= Da1; \
|
|
Ba = Eba1; \
|
|
Ege1 ^= De1; \
|
|
Be = ROL32(Ege1, 22); \
|
|
Eki0 ^= Di0; \
|
|
Bi = ROL32(Eki0, 21); \
|
|
Emo0 ^= Do0; \
|
|
Bo = ROL32(Emo0, 10); \
|
|
Esu1 ^= Du1; \
|
|
Bu = ROL32(Esu1, 7); \
|
|
Aba1 = Ba ^((~Be)& Bi ); \
|
|
Aba1 ^= *(pRoundConstants++); \
|
|
Abe1 = Be ^((~Bi)& Bo ); \
|
|
Abi1 = Bi ^((~Bo)& Bu ); \
|
|
Abo1 = Bo ^((~Bu)& Ba ); \
|
|
Abu1 = Bu ^((~Ba)& Be ); \
|
|
\
|
|
Ebo1 ^= Do1; \
|
|
Ba = ROL32(Ebo1, 14); \
|
|
Egu1 ^= Du1; \
|
|
Be = ROL32(Egu1, 10); \
|
|
Eka0 ^= Da0; \
|
|
Bi = ROL32(Eka0, 1); \
|
|
Eme0 ^= De0; \
|
|
Bo = ROL32(Eme0, 22); \
|
|
Esi0 ^= Di0; \
|
|
Bu = ROL32(Esi0, 30); \
|
|
Aga1 = Ba ^((~Be)& Bi ); \
|
|
Age1 = Be ^((~Bi)& Bo ); \
|
|
Agi1 = Bi ^((~Bo)& Bu ); \
|
|
Ago1 = Bo ^((~Bu)& Ba ); \
|
|
Agu1 = Bu ^((~Ba)& Be ); \
|
|
\
|
|
Ebe0 ^= De0; \
|
|
Ba = Ebe0; \
|
|
Egi1 ^= Di1; \
|
|
Be = ROL32(Egi1, 3); \
|
|
Eko0 ^= Do0; \
|
|
Bi = ROL32(Eko0, 12); \
|
|
Emu1 ^= Du1; \
|
|
Bo = ROL32(Emu1, 4); \
|
|
Esa1 ^= Da1; \
|
|
Bu = ROL32(Esa1, 9); \
|
|
Aka1 = Ba ^((~Be)& Bi ); \
|
|
Ake1 = Be ^((~Bi)& Bo ); \
|
|
Aki1 = Bi ^((~Bo)& Bu ); \
|
|
Ako1 = Bo ^((~Bu)& Ba ); \
|
|
Aku1 = Bu ^((~Ba)& Be ); \
|
|
\
|
|
Ebu0 ^= Du0; \
|
|
Ba = ROL32(Ebu0, 13); \
|
|
Ega1 ^= Da1; \
|
|
Be = ROL32(Ega1, 18); \
|
|
Eke1 ^= De1; \
|
|
Bi = ROL32(Eke1, 5); \
|
|
Emi0 ^= Di0; \
|
|
Bo = ROL32(Emi0, 7); \
|
|
Eso1 ^= Do1; \
|
|
Bu = ROL32(Eso1, 28); \
|
|
Ama1 = Ba ^((~Be)& Bi ); \
|
|
Ame1 = Be ^((~Bi)& Bo ); \
|
|
Ami1 = Bi ^((~Bo)& Bu ); \
|
|
Amo1 = Bo ^((~Bu)& Ba ); \
|
|
Amu1 = Bu ^((~Ba)& Be ); \
|
|
\
|
|
Ebi1 ^= Di1; \
|
|
Ba = ROL32(Ebi1, 31); \
|
|
Ego0 ^= Do0; \
|
|
Be = ROL32(Ego0, 27); \
|
|
Eku0 ^= Du0; \
|
|
Bi = ROL32(Eku0, 19); \
|
|
Ema0 ^= Da0; \
|
|
Bo = ROL32(Ema0, 20); \
|
|
Ese1 ^= De1; \
|
|
Bu = ROL32(Ese1, 1); \
|
|
Asa1 = Ba ^((~Be)& Bi ); \
|
|
Ase1 = Be ^((~Bi)& Bo ); \
|
|
Asi1 = Bi ^((~Bo)& Bu ); \
|
|
Aso1 = Bo ^((~Bu)& Ba ); \
|
|
Asu1 = Bu ^((~Ba)& Be ); \
|
|
} \
|
|
copyToState(state, A) \
|
|
}
|
|
|
|
#define copyFromState(X, state) \
|
|
X##ba0 = state[ 0]; \
|
|
X##ba1 = state[ 1]; \
|
|
X##be0 = state[ 2]; \
|
|
X##be1 = state[ 3]; \
|
|
X##bi0 = state[ 4]; \
|
|
X##bi1 = state[ 5]; \
|
|
X##bo0 = state[ 6]; \
|
|
X##bo1 = state[ 7]; \
|
|
X##bu0 = state[ 8]; \
|
|
X##bu1 = state[ 9]; \
|
|
X##ga0 = state[10]; \
|
|
X##ga1 = state[11]; \
|
|
X##ge0 = state[12]; \
|
|
X##ge1 = state[13]; \
|
|
X##gi0 = state[14]; \
|
|
X##gi1 = state[15]; \
|
|
X##go0 = state[16]; \
|
|
X##go1 = state[17]; \
|
|
X##gu0 = state[18]; \
|
|
X##gu1 = state[19]; \
|
|
X##ka0 = state[20]; \
|
|
X##ka1 = state[21]; \
|
|
X##ke0 = state[22]; \
|
|
X##ke1 = state[23]; \
|
|
X##ki0 = state[24]; \
|
|
X##ki1 = state[25]; \
|
|
X##ko0 = state[26]; \
|
|
X##ko1 = state[27]; \
|
|
X##ku0 = state[28]; \
|
|
X##ku1 = state[29]; \
|
|
X##ma0 = state[30]; \
|
|
X##ma1 = state[31]; \
|
|
X##me0 = state[32]; \
|
|
X##me1 = state[33]; \
|
|
X##mi0 = state[34]; \
|
|
X##mi1 = state[35]; \
|
|
X##mo0 = state[36]; \
|
|
X##mo1 = state[37]; \
|
|
X##mu0 = state[38]; \
|
|
X##mu1 = state[39]; \
|
|
X##sa0 = state[40]; \
|
|
X##sa1 = state[41]; \
|
|
X##se0 = state[42]; \
|
|
X##se1 = state[43]; \
|
|
X##si0 = state[44]; \
|
|
X##si1 = state[45]; \
|
|
X##so0 = state[46]; \
|
|
X##so1 = state[47]; \
|
|
X##su0 = state[48]; \
|
|
X##su1 = state[49]; \
|
|
|
|
#define copyToState(state, X) \
|
|
state[ 0] = X##ba0; \
|
|
state[ 1] = X##ba1; \
|
|
state[ 2] = X##be0; \
|
|
state[ 3] = X##be1; \
|
|
state[ 4] = X##bi0; \
|
|
state[ 5] = X##bi1; \
|
|
state[ 6] = X##bo0; \
|
|
state[ 7] = X##bo1; \
|
|
state[ 8] = X##bu0; \
|
|
state[ 9] = X##bu1; \
|
|
state[10] = X##ga0; \
|
|
state[11] = X##ga1; \
|
|
state[12] = X##ge0; \
|
|
state[13] = X##ge1; \
|
|
state[14] = X##gi0; \
|
|
state[15] = X##gi1; \
|
|
state[16] = X##go0; \
|
|
state[17] = X##go1; \
|
|
state[18] = X##gu0; \
|
|
state[19] = X##gu1; \
|
|
state[20] = X##ka0; \
|
|
state[21] = X##ka1; \
|
|
state[22] = X##ke0; \
|
|
state[23] = X##ke1; \
|
|
state[24] = X##ki0; \
|
|
state[25] = X##ki1; \
|
|
state[26] = X##ko0; \
|
|
state[27] = X##ko1; \
|
|
state[28] = X##ku0; \
|
|
state[29] = X##ku1; \
|
|
state[30] = X##ma0; \
|
|
state[31] = X##ma1; \
|
|
state[32] = X##me0; \
|
|
state[33] = X##me1; \
|
|
state[34] = X##mi0; \
|
|
state[35] = X##mi1; \
|
|
state[36] = X##mo0; \
|
|
state[37] = X##mo1; \
|
|
state[38] = X##mu0; \
|
|
state[39] = X##mu1; \
|
|
state[40] = X##sa0; \
|
|
state[41] = X##sa1; \
|
|
state[42] = X##se0; \
|
|
state[43] = X##se1; \
|
|
state[44] = X##si0; \
|
|
state[45] = X##si1; \
|
|
state[46] = X##so0; \
|
|
state[47] = X##so1; \
|
|
state[48] = X##su0; \
|
|
state[49] = X##su1; \
|
|
|