def ECP_SpDSA(S, F): FS = curve.EFS G = generator() m = hashlib.new(curve.SHA) m.update(F) H = m.digest() HS = m.digest_size if HS >= FS: B = H[0:FS] else: B = bytearray(FS) for i in range(0, HS): B[i + FS - HS] = H[i] C = bytearray(FS) D = bytearray(FS) r = curve.r s = big.from_bytes(S) f = big.from_bytes(B) c = 0 d = 0 while d == 0: u = big.rand(curve.r) w = big.rand(curve.r) # masking V = G.copy() V = u * V vx = V.getx() c = vx % r if c == 0: continue u = big.modmul(u, w, r) u = big.invmodp(u, r) d = big.modmul(s, c, r) d += f d = big.modmul(d, w, r) d = big.modmul(d, u, r) C = big.to_bytes(c) D = big.to_bytes(d) return C, D
def ECP_SvDSA(P, F, C, D): FS = curve.EFS G = generator() m = hashlib.new(curve.SHA) m.update(F) H = m.digest() HS = m.digest_size if HS >= FS: B = H[0:FS] else: B = bytearray(FS) for i in range(0, HS): B[i + FS - HS] = H[i] c = big.from_bytes(C) d = big.from_bytes(D) f = big.from_bytes(B) r = curve.r if c == 0 or c >= r or d == 0 or d >= r: return False d = big.invmodp(d, r) f = big.modmul(f, d, r) h2 = big.modmul(c, d, r) WP = ECp() if not WP.fromBytes(P): return False P = ECp.mul(WP, h2, G, f) if P.isinf(): return False d = P.getx() % r if c != d: return False return True
def inverse(self): return Fp(big.invmodp(self.x, Fp.p))