def validate(m, R, Q, n, Elist, char, signature): # m, Q, n, Elist, char as above # R is d*Q, this is Alice's public key # signature is the list [r, s] as above r = signature[0] s = signature[1] z = HashMessage(m, n) w = EC.invMod(s, n) w = w%n u1 = (z*w)%n u2 = (r*w)%n u1Q = EC.nP(u1, Q, Elist, char) u2R = EC.nP(u2, R, Elist, char) T = EC.addPts(u1Q, u2R, Elist, char) return ( (T[0])%n == r%n)
def sign(m, d, Q, n, Elist, char): z = HashMessage(m, n) myRand = random.SystemRandom() # a cryptographically secure random number generator r = 0 while(r == 0): k = myRand.randint(1, n-1) kQ = EC.nP(k, Q, Elist, char) r = kQ[0]%n # if r = 0 we will keep looping # only compute s if r is not zero if(r != 0): k_inv = EC.invMod(k, n) s = (k_inv*(z + r*d))%n if(s == 0): # if s equals 0 r = 0 # choose a new k and compute r and s again return [r, s]