arnaucube
arnaucube/mathPublic Self-hosted repository
math/ring-signatures_test.sage
ring-signatures_test.sageRaw
 1import unittest, operator
 2load("ring-signatures.sage")
 3
 4# ethereum elliptic curve
 5p = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFC2F
 6a = 0
 7b = 7
 8F = GF(p)
 9E = EllipticCurve(F, [a,b])
10GX = 0x79BE667EF9DCBBAC55A06295CE870B07029BFCDB2DCE28D959F2815B16F81798
11GY = 0x483ADA7726A3C4655DA4FBFC0E1108A8FD17B448A68554199C47D08FFB10D4B8
12g = E(GX,GY)
13n = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141
14h = 1
15q = g.order()
16assert is_prime(p)
17assert is_prime(q)
18assert g * q == 0
19
20
21class TestRingSignatures(unittest.TestCase):
22        def test_blSAG_ring_of_5(self):
23                test_blSAG(5, 3)
24        def test_blSAG_ring_of_20(self):
25                test_blSAG(20, 14)
26
27def test_blSAG(ring_size, pi):
28        print(f"[blSAG] Testing with a ring of {ring_size} keys")
29        prover = Prover(F, g)
30        n = ring_size
31        R = [None] * n
32
33        # generate prover's key pair
34        K_pi = prover.new_key()
35
36        # generate other n public keys
37        for i in range(0, n):
38            R[i] = g * i
39
40        # set K_pi
41        R[pi] = K_pi
42
43        # sign m
44        m = 1234
45        print("sign")
46        sig = prover.sign(m, R)
47
48        print("verify")
49        key_image = prover.w * hashToPoint(prover.K)
50        verify(g, R, m, key_image, sig)
51
52if __name__ == '__main__':
53        unittest.main()