Coverage for /var/srv/projects/api.amasfac.comuna18.com/tmp/venv/lib/python3.9/site-packages/ellipticcurve/curve.py: 50%

40 statements  

« prev     ^ index     » next       coverage.py v6.4.4, created at 2023-07-17 14:22 -0600

1# 

2# Elliptic Curve Equation 

3# 

4# y^2 = x^3 + A*x + B (mod P) 

5# 

6from .math import Math 

7from .point import Point 

8 

9 

10class CurveFp: 

11 

12 def __init__(self, A, B, P, N, Gx, Gy, name, oid, nistName=None): 

13 self.A = A 

14 self.B = B 

15 self.P = P 

16 self.N = N 

17 self.G = Point(Gx, Gy) 

18 self.name = name 

19 self.nistName = nistName 

20 self.oid = oid # ASN.1 Object Identifier 

21 

22 def contains(self, p): 

23 """ 

24 Verify if the point `p` is on the curve 

25 

26 :param p: Point p = Point(x, y) 

27 :return: boolean 

28 """ 

29 if not 0 <= p.x <= self.P - 1: 

30 return False 

31 if not 0 <= p.y <= self.P - 1: 

32 return False 

33 if (p.y**2 - (p.x**3 + self.A * p.x + self.B)) % self.P != 0: 

34 return False 

35 return True 

36 

37 def length(self): 

38 return (1 + len("%x" % self.N)) // 2 

39 

40 def y(self, x, isEven): 

41 ySquared = (pow(x, 3, self.P) + self.A * x + self.B) % self.P 

42 y = Math.modularSquareRoot(ySquared, self.P) 

43 if isEven != (y % 2 == 0): 

44 y = self.P - y 

45 return y 

46 

47 

48_curvesByOid = {tuple(curve.oid): curve for curve in []} 

49 

50 

51def add(curve): 

52 _curvesByOid[tuple(curve.oid)] = curve 

53 

54 

55def getByOid(oid): 

56 if oid not in _curvesByOid: 

57 raise Exception("Unknown curve with oid {oid}; The following are registered: {names}".format( 

58 oid=".".join([str(number) for number in oid]), 

59 names=", ".join([curve.name for curve in _curvesByOid.values()]), 

60 )) 

61 return _curvesByOid[oid] 

62 

63 

64secp256k1 = CurveFp( 

65 name="secp256k1", 

66 A=0x0000000000000000000000000000000000000000000000000000000000000000, 

67 B=0x0000000000000000000000000000000000000000000000000000000000000007, 

68 P=0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f, 

69 N=0xfffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364141, 

70 Gx=0x79be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798, 

71 Gy=0x483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8, 

72 oid=[1, 3, 132, 0, 10] 

73) 

74 

75prime256v1 = CurveFp( 

76 name="prime256v1", 

77 nistName="P-256", 

78 A=0xffffffff00000001000000000000000000000000fffffffffffffffffffffffc, 

79 B=0x5ac635d8aa3a93e7b3ebbd55769886bc651d06b0cc53b0f63bce3c3e27d2604b, 

80 P=0xffffffff00000001000000000000000000000000ffffffffffffffffffffffff, 

81 N=0xffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551, 

82 Gx=0x6b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c296, 

83 Gy=0x4fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f5, 

84 oid=[1, 2, 840, 10045, 3, 1, 7], 

85) 

86 

87p256 = prime256v1 

88 

89add(secp256k1) 

90add(prime256v1)