#!/usr/bin/python
from tinyec import registry
from tinyec import ec
#import secrets
from sympy import mod_inverse
import hashlib, binascii
# the nist p-256 curve
curve = registry.get_curve('secp256r1')
# read public key from cert file
x = 0xe3e8508686b75ff37fcf19bc129642f519a3c40aca4d6de0adcf3aaa4f392426;
print(len(x))
print(len('74ebdd2578501ba7cf4e4de9106ac488fed49d2c3093e5405752868541a284a2'))
y = 0x875d94349dd33238e8f421c4dd384e2120ed771e3a2c2aa28295c5f438b545bf;
public_key = ec.Point(curve, x, y)
print('pulickey=',public_key)
print(len('875d94349dd33238e8f421c4dd384e2120ed771e3a2c2aa28295c5f438b545bf'))
# message for test
#msg = open(somefile, 'rb').read()
msg = b'good'
print("msg:", msg)
# message's signaure (r, s) for test
#r = 0xc4055604cc9a8b665fef4a70377340e401a5899dfd4851b929150c3294f85039;
#s = 0x1dd873ce70ad969644d2dd6839716d5ef1bbb133fbb0074bcbcba6e4b3cc9b2e;
r = 0x00b57d7dc046739c198b42ad3bbf1dd69306f4de55eafd4bcd578f9df7eacf6dbc
s = 0x00f48e6ce213d7aeda74cae304dc8fa31b561e5efebe2f81efdee429f7b7466b5e;
print("signture r:" , hex(r))
print("signture s:" , hex(s))
#verify
sha = hashlib.sha256()
sha.update(msg)
v_dgst = sha.digest()
print("msg dgst:", binascii.hexlify(v_dgst))
w = mod_inverse(s, curve.field.n)
u1 = int.from_bytes(v_dgst, "big")*w % curve.field.n
u2 = r*w % curve.field.n
X = u1*curve.g + u2*public_key
v = X.x % curve.field.n
print("v:" , hex(v))
verify_result = v == r
print("verify result: ", verify_result)