Commit Graph
30 Commits
Author SHA1 Message Date
Sebastian Falbesoner fa731d21c4 BIP-174: mark PSBT_GLOBAL_VERSION as required for v2 2026-03-20 16:45:50 +01:00
Sebastian Falbesoner 249bdef156 BIP-352: mention secp256k1lab in BIP text
also fix a small grammar nit (s/are provided/is provided/)
2026-03-06 15:19:09 +01:00
Sebastian Falbesoner f2ffa99a4a BIP-352: take use of vendored secp256k1lab for reference implementation
This allows to remove secp256k1.py and replace the secp256k1-specific
parts in the reference implementation. Replacement guide:

    * ECKey -> Scalar
    * ECKey.set(seckey_bytes) -> Scalar.from_bytes_checked(seckey_bytes)
    * seckey.get_pubkey() -> seckey * G
    * seckey.get_bytes() -> seckey.to_bytes()
    * seckey.add(tweak_bytes) -> seckey + Scalar.from_bytes_checked(tweak_bytes)
    * seckey.negate() -> seckey = -seckey
    * seckey.sign_schnorr -> schnorr_sign(..., seckey.to_bytes(), ...)

    * ECPubKey -> GE
    * ECPubKey.set(pubkey_bytes) -> GE.from_bytes_{xonly,compressed}(pubkey_bytes)
    * pubkey.get_y() % 2 == 0 -> pubkey.has_even_y()
    * pubkey.get_bytes(False) -> pubkey.to_bytes_compressed()
    * pubkey.get_bytes() -> pubkey.to_bytes_xonly()
    * not pubkey.valid -> pubkey.infinity
    * pubkey.verify_schnorr -> schnorr_verify(..., pubkey.to_bytes_xonly(), ...)

    * TaggedHash -> tagged_hash
    * hashlib.sha256(preimage).digest() -> hash_sha256(preimage)
2026-03-02 19:17:21 +01:00
Sebastian Falbesoner 511bb99dc4 Merge commit '53b590e190f798131a10a16194261243abdf6b4d' as 'bip-0352/secp256k1lab' 2026-03-02 19:16:00 +01:00
Sebastian Falbesoner 53b590e190 Squashed 'bip-0352/secp256k1lab/' content from commit 44dc4bd
git-subtree-dir: bip-0352/secp256k1lab
git-subtree-split: 44dc4bd893b8f03e621585e3bf255253e0e0fbfb
2026-03-02 19:16:00 +01:00
Sebastian Falbesoner b4bc0a88b7 BIP-352: add test vector for exceeding K_max limit [receiver side]
Test case: even though there are 2324 outputs targeted to the recipient,
only 2323 are found due to the introduced K_max limit. Any
implementation following the new BIP protocol rule wouldn't create such
a transaction in the first place, but an attacker might do.

Can be tested by
`$ ./bip-0352/reference.py ./bip-0352/send_and_receive_test_vectors.json`
2026-03-02 13:31:46 +01:00
Sebastian Falbesoner 9830fad214 BIP-352: add test vector for exceeding K_max limit [sender side]
Test case: as the (only) recipient group contains 2324 addresses and
thus exceeds the K_max limit by one, sending fails.

Can be tested by
`$ ./bip-0352/reference.py ./bip-0352/send_and_receive_test_vectors.json`
2026-03-02 13:27:28 +01:00
Sebastian Falbesoner f14132fc77 BIP-352: test vectors: allow to check found output count for receiving
Introduce an optional "n_outputs" field as alternative to the detailed
"outputs" objects (the field was already specified, but not used so
far). Also update the documentation of the fields.
2026-03-02 13:26:31 +01:00
Sebastian Falbesoner 3aa17caaa3 BIP-352: test vectors: allow specifying repeated recipients for sending
Introduce an optional "count" field for recipient objects.
Also update the documentation of the fields.
2026-03-02 13:26:31 +01:00
Sebastian Falbesoner f665c2c142 BIP-352: introduce per-group recipient limit K_max (=2323)
In theory this is a backwards incompatible protocol change.
Practically, no existing Silent Payments wallets out there supports
sending to such a high quantity of recipients (not even in terms of
_total_ number of recipients), so the K_max limit should be safe to
introduce, without any negative effects in the wallet ecosystem.
2026-03-02 13:26:25 +01:00
Sebastian Falbesoner 2b7f07986b BIP-374: mention secp256k1lab in BIP text 2026-01-15 01:55:55 +01:00
Sebastian Falbesoner 436a3dd1fa BIP-374: use tagged_hash and xor_bytes routines from secp256k1lab 2026-01-15 00:56:13 +01:00
Sebastian Falbesoner 459d977d9b BIP-374: replace secp256k1.py with vendored copy of secp256k1lab 2026-01-15 00:47:29 +01:00
Sebastian Falbesoner 4e18ee641b BIP-374: avoid using sys.path[0] to find current working directory
This approach is incompatible with the sys.path extension approach
in the next commit which is used to to find the vendored copy of
secp256k1lab, so use __file__ instead which works as well.
2026-01-15 00:45:33 +01:00
Sebastian Falbesoner d2ceae1dd6 Merge commit '3050bb6b25c0c20b62e2fc1a23276a09d50d151b' as 'bip-0374/secp256k1lab' 2026-01-15 00:43:29 +01:00
Sebastian Falbesoner 3050bb6b25 Squashed 'bip-0374/secp256k1lab/' content from commit 44dc4bd
git-subtree-dir: bip-0374/secp256k1lab
git-subtree-split: 44dc4bd893b8f03e621585e3bf255253e0e0fbfb
2026-01-15 00:43:29 +01:00
Sebastian Falbesoner a00064fcfa BIP-374: add generated test vector .csv files 2024-12-30 17:19:55 +01:00
Sebastian Falbesoner 6b16952422 Add test vectors for DLEQ proof generation/verification
Squashed from the following commits:
- Add skeleton for generating DLEQ proof test vectors
- Add run_test_vectors.py counterpart for generated DLEQ proofs
- Add DLEQ test vectors for proof verification
2024-12-21 01:04:44 +01:00
Sebastian Falbesoner dab5571c37 bugfix: respect message m in DLEQ proof generation/verification 2024-12-21 01:04:00 +01:00
Sebastian Falbesoner 7d921e3314 BIP-340: fix lift_x calls in test vector generation script
The `lift_x` function in the BIP and the reference implementation
expect an integer to be passed rather than a byte array.

Can be tested with:
```
$ python3 test-vectors.py > expected.csv
$ diff test-vectors.csv expected.csv
```
2024-12-20 15:21:41 +01:00
Sebastian Falbesoner 0c7e54d780 BIP-DLEQ: add reference implementation for secp256k1 2024-12-09 11:40:40 -05:00
Sebastian Falbesoner 50e820836d BIP-373: denote different public key types consistently
Improve the clarity of the BIP w.r.t. pubkeys in the following ways:
- be specific about the purpose of pubkey types in PSBT fields
  ("plain pubkey" alone doesn't say a lot, especially if it's used
   repeatedly within a field)
- replace all uses of "plain pubkey" by "compressed pubkey"
  (the only category that should matter is whether the pubkey type
   is "x-only" or "plain")
- use consistent word order, e.g. prefer
  "compressed aggregate public key" over "aggregate compressed public key"
2024-12-06 00:44:38 +01:00
Sebastian Falbesoner 2a99b8f925 BIP-352: use own ripemd160 for reference implementation (#1616)
On some operating systems, Python doesn't provide the expected ripemd160
implementation anymore, so the reference implementation fails to start.
E.g. in Ubuntu 22.04:

----------------------------------------------------------------------------------------------
$ ./reference.py send_and_receive_test_vectors.json
Simple send: two inputs
Traceback (most recent call last):
  File "/usr/lib/python3.10/hashlib.py", line 160, in __hash_new
    return _hashlib.new(name, data, **kwargs)
ValueError: [digital envelope routines] unsupported

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/home/thestack/bips/bip-0352/./reference.py", line 228, in <module>
    pubkey = get_pubkey_from_input(vin)
  File "/home/thestack/bips/bip-0352/./reference.py", line 46, in get_pubkey_from_input
    pubkey_hash = hash160(pubkey_bytes)
  File "/home/thestack/bips/bip-0352/bitcoin_utils.py", line 130, in hash160
    return hashlib.new("ripemd160", hashlib.sha256(s).digest()).digest()
  File "/usr/lib/python3.10/hashlib.py", line 166, in __hash_new
    return __get_builtin_constructor(name)(data)
  File "/usr/lib/python3.10/hashlib.py", line 123, in __get_builtin_constructor
    raise ValueError('unsupported hash type ' + name)
ValueError: unsupported hash type ripemd160
----------------------------------------------------------------------------------------------

Fix this by providing a manual implementation, taken from the functional test framework
of Bitcoin Core. See corresponding issue https://github.com/bitcoin/bitcoin/issues/23710 and
PR https://github.com/bitcoin/bitcoin/pull/23716
2024-06-29 07:08:49 -07:00
Sebastian Falbesoner 496e4295e7 BIP-352: add change log (SemVer format)
The first paragraph is taken from BIP-327, with the sentence
about MAJOR version zero removed, as it's not relevant here
(we don't track the pre-merge history).
2024-06-22 20:30:50 +02:00
Sebastian Falbesonerandjosibake 59cc43d727 BIP-352: scanning: add step to skip tx if input pubkeys sum A is point at infinity
The input data for the test vector is taken from the signet transaction
fe788cf6578d547819def43d79e6c8f0153d4885f5a343d12bd03f34507aabd6
which spends two P2WPKH inputs with negated pubkeys (x, y) and (x, -y)
from the funding transaction 3a286147b25e16ae80aff406f2673c6e565418c40f45c071245cdebc8a94174e
(see also https://github.com/bitcoin-core/secp256k1/pull/1519#issuecomment-2143167510
and the output from the script in the previous commit message).

Co-authored-by: josibake <josibake@protonmail.com>
2024-06-22 01:48:44 +02:00
Sebastian Falbesoner 47033c62dc BIP-352: sending: add step to fail if input privkeys sum a is zero
The test vector data was generated with a Python script
(see https://github.com/theStack/bitcoin/blob/bc15ea8d0f282908b912dbf62bba816ecd82424d/contrib/silentpayments/submit_input_pubkeys_infinity_tx.py),
leading to the following output:

---------------------------------------------------------------------------------------------------------
     Privkey 1: a6df6a0bb448992a301df4258e06a89fe7cf7146f59ac3bd5ff26083acb22ceb
     Privkey 2: 592095f44bb766d5cfe20bda71f9575ed2df6b9fb9addc7e5fdffe0923841456
      Pubkey 1: 02557ef3e55b0a52489b4454c1169e06bdea43687a69c1f190eb50781644ab6975
      Pubkey 2: 03557ef3e55b0a52489b4454c1169e06bdea43687a69c1f190eb50781644ab6975
scriptPubKey 1: 00149d9e24f9fab4e35bf1a6df4b46cb533296ac0792
scriptPubKey 2: 00149860538b5575962776ed0814ae222c7d60c72d7b
     Address 1: tb1qnk0zf706kn34hudxma95dj6nx2t2cpujz7j5t5
     Address 2: tb1qnps98z64wktzwahdpq22ug3v04svwttm7gs8wn
-> Funding tx submitted: 3a286147b25e16ae80aff406f2673c6e565418c40f45c071245cdebc8a94174e

Taproot output address for spending tx: tb1pqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqkgkkf5
-> Spending tx submitted: fe788cf6578d547819def43d79e6c8f0153d4885f5a343d12bd03f34507aabd6
---------------------------------------------------------------------------------------------------------
2024-06-22 01:40:19 +02:00
Sebastian Falbesoner fe0f83531e BIP-352: generate input_hash after summing up keys (simplification)
For both sender and receiver, generating the input hash is currently
listed as the first step. This already involves summing up the public
keys, even though summing up key material (private keys for sender,
public keys of inputs for receiver) is then again listed explicitly
in later steps.

It seems to be more obvious and less redundant (and also hopefully less
confusing for readers) to reorder the instructions to calculate the
input_hash _after_ the key aggregation is done to reuse the result. In
case of the sender, the private key sum has to be multiplicated with G
in order to the get to the corresponding input pubkey sum.

This also corresponds to the current BIP352 implementation in the
secp256k1 library (https://github.com/bitcoin-core/secp256k1/pull/1519).
The reference implementation in Python here is adapted for the sender
side, the receiver side has already generated the input_hash after
summing up the pubkeys.
2024-06-20 00:33:14 +02:00
Sebastian Falbesoner 496b6c9ecc bip-0158: remove unused and unrelated "data pushes" definition
This BIP is not in any way connected to the rules of Bitcoin script,
i.e. the "data pushes" term is also not used anywhere and its definition
can hence be removed.
2023-08-29 23:39:04 +02:00
Sebastian Falbesoner 9f25645be5 bip-0324: fix git instruction order in test_sage_decoding.py
Tiny fix correcting the order of commands, for `git checkout` one has
to change into the repository directory first.
2023-07-06 16:38:38 +02:00
Sebastian Falbesoner 59915dfc71 bip-0324: remove initiating parameter from ellswift_create calls 2023-03-19 19:18:07 +01:00