import bls12381 from collections import namedtuple from ec import untwist from fields import Fq12 # Struct for elliptic curve parameters EC = namedtuple("EC", "q a b gx gy g2x g2y n h x k sqrt_n3 sqrt_n3m1o2") # use secp256k1 as default default_ec = EC(*bls12381.parameters()) default_ec_twist = EC(*bls12381.parameters()) def int_to_bits(i): if i < 1: return [0] bits = [] while i != 0: bits.append(i % 2) i = i // 2 return list(reversed(bits)) def double_line_eval(R, P, ec=default_ec): """ Creates an equation for a line tangent to R, and evaluates this at the point P. f(x) = y - sv - v. f(P). """ R12 = untwist(R)
from __future__ import annotations from typing import List, Optional import bls12381 from collections import namedtuple from copy import deepcopy from fields import FieldExtBase, Fq, Fq2, Fq6, Fq12 from util import hash256 # Struct for elliptic curve parameters EC = namedtuple("EC", "q a b gx gy g2x g2y n h x k sqrt_n3 sqrt_n3m1o2") # use secp256k1 as default default_ec = EC(*bls12381.parameters()) default_ec_twist = EC(*bls12381.parameters_twist()) class AffinePoint: """ Elliptic curve point, can represent any curve, and use Fq or Fq2 coordinates. """ def __init__(self, x, y, infinity: bool, ec=default_ec): if ((not isinstance(x, Fq) and not isinstance(x, FieldExtBase)) or (not isinstance(y, Fq) and not isinstance(y, FieldExtBase)) or type(x) != type(y)): raise Exception("x,y should be field elements") self.FE = type(x) self.x = x self.y = y self.infinity = infinity self.ec = ec