195 lines
3.6 KiB
Python
195 lines
3.6 KiB
Python
|
from __future__ import division
|
||
|
|
||
|
from . import der, ecdsa
|
||
|
from .util import orderlen
|
||
|
|
||
|
|
||
|
# orderlen was defined in this module previously, so keep it in __all__,
|
||
|
# will need to mark it as deprecated later
|
||
|
__all__ = [
|
||
|
"UnknownCurveError",
|
||
|
"orderlen",
|
||
|
"Curve",
|
||
|
"NIST192p",
|
||
|
"NIST224p",
|
||
|
"NIST256p",
|
||
|
"NIST384p",
|
||
|
"NIST521p",
|
||
|
"curves",
|
||
|
"find_curve",
|
||
|
"SECP256k1",
|
||
|
"BRAINPOOLP160r1",
|
||
|
"BRAINPOOLP192r1",
|
||
|
"BRAINPOOLP224r1",
|
||
|
"BRAINPOOLP256r1",
|
||
|
"BRAINPOOLP320r1",
|
||
|
"BRAINPOOLP384r1",
|
||
|
"BRAINPOOLP512r1",
|
||
|
]
|
||
|
|
||
|
|
||
|
class UnknownCurveError(Exception):
|
||
|
pass
|
||
|
|
||
|
|
||
|
class Curve:
|
||
|
def __init__(self, name, curve, generator, oid, openssl_name=None):
|
||
|
self.name = name
|
||
|
self.openssl_name = openssl_name # maybe None
|
||
|
self.curve = curve
|
||
|
self.generator = generator
|
||
|
self.order = generator.order()
|
||
|
self.baselen = orderlen(self.order)
|
||
|
self.verifying_key_length = 2 * self.baselen
|
||
|
self.signature_length = 2 * self.baselen
|
||
|
self.oid = oid
|
||
|
self.encoded_oid = der.encode_oid(*oid)
|
||
|
|
||
|
def __repr__(self):
|
||
|
return self.name
|
||
|
|
||
|
|
||
|
# the NIST curves
|
||
|
NIST192p = Curve(
|
||
|
"NIST192p",
|
||
|
ecdsa.curve_192,
|
||
|
ecdsa.generator_192,
|
||
|
(1, 2, 840, 10045, 3, 1, 1),
|
||
|
"prime192v1",
|
||
|
)
|
||
|
|
||
|
|
||
|
NIST224p = Curve(
|
||
|
"NIST224p",
|
||
|
ecdsa.curve_224,
|
||
|
ecdsa.generator_224,
|
||
|
(1, 3, 132, 0, 33),
|
||
|
"secp224r1",
|
||
|
)
|
||
|
|
||
|
|
||
|
NIST256p = Curve(
|
||
|
"NIST256p",
|
||
|
ecdsa.curve_256,
|
||
|
ecdsa.generator_256,
|
||
|
(1, 2, 840, 10045, 3, 1, 7),
|
||
|
"prime256v1",
|
||
|
)
|
||
|
|
||
|
|
||
|
NIST384p = Curve(
|
||
|
"NIST384p",
|
||
|
ecdsa.curve_384,
|
||
|
ecdsa.generator_384,
|
||
|
(1, 3, 132, 0, 34),
|
||
|
"secp384r1",
|
||
|
)
|
||
|
|
||
|
|
||
|
NIST521p = Curve(
|
||
|
"NIST521p",
|
||
|
ecdsa.curve_521,
|
||
|
ecdsa.generator_521,
|
||
|
(1, 3, 132, 0, 35),
|
||
|
"secp521r1",
|
||
|
)
|
||
|
|
||
|
|
||
|
SECP256k1 = Curve(
|
||
|
"SECP256k1",
|
||
|
ecdsa.curve_secp256k1,
|
||
|
ecdsa.generator_secp256k1,
|
||
|
(1, 3, 132, 0, 10),
|
||
|
"secp256k1",
|
||
|
)
|
||
|
|
||
|
|
||
|
BRAINPOOLP160r1 = Curve(
|
||
|
"BRAINPOOLP160r1",
|
||
|
ecdsa.curve_brainpoolp160r1,
|
||
|
ecdsa.generator_brainpoolp160r1,
|
||
|
(1, 3, 36, 3, 3, 2, 8, 1, 1, 1),
|
||
|
"brainpoolP160r1",
|
||
|
)
|
||
|
|
||
|
|
||
|
BRAINPOOLP192r1 = Curve(
|
||
|
"BRAINPOOLP192r1",
|
||
|
ecdsa.curve_brainpoolp192r1,
|
||
|
ecdsa.generator_brainpoolp192r1,
|
||
|
(1, 3, 36, 3, 3, 2, 8, 1, 1, 3),
|
||
|
"brainpoolP192r1",
|
||
|
)
|
||
|
|
||
|
|
||
|
BRAINPOOLP224r1 = Curve(
|
||
|
"BRAINPOOLP224r1",
|
||
|
ecdsa.curve_brainpoolp224r1,
|
||
|
ecdsa.generator_brainpoolp224r1,
|
||
|
(1, 3, 36, 3, 3, 2, 8, 1, 1, 5),
|
||
|
"brainpoolP224r1",
|
||
|
)
|
||
|
|
||
|
|
||
|
BRAINPOOLP256r1 = Curve(
|
||
|
"BRAINPOOLP256r1",
|
||
|
ecdsa.curve_brainpoolp256r1,
|
||
|
ecdsa.generator_brainpoolp256r1,
|
||
|
(1, 3, 36, 3, 3, 2, 8, 1, 1, 7),
|
||
|
"brainpoolP256r1",
|
||
|
)
|
||
|
|
||
|
|
||
|
BRAINPOOLP320r1 = Curve(
|
||
|
"BRAINPOOLP320r1",
|
||
|
ecdsa.curve_brainpoolp320r1,
|
||
|
ecdsa.generator_brainpoolp320r1,
|
||
|
(1, 3, 36, 3, 3, 2, 8, 1, 1, 9),
|
||
|
"brainpoolP320r1",
|
||
|
)
|
||
|
|
||
|
|
||
|
BRAINPOOLP384r1 = Curve(
|
||
|
"BRAINPOOLP384r1",
|
||
|
ecdsa.curve_brainpoolp384r1,
|
||
|
ecdsa.generator_brainpoolp384r1,
|
||
|
(1, 3, 36, 3, 3, 2, 8, 1, 1, 11),
|
||
|
"brainpoolP384r1",
|
||
|
)
|
||
|
|
||
|
|
||
|
BRAINPOOLP512r1 = Curve(
|
||
|
"BRAINPOOLP512r1",
|
||
|
ecdsa.curve_brainpoolp512r1,
|
||
|
ecdsa.generator_brainpoolp512r1,
|
||
|
(1, 3, 36, 3, 3, 2, 8, 1, 1, 13),
|
||
|
"brainpoolP512r1",
|
||
|
)
|
||
|
|
||
|
|
||
|
curves = [
|
||
|
NIST192p,
|
||
|
NIST224p,
|
||
|
NIST256p,
|
||
|
NIST384p,
|
||
|
NIST521p,
|
||
|
SECP256k1,
|
||
|
BRAINPOOLP160r1,
|
||
|
BRAINPOOLP192r1,
|
||
|
BRAINPOOLP224r1,
|
||
|
BRAINPOOLP256r1,
|
||
|
BRAINPOOLP320r1,
|
||
|
BRAINPOOLP384r1,
|
||
|
BRAINPOOLP512r1,
|
||
|
]
|
||
|
|
||
|
|
||
|
def find_curve(oid_curve):
|
||
|
for c in curves:
|
||
|
if c.oid == oid_curve:
|
||
|
return c
|
||
|
raise UnknownCurveError(
|
||
|
"I don't know about the curve with oid %s."
|
||
|
"I only know about these: %s" % (oid_curve, [c.name for c in curves])
|
||
|
)
|