From 6abcc709283e9a46f4274645171cc19d9511bb91 Mon Sep 17 00:00:00 2001 From: therealyingtong Date: Tue, 22 Dec 2020 22:23:20 +0800 Subject: [PATCH 01/12] book: Bring in first SHA-256 table spec page from HackMD --- book/src/SUMMARY.md | 3 + book/src/design/gadgets.md | 0 book/src/design/gadgets/sha256.md | 3 + .../gadgets/sha256/bit_reassignment.png | Bin 0 -> 36660 bytes .../src/design/gadgets/sha256/compression.png | Bin 0 -> 42544 bytes .../src/design/gadgets/sha256/low_sigma_0.png | Bin 0 -> 39507 bytes .../src/design/gadgets/sha256/low_sigma_1.png | Bin 0 -> 51433 bytes book/src/design/gadgets/sha256/table16.md | 333 ++++++++++++++++++ .../src/design/gadgets/sha256/upp_sigma_0.png | Bin 0 -> 46020 bytes .../src/design/gadgets/sha256/upp_sigma_1.png | Bin 0 -> 42804 bytes 10 files changed, 339 insertions(+) create mode 100644 book/src/design/gadgets.md create mode 100644 book/src/design/gadgets/sha256.md create mode 100644 book/src/design/gadgets/sha256/bit_reassignment.png create mode 100644 book/src/design/gadgets/sha256/compression.png create mode 100644 book/src/design/gadgets/sha256/low_sigma_0.png create mode 100644 book/src/design/gadgets/sha256/low_sigma_1.png create mode 100644 book/src/design/gadgets/sha256/table16.md create mode 100644 book/src/design/gadgets/sha256/upp_sigma_0.png create mode 100644 book/src/design/gadgets/sha256/upp_sigma_1.png diff --git a/book/src/SUMMARY.md b/book/src/SUMMARY.md index 1bee6b2..d42d24a 100644 --- a/book/src/SUMMARY.md +++ b/book/src/SUMMARY.md @@ -11,3 +11,6 @@ - [Design](design.md) - [Permutation argument](design/permutation.md) - [Lookup argument](design/lookup-argument.md) + - [Gadgets](design/gadgets.md) + - [SHA-256](design/gadgets/sha256.md) + - [Chip using a 16-bit lookup table](design/gadgets/sha256/table16.md) diff --git a/book/src/design/gadgets.md b/book/src/design/gadgets.md new file mode 100644 index 0000000..e69de29 diff --git a/book/src/design/gadgets/sha256.md b/book/src/design/gadgets/sha256.md new file mode 100644 index 0000000..814ea45 --- /dev/null +++ b/book/src/design/gadgets/sha256.md @@ -0,0 +1,3 @@ +# SHA-256 + +halo2 provides a SHA-256 gadget `halo2::gadget::sha256::Sha256` which... diff --git a/book/src/design/gadgets/sha256/bit_reassignment.png b/book/src/design/gadgets/sha256/bit_reassignment.png new file mode 100644 index 0000000000000000000000000000000000000000..faf495c7770c8392bfbfb3887ed3946de245a0bb GIT binary patch literal 36660 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 literal 0 HcmV?d00001 diff --git a/book/src/design/gadgets/sha256/compression.png b/book/src/design/gadgets/sha256/compression.png new file mode 100644 index 0000000000000000000000000000000000000000..fc0c4a39090f502ab3855eb2f54b669d5af45435 GIT binary patch literal 42544 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 ddT>23mo_GqE^6LyTidz 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 z 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 Note: by "even" bits we mean the bits of weight an even-power of $2$, i.e. of weight +> $2^0, 2^2, \ldots$. Similarly by "odd" bits we mean the bits of weight an odd-power of +> $2$. + +### Ch function +> TODO: can probably be optimised to $4$ or $5$ lookups using an additional table. +> +$Ch$ can be done in $8$ lookups: $4\; \mathtt{spread} * 2$ chunks + +- As mentioned above, after the first round we already have $E$ in spread form $E'$. + Similarly, $F$ and $G$ are equal to the $E$ and $F$ respectively of the previous round, + and therefore in the steady state we already have them in spread form $F'$ and $G'$. In + fact we can also assume we have them in spread form in the first round, either from the + fixed IV or from the use of $\mathtt{spread}$ to reduce the output of the feedforward in + the previous block. +- Calculate $P' = E' + F'$ and $Q' = (evens - E') + G'$, where $evens = \mathtt{spread}(2^{32} - 1)$. + - We can add them as $32$-bit words or in pieces; it's equivalent. + - $evens - E'$ works to compute the spread of $¬E$ even though negation and + $\mathtt{spread}$ do not commute in general. It works because each spread bit in $E'$ + is subtracted from $1$, so there are no borrows. +- Witness $P^{even}_i, P^{odd}_i, Q^{even}_i, Q^{odd}_i$ such that + $P' = \mathtt{spread}(P^{even}_0) + 2 \cdot \mathtt{spread}(P^{odd}_0) + 2^{32} \cdot \mathtt{spread}(P^{even}_1) + 2^{33} \cdot \mathtt{spread}(P^{odd}_1)$, and similarly for $Q'$. +- $\{P^{odd}_i + Q^{odd}_i\}_{i=0..1}$ is the $Ch$ function output. + +### Σ_0 function + +$\Sigma_0(A)$ can be done in $6$ lookups. + +To achieve this we first split $A$ into pieces $(a, b, c, d)$, of lengths $(2, 11, 9, 10)$ +bits respectively counting from the little end. At the same time we obtain the spread +forms of these pieces. This can all be done in two PLONK rows, because the $10$ and +$11$-bit pieces can be handled using $\mathtt{spread}$ lookups, and the $9$-bit piece can +be split into $3 * 3$-bit subpieces. The latter and the remaining $2$-bit piece can be +range-checked by polynomial constraints in parallel with the two lookups, two small pieces +in each row. The spread forms of these small pieces are found by interpolation. + +Note that the splitting into pieces can be combined with the reduction of $A_{new}$, i.e. +no extra lookups are needed for the latter. In the last round we reduce $A_{new}$ after +adding the feedforward (requiring a carry of $\{0, \ldots, 7\}$ which is fine). + +$(A ⋙ 2) \oplus (A ⋙ 13) \oplus (A ⋙ 22)$ is equivalent to +$(A ⋙ 2) \oplus (A ⋙ 13) \oplus (A ⋘ 10)$: + +![](./upp_sigma_0.png) + +Then, using $4$ more $\mathtt{spread}$ lookups we obtain the result as the even bits of a +linear combination of the pieces: + +$$ +\begin{array}{rcccccccl} + & (a &||& d &||& c &||& b) & \oplus \\ + & (b &||& a &||& d &||& c) & \oplus \\ + & (c &||& b &||& a &||& d) & \\ +&&&&\Downarrow \\ +R' = & 4^{30} a &+& 4^{20} d &+& 4^{11} c &+& b\;&+ \\ + & 4^{21} b &+& 4^{19} a &+& 4^{ 9} d &+& c\;&+ \\ + & 4^{23} c &+& 4^{12} b &+& 4^{10} a &+& d\;& +\end{array} +$$ + +That is, we witness the compressed even bits $R^{even}_i$ and the compressed odd bits +$R^{odd}_i$, and constrain +$$R' = \mathtt{spread}(R^{even}_0) + 2 \cdot \mathtt{spread}(R^{odd}_0) + 2^{32} \cdot \mathtt{spread}(R^{even}_1) + 2^{33} \cdot \mathtt{spread}(R^{odd}_1)$$ +where $\{R^{even}_i\}_{i=0..1}$ is the $\Sigma_0$ function output. + +### Σ_1 function + +$\Sigma_1(E)$ can be done in $6$ lookups. + +To achieve this we first split $E$ into pieces $(a, b, c, d)$, of lengths $(6, 5, 14, 7)$ +bits respectively counting from the little end. At the same time we obtain the spread +forms of these pieces. This can all be done in two PLONK rows, because the $7$ and +$14$-bit pieces can be handled using $\mathtt{spread}$ lookups, the $5$-bit piece can be +split into $3$ and $2$-bit subpieces, and the $6$-bit piece can be split into $2 * 3$-bit +subpieces. The four small pieces can be range-checked by polynomial constraints in +parallel with the two lookups, two small pieces in each row. The spread forms of these +small pieces are found by interpolation. + +Note that the splitting into pieces can be combined with the reduction of $E_{new}$, i.e. +no extra lookups are needed for the latter. In the last round we reduce $E_{new}$ after +adding the feedforward (requiring a carry of $\{0, \ldots, 6\}$ which is fine). + +$(E ⋙ 6) \oplus (E ⋙ 11) \oplus (E ⋙ 25)$ is equivalent to +$(E ⋙ 6) \oplus (E ⋙ 11) \oplus (E ⋘ 7)$. + +![](./upp_sigma_1.png) + +Then, using $4$ more $\mathtt{spread}$ lookups we obtain the result as the even bits of a +linear combination of the pieces, in the same way we did for $\Sigma_0$: + +$$ +\begin{array}{rcccccccl} + & (a &||& d &||& c &||& b) & \oplus \\ + & (b &||& a &||& d &||& c) & \oplus \\ + & (c &||& b &||& a &||& d) & \\ +&&&&\Downarrow \\ +R' = & 4^{26} a &+& 4^{19} d &+& 4^{ 5} c &+& b\;&+ \\ + & 4^{27} b &+& 4^{21} a &+& 4^{14} d &+& c\;&+ \\ + & 4^{18} c &+& 4^{13} b &+& 4^{ 7} a &+& d\;& +\end{array} +$$ + +That is, we witness the compressed even bits $R^{even}_i$ and the compressed odd bits +$R^{odd}_i$, and constrain +$$R' = \mathtt{spread}(R^{even}_0) + 2 \cdot \mathtt{spread}(R^{odd}_0) + 2^{32} \cdot \mathtt{spread}(R^{even}_1) + 2^{33} \cdot \mathtt{spread}(R^{odd}_1)$$ +where $\{R^{even}_i\}_{i=0..1}$ is the $\Sigma_1$ function output. + +## Block decomposition + +For each block $M \in \{0,1\}^{512}$ of the padded message, $64$ words of $32$ bits each +are constructed as follows: +- The first $16$ are obtained by splitting $M$ into $32$-bit blocks $$M = W_1 || W_2 || \cdots || W_{15} || W_{16};$$ +- The remaining $48$ words are constructed using the formula: +$$W_i = \sigma_1(W_{i-2}) \boxplus W_{i-7} \boxplus \sigma_0(W_{i-15}) \boxplus W_{i-16},$$ for $i = 17, \ldots, 64$. + +> Note: $1$-based numbering is used for the $W$ word indices. + +$$ +\begin{array}{ccc} +\sigma_0(X) &=& (X ⋙ 7) \oplus (X ⋙ 18) \oplus (X ≫ 3) \\ +\sigma_1(X) &=& (X ⋙ 17) \oplus (X ⋙ 19) \oplus (X ≫ 10) \\ +\end{array} +$$ + +> Note: $≫$ is a right-**shift**, not a rotation. + +### σ_0 function + +$(X ⋙ 7) \oplus (X ⋙ 18) \oplus (X ≫ 3)$ is equivalent to +$(X ⋙ 7) \oplus (X ⋘ 14) \oplus (X ≫ 3)$. + +![](./low_sigma_0.png) + +As above but with pieces $(a, b, c, d)$ of lengths $(3, 4, 11, 14)$ counting from the +little end. Split $b$ into two $2$-bit subpieces. + +$$ +\begin{array}{rcccccccl} + & (0^{[3]} &||& d &||& c &||& b) & \oplus \\ + & (\;\;\;b &||& a &||& d &||& c) & \oplus \\ + & (\;\;\;c &||& b &||& a &||& d) & \\ +&&&&\Downarrow \\ +R' = & & & 4^{15} d &+& 4^{ 4} c &+& b\;&+ \\ + & 4^{28} b &+& 4^{25} a &+& 4^{11} d &+& c\;&+ \\ + & 4^{21} c &+& 4^{17} b &+& 4^{14} a &+& d\;& +\end{array} +$$ + +### σ_1 function + +$(X ⋙ 17) \oplus (X ⋙ 19) \oplus (X ≫ 10)$ is equivalent to +$(X ⋘ 15) \oplus (X ⋘ 13) \oplus (X ≫ 10)$. + +![](./low_sigma_1.png) + +TODO: this diagram doesn't match the expression on the right. This is just for consistency +with the other diagrams. + +As above but with pieces $(a, b, c, d)$ of lengths $(10, 7, 2, 13)$ counting from the +little end. Split $b$ into $(3, 2, 2)$-bit subpieces. + +$$ +\begin{array}{rcccccccl} + & (0^{[10]}&||& d &||& c &||& b) & \oplus \\ + & (\;\;\;b &||& a &||& d &||& c) & \oplus \\ + & (\;\;\;c &||& b &||& a &||& d) & \\ +&&&&\Downarrow \\ +R' = & & & 4^{ 9} d &+& 4^{ 7} c &+& b\;&+ \\ + & 4^{25} b &+& 4^{15} a &+& 4^{ 2} d &+& c\;&+ \\ + & 4^{30} c &+& 4^{23} b &+& 4^{13} a &+& d\;& +\end{array} +$$ + +### Message scheduling + +We apply $\sigma_0$ to $W_{2..49}$, and $\sigma_1$ to $W_{15..62}$. In order to avoid +redundant applications of $\mathtt{spread}$, we can merge the splitting into pieces for +$\sigma_0$ and $\sigma_1$ in the case of $W_{15..49}$. Merging the piece lengths +$(3, 4, 11, 14)$ and $(10, 7, 2, 13)$ gives pieces of lengths $(3, 4, 3, 7, 1, 1, 13)$. + +![](./bit_reassignment.png) + +If we can do the merged split in $3$ rows (as opposed to a total of $4$ rows when +splitting for $\sigma_0$ and $\sigma_1$ separately), we save $35$ rows. + +> These might even be doable in $2$ rows; not sure. +> [name=Daira] + +We can merge the reduction mod $2^{32}$ of $W_{17..62}$ into their splitting when they are +used to compute subsequent words, similarly to what we did for $A$ and $E$ in the round +function. + +We will still need to reduce $W_{63..64}$ since they are not split. (Technically we could +leave them unreduced since they will be reduced later when they are used to compute +$A_{new}$ and $E_{new}$ -- but that would require handling a carry of up to $10$ rather +than $6$, so it's not worth the complexity.) + +The resulting message schedule cost is: +- $2$ rows to constrain $W_1$ to $32$ bits + - This is technically optional, but let's do it for robustness, since the rest of the + input is constrained for free. +- $13*2$ rows to split $W_{2..14}$ into $(3, 4, 11, 14)$-bit pieces +- $35*3$ rows to split $W_{15..49}$ into $(3, 4, 3, 7, 1, 1, 13)$-bit pieces (merged with + a reduction for $W_{17..49}$) +- $13*2$ rows to split $W_{50..62}$ into $(10, 7, 2, 13)$-bit pieces (merged with a + reduction) +- $4*48$ rows to extract the results of $\sigma_0$ for $W_{2..49}$ +- $4*48$ rows to extract the results of $\sigma_1$ for $W_{15..62}$ +- $2*2$ rows to reduce $W_{63..64}$ +- $= 547$ rows. + +## Overall cost + +For each round: +- $8$ rows for $Ch$ +- $4$ rows for $Maj$ +- $6$ rows for $\Sigma_0$ +- $6$ rows for $\Sigma_1$ +- $reduce_6$ and $reduce_7$ are always free +- $= 24$ per round + +This gives $24*64 = 1792$ rows for all of "step 3", to which we need to add: + +- $547$ rows for message scheduling +- $2*8$ rows for $8$ reductions mod $2^{32}$ in "step 4" + +giving a total of $2099$ rows. + +## Tables + +We only require one table $\mathtt{spread}$, with $2^{16}$ rows and $3$ columns. We need a +tag column to allow selecting $(7, 10, 11, 13, 14)$-bit subsets of the table for +$\Sigma_{0..1}$ and $\sigma_{0..1}$. + +### `spread` table + +| row | tag | table (16b) | spread (32b) | +|--------------|-----|------------------|----------------------------------| +| $0$ | 0 | 0000000000000000 | 00000000000000000000000000000000 | +| $1$ | 0 | 0000000000000001 | 00000000000000000000000000000001 | +| $2$ | 0 | 0000000000000010 | 00000000000000000000000000000100 | +| $3$ | 0 | 0000000000000011 | 00000000000000000000000000000101 | +| ... | 0 | ... | ... | +| $2^{7} - 1$ | 0 | 0000000001111111 | 00000000000000000001010101010101 | +| $2^{7}$ | 1 | 0000000010000000 | 00000000000000000100000000000000 | +| ... | 1 | ... | ... | +| $2^{10} - 1$ | 1 | 0000001111111111 | 00000000000001010101010101010101 | +| ... | 2 | ... | ... | +| $2^{11} - 1$ | 2 | 0000011111111111 | 00000000010101010101010101010101 | +| ... | 3 | ... | ... | +| $2^{13} - 1$ | 3 | 0001111111111111 | 00000001010101010101010101010101 | +| ... | 4 | ... | ... | +| $2^{14} - 1$ | 4 | 0011111111111111 | 00000101010101010101010101010101 | +| ... | 5 | ... | ... | +| $2^{16} - 1$ | 5 | 1111111111111111 | 01010101010101010101010101010101 | + +For example, to do an $11$-bit $\mathtt{spread}$ lookup, we polynomial-constrain the tag +to be in $\{0, 1, 2\}$. For the most common case of a $16$-bit lookup, we don't need to +constrain the tag. Note that we can fill any unused rows beyond $2^{16}$ with a duplicate +entry, e.g. all-zeroes. diff --git a/book/src/design/gadgets/sha256/upp_sigma_0.png b/book/src/design/gadgets/sha256/upp_sigma_0.png new file mode 100644 index 0000000000000000000000000000000000000000..f509e5d58d86ae3e0c382f4a93816cac9a46a3c1 GIT binary patch literal 46020 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 literal 0 HcmV?d00001 diff --git a/book/src/design/gadgets/sha256/upp_sigma_1.png b/book/src/design/gadgets/sha256/upp_sigma_1.png new file mode 100644 index 0000000000000000000000000000000000000000..6f80dc710c469ff2e4c0cfd2119950acb23fa54d GIT binary patch literal 42804 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 Mz#cU%F+LgjcOu=$fdBvi literal 0 HcmV?d00001 From fc4497ac7cb376afa1d9923ff63cf8081c3cf171 Mon Sep 17 00:00:00 2001 From: therealyingtong Date: Tue, 22 Dec 2020 23:09:36 +0800 Subject: [PATCH 02/12] book: Bring in second SHA-256 table spec page from HackMD --- book/src/design/gadgets/sha256/table16.md | 553 ++++++++++++++++++++++ 1 file changed, 553 insertions(+) diff --git a/book/src/design/gadgets/sha256/table16.md b/book/src/design/gadgets/sha256/table16.md index 98df6d3..faffc93 100644 --- a/book/src/design/gadgets/sha256/table16.md +++ b/book/src/design/gadgets/sha256/table16.md @@ -331,3 +331,556 @@ For example, to do an $11$-bit $\mathtt{spread}$ lookup, we polynomial-constrain to be in $\{0, 1, 2\}$. For the most common case of a $16$-bit lookup, we don't need to constrain the tag. Note that we can fill any unused rows beyond $2^{16}$ with a duplicate entry, e.g. all-zeroes. + +## Gates + +### Choice gate +Input from previous operations: +- $E', F', G',$ 64-bit spread forms of 32-bit words $E, F, G$, assumed to be constrained by previous operations + - in practice, we'll have the spread forms of $E', F', G'$ after they've been decomposed into 16-bit subpieces +- $evens$ is defined as $\mathtt{spread}(2^{32} - 1)$ + - $evens_0 = evens_1 = \mathtt{spread}(2^{16} - 1)$ + +sn|sc| $a_0$ | $a_1$ | $a_2$ | $a_3$ | $a_4$ | +--|--|-------------|-------------|-----------------------------|------------------------------------|------------------------------------| +0 |0 |{0,1,2,3,4,5}|$P_0^{even}$ |$\texttt{spread}(P_0^{even})$| $\mathtt{spread}(E^{lo})$ | $\mathtt{spread}(E^{hi})$ | +0 |1 |{0,1,2,3,4,5}|$P_0^{odd}$ |$\texttt{spread}(P_0^{odd})$ |$\texttt{spread}(P_1^{odd})$ | | +0 |0 |{0,1,2,3,4,5}|$P_1^{even}$ |$\texttt{spread}(P_1^{even})$| $\mathtt{spread}(F^{lo})$ | $\mathtt{spread}(F^{hi})$ | +0 |0 |{0,1,2,3,4,5}|$P_1^{odd}$ |$\texttt{spread}(P_1^{odd})$ | $evens_0$ | $evens_1$ | +1 |0 |{0,1,2,3,4,5}|$Q_0^{even}$ |$\texttt{spread}(Q_0^{even})$|$\mathtt{spread}(E^{lo})$ | $\mathtt{spread}(E^{hi})$ | +0 |0 |{0,1,2,3,4,5}|$Q_0^{odd}$ |$\texttt{spread}(Q_0^{odd})$ |$evens_0 - \mathtt{spread}(E^{lo})$ |$evens_1 - \mathtt{spread}(E^{hi})$ | +0 |1 |{0,1,2,3,4,5}|$Q_1^{even}$ |$\texttt{spread}(Q_1^{even})$|$\texttt{spread}(Q_1^{odd})$ | | +0 |0 |{0,1,2,3,4,5}|$Q_1^{odd}$ |$\texttt{spread}(Q_1^{odd})$ |$\mathtt{spread}(G^{lo})$ | $\mathtt{spread}(G^{hi})$ | + +Constraints: +- `sc` (choice): $LHS - RHS = 0$ + - $LHS = a_3 \omega^{-1} + a_3 \omega + 2^{32}(a_4 \omega^{-1} + a_4 \omega)$ + - $RHS = a_2 \omega^{-1} + 2* a_2 + 2^{32}(a_2 \omega + 2* a_3)$ +- `sn` (negation): + - $a_3\omega^{-1} - a_3 - a_3\omega = 0$ + - $a_4\omega^{-1} - a_4 - a_4\omega = 0$ +- $\mathtt{spread}$ lookup on $(a_0, a_1, a_2)$ +- permutation between $(a_2, a_3)$ + +Output: $Ch(E, F, G) = P^{odd} + Q^{odd} = (P_0^{odd} + Q_0^{odd}) + 2^{16} (P_1^{odd} + Q_1^{odd})$ + +### Majority gate + +Input from previous operations: +- $A', B', C',$ 64-bit spread forms of 32-bit words $A, B, C$, assumed to be constrained by previous operations + - in practice, we'll have the spread forms of $A', B', C'$ after they've been decomposed into $16$-bit subpieces + +sm| $a_0$ | $a_1$ | $a_2$ | $a_3$ | $a_4$ | $a_5$ | +--|-------------|------------|-----------------------------|----------------------------|--------------------------|--------------------------| +0 |{0,1,2,3,4,5}|$M_0^{even}$|$\texttt{spread}(M_0^{even})$| |$\mathtt{spread}(A^{lo})$ |$\mathtt{spread}(A^{hi})$ | +1 |{0,1,2,3,4,5}|$M_0^{odd}$ |$\texttt{spread}(M_0^{odd})$ |$\texttt{spread}(M_1^{odd})$|$\mathtt{spread}(B^{lo})$ |$\mathtt{spread}(B^{hi})$ | +0 |{0,1,2,3,4,5}|$M_1^{even}$|$\texttt{spread}(M_1^{even})$| |$\mathtt{spread}(C^{lo})$ |$\mathtt{spread}(C^{hi})$ | +0 |{0,1,2,3,4,5}|$M_1^{odd}$ |$\texttt{spread}(M_1^{odd})$ | | | | + +Constraints: +- `sm` (majority): $LHS - RHS = 0$ + - $LHS = \mathtt{spread}(M^{even}_0) + 2 \cdot \mathtt{spread}(M^{odd}_0) + 2^{32} \cdot \mathtt{spread}(M^{even}_1) + 2^{33} \cdot \mathtt{spread}(M^{odd}_1)$ + - $RHS = A' + B' + C'$ +- $\mathtt{spread}$ lookup on $(a_0, a_1, a_2)$ +- permutation between $(a_2, a_3)$ + +Output: $Maj(A,B,C) = M^{odd} = M_0^{odd} + 2^{16} M_1^{odd}$ + +### Σ_0 gate + +$A$ is a 32-bit word split into $(2,11,9,10)$-bit chunks, starting from the little end. We refer to these chunks as $(a,b,c,d)$ respectively, and further split $c$ into three 3-bit chunks $c_0, c_1, c_2$. $a'$ and $\{c'_i\}_{i=0}^2$ are the spread versions of the small chunks. + +$$ +\begin{array}{ccc} +\Sigma_0(A) &=& (A ⋙ 2) \oplus (A ⋙ 13) \oplus (A ⋙ 22) \\ +&=& (A ⋙ 2) \oplus (A ⋙ 13) \oplus (A ⋘ 10) +\end{array} +$$ + +ss|s23|s33| $a_0$ | $a_1$ | $a_2$ | $a_3$ | $a_4$ | $a_5$ | $a_6$ | +--|---|---|-------------|------------|-----------------------------|------------|------------|------------|------------| +0 | 1 | 0 | {0,1} | $d$ | $\texttt{spread}(d)$ | $a$ | $a'$ | $c_0$ | $c'_0$ | +1 | 0 | 0 |{0,1,2,3,4,5}|$R_0^{even}$|$\texttt{spread}(R_0^{even})$| $A$ | $\texttt{spread}(R_0^{odd})$|$\texttt{spread}(R_1^{even})$| $\texttt{spread}(R_1^{odd})$| +0 | 0 | 1 | {0,1,2} | $b$ | $\texttt{spread}(b)$ | $c_1$ | $c'_1$ | $c_2$ | $c'_2$ | +0 | 0 | 0 |{0,1,2,3,4,5}|$R_0^{odd}$ |$\texttt{spread}(R_0^{odd})$ | | | | | +0 | 0 | 0 |{0,1,2,3,4,5}|$R_1^{even}$|$\texttt{spread}(R_1^{even})$| | | | | +0 | 0 | 0 |{0,1,2,3,4,5}|$R_1^{odd}$ |$\texttt{spread}(R_1^{odd})$ | | | | | + +Constraints: +- `ss` ($\Sigma_0$ constraint): $LHS - RHS + tag + decompose = 0$ + +$$ +\begin{array}{ccc} +tag &=& constrain_1(a_0\omega^{-1}) + constrain_2(a_0\omega) \\ +decompose &=& a + 2^2 b + 2^{13} c_0 + 2^{16} c_1 + 2^{19} c_2 + 2^{22} d- A\\ +LHS &=& \mathtt{spread}(R^{even}_0) + 2 \cdot \mathtt{spread}(R^{odd}_0) + 2^{32} \cdot \mathtt{spread}(R^{even}_1) + 2^{33} \cdot \mathtt{spread}(R^{odd}_1) +\end{array} +$$ +$$ +\begin{array}{rcccccccccl} +RHS = & 4^{30} a' &+& 4^{20} \texttt{spread}(d) &+& 4^{17} c'_2 &+& 4^{14} c'_1 &+& 4^{11} c'_0 &+& \texttt{spread}(b)\;&+ \\ + & 4^{21} \texttt{spread}(b) &+& 4^{19} a' &+& 4^{9} \texttt{spread}(d) &+& 4^{6} c'_2 &+& 4^{3} c'_1 &+& c'_0\;&+ \\ + & 4^{29} c'_2 &+& 4^{26} c'_1 &+& 4^{23} c'_0 &+& 4^{12} \texttt{spread}(b) &+& 4^{10} a' &+& \texttt{spread}(d)\;& +\end{array} +$$ + +- $\mathtt{spread}$ lookup on $a_0, a_1, a_2$ +- `s22`: + - `sr2` and `sr2` (two 2-bit range checks) + - `ss2` and `ss2` (two 2-bit spreads) +- `s23`: + - `sr2` (2-bit range check) and `sr3` (3-bit range check) + - `ss2` (2-bit spread) and `ss3` (3-bit spread) +(see section [Helper gates](#Helper-gates)) + +Output: $\Sigma_0(A) = R^{even} = R_0^{even} + 2^{16} R_1^{even}$ + +### Σ_1 gate +$E$ is a 32-bit word split into $(6,5,14,7)$-bit chunks, starting from the little end. We refer to these chunks as $(a,b,c,d)$ respectively, and further split $a$ into two 3-bit chunks $a_0, a_1$ and $b$ into (2,3)-bit chunks $b_0, b_1$. $\{a'_i\}_{i=0}^1,\{b'_j\}_{j=0}^1$ are the spread versions of the small chunks. + +$$ +\begin{array}{ccc} +\Sigma_1(E) &=& (E ⋙ 6) \oplus (E ⋙ 11) \oplus (E ⋙ 25) \\ +&=& (E ⋙ 6) \oplus (E ⋙ 11) \oplus (E ⋘ 7) +\end{array} +$$ + +ss|s23|s33| $a_0$ | $a_1$ | $a_2$ | $a_3$ | $a_4$ | $a_5$ | $a_6$ | +--|---|---|-------------|------------|-----------------------------|------------|------------|------------|------------| +0 | 1 | 0 | 0 | $d$ | $\texttt{spread}(d)$ | $b_0$ | $b'_0$ | $b_1$ | $b'_1$ | +1 | 0 | 0 |{0,1,2,3,4,5}|$R_0^{even}$|$\texttt{spread}(R_0^{even})$| $E$ | $\texttt{spread}(R_0^{odd})$|$\texttt{spread}(R_1^{even})$| $\texttt{spread}(R_1^{odd})$| +0 | 0 | 1 | {0,1,2,3,4} | $c$ | $\texttt{spread}(c)$ | $a_0$ | $a'_0$ | $a_1$ | $a'_1$ | +0 | 0 | 0 |{0,1,2,3,4,5}|$R_0^{odd}$ |$\texttt{spread}(R_0^{odd})$ | | | | | +0 | 0 | 0 |{0,1,2,3,4,5}|$R_1^{even}$|$\texttt{spread}(R_1^{even})$| | | | | +0 | 0 | 0 |{0,1,2,3,4,5}|$R_1^{odd}$ |$\texttt{spread}(R_1^{odd})$ | | | | | + +Constraints: +- `ss` ($\Sigma_1$ constraint): $LHS - RHS + tag + decompose = 0$ + +$$ +\begin{array}{ccc} +tag &=& a_0\omega^{-1} + constrain_4(a_0\omega) \\ +decompose &=& a_0 + 2^3 a_1 + 2^6 b_0 + 2^8 b_1 + 2^{11} c + 2^{25} d - E \\ +LHS &=& \mathtt{spread}(R^{even}_0) + 2 \cdot \mathtt{spread}(R^{odd}_0) + 2^{32} \cdot \mathtt{spread}(R^{even}_1) + 2^{33} \cdot \mathtt{spread}(R^{odd}_1) +\end{array} +$$ +$$ +\begin{array}{rcccccccccl} +RHS = & 4^{29} a'_1 &+& 4^{26} a'_0 &+& 4^{19} \texttt{spread}(d) &+& 4^{ 5} \texttt{spread}(c) &+& 4^{2} b'_1 &+& b'_0\;&+ \\ + & 4^{29} b'_1 &+& 4^{27} b'_0 &+& 4^{24} a'_1 &+& 4^{21} a'_0 &+& 4^{14} \texttt{spread}(d) &+& \texttt{spread}(c)\;&+ \\ + & 4^{18} \texttt{spread}(c) &+& 4^{15} b'_1 &+& 4^{13} b'_0 &+& 4^{10} a'_1 &+& 4^{7} a'_0 &+& \texttt{spread}(d)\;& +\end{array} +$$ + +- $\mathtt{spread}$ lookup on $a_0, a_1, a_2$ +- `s23`: + - `sr2` (2-bit range check) and `sr3` (3-bit range check) + - `ss2` (2-bit spread) and `ss3` (3-bit spread) +- `s33`: + - `sr3` and `sr3` (two 3-bit range checks) + - `ss3` and `ss3` (two 3-bit spreads) +(see section [Helper gates](#Helper-gates)) + +Output: $\Sigma_1(E) = R^{even} = R_0^{even} + 2^{16} R_1^{even}$ + +### σ_0 gate +#### v1 +v1 of the $\sigma_0$ gate takes in a word that's split into $(3, 4, 11, 14)$-bit chunks (already constrained by message scheduling). We refer to these chunks respectively as $(a, b, c, d).$ $b$ is further split into two 2-bit chunks $b_0,b_1.$ $a',\{b'_i\}_{i=0}^1$ are the spread versions of the small chunks. We already have $\texttt{spread}(c)$ and $\texttt{spread}(d)$ from the message scheduling. + +sr|ss|s22|s23| $a_0$ | $a_1$ | $a_2$ | $a_3$ | $a_4$ | $a_5$ | $a_6$ | +--|--|---|---|-------------|------------|-----------------------------|--------------|--------------|--------------|--------------| + 0| 0| 1 | 0 |{0,1,2,3,4,5}|$R_0^{even}$|$\texttt{spread}(R_0^{even})$| $b_0$ | $b'_0$ | $b_1$ | $b'_1$ | + 0| 1| 0 | 0 |{0,1,2,3,4,5}|$R_0^{odd}$ |$\texttt{spread}(R_0^{odd})$ |$\texttt{spread}(R_1^{odd})$ |$\texttt{spread}(c)$|$\texttt{spread}(d)$| + 0| 0| 0 | 1 |{0,1,2,3,4,5}|$R_1^{even}$|$\texttt{spread}(R_1^{even})$| $b_1$ | $b'_1$ | $a$ | $a'$ | + 1| 0| 0 | 0 |{0,1,2,3,4,5}|$R_1^{odd}$ |$\texttt{spread}(R_1^{odd})$ | $R_1$ | $R_0$ | $R_0^{even}$ | $R_0^{odd}$ | + +Constraints: +- `ss` ($\sigma_0$ v1 constraint): $LHS - RHS = 0$ + +$$ +\begin{array}{ccc} +LHS &=& \mathtt{spread}(R^{even}_0) + 2 \cdot \mathtt{spread}(R^{odd}_0) + 2^{32} \cdot \mathtt{spread}(R^{even}_1) + 2^{33} \cdot \mathtt{spread}(R^{odd}_1) +\end{array} +$$ +$$ +\begin{array}{rccccccccl} +RHS = & & & 4^{15} d &+& 4^{ 4} c &+& 4^2 b_1 &+& b_0\;&+ \\ + & 4^{30} b_1 &+& 4^{28} b_0 &+& 4^{25} a &+& 4^{11} d &+& c\;&+ \\ + & 4^{21} c &+& 4^{19} b_1 &+& 4^{17} b_0 &+& 4^{14} a &+& d\;& +\end{array} +$$ + +- `sr` (reduce): + - $R_1^{even} + 2*R_1^{odd} - R_1 = 0$ + - $R_0^{even} + 2*R_0^{odd} - R_0 = 0$ +- $\mathtt{spread}$ lookup on $a_0, a_1, a_2$ +- `s2`: + - `sr2` (2-bit range check) + - `ss2` (2-bit spread) +- `s3`: + - `sr3` (3-bit range check) + - `ss3` (3-bit spread) +(see section [Helper gates](#Helper-gates)) + +#### v2 +v2 of the $\sigma_0$ gate takes in a word that's split into $(3, 4, 3, 7, 1, 1, 13)$-bit chunks (already constrained by message scheduling). We refer to these chunks respectively as $(a, b, c, d, e, f, g).$ We already have $\mathtt{spread}(e), \mathtt{spread}(g)$ from the message scheduling. The 1-bit $e,f$ remain unchanged by the spread operation and can be used directly. We further split $b$ into two 2-bit chunks $b_0, b_1.$ $a', b'_0, b'_1, c'$ are the spread versions of the small chunks. + +sr|ss|s23| $a_0$ | $a_1$ | $a_2$ | $a_3$ | $a_4$ | $a_5$ | $a_6$ | $a_7$ | +--|--|---|-------------|------------|-----------------------------|------------|------------|------------|------------|------------| +0 |0 | 1 |{0,1,2,3,4,5}|$R_0^{even}$|$\texttt{spread}(R_0^{even})$| $b_0$ | $b'_0$ | $a$ | $a'$ | $e$ | +0 |1 | 0 |{0,1,2,3,4,5}|$R_0^{odd}$ |$\texttt{spread}(R_0^{odd})$ | $\texttt{spread}(R_1^{odd})$| $\texttt{spread}(d)$| $\texttt{spread}(g)$ | +0 |0 | 1 |{0,1,2,3,4,5}|$R_1^{even}$|$\texttt{spread}(R_1^{even})$| $b_1$ | $b'_1$ | $c$ | $c'$ | $f$ | +1 |0 | 0 |{0,1,2,3,4,5}|$R_1^{odd}$ |$\texttt{spread}(R_1^{odd})$ | $R_1$ | $R_0$ |$R_0^{even}$|$R_0^{odd}$ | | + +Constraints: +- `ss` ($\sigma_0$ v2 constraint): $LHS - RHS = 0$ + +$$ +\begin{array}{ccc} +LHS &=& \mathtt{spread}(R^{even}_0) + 2 \cdot \mathtt{spread}(R^{odd}_0) + 2^{32} \cdot \mathtt{spread}(R^{even}_1) + 2^{33} \cdot \mathtt{spread}(R^{odd}_1) +\end{array} +$$ +$$ +\begin{array}{rcccccccccccl} +RHS = & & & 4^{16} g &+& 4^{15} f &+& 4^{ 14} e &+& 4^{ 7} d &+& 4^{ 4} c &+& 4^2 b_1 &+& b_0\;&+ \\ + & 4^{30} b_1 &+& 4^{28} b_0 &+& 4^{25} a &+& 4^{12} g &+& 4^{11} f &+& 4^{10} e &+& 4^{3} d &+& c\;&+ \\ + & 4^{31} e &+& 4^{24} d &+& 4^{21} c &+& 4^{19} b_1 &+& 4^{17} b_0 &+& 4^{14} a &+& 4^{1} g &+& f\;& +\end{array} +$$ + +- `sr` (reduce): + - $R_1^{even} + 2*R_1^{odd} - R_1 = 0$ + - $R_0^{even} + 2*R_0^{odd} - R_0 = 0$ +- `s23`: + - `sr2` (2-bit range check) and `sr3` (3-bit range check) + - `ss2` (2-bit spread) and `ss3` (3-bit spread) + +### σ_1 gate +#### v1 +v1 of the $\sigma_1$ gate takes in a word that's split into $(10,7,2,13)$-bit chunks (already constrained by message scheduling). We refer to these chunks respectively as $(a, b, c, d).$ $b$ is further split into (2,2,3)-bit chunks $b_0,b_1,b_2.$ $\{b'_i\}_{i=0}^2, c'$ are the spread versions of the small chunks. We already have $\texttt{spread}(a)$ and $\texttt{spread}(d)$ from the message scheduling. + +sr|ss|s22|s23| $a_0$ | $a_1$ | $a_2$ | $a_3$ | $a_4$ | $a_5$ | $a_6$ | +--|--|---|---|-------------|------------|-----------------------------|------------|------------|------------|------------| +0 |0 | 1 | 0 |{0,1,2,3,4,5}|$R_0^{even}$|$\texttt{spread}(R_0^{even})$| $b_0$ | $b'_0$ | $b_1$ | $b'_1$ | +0 |1 | 0 | 0 |{0,1,2,3,4,5}|$R_0^{odd}$ |$\texttt{spread}(R_0^{odd})$ | $\texttt{spread}(R_1^{odd})$| $\texttt{spread}(a)$| $\texttt{spread}(d)$ | +0 |0 | 0 | 1 |{0,1,2,3,4,5}|$R_1^{even}$|$\texttt{spread}(R_1^{even})$| $b_2$ | $b'_2$ | $c$ | $c'$ | +1 |0 | 0 | 0 |{0,1,2,3,4,5}|$R_1^{odd}$ |$\texttt{spread}(R_1^{odd})$ | $R_0$ | $R_1$ |$R_0^{even}$|$R_0^{odd}$ | + +Constraints: +- `ss` ($\sigma_1$ v1 constraint): $LHS - RHS = 0$ + +$$ +\begin{array}{ccc} +LHS &=& \mathtt{spread}(R^{even}_0) + 2 \cdot \mathtt{spread}(R^{odd}_0) + 2^{32} \cdot \mathtt{spread}(R^{even}_1) + 2^{33} \cdot \mathtt{spread}(R^{odd}_1) +\end{array} +$$ +$$ +\begin{array}{rcccccccccl} +RHS = & & & 4^{ 9} d &+& 4^{ 7} c &+& 4^{4} b_2 &+& 4^{2} b_1 &+& b_0\;&+ \\ + & 4^{29} b_2 &+& 4^{27} b_1 &+& 4^{25} b_0 &+& 4^{15} a &+& 4^{ 2} d &+& c\;&+ \\ + & 4^{30} c &+& 4^{27} b_2 &+& 4^{25} b_1 &+& 4^{23} b_0 &+& 4^{13} a &+& d\;& +\end{array} +$$ + +- `sr` (reduce): + - $R_1^{even} + 2*R_1^{odd} - R_1 = 0$ + - $R_0^{even} + 2*R_0^{odd} - R_0 = 0$ +- `s23`: + - `sr2` (2-bit range check) and `sr3` (3-bit range check) + - `ss2` (2-bit spread) and `ss3` (3-bit spread) +- `s22`: + - `sr2` and `sr2` (two 2-bit range checks) + - `ss2` and `ss2` (two 2-bit spreads) + +#### v2 +v2 of the $\sigma_1$ gate takes in a word that's split into $(3, 4, 3, 7, 1, 1, 13)$-bit chunks (already constrained by message scheduling). We refer to these chunks respectively as $(a, b, c, d, e, f, g).$ We already have $\mathtt{spread}(e), \mathtt{spread}(g)$ from the message scheduling. The 1-bit $e,f$ remain unchanged by the spread operation and can be used directly. We further split $b$ into two 2-bit chunks $b_0, b_1.$ $a', b'_0, b'_1, c'$ are the spread versions of the small chunks. + +ss|s23| $a_0$ | $a_1$ | $a_2$ | $a_3$ | $a_4$ | $a_5$ | $a_6$ | $a_7$ | +--|---|-------------|------------|-----------------------------|------------|------------|------------|------------|------------| +0 | 1 |{0,1,2,3,4,5}|$R_0^{even}$|$\texttt{spread}(R_0^{even})$| $b_0$ | $b'_0$ | $a$ | $a'$ | $e$ +1 | 0 |{0,1,2,3,4,5}|$R_0^{odd}$ |$\texttt{spread}(R_0^{odd})$ | $\texttt{spread}(R_1^{odd})$| $\texttt{spread}(d)$| $\texttt{spread}(g)$ | +0 | 1 |{0,1,2,3,4,5}|$R_1^{even}$|$\texttt{spread}(R_1^{even})$| $b_1$ | $b'_1$ | $c$ | $c'$ | $f$ +0 | 0 |{0,1,2,3,4,5}|$R_1^{odd}$ |$\texttt{spread}(R_1^{odd})$ | $R_0$ | $R_1$ |$R_0^{even}$|$R_0^{odd}$ | + +Constraints: +- `ss` ($\sigma_1$ v2 constraint): $LHS - RHS = 0$ + +$$ +\begin{array}{ccc} +LHS &=& \mathtt{spread}(R^{even}_0) + 2 \cdot \mathtt{spread}(R^{odd}_0) + 2^{32} \cdot \mathtt{spread}(R^{even}_1) + 2^{33} \cdot \mathtt{spread}(R^{odd}_1) +\end{array} +$$ +$$ +\begin{array}{rccccccccccccl} +RHS = & &&&& & & 4^{ 9} g &+& 4^{ 7} f &+& 4^{ 7} e &+& d\;&+ \\ + & 4^{25} d &+& 4^{22} c &+& 4^{18} b &+& 4^{15} a &+& 4^{ 2} g &+& 4^{1}f &+& e\;&+ \\ + & 4^{31} f &+& 4^{30} e &+& 4^{23} d &+& 4^{20} c &+& 4^{16} b &+& 4^{13} a &+& g\;& +\end{array} +$$ + +- `sr` (reduce): + - $R_1^{even} + 2*R_1^{odd} - R_1 = 0$ + - $R_0^{even} + 2*R_0^{odd} - R_0 = 0$ +- `s23`: + - `sr2` (2-bit range check) and `sr3` (3-bit range check) + - `ss2` (2-bit spread) and `ss3` (3-bit spread) + + +### Helper gates + +#### Small range constraints +Let $constrain_n(x) = \prod_{i=0}^n (x-i)$. Constraining this expression to equal zero enforces that $x$ is in $[0..n].$ + +#### 2-bit range check +`sr2`: $(a - 3)(a - 2)(a - 1)(a) = 0$ +sr2| $a_0$ | +---|-------| + 1 | a | + +#### 2-bit spread +`ss2`: $l_1(a) + 4*l_2(a) + 5*l_3(a) - a' = 0$ +ss2| $a_0$ | $a_1$ +---|-------|------ + 1 | a | a' + +with interpolation polynomials: +- $l_0(a) = \frac{(a - 3)(a - 2)(a - 1)}{(-3)(-2)(-1)}$ ($\mathtt{spread}(00) = 0000$) +- $l_1(a) = \frac{(a - 3)(a - 2)(a)}{(-2)(-1)(1)}$ ($\mathtt{spread}(01) = 0001$) +- $l_2(a) = \frac{(a - 3)(a - 1)(a)}{(-1)(1)(2)}$ ($\mathtt{spread}(10) = 0100$) +- $l_3(a) = \frac{(a - 2)(a - 1)(a)}{(1)(2)(3)}$ ($\mathtt{spread}(11) = 0101$) + +#### 3-bit range check +`sr3`: $(a - 7)(a - 6)(a - 5)(a - 4)(a - 3)(a - 2)(a - 1)(a) = 0$ +sr3| $a_0$ | +---|-------| + 1 | a | + +#### 3-bit spread +`ss3`: $l_1(a) + 4*l_2(a) + 5*l_3(a) + 16*l_4(a) + 17*l_5(a) + 20*l_6(a) + 21*l_7(a) - a' = 0$ +ss3| $a_0$ | $a_1$ +---|-------|------ + 1 | a | a' + +with interpolation polynomials: +- $l_0(a) = \frac{(a - 7)(a - 6)(a - 5)(a - 4)(a - 3)(a - 2)(a - 1)}{(-7)(-6)(-5)(-4)(-3)(-2)(-1)}$ ($\mathtt{spread}(000) = 000000$) +- $l_1(a) = \frac{(a - 7)(a - 6)(a - 5)(a - 4)(a - 3)(a - 2)(a)}{(-6)(-5)(-4)(-3)(-2)(-1)(1)}$ ($\mathtt{spread}(001) = 000001$) +- $l_2(a) = \frac{(a - 7)(a - 6)(a - 5)(a - 4)(a - 3)(a - 1)(a)}{(-5)(-4)(-3)(-2)(-1)(1)(2)}$ ($\mathtt{spread}(010) = 000100$) +- $l_3(a) = \frac{(a - 7)(a - 6)(a - 5)(a - 3)(a - 2)(a - 1)(a)}{(-4)(-3)(-2)(-1)(1)(2)(3)}$ ($\mathtt{spread}(011) = 000101$) +- $l_4(a) = \frac{(a - 7)(a - 6)(a - 5)(a - 3)(a - 2)(a - 1)(a)}{(-3)(-2)(-1)(1)(2)(3)(4)}$ ($\mathtt{spread}(100) = 010000$) +- $l_5(a) = \frac{(a - 7)(a - 6)(a - 4)(a - 3)(a - 2)(a - 1)(a)}{(-2)(-1)(1)(2)(3)(4)(5)}$ ($\mathtt{spread}(101) = 010001$) +- $l_6(a) = \frac{(a - 7)(a - 5)(a - 4)(a - 3)(a - 2)(a - 1)(a)}{(-1)(1)(2)(3)(4)(5)(6)}$ ($\mathtt{spread}(110) = 010100$) +- $l_7(a) = \frac{(a - 6)(a - 5)(a - 4)(a - 3)(a - 2)(a - 1)(a)}{(1)(2)(3)(4)(5)(6)(7)}$ ($\mathtt{spread}(111) = 010101$) + +#### reduce_6 gate +Addition $\pmod{2^{32}}$ of 6 elements + +Input: +- $E$ +- $\{e_i^{lo}, e_i^{hi}\}_{i=0}^5$ +- $carry$ + +Check: $E = e_0 + e_1 + e_2 + e_3 + e_4 + e_5 \pmod{32}$ + +Assume inputs are constrained to 16 bits. +- Addition gate (sa): + - $a_0 + a_1 + a_2 + a_3 + a_4 + a_5 + a_6 - a_7 = 0$ +- Carry gate (sc): + - $2^{16} a_6 \omega^{-1} + a_6 + [(a_6 - 5)(a_6 - 4)(a_6 -3)(a_6 - 2)(a_6 - 1)(a_6)] = 0$ + +sa|sc| $a_0$ | $a_1$ |$a_2$ |$a_3$ |$a_4$ |$a_5$ |$a_6$ |$a_7$ | +--|--|----------|----------|----------|----------|----------|----------|---------------|--------| +1 |0 |$e_0^{lo}$|$e_1^{lo}$|$e_2^{lo}$|$e_3^{lo}$|$e_4^{lo}$|$e_5^{lo}$|$-carry*2^{16}$|$E^{lo}$| +1 |1 |$e_0^{hi}$|$e_1^{hi}$|$e_2^{hi}$|$e_3^{hi}$|$e_4^{hi}$|$e_5^{hi}$|$carry$ |$E^{hi}$| + +Assume inputs are constrained to 16 bits. +- Addition gate (sa): + - $a_0 \omega^{-1} + a_1 \omega^{-1} + a_2 \omega^{-1} + a_0 + a_1 + a_2 + a_3 \omega^{-1} - a_3 = 0$ +- Carry gate (sc): + - $2^{16} a_3 \omega + a_3 \omega^{-1} = 0$ + + +sa|sc| $a_0$ | $a_1$ |$a_2$ |$a_3$ | +--|--|----------|----------|----------|---------------| +0 |0 |$e_0^{lo}$|$e_1^{lo}$|$e_2^{lo}$|$-carry*2^{16}$| +1 |1 |$e_3^{lo}$|$e_4^{lo}$|$e_5^{lo}$|$E^{lo}$ | +0 |0 |$e_0^{hi}$|$e_1^{hi}$|$e_2^{hi}$|$carry$ | +1 |0 |$e_3^{hi}$|$e_4^{hi}$|$e_5^{hi}$|$E^{hi}$ | + +#### reduce_7 gate +Addition $\pmod{2^{32}}$ of 7 elements + +Input: +- $E$ +- $\{e_i^{lo}, e_i^{hi}\}_{i=0}^6$ +- $carry$ + +Check: $E = e_0 + e_1 + e_2 + e_3 + e_4 + e_5 + e_6 \pmod{32}$ + +Assume inputs are constrained to 16 bits. +- Addition gate (sa): + - $a_0 + a_1 + a_2 + a_3 + a_4 + a_5 + a_6 + a_7 - a_8 = 0$ +- Carry gate (sc): + - $2^{16} a_7 \omega^{-1} + a_7 + [(a_7 - 6)(a_7 - 5)(a_7 - 4)(a_7 -3)(a_7 - 2)(a_7 - 1)(a_7)] = 0$ + +sa|sc| $a_0$ | $a_1$ |$a_2$ |$a_3$ |$a_4$ |$a_5$ |$a_6$ |$a_7$ |$a_8$ | +--|--|----------|----------|----------|----------|----------|----------|----------|---------------|--------| +1 |0 |$e_0^{lo}$|$e_1^{lo}$|$e_2^{lo}$|$e_3^{lo}$|$e_4^{lo}$|$e_5^{lo}$|$e_6^{lo}$|$-carry*2^{16}$|$E^{lo}$| +1 |1 |$e_0^{hi}$|$e_1^{hi}$|$e_2^{hi}$|$e_3^{hi}$|$e_4^{hi}$|$e_5^{hi}$|$e_6^{hi}$|$carry$ |$E^{hi}$| + + +### Message scheduling region +For each block $M \in \{0,1\}^{512}$ of the padded message, $64$ words of $32$ bits each are constructed as follows: +- the first $16$ are obtained by splitting $M$ into $32$-bit blocks $$M = W_1 || W_2 || \cdots || W_{15} || W_{16};$$ +- the remaining $48$ words are constructed using the formula: +$$W_i = \sigma_1(W_{i-2}) \boxplus W_{i-7} \boxplus \sigma_0(W_{i-15}) \boxplus W_{i-16},$$ for $i = 17, \ldots, 64$. + +sw|sd0|sd1|sd2|sd3|sr |ss0|ss0_v2|ss1|ss1_v2|s22|s23| $a_0$ | $a_1$ | $a_2$ | $a_3$ | $a_4$ | $a_5$ | $a_6$ | $a_7$ | $a_8$ | +--|---|---|---|---|---|---|------|---|------|---|---|---------------|------------------|-----------------------------------|------------------------------|----------------------------------|---------------------------------|---------------------------------|------------------------|------------------------| +0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | {0,1,2,3,4,5} | $W_{1}^{lo}$ | $\texttt{spread}(W_{1}^{lo})$ | | | $W_{1}$ |$\sigma_0(W_2)^{lo}$ |$\sigma_1(W_{15})^{lo}$ | $W_{10}^{lo}$ | +1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | {0,1,2,3,4,5} | $W_{1}^{hi}$ | $\texttt{spread}(W_{1}^{hi})$ | $W_{1}^{lo}$ | $W_{1}^{hi}$ | $W_{17}$ |$\sigma_0(W_2)^{hi}$ |$\sigma_1(W_{15})^{hi}$ | $W_{10}^{hi}$ | +0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | {0,1,2,3,4} | $W_{2}^{d(14)}$ | $\texttt{spread}(W_{2}^{d(14)})$ | $W_{2}^{a(3)}$ | $W_{2}^{b(4)}$ | $W_{2}$ |$\sigma_0(W_3)^{lo}$ |$\sigma_1(W_{16})^{lo}$ | $W_{11}^{lo}$ | +1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | {0,1,2} | $W_{2}^{c(11)}$ | $\texttt{spread}(W_{2}^{c(11)})$ | $W_{2}^{lo}$ | $W_{2}^{hi}$ | $W_{18}$ |$\sigma_0(W_3)^{hi}$ |$\sigma_1(W_{16})^{hi}$ | $W_{11}^{hi}$ | +0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | {0,1,2,3,4,5} | $R_0^{even}$ | $\texttt{spread}(R_0^{even})$ | $W_{2}^{b(4)lo}$ |$\texttt{spread}(W_{2}^{b(4)lo})$ | $W_{2}^{b(4) hi}$ |$\texttt{spread}(W_{2}^{b(4)hi})$| | | +0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | {0,1,2,3,4,5} | $R_1^{odd}$ | $\texttt{spread}(R_1^{odd})$ | $\sigma_0 v1 R_1$ | $\sigma_0 v1 R_0$ | $\sigma_0 v1 R_0^{even}$ | $\sigma_0 v1 R_0^{odd}$ | | | +0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | {0,1,2,3,4,5} | $R_0^{odd}$ | $\texttt{spread}(R_0^{odd})$ | $\texttt{spread}(R_1^{odd})$ |$\texttt{spread}(W_{2}^{c(11)})$ |$\texttt{spread}(W_{2}^{d(14)})$ | | | | +0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | {0,1,2,3,4,5} | $R_1^{even}$ | $\texttt{spread}(R_1^{even})$ | $W_{2}^{b(4)hi}$ |$\texttt{spread}(W_{2}^{b(4)hi})$ | $W_{2}^{a(3)}$ |$\texttt{spread}(W_{2}^{a(3)})$ | | | +..|...|...|...|...|...|...|... |...|... |...|...| ... | ... | ... | ... | ... | ... | ... | ... | ... | +0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | {0,1,2,3} | $W_{15}^{g(13)}$ | $\texttt{spread}(W_{15}^{g(13)})$ | $W_{15}^{a(3)}$ | $W_{15}^{c(3)}$ | | | | | +0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | $W_{15}^{d(7)}$ | $\texttt{spread}(W_{15}^{d(7)})$ | $W_{15}^{e(1)}$ | $W_{15}^{f(1)}$ | $W_{15}$ |$\sigma_0(W_{16})^{lo}$ |$\sigma_1(W_{29})^{lo}$ | $W_{24}^{lo}$ | +1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | $W_{15}^{b(4)}$ | $\texttt{spread}(W_{15}^{b(4)})$ | $W_{15}^{lo}$ | $W_{15}^{hi}$ | $W_{31}$ |$\sigma_0(W_{16})^{hi}$ |$\sigma_1(W_{29})^{hi}$ | $W_{24}^{hi}$ | +0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | {0,1,2,3,4,5} | $R_0^{even}$ | $\texttt{spread}(R_0^{even})$ | $W_{15}^{b(4)lo}$ |$\texttt{spread}(W_{15}^{b(4)lo})$| $W_{15}^{a(3)}$ |$\texttt{spread}(W_{15}^{a(3)})$ | $W_{15}^{e(1)}$ | | +0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | {0,1,2,3,4,5} | $R_0^{odd}$ | $\texttt{spread}(R_0^{odd})$ | $\texttt{spread}(R_1^{odd})$ |$\texttt{spread}(W_{15}^{d(7)})$ |$\texttt{spread}(W_{15}^{g(13)})$| | | | +0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | {0,1,2,3,4,5} | $R_1^{even}$ | $\texttt{spread}(R_1^{even})$ | $W_{15}^{b(4) hi}$ |$\texttt{spread}(W_{15}^{b(4)hi})$| $W_{15}^{c(3)}$ |$\texttt{spread}(W_{15}^{c(3)})$ | $W_{15}^{f(1)}$ | | +0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | {0,1,2,3,4,5} | $R_1^{odd}$ | $\texttt{spread}(R_1^{odd})$ | $\sigma_0 v2 R_0$ | $\sigma_0 v2 R_1$ |$\sigma_0 v2 R_0^{even}$ |$\sigma_0 v2 R_0^{odd}$ | | | +0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 1 | {0,1,2,3,4,5} | $R_0^{even}$ | $\texttt{spread}(R_0^{even})$ | $W_{15}^{b(4)lo}$ |$\texttt{spread}(W_{15}^{b(4)lo})$| $W_{15}^{a(3)}$ |$\texttt{spread}(W_{15}^{a(3)})$ | $W_{15}^{e(1)}$ | | +0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 1 | 0 | 0 | {0,1,2,3,4,5} | $R_0^{odd}$ | $\texttt{spread}(R_0^{odd})$ | $\texttt{spread}(R_1^{odd})$ | $\texttt{spread}(d)$ | $\texttt{spread}(g)$ | | | | +0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 1 | {0,1,2,3,4,5} | $R_1^{even}$ | $\texttt{spread}(R_1^{even})$ | $W_{15}^{b(4) hi}$ |$\texttt{spread}(W_{15}^{b(4)hi})$| $W_{15}^{c(3)}$ |$\texttt{spread}(W_{15}^{c(3)})$ | $W_{15}^{f(1)}$ | | +0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | {0,1,2,3,4,5} | $R_1^{odd}$ | $\texttt{spread}(R_1^{odd})$ | $\sigma_1 v2 R_0$ | $\sigma_1 v2 R_1$ |$\sigma_1 v2 R_0^{even}$ |$\sigma_1 v2 R_0^{odd}$ | | | +..|...|...|...|...|...|...|... |...|... |...|...| ... | ... | ... | ... | ... | ... | ... | ... | ... | +0 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | {0,1,2,3} | $W_{50}^{d(13)}$ | $\texttt{spread}(W_{50}^{d(13)})$ | $W_{50}^{c(2}$ | $W_{50}^{b(7)}$ | $W_{50}$ | | | | +0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | {0,1} | $W_{50}^{a(10)}$ | $\texttt{spread}(W_{50}^{a(10)})$ | $W_{50}^{lo}$ | $W_{50}^{hi}$ | | | | | +0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | | | insert $\sigma_1(W_{14})$ v1 | | | | | | | +..|...|...|...|...|...|...|... |...|... |...|...| ... | ... | ... | ... | ... | ... | ... | ... | ... | +0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | {0,1,2,3,4,5} | $W_{63}^{lo}$ | $\texttt{spread}(W_{63}^{lo})$ | | | $W_{63}$ | | | | +0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | {0,1,2,3,4,5} | $W_{63}^{hi}$ | $\texttt{spread}(W_{63}^{hi})$ | | | | | | | +0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | {0,1,2,3,4,5} | $W_{64}^{lo}$ | $\texttt{spread}(W_{64}^{lo})$ | | | $W_{64}$ | | | | +0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | {0,1,2,3,4,5} | $W_{64}^{hi}$ | $\texttt{spread}(W_{64}^{hi})$ | | | | | | | + +Constraints: +- `sw`: construct word using $reduce_4$ +- `sd0`: decomposition gate for $W_1, W_{63}, W_{64}$ + - $W^{lo} + 2^{16} W^{hi} - W = 0$ +- `sd1`: decomposition gate for $W_{2..14}$ (split into $(3,4,11,14)$-bit pieces) + - $W^{3b} + 2^3 W^{4b} + 2^7 W^{11b} + 2^{18} W^{14b} - W = 0$ + - $W^{lo} + 2^{16} W^{hi} - W = 0$ +- `sd2`: decomposition gate for $W_{15..49}$ (split into $(3,4,3,7,1,1 ,13)$-bit pieces) +- `sd3`: decomposition gate for $W_{50..62}$ (split into $(10,7,2,13)$-bit pieces) + + +### Compression region + +``` ++----------------------------------------------------------+ +| | +| | +| | +| Σ_0(A) | +| | +| | +| | +| +---------------------------------------+ +| | | +| | | +| | | +| | reduce_7() to get A | +| | | +| | | +| | | ++------------------+---------------------------------------+ +| | +| Maj(A,B,C) | +| | ++----------------------------------------------------------+ +| | +| | +| | +| Σ_1(E) | +| | +| | +| | +| +---------------------------------------+ +| | | +| | | +| | | +| | reduce_6() to get E | +| | | +| | | +| | | ++------------------+---------------------------------------+ +| | +| Ch(E,F,G) | +| | ++----------------------------------------------------------+ +``` + + +#### Round 1 + +1. decompose $A$ into $A_0, A_1$ 16-bit subpieces +2. $\Sigma_0(A)$ + - decomposes $A$ into $(2, 11, 3, 3, 3, 10)$-bit subpieces + - spreads each of the subpieces + - outputs $R_0^{even}, R_1^{even}$ +3. decompose $B$ + - into $16$-bit subpieces + - spread each of the subpieces +4. decompose $C$ + - into $16$-bit subpieces + - spread each of the subpieces +5. $Maj(A,B,C)$ + - takes in the 16-bit spread subpieces of $A,B,C$ + - outputs $M_0^{odd}, M_1^{odd}$ +6. decompose $E$ into $E_0, E_1$ 16-bit subpieces +7. $\Sigma_1(E)$ + - decomposes $E$ into $(3, 3, 2, 3, 13, 7)$-bit subpieces + - spreads each of the subpieces + - outputs $R_0^{even}, R_1^{even}$ +8. decompose $F$ + - into $16$-bit subpieces + - spread each of the subpieces +9. decompose $G$ + - into $16$-bit subpieces + - spread each of the subpieces +10. $Ch(E,F,G)$ + - takes in the 16-bit spread subpieces of $E,F,G$ + - outputs $P_0^{odd}, Q_0^{odd}, P_1^{odd}, Q_1^{odd}$ +11. decompose $H$ into $16$-bit subpieces + +#### Round 2 (steady-state) +1. $reduce_7$ to get $A$ + - $H' = H_{prev} + Ch(E_{prev}, F_{prev}, G_{prev}) + \Sigma_1(E_{prev}) + K_1 + W_1$ + - $reduce_7(H' + Maj(A_{prev}, B_{prev}, C_{prev}) + \Sigma_0(A_{prev}))$ + - outputs $A_0, A_1$ 16-bit subpieces +2. $\Sigma_0(A)$ + - decomposes $A$ into $(2, 11, 3, 3, 3, 10)$-bit subpieces + - spreads each of the subpieces + - outputs $R_0^{even}, R_1^{even}$ +3. $B = A_{prev}$ +4. $C = B_{prev}$ +5. $Maj(A,B,C)$ + - takes in the 16-bit spread subpieces of $A,B,C$ + - outputs $M_0^{odd}, M_1^{odd}$ +6. $reduce_6$ to get $E$ + - $H' = H_{prev} + Ch(E_{prev}, F_{prev}, G_{prev}) + \Sigma_1(E_{prev}) + K_1 + W_1$ + - $reduce_6(H' + D_{prev})$ + - outputs $E_0, E_1$ 16-bit subpieces +7. $\Sigma_1(E)$ + - decomposes $E$ into $(3, 3, 2, 3, 13, 7)$-bit subpieces + - spreads each of the subpieces + - outputs $R_0^{even}, R_1^{even}$ +8. $F = E_{prev}$ +9. $G = F_{prev}$ +10. $Ch(E,F,G)$ + - takes in the 16-bit spread subpieces of $E,F,G$ + - outputs $P_0^{odd}, Q_0^{odd}, P_1^{odd}, Q_1^{odd}$ +11. $H = G_{prev}$ From e4d5ddecb2c5f2ede151a2a40ee3c407f3d041b8 Mon Sep 17 00:00:00 2001 From: therealyingtong Date: Wed, 23 Dec 2020 00:50:39 +0800 Subject: [PATCH 03/12] book: Use 0-indexing for message scheduling table16.md --- book/src/design/gadgets/sha256/table16.md | 28 +++++++++++------------ 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/book/src/design/gadgets/sha256/table16.md b/book/src/design/gadgets/sha256/table16.md index faffc93..88fe0c7 100644 --- a/book/src/design/gadgets/sha256/table16.md +++ b/book/src/design/gadgets/sha256/table16.md @@ -182,11 +182,11 @@ where $\{R^{even}_i\}_{i=0..1}$ is the $\Sigma_1$ function output. For each block $M \in \{0,1\}^{512}$ of the padded message, $64$ words of $32$ bits each are constructed as follows: -- The first $16$ are obtained by splitting $M$ into $32$-bit blocks $$M = W_1 || W_2 || \cdots || W_{15} || W_{16};$$ +- The first $16$ are obtained by splitting $M$ into $32$-bit blocks $$M = W_0 || W_1 || \cdots || W_{14} || W_{15};$$ - The remaining $48$ words are constructed using the formula: $$W_i = \sigma_1(W_{i-2}) \boxplus W_{i-7} \boxplus \sigma_0(W_{i-15}) \boxplus W_{i-16},$$ for $i = 17, \ldots, 64$. -> Note: $1$-based numbering is used for the $W$ word indices. +> Note: $0$-based numbering is used for the $W$ word indices. $$ \begin{array}{ccc} @@ -246,9 +246,9 @@ $$ ### Message scheduling -We apply $\sigma_0$ to $W_{2..49}$, and $\sigma_1$ to $W_{15..62}$. In order to avoid +We apply $\sigma_0$ to $W_{1..48}$, and $\sigma_1$ to $W_{14..61}$. In order to avoid redundant applications of $\mathtt{spread}$, we can merge the splitting into pieces for -$\sigma_0$ and $\sigma_1$ in the case of $W_{15..49}$. Merging the piece lengths +$\sigma_0$ and $\sigma_1$ in the case of $W_{14..48}$. Merging the piece lengths $(3, 4, 11, 14)$ and $(10, 7, 2, 13)$ gives pieces of lengths $(3, 4, 3, 7, 1, 1, 13)$. ![](./bit_reassignment.png) @@ -259,27 +259,27 @@ splitting for $\sigma_0$ and $\sigma_1$ separately), we save $35$ rows. > These might even be doable in $2$ rows; not sure. > [name=Daira] -We can merge the reduction mod $2^{32}$ of $W_{17..62}$ into their splitting when they are +We can merge the reduction mod $2^{32}$ of $W_{16..61}$ into their splitting when they are used to compute subsequent words, similarly to what we did for $A$ and $E$ in the round function. -We will still need to reduce $W_{63..64}$ since they are not split. (Technically we could +We will still need to reduce $W_{62..63}$ since they are not split. (Technically we could leave them unreduced since they will be reduced later when they are used to compute $A_{new}$ and $E_{new}$ -- but that would require handling a carry of up to $10$ rather than $6$, so it's not worth the complexity.) The resulting message schedule cost is: -- $2$ rows to constrain $W_1$ to $32$ bits +- $2$ rows to constrain $W_0$ to $32$ bits - This is technically optional, but let's do it for robustness, since the rest of the input is constrained for free. -- $13*2$ rows to split $W_{2..14}$ into $(3, 4, 11, 14)$-bit pieces -- $35*3$ rows to split $W_{15..49}$ into $(3, 4, 3, 7, 1, 1, 13)$-bit pieces (merged with - a reduction for $W_{17..49}$) -- $13*2$ rows to split $W_{50..62}$ into $(10, 7, 2, 13)$-bit pieces (merged with a +- $13*2$ rows to split $W_{1..13}$ into $(3, 4, 11, 14)$-bit pieces +- $35*3$ rows to split $W_{14..48}$ into $(3, 4, 3, 7, 1, 1, 13)$-bit pieces (merged with + a reduction for $W_{16..48}$) +- $13*2$ rows to split $W_{49..61}$ into $(10, 7, 2, 13)$-bit pieces (merged with a reduction) -- $4*48$ rows to extract the results of $\sigma_0$ for $W_{2..49}$ -- $4*48$ rows to extract the results of $\sigma_1$ for $W_{15..62}$ -- $2*2$ rows to reduce $W_{63..64}$ +- $4*48$ rows to extract the results of $\sigma_0$ for $W_{1..48}$ +- $4*48$ rows to extract the results of $\sigma_1$ for $W_{14..61}$ +- $2*2$ rows to reduce $W_{62..63}$ - $= 547$ rows. ## Overall cost From d2c0c8b623eaa06461f8d0085b747eb40d51c9e0 Mon Sep 17 00:00:00 2001 From: Jack Grigg Date: Tue, 22 Dec 2020 21:35:20 +0000 Subject: [PATCH 04/12] book: Remove trailing whitespace --- book/src/design/gadgets/sha256/table16.md | 76 +++++++++++------------ 1 file changed, 38 insertions(+), 38 deletions(-) diff --git a/book/src/design/gadgets/sha256/table16.md b/book/src/design/gadgets/sha256/table16.md index 88fe0c7..5dc2250 100644 --- a/book/src/design/gadgets/sha256/table16.md +++ b/book/src/design/gadgets/sha256/table16.md @@ -35,7 +35,7 @@ where $reduce_i$ must handle a carry in $\{0, \ldots, i-1\}$. There are $64$ compression rounds. $A, B, C, D, E, F, G, H$ are $32$ bits each. Note that we will rely on having each of these words in both "dense" and "spread" forms; this is -explained below. +explained below. ![The SHA-256 compression function](./compression.png) @@ -43,7 +43,7 @@ $(a_L, a_H) \boxplus (b_L, b_H) = (c_L, c_H)$, where $\hspace{3em}\_ \cdot 2^{32} + (c_H : \mathbb{Z}_{2^{16}}) \cdot 2^{16} + (c_L : \mathbb{Z}_{2^{16}}) = (a_H + b_H) \cdot 2^{16} + a_L + b_L$ Note that this correctly handles the carry from $a_L + b_L$. - + More generally any bit-decomposition of the output can be used, not just a decomposition into $16$-bit chunks. @@ -77,7 +77,7 @@ $Maj$ can be done in $4$ lookups: $2\; \mathtt{spread} * 2$ chunks ### Ch function > TODO: can probably be optimised to $4$ or $5$ lookups using an additional table. -> +> $Ch$ can be done in $8$ lookups: $4\; \mathtt{spread} * 2$ chunks - As mentioned above, after the first round we already have $E$ in spread form $E'$. @@ -425,12 +425,12 @@ RHS = & 4^{30} a' &+& 4^{20} \texttt{spread}(d) &+& 4^{17} c'_2 &+& 4^{14} c'_1 $$ - $\mathtt{spread}$ lookup on $a_0, a_1, a_2$ -- `s22`: +- `s22`: - `sr2` and `sr2` (two 2-bit range checks) - `ss2` and `ss2` (two 2-bit spreads) - `s23`: - `sr2` (2-bit range check) and `sr3` (3-bit range check) - - `ss2` (2-bit spread) and `ss3` (3-bit spread) + - `ss2` (2-bit spread) and `ss3` (3-bit spread) (see section [Helper gates](#Helper-gates)) Output: $\Sigma_0(A) = R^{even} = R_0^{even} + 2^{16} R_1^{even}$ @@ -475,8 +475,8 @@ $$ - $\mathtt{spread}$ lookup on $a_0, a_1, a_2$ - `s23`: - `sr2` (2-bit range check) and `sr3` (3-bit range check) - - `ss2` (2-bit spread) and `ss3` (3-bit spread) -- `s33`: + - `ss2` (2-bit spread) and `ss3` (3-bit spread) +- `s33`: - `sr3` and `sr3` (two 3-bit range checks) - `ss3` and `ss3` (two 3-bit spreads) (see section [Helper gates](#Helper-gates)) @@ -489,10 +489,10 @@ v1 of the $\sigma_0$ gate takes in a word that's split into $(3, 4, 11, 14)$-bit sr|ss|s22|s23| $a_0$ | $a_1$ | $a_2$ | $a_3$ | $a_4$ | $a_5$ | $a_6$ | --|--|---|---|-------------|------------|-----------------------------|--------------|--------------|--------------|--------------| - 0| 0| 1 | 0 |{0,1,2,3,4,5}|$R_0^{even}$|$\texttt{spread}(R_0^{even})$| $b_0$ | $b'_0$ | $b_1$ | $b'_1$ | + 0| 0| 1 | 0 |{0,1,2,3,4,5}|$R_0^{even}$|$\texttt{spread}(R_0^{even})$| $b_0$ | $b'_0$ | $b_1$ | $b'_1$ | 0| 1| 0 | 0 |{0,1,2,3,4,5}|$R_0^{odd}$ |$\texttt{spread}(R_0^{odd})$ |$\texttt{spread}(R_1^{odd})$ |$\texttt{spread}(c)$|$\texttt{spread}(d)$| - 0| 0| 0 | 1 |{0,1,2,3,4,5}|$R_1^{even}$|$\texttt{spread}(R_1^{even})$| $b_1$ | $b'_1$ | $a$ | $a'$ | - 1| 0| 0 | 0 |{0,1,2,3,4,5}|$R_1^{odd}$ |$\texttt{spread}(R_1^{odd})$ | $R_1$ | $R_0$ | $R_0^{even}$ | $R_0^{odd}$ | + 0| 0| 0 | 1 |{0,1,2,3,4,5}|$R_1^{even}$|$\texttt{spread}(R_1^{even})$| $b_1$ | $b'_1$ | $a$ | $a'$ | + 1| 0| 0 | 0 |{0,1,2,3,4,5}|$R_1^{odd}$ |$\texttt{spread}(R_1^{odd})$ | $R_1$ | $R_0$ | $R_0^{even}$ | $R_0^{odd}$ | Constraints: - `ss` ($\sigma_0$ v1 constraint): $LHS - RHS = 0$ @@ -510,14 +510,14 @@ RHS = & & & 4^{15} d &+& 4^{ 4} c &+& 4^2 b_1 &+& b_0\;&+ \\ \end{array} $$ -- `sr` (reduce): +- `sr` (reduce): - $R_1^{even} + 2*R_1^{odd} - R_1 = 0$ - $R_0^{even} + 2*R_0^{odd} - R_0 = 0$ - $\mathtt{spread}$ lookup on $a_0, a_1, a_2$ - `s2`: - - `sr2` (2-bit range check) - - `ss2` (2-bit spread) -- `s3`: + - `sr2` (2-bit range check) + - `ss2` (2-bit spread) +- `s3`: - `sr3` (3-bit range check) - `ss3` (3-bit spread) (see section [Helper gates](#Helper-gates)) @@ -527,7 +527,7 @@ v2 of the $\sigma_0$ gate takes in a word that's split into $(3, 4, 3, 7, 1, 1, sr|ss|s23| $a_0$ | $a_1$ | $a_2$ | $a_3$ | $a_4$ | $a_5$ | $a_6$ | $a_7$ | --|--|---|-------------|------------|-----------------------------|------------|------------|------------|------------|------------| -0 |0 | 1 |{0,1,2,3,4,5}|$R_0^{even}$|$\texttt{spread}(R_0^{even})$| $b_0$ | $b'_0$ | $a$ | $a'$ | $e$ | +0 |0 | 1 |{0,1,2,3,4,5}|$R_0^{even}$|$\texttt{spread}(R_0^{even})$| $b_0$ | $b'_0$ | $a$ | $a'$ | $e$ | 0 |1 | 0 |{0,1,2,3,4,5}|$R_0^{odd}$ |$\texttt{spread}(R_0^{odd})$ | $\texttt{spread}(R_1^{odd})$| $\texttt{spread}(d)$| $\texttt{spread}(g)$ | 0 |0 | 1 |{0,1,2,3,4,5}|$R_1^{even}$|$\texttt{spread}(R_1^{even})$| $b_1$ | $b'_1$ | $c$ | $c'$ | $f$ | 1 |0 | 0 |{0,1,2,3,4,5}|$R_1^{odd}$ |$\texttt{spread}(R_1^{odd})$ | $R_1$ | $R_0$ |$R_0^{even}$|$R_0^{odd}$ | | @@ -548,13 +548,13 @@ RHS = & & & 4^{16} g &+& 4^{15} f &+& 4^{ 14} e &+& 4^{ 7} d &+& 4^{ 4} \end{array} $$ -- `sr` (reduce): +- `sr` (reduce): - $R_1^{even} + 2*R_1^{odd} - R_1 = 0$ - $R_0^{even} + 2*R_0^{odd} - R_0 = 0$ - `s23`: - `sr2` (2-bit range check) and `sr3` (3-bit range check) - - `ss2` (2-bit spread) and `ss3` (3-bit spread) - + - `ss2` (2-bit spread) and `ss3` (3-bit spread) + ### σ_1 gate #### v1 v1 of the $\sigma_1$ gate takes in a word that's split into $(10,7,2,13)$-bit chunks (already constrained by message scheduling). We refer to these chunks respectively as $(a, b, c, d).$ $b$ is further split into (2,2,3)-bit chunks $b_0,b_1,b_2.$ $\{b'_i\}_{i=0}^2, c'$ are the spread versions of the small chunks. We already have $\texttt{spread}(a)$ and $\texttt{spread}(d)$ from the message scheduling. @@ -582,13 +582,13 @@ RHS = & & & 4^{ 9} d &+& 4^{ 7} c &+& 4^{4} b_2 &+& 4^{2} b_1 &+& b_0 \end{array} $$ -- `sr` (reduce): +- `sr` (reduce): - $R_1^{even} + 2*R_1^{odd} - R_1 = 0$ - $R_0^{even} + 2*R_0^{odd} - R_0 = 0$ - `s23`: - `sr2` (2-bit range check) and `sr3` (3-bit range check) - - `ss2` (2-bit spread) and `ss3` (3-bit spread) -- `s22`: + - `ss2` (2-bit spread) and `ss3` (3-bit spread) +- `s22`: - `sr2` and `sr2` (two 2-bit range checks) - `ss2` and `ss2` (two 2-bit spreads) @@ -618,12 +618,12 @@ RHS = & &&&& & & 4^{ 9} g &+& 4^{ 7} f &+& 4^{ 7} e &+& d\;&+ \\ \end{array} $$ -- `sr` (reduce): +- `sr` (reduce): - $R_1^{even} + 2*R_1^{odd} - R_1 = 0$ - $R_0^{even} + 2*R_0^{odd} - R_0 = 0$ - `s23`: - `sr2` (2-bit range check) and `sr3` (3-bit range check) - - `ss2` (2-bit spread) and `ss3` (3-bit spread) + - `ss2` (2-bit spread) and `ss3` (3-bit spread) ### Helper gates @@ -631,13 +631,13 @@ $$ #### Small range constraints Let $constrain_n(x) = \prod_{i=0}^n (x-i)$. Constraining this expression to equal zero enforces that $x$ is in $[0..n].$ -#### 2-bit range check +#### 2-bit range check `sr2`: $(a - 3)(a - 2)(a - 1)(a) = 0$ sr2| $a_0$ | ---|-------| 1 | a | - -#### 2-bit spread + +#### 2-bit spread `ss2`: $l_1(a) + 4*l_2(a) + 5*l_3(a) - a' = 0$ ss2| $a_0$ | $a_1$ ---|-------|------ @@ -649,13 +649,13 @@ with interpolation polynomials: - $l_2(a) = \frac{(a - 3)(a - 1)(a)}{(-1)(1)(2)}$ ($\mathtt{spread}(10) = 0100$) - $l_3(a) = \frac{(a - 2)(a - 1)(a)}{(1)(2)(3)}$ ($\mathtt{spread}(11) = 0101$) -#### 3-bit range check +#### 3-bit range check `sr3`: $(a - 7)(a - 6)(a - 5)(a - 4)(a - 3)(a - 2)(a - 1)(a) = 0$ sr3| $a_0$ | ---|-------| 1 | a | - -#### 3-bit spread + +#### 3-bit spread `ss3`: $l_1(a) + 4*l_2(a) + 5*l_3(a) + 16*l_4(a) + 17*l_5(a) + 20*l_6(a) + 21*l_7(a) - a' = 0$ ss3| $a_0$ | $a_1$ ---|-------|------ @@ -674,7 +674,7 @@ with interpolation polynomials: #### reduce_6 gate Addition $\pmod{2^{32}}$ of 6 elements -Input: +Input: - $E$ - $\{e_i^{lo}, e_i^{hi}\}_{i=0}^5$ - $carry$ @@ -709,7 +709,7 @@ sa|sc| $a_0$ | $a_1$ |$a_2$ |$a_3$ | #### reduce_7 gate Addition $\pmod{2^{32}}$ of 7 elements -Input: +Input: - $E$ - $\{e_i^{lo}, e_i^{hi}\}_{i=0}^6$ - $carry$ @@ -741,7 +741,7 @@ sw|sd0|sd1|sd2|sd3|sr |ss0|ss0_v2|ss1|ss1_v2|s22|s23| $a_0$ | $a_1$ 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | {0,1,2,3,4} | $W_{2}^{d(14)}$ | $\texttt{spread}(W_{2}^{d(14)})$ | $W_{2}^{a(3)}$ | $W_{2}^{b(4)}$ | $W_{2}$ |$\sigma_0(W_3)^{lo}$ |$\sigma_1(W_{16})^{lo}$ | $W_{11}^{lo}$ | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | {0,1,2} | $W_{2}^{c(11)}$ | $\texttt{spread}(W_{2}^{c(11)})$ | $W_{2}^{lo}$ | $W_{2}^{hi}$ | $W_{18}$ |$\sigma_0(W_3)^{hi}$ |$\sigma_1(W_{16})^{hi}$ | $W_{11}^{hi}$ | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | {0,1,2,3,4,5} | $R_0^{even}$ | $\texttt{spread}(R_0^{even})$ | $W_{2}^{b(4)lo}$ |$\texttt{spread}(W_{2}^{b(4)lo})$ | $W_{2}^{b(4) hi}$ |$\texttt{spread}(W_{2}^{b(4)hi})$| | | -0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | {0,1,2,3,4,5} | $R_1^{odd}$ | $\texttt{spread}(R_1^{odd})$ | $\sigma_0 v1 R_1$ | $\sigma_0 v1 R_0$ | $\sigma_0 v1 R_0^{even}$ | $\sigma_0 v1 R_0^{odd}$ | | | +0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | {0,1,2,3,4,5} | $R_1^{odd}$ | $\texttt{spread}(R_1^{odd})$ | $\sigma_0 v1 R_1$ | $\sigma_0 v1 R_0$ | $\sigma_0 v1 R_0^{even}$ | $\sigma_0 v1 R_0^{odd}$ | | | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | {0,1,2,3,4,5} | $R_0^{odd}$ | $\texttt{spread}(R_0^{odd})$ | $\texttt{spread}(R_1^{odd})$ |$\texttt{spread}(W_{2}^{c(11)})$ |$\texttt{spread}(W_{2}^{d(14)})$ | | | | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | {0,1,2,3,4,5} | $R_1^{even}$ | $\texttt{spread}(R_1^{even})$ | $W_{2}^{b(4)hi}$ |$\texttt{spread}(W_{2}^{b(4)hi})$ | $W_{2}^{a(3)}$ |$\texttt{spread}(W_{2}^{a(3)})$ | | | ..|...|...|...|...|...|...|... |...|... |...|...| ... | ... | ... | ... | ... | ... | ... | ... | ... | @@ -752,7 +752,7 @@ sw|sd0|sd1|sd2|sd3|sr |ss0|ss0_v2|ss1|ss1_v2|s22|s23| $a_0$ | $a_1$ 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | {0,1,2,3,4,5} | $R_0^{odd}$ | $\texttt{spread}(R_0^{odd})$ | $\texttt{spread}(R_1^{odd})$ |$\texttt{spread}(W_{15}^{d(7)})$ |$\texttt{spread}(W_{15}^{g(13)})$| | | | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | {0,1,2,3,4,5} | $R_1^{even}$ | $\texttt{spread}(R_1^{even})$ | $W_{15}^{b(4) hi}$ |$\texttt{spread}(W_{15}^{b(4)hi})$| $W_{15}^{c(3)}$ |$\texttt{spread}(W_{15}^{c(3)})$ | $W_{15}^{f(1)}$ | | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | {0,1,2,3,4,5} | $R_1^{odd}$ | $\texttt{spread}(R_1^{odd})$ | $\sigma_0 v2 R_0$ | $\sigma_0 v2 R_1$ |$\sigma_0 v2 R_0^{even}$ |$\sigma_0 v2 R_0^{odd}$ | | | -0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 1 | {0,1,2,3,4,5} | $R_0^{even}$ | $\texttt{spread}(R_0^{even})$ | $W_{15}^{b(4)lo}$ |$\texttt{spread}(W_{15}^{b(4)lo})$| $W_{15}^{a(3)}$ |$\texttt{spread}(W_{15}^{a(3)})$ | $W_{15}^{e(1)}$ | | +0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 1 | {0,1,2,3,4,5} | $R_0^{even}$ | $\texttt{spread}(R_0^{even})$ | $W_{15}^{b(4)lo}$ |$\texttt{spread}(W_{15}^{b(4)lo})$| $W_{15}^{a(3)}$ |$\texttt{spread}(W_{15}^{a(3)})$ | $W_{15}^{e(1)}$ | | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 1 | 0 | 0 | {0,1,2,3,4,5} | $R_0^{odd}$ | $\texttt{spread}(R_0^{odd})$ | $\texttt{spread}(R_1^{odd})$ | $\texttt{spread}(d)$ | $\texttt{spread}(g)$ | | | | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 1 | {0,1,2,3,4,5} | $R_1^{even}$ | $\texttt{spread}(R_1^{even})$ | $W_{15}^{b(4) hi}$ |$\texttt{spread}(W_{15}^{b(4)hi})$| $W_{15}^{c(3)}$ |$\texttt{spread}(W_{15}^{c(3)})$ | $W_{15}^{f(1)}$ | | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | {0,1,2,3,4,5} | $R_1^{odd}$ | $\texttt{spread}(R_1^{odd})$ | $\sigma_1 v2 R_0$ | $\sigma_1 v2 R_1$ |$\sigma_1 v2 R_0^{even}$ |$\sigma_1 v2 R_0^{odd}$ | | | @@ -831,10 +831,10 @@ Constraints: - decomposes $A$ into $(2, 11, 3, 3, 3, 10)$-bit subpieces - spreads each of the subpieces - outputs $R_0^{even}, R_1^{even}$ -3. decompose $B$ +3. decompose $B$ - into $16$-bit subpieces - spread each of the subpieces -4. decompose $C$ +4. decompose $C$ - into $16$-bit subpieces - spread each of the subpieces 5. $Maj(A,B,C)$ @@ -845,10 +845,10 @@ Constraints: - decomposes $E$ into $(3, 3, 2, 3, 13, 7)$-bit subpieces - spreads each of the subpieces - outputs $R_0^{even}, R_1^{even}$ -8. decompose $F$ +8. decompose $F$ - into $16$-bit subpieces - spread each of the subpieces -9. decompose $G$ +9. decompose $G$ - into $16$-bit subpieces - spread each of the subpieces 10. $Ch(E,F,G)$ @@ -857,7 +857,7 @@ Constraints: 11. decompose $H$ into $16$-bit subpieces #### Round 2 (steady-state) -1. $reduce_7$ to get $A$ +1. $reduce_7$ to get $A$ - $H' = H_{prev} + Ch(E_{prev}, F_{prev}, G_{prev}) + \Sigma_1(E_{prev}) + K_1 + W_1$ - $reduce_7(H' + Maj(A_{prev}, B_{prev}, C_{prev}) + \Sigma_0(A_{prev}))$ - outputs $A_0, A_1$ 16-bit subpieces From 151adc83ddf67f93693a6fd355b68d1b61552c38 Mon Sep 17 00:00:00 2001 From: Jack Grigg Date: Wed, 23 Dec 2020 02:11:06 +0000 Subject: [PATCH 05/12] book: Document SHA-256 chip instructions and gadget interface --- book/src/design/gadgets.md | 3 ++ book/src/design/gadgets/sha256.md | 55 ++++++++++++++++++++++- book/src/design/gadgets/sha256/table16.md | 16 ++----- 3 files changed, 60 insertions(+), 14 deletions(-) diff --git a/book/src/design/gadgets.md b/book/src/design/gadgets.md index e69de29..a4bab16 100644 --- a/book/src/design/gadgets.md +++ b/book/src/design/gadgets.md @@ -0,0 +1,3 @@ +# Gadgets + +In this section we document the gadgets and chip designs provided by halo2. diff --git a/book/src/design/gadgets/sha256.md b/book/src/design/gadgets/sha256.md index 814ea45..daff12f 100644 --- a/book/src/design/gadgets/sha256.md +++ b/book/src/design/gadgets/sha256.md @@ -1,3 +1,56 @@ # SHA-256 -halo2 provides a SHA-256 gadget `halo2::gadget::sha256::Sha256` which... +## Specification + +SHA-256 is specified in [NIST FIPS PUB 180-4](https://nvlpubs.nist.gov/nistpubs/FIPS/NIST.FIPS.180-4.pdf). + +Unlike the specification, we use $\boxplus$ for addition modulo $2^{32}$, and $+$ for +field addition. $\oplus$ is used for XOR. + +## Gadget interface + +SHA-256 maintains state in eight 32-bit variables. It processes input as 512-bit blocks, +but internally splits these blocks into 32-bit chunks. We therefore designed the SHA-256 +gadget to consume input in 32-bit chunks. + +## Chip instructions + +The SHA-256 gadget requires a chip with the following instructions: + +```rust +pub trait Sha256Instructions: Chip { + /// Variable representing the SHA-256 internal state. + type State: Clone + fmt::Debug; + /// Variable representing a 32-bit word of the input block to the SHA-256 compression + /// function. + type BlockWord: Copy + fmt::Debug; + + /// Places the SHA-256 IV in the circuit, returning the initial state variable. + fn initialization_vector(layouter: &mut impl Layouter) -> Result; + + /// Starting from the given initial state, processes a block of input and returns the + /// final state. + fn compress( + layouter: &mut impl Layouter, + initial_state: &Self::State, + input: [Self::BlockWord; BLOCK_SIZE], + ) -> Result; + + /// Converts the given state into a message digest. + fn digest( + layouter: &mut impl Layouter, + state: &Self::State, + ) -> Result<[Self::BlockWord; DIGEST_SIZE], Error>; +} +``` + +TODO: Add instruction for computing padding. + +This set of instructions was chosen to strike a balance between the reusability of the +instructions, and the scope for chips to internally optimise them. In particular, we +considered splitting the compression function into its constituent parts (Ch, Maj etc), +and providing a compression function gadget that implemented the round logic. However, +this would prevent chips from using relative references between the various parts of a +compression round. Having an instruction that implements all compression rounds is also +similar to the Intel SHA extensions, which provide an instruction that performs multiple +compression rounds. diff --git a/book/src/design/gadgets/sha256/table16.md b/book/src/design/gadgets/sha256/table16.md index 5dc2250..4e36eab 100644 --- a/book/src/design/gadgets/sha256/table16.md +++ b/book/src/design/gadgets/sha256/table16.md @@ -1,19 +1,9 @@ # 16-bit table chip for SHA-256 -The main chip implementation for SHA-256 in halo2 is based around a 16-bit lookup table. -This requires a minimum of $2^{16}$ circuit rows, and is therefore suitable for use in -larger circuits. +This chip implementation is based around a single 16-bit lookup table. It requires a +minimum of $2^{16}$ circuit rows, and is therefore suitable for use in larger circuits. -## Specification - -SHA-256 is specified in [NIST FIPS PUB 180-4](https://nvlpubs.nist.gov/nistpubs/FIPS/NIST.FIPS.180-4.pdf). - -Unlike the specification, we use $\boxplus$ for addition modulo $2^{32}$, and $+$ for -field addition. - -$\oplus$ is used for XOR. - -Let's target a max constraint degree of $9$. That will allow us to handle constraining +We target a maximum constraint degree of $9$. That will allow us to handle constraining carries and "small pieces" to a range of up to $\{0..7\}$ in one row. ## Compression round From 00b33bd48e14db085ee77709432d8b9ddead5244 Mon Sep 17 00:00:00 2001 From: Jack Grigg Date: Wed, 23 Dec 2020 02:42:53 +0000 Subject: [PATCH 06/12] book: Rework documentation of modular addition for SHA-256 chip --- book/src/design/gadgets/sha256/table16.md | 50 +++++++++++++++-------- 1 file changed, 34 insertions(+), 16 deletions(-) diff --git a/book/src/design/gadgets/sha256/table16.md b/book/src/design/gadgets/sha256/table16.md index 4e36eab..6cd688e 100644 --- a/book/src/design/gadgets/sha256/table16.md +++ b/book/src/design/gadgets/sha256/table16.md @@ -8,6 +8,9 @@ carries and "small pieces" to a range of up to $\{0..7\}$ in one row. ## Compression round +There are $64$ compression rounds. Each round takes 32-bit values $A, B, C, D, E, F, G, H$ +as input, and performs the following operations: + $$ \begin{array}{rcl} Ch(E, F, G) &=& (E \wedge F) \oplus (¬E \wedge G) \\ @@ -23,28 +26,43 @@ $$ where $reduce_i$ must handle a carry in $\{0, \ldots, i-1\}$. -There are $64$ compression rounds. $A, B, C, D, E, F, G, H$ are $32$ bits each. Note that -we will rely on having each of these words in both "dense" and "spread" forms; this is -explained below. - ![The SHA-256 compression function](./compression.png) -$(a_L, a_H) \boxplus (b_L, b_H) = (c_L, c_H)$, where -$\hspace{3em}\_ \cdot 2^{32} + (c_H : \mathbb{Z}_{2^{16}}) \cdot 2^{16} + (c_L : \mathbb{Z}_{2^{16}}) = (a_H + b_H) \cdot 2^{16} + a_L + b_L$ - -Note that this correctly handles the carry from $a_L + b_L$. - -More generally any bit-decomposition of the output can be used, not just a decomposition -into $16$-bit chunks. - Define $\mathtt{spread}$ as a table mapping a $16$-bit input to an output interleaved with zero bits. We do not require a separate table for range checks because $\mathtt{spread}$ can be used. -In fact, this way we additionally get the "spread" form of the output for free; in -particular this is true for the output of the bottom-right $\boxplus$ which becomes -$A_{new}$, and the output of the leftmost $\boxplus$ which becomes $E_{new}$. We will use -this below to optimize $Maj$ and $Ch$. +### Modular addition + +To implement addition modulo $2^{32}$, we note that this is equivalent to adding the +operands using field addition, and then masking away all but the lowest 32 bits of the +result. For example, if we have two operands $a$ and $b$: + +$$a \boxplus b = c,$$ + +we decompose each operand (along with the result) into 16-bit chunks: + +$$(a_L : \mathbb{Z}_{2^{16}}, a_H : \mathbb{Z}_{2^{16}}) \boxplus (b_L : \mathbb{Z}_{2^{16}}, b_H : \mathbb{Z}_{2^{16}}) = (c_L : \mathbb{Z}_{2^{16}}, c_H : \mathbb{Z}_{2^{16}}),$$ + +and then reformulate the constraint using field addition: + +$$\mathsf{carry} \cdot 2^{32} + c_H \cdot 2^{16} + c_L = (a_H + b_H) \cdot 2^{16} + a_L + b_L.$$ + +More generally, any bit-decomposition of the output can be used, not just a decomposition +into 16-bit chunks. Note that this correctly handles the carry from $a_L + b_L$. + +This constraint requires that each chunk is correctly range-checked (or else an assignment +could overflow the field). + +- The operand and result chunks can be constrained using $\mathtt{spread}$, by looking up + each chunk in the "dense" column within a subset of the table. This way we additionally + get the "spread" form of the output for free; in particular this is true for the output + of the bottom-right $\boxplus$ which becomes $A_{new}$, and the output of the leftmost + $\boxplus$ which becomes $E_{new}$. We will use this below to optimize $Maj$ and $Ch$. + +- $\mathsf{carry}$ must be constrained to the precise range of allowed carry values for + the number of operands. We do this with a + [small range constraint](../../../user/tips-and-tricks.md#small-range-constraints). ### Maj function From 8cf0cdeda3495eb00a1678428e98991b63dcc2eb Mon Sep 17 00:00:00 2001 From: Jack Grigg Date: Wed, 23 Dec 2020 02:44:33 +0000 Subject: [PATCH 07/12] book: Update TOC entry for SHA-256 chip --- book/src/SUMMARY.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/book/src/SUMMARY.md b/book/src/SUMMARY.md index d42d24a..ed7f3f2 100644 --- a/book/src/SUMMARY.md +++ b/book/src/SUMMARY.md @@ -13,4 +13,4 @@ - [Lookup argument](design/lookup-argument.md) - [Gadgets](design/gadgets.md) - [SHA-256](design/gadgets/sha256.md) - - [Chip using a 16-bit lookup table](design/gadgets/sha256/table16.md) + - [16-bit table chip](design/gadgets/sha256/table16.md) From 7d37ff370b9851caf1286e94299a33e89450d9fc Mon Sep 17 00:00:00 2001 From: Jack Grigg Date: Wed, 23 Dec 2020 02:46:28 +0000 Subject: [PATCH 08/12] book: Fix internal links in Table16 chip --- book/src/design/gadgets/sha256/table16.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/book/src/design/gadgets/sha256/table16.md b/book/src/design/gadgets/sha256/table16.md index 6cd688e..1e9a7a0 100644 --- a/book/src/design/gadgets/sha256/table16.md +++ b/book/src/design/gadgets/sha256/table16.md @@ -439,7 +439,7 @@ $$ - `s23`: - `sr2` (2-bit range check) and `sr3` (3-bit range check) - `ss2` (2-bit spread) and `ss3` (3-bit spread) -(see section [Helper gates](#Helper-gates)) +(see section [Helper gates](#helper-gates)) Output: $\Sigma_0(A) = R^{even} = R_0^{even} + 2^{16} R_1^{even}$ @@ -487,7 +487,7 @@ $$ - `s33`: - `sr3` and `sr3` (two 3-bit range checks) - `ss3` and `ss3` (two 3-bit spreads) -(see section [Helper gates](#Helper-gates)) +(see section [Helper gates](#helper-gates)) Output: $\Sigma_1(E) = R^{even} = R_0^{even} + 2^{16} R_1^{even}$ @@ -528,7 +528,7 @@ $$ - `s3`: - `sr3` (3-bit range check) - `ss3` (3-bit spread) -(see section [Helper gates](#Helper-gates)) +(see section [Helper gates](#helper-gates)) #### v2 v2 of the $\sigma_0$ gate takes in a word that's split into $(3, 4, 3, 7, 1, 1, 13)$-bit chunks (already constrained by message scheduling). We refer to these chunks respectively as $(a, b, c, d, e, f, g).$ We already have $\mathtt{spread}(e), \mathtt{spread}(g)$ from the message scheduling. The 1-bit $e,f$ remain unchanged by the spread operation and can be used directly. We further split $b$ into two 2-bit chunks $b_0, b_1.$ $a', b'_0, b'_1, c'$ are the spread versions of the small chunks. From 0a9c13027623c4d902611f3ad9e28e43b9072bdb Mon Sep 17 00:00:00 2001 From: Jack Grigg Date: Wed, 23 Dec 2020 02:51:43 +0000 Subject: [PATCH 09/12] book: Fix table formatting --- book/src/design/gadgets/sha256/table16.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/book/src/design/gadgets/sha256/table16.md b/book/src/design/gadgets/sha256/table16.md index 1e9a7a0..65e9805 100644 --- a/book/src/design/gadgets/sha256/table16.md +++ b/book/src/design/gadgets/sha256/table16.md @@ -641,12 +641,14 @@ Let $constrain_n(x) = \prod_{i=0}^n (x-i)$. Constraining this expression to equa #### 2-bit range check `sr2`: $(a - 3)(a - 2)(a - 1)(a) = 0$ + sr2| $a_0$ | ---|-------| 1 | a | #### 2-bit spread `ss2`: $l_1(a) + 4*l_2(a) + 5*l_3(a) - a' = 0$ + ss2| $a_0$ | $a_1$ ---|-------|------ 1 | a | a' @@ -659,12 +661,14 @@ with interpolation polynomials: #### 3-bit range check `sr3`: $(a - 7)(a - 6)(a - 5)(a - 4)(a - 3)(a - 2)(a - 1)(a) = 0$ + sr3| $a_0$ | ---|-------| 1 | a | #### 3-bit spread `ss3`: $l_1(a) + 4*l_2(a) + 5*l_3(a) + 16*l_4(a) + 17*l_5(a) + 20*l_6(a) + 21*l_7(a) - a' = 0$ + ss3| $a_0$ | $a_1$ ---|-------|------ 1 | a | a' From 7fabdc1fe48a276262b4d0e8d7716ea992858002 Mon Sep 17 00:00:00 2001 From: Jack Grigg Date: Wed, 23 Dec 2020 02:54:35 +0000 Subject: [PATCH 10/12] book: Mark diagram as plaintext so it doesn't get tested --- book/src/design/gadgets/sha256/table16.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/book/src/design/gadgets/sha256/table16.md b/book/src/design/gadgets/sha256/table16.md index 65e9805..a99094f 100644 --- a/book/src/design/gadgets/sha256/table16.md +++ b/book/src/design/gadgets/sha256/table16.md @@ -791,7 +791,7 @@ Constraints: ### Compression region -``` +```plaintext +----------------------------------------------------------+ | | | | From d5bae060f3e7d55c27d9ed751d37ba7140be6ca2 Mon Sep 17 00:00:00 2001 From: Jack Grigg Date: Wed, 23 Dec 2020 03:09:26 +0000 Subject: [PATCH 11/12] book: Zero-index message schedule in the giant table --- book/src/design/gadgets/sha256/table16.md | 50 +++++++++++------------ 1 file changed, 25 insertions(+), 25 deletions(-) diff --git a/book/src/design/gadgets/sha256/table16.md b/book/src/design/gadgets/sha256/table16.md index a99094f..68b4211 100644 --- a/book/src/design/gadgets/sha256/table16.md +++ b/book/src/design/gadgets/sha256/table16.md @@ -742,51 +742,51 @@ sa|sc| $a_0$ | $a_1$ |$a_2$ |$a_3$ |$a_4$ |$a_5$ |$a_6$ ### Message scheduling region For each block $M \in \{0,1\}^{512}$ of the padded message, $64$ words of $32$ bits each are constructed as follows: -- the first $16$ are obtained by splitting $M$ into $32$-bit blocks $$M = W_1 || W_2 || \cdots || W_{15} || W_{16};$$ +- the first $16$ are obtained by splitting $M$ into $32$-bit blocks $$M = W_0 || W_1 || \cdots || W_{14} || W_{15};$$ - the remaining $48$ words are constructed using the formula: -$$W_i = \sigma_1(W_{i-2}) \boxplus W_{i-7} \boxplus \sigma_0(W_{i-15}) \boxplus W_{i-16},$$ for $i = 17, \ldots, 64$. +$$W_i = \sigma_1(W_{i-2}) \boxplus W_{i-7} \boxplus \sigma_0(W_{i-15}) \boxplus W_{i-16},$$ for $i = 16, \ldots, 63$. sw|sd0|sd1|sd2|sd3|sr |ss0|ss0_v2|ss1|ss1_v2|s22|s23| $a_0$ | $a_1$ | $a_2$ | $a_3$ | $a_4$ | $a_5$ | $a_6$ | $a_7$ | $a_8$ | --|---|---|---|---|---|---|------|---|------|---|---|---------------|------------------|-----------------------------------|------------------------------|----------------------------------|---------------------------------|---------------------------------|------------------------|------------------------| -0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | {0,1,2,3,4,5} | $W_{1}^{lo}$ | $\texttt{spread}(W_{1}^{lo})$ | | | $W_{1}$ |$\sigma_0(W_2)^{lo}$ |$\sigma_1(W_{15})^{lo}$ | $W_{10}^{lo}$ | -1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | {0,1,2,3,4,5} | $W_{1}^{hi}$ | $\texttt{spread}(W_{1}^{hi})$ | $W_{1}^{lo}$ | $W_{1}^{hi}$ | $W_{17}$ |$\sigma_0(W_2)^{hi}$ |$\sigma_1(W_{15})^{hi}$ | $W_{10}^{hi}$ | -0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | {0,1,2,3,4} | $W_{2}^{d(14)}$ | $\texttt{spread}(W_{2}^{d(14)})$ | $W_{2}^{a(3)}$ | $W_{2}^{b(4)}$ | $W_{2}$ |$\sigma_0(W_3)^{lo}$ |$\sigma_1(W_{16})^{lo}$ | $W_{11}^{lo}$ | -1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | {0,1,2} | $W_{2}^{c(11)}$ | $\texttt{spread}(W_{2}^{c(11)})$ | $W_{2}^{lo}$ | $W_{2}^{hi}$ | $W_{18}$ |$\sigma_0(W_3)^{hi}$ |$\sigma_1(W_{16})^{hi}$ | $W_{11}^{hi}$ | -0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | {0,1,2,3,4,5} | $R_0^{even}$ | $\texttt{spread}(R_0^{even})$ | $W_{2}^{b(4)lo}$ |$\texttt{spread}(W_{2}^{b(4)lo})$ | $W_{2}^{b(4) hi}$ |$\texttt{spread}(W_{2}^{b(4)hi})$| | | +0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | {0,1,2,3,4,5} | $W_{0}^{lo}$ | $\texttt{spread}(W_{0}^{lo})$ | | | $W_{0}$ |$\sigma_0(W_1)^{lo}$ |$\sigma_1(W_{14})^{lo}$ | $W_{9}^{lo}$ | +1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | {0,1,2,3,4,5} | $W_{0}^{hi}$ | $\texttt{spread}(W_{0}^{hi})$ | $W_{0}^{lo}$ | $W_{0}^{hi}$ | $W_{16}$ |$\sigma_0(W_1)^{hi}$ |$\sigma_1(W_{14})^{hi}$ | $W_{9}^{hi}$ | +0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | {0,1,2,3,4} | $W_{1}^{d(14)}$ | $\texttt{spread}(W_{1}^{d(14)})$ | $W_{1}^{a(3)}$ | $W_{1}^{b(4)}$ | $W_{1}$ |$\sigma_0(W_2)^{lo}$ |$\sigma_1(W_{15})^{lo}$ | $W_{10}^{lo}$ | +1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | {0,1,2} | $W_{1}^{c(11)}$ | $\texttt{spread}(W_{1}^{c(11)})$ | $W_{1}^{lo}$ | $W_{1}^{hi}$ | $W_{17}$ |$\sigma_0(W_2)^{hi}$ |$\sigma_1(W_{15})^{hi}$ | $W_{10}^{hi}$ | +0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | {0,1,2,3,4,5} | $R_0^{even}$ | $\texttt{spread}(R_0^{even})$ | $W_{1}^{b(4)lo}$ |$\texttt{spread}(W_{1}^{b(4)lo})$ | $W_{1}^{b(4) hi}$ |$\texttt{spread}(W_{1}^{b(4)hi})$| | | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | {0,1,2,3,4,5} | $R_1^{odd}$ | $\texttt{spread}(R_1^{odd})$ | $\sigma_0 v1 R_1$ | $\sigma_0 v1 R_0$ | $\sigma_0 v1 R_0^{even}$ | $\sigma_0 v1 R_0^{odd}$ | | | -0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | {0,1,2,3,4,5} | $R_0^{odd}$ | $\texttt{spread}(R_0^{odd})$ | $\texttt{spread}(R_1^{odd})$ |$\texttt{spread}(W_{2}^{c(11)})$ |$\texttt{spread}(W_{2}^{d(14)})$ | | | | -0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | {0,1,2,3,4,5} | $R_1^{even}$ | $\texttt{spread}(R_1^{even})$ | $W_{2}^{b(4)hi}$ |$\texttt{spread}(W_{2}^{b(4)hi})$ | $W_{2}^{a(3)}$ |$\texttt{spread}(W_{2}^{a(3)})$ | | | +0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | {0,1,2,3,4,5} | $R_0^{odd}$ | $\texttt{spread}(R_0^{odd})$ | $\texttt{spread}(R_1^{odd})$ |$\texttt{spread}(W_{1}^{c(11)})$ |$\texttt{spread}(W_{1}^{d(14)})$ | | | | +0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | {0,1,2,3,4,5} | $R_1^{even}$ | $\texttt{spread}(R_1^{even})$ | $W_{1}^{b(4)hi}$ |$\texttt{spread}(W_{1}^{b(4)hi})$ | $W_{1}^{a(3)}$ |$\texttt{spread}(W_{1}^{a(3)})$ | | | ..|...|...|...|...|...|...|... |...|... |...|...| ... | ... | ... | ... | ... | ... | ... | ... | ... | -0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | {0,1,2,3} | $W_{15}^{g(13)}$ | $\texttt{spread}(W_{15}^{g(13)})$ | $W_{15}^{a(3)}$ | $W_{15}^{c(3)}$ | | | | | -0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | $W_{15}^{d(7)}$ | $\texttt{spread}(W_{15}^{d(7)})$ | $W_{15}^{e(1)}$ | $W_{15}^{f(1)}$ | $W_{15}$ |$\sigma_0(W_{16})^{lo}$ |$\sigma_1(W_{29})^{lo}$ | $W_{24}^{lo}$ | -1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | $W_{15}^{b(4)}$ | $\texttt{spread}(W_{15}^{b(4)})$ | $W_{15}^{lo}$ | $W_{15}^{hi}$ | $W_{31}$ |$\sigma_0(W_{16})^{hi}$ |$\sigma_1(W_{29})^{hi}$ | $W_{24}^{hi}$ | -0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | {0,1,2,3,4,5} | $R_0^{even}$ | $\texttt{spread}(R_0^{even})$ | $W_{15}^{b(4)lo}$ |$\texttt{spread}(W_{15}^{b(4)lo})$| $W_{15}^{a(3)}$ |$\texttt{spread}(W_{15}^{a(3)})$ | $W_{15}^{e(1)}$ | | -0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | {0,1,2,3,4,5} | $R_0^{odd}$ | $\texttt{spread}(R_0^{odd})$ | $\texttt{spread}(R_1^{odd})$ |$\texttt{spread}(W_{15}^{d(7)})$ |$\texttt{spread}(W_{15}^{g(13)})$| | | | -0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | {0,1,2,3,4,5} | $R_1^{even}$ | $\texttt{spread}(R_1^{even})$ | $W_{15}^{b(4) hi}$ |$\texttt{spread}(W_{15}^{b(4)hi})$| $W_{15}^{c(3)}$ |$\texttt{spread}(W_{15}^{c(3)})$ | $W_{15}^{f(1)}$ | | +0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | {0,1,2,3} | $W_{14}^{g(13)}$ | $\texttt{spread}(W_{14}^{g(13)})$ | $W_{14}^{a(3)}$ | $W_{14}^{c(3)}$ | | | | | +0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | $W_{14}^{d(7)}$ | $\texttt{spread}(W_{14}^{d(7)})$ | $W_{14}^{e(1)}$ | $W_{14}^{f(1)}$ | $W_{14}$ |$\sigma_0(W_{15})^{lo}$ |$\sigma_1(W_{28})^{lo}$ | $W_{23}^{lo}$ | +1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | $W_{14}^{b(4)}$ | $\texttt{spread}(W_{14}^{b(4)})$ | $W_{14}^{lo}$ | $W_{14}^{hi}$ | $W_{30}$ |$\sigma_0(W_{15})^{hi}$ |$\sigma_1(W_{28})^{hi}$ | $W_{23}^{hi}$ | +0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | {0,1,2,3,4,5} | $R_0^{even}$ | $\texttt{spread}(R_0^{even})$ | $W_{14}^{b(4)lo}$ |$\texttt{spread}(W_{14}^{b(4)lo})$| $W_{14}^{a(3)}$ |$\texttt{spread}(W_{14}^{a(3)})$ | $W_{14}^{e(1)}$ | | +0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | {0,1,2,3,4,5} | $R_0^{odd}$ | $\texttt{spread}(R_0^{odd})$ | $\texttt{spread}(R_1^{odd})$ |$\texttt{spread}(W_{14}^{d(7)})$ |$\texttt{spread}(W_{14}^{g(13)})$| | | | +0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | {0,1,2,3,4,5} | $R_1^{even}$ | $\texttt{spread}(R_1^{even})$ | $W_{14}^{b(4) hi}$ |$\texttt{spread}(W_{14}^{b(4)hi})$| $W_{14}^{c(3)}$ |$\texttt{spread}(W_{14}^{c(3)})$ | $W_{14}^{f(1)}$ | | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | {0,1,2,3,4,5} | $R_1^{odd}$ | $\texttt{spread}(R_1^{odd})$ | $\sigma_0 v2 R_0$ | $\sigma_0 v2 R_1$ |$\sigma_0 v2 R_0^{even}$ |$\sigma_0 v2 R_0^{odd}$ | | | -0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 1 | {0,1,2,3,4,5} | $R_0^{even}$ | $\texttt{spread}(R_0^{even})$ | $W_{15}^{b(4)lo}$ |$\texttt{spread}(W_{15}^{b(4)lo})$| $W_{15}^{a(3)}$ |$\texttt{spread}(W_{15}^{a(3)})$ | $W_{15}^{e(1)}$ | | +0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 1 | {0,1,2,3,4,5} | $R_0^{even}$ | $\texttt{spread}(R_0^{even})$ | $W_{14}^{b(4)lo}$ |$\texttt{spread}(W_{14}^{b(4)lo})$| $W_{14}^{a(3)}$ |$\texttt{spread}(W_{14}^{a(3)})$ | $W_{14}^{e(1)}$ | | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 1 | 0 | 0 | {0,1,2,3,4,5} | $R_0^{odd}$ | $\texttt{spread}(R_0^{odd})$ | $\texttt{spread}(R_1^{odd})$ | $\texttt{spread}(d)$ | $\texttt{spread}(g)$ | | | | -0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 1 | {0,1,2,3,4,5} | $R_1^{even}$ | $\texttt{spread}(R_1^{even})$ | $W_{15}^{b(4) hi}$ |$\texttt{spread}(W_{15}^{b(4)hi})$| $W_{15}^{c(3)}$ |$\texttt{spread}(W_{15}^{c(3)})$ | $W_{15}^{f(1)}$ | | +0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 1 | {0,1,2,3,4,5} | $R_1^{even}$ | $\texttt{spread}(R_1^{even})$ | $W_{14}^{b(4) hi}$ |$\texttt{spread}(W_{14}^{b(4)hi})$| $W_{14}^{c(3)}$ |$\texttt{spread}(W_{14}^{c(3)})$ | $W_{14}^{f(1)}$ | | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | {0,1,2,3,4,5} | $R_1^{odd}$ | $\texttt{spread}(R_1^{odd})$ | $\sigma_1 v2 R_0$ | $\sigma_1 v2 R_1$ |$\sigma_1 v2 R_0^{even}$ |$\sigma_1 v2 R_0^{odd}$ | | | ..|...|...|...|...|...|...|... |...|... |...|...| ... | ... | ... | ... | ... | ... | ... | ... | ... | -0 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | {0,1,2,3} | $W_{50}^{d(13)}$ | $\texttt{spread}(W_{50}^{d(13)})$ | $W_{50}^{c(2}$ | $W_{50}^{b(7)}$ | $W_{50}$ | | | | -0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | {0,1} | $W_{50}^{a(10)}$ | $\texttt{spread}(W_{50}^{a(10)})$ | $W_{50}^{lo}$ | $W_{50}^{hi}$ | | | | | +0 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | {0,1,2,3} | $W_{49}^{d(13)}$ | $\texttt{spread}(W_{49}^{d(13)})$ | $W_{49}^{c(2}$ | $W_{49}^{b(7)}$ | $W_{49}$ | | | | +0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | {0,1} | $W_{49}^{a(10)}$ | $\texttt{spread}(W_{49}^{a(10)})$ | $W_{49}^{lo}$ | $W_{49}^{hi}$ | | | | | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | | | insert $\sigma_1(W_{14})$ v1 | | | | | | | ..|...|...|...|...|...|...|... |...|... |...|...| ... | ... | ... | ... | ... | ... | ... | ... | ... | +0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | {0,1,2,3,4,5} | $W_{62}^{lo}$ | $\texttt{spread}(W_{62}^{lo})$ | | | $W_{62}$ | | | | +0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | {0,1,2,3,4,5} | $W_{62}^{hi}$ | $\texttt{spread}(W_{62}^{hi})$ | | | | | | | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | {0,1,2,3,4,5} | $W_{63}^{lo}$ | $\texttt{spread}(W_{63}^{lo})$ | | | $W_{63}$ | | | | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | {0,1,2,3,4,5} | $W_{63}^{hi}$ | $\texttt{spread}(W_{63}^{hi})$ | | | | | | | -0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | {0,1,2,3,4,5} | $W_{64}^{lo}$ | $\texttt{spread}(W_{64}^{lo})$ | | | $W_{64}$ | | | | -0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | {0,1,2,3,4,5} | $W_{64}^{hi}$ | $\texttt{spread}(W_{64}^{hi})$ | | | | | | | Constraints: - `sw`: construct word using $reduce_4$ -- `sd0`: decomposition gate for $W_1, W_{63}, W_{64}$ +- `sd0`: decomposition gate for $W_0, W_{62}, W_{63}$ - $W^{lo} + 2^{16} W^{hi} - W = 0$ -- `sd1`: decomposition gate for $W_{2..14}$ (split into $(3,4,11,14)$-bit pieces) +- `sd1`: decomposition gate for $W_{1..13}$ (split into $(3,4,11,14)$-bit pieces) - $W^{3b} + 2^3 W^{4b} + 2^7 W^{11b} + 2^{18} W^{14b} - W = 0$ - $W^{lo} + 2^{16} W^{hi} - W = 0$ -- `sd2`: decomposition gate for $W_{15..49}$ (split into $(3,4,3,7,1,1 ,13)$-bit pieces) -- `sd3`: decomposition gate for $W_{50..62}$ (split into $(10,7,2,13)$-bit pieces) +- `sd2`: decomposition gate for $W_{14..48}$ (split into $(3,4,3,7,1,1 ,13)$-bit pieces) +- `sd3`: decomposition gate for $W_{49..61}$ (split into $(10,7,2,13)$-bit pieces) ### Compression region From 00cb254141fea313db30285104220e87d17d09e9 Mon Sep 17 00:00:00 2001 From: therealyingtong Date: Wed, 23 Dec 2020 13:33:33 +0800 Subject: [PATCH 12/12] Inline sigma_0 v1 in message scheduling region --- book/src/design/gadgets/sha256/table16.md | 65 ++++++++++++----------- 1 file changed, 34 insertions(+), 31 deletions(-) diff --git a/book/src/design/gadgets/sha256/table16.md b/book/src/design/gadgets/sha256/table16.md index 68b4211..2f8264c 100644 --- a/book/src/design/gadgets/sha256/table16.md +++ b/book/src/design/gadgets/sha256/table16.md @@ -746,37 +746,40 @@ For each block $M \in \{0,1\}^{512}$ of the padded message, $64$ words of $32$ b - the remaining $48$ words are constructed using the formula: $$W_i = \sigma_1(W_{i-2}) \boxplus W_{i-7} \boxplus \sigma_0(W_{i-15}) \boxplus W_{i-16},$$ for $i = 16, \ldots, 63$. -sw|sd0|sd1|sd2|sd3|sr |ss0|ss0_v2|ss1|ss1_v2|s22|s23| $a_0$ | $a_1$ | $a_2$ | $a_3$ | $a_4$ | $a_5$ | $a_6$ | $a_7$ | $a_8$ | ---|---|---|---|---|---|---|------|---|------|---|---|---------------|------------------|-----------------------------------|------------------------------|----------------------------------|---------------------------------|---------------------------------|------------------------|------------------------| -0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | {0,1,2,3,4,5} | $W_{0}^{lo}$ | $\texttt{spread}(W_{0}^{lo})$ | | | $W_{0}$ |$\sigma_0(W_1)^{lo}$ |$\sigma_1(W_{14})^{lo}$ | $W_{9}^{lo}$ | -1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | {0,1,2,3,4,5} | $W_{0}^{hi}$ | $\texttt{spread}(W_{0}^{hi})$ | $W_{0}^{lo}$ | $W_{0}^{hi}$ | $W_{16}$ |$\sigma_0(W_1)^{hi}$ |$\sigma_1(W_{14})^{hi}$ | $W_{9}^{hi}$ | -0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | {0,1,2,3,4} | $W_{1}^{d(14)}$ | $\texttt{spread}(W_{1}^{d(14)})$ | $W_{1}^{a(3)}$ | $W_{1}^{b(4)}$ | $W_{1}$ |$\sigma_0(W_2)^{lo}$ |$\sigma_1(W_{15})^{lo}$ | $W_{10}^{lo}$ | -1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | {0,1,2} | $W_{1}^{c(11)}$ | $\texttt{spread}(W_{1}^{c(11)})$ | $W_{1}^{lo}$ | $W_{1}^{hi}$ | $W_{17}$ |$\sigma_0(W_2)^{hi}$ |$\sigma_1(W_{15})^{hi}$ | $W_{10}^{hi}$ | -0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | {0,1,2,3,4,5} | $R_0^{even}$ | $\texttt{spread}(R_0^{even})$ | $W_{1}^{b(4)lo}$ |$\texttt{spread}(W_{1}^{b(4)lo})$ | $W_{1}^{b(4) hi}$ |$\texttt{spread}(W_{1}^{b(4)hi})$| | | -0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | {0,1,2,3,4,5} | $R_1^{odd}$ | $\texttt{spread}(R_1^{odd})$ | $\sigma_0 v1 R_1$ | $\sigma_0 v1 R_0$ | $\sigma_0 v1 R_0^{even}$ | $\sigma_0 v1 R_0^{odd}$ | | | -0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | {0,1,2,3,4,5} | $R_0^{odd}$ | $\texttt{spread}(R_0^{odd})$ | $\texttt{spread}(R_1^{odd})$ |$\texttt{spread}(W_{1}^{c(11)})$ |$\texttt{spread}(W_{1}^{d(14)})$ | | | | -0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | {0,1,2,3,4,5} | $R_1^{even}$ | $\texttt{spread}(R_1^{even})$ | $W_{1}^{b(4)hi}$ |$\texttt{spread}(W_{1}^{b(4)hi})$ | $W_{1}^{a(3)}$ |$\texttt{spread}(W_{1}^{a(3)})$ | | | -..|...|...|...|...|...|...|... |...|... |...|...| ... | ... | ... | ... | ... | ... | ... | ... | ... | -0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | {0,1,2,3} | $W_{14}^{g(13)}$ | $\texttt{spread}(W_{14}^{g(13)})$ | $W_{14}^{a(3)}$ | $W_{14}^{c(3)}$ | | | | | -0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | $W_{14}^{d(7)}$ | $\texttt{spread}(W_{14}^{d(7)})$ | $W_{14}^{e(1)}$ | $W_{14}^{f(1)}$ | $W_{14}$ |$\sigma_0(W_{15})^{lo}$ |$\sigma_1(W_{28})^{lo}$ | $W_{23}^{lo}$ | -1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | $W_{14}^{b(4)}$ | $\texttt{spread}(W_{14}^{b(4)})$ | $W_{14}^{lo}$ | $W_{14}^{hi}$ | $W_{30}$ |$\sigma_0(W_{15})^{hi}$ |$\sigma_1(W_{28})^{hi}$ | $W_{23}^{hi}$ | -0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | {0,1,2,3,4,5} | $R_0^{even}$ | $\texttt{spread}(R_0^{even})$ | $W_{14}^{b(4)lo}$ |$\texttt{spread}(W_{14}^{b(4)lo})$| $W_{14}^{a(3)}$ |$\texttt{spread}(W_{14}^{a(3)})$ | $W_{14}^{e(1)}$ | | -0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | {0,1,2,3,4,5} | $R_0^{odd}$ | $\texttt{spread}(R_0^{odd})$ | $\texttt{spread}(R_1^{odd})$ |$\texttt{spread}(W_{14}^{d(7)})$ |$\texttt{spread}(W_{14}^{g(13)})$| | | | -0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | {0,1,2,3,4,5} | $R_1^{even}$ | $\texttt{spread}(R_1^{even})$ | $W_{14}^{b(4) hi}$ |$\texttt{spread}(W_{14}^{b(4)hi})$| $W_{14}^{c(3)}$ |$\texttt{spread}(W_{14}^{c(3)})$ | $W_{14}^{f(1)}$ | | -0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | {0,1,2,3,4,5} | $R_1^{odd}$ | $\texttt{spread}(R_1^{odd})$ | $\sigma_0 v2 R_0$ | $\sigma_0 v2 R_1$ |$\sigma_0 v2 R_0^{even}$ |$\sigma_0 v2 R_0^{odd}$ | | | -0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 1 | {0,1,2,3,4,5} | $R_0^{even}$ | $\texttt{spread}(R_0^{even})$ | $W_{14}^{b(4)lo}$ |$\texttt{spread}(W_{14}^{b(4)lo})$| $W_{14}^{a(3)}$ |$\texttt{spread}(W_{14}^{a(3)})$ | $W_{14}^{e(1)}$ | | -0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 1 | 0 | 0 | {0,1,2,3,4,5} | $R_0^{odd}$ | $\texttt{spread}(R_0^{odd})$ | $\texttt{spread}(R_1^{odd})$ | $\texttt{spread}(d)$ | $\texttt{spread}(g)$ | | | | -0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 1 | {0,1,2,3,4,5} | $R_1^{even}$ | $\texttt{spread}(R_1^{even})$ | $W_{14}^{b(4) hi}$ |$\texttt{spread}(W_{14}^{b(4)hi})$| $W_{14}^{c(3)}$ |$\texttt{spread}(W_{14}^{c(3)})$ | $W_{14}^{f(1)}$ | | -0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | {0,1,2,3,4,5} | $R_1^{odd}$ | $\texttt{spread}(R_1^{odd})$ | $\sigma_1 v2 R_0$ | $\sigma_1 v2 R_1$ |$\sigma_1 v2 R_0^{even}$ |$\sigma_1 v2 R_0^{odd}$ | | | -..|...|...|...|...|...|...|... |...|... |...|...| ... | ... | ... | ... | ... | ... | ... | ... | ... | -0 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | {0,1,2,3} | $W_{49}^{d(13)}$ | $\texttt{spread}(W_{49}^{d(13)})$ | $W_{49}^{c(2}$ | $W_{49}^{b(7)}$ | $W_{49}$ | | | | -0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | {0,1} | $W_{49}^{a(10)}$ | $\texttt{spread}(W_{49}^{a(10)})$ | $W_{49}^{lo}$ | $W_{49}^{hi}$ | | | | | -0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | | | insert $\sigma_1(W_{14})$ v1 | | | | | | | -..|...|...|...|...|...|...|... |...|... |...|...| ... | ... | ... | ... | ... | ... | ... | ... | ... | -0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | {0,1,2,3,4,5} | $W_{62}^{lo}$ | $\texttt{spread}(W_{62}^{lo})$ | | | $W_{62}$ | | | | -0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | {0,1,2,3,4,5} | $W_{62}^{hi}$ | $\texttt{spread}(W_{62}^{hi})$ | | | | | | | -0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | {0,1,2,3,4,5} | $W_{63}^{lo}$ | $\texttt{spread}(W_{63}^{lo})$ | | | $W_{63}$ | | | | -0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | {0,1,2,3,4,5} | $W_{63}^{hi}$ | $\texttt{spread}(W_{63}^{hi})$ | | | | | | | +sw|sd0|sd1|sd2|sd3|sr |ss0|ss0_v2|ss1|ss1_v2|s22|s23| $a_0$ | $a_1$ | $a_2$ | $a_3$ | $a_4$ | $a_5$ | $a_6$ | $a_7$ | $a_8$ | +--|---|---|---|---|---|---|------|---|------|---|---|---------------|------------------|-----------------------------------|------------------------------|----------------------------------|---------------------------------|--------------------------------- |------------------------|------------------------| +0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | {0,1,2,3,4,5} | $W_{0}^{lo}$ | $\texttt{spread}(W_{0}^{lo})$ | | | $W_{0}$ |$\sigma_0(W_1)^{lo}$ |$\sigma_1(W_{14})^{lo}$ | $W_{9}^{lo}$ | +1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | {0,1,2,3,4,5} | $W_{0}^{hi}$ | $\texttt{spread}(W_{0}^{hi})$ | $W_{0}^{lo}$ | $W_{0}^{hi}$ | $W_{16}$ |$\sigma_0(W_1)^{hi}$ |$\sigma_1(W_{14})^{hi}$ | $W_{9}^{hi}$ | +0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | {0,1,2,3,4} | $W_{1}^{d(14)}$ | $\texttt{spread}(W_{1}^{d(14)})$ | $W_{1}^{a(3)}$ | $W_{1}^{b(4)}$ | $W_{1}$ |$\sigma_0(W_2)^{lo}$ |$\sigma_1(W_{15})^{lo}$ | $W_{10}^{lo}$ | +1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | {0,1,2} | $W_{1}^{c(11)}$ | $\texttt{spread}(W_{1}^{c(11)})$ | $W_{1}^{lo}$ | $W_{1}^{hi}$ | $W_{17}$ |$\sigma_0(W_2)^{hi}$ |$\sigma_1(W_{15})^{hi}$ | $W_{10}^{hi}$ | +0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | {0,1,2,3,4,5} | $R_0^{even}$ | $\texttt{spread}(R_0^{even})$ | $W_{1}^{b(4)lo}$ |$\texttt{spread}(W_{1}^{b(4)lo})$ | $W_{1}^{b(4) hi}$ |$\texttt{spread}(W_{1}^{b(4)hi})$ | | | +0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | {0,1,2,3,4,5} | $R_1^{odd}$ | $\texttt{spread}(R_1^{odd})$ | $\sigma_0 v1 R_1$ | $\sigma_0 v1 R_0$ | $\sigma_0 v1 R_0^{even}$ | $\sigma_0 v1 R_0^{odd}$ | | | +0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | {0,1,2,3,4,5} | $R_0^{odd}$ | $\texttt{spread}(R_0^{odd})$ | $\texttt{spread}(R_1^{odd})$ |$\texttt{spread}(W_{1}^{c(11)})$ |$\texttt{spread}(W_{1}^{d(14)})$ | | | | +0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | {0,1,2,3,4,5} | $R_1^{even}$ | $\texttt{spread}(R_1^{even})$ | $W_{1}^{b(4)hi}$ |$\texttt{spread}(W_{1}^{b(4)hi})$ | $W_{1}^{a(3)}$ |$\texttt{spread}(W_{1}^{a(3)})$ | | | +..|...|...|...|...|...|...|... |...|... |...|...| ... | ... | ... | ... | ... | ... | ... | ... | ... | +0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | {0,1,2,3} | $W_{14}^{g(13)}$ | $\texttt{spread}(W_{14}^{g(13)})$ | $W_{14}^{a(3)}$ | $W_{14}^{c(3)}$ | | | | | +0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | $W_{14}^{d(7)}$ | $\texttt{spread}(W_{14}^{d(7)})$ | $W_{14}^{e(1)}$ | $W_{14}^{f(1)}$ | $W_{14}$ |$\sigma_0(W_{15})^{lo}$ |$\sigma_1(W_{28})^{lo}$ | $W_{23}^{lo}$ | +1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | $W_{14}^{b(4)}$ | $\texttt{spread}(W_{14}^{b(4)})$ | $W_{14}^{lo}$ | $W_{14}^{hi}$ | $W_{30}$ |$\sigma_0(W_{15})^{hi}$ |$\sigma_1(W_{28})^{hi}$ | $W_{23}^{hi}$ | +0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | {0,1,2,3,4,5} | $R_0^{even}$ | $\texttt{spread}(R_0^{even})$ | $W_{14}^{b(4)lo}$ |$\texttt{spread}(W_{14}^{b(4)lo})$| $W_{14}^{a(3)}$ |$\texttt{spread}(W_{14}^{a(3)})$ | $W_{14}^{e(1)}$ | | +0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | {0,1,2,3,4,5} | $R_0^{odd}$ | $\texttt{spread}(R_0^{odd})$ | $\texttt{spread}(R_1^{odd})$ |$\texttt{spread}(W_{14}^{d(7)})$ |$\texttt{spread}(W_{14}^{g(13)})$| | | | +0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | {0,1,2,3,4,5} | $R_1^{even}$ | $\texttt{spread}(R_1^{even})$ | $W_{14}^{b(4) hi}$ |$\texttt{spread}(W_{14}^{b(4)hi})$| $W_{14}^{c(3)}$ |$\texttt{spread}(W_{14}^{c(3)})$ | $W_{14}^{f(1)}$ | | +0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | {0,1,2,3,4,5} | $R_1^{odd}$ | $\texttt{spread}(R_1^{odd})$ | $\sigma_0 v2 R_0$ | $\sigma_0 v2 R_1$ |$\sigma_0 v2 R_0^{even}$ |$\sigma_0 v2 R_0^{odd}$ | | | +0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 1 | {0,1,2,3,4,5} | $R_0^{even}$ | $\texttt{spread}(R_0^{even})$ | $W_{14}^{b(4)lo}$ |$\texttt{spread}(W_{14}^{b(4)lo})$| $W_{14}^{a(3)}$ |$\texttt{spread}(W_{14}^{a(3)})$ | $W_{14}^{e(1)}$ | | +0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 1 | 0 | 0 | {0,1,2,3,4,5} | $R_0^{odd}$ | $\texttt{spread}(R_0^{odd})$ | $\texttt{spread}(R_1^{odd})$ | $\texttt{spread}(d)$ | $\texttt{spread}(g)$ | | | | +0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 1 | {0,1,2,3,4,5} | $R_1^{even}$ | $\texttt{spread}(R_1^{even})$ | $W_{14}^{b(4) hi}$ |$\texttt{spread}(W_{14}^{b(4)hi})$| $W_{14}^{c(3)}$ |$\texttt{spread}(W_{14}^{c(3)})$ | $W_{14}^{f(1)}$ | | +0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | {0,1,2,3,4,5} | $R_1^{odd}$ | $\texttt{spread}(R_1^{odd})$ | $\sigma_1 v2 R_0$ | $\sigma_1 v2 R_1$ |$\sigma_1 v2 R_0^{even}$ |$\sigma_1 v2 R_0^{odd}$ | | | +..|...|...|...|...|...|...|... |...|... |...|...| ... | ... | ... | ... | ... | ... | ... | ... | ... | +0 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | {0,1,2,3} | $W_{49}^{d(13)}$ | $\texttt{spread}(W_{49}^{d(13)})$ | $W_{49}^{c(2}$ | $W_{49}^{b(7)}$ | $W_{49}$ | | | | +0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | {0,1} | $W_{49}^{a(10)}$ | $\texttt{spread}(W_{49}^{a(10)})$ | $W_{49}^{lo}$ | $W_{49}^{hi}$ | | | | | +0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 |{0,1,2,3,4,5} | $R_0^{even}$ | $\texttt{spread}(R_0^{even})$ | $W_{49}^{b(7)lo}$ |$\texttt{spread}(W_{49}^{b(7)lo})$| $W_{49}^{b(7)mid}$ |$\texttt{spread}(W_{49}^{b(7)mid})$| | | +0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 0 |{0,1,2,3,4,5} | $R_0^{odd}$ | $\texttt{spread}(R_0^{odd})$ | $\texttt{spread}(R_1^{odd})$ | $\texttt{spread}(a)$ | $\texttt{spread}(d)$ | | | | +0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 |{0,1,2,3,4,5} | $R_1^{even}$ | $\texttt{spread}(R_1^{even})$ | $W_{49}^{b(7)hi}$ |$\texttt{spread}(W_{49}^{b(7)hi})$| $W_{49}^{c(2)}$ |$\texttt{spread}(W_{49}^{c(2)})$ | | | +0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 1 | 0 | 0 | 0 |{0,1,2,3,4,5} | $R_1^{odd}$ | $\texttt{spread}(R_1^{odd})$ | $\sigma_1 v1 R_0$ | $\sigma_1 v1 R_1$ |$R_0^{even}$ |$R_0^{odd}$ | | | +..|...|...|...|...|...|...|... |...|... |...|...| ... | ... | ... | ... | ... | ... | ... | ... | ... | +0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | {0,1,2,3,4,5} | $W_{62}^{lo}$ | $\texttt{spread}(W_{62}^{lo})$ | | | $W_{62}$ | | | | +0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | {0,1,2,3,4,5} | $W_{62}^{hi}$ | $\texttt{spread}(W_{62}^{hi})$ | | | | | | | +0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | {0,1,2,3,4,5} | $W_{63}^{lo}$ | $\texttt{spread}(W_{63}^{lo})$ | | | $W_{63}$ | | | | +0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | {0,1,2,3,4,5} | $W_{63}^{hi}$ | $\texttt{spread}(W_{63}^{hi})$ | | | | | | | Constraints: - `sw`: construct word using $reduce_4$