<oembed><type>rich</type><version>1.0</version><title>Tom Trevethan [ARCHIVE] wrote</title><author_name>Tom Trevethan [ARCHIVE] (npub1ax…wyw7n)</author_name><author_url>https://yabu.me/npub1axshsyxsl3vasj4z9549rvwdvhjmh52fw0ayj3ghtmdezx8cnuxqlwyw7n</author_url><provider_name>njump</provider_name><provider_url>https://yabu.me</provider_url><html>📅 Original date posted:2023-07-24&#xA;🗒️ Summary of this message: The sender acknowledges that the full scheme should have multiple nonces and compute b, but it doesn&#39;t change the approach to blinding.&#xA;📝 Original message:&#xA;Hi ZmnSCPxj,&#xA;&#xA;Yes, you are correct - the full scheme (&#xA;https://eprint.iacr.org/2020/1261.pdf) should have two or more nonces (and&#xA;also compute b). I don&#39;t think this changes the approach to blinding&#xA;however.&#xA;&#xA;On Mon, Jul 24, 2023 at 11:50 AM ZmnSCPxj &lt;ZmnSCPxj at protonmail.com&gt; wrote:&#xA;&#xA;&gt; Good morning Tom,&#xA;&gt;&#xA;&gt; Would this allow party 2 to itself be composed of N &gt;= 2 parties?&#xA;&gt;&#xA;&gt; MuSig2 (as opposed to MuSig1) requires that signatories provide multiple&#xA;&gt; `R` points, not just one each, which are finally aggregated by first&#xA;&gt; combining them using the MuSig() public key compose function.&#xA;&gt; This prevents party 2 from creating an `R` that may allow it to perform&#xA;&gt; certain attacks whose name escapes me right now but which I used to know.&#xA;&gt; (it is the reason why MuSig1 requires 3 round trips, and why MuSig2&#xA;&gt; requires at least 2 `R` nonces per signatory)&#xA;&gt;&#xA;&gt; Your scheme has only one `R` per party, would it not be vulnerably to that&#xA;&gt; attack?&#xA;&gt;&#xA;&gt; Regards,&#xA;&gt; ZmnSCPxj&#xA;&gt;&#xA;&gt;&#xA;&gt; Sent with Proton Mail secure email.&#xA;&gt;&#xA;&gt; ------- Original Message -------&#xA;&gt; On Monday, July 24th, 2023 at 7:46 AM, Tom Trevethan via bitcoin-dev &lt;&#xA;&gt; bitcoin-dev at lists.linuxfoundation.org&gt; wrote:&#xA;&gt;&#xA;&gt;&#xA;&gt; &gt; We are implementing a version of 2-of-2 Schnorr Musig2 for statechains&#xA;&gt; where the server (party 1 in the 2-of-2) will be fully &#39;blinded&#39; - in that&#xA;&gt; it can hold a private key that is required to generate an aggregate&#xA;&gt; signature on an aggregate public key, but that it does not learn either: 1)&#xA;&gt; The aggregate public key 2) The aggregate signature and 3) The message (m)&#xA;&gt; being signed.&#xA;&gt; &gt;&#xA;&gt; &gt; In the model of blinded statechains, the security rests on the&#xA;&gt; statechain server being trusted to report the NUMBER of partial signatures&#xA;&gt; it has generated for a particular key (as opposed to being trusted to&#xA;&gt; enforce rules on WHAT it has signed in the unblinded case) and the full set&#xA;&gt; of signatures generated being verified client side&#xA;&gt; https://github.com/commerceblock/mercury/blob/master/doc/merc_blind.md#blinding-considerations&#xA;&gt; &gt;&#xA;&gt; &gt; Given the 2-of-2 musig2 protocol operates as follows (in the following&#xA;&gt; description, private keys (field elements) are denoted using lower case&#xA;&gt; letters, and elliptic curve points as uppercase letters. G is the generator&#xA;&gt; point and point multiplication denoted as X = xG and point addition as A =&#xA;&gt; G + G):&#xA;&gt; &gt;&#xA;&gt; &gt; Party 1 generates private key x1 and public key X1 = x1G. Party 2&#xA;&gt; generates private key x2 and public key X2 = x2G. The set of pubkeys is L =&#xA;&gt; {X1,X2}. The key aggregation coefficient is KeyAggCoef(L,X) = H(L,X). The&#xA;&gt; shared (aggregate) public key X = a1X1 + a2X2 where a1 = KeyAggCoef(L,X1)&#xA;&gt; and a2 = KeyAggCoef(L,X2).&#xA;&gt; &gt;&#xA;&gt; &gt; To sign a message m, party 1 generates nonce r1 and R1 = r1G. Party 2&#xA;&gt; generates nonce r2 and R2 = r2G. These are aggregated into R = R1 + R2.&#xA;&gt; &gt;&#xA;&gt; &gt; Party 1 then computes &#39;challenge&#39; c = H(X||R||m) and s1 = c.a1.x1 + r1&#xA;&gt; &gt; Party 2 then computes &#39;challenge&#39; c = H(X||R||m) and s2 = c.a2.x2 + r2&#xA;&gt; &gt;&#xA;&gt; &gt; The final signature is then (R,s1+s2).&#xA;&gt; &gt;&#xA;&gt; &gt; In the case of blinding this for party 1:&#xA;&gt; &gt;&#xA;&gt; &gt; To prevent party 1 from learning of either the full public key or final&#xA;&gt; signature seems straightforward, if party 1 doesn&#39;t not need to&#xA;&gt; independently compute and verify c = H(X||R||m) (as they are blinded from&#xA;&gt; the message in any case).&#xA;&gt; &gt;&#xA;&gt; &gt; 1) Key aggregation is performed only by party 2. Party 1 just sends X1&#xA;&gt; to party 2.&#xA;&gt; &gt; 2) Nonce aggregation is performed only by party 2. Party 1 just sends R1&#xA;&gt; to party 2.&#xA;&gt; &gt; 3) Party 2 computes c = H(X||R||m) and sends it to party 1 in order to&#xA;&gt; compute s1 = c.a1.x1 + r1&#xA;&gt; &gt;&#xA;&gt; &gt; Party 1 never learns the final value of (R,s1+s2) or m.&#xA;&gt; &gt;&#xA;&gt; &gt; Any comments on this or potential issues would be appreciated.&#xA;&gt; &gt;&#xA;&gt; &gt; Tom&#xA;&gt;&#xA;-------------- next part --------------&#xA;An HTML attachment was scrubbed...&#xA;URL: &lt;http://lists.linuxfoundation.org/pipermail/bitcoin-dev/attachments/20230724/1df56267/attachment-0001.html&gt;</html></oembed>