def _sign_loop(self, r, s, h, k, priv): while r == 0 or s == 0: if k is None: k = (getrandbits(self.bits) % (self.N - 1)) + 1 kinv = inv(k, self.N) kg = mulp(self.a, self.b, self.p, self.G, k) r = kg[0] % self.N if r == 0: continue s = (kinv * (h + r * priv)) % self.N return r, s
def sign(self, h, priv, k=None): while h > self.N: h >>= 1 r = s = 0 while r == 0 or s == 0: if k is None: k = (getrandbits(self.bits) % (self.N - 1)) + 1 kinv = inv(k, self.N) kg = mulp(self.a, self.b, self.p, self.G, k) r = kg[0] % self.N if r == 0: continue s = (kinv * (h + r * priv)) % self.N return self.int2bytes(r) + self.int2bytes(s)
def dh_z(self, priv, pub): return self.int2bytes(mulp(self.a, self.b, self.p, pub, priv)[0])
def public_key_for(self, priv): return mulp(self.a, self.b, self.p, self.G, priv)
def key_pair(self): priv = (getrandbits(self.bits) % (self.N - 1)) + 1 pub = mulp(self.a, self.b, self.p, self.G, priv) return priv, pub