aboutsummaryrefslogtreecommitdiffstats
path: root/cryptography
diff options
context:
space:
mode:
authorPaul Kehrer <paul.l.kehrer@gmail.com>2014-03-29 21:35:06 -0500
committerPaul Kehrer <paul.l.kehrer@gmail.com>2014-03-29 21:35:06 -0500
commita7f6edfb9d26d81c748a71bfd64f179f3633af28 (patch)
tree59752c3adf605f5cf7076e72c333a1d58a9547f6 /cryptography
parent323ef6c708456951da6f8373330de6b007db73b9 (diff)
parent24171ccb2ca5fad010fd1839fc7cde62e847b980 (diff)
downloadcryptography-a7f6edfb9d26d81c748a71bfd64f179f3633af28.tar.gz
cryptography-a7f6edfb9d26d81c748a71bfd64f179f3633af28.tar.bz2
cryptography-a7f6edfb9d26d81c748a71bfd64f179f3633af28.zip
Merge pull request #868 from skeuomorf/dsa-parameters
Add DSA parameters api, docs and tests
Diffstat (limited to 'cryptography')
-rw-r--r--cryptography/hazmat/primitives/asymmetric/dsa.py74
1 files changed, 74 insertions, 0 deletions
diff --git a/cryptography/hazmat/primitives/asymmetric/dsa.py b/cryptography/hazmat/primitives/asymmetric/dsa.py
new file mode 100644
index 00000000..c368e783
--- /dev/null
+++ b/cryptography/hazmat/primitives/asymmetric/dsa.py
@@ -0,0 +1,74 @@
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+# implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+from __future__ import absolute_import, division, print_function
+
+import six
+
+from cryptography import utils
+from cryptography.hazmat.primitives import interfaces
+
+
+def _check_dsa_parameters(modulus, subgroup_order, generator):
+ if (
+ not isinstance(modulus, six.integer_types) or
+ not isinstance(subgroup_order, six.integer_types) or
+ not isinstance(generator, six.integer_types)
+ ):
+ raise TypeError("DSA parameters must be integers")
+
+ if (utils.bit_length(modulus),
+ utils.bit_length(subgroup_order)) not in (
+ (1024, 160),
+ (2048, 256),
+ (3072, 256)):
+ raise ValueError("modulus and subgroup_order lengths must be "
+ "one of these pairs (1024, 160) or (2048, 256) "
+ "or (3072, 256)")
+
+ if generator <= 1 or generator >= modulus:
+ raise ValueError("generator must be > 1 and < modulus")
+
+
+@utils.register_interface(interfaces.DSAParameters)
+class DSAParameters(object):
+ def __init__(self, modulus, subgroup_order, generator):
+ _check_dsa_parameters(modulus, subgroup_order, generator)
+
+ self._modulus = modulus
+ self._subgroup_order = subgroup_order
+ self._generator = generator
+
+ @property
+ def modulus(self):
+ return self._modulus
+
+ @property
+ def subgroup_order(self):
+ return self._subgroup_order
+
+ @property
+ def generator(self):
+ return self._generator
+
+ @property
+ def p(self):
+ return self.modulus
+
+ @property
+ def q(self):
+ return self.subgroup_order
+
+ @property
+ def g(self):
+ return self.generator