Add link to fork activation discussion
[bitcoinninja] / secp256k1.ecdsa.sage
1 #Simple ECDSA sage notebook (greg@xiph.org)
2
3 #Parameters for secp256k1
4 F = FiniteField (0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFC2F)
5 C = EllipticCurve ([F (0), F (7)])
6 G = C.lift_x(0x79BE667EF9DCBBAC55A06295CE870B07029BFCDB2DCE28D959F2815B16F81798)
7 N = FiniteField (C.order()) # how many points are in our curve
8
9 d = int(F.random_element()) # our secret
10 pd = G*d # our pubkey
11 e = int(N.random_element()) # our message
12
13 #sign
14 k = N.random_element() # our nonce
15 r = (int(k)*G).xy()[0]
16 s = (1/k)*(e+N(r)*d)
17
18 #verify
19 w = 1/N(s)
20 r == (int(w*e)*G + int(N(r)*w)*pd).xy()[0]
21
22 #mutate
23 s2 = N(s)*N(-1)
24 s2 != s
25 w = 1/s2
26 r == (int(w*e)*G + int(N(r)*w)*pd).xy()[0]  # sign flip mutant