mirror of
https://github.com/bitcoin/bitcoin.git
synced 2025-03-08 18:13:40 +01:00
Merge bitcoin/bitcoin#27538: test: Remove modinv python util helper function
dc14ba08e6
test: remove modinv python util helper function (Fabian Jahr) Pull request description: Since #27483 was merged the `modinv()` body is just one line calling pythons own implementation of `pow()`. We can just remove the function as it doesn't seem to add any value. Additionally the comment in the function is now outdated and the test is only testing two ways of doing modular inverse but both using python's `pow()` function. ACKs for top commit: theStack: ACKdc14ba08e6
Tree-SHA512: e8b470c72dc3f9fd53699d0684650517b1ea35ad1d4c01cf9472c80d3e4474c0c72e429c0bd201eb99d204c87eee0d68285e6a388e4c506f30e14b2bff9c1c32
This commit is contained in:
commit
be0325c6a6
3 changed files with 4 additions and 28 deletions
|
@ -13,8 +13,6 @@ import os
|
||||||
import random
|
import random
|
||||||
import unittest
|
import unittest
|
||||||
|
|
||||||
from .util import modinv
|
|
||||||
|
|
||||||
# Point with no known discrete log.
|
# Point with no known discrete log.
|
||||||
H_POINT = "50929b74c1a04954b78b4b6035e97a5e078a5a0f28ec96d547bfee9ace803ac0"
|
H_POINT = "50929b74c1a04954b78b4b6035e97a5e078a5a0f28ec96d547bfee9ace803ac0"
|
||||||
|
|
||||||
|
@ -78,7 +76,7 @@ class EllipticCurve:
|
||||||
x1, y1, z1 = p1
|
x1, y1, z1 = p1
|
||||||
if z1 == 0:
|
if z1 == 0:
|
||||||
return None
|
return None
|
||||||
inv = modinv(z1, self.p)
|
inv = pow(z1, -1, self.p)
|
||||||
inv_2 = (inv**2) % self.p
|
inv_2 = (inv**2) % self.p
|
||||||
inv_3 = (inv_2 * inv) % self.p
|
inv_3 = (inv_2 * inv) % self.p
|
||||||
return ((inv_2 * x1) % self.p, (inv_3 * y1) % self.p, 1)
|
return ((inv_2 * x1) % self.p, (inv_3 * y1) % self.p, 1)
|
||||||
|
@ -319,7 +317,7 @@ class ECPubKey():
|
||||||
z = int.from_bytes(msg, 'big')
|
z = int.from_bytes(msg, 'big')
|
||||||
|
|
||||||
# Run verifier algorithm on r, s
|
# Run verifier algorithm on r, s
|
||||||
w = modinv(s, SECP256K1_ORDER)
|
w = pow(s, -1, SECP256K1_ORDER)
|
||||||
u1 = z*w % SECP256K1_ORDER
|
u1 = z*w % SECP256K1_ORDER
|
||||||
u2 = r*w % SECP256K1_ORDER
|
u2 = r*w % SECP256K1_ORDER
|
||||||
R = SECP256K1.affine(SECP256K1.mul([(SECP256K1_G, u1), (self.p, u2)]))
|
R = SECP256K1.affine(SECP256K1.mul([(SECP256K1_G, u1), (self.p, u2)]))
|
||||||
|
@ -397,7 +395,7 @@ class ECKey():
|
||||||
k = random.randrange(1, SECP256K1_ORDER)
|
k = random.randrange(1, SECP256K1_ORDER)
|
||||||
R = SECP256K1.affine(SECP256K1.mul([(SECP256K1_G, k)]))
|
R = SECP256K1.affine(SECP256K1.mul([(SECP256K1_G, k)]))
|
||||||
r = R[0] % SECP256K1_ORDER
|
r = R[0] % SECP256K1_ORDER
|
||||||
s = (modinv(k, SECP256K1_ORDER) * (z + self.secret * r)) % SECP256K1_ORDER
|
s = (pow(k, -1, SECP256K1_ORDER) * (z + self.secret * r)) % SECP256K1_ORDER
|
||||||
if low_s and s > SECP256K1_ORDER_HALF:
|
if low_s and s > SECP256K1_ORDER_HALF:
|
||||||
s = SECP256K1_ORDER - s
|
s = SECP256K1_ORDER - s
|
||||||
# Represent in DER format. The byte representations of r and s have
|
# Represent in DER format. The byte representations of r and s have
|
||||||
|
|
|
@ -6,8 +6,6 @@
|
||||||
import hashlib
|
import hashlib
|
||||||
import unittest
|
import unittest
|
||||||
|
|
||||||
from .util import modinv
|
|
||||||
|
|
||||||
def rot32(v, bits):
|
def rot32(v, bits):
|
||||||
"""Rotate the 32-bit value v left by bits bits."""
|
"""Rotate the 32-bit value v left by bits bits."""
|
||||||
bits %= 32 # Make sure the term below does not throw an exception
|
bits %= 32 # Make sure the term below does not throw an exception
|
||||||
|
@ -88,7 +86,7 @@ class MuHash3072:
|
||||||
|
|
||||||
def digest(self):
|
def digest(self):
|
||||||
"""Extract the final hash. Does not modify this object."""
|
"""Extract the final hash. Does not modify this object."""
|
||||||
val = (self.numerator * modinv(self.denominator, self.MODULUS)) % self.MODULUS
|
val = (self.numerator * pow(self.denominator, -1, self.MODULUS)) % self.MODULUS
|
||||||
bytes384 = val.to_bytes(384, 'little')
|
bytes384 = val.to_bytes(384, 'little')
|
||||||
return hashlib.sha256(bytes384).digest()
|
return hashlib.sha256(bytes384).digest()
|
||||||
|
|
||||||
|
|
|
@ -15,7 +15,6 @@ import os
|
||||||
import random
|
import random
|
||||||
import re
|
import re
|
||||||
import time
|
import time
|
||||||
import unittest
|
|
||||||
|
|
||||||
from . import coverage
|
from . import coverage
|
||||||
from .authproxy import AuthServiceProxy, JSONRPCException
|
from .authproxy import AuthServiceProxy, JSONRPCException
|
||||||
|
@ -537,22 +536,3 @@ def find_vout_for_address(node, txid, addr):
|
||||||
if addr == tx["vout"][i]["scriptPubKey"]["address"]:
|
if addr == tx["vout"][i]["scriptPubKey"]["address"]:
|
||||||
return i
|
return i
|
||||||
raise RuntimeError("Vout not found for address: txid=%s, addr=%s" % (txid, addr))
|
raise RuntimeError("Vout not found for address: txid=%s, addr=%s" % (txid, addr))
|
||||||
|
|
||||||
def modinv(a, n):
|
|
||||||
"""Compute the modular inverse of a modulo n using the extended Euclidean
|
|
||||||
Algorithm. See https://en.wikipedia.org/wiki/Extended_Euclidean_algorithm#Modular_integers.
|
|
||||||
"""
|
|
||||||
return pow(a, -1, n)
|
|
||||||
|
|
||||||
class TestFrameworkUtil(unittest.TestCase):
|
|
||||||
def test_modinv(self):
|
|
||||||
test_vectors = [
|
|
||||||
[7, 11],
|
|
||||||
[11, 29],
|
|
||||||
[90, 13],
|
|
||||||
[1891, 3797],
|
|
||||||
[6003722857, 77695236973],
|
|
||||||
]
|
|
||||||
|
|
||||||
for a, n in test_vectors:
|
|
||||||
self.assertEqual(modinv(a, n), pow(a, n-2, n))
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue