def generate(self, m): l, n, seed_len = self.l, self.n, self.seed_len p, q = PrimeGenerator(10).generate(2048, 224, 256) g = pow(2, (p - 1) / q, p) x = rnd.randrange(1, q) y = pow(g, x, p) k = rnd.randrange(1, q) r = pow(g, k, p) % q s = mul_by_mod(div_by_mod(1, k, q), sha256(m) + x * r, q) return DSAResult(r, s), p, q, g, y
def is_valid(self, m, p, q, g, y): if self.r <= 0 or self.r >= q: return False if self.s <= 0 or self.s >= q: return False w = div_by_mod(1, self.s, q) u1 = mul_by_mod(sha256(m), w, q) u2 = mul_by_mod(self.r, w, q) v = mul_by_mod(pow(g, u1, p), pow(y, u2, p), p) % q return v == self.r
def generate(self, M): alpha = sha256(M) e = alpha % self.ec.n e = 1 if e == 0 else e while True: k = rnd.randrange(1, self.ec.n) C = k * self.ec.G r = C.x % self.ec.n if r == 0: continue s = (r * self.d + k * e) % (self.ec.n) if s == 0: continue return r, s
def validate(self, M, r, s): if r <= 0 or r >= self.ec.n: return False if s <= 0 or s >= self.ec.n: return False alpha = sha256(M) e = alpha % self.ec.n e = 1 if e == 0 else e v = div_by_mod(1, e, self.ec.n) z1 = mul_by_mod(s, v, self.ec.n) z2 = mul_by_mod(-r, v, self.ec.n) C = z1 * self.ec.G + z2 * self.Q R = C.x % self.ec.n return R == r