aboutsummaryrefslogtreecommitdiffstats
path: root/cryptography/hazmat/primitives/asymmetric/dsa.py
diff options
context:
space:
mode:
Diffstat (limited to 'cryptography/hazmat/primitives/asymmetric/dsa.py')
-rw-r--r--cryptography/hazmat/primitives/asymmetric/dsa.py45
1 files changed, 44 insertions, 1 deletions
diff --git a/cryptography/hazmat/primitives/asymmetric/dsa.py b/cryptography/hazmat/primitives/asymmetric/dsa.py
index a0631ce8..974db0a6 100644
--- a/cryptography/hazmat/primitives/asymmetric/dsa.py
+++ b/cryptography/hazmat/primitives/asymmetric/dsa.py
@@ -74,6 +74,49 @@ class DSAParameters(object):
return self.generator
+@utils.register_interface(interfaces.DSAPrivateKey)
+class DSAPrivateKey(object):
+ def __init__(self, modulus, subgroup_order, generator, x, y):
+ _check_dsa_parameters(modulus, subgroup_order, generator)
+ if (
+ not isinstance(x, six.integer_types) or
+ not isinstance(y, six.integer_types)
+ ):
+ raise TypeError("DSAPrivateKey arguments must be integers")
+
+ if x <= 0 or x >= subgroup_order:
+ raise ValueError("x must be > 0 and < subgroup_order")
+
+ if y != pow(generator, x, modulus):
+ raise ValueError("y must be equal to (generator ** x % modulus)")
+
+ self._modulus = modulus
+ self._subgroup_order = subgroup_order
+ self._generator = generator
+ self._x = x
+ self._y = y
+
+ @property
+ def key_size(self):
+ return utils.bit_length(self._modulus)
+
+ def public_key(self):
+ return DSAPublicKey(self._modulus, self._subgroup_order,
+ self._generator, self.y)
+
+ @property
+ def x(self):
+ return self._x
+
+ @property
+ def y(self):
+ return self._y
+
+ def parameters(self):
+ return DSAParameters(self._modulus, self._subgroup_order,
+ self._generator)
+
+
@utils.register_interface(interfaces.DSAPublicKey)
class DSAPublicKey(object):
def __init__(self, modulus, subgroup_order, generator, y):
@@ -96,4 +139,4 @@ class DSAPublicKey(object):
def parameters(self):
return DSAParameters(self._modulus, self._subgroup_order,
- self._generator) \ No newline at end of file
+ self._generator)