• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

tlsfuzzer / python-ecdsa / 13832902924

13 Mar 2025 10:54AM CUT coverage: 99.579% (+0.001%) from 99.578%
13832902924

Pull #359

github

web-flow
Merge 658ddc81b into 3c5df06ae
Pull Request #359: add release notes for 0.19.1 release

2560 of 2571 branches covered (99.57%)

Branch coverage included in aggregate %.

6663 of 6691 relevant lines covered (99.58%)

19.18 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

100.0
/src/ecdsa/ecdsa.py
1
#! /usr/bin/env python
2

3
"""
12✔
4
Low level implementation of Elliptic-Curve Digital Signatures.
5

6
.. note ::
7
    You're most likely looking for the :py:class:`~ecdsa.keys` module.
8
    This is a low-level implementation of the ECDSA that operates on
9
    integers, not byte strings.
10

11
NOTE: This a low level implementation of ECDSA, for normal applications
12
you should be looking at the keys.py module.
13

14
Classes and methods for elliptic-curve signatures:
15
private keys, public keys, signatures,
16
and definitions of prime-modulus curves.
17

18
Example:
19

20
.. code-block:: python
21

22
   # (In real-life applications, you would probably want to
23
   # protect against defects in SystemRandom.)
24
   from random import SystemRandom
25
   randrange = SystemRandom().randrange
26

27
   # Generate a public/private key pair using the NIST Curve P-192:
28

29
   g = generator_192
30
   n = g.order()
31
   secret = randrange( 1, n )
32
   pubkey = Public_key( g, g * secret )
33
   privkey = Private_key( pubkey, secret )
34

35
   # Signing a hash value:
36

37
   hash = randrange( 1, n )
38
   signature = privkey.sign( hash, randrange( 1, n ) )
39

40
   # Verifying a signature for a hash value:
41

42
   if pubkey.verifies( hash, signature ):
43
     print("Demo verification succeeded.")
44
   else:
45
     print("*** Demo verification failed.")
46

47
   # Verification fails if the hash value is modified:
48

49
   if pubkey.verifies( hash-1, signature ):
50
     print("**** Demo verification failed to reject tampered hash.")
51
   else:
52
     print("Demo verification correctly rejected tampered hash.")
53

54
Revision history:
55
      2005.12.31 - Initial version.
56

57
      2008.11.25 - Substantial revisions introducing new classes.
58

59
      2009.05.16 - Warn against using random.randrange in real applications.
60

61
      2009.05.17 - Use random.SystemRandom by default.
62

63
Originally written in 2005 by Peter Pearson and placed in the public domain,
64
modified as part of the python-ecdsa package.
65
"""
66

67
import warnings
20✔
68
from six import int2byte
20✔
69
from . import ellipticcurve
20✔
70
from . import numbertheory
20✔
71
from .util import bit_length
20✔
72
from ._compat import remove_whitespace
20✔
73

74

75
class RSZeroError(RuntimeError):
20✔
76
    pass
20✔
77

78

79
class InvalidPointError(RuntimeError):
20✔
80
    pass
20✔
81

82

83
class Signature(object):
20✔
84
    """
85
    ECDSA signature.
86

87
    :ivar int r: the ``r`` element of the ECDSA signature
88
    :ivar int s: the ``s`` element of the ECDSA signature
89
    """
90

91
    def __init__(self, r, s):
20✔
92
        self.r = r
20✔
93
        self.s = s
20✔
94

95
    def recover_public_keys(self, hash, generator):
20✔
96
        """
97
        Returns two public keys for which the signature is valid
98

99
        :param int hash: signed hash
100
        :param AbstractPoint generator: is the generator used in creation
101
            of the signature
102
        :rtype: tuple(Public_key, Public_key)
103
        :return: a pair of public keys that can validate the signature
104
        """
105
        curve = generator.curve()
20✔
106
        n = generator.order()
20✔
107
        r = self.r
20✔
108
        s = self.s
20✔
109
        e = hash
20✔
110
        x = r
20✔
111

112
        # Compute the curve point with x as x-coordinate
113
        alpha = (
20✔
114
            pow(x, 3, curve.p()) + (curve.a() * x) + curve.b()
115
        ) % curve.p()
116
        beta = numbertheory.square_root_mod_prime(alpha, curve.p())
20✔
117
        y = beta if beta % 2 == 0 else curve.p() - beta
20✔
118

119
        # Compute the public key
120
        R1 = ellipticcurve.PointJacobi(curve, x, y, 1, n)
20✔
121
        Q1 = numbertheory.inverse_mod(r, n) * (s * R1 + (-e % n) * generator)
20✔
122
        Pk1 = Public_key(generator, Q1)
20✔
123

124
        # And the second solution
125
        R2 = ellipticcurve.PointJacobi(curve, x, -y, 1, n)
20✔
126
        Q2 = numbertheory.inverse_mod(r, n) * (s * R2 + (-e % n) * generator)
20✔
127
        Pk2 = Public_key(generator, Q2)
20✔
128

129
        return [Pk1, Pk2]
20✔
130

131

132
class Public_key(object):
20✔
133
    """Public key for ECDSA."""
134

135
    def __init__(self, generator, point, verify=True):
20✔
136
        """Low level ECDSA public key object.
137

138
        :param generator: the Point that generates the group (the base point)
139
        :param point: the Point that defines the public key
140
        :param bool verify: if True check if point is valid point on curve
141

142
        :raises InvalidPointError: if the point parameters are invalid or
143
            point does not lay on the curve
144
        """
145

146
        self.curve = generator.curve()
20✔
147
        self.generator = generator
20✔
148
        self.point = point
20✔
149
        n = generator.order()
20✔
150
        p = self.curve.p()
20✔
151
        if not (0 <= point.x() < p) or not (0 <= point.y() < p):
20✔
152
            raise InvalidPointError(
20✔
153
                "The public point has x or y out of range."
154
            )
155
        if verify and not self.curve.contains_point(point.x(), point.y()):
20✔
156
            raise InvalidPointError("Point does not lay on the curve")
20✔
157
        if not n:
20✔
158
            raise InvalidPointError("Generator point must have order.")
20✔
159
        # for curve parameters with base point with cofactor 1, all points
160
        # that are on the curve are scalar multiples of the base point, so
161
        # verifying that is not necessary. See Section 3.2.2.1 of SEC 1 v2
162
        if (
20✔
163
            verify
164
            and self.curve.cofactor() != 1
165
            and not n * point == ellipticcurve.INFINITY
166
        ):
167
            raise InvalidPointError("Generator point order is bad.")
20✔
168

169
    def __eq__(self, other):
20✔
170
        """Return True if the keys are identical, False otherwise.
171

172
        Note: for comparison, only placement on the same curve and point
173
        equality is considered, use of the same generator point is not
174
        considered.
175
        """
176
        if isinstance(other, Public_key):
20✔
177
            return self.curve == other.curve and self.point == other.point
20✔
178
        return NotImplemented
20✔
179

180
    def __ne__(self, other):
20✔
181
        """Return False if the keys are identical, True otherwise."""
182
        return not self == other
20✔
183

184
    def verifies(self, hash, signature):
20✔
185
        """Verify that signature is a valid signature of hash.
186
        Return True if the signature is valid.
187
        """
188

189
        # From X9.62 J.3.1.
190

191
        G = self.generator
20✔
192
        n = G.order()
20✔
193
        r = signature.r
20✔
194
        s = signature.s
20✔
195
        if r < 1 or r > n - 1:
20✔
196
            return False
20✔
197
        if s < 1 or s > n - 1:
20✔
198
            return False
20✔
199
        c = numbertheory.inverse_mod(s, n)
20✔
200
        u1 = (hash * c) % n
20✔
201
        u2 = (r * c) % n
20✔
202
        if hasattr(G, "mul_add"):
20✔
203
            xy = G.mul_add(u1, self.point, u2)
20✔
204
        else:
205
            xy = u1 * G + u2 * self.point
20✔
206
        v = xy.x() % n
20✔
207
        return v == r
20✔
208

209

210
class Private_key(object):
20✔
211
    """Private key for ECDSA."""
212

213
    def __init__(self, public_key, secret_multiplier):
20✔
214
        """public_key is of class Public_key;
215
        secret_multiplier is a large integer.
216
        """
217

218
        self.public_key = public_key
20✔
219
        self.secret_multiplier = secret_multiplier
20✔
220

221
    def __eq__(self, other):
20✔
222
        """Return True if the points are identical, False otherwise."""
223
        if isinstance(other, Private_key):
20✔
224
            return (
20✔
225
                self.public_key == other.public_key
226
                and self.secret_multiplier == other.secret_multiplier
227
            )
228
        return NotImplemented
20✔
229

230
    def __ne__(self, other):
20✔
231
        """Return False if the points are identical, True otherwise."""
232
        return not self == other
20✔
233

234
    def sign(self, hash, random_k):
20✔
235
        """Return a signature for the provided hash, using the provided
236
        random nonce.  It is absolutely vital that random_k be an unpredictable
237
        number in the range [1, self.public_key.point.order()-1].  If
238
        an attacker can guess random_k, he can compute our private key from a
239
        single signature.  Also, if an attacker knows a few high-order
240
        bits (or a few low-order bits) of random_k, he can compute our private
241
        key from many signatures.  The generation of nonces with adequate
242
        cryptographic strength is very difficult and far beyond the scope
243
        of this comment.
244

245
        May raise RuntimeError, in which case retrying with a new
246
        random value k is in order.
247
        """
248

249
        G = self.public_key.generator
20✔
250
        n = G.order()
20✔
251
        k = random_k % n
20✔
252
        # Fix the bit-length of the random nonce,
253
        # so that it doesn't leak via timing.
254
        # This does not change that ks = k mod n
255
        ks = k + n
20✔
256
        kt = ks + n
20✔
257
        if bit_length(ks) == bit_length(n):
20✔
258
            p1 = kt * G
20✔
259
        else:
260
            p1 = ks * G
20✔
261
        r = p1.x() % n
20✔
262
        if r == 0:
20✔
263
            raise RSZeroError("amazingly unlucky random number r")
20✔
264
        s = (
20✔
265
            numbertheory.inverse_mod(k, n)
266
            * (hash + (self.secret_multiplier * r) % n)
267
        ) % n
268
        if s == 0:
20✔
269
            raise RSZeroError("amazingly unlucky random number s")
20✔
270
        return Signature(r, s)
20✔
271

272

273
def int_to_string(x):  # pragma: no cover
274
    """Convert integer x into a string of bytes, as per X9.62."""
275
    # deprecated in 0.19
276
    warnings.warn(
277
        "Function is unused in library code. If you use this code, "
278
        "change to util.number_to_string.",
279
        DeprecationWarning,
280
    )
281
    assert x >= 0
282
    if x == 0:
283
        return b"\0"
284
    result = []
285
    while x:
286
        ordinal = x & 0xFF
287
        result.append(int2byte(ordinal))
288
        x >>= 8
289

290
    result.reverse()
291
    return b"".join(result)
292

293

294
def string_to_int(s):  # pragma: no cover
295
    """Convert a string of bytes into an integer, as per X9.62."""
296
    # deprecated in 0.19
297
    warnings.warn(
298
        "Function is unused in library code. If you use this code, "
299
        "change to util.string_to_number.",
300
        DeprecationWarning,
301
    )
302
    result = 0
303
    for c in s:
304
        if not isinstance(c, int):
305
            c = ord(c)
306
        result = 256 * result + c
307
    return result
308

309

310
def digest_integer(m):  # pragma: no cover
311
    """Convert an integer into a string of bytes, compute
312
    its SHA-1 hash, and convert the result to an integer."""
313
    # deprecated in 0.19
314
    warnings.warn(
315
        "Function is unused in library code. If you use this code, "
316
        "change to a one-liner with util.number_to_string and "
317
        "util.string_to_number methods.",
318
        DeprecationWarning,
319
    )
320
    #
321
    # I don't expect this function to be used much. I wrote
322
    # it in order to be able to duplicate the examples
323
    # in ECDSAVS.
324
    #
325
    from hashlib import sha1
326

327
    return string_to_int(sha1(int_to_string(m)).digest())
328

329

330
def point_is_valid(generator, x, y):
20✔
331
    """Is (x,y) a valid public key based on the specified generator?"""
332

333
    # These are the tests specified in X9.62.
334

335
    n = generator.order()
20✔
336
    curve = generator.curve()
20✔
337
    p = curve.p()
20✔
338
    if not (0 <= x < p) or not (0 <= y < p):
20✔
339
        return False
20✔
340
    if not curve.contains_point(x, y):
20✔
341
        return False
20✔
342
    if (
20✔
343
        curve.cofactor() != 1
344
        and not n * ellipticcurve.PointJacobi(curve, x, y, 1)
345
        == ellipticcurve.INFINITY
346
    ):
347
        return False
20✔
348
    return True
20✔
349

350

351
# secp112r1 curve
352
_p = int(remove_whitespace("DB7C 2ABF62E3 5E668076 BEAD208B"), 16)
20✔
353
# s = 00F50B02 8E4D696E 67687561 51752904 72783FB1
354
_a = int(remove_whitespace("DB7C 2ABF62E3 5E668076 BEAD2088"), 16)
20✔
355
_b = int(remove_whitespace("659E F8BA0439 16EEDE89 11702B22"), 16)
20✔
356
_Gx = int(remove_whitespace("09487239 995A5EE7 6B55F9C2 F098"), 16)
20✔
357
_Gy = int(remove_whitespace("A89C E5AF8724 C0A23E0E 0FF77500"), 16)
20✔
358
_r = int(remove_whitespace("DB7C 2ABF62E3 5E7628DF AC6561C5"), 16)
20✔
359
_h = 1
20✔
360
curve_112r1 = ellipticcurve.CurveFp(_p, _a, _b, _h)
20✔
361
generator_112r1 = ellipticcurve.PointJacobi(
20✔
362
    curve_112r1, _Gx, _Gy, 1, _r, generator=True
363
)
364

365

366
# secp112r2 curve
367
_p = int(remove_whitespace("DB7C 2ABF62E3 5E668076 BEAD208B"), 16)
20✔
368
# s = 022757A1 114D69E 67687561 51755316 C05E0BD4
369
_a = int(remove_whitespace("6127 C24C05F3 8A0AAAF6 5C0EF02C"), 16)
20✔
370
_b = int(remove_whitespace("51DE F1815DB5 ED74FCC3 4C85D709"), 16)
20✔
371
_Gx = int(remove_whitespace("4BA30AB5 E892B4E1 649DD092 8643"), 16)
20✔
372
_Gy = int(remove_whitespace("ADCD 46F5882E 3747DEF3 6E956E97"), 16)
20✔
373
_r = int(remove_whitespace("36DF 0AAFD8B8 D7597CA1 0520D04B"), 16)
20✔
374
_h = 4
20✔
375
curve_112r2 = ellipticcurve.CurveFp(_p, _a, _b, _h)
20✔
376
generator_112r2 = ellipticcurve.PointJacobi(
20✔
377
    curve_112r2, _Gx, _Gy, 1, _r, generator=True
378
)
379

380

381
# secp128r1 curve
382
_p = int(remove_whitespace("FFFFFFFD FFFFFFFF FFFFFFFF FFFFFFFF"), 16)
20✔
383
# S = 000E0D4D 69E6768 75615175 0CC03A44 73D03679
384
# a and b are mod p, so a is equal to p-3, or simply -3
385
# _a = -3
386
_b = int(remove_whitespace("E87579C1 1079F43D D824993C 2CEE5ED3"), 16)
20✔
387
_Gx = int(remove_whitespace("161FF752 8B899B2D 0C28607C A52C5B86"), 16)
20✔
388
_Gy = int(remove_whitespace("CF5AC839 5BAFEB13 C02DA292 DDED7A83"), 16)
20✔
389
_r = int(remove_whitespace("FFFFFFFE 00000000 75A30D1B 9038A115"), 16)
20✔
390
_h = 1
20✔
391
curve_128r1 = ellipticcurve.CurveFp(_p, -3, _b, _h)
20✔
392
generator_128r1 = ellipticcurve.PointJacobi(
20✔
393
    curve_128r1, _Gx, _Gy, 1, _r, generator=True
394
)
395

396

397
# secp160r1
398
_p = int(remove_whitespace("FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF 7FFFFFFF"), 16)
20✔
399
# S = 1053CDE4 2C14D696 E6768756 1517533B F3F83345
400
# a and b are mod p, so a is equal to p-3, or simply -3
401
# _a = -3
402
_b = int(remove_whitespace("1C97BEFC 54BD7A8B 65ACF89F 81D4D4AD C565FA45"), 16)
20✔
403
_Gx = int(
20✔
404
    remove_whitespace("4A96B568 8EF57328 46646989 68C38BB9 13CBFC82"),
405
    16,
406
)
407
_Gy = int(
20✔
408
    remove_whitespace("23A62855 3168947D 59DCC912 04235137 7AC5FB32"),
409
    16,
410
)
411
_r = int(
20✔
412
    remove_whitespace("01 00000000 00000000 0001F4C8 F927AED3 CA752257"),
413
    16,
414
)
415
_h = 1
20✔
416
curve_160r1 = ellipticcurve.CurveFp(_p, -3, _b, _h)
20✔
417
generator_160r1 = ellipticcurve.PointJacobi(
20✔
418
    curve_160r1, _Gx, _Gy, 1, _r, generator=True
419
)
420

421

422
# NIST Curve P-192:
423
_p = 6277101735386680763835789423207666416083908700390324961279
20✔
424
_r = 6277101735386680763835789423176059013767194773182842284081
20✔
425
# s = 0x3045ae6fc8422f64ed579528d38120eae12196d5L
426
# c = 0x3099d2bbbfcb2538542dcd5fb078b6ef5f3d6fe2c745de65L
427
_b = int(
20✔
428
    remove_whitespace(
429
        """
430
    64210519 E59C80E7 0FA7E9AB 72243049 FEB8DEEC C146B9B1"""
431
    ),
432
    16,
433
)
434
_Gx = int(
20✔
435
    remove_whitespace(
436
        """
437
    188DA80E B03090F6 7CBF20EB 43A18800 F4FF0AFD 82FF1012"""
438
    ),
439
    16,
440
)
441
_Gy = int(
20✔
442
    remove_whitespace(
443
        """
444
    07192B95 FFC8DA78 631011ED 6B24CDD5 73F977A1 1E794811"""
445
    ),
446
    16,
447
)
448

449
curve_192 = ellipticcurve.CurveFp(_p, -3, _b, 1)
20✔
450
generator_192 = ellipticcurve.PointJacobi(
20✔
451
    curve_192, _Gx, _Gy, 1, _r, generator=True
452
)
453

454

455
# NIST Curve P-224:
456
_p = int(
20✔
457
    remove_whitespace(
458
        """
459
    2695994666715063979466701508701963067355791626002630814351
460
    0066298881"""
461
    )
462
)
463
_r = int(
20✔
464
    remove_whitespace(
465
        """
466
    2695994666715063979466701508701962594045780771442439172168
467
    2722368061"""
468
    )
469
)
470
# s = 0xbd71344799d5c7fcdc45b59fa3b9ab8f6a948bc5L
471
# c = 0x5b056c7e11dd68f40469ee7f3c7a7d74f7d121116506d031218291fbL
472
_b = int(
20✔
473
    remove_whitespace(
474
        """
475
    B4050A85 0C04B3AB F5413256 5044B0B7 D7BFD8BA 270B3943
476
    2355FFB4"""
477
    ),
478
    16,
479
)
480
_Gx = int(
20✔
481
    remove_whitespace(
482
        """
483
    B70E0CBD 6BB4BF7F 321390B9 4A03C1D3 56C21122 343280D6
484
    115C1D21"""
485
    ),
486
    16,
487
)
488
_Gy = int(
20✔
489
    remove_whitespace(
490
        """
491
    BD376388 B5F723FB 4C22DFE6 CD4375A0 5A074764 44D58199
492
    85007E34"""
493
    ),
494
    16,
495
)
496

497
curve_224 = ellipticcurve.CurveFp(_p, -3, _b, 1)
20✔
498
generator_224 = ellipticcurve.PointJacobi(
20✔
499
    curve_224, _Gx, _Gy, 1, _r, generator=True
500
)
501

502
# NIST Curve P-256:
503
_p = int(
20✔
504
    remove_whitespace(
505
        """
506
    1157920892103562487626974469494075735300861434152903141955
507
    33631308867097853951"""
508
    )
509
)
510
_r = int(
20✔
511
    remove_whitespace(
512
        """
513
    115792089210356248762697446949407573529996955224135760342
514
    422259061068512044369"""
515
    )
516
)
517
# s = 0xc49d360886e704936a6678e1139d26b7819f7e90L
518
# c = 0x7efba1662985be9403cb055c75d4f7e0ce8d84a9c5114abcaf3177680104fa0dL
519
_b = int(
20✔
520
    remove_whitespace(
521
        """
522
    5AC635D8 AA3A93E7 B3EBBD55 769886BC 651D06B0 CC53B0F6
523
    3BCE3C3E 27D2604B"""
524
    ),
525
    16,
526
)
527
_Gx = int(
20✔
528
    remove_whitespace(
529
        """
530
    6B17D1F2 E12C4247 F8BCE6E5 63A440F2 77037D81 2DEB33A0
531
    F4A13945 D898C296"""
532
    ),
533
    16,
534
)
535
_Gy = int(
20✔
536
    remove_whitespace(
537
        """
538
    4FE342E2 FE1A7F9B 8EE7EB4A 7C0F9E16 2BCE3357 6B315ECE
539
    CBB64068 37BF51F5"""
540
    ),
541
    16,
542
)
543

544
curve_256 = ellipticcurve.CurveFp(_p, -3, _b, 1)
20✔
545
generator_256 = ellipticcurve.PointJacobi(
20✔
546
    curve_256, _Gx, _Gy, 1, _r, generator=True
547
)
548

549
# NIST Curve P-384:
550
_p = int(
20✔
551
    remove_whitespace(
552
        """
553
    3940200619639447921227904010014361380507973927046544666794
554
    8293404245721771496870329047266088258938001861606973112319"""
555
    )
556
)
557
_r = int(
20✔
558
    remove_whitespace(
559
        """
560
    3940200619639447921227904010014361380507973927046544666794
561
    6905279627659399113263569398956308152294913554433653942643"""
562
    )
563
)
564
# s = 0xa335926aa319a27a1d00896a6773a4827acdac73L
565
# c = int(remove_whitespace(
566
#    """
567
#    79d1e655 f868f02f ff48dcde e14151dd b80643c1 406d0ca1
568
#    0dfe6fc5 2009540a 495e8042 ea5f744f 6e184667 cc722483"""
569
# ), 16)
570
_b = int(
20✔
571
    remove_whitespace(
572
        """
573
    B3312FA7 E23EE7E4 988E056B E3F82D19 181D9C6E FE814112
574
    0314088F 5013875A C656398D 8A2ED19D 2A85C8ED D3EC2AEF"""
575
    ),
576
    16,
577
)
578
_Gx = int(
20✔
579
    remove_whitespace(
580
        """
581
    AA87CA22 BE8B0537 8EB1C71E F320AD74 6E1D3B62 8BA79B98
582
    59F741E0 82542A38 5502F25D BF55296C 3A545E38 72760AB7"""
583
    ),
584
    16,
585
)
586
_Gy = int(
20✔
587
    remove_whitespace(
588
        """
589
    3617DE4A 96262C6F 5D9E98BF 9292DC29 F8F41DBD 289A147C
590
    E9DA3113 B5F0B8C0 0A60B1CE 1D7E819D 7A431D7C 90EA0E5F"""
591
    ),
592
    16,
593
)
594

595
curve_384 = ellipticcurve.CurveFp(_p, -3, _b, 1)
20✔
596
generator_384 = ellipticcurve.PointJacobi(
20✔
597
    curve_384, _Gx, _Gy, 1, _r, generator=True
598
)
599

600
# NIST Curve P-521:
601
_p = int(
20✔
602
    "686479766013060971498190079908139321726943530014330540939"
603
    "446345918554318339765605212255964066145455497729631139148"
604
    "0858037121987999716643812574028291115057151"
605
)
606
_r = int(
20✔
607
    "686479766013060971498190079908139321726943530014330540939"
608
    "446345918554318339765539424505774633321719753296399637136"
609
    "3321113864768612440380340372808892707005449"
610
)
611
# s = 0xd09e8800291cb85396cc6717393284aaa0da64baL
612
# c = int(remove_whitespace(
613
#    """
614
#         0b4 8bfa5f42 0a349495 39d2bdfc 264eeeeb 077688e4
615
#    4fbf0ad8 f6d0edb3 7bd6b533 28100051 8e19f1b9 ffbe0fe9
616
#    ed8a3c22 00b8f875 e523868c 70c1e5bf 55bad637"""
617
# ), 16)
618
_b = int(
20✔
619
    remove_whitespace(
620
        """
621
         051 953EB961 8E1C9A1F 929A21A0 B68540EE A2DA725B
622
    99B315F3 B8B48991 8EF109E1 56193951 EC7E937B 1652C0BD
623
    3BB1BF07 3573DF88 3D2C34F1 EF451FD4 6B503F00"""
624
    ),
625
    16,
626
)
627
_Gx = int(
20✔
628
    remove_whitespace(
629
        """
630
          C6 858E06B7 0404E9CD 9E3ECB66 2395B442 9C648139
631
    053FB521 F828AF60 6B4D3DBA A14B5E77 EFE75928 FE1DC127
632
    A2FFA8DE 3348B3C1 856A429B F97E7E31 C2E5BD66"""
633
    ),
634
    16,
635
)
636
_Gy = int(
20✔
637
    remove_whitespace(
638
        """
639
         118 39296A78 9A3BC004 5C8A5FB4 2C7D1BD9 98F54449
640
    579B4468 17AFBD17 273E662C 97EE7299 5EF42640 C550B901
641
    3FAD0761 353C7086 A272C240 88BE9476 9FD16650"""
642
    ),
643
    16,
644
)
645

646
curve_521 = ellipticcurve.CurveFp(_p, -3, _b, 1)
20✔
647
generator_521 = ellipticcurve.PointJacobi(
20✔
648
    curve_521, _Gx, _Gy, 1, _r, generator=True
649
)
650

651
# Certicom secp256-k1
652
_a = 0x0000000000000000000000000000000000000000000000000000000000000000
20✔
653
_b = 0x0000000000000000000000000000000000000000000000000000000000000007
20✔
654
_p = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFC2F
20✔
655
_Gx = 0x79BE667EF9DCBBAC55A06295CE870B07029BFCDB2DCE28D959F2815B16F81798
20✔
656
_Gy = 0x483ADA7726A3C4655DA4FBFC0E1108A8FD17B448A68554199C47D08FFB10D4B8
20✔
657
_r = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141
20✔
658

659
curve_secp256k1 = ellipticcurve.CurveFp(_p, _a, _b, 1)
20✔
660
generator_secp256k1 = ellipticcurve.PointJacobi(
20✔
661
    curve_secp256k1, _Gx, _Gy, 1, _r, generator=True
662
)
663

664
# Brainpool P-160-r1
665
_a = 0x340E7BE2A280EB74E2BE61BADA745D97E8F7C300
20✔
666
_b = 0x1E589A8595423412134FAA2DBDEC95C8D8675E58
20✔
667
_p = 0xE95E4A5F737059DC60DFC7AD95B3D8139515620F
20✔
668
_Gx = 0xBED5AF16EA3F6A4F62938C4631EB5AF7BDBCDBC3
20✔
669
_Gy = 0x1667CB477A1A8EC338F94741669C976316DA6321
20✔
670
_q = 0xE95E4A5F737059DC60DF5991D45029409E60FC09
20✔
671

672
curve_brainpoolp160r1 = ellipticcurve.CurveFp(_p, _a, _b, 1)
20✔
673
generator_brainpoolp160r1 = ellipticcurve.PointJacobi(
20✔
674
    curve_brainpoolp160r1, _Gx, _Gy, 1, _q, generator=True
675
)
676

677
# Brainpool P-160-t1
678
_a = 0xE95E4A5F737059DC60DFC7AD95B3D8139515620C
20✔
679
_b = 0x7A556B6DAE535B7B51ED2C4D7DAA7A0B5C55F380
20✔
680
# _z = 0x24DBFF5DEC9B986BBFE5295A29BFBAE45E0F5D0B
681
_Gx = 0xB199B13B9B34EFC1397E64BAEB05ACC265FF2378
20✔
682
_Gy = 0xADD6718B7C7C1961F0991B842443772152C9E0AD
20✔
683
_q = 0xE95E4A5F737059DC60DF5991D45029409E60FC09
20✔
684
curve_brainpoolp160t1 = ellipticcurve.CurveFp(_p, _a, _b, 1)
20✔
685
generator_brainpoolp160t1 = ellipticcurve.PointJacobi(
20✔
686
    curve_brainpoolp160t1, _Gx, _Gy, 1, _q, generator=True
687
)
688

689
# Brainpool P-192-r1
690
_a = 0x6A91174076B1E0E19C39C031FE8685C1CAE040E5C69A28EF
20✔
691
_b = 0x469A28EF7C28CCA3DC721D044F4496BCCA7EF4146FBF25C9
20✔
692
_p = 0xC302F41D932A36CDA7A3463093D18DB78FCE476DE1A86297
20✔
693
_Gx = 0xC0A0647EAAB6A48753B033C56CB0F0900A2F5C4853375FD6
20✔
694
_Gy = 0x14B690866ABD5BB88B5F4828C1490002E6773FA2FA299B8F
20✔
695
_q = 0xC302F41D932A36CDA7A3462F9E9E916B5BE8F1029AC4ACC1
20✔
696

697
curve_brainpoolp192r1 = ellipticcurve.CurveFp(_p, _a, _b, 1)
20✔
698
generator_brainpoolp192r1 = ellipticcurve.PointJacobi(
20✔
699
    curve_brainpoolp192r1, _Gx, _Gy, 1, _q, generator=True
700
)
701

702
# Brainpool P-192-t1
703
_a = 0xC302F41D932A36CDA7A3463093D18DB78FCE476DE1A86294
20✔
704
_b = 0x13D56FFAEC78681E68F9DEB43B35BEC2FB68542E27897B79
20✔
705
# _z = 0x1B6F5CC8DB4DC7AF19458A9CB80DC2295E5EB9C3732104CB
706
_Gx = 0x3AE9E58C82F63C30282E1FE7BBF43FA72C446AF6F4618129
20✔
707
_Gy = 0x097E2C5667C2223A902AB5CA449D0084B7E5B3DE7CCC01C9
20✔
708
_q = 0xC302F41D932A36CDA7A3462F9E9E916B5BE8F1029AC4ACC1
20✔
709

710
curve_brainpoolp192t1 = ellipticcurve.CurveFp(_p, _a, _b, 1)
20✔
711
generator_brainpoolp192t1 = ellipticcurve.PointJacobi(
20✔
712
    curve_brainpoolp192t1, _Gx, _Gy, 1, _q, generator=True
713
)
714

715
# Brainpool P-224-r1
716
_a = 0x68A5E62CA9CE6C1C299803A6C1530B514E182AD8B0042A59CAD29F43
20✔
717
_b = 0x2580F63CCFE44138870713B1A92369E33E2135D266DBB372386C400B
20✔
718
_p = 0xD7C134AA264366862A18302575D1D787B09F075797DA89F57EC8C0FF
20✔
719
_Gx = 0x0D9029AD2C7E5CF4340823B2A87DC68C9E4CE3174C1E6EFDEE12C07D
20✔
720
_Gy = 0x58AA56F772C0726F24C6B89E4ECDAC24354B9E99CAA3F6D3761402CD
20✔
721
_q = 0xD7C134AA264366862A18302575D0FB98D116BC4B6DDEBCA3A5A7939F
20✔
722

723
curve_brainpoolp224r1 = ellipticcurve.CurveFp(_p, _a, _b, 1)
20✔
724
generator_brainpoolp224r1 = ellipticcurve.PointJacobi(
20✔
725
    curve_brainpoolp224r1, _Gx, _Gy, 1, _q, generator=True
726
)
727

728
# Brainpool P-224-t1
729
_a = 0xD7C134AA264366862A18302575D1D787B09F075797DA89F57EC8C0FC
20✔
730
_b = 0x4B337D934104CD7BEF271BF60CED1ED20DA14C08B3BB64F18A60888D
20✔
731
# _z = 0x2DF271E14427A346910CF7A2E6CFA7B3F484E5C2CCE1C8B730E28B3F
732
_Gx = 0x6AB1E344CE25FF3896424E7FFE14762ECB49F8928AC0C76029B4D580
20✔
733
_Gy = 0x0374E9F5143E568CD23F3F4D7C0D4B1E41C8CC0D1C6ABD5F1A46DB4C
20✔
734
_q = 0xD7C134AA264366862A18302575D0FB98D116BC4B6DDEBCA3A5A7939F
20✔
735

736
curve_brainpoolp224t1 = ellipticcurve.CurveFp(_p, _a, _b, 1)
20✔
737
generator_brainpoolp224t1 = ellipticcurve.PointJacobi(
20✔
738
    curve_brainpoolp224t1, _Gx, _Gy, 1, _q, generator=True
739
)
740

741
# Brainpool P-256-r1
742
_a = 0x7D5A0975FC2C3057EEF67530417AFFE7FB8055C126DC5C6CE94A4B44F330B5D9
20✔
743
_b = 0x26DC5C6CE94A4B44F330B5D9BBD77CBF958416295CF7E1CE6BCCDC18FF8C07B6
20✔
744
_p = 0xA9FB57DBA1EEA9BC3E660A909D838D726E3BF623D52620282013481D1F6E5377
20✔
745
_Gx = 0x8BD2AEB9CB7E57CB2C4B482FFC81B7AFB9DE27E1E3BD23C23A4453BD9ACE3262
20✔
746
_Gy = 0x547EF835C3DAC4FD97F8461A14611DC9C27745132DED8E545C1D54C72F046997
20✔
747
_q = 0xA9FB57DBA1EEA9BC3E660A909D838D718C397AA3B561A6F7901E0E82974856A7
20✔
748

749
curve_brainpoolp256r1 = ellipticcurve.CurveFp(_p, _a, _b, 1)
20✔
750
generator_brainpoolp256r1 = ellipticcurve.PointJacobi(
20✔
751
    curve_brainpoolp256r1, _Gx, _Gy, 1, _q, generator=True
752
)
753

754
# Brainpool P-256-t1
755
_a = 0xA9FB57DBA1EEA9BC3E660A909D838D726E3BF623D52620282013481D1F6E5374
20✔
756
_b = 0x662C61C430D84EA4FE66A7733D0B76B7BF93EBC4AF2F49256AE58101FEE92B04
20✔
757
# _z = 0x3E2D4BD9597B58639AE7AA669CAB9837CF5CF20A2C852D10F655668DFC150EF0
758
_Gx = 0xA3E8EB3CC1CFE7B7732213B23A656149AFA142C47AAFBC2B79A191562E1305F4
20✔
759
_Gy = 0x2D996C823439C56D7F7B22E14644417E69BCB6DE39D027001DABE8F35B25C9BE
20✔
760
_q = 0xA9FB57DBA1EEA9BC3E660A909D838D718C397AA3B561A6F7901E0E82974856A7
20✔
761

762
curve_brainpoolp256t1 = ellipticcurve.CurveFp(_p, _a, _b, 1)
20✔
763
generator_brainpoolp256t1 = ellipticcurve.PointJacobi(
20✔
764
    curve_brainpoolp256t1, _Gx, _Gy, 1, _q, generator=True
765
)
766

767
# Brainpool P-320-r1
768
_a = int(
20✔
769
    remove_whitespace(
770
        """
771
    3EE30B568FBAB0F883CCEBD46D3F3BB8A2A73513F5EB79DA66190EB085FFA9
772
    F492F375A97D860EB4"""
773
    ),
774
    16,
775
)
776
_b = int(
20✔
777
    remove_whitespace(
778
        """
779
    520883949DFDBC42D3AD198640688A6FE13F41349554B49ACC31DCCD884539
780
    816F5EB4AC8FB1F1A6"""
781
    ),
782
    16,
783
)
784
_p = int(
20✔
785
    remove_whitespace(
786
        """
787
    D35E472036BC4FB7E13C785ED201E065F98FCFA6F6F40DEF4F92B9EC7893EC
788
    28FCD412B1F1B32E27"""
789
    ),
790
    16,
791
)
792
_Gx = int(
20✔
793
    remove_whitespace(
794
        """
795
    43BD7E9AFB53D8B85289BCC48EE5BFE6F20137D10A087EB6E7871E2A10A599
796
    C710AF8D0D39E20611"""
797
    ),
798
    16,
799
)
800
_Gy = int(
20✔
801
    remove_whitespace(
802
        """
803
    14FDD05545EC1CC8AB4093247F77275E0743FFED117182EAA9C77877AAAC6A
804
    C7D35245D1692E8EE1"""
805
    ),
806
    16,
807
)
808
_q = int(
20✔
809
    remove_whitespace(
810
        """
811
    D35E472036BC4FB7E13C785ED201E065F98FCFA5B68F12A32D482EC7EE8658
812
    E98691555B44C59311"""
813
    ),
814
    16,
815
)
816

817
curve_brainpoolp320r1 = ellipticcurve.CurveFp(_p, _a, _b, 1)
20✔
818
generator_brainpoolp320r1 = ellipticcurve.PointJacobi(
20✔
819
    curve_brainpoolp320r1, _Gx, _Gy, 1, _q, generator=True
820
)
821

822
# Brainpool P-320-t1
823
_a = int(
20✔
824
    remove_whitespace(
825
        """
826
    D35E472036BC4FB7E13C785ED201E065F98FCFA6F6F40DEF4F92B9EC7893EC
827
    28FCD412B1F1B32E24"""
828
    ),
829
    16,
830
)
831
_b = int(
20✔
832
    remove_whitespace(
833
        """
834
    A7F561E038EB1ED560B3D147DB782013064C19F27ED27C6780AAF77FB8A547
835
    CEB5B4FEF422340353"""
836
    ),
837
    16,
838
)
839
# _z = int(
840
#    remove_whitespace(
841
#        """
842
#    15F75CAF668077F7E85B42EB01F0A81FF56ECD6191D55CB82B7D861458A18F
843
#    EFC3E5AB7496F3C7B1"""
844
#    ),
845
#    16,
846
# )
847
_Gx = int(
20✔
848
    remove_whitespace(
849
        """
850
    925BE9FB01AFC6FB4D3E7D4990010F813408AB106C4F09CB7EE07868CC136F
851
    FF3357F624A21BED52"""
852
    ),
853
    16,
854
)
855
_Gy = int(
20✔
856
    remove_whitespace(
857
        """
858
    63BA3A7A27483EBF6671DBEF7ABB30EBEE084E58A0B077AD42A5A0989D1EE7
859
    1B1B9BC0455FB0D2C3"""
860
    ),
861
    16,
862
)
863
_q = int(
20✔
864
    remove_whitespace(
865
        """
866
    D35E472036BC4FB7E13C785ED201E065F98FCFA5B68F12A32D482EC7EE8658
867
    E98691555B44C59311"""
868
    ),
869
    16,
870
)
871

872
curve_brainpoolp320t1 = ellipticcurve.CurveFp(_p, _a, _b, 1)
20✔
873
generator_brainpoolp320t1 = ellipticcurve.PointJacobi(
20✔
874
    curve_brainpoolp320t1, _Gx, _Gy, 1, _q, generator=True
875
)
876

877
# Brainpool P-384-r1
878
_a = int(
20✔
879
    remove_whitespace(
880
        """
881
    7BC382C63D8C150C3C72080ACE05AFA0C2BEA28E4FB22787139165EFBA91F9
882
    0F8AA5814A503AD4EB04A8C7DD22CE2826"""
883
    ),
884
    16,
885
)
886
_b = int(
20✔
887
    remove_whitespace(
888
        """
889
    04A8C7DD22CE28268B39B55416F0447C2FB77DE107DCD2A62E880EA53EEB62
890
    D57CB4390295DBC9943AB78696FA504C11"""
891
    ),
892
    16,
893
)
894
_p = int(
20✔
895
    remove_whitespace(
896
        """
897
    8CB91E82A3386D280F5D6F7E50E641DF152F7109ED5456B412B1DA197FB711
898
    23ACD3A729901D1A71874700133107EC53"""
899
    ),
900
    16,
901
)
902
_Gx = int(
20✔
903
    remove_whitespace(
904
        """
905
    1D1C64F068CF45FFA2A63A81B7C13F6B8847A3E77EF14FE3DB7FCAFE0CBD10
906
    E8E826E03436D646AAEF87B2E247D4AF1E"""
907
    ),
908
    16,
909
)
910
_Gy = int(
20✔
911
    remove_whitespace(
912
        """
913
    8ABE1D7520F9C2A45CB1EB8E95CFD55262B70B29FEEC5864E19C054FF991292
914
    80E4646217791811142820341263C5315"""
915
    ),
916
    16,
917
)
918
_q = int(
20✔
919
    remove_whitespace(
920
        """
921
    8CB91E82A3386D280F5D6F7E50E641DF152F7109ED5456B31F166E6CAC0425
922
    A7CF3AB6AF6B7FC3103B883202E9046565"""
923
    ),
924
    16,
925
)
926

927
curve_brainpoolp384r1 = ellipticcurve.CurveFp(_p, _a, _b, 1)
20✔
928
generator_brainpoolp384r1 = ellipticcurve.PointJacobi(
20✔
929
    curve_brainpoolp384r1, _Gx, _Gy, 1, _q, generator=True
930
)
931

932
_a = int(
20✔
933
    remove_whitespace(
934
        """
935
    8CB91E82A3386D280F5D6F7E50E641DF152F7109ED5456B412B1DA197FB711
936
    23ACD3A729901D1A71874700133107EC50"""
937
    ),
938
    16,
939
)
940
_b = int(
20✔
941
    remove_whitespace(
942
        """
943
    7F519EADA7BDA81BD826DBA647910F8C4B9346ED8CCDC64E4B1ABD11756DCE
944
    1D2074AA263B88805CED70355A33B471EE"""
945
    ),
946
    16,
947
)
948
# _z = int(
949
#    remove_whitespace(
950
#        """
951
#    41DFE8DD399331F7166A66076734A89CD0D2BCDB7D068E44E1F378F41ECBAE
952
#    97D2D63DBC87BCCDDCCC5DA39E8589291C"""
953
#    ),
954
#    16,
955
# )
956
_Gx = int(
20✔
957
    remove_whitespace(
958
        """
959
    18DE98B02DB9A306F2AFCD7235F72A819B80AB12EBD653172476FECD462AAB
960
    FFC4FF191B946A5F54D8D0AA2F418808CC"""
961
    ),
962
    16,
963
)
964
_Gy = int(
20✔
965
    remove_whitespace(
966
        """
967
    25AB056962D30651A114AFD2755AD336747F93475B7A1FCA3B88F2B6A208CC
968
    FE469408584DC2B2912675BF5B9E582928"""
969
    ),
970
    16,
971
)
972
_q = int(
20✔
973
    remove_whitespace(
974
        """
975
    8CB91E82A3386D280F5D6F7E50E641DF152F7109ED5456B31F166E6CAC0425
976
    A7CF3AB6AF6B7FC3103B883202E9046565"""
977
    ),
978
    16,
979
)
980

981
curve_brainpoolp384t1 = ellipticcurve.CurveFp(_p, _a, _b, 1)
20✔
982
generator_brainpoolp384t1 = ellipticcurve.PointJacobi(
20✔
983
    curve_brainpoolp384t1, _Gx, _Gy, 1, _q, generator=True
984
)
985

986
# Brainpool P-512-r1
987
_a = int(
20✔
988
    remove_whitespace(
989
        """
990
    7830A3318B603B89E2327145AC234CC594CBDD8D3DF91610A83441CAEA9863
991
    BC2DED5D5AA8253AA10A2EF1C98B9AC8B57F1117A72BF2C7B9E7C1AC4D77FC94CA"""
992
    ),
993
    16,
994
)
995
_b = int(
20✔
996
    remove_whitespace(
997
        """
998
    3DF91610A83441CAEA9863BC2DED5D5AA8253AA10A2EF1C98B9AC8B57F1117
999
    A72BF2C7B9E7C1AC4D77FC94CADC083E67984050B75EBAE5DD2809BD638016F723"""
1000
    ),
1001
    16,
1002
)
1003
_p = int(
20✔
1004
    remove_whitespace(
1005
        """
1006
    AADD9DB8DBE9C48B3FD4E6AE33C9FC07CB308DB3B3C9D20ED6639CCA703308
1007
    717D4D9B009BC66842AECDA12AE6A380E62881FF2F2D82C68528AA6056583A48F3"""
1008
    ),
1009
    16,
1010
)
1011
_Gx = int(
20✔
1012
    remove_whitespace(
1013
        """
1014
    81AEE4BDD82ED9645A21322E9C4C6A9385ED9F70B5D916C1B43B62EEF4D009
1015
    8EFF3B1F78E2D0D48D50D1687B93B97D5F7C6D5047406A5E688B352209BCB9F822"""
1016
    ),
1017
    16,
1018
)
1019
_Gy = int(
20✔
1020
    remove_whitespace(
1021
        """
1022
    7DDE385D566332ECC0EABFA9CF7822FDF209F70024A57B1AA000C55B881F81
1023
    11B2DCDE494A5F485E5BCA4BD88A2763AED1CA2B2FA8F0540678CD1E0F3AD80892"""
1024
    ),
1025
    16,
1026
)
1027
_q = int(
20✔
1028
    remove_whitespace(
1029
        """
1030
    AADD9DB8DBE9C48B3FD4E6AE33C9FC07CB308DB3B3C9D20ED6639CCA703308
1031
    70553E5C414CA92619418661197FAC10471DB1D381085DDADDB58796829CA90069"""
1032
    ),
1033
    16,
1034
)
1035

1036
curve_brainpoolp512r1 = ellipticcurve.CurveFp(_p, _a, _b, 1)
20✔
1037
generator_brainpoolp512r1 = ellipticcurve.PointJacobi(
20✔
1038
    curve_brainpoolp512r1, _Gx, _Gy, 1, _q, generator=True
1039
)
1040

1041
# Brainpool P-512-t1
1042
_a = int(
20✔
1043
    remove_whitespace(
1044
        """
1045
    AADD9DB8DBE9C48B3FD4E6AE33C9FC07CB308DB3B3C9D20ED6639CCA703308
1046
    717D4D9B009BC66842AECDA12AE6A380E62881FF2F2D82C68528AA6056583A48F0"""
1047
    ),
1048
    16,
1049
)
1050
_b = int(
20✔
1051
    remove_whitespace(
1052
        """
1053
    7CBBBCF9441CFAB76E1890E46884EAE321F70C0BCB4981527897504BEC3E36
1054
    A62BCDFA2304976540F6450085F2DAE145C22553B465763689180EA2571867423E"""
1055
    ),
1056
    16,
1057
)
1058
# _z = int(
1059
#    remove_whitespace(
1060
#        """
1061
#    12EE58E6764838B69782136F0F2D3BA06E27695716054092E60A80BEDB212B
1062
#    64E585D90BCE13761F85C3F1D2A64E3BE8FEA2220F01EBA5EEB0F35DBD29D922AB"""
1063
#    ),
1064
#    16,
1065
# )
1066
_Gx = int(
20✔
1067
    remove_whitespace(
1068
        """
1069
    640ECE5C12788717B9C1BA06CBC2A6FEBA85842458C56DDE9DB1758D39C031
1070
    3D82BA51735CDB3EA499AA77A7D6943A64F7A3F25FE26F06B51BAA2696FA9035DA"""
1071
    ),
1072
    16,
1073
)
1074
_Gy = int(
20✔
1075
    remove_whitespace(
1076
        """
1077
    5B534BD595F5AF0FA2C892376C84ACE1BB4E3019B71634C01131159CAE03CE
1078
    E9D9932184BEEF216BD71DF2DADF86A627306ECFF96DBB8BACE198B61E00F8B332"""
1079
    ),
1080
    16,
1081
)
1082
_q = int(
20✔
1083
    remove_whitespace(
1084
        """
1085
    AADD9DB8DBE9C48B3FD4E6AE33C9FC07CB308DB3B3C9D20ED6639CCA703308
1086
    70553E5C414CA92619418661197FAC10471DB1D381085DDADDB58796829CA90069"""
1087
    ),
1088
    16,
1089
)
1090

1091
curve_brainpoolp512t1 = ellipticcurve.CurveFp(_p, _a, _b, 1)
20✔
1092
generator_brainpoolp512t1 = ellipticcurve.PointJacobi(
20✔
1093
    curve_brainpoolp512t1, _Gx, _Gy, 1, _q, generator=True
1094
)
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2025 Coveralls, Inc