diff --git a/bip-musig2.mediawiki b/bip-musig2.mediawiki
index 734a52a52b..feace94b5f 100644
--- a/bip-musig2.mediawiki
+++ b/bip-musig2.mediawiki
@@ -550,7 +550,7 @@ A change in the MAJOR
version indicates that the specification is i
The MINOR
version is incremented whenever the inputs or the output of an algorithm changes in a backward-compatible way or new backward-compatible functionality is added.
The PATCH
version is incremented for other changes that are noteworthy (bug fixes, test vectors, important clarifications, etc.).
-* '''0.3.0''' (2022-05-24): Allow the output of NonceAgg to be infinity
+* '''0.3.0''' (2022-05-24): Allow the output of NonceAgg to be infinity and add test vector
* '''0.2.0''' (2022-05-19): Change order of arguments in ''NonceGen'' hash function
* '''0.1.0''' (2022-05-19): Publication of draft BIP on the bitcoin-dev mailing list
diff --git a/bip-musig2/reference.py b/bip-musig2/reference.py
index 2b5378a2b6..f55ce228e2 100644
--- a/bip-musig2/reference.py
+++ b/bip-musig2/reference.py
@@ -407,6 +407,36 @@ def test_sign_vectors():
session_ctx = SessionContext(aggnonce, [X[0], X[1], pk], [], [], msg)
assert sign(secnonce, sk, session_ctx) == expected[2]
+def test_inf_aggnonce():
+ X = bytes.fromhex('F9308A019258C31049344F85F89D5229B531C845836F99B08601F113BCE036F9',)
+
+ secnonce = bytes.fromhex(
+ '508B81A611F100A6B2B6B29656590898AF488BCF2E1F55CF22E5CFB84421FE61' +
+ 'FA27FD49B1D50085B481285E1CA205D55C82CC1B31FF5CD54A489829355901F7')
+
+ # First element corresponds to secnonce
+ pubnonces = fromhex_all([
+ '0337C87821AFD50A8644D820A8F3E02E499C931865C2360FB43D0A0D20DAFE07EA' +
+ '0287BF891D2A6DEAEBADC909352AA9405D1428C15F4B75F04DAE642A95C2548480',
+ '0237C87821AFD50A8644D820A8F3E02E499C931865C2360FB43D0A0D20DAFE07EA' +
+ '0387BF891D2A6DEAEBADC909352AA9405D1428C15F4B75F04DAE642A95C2548480'
+ ])
+
+ aggnonce = (0).to_bytes(66, "big")
+ assert nonce_agg(pubnonces) == aggnonce
+
+ sk = bytes.fromhex('7FB9E0E687ADA1EEBF7ECFE2F21E73EBDB51A7D450948DFE8D76D7F2D1007671')
+ msg = bytes.fromhex('F95466D086770E689964664219266FE5ED215C92AE20BAB5C9D79ADDDDF3C0CF')
+
+ expected = bytes.fromhex("C91F7C71744153D618891EC5851F379D20F8EC47EC43A909DF64DC8D4C242375")
+
+ pk = bytes_from_point(point_mul(G, int_from_bytes(sk)))
+
+ session_ctx = SessionContext(aggnonce, [pk, X], [], [], msg)
+ assert sign(secnonce, sk, session_ctx) == expected
+ assert partial_sig_verify(expected, pubnonces, [pk, X], [], [], msg, 0)
+ assert not partial_sig_agg([expected, expected], session_ctx)
+
def test_tweak_vectors():
X = fromhex_all([
'F9308A019258C31049344F85F89D5229B531C845836F99B08601F113BCE036F9',
@@ -514,5 +544,6 @@ def test_sign_and_verify_random(iters):
if __name__ == '__main__':
test_key_agg_vectors()
test_sign_vectors()
+ test_inf_aggnonce()
test_tweak_vectors()
test_sign_and_verify_random(4)