Merge pull request #2335 from ViniciusCestarii/bip-374-new-test-vectors

bip374: add new test vectors checking for boundaries
This commit is contained in:
Jon Atack authored and GitHub committed 2026-10-26 20:39:29 -06:00
commit f428b62526
3 files changed
+26 -5

No files matched your search

+3 -1
View File
@@ -11,7 +11,7 @@
License: BSD-2-Clause
Discussion: https://gist.github.com/andrewtoth/df97c3260cc8d12f09d3855ee61322ea
https://groups.google.com/g/bitcoindev/c/MezoKV5md7s
Version: 0.3.0
Version: 0.3.1
</pre>
== Introduction ==
@@ -124,6 +124,8 @@ Test vectors can be generated by running <code>./bip-0374/gen_test_vectors.py</c
== Changelog ==
* 0.3.1 (2026-10-26):
** Add test vectors checking scalar boundaries
* 0.3.0 (2026-08-19):
** Treat the challenge ''e'' as a scalar (reduced modulo the curve order) and reject proofs with ''e &ge; n''
* 0.2.0 (2025-02-27):
+17 -1
View File
@@ -59,7 +59,19 @@ def gen_all_generate_proof_vectors(f):
writer.writerow((idx, G.to_bytes_compressed().hex(), f"{a:064x}", B.to_bytes_compressed().hex(), auxrand.hex(), msg.hex(), proof.hex(), f"Success case {i+1}"))
idx += 1
# failure cases: a is not within group order (a=0, a=N)
# success cases: a at the bounds of the valid range (a=1, a=N-1)
a_bound = 1
proof = dleq_generate_proof(a_bound, B, auxrand, G=G, m=msg)
assert proof is not None and len(proof) == 64
writer.writerow((idx, G.to_bytes_compressed().hex(), f"{a_bound:064x}", B.to_bytes_compressed().hex(), auxrand.hex(), msg.hex(), proof.hex(), f"Success case (a=1)"))
idx += 1
a_bound = GE.ORDER - 1
proof = dleq_generate_proof(a_bound, B, auxrand, G=G, m=msg)
assert proof is not None and len(proof) == 64
writer.writerow((idx, G.to_bytes_compressed().hex(), f"{a_bound:064x}", B.to_bytes_compressed().hex(), auxrand.hex(), msg.hex(), proof.hex(), f"Success case (a=N-1 [group order - 1])"))
idx += 1
# failure cases: a is not within group order (a=0, a=N, a=N+1)
a_invalid = 0
assert dleq_generate_proof(a_invalid, B, auxrand, G=G, m=msg) is None
writer.writerow((idx, G.to_bytes_compressed().hex(), f"{a_invalid:064x}", B.to_bytes_compressed().hex(), auxrand.hex(), msg.hex(), "INVALID", f"Failure case (a=0)"))
@@ -68,6 +80,10 @@ def gen_all_generate_proof_vectors(f):
assert dleq_generate_proof(a_invalid, B, auxrand, G=G, m=msg) is None
writer.writerow((idx, G.to_bytes_compressed().hex(), f"{a_invalid:064x}", B.to_bytes_compressed().hex(), auxrand.hex(), msg.hex(), "INVALID", f"Failure case (a=N [group order])"))
idx += 1
a_invalid = GE.ORDER + 1
assert dleq_generate_proof(a_invalid, B, auxrand, G=G, m=msg) is None
writer.writerow((idx, G.to_bytes_compressed().hex(), f"{a_invalid:064x}", B.to_bytes_compressed().hex(), auxrand.hex(), msg.hex(), "INVALID", f"Failure case (a=N+1 [group order + 1])"))
idx += 1
# failure case: B is point at infinity
B_infinity = GE()
+6 -3
View File
@@ -7,6 +7,9 @@ index,point_G,scalar_a,point_B,auxrand_r,message,result_proof,comment
5,0279be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798,c08ca8e0bb59769fc6a4e078456284e00ea34f65add988c246e1bba85824ccdc,034bccb1c570ac1f3bc42d61fe35de605b99626501ccb20297e1acbbf2d7152aa1,c8d7056abd4726eb5a0f198740af14d6c1f0c16e5d7a37eaec621b661e669ac4,,503562d36910cd2d61a4d07c8ff680265c713e63dde0dcb88e6ea3c58597bdc05b86db9af95eccc475ce2177f941c118fefed20227d4ce8ce9557cb008758de6,Success case 6
6,0279be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798,8e641ba6bf7f64eec76005a29585a5035376375f33e331215aedfe03b8e80e7a,0231c64e3efa506fdad6aad0f6084d5f6739de7f448d7e66f9d22f842638f41d60,02a7b2e2f5a5e9b1078dbb160502a32491fe80a091e91dd92cf77b0b7d90970f,35841ca532846e1cdd23a3d107824343584f88eff580929469865eae8355ee3c,5c7b27a33210750e9de8679d9f43497cf9f12ac642cde0a1fc26443aa2fc89bf71aabf7bac89f5d8a96cbe86daba155fa74d6f3e111136179e53b04eb6d7807f,Success case 7
7,0279be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798,cfb9a7ecc49bea4f2e2ee34c38a6f48b5cd5bd06f4e4d4ffb45905b3d26db842,021cb81121a00f89769903305a367ad3cc02d5b402b12c026e06ac94bde28cd608,d38466b77484154a3fcb3151094c1c8a845c73a3c036b3a8ebffd8ef62c9047f,22616bb5fb2d7c68270f305122f2a09e833239c4b1c9a04e285119fb606ac794,78a5544afa75bf152653fe55fb76926f2f65131bf090972a0b0b37d310c28a6bde0e7bfacc10ac12d36f55316ba134b6ba0b844a65ae05cad53c0b296c6639bb,Success case 8
8,0279be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798,0000000000000000000000000000000000000000000000000000000000000000,021cb81121a00f89769903305a367ad3cc02d5b402b12c026e06ac94bde28cd608,d38466b77484154a3fcb3151094c1c8a845c73a3c036b3a8ebffd8ef62c9047f,22616bb5fb2d7c68270f305122f2a09e833239c4b1c9a04e285119fb606ac794,INVALID,Failure case (a=0)
9,0279be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798,fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364141,021cb81121a00f89769903305a367ad3cc02d5b402b12c026e06ac94bde28cd608,d38466b77484154a3fcb3151094c1c8a845c73a3c036b3a8ebffd8ef62c9047f,22616bb5fb2d7c68270f305122f2a09e833239c4b1c9a04e285119fb606ac794,INVALID,Failure case (a=N [group order])
10,0279be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798,cfb9a7ecc49bea4f2e2ee34c38a6f48b5cd5bd06f4e4d4ffb45905b3d26db842,INFINITY,d38466b77484154a3fcb3151094c1c8a845c73a3c036b3a8ebffd8ef62c9047f,22616bb5fb2d7c68270f305122f2a09e833239c4b1c9a04e285119fb606ac794,INVALID,Failure case (B is point at infinity)
8,0279be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798,0000000000000000000000000000000000000000000000000000000000000001,021cb81121a00f89769903305a367ad3cc02d5b402b12c026e06ac94bde28cd608,d38466b77484154a3fcb3151094c1c8a845c73a3c036b3a8ebffd8ef62c9047f,22616bb5fb2d7c68270f305122f2a09e833239c4b1c9a04e285119fb606ac794,fb00c556ac6a084b9eb9b7e0f612f8bcc97c6c2602e2b1a18dfe1459c790c06a04ec11baec2cab0b791f275d9b494ecd51a3599c7a9785053aee2c255e336bd9,Success case (a=1)
9,0279be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798,fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364140,021cb81121a00f89769903305a367ad3cc02d5b402b12c026e06ac94bde28cd608,d38466b77484154a3fcb3151094c1c8a845c73a3c036b3a8ebffd8ef62c9047f,22616bb5fb2d7c68270f305122f2a09e833239c4b1c9a04e285119fb606ac794,c1267f0fdcd6c01c9633ea287faa4352092a68726e127bdd64668a4d4201d937b798288bf15cea9f7b25f0e7ef37d3e63fc4fede9cced31146784ed2035f2476,Success case (a=N-1 [group order - 1])
10,0279be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798,0000000000000000000000000000000000000000000000000000000000000000,021cb81121a00f89769903305a367ad3cc02d5b402b12c026e06ac94bde28cd608,d38466b77484154a3fcb3151094c1c8a845c73a3c036b3a8ebffd8ef62c9047f,22616bb5fb2d7c68270f305122f2a09e833239c4b1c9a04e285119fb606ac794,INVALID,Failure case (a=0)
11,0279be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798,fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364141,021cb81121a00f89769903305a367ad3cc02d5b402b12c026e06ac94bde28cd608,d38466b77484154a3fcb3151094c1c8a845c73a3c036b3a8ebffd8ef62c9047f,22616bb5fb2d7c68270f305122f2a09e833239c4b1c9a04e285119fb606ac794,INVALID,Failure case (a=N [group order])
12,0279be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798,fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364142,021cb81121a00f89769903305a367ad3cc02d5b402b12c026e06ac94bde28cd608,d38466b77484154a3fcb3151094c1c8a845c73a3c036b3a8ebffd8ef62c9047f,22616bb5fb2d7c68270f305122f2a09e833239c4b1c9a04e285119fb606ac794,INVALID,Failure case (a=N+1 [group order + 1])
13,0279be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798,cfb9a7ecc49bea4f2e2ee34c38a6f48b5cd5bd06f4e4d4ffb45905b3d26db842,INFINITY,d38466b77484154a3fcb3151094c1c8a845c73a3c036b3a8ebffd8ef62c9047f,22616bb5fb2d7c68270f305122f2a09e833239c4b1c9a04e285119fb606ac794,INVALID,Failure case (B is point at infinity)
1 index point_G scalar_a point_B auxrand_r message result_proof comment
7 5 0279be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798 c08ca8e0bb59769fc6a4e078456284e00ea34f65add988c246e1bba85824ccdc 034bccb1c570ac1f3bc42d61fe35de605b99626501ccb20297e1acbbf2d7152aa1 c8d7056abd4726eb5a0f198740af14d6c1f0c16e5d7a37eaec621b661e669ac4 503562d36910cd2d61a4d07c8ff680265c713e63dde0dcb88e6ea3c58597bdc05b86db9af95eccc475ce2177f941c118fefed20227d4ce8ce9557cb008758de6 Success case 6
8 6 0279be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798 8e641ba6bf7f64eec76005a29585a5035376375f33e331215aedfe03b8e80e7a 0231c64e3efa506fdad6aad0f6084d5f6739de7f448d7e66f9d22f842638f41d60 02a7b2e2f5a5e9b1078dbb160502a32491fe80a091e91dd92cf77b0b7d90970f 35841ca532846e1cdd23a3d107824343584f88eff580929469865eae8355ee3c 5c7b27a33210750e9de8679d9f43497cf9f12ac642cde0a1fc26443aa2fc89bf71aabf7bac89f5d8a96cbe86daba155fa74d6f3e111136179e53b04eb6d7807f Success case 7
9 7 0279be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798 cfb9a7ecc49bea4f2e2ee34c38a6f48b5cd5bd06f4e4d4ffb45905b3d26db842 021cb81121a00f89769903305a367ad3cc02d5b402b12c026e06ac94bde28cd608 d38466b77484154a3fcb3151094c1c8a845c73a3c036b3a8ebffd8ef62c9047f 22616bb5fb2d7c68270f305122f2a09e833239c4b1c9a04e285119fb606ac794 78a5544afa75bf152653fe55fb76926f2f65131bf090972a0b0b37d310c28a6bde0e7bfacc10ac12d36f55316ba134b6ba0b844a65ae05cad53c0b296c6639bb Success case 8
10 8 0279be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000001 021cb81121a00f89769903305a367ad3cc02d5b402b12c026e06ac94bde28cd608 d38466b77484154a3fcb3151094c1c8a845c73a3c036b3a8ebffd8ef62c9047f 22616bb5fb2d7c68270f305122f2a09e833239c4b1c9a04e285119fb606ac794 INVALID fb00c556ac6a084b9eb9b7e0f612f8bcc97c6c2602e2b1a18dfe1459c790c06a04ec11baec2cab0b791f275d9b494ecd51a3599c7a9785053aee2c255e336bd9 Failure case (a=0) Success case (a=1)
11 9 0279be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798 fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364141 fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364140 021cb81121a00f89769903305a367ad3cc02d5b402b12c026e06ac94bde28cd608 d38466b77484154a3fcb3151094c1c8a845c73a3c036b3a8ebffd8ef62c9047f 22616bb5fb2d7c68270f305122f2a09e833239c4b1c9a04e285119fb606ac794 INVALID c1267f0fdcd6c01c9633ea287faa4352092a68726e127bdd64668a4d4201d937b798288bf15cea9f7b25f0e7ef37d3e63fc4fede9cced31146784ed2035f2476 Failure case (a=N [group order]) Success case (a=N-1 [group order - 1])
12 10 0279be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798 cfb9a7ecc49bea4f2e2ee34c38a6f48b5cd5bd06f4e4d4ffb45905b3d26db842 0000000000000000000000000000000000000000000000000000000000000000 INFINITY 021cb81121a00f89769903305a367ad3cc02d5b402b12c026e06ac94bde28cd608 d38466b77484154a3fcb3151094c1c8a845c73a3c036b3a8ebffd8ef62c9047f 22616bb5fb2d7c68270f305122f2a09e833239c4b1c9a04e285119fb606ac794 INVALID Failure case (B is point at infinity) Failure case (a=0)
13 11 0279be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798 fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364141 021cb81121a00f89769903305a367ad3cc02d5b402b12c026e06ac94bde28cd608 d38466b77484154a3fcb3151094c1c8a845c73a3c036b3a8ebffd8ef62c9047f 22616bb5fb2d7c68270f305122f2a09e833239c4b1c9a04e285119fb606ac794 INVALID Failure case (a=N [group order])
14 12 0279be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798 fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364142 021cb81121a00f89769903305a367ad3cc02d5b402b12c026e06ac94bde28cd608 d38466b77484154a3fcb3151094c1c8a845c73a3c036b3a8ebffd8ef62c9047f 22616bb5fb2d7c68270f305122f2a09e833239c4b1c9a04e285119fb606ac794 INVALID Failure case (a=N+1 [group order + 1])
15 13 0279be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798 cfb9a7ecc49bea4f2e2ee34c38a6f48b5cd5bd06f4e4d4ffb45905b3d26db842 INFINITY d38466b77484154a3fcb3151094c1c8a845c73a3c036b3a8ebffd8ef62c9047f 22616bb5fb2d7c68270f305122f2a09e833239c4b1c9a04e285119fb606ac794 INVALID Failure case (B is point at infinity)