Compare commits

..

No commits in common. "c3bf4673eef87eab03e697fd395e3623aae05074" and "cf0cf4e58584ee3148e562ef20ed33b3505c5a02" have entirely different histories.

View File

@ -454,7 +454,7 @@ def SignOutputRaw(json):
req = rpc_pb2.SignOutputRawRequest()
json_format.Parse(json, req)
#assert len(req.signDesc.pubKey) in [33, 0]
assert len(req.signDesc.pubKey) in [33, 0]
assert len(req.signDesc.doubleTweak) in [32, 0]
assert len(req.signDesc.sigHashes.hashPrevOuts) == 64
assert len(req.signDesc.sigHashes.hashSequence) == 64
@ -469,8 +469,11 @@ def SignOutputRaw(json):
def signOutputRaw(tx, signDesc):
pri = derivePrivKey(signDesc.keyDescriptor)
assert pri is not None
adr = None
if len(signDesc.pubKey) != 0:
adr = bitcoin.pubkey_to_address('p2wpkh', binascii.hexlify(
signDesc.keyDescriptor.pubKey).decode("utf-8")) # Because this is all NewAddress supports
pri = fetchPrivKey(adr, signDesc.keyDescriptor.keyLocator.family, signDesc.keyDescriptor.keyLocator.index)
pri2 = maybeTweakPrivKey(signDesc, pri)
sig = rawTxInWitnessSignature(tx, signDesc.sigHashes, signDesc.inputIndex,
signDesc.output.value, signDesc.witnessScript, sigHashAll, pri2)
@ -520,30 +523,35 @@ def ComputeInputScript(json):
return msg
def fetchPrivKey(str_address, keyLocatorFamily, keyLocatorIndex):
def fetchPrivKey(str_address, keyLocatorFamily, keyLocatorIndex, privKey=None):
pri = None
if str_address is not None:
assert privKey is None
pri, redeem_script = WALLET.export_private_key(str_address, None)
if redeem_script:
print("ignoring redeem script", redeem_script)
typ, pri, compressed = bitcoin.deserialize_privkey(pri)
if keyLocatorFamily == 0 and keyLocatorIndex == 0: return EC_KEY(pri)
ks = keystore.BIP32_KeyStore({})
der = "m/0'/"
xtype = 'p2wpkh'
ks.add_xprv_from_seed(pri, xtype, der)
ks.add_xprv_from_seed(int.from_bytes(pri, "big"), xtype, der)
elif privKey is not None:
ks = keystore.BIP32_KeyStore({})
der = "m/0'/"
xtype = 'p2wpkh'
ks.add_xprv_from_seed(privKey.secret.to_bytes(32, 'big'), xtype, der)
else:
ks = WALLET.keystore
if keyLocatorFamily != 0 or keyLocatorIndex != 0:
if keyLocatorFamily is not None or keyLocatorIndex is not None:
pri = ks.get_private_key([1017, keyLocatorFamily, keyLocatorIndex], password=None)[0]
pri = EC_KEY(pri)
assert pri is not None
else:
pri = privKey
return pri
@ -793,7 +801,6 @@ async def readReqAndReply(obj, writer):
await writer.drain()
def privKeyForPubKey(pubKey):
global globalIdx
priv_keys = WALLET.storage.get("lightning_extra_keys", [])
for i in priv_keys:
candidate = EC_KEY(i.to_bytes(32, "big"))
@ -815,20 +822,21 @@ def privKeyForPubKey(pubKey):
print("ignoring redeem script", redeem_script)
typ, pri, compressed = bitcoin.deserialize_privkey(pri)
return EC_KEY(pri)
return EC_KEY(pri.to_bytes(32, "big"))
#assert False, "could not find private key for pubkey {} hex={}".format(pubKey, binascii.hexlify(pubKey).decode("ascii"))
def derivePrivKey(keyDesc):
global globalIdx
keyDescFam = keyDesc.keyLocator.family
keyDescIdx = keyDesc.keyLocator.index
keyDescPubKey = keyDesc.pubKey
privKey = None
if len(keyDescPubKey) != 0:
return privKeyForPubKey(keyDescPubKey)
privKey = privKeyForPubKey(keyDescPubKey)
return fetchPrivKey(None, keyDescFam, keyDescIdx)
return fetchPrivKey(None, keyDescFam, keyDescIdx, privKey)
def DerivePrivKey(json):
req = rpc_pb2.DerivePrivKeyRequest()
@ -903,7 +911,7 @@ def ScalarMult(json):
m = rpc_pb2.ScalarMultResponse()
m.hashResult = c.digest()
m.pubKey = pubkFromECKEY(EC_KEY(c.digest()))
msg = json_format.MessageToJson(m)
return msg