From ce9937b9e423a63705e0a397fbe43245e388c8af Mon Sep 17 00:00:00 2001 From: Peter Date: Sat, 1 Apr 2023 02:31:00 -0600 Subject: [PATCH] theta --- docs/kek/README.md | 97 +++++++++++++++++++++++++++++++++++++++++++++ docs/kek/theta.png | Bin 0 -> 33365 bytes 2 files changed, 97 insertions(+) create mode 100644 docs/kek/theta.png diff --git a/docs/kek/README.md b/docs/kek/README.md index dcb14c3..246e8d3 100644 --- a/docs/kek/README.md +++ b/docs/kek/README.md @@ -590,6 +590,7 @@ inner_keccak(Sponge) -> rounds(Sponge, 24). + -spec rounds(Sponge, NumRoundsLeft) -> ResultSponge when Sponge :: <<_:1600>>, NumRoundsLeft :: non_neg_integer(), @@ -625,6 +626,102 @@ rnd(RoundIdx0, Sponge) -> iota(RoundIdx0, chi(pi(rho(theta(Sponge))))). ``` +The Greek letter steps will often reference "the column to the front" or some +such. The details of this are described in the [coordinate system +section][coord-system]. For now, trust that the function `left/1` correctly +fetches the X-coordinate to our left, and worry about the details later. + +![NIST standard, p.8](./spongeparts.png) + +### Inner Keccak: Theta stage + +Keep [the Greek letter pitfall][greek-letter-pitfall] in mind. + +For each bit in the sponge: + +1. take + + - the bit + - the 5-bit column to the left + - the 5-bit column to the front right + + in **the original array** (beware the [Greek letter pitfall][greek-letter-pitfall]!) + +2. compute the parity of the concatenation; that is, in the concatenated + bitstring + + - if the total number of `1`s is even, the parity is `0` + - if the total number of `1`s is odd, the parity is `1` + +3. set the bit to that parity value from step (2) + +![NIST standard, pp. 12](./theta.png) + +```erlang +%% https://github.com/pharpend/kek/blob/8a8a655a80c26ae32763cc25f1e0df8ab0653c82/kek.erl#L372-L444 + +-spec theta(Array) -> NewArray + when Array :: <<_:1600>>, + NewArray :: <<_:1600>>. +%% @private +%% the theta step +%% go bit by bit, applying a weird transformation to each bit +%% @end + +theta(Array) -> + theta(Array, Array, 0). + + +-spec theta(Array, OldArray, Idx0) -> NewArray + when Array :: <<_:1600>>, + OldArray :: <<_:1600>>, + Idx0 :: 0..1599, + NewArray :: <<_:1600>>. +%% @private +%% the theta step +%% go bit by bit, applying a weird transformation to each bit +%% @end + +% done +theta(ResultArray, _, 1600) -> + ResultArray; +% do the weird permutation +% x = left/right -/+ +% y = down/up -/+ +% z = outOfScreen/intoScreen -/+ +% front/behind -/+ +% left-handed coordinate system but what can you do +theta(ArrayBits, OrigArray, ThisIdx0) -> + <> = ArrayBits, + {xyz, ThisX, _ThisY, ThisZ} = idx0_to_xyz(ThisIdx0), + XToTheLeft = left(ThisX), + XToTheRight = right(ThisX), + ZToTheFront = front(ThisZ), + ColumnToTheLeft = xzth({xz, XToTheLeft, ThisZ}, OrigArray), + ColumnToTheFrontRight = xzth({xz, XToTheRight, ZToTheFront}, OrigArray), + NewBit = parity(<>), + NewBits = <>, + NewIdx0 = ThisIdx0 + 1, + theta(NewBits, OrigArray, NewIdx0). + + +-spec parity(Bits) -> Parity + when Bits :: bitstring(), + Parity :: 0 | 1. +%% @private +%% Count the number of 1s in the given bitstring. Return 0 if even, 1 if odd. +%% @end + +parity(Bits) -> + parity(Bits, 0). + +parity(<<0:1, Rest/bitstring>>, NOnes) -> parity(Rest, NOnes); +parity(<<1:1, Rest/bitstring>>, NOnes) -> parity(Rest, NOnes + 1); +parity(<<>> , NOnes) -> NOnes rem 2. +``` + +[coord-system]: #inner-keccak-coordinate-system +[greek-letter-pitfall]: #pitfall-greek-letter-steps-require-two-copies-of-the-sponge-to-compute [german-lecture]: https://www.youtube.com/watch?v=JWskjzgiIa4 [german-lecture-notes]: https://www.crypto-textbook.com/download/Understanding-Cryptography-Keccak.pdf [nist-standard]: https://nvlpubs.nist.gov/nistpubs/FIPS/NIST.FIPS.202.pdf diff --git a/docs/kek/theta.png b/docs/kek/theta.png new file mode 100644 index 0000000000000000000000000000000000000000..09407cb6847cd72ba196cc16a955233984458b45 GIT binary patch literal 33365 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

om%?aKkMe$hwH`T+iQnmSD^-| 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