BREAKING CHANGE: Library now requires system-installed dependencies Major Changes: - Convert secp256k1 from bundled static lib to system dependency - Convert OpenSSL from bundled static lib to system dependency - Convert curl from bundled static lib to system dependency - Update build.sh with pkg-config detection and fallback logic - Remove all static library extraction/building logic - Update README.md with new dependency requirements and installation Build System: - Add detect_system_secp256k1() with pkg-config support - Add detect_system_openssl() with pkg-config support - Add detect_system_curl() with pkg-config support - Remove secp256k1 building/extraction from ar archive - Update CFLAGS and LIBS to use system library variables - Clear error messages for missing dependencies with install commands Documentation: - Add system dependency installation for Ubuntu/Debian/CentOS/macOS - Update all compile/link examples to include -lssl -lcrypto -lcurl -lsecp256k1 - Remove references to 'self-contained' and 'no external dependencies' - Update integration examples throughout README Benefits: - Smaller library size (only internal code bundled) - Automatic security updates via system package manager - Standard Linux library distribution pattern - Reduced build complexity - Better system integration with pkg-config Required Installation: Ubuntu/Debian: sudo apt install libssl-dev libcurl4-openssl-dev libsecp256k1-dev CentOS/RHEL: sudo yum install openssl-devel libcurl-devel libsecp256k1-devel macOS: brew install openssl curl secp256k1
40 lines
1023 B
Python
40 lines
1023 B
Python
"""Prime order of finite field underlying secp256k1 (2^256 - 2^32 - 977)"""
|
|
P = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFC2F
|
|
|
|
"""Finite field underlying secp256k1"""
|
|
F = FiniteField(P)
|
|
|
|
"""Elliptic curve secp256k1: y^2 = x^3 + 7"""
|
|
C = EllipticCurve([F(0), F(7)])
|
|
|
|
"""Base point of secp256k1"""
|
|
G = C.lift_x(0x79BE667EF9DCBBAC55A06295CE870B07029BFCDB2DCE28D959F2815B16F81798)
|
|
if int(G[1]) & 1:
|
|
# G.y is even
|
|
G = -G
|
|
|
|
"""Prime order of secp256k1"""
|
|
N = C.order()
|
|
|
|
"""Finite field of scalars of secp256k1"""
|
|
Z = FiniteField(N)
|
|
|
|
""" Beta value of secp256k1 non-trivial endomorphism: lambda * (x, y) = (beta * x, y)"""
|
|
BETA = F(2)^((P-1)/3)
|
|
|
|
""" Lambda value of secp256k1 non-trivial endomorphism: lambda * (x, y) = (beta * x, y)"""
|
|
LAMBDA = Z(3)^((N-1)/3)
|
|
|
|
assert is_prime(P)
|
|
assert is_prime(N)
|
|
|
|
assert BETA != F(1)
|
|
assert BETA^3 == F(1)
|
|
assert BETA^2 + BETA + 1 == 0
|
|
|
|
assert LAMBDA != Z(1)
|
|
assert LAMBDA^3 == Z(1)
|
|
assert LAMBDA^2 + LAMBDA + 1 == 0
|
|
|
|
assert Integer(LAMBDA)*G == C(BETA*G[0], G[1])
|