Browse Source

update on latest upstream changes

add-joinmarket
zebra-lucky 1 year ago
parent
commit
e46f57b25d
  1. 3
      electrum/plugins/joinmarket/jm_base_code.py
  2. 3
      electrum/plugins/joinmarket/jm_util.py
  3. 41
      electrum/plugins/joinmarket/jmbitcoin/secp256k1_main.py
  4. 4
      electrum/plugins/joinmarket/jmclient/podle.py
  5. 3
      electrum/plugins/joinmarket/tests/jmbitcoin/test_ecc_signing.py
  6. 7
      electrum/plugins/joinmarket/tests/test_jm_base_code.py
  7. 2
      electrum/plugins/joinmarket/tests/test_jm_util.py

3
electrum/plugins/joinmarket/jm_base_code.py

@ -8,7 +8,8 @@ from math import ceil, exp
from numbers import Integral from numbers import Integral
from typing import Union, List, Tuple, Optional, Dict, Any from typing import Union, List, Tuple, Optional, Dict, Any
from electrum import ecc import electrum_ecc as ecc
from electrum.bip32 import convert_bip32_intpath_to_strpath from electrum.bip32 import convert_bip32_intpath_to_strpath
from electrum.bitcoin import (script_to_scripthash, address_to_script, from electrum.bitcoin import (script_to_scripthash, address_to_script,
construct_script, opcodes) construct_script, opcodes)

3
electrum/plugins/joinmarket/jm_util.py

@ -5,7 +5,8 @@ import logging
import re import re
from enum import IntEnum from enum import IntEnum
from electrum import ecc import electrum_ecc as ecc
from electrum import constants from electrum import constants
from electrum.bitcoin import sha256d, address_to_script, is_address, opcodes from electrum.bitcoin import sha256d, address_to_script, is_address, opcodes
from electrum.descriptor import (PubkeyProvider, PKHDescriptor, WPKHDescriptor, from electrum.descriptor import (PubkeyProvider, PKHDescriptor, WPKHDescriptor,

41
electrum/plugins/joinmarket/jmbitcoin/secp256k1_main.py

@ -3,10 +3,9 @@
import base64 import base64
from typing import List, Tuple, Union from typing import List, Tuple, Union
from electrum import ecc import electrum_ecc as ecc
from electrum.bitcoin import sha256d, usermessage_magic from electrum.bitcoin import sha256d, usermessage_magic
from electrum.ecc import (ECPrivkey, ECPubkey, ecdsa_der_sig_from_r_and_s,
ecdsa_sig64_from_der_sig)
from electrum.util import to_bytes from electrum.util import to_bytes
from ..jmbase import bintohex from ..jmbase import bintohex
@ -25,20 +24,20 @@ def getG(compressed=True):
return ecc.GENERATOR.get_public_key_bytes(compressed) return ecc.GENERATOR.get_public_key_bytes(compressed)
podle_PublicKey_class = ECPubkey podle_PublicKey_class = ecc.ECPubkey
podle_PrivateKey_class = ECPrivkey podle_PrivateKey_class = ecc.ECPrivkey
def podle_PublicKey(P: bytes) -> ECPubkey: def podle_PublicKey(P: bytes) -> ecc.ECPubkey:
"""Returns a PublicKey object from a binary string """Returns a PublicKey object from a binary string
""" """
return ECPubkey(P) return ecc.ECPubkey(P)
def podle_PrivateKey(priv: bytes) -> ECPrivkey: def podle_PrivateKey(priv: bytes) -> ecc.ECPrivkey:
"""Returns a PrivateKey object from a binary string """Returns a PrivateKey object from a binary string
""" """
return ECPrivkey(priv) return ecc.ECPrivkey(priv)
def read_privkey(priv: bytes) -> Tuple[bool, bytes]: def read_privkey(priv: bytes) -> Tuple[bool, bytes]:
@ -54,14 +53,14 @@ def read_privkey(priv: bytes) -> Tuple[bool, bytes]:
return (compressed, priv[:32]) return (compressed, priv[:32])
def privkey_to_pubkey(priv: bytes) -> ECPubkey: def privkey_to_pubkey(priv: bytes) -> ecc.ECPubkey:
'''Take 32/33 byte raw private key as input. '''Take 32/33 byte raw private key as input.
If 32 bytes, return as uncompressed raw public key. If 32 bytes, return as uncompressed raw public key.
If 33 bytes and the final byte is 01, return If 33 bytes and the final byte is 01, return
compresse public key. Else throws Exception.''' compresse public key. Else throws Exception.'''
compressed, priv = read_privkey(priv) compressed, priv = read_privkey(priv)
privk = ECPrivkey(priv) privk = ecc.ECPrivkey(priv)
return ECPubkey(privk.get_public_key_bytes()) return ecc.ECPubkey(privk.get_public_key_bytes())
def ecdsa_sign(msg: str, priv: bytes) -> str: def ecdsa_sign(msg: str, priv: bytes) -> str:
@ -89,12 +88,12 @@ def ecdsa_raw_sign(msg: Union[bytes, bytearray],
if rawmsg and len(msg) != 32: if rawmsg and len(msg) != 32:
raise Exception("Invalid hash input to ECDSA raw sign.") raise Exception("Invalid hash input to ECDSA raw sign.")
compressed, p = read_privkey(priv) compressed, p = read_privkey(priv)
newpriv = ECPrivkey(p) newpriv = ecc.ECPrivkey(p)
if rawmsg: if rawmsg:
sig = newpriv.ecdsa_sign(msg, sigencode=ecdsa_der_sig_from_r_and_s) sig = newpriv.ecdsa_sign(msg, sigencode=ecc.ecdsa_der_sig_from_r_and_s)
else: else:
msg = sha256d(usermessage_magic(to_bytes(msg))) msg = sha256d(usermessage_magic(to_bytes(msg)))
sig = newpriv.ecdsa_sign(msg, sigencode=ecdsa_der_sig_from_r_and_s) sig = newpriv.ecdsa_sign(msg, sigencode=ecc.ecdsa_der_sig_from_r_and_s)
return sig return sig
@ -114,10 +113,10 @@ def ecdsa_raw_verify(msg: bytes,
not guaranteed, so return False on any parsing exception. not guaranteed, so return False on any parsing exception.
''' '''
try: try:
sig = ecdsa_sig64_from_der_sig(sig) sig = ecc.ecdsa_sig64_from_der_sig(sig)
if rawmsg: if rawmsg:
assert len(msg) == 32 assert len(msg) == 32
newpub = ECPubkey(pub) newpub = ecc.ECPubkey(pub)
if rawmsg: if rawmsg:
retval = newpub.ecdsa_verify(sig, msg) retval = newpub.ecdsa_verify(sig, msg)
else: else:
@ -138,22 +137,22 @@ def multiply(s: bytes, pub: bytes, return_serialized: bool = True) -> bytes:
('raw' options passed in) ('raw' options passed in)
''' '''
try: try:
ECPrivkey(int.to_bytes(s, length=32, byteorder="big")) ecc.ECPrivkey(int.to_bytes(s, length=32, byteorder="big"))
except ValueError: except ValueError:
raise ValueError("Invalid tweak for libsecp256k1 " raise ValueError("Invalid tweak for libsecp256k1 "
"multiply: {}".format(bintohex(s))) "multiply: {}".format(bintohex(s)))
pub_obj = ECPubkey(pub) pub_obj = ecc.ECPubkey(pub)
res = pub_obj * s res = pub_obj * s
if not return_serialized: if not return_serialized:
return res return res
return res.get_public_key_bytes() return res.get_public_key_bytes()
def add_pubkeys(pubkeys: List[bytes]) -> ECPubkey: def add_pubkeys(pubkeys: List[bytes]) -> ecc.ECPubkey:
'''Input a list of binary compressed pubkeys '''Input a list of binary compressed pubkeys
and return their sum as a binary compressed pubkey.''' and return their sum as a binary compressed pubkey.'''
pubkey_list = [ECPubkey(x) for x in pubkeys] pubkey_list = [ecc.ECPubkey(x) for x in pubkeys]
if pubkey_list: if pubkey_list:
r = pubkey_list[0] r = pubkey_list[0]
for p in pubkey_list[1:]: for p in pubkey_list[1:]:

4
electrum/plugins/joinmarket/jmclient/podle.py

@ -7,7 +7,7 @@ import hashlib
import struct import struct
from pprint import pformat from pprint import pformat
from electrum.ecc import ECPubkey, ECPrivkey import electrum_ecc as ecc
from ..jmbitcoin import (multiply, add_pubkeys, getG, podle_PublicKey, from ..jmbitcoin import (multiply, add_pubkeys, getG, podle_PublicKey,
podle_PrivateKey, N, podle_PublicKey_class) podle_PrivateKey, N, podle_PublicKey_class)
@ -110,7 +110,7 @@ class PoDLE(object):
k = os.urandom(32) k = os.urandom(32)
k_int = int.from_bytes(k, byteorder='big') k_int = int.from_bytes(k, byteorder='big')
J = getNUMS(self.i) J = getNUMS(self.i)
KG = ECPubkey(ECPrivkey(k).get_public_key_bytes()) KG = ecc.ECPubkey(ecc.ECPrivkey(k).get_public_key_bytes())
KJ = multiply(k_int, J.get_public_key_bytes(), return_serialized=False) KJ = multiply(k_int, J.get_public_key_bytes(), return_serialized=False)
self.P2 = getP2(self.priv, J) self.P2 = getP2(self.priv, J)
self.get_commitment() self.get_commitment()

3
electrum/plugins/joinmarket/tests/jmbitcoin/test_ecc_signing.py

@ -9,7 +9,8 @@ import json
import pytest import pytest
import os import os
from electrum import ecc import electrum_ecc as ecc
from electrum.plugins.joinmarket import jmbitcoin as btc from electrum.plugins.joinmarket import jmbitcoin as btc
from electrum.plugins.joinmarket.jmbase import bintohex from electrum.plugins.joinmarket.jmbase import bintohex

7
electrum/plugins/joinmarket/tests/test_jm_base_code.py

@ -1,6 +1,7 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
from electrum.ecc import ECPrivkey, InvalidECPointException import electrum_ecc as ecc
from electrum.transaction import Transaction from electrum.transaction import Transaction
from electrum.util import bfh, TxMinedInfo from electrum.util import bfh, TxMinedInfo
from electrum.plugins.joinmarket.jmbase import utxostr_to_utxo from electrum.plugins.joinmarket.jmbase import utxostr_to_utxo
@ -29,7 +30,7 @@ class JMBaseCodeMixinTestCase(JMTestCase):
async def test_mk_freeze_script(self): async def test_mk_freeze_script(self):
jmw = self.jmw jmw = self.jmw
privk = ECPrivkey.generate_random_key() privk = ecc.ECPrivkey.generate_random_key()
pubk_bytes = privk.get_public_key_bytes() pubk_bytes = privk.get_public_key_bytes()
locktime = 500000000 + 1723833376 # 16 Aug 2024, 18:36:16 UTC locktime = 500000000 + 1723833376 # 16 Aug 2024, 18:36:16 UTC
script = jmw.mk_freeze_script(pubk_bytes, locktime) script = jmw.mk_freeze_script(pubk_bytes, locktime)
@ -44,7 +45,7 @@ class JMBaseCodeMixinTestCase(JMTestCase):
script = jmw.mk_freeze_script(locktime, locktime) script = jmw.mk_freeze_script(locktime, locktime)
bad_pubk_bytes = b'\x02' + b'\x05'*32 bad_pubk_bytes = b'\x02' + b'\x05'*32
with self.assertRaises(InvalidECPointException): with self.assertRaises(ecc.InvalidECPointException):
script = jmw.mk_freeze_script(bad_pubk_bytes, locktime) script = jmw.mk_freeze_script(bad_pubk_bytes, locktime)
async def test_redeem_script_to_p2wsh_script(self): async def test_redeem_script_to_p2wsh_script(self):

2
electrum/plugins/joinmarket/tests/test_jm_util.py

@ -2,9 +2,9 @@
import os import os
import electrum_ecc as ecc
from cryptography.hazmat.primitives.asymmetric.x25519 import X25519PrivateKey from cryptography.hazmat.primitives.asymmetric.x25519 import X25519PrivateKey
from electrum import ecc
from electrum.bitcoin import sha256 from electrum.bitcoin import sha256
from electrum.transaction import Transaction from electrum.transaction import Transaction
from electrum.util import to_bytes, bfh from electrum.util import to_bytes, bfh

Loading…
Cancel
Save