mirror of
https://github.com/aljazceru/nutshell.git
synced 2025-12-20 02:24:20 +01:00
[Wallet/Mint] DLEQ proofs (#175)
* produce dleq * start working on verification * wip dleq * Use C_ instead of C in verify DLEQ! (#176) * Fix comments (DLEQ sign error) * Fix alice_verify_dleq in d_dhke.py * Fix_generate_promise in ledger.py * Fix verify_proofs_dleq in wallet.py * Fix: invalid public key (#182) * Use C_ instead of C in verify DLEQ! * Fix comments (DLEQ sign error) * Fix alice_verify_dleq in d_dhke.py * Fix_generate_promise in ledger.py * Fix verify_proofs_dleq in wallet.py * Fix: invalid public key * Exception: Mint Error: invalid public key * Update cashu/wallet/wallet.py --------- Co-authored-by: calle <93376500+callebtc@users.noreply.github.com> * Update cashu/core/b_dhke.py * Update tests/test_cli.py * verify all constructed proofs * dleq upon receive * serialize without dleq * all tests passing * make format * remove print * remove debug * option to send with dleq * add tests * fix test * deterministic p in step2_dleq and fix mypy error for hash_to_curve * test crypto/hash_e and crypto/step2_bob_dleq * rename A to K in b_dhke.py and test_alice_verify_dleq * rename tests * make format * store dleq in mint db (and readd balance view) * remove `r` from dleq in tests * add pending output * make format * works with pre-dleq mints * fix comments * make format * fix some tests * fix last test * test serialize dleq fix * flake * flake * keyset.id must be str * fix test decorators * start removing the duplicate fields from the dleq * format * remove print * cleanup * add type anotations to dleq functions * remove unnecessary fields from BlindedSignature * tests not working yet * spelling mistakes * spelling mistakes * fix more spelling mistakes * revert to normal * add comments * bdhke: generalize hash_e * remove P2PKSecret changes * revert tests for P2PKSecret * revert tests * revert test fully * revert p2pksecret changes * refactor proof invalidation * store dleq proofs in wallet db * make mypy happy --------- Co-authored-by: moonsettler <moonsettler@protonmail.com>
This commit is contained in:
@@ -1,4 +1,13 @@
|
||||
from cashu.core.crypto.b_dhke import hash_to_curve, step1_alice, step2_bob, step3_alice
|
||||
from cashu.core.crypto.b_dhke import (
|
||||
alice_verify_dleq,
|
||||
carol_verify_dleq,
|
||||
hash_e,
|
||||
hash_to_curve,
|
||||
step1_alice,
|
||||
step2_bob,
|
||||
step2_bob_dleq,
|
||||
step3_alice,
|
||||
)
|
||||
from cashu.core.crypto.secp import PrivateKey, PublicKey
|
||||
|
||||
|
||||
@@ -38,9 +47,9 @@ def test_hash_to_curve_iteration():
|
||||
|
||||
|
||||
def test_step1():
|
||||
""""""
|
||||
secret_msg = "test_message"
|
||||
B_, blinding_factor = step1_alice(
|
||||
"test_message",
|
||||
secret_msg,
|
||||
blinding_factor=PrivateKey(
|
||||
privkey=bytes.fromhex(
|
||||
"0000000000000000000000000000000000000000000000000000000000000001"
|
||||
@@ -73,7 +82,7 @@ def test_step2():
|
||||
),
|
||||
raw=True,
|
||||
)
|
||||
C_ = step2_bob(B_, a)
|
||||
C_, e, s = step2_bob(B_, a)
|
||||
assert (
|
||||
C_.serialize().hex()
|
||||
== "02a9acc1e48c25eeeb9289b5031cc57da9fe72f3fe2861d264bdc074209b107ba2"
|
||||
@@ -107,3 +116,187 @@ def test_step3():
|
||||
C.serialize().hex()
|
||||
== "03c724d7e6a5443b39ac8acf11f40420adc4f99a02e7cc1b57703d9391f6d129cd"
|
||||
)
|
||||
|
||||
|
||||
def test_dleq_hash_e():
|
||||
C_ = PublicKey(
|
||||
bytes.fromhex(
|
||||
"02a9acc1e48c25eeeb9289b5031cc57da9fe72f3fe2861d264bdc074209b107ba2"
|
||||
),
|
||||
raw=True,
|
||||
)
|
||||
K = PublicKey(
|
||||
pubkey=b"\x02"
|
||||
+ bytes.fromhex(
|
||||
"0000000000000000000000000000000000000000000000000000000000000001",
|
||||
),
|
||||
raw=True,
|
||||
)
|
||||
R1 = PublicKey(
|
||||
pubkey=b"\x02"
|
||||
+ bytes.fromhex(
|
||||
"0000000000000000000000000000000000000000000000000000000000000001",
|
||||
),
|
||||
raw=True,
|
||||
)
|
||||
R2 = PublicKey(
|
||||
pubkey=b"\x02"
|
||||
+ bytes.fromhex(
|
||||
"0000000000000000000000000000000000000000000000000000000000000001",
|
||||
),
|
||||
raw=True,
|
||||
)
|
||||
e = hash_e(R1, R2, K, C_)
|
||||
assert e.hex() == "a4dc034b74338c28c6bc3ea49731f2a24440fc7c4affc08b31a93fc9fbe6401e"
|
||||
|
||||
|
||||
def test_dleq_step2_bob_dleq():
|
||||
B_, _ = step1_alice(
|
||||
"test_message",
|
||||
blinding_factor=PrivateKey(
|
||||
privkey=bytes.fromhex(
|
||||
"0000000000000000000000000000000000000000000000000000000000000001"
|
||||
),
|
||||
raw=True,
|
||||
),
|
||||
)
|
||||
a = PrivateKey(
|
||||
privkey=bytes.fromhex(
|
||||
"0000000000000000000000000000000000000000000000000000000000000001"
|
||||
),
|
||||
raw=True,
|
||||
)
|
||||
p_bytes = bytes.fromhex(
|
||||
"0000000000000000000000000000000000000000000000000000000000000001"
|
||||
) # 32 bytes
|
||||
e, s = step2_bob_dleq(B_, a, p_bytes)
|
||||
assert (
|
||||
e.serialize()
|
||||
== "9818e061ee51d5c8edc3342369a554998ff7b4381c8652d724cdf46429be73d9"
|
||||
)
|
||||
assert (
|
||||
s.serialize()
|
||||
== "9818e061ee51d5c8edc3342369a554998ff7b4381c8652d724cdf46429be73da"
|
||||
) # differs from e only in least significant byte because `a = 0x1`
|
||||
|
||||
# change `a`
|
||||
a = PrivateKey(
|
||||
privkey=bytes.fromhex(
|
||||
"0000000000000000000000000000000000000000000000000000000000001111"
|
||||
),
|
||||
raw=True,
|
||||
)
|
||||
e, s = step2_bob_dleq(B_, a, p_bytes)
|
||||
assert (
|
||||
e.serialize()
|
||||
== "df1984d5c22f7e17afe33b8669f02f530f286ae3b00a1978edaf900f4721f65e"
|
||||
)
|
||||
assert (
|
||||
s.serialize()
|
||||
== "828404170c86f240c50ae0f5fc17bb6b82612d46b355e046d7cd84b0a3c934a0"
|
||||
)
|
||||
|
||||
|
||||
def test_dleq_alice_verify_dleq():
|
||||
# e from test_step2_bob_dleq for a=0x1
|
||||
e = PrivateKey(
|
||||
bytes.fromhex(
|
||||
"9818e061ee51d5c8edc3342369a554998ff7b4381c8652d724cdf46429be73d9"
|
||||
),
|
||||
raw=True,
|
||||
)
|
||||
# s from test_step2_bob_dleq for a=0x1
|
||||
s = PrivateKey(
|
||||
bytes.fromhex(
|
||||
"9818e061ee51d5c8edc3342369a554998ff7b4381c8652d724cdf46429be73da"
|
||||
),
|
||||
raw=True,
|
||||
)
|
||||
|
||||
a = PrivateKey(
|
||||
privkey=bytes.fromhex(
|
||||
"0000000000000000000000000000000000000000000000000000000000000001"
|
||||
),
|
||||
raw=True,
|
||||
)
|
||||
A = a.pubkey
|
||||
assert A
|
||||
# B_ is the same as we did:
|
||||
# B_, _ = step1_alice(
|
||||
# "test_message",
|
||||
# blinding_factor=bytes.fromhex(
|
||||
# "0000000000000000000000000000000000000000000000000000000000000001"
|
||||
# ), # 32 bytes
|
||||
# )
|
||||
B_ = PublicKey(
|
||||
bytes.fromhex(
|
||||
"02a9acc1e48c25eeeb9289b5031cc57da9fe72f3fe2861d264bdc074209b107ba2"
|
||||
),
|
||||
raw=True,
|
||||
)
|
||||
|
||||
# # C_ is the same as if we did:
|
||||
# a = PrivateKey(
|
||||
# privkey=bytes.fromhex(
|
||||
# "0000000000000000000000000000000000000000000000000000000000000001"
|
||||
# ),
|
||||
# raw=True,
|
||||
# )
|
||||
# C_, e, s = step2_bob(B_, a)
|
||||
|
||||
C_ = PublicKey(
|
||||
bytes.fromhex(
|
||||
"02a9acc1e48c25eeeb9289b5031cc57da9fe72f3fe2861d264bdc074209b107ba2"
|
||||
),
|
||||
raw=True,
|
||||
)
|
||||
|
||||
assert alice_verify_dleq(B_, C_, e, s, A)
|
||||
|
||||
|
||||
def test_dleq_alice_direct_verify_dleq():
|
||||
# ----- test again with B_ and C_ as per step1 and step2
|
||||
a = PrivateKey(
|
||||
privkey=bytes.fromhex(
|
||||
"0000000000000000000000000000000000000000000000000000000000000001"
|
||||
),
|
||||
raw=True,
|
||||
)
|
||||
A = a.pubkey
|
||||
assert A
|
||||
B_, _ = step1_alice(
|
||||
"test_message",
|
||||
blinding_factor=PrivateKey(
|
||||
privkey=bytes.fromhex(
|
||||
"0000000000000000000000000000000000000000000000000000000000000001"
|
||||
),
|
||||
raw=True,
|
||||
),
|
||||
)
|
||||
C_, e, s = step2_bob(B_, a)
|
||||
assert alice_verify_dleq(B_, C_, e, s, A)
|
||||
|
||||
|
||||
def test_dleq_carol_varify_from_bob():
|
||||
a = PrivateKey(
|
||||
privkey=bytes.fromhex(
|
||||
"0000000000000000000000000000000000000000000000000000000000000001"
|
||||
),
|
||||
raw=True,
|
||||
)
|
||||
A = a.pubkey
|
||||
assert A
|
||||
secret_msg = "test_message"
|
||||
r = PrivateKey(
|
||||
privkey=bytes.fromhex(
|
||||
"0000000000000000000000000000000000000000000000000000000000000001"
|
||||
),
|
||||
raw=True,
|
||||
)
|
||||
B_, _ = step1_alice(secret_msg, r)
|
||||
C_, e, s = step2_bob(B_, a)
|
||||
assert alice_verify_dleq(B_, C_, e, s, A)
|
||||
C = step3_alice(C_, r, A)
|
||||
|
||||
# carol does not know B_ and C_, but she receives C and r from Alice
|
||||
assert carol_verify_dleq(secret_msg=secret_msg, C=C, r=r, e=e, s=s, A=A)
|
||||
|
||||
Reference in New Issue
Block a user