You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
f268acf halfagg: Run rustfmt (Tim Ruffing)
5f9a3d6 halfagg: Fix z_0 = 1 as in CZ22 (Tim Ruffing)
1ab7cd8 halfagg: Extract computation of z into function randomizer() (Tim Ruffing)
Pull request description:
ACKs for top commit:
jonasnick:
ACK f268acf
Tree-SHA512: d66cd077dc7c41f2b5beb0197ff5965cc58e5067df1040e3b4863d579159b9e32e4b22dff1b7d527dc9a0c2142bbb51aaf559e401095baacd261ba76860c5dfc
Copy file name to clipboardExpand all lines: half-aggregation.mediawiki
+9-3
Original file line number
Diff line number
Diff line change
@@ -61,7 +61,7 @@ Moreover, they came up with an elegant approach to incremental aggregation that
61
61
* Incremental aggregation allows non-interactively aggregating additional BIP 340 signatures into an existing half-aggregate signature.
62
62
* A half-aggregate signature of ''u'' BIP 340 input signatures is serialized as the ''(u+1)⋅32''-byte array ''r<sub>1</sub> || ... || r<sub>u</sub> || bytes(s)'' where ''r<sub>i</sub>'' is a 32-byte array from input signature ''i'' and ''s'' is a scalar aggregate (see below for details).
63
63
* This document does ''not'' specify the aggregation of multiple aggregate signatures (yet). It is possible, but requires changing the encoding of an aggregate signature. Since it is not possible to undo the aggregation of the s-values, when verifying of such an aggregate signature the randomizers need to be the same as when verifying the individual aggregate signature. Therefore, the aggregate signature needs to encode a tree that reveals how the individual signatures were aggregated and how the resulting aggregate signatures were reaggregated.
64
-
* There is a possible optimization where the first randomizer ''z<sub>0</sub>'' is set to the constant ''1'' which speeds up verification because ''z<sub>0</sub>⋅R<sub>0</sub> = R<sub>0</sub>''. This specification does not make use of this optimization yet (TODO).
64
+
* The first randomizer ''z<sub>0</sub>'' is fixed to the constant ''1'', which speeds up verification because ''z<sub>0</sub>⋅R<sub>0</sub> = R<sub>0</sub>''. This optimization has been suggested and proven secure by [https://eprint.iacr.org/2022/222.pdf Chen and Zhao].
65
65
* The maximum number of signatures that can be aggregated is ''2<sup>16</sup> - 1''. Having a maximum value is supposed to prevent integer overflows. This specific value was a conservative choice and may be raised in the future (TODO).
66
66
67
67
== Description ==
@@ -147,7 +147,10 @@ Input:
147
147
** Let ''(pk<sub>i</sub>, m<sub>i</sub>, sig<sub>i</sub>) = pms_to_agg<sub>i-v</sub>''
148
148
** Let ''r<sub>i</sub> = sig<sub>i</sub>[0:32]''
149
149
** Let ''s<sub>i</sub> = int(sig<sub>i</sub>[32:64])''
150
-
** Let ''z<sub>i</sub> = int(hash<sub>HalfAgg/randomizer</sub>(r<sub>0</sub> || pk<sub>0</sub> || m<sub>0</sub> || ... || r<sub>i</sub> || pk<sub>i</sub> || m<sub>i</sub>)) mod n''
150
+
** If ''i = 0'':
151
+
*** Let ''z<sub>i</sub> = 1''
152
+
** Else:
153
+
*** Let ''z<sub>i</sub> = int(hash<sub>HalfAgg/randomizer</sub>(r<sub>0</sub> || pk<sub>0</sub> || m<sub>0</sub> || ... || r<sub>i</sub> || pk<sub>i</sub> || m<sub>i</sub>)) mod n''
151
154
* Let ''s = int(aggsig[(v⋅32:(v+1)⋅32]) + z<sub>v</sub>⋅s<sub>v</sub> + ... + z<sub>v+u-1</sub>⋅s<sub>v+u-1</sub> mod n''
0 commit comments