dsa.py 7.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261
  1. # This file is dual licensed under the terms of the Apache License, Version
  2. # 2.0, and the BSD License. See the LICENSE file in the root of this repository
  3. # for complete details.
  4. from __future__ import absolute_import, division, print_function
  5. import abc
  6. import six
  7. from cryptography import utils
  8. from cryptography.hazmat.backends import _get_backend
  9. @six.add_metaclass(abc.ABCMeta)
  10. class DSAParameters(object):
  11. @abc.abstractmethod
  12. def generate_private_key(self):
  13. """
  14. Generates and returns a DSAPrivateKey.
  15. """
  16. @six.add_metaclass(abc.ABCMeta)
  17. class DSAParametersWithNumbers(DSAParameters):
  18. @abc.abstractmethod
  19. def parameter_numbers(self):
  20. """
  21. Returns a DSAParameterNumbers.
  22. """
  23. @six.add_metaclass(abc.ABCMeta)
  24. class DSAPrivateKey(object):
  25. @abc.abstractproperty
  26. def key_size(self):
  27. """
  28. The bit length of the prime modulus.
  29. """
  30. @abc.abstractmethod
  31. def public_key(self):
  32. """
  33. The DSAPublicKey associated with this private key.
  34. """
  35. @abc.abstractmethod
  36. def parameters(self):
  37. """
  38. The DSAParameters object associated with this private key.
  39. """
  40. @abc.abstractmethod
  41. def signer(self, signature_algorithm):
  42. """
  43. Returns an AsymmetricSignatureContext used for signing data.
  44. """
  45. @abc.abstractmethod
  46. def sign(self, data, algorithm):
  47. """
  48. Signs the data
  49. """
  50. @six.add_metaclass(abc.ABCMeta)
  51. class DSAPrivateKeyWithSerialization(DSAPrivateKey):
  52. @abc.abstractmethod
  53. def private_numbers(self):
  54. """
  55. Returns a DSAPrivateNumbers.
  56. """
  57. @abc.abstractmethod
  58. def private_bytes(self, encoding, format, encryption_algorithm):
  59. """
  60. Returns the key serialized as bytes.
  61. """
  62. @six.add_metaclass(abc.ABCMeta)
  63. class DSAPublicKey(object):
  64. @abc.abstractproperty
  65. def key_size(self):
  66. """
  67. The bit length of the prime modulus.
  68. """
  69. @abc.abstractmethod
  70. def parameters(self):
  71. """
  72. The DSAParameters object associated with this public key.
  73. """
  74. @abc.abstractmethod
  75. def verifier(self, signature, signature_algorithm):
  76. """
  77. Returns an AsymmetricVerificationContext used for signing data.
  78. """
  79. @abc.abstractmethod
  80. def public_numbers(self):
  81. """
  82. Returns a DSAPublicNumbers.
  83. """
  84. @abc.abstractmethod
  85. def public_bytes(self, encoding, format):
  86. """
  87. Returns the key serialized as bytes.
  88. """
  89. @abc.abstractmethod
  90. def verify(self, signature, data, algorithm):
  91. """
  92. Verifies the signature of the data.
  93. """
  94. DSAPublicKeyWithSerialization = DSAPublicKey
  95. def generate_parameters(key_size, backend=None):
  96. backend = _get_backend(backend)
  97. return backend.generate_dsa_parameters(key_size)
  98. def generate_private_key(key_size, backend=None):
  99. backend = _get_backend(backend)
  100. return backend.generate_dsa_private_key_and_parameters(key_size)
  101. def _check_dsa_parameters(parameters):
  102. if parameters.p.bit_length() not in [1024, 2048, 3072, 4096]:
  103. raise ValueError(
  104. "p must be exactly 1024, 2048, 3072, or 4096 bits long"
  105. )
  106. if parameters.q.bit_length() not in [160, 224, 256]:
  107. raise ValueError("q must be exactly 160, 224, or 256 bits long")
  108. if not (1 < parameters.g < parameters.p):
  109. raise ValueError("g, p don't satisfy 1 < g < p.")
  110. def _check_dsa_private_numbers(numbers):
  111. parameters = numbers.public_numbers.parameter_numbers
  112. _check_dsa_parameters(parameters)
  113. if numbers.x <= 0 or numbers.x >= parameters.q:
  114. raise ValueError("x must be > 0 and < q.")
  115. if numbers.public_numbers.y != pow(parameters.g, numbers.x, parameters.p):
  116. raise ValueError("y must be equal to (g ** x % p).")
  117. class DSAParameterNumbers(object):
  118. def __init__(self, p, q, g):
  119. if (
  120. not isinstance(p, six.integer_types)
  121. or not isinstance(q, six.integer_types)
  122. or not isinstance(g, six.integer_types)
  123. ):
  124. raise TypeError(
  125. "DSAParameterNumbers p, q, and g arguments must be integers."
  126. )
  127. self._p = p
  128. self._q = q
  129. self._g = g
  130. p = utils.read_only_property("_p")
  131. q = utils.read_only_property("_q")
  132. g = utils.read_only_property("_g")
  133. def parameters(self, backend=None):
  134. backend = _get_backend(backend)
  135. return backend.load_dsa_parameter_numbers(self)
  136. def __eq__(self, other):
  137. if not isinstance(other, DSAParameterNumbers):
  138. return NotImplemented
  139. return self.p == other.p and self.q == other.q and self.g == other.g
  140. def __ne__(self, other):
  141. return not self == other
  142. def __repr__(self):
  143. return (
  144. "<DSAParameterNumbers(p={self.p}, q={self.q}, "
  145. "g={self.g})>".format(self=self)
  146. )
  147. class DSAPublicNumbers(object):
  148. def __init__(self, y, parameter_numbers):
  149. if not isinstance(y, six.integer_types):
  150. raise TypeError("DSAPublicNumbers y argument must be an integer.")
  151. if not isinstance(parameter_numbers, DSAParameterNumbers):
  152. raise TypeError(
  153. "parameter_numbers must be a DSAParameterNumbers instance."
  154. )
  155. self._y = y
  156. self._parameter_numbers = parameter_numbers
  157. y = utils.read_only_property("_y")
  158. parameter_numbers = utils.read_only_property("_parameter_numbers")
  159. def public_key(self, backend=None):
  160. backend = _get_backend(backend)
  161. return backend.load_dsa_public_numbers(self)
  162. def __eq__(self, other):
  163. if not isinstance(other, DSAPublicNumbers):
  164. return NotImplemented
  165. return (
  166. self.y == other.y
  167. and self.parameter_numbers == other.parameter_numbers
  168. )
  169. def __ne__(self, other):
  170. return not self == other
  171. def __repr__(self):
  172. return (
  173. "<DSAPublicNumbers(y={self.y}, "
  174. "parameter_numbers={self.parameter_numbers})>".format(self=self)
  175. )
  176. class DSAPrivateNumbers(object):
  177. def __init__(self, x, public_numbers):
  178. if not isinstance(x, six.integer_types):
  179. raise TypeError("DSAPrivateNumbers x argument must be an integer.")
  180. if not isinstance(public_numbers, DSAPublicNumbers):
  181. raise TypeError(
  182. "public_numbers must be a DSAPublicNumbers instance."
  183. )
  184. self._public_numbers = public_numbers
  185. self._x = x
  186. x = utils.read_only_property("_x")
  187. public_numbers = utils.read_only_property("_public_numbers")
  188. def private_key(self, backend=None):
  189. backend = _get_backend(backend)
  190. return backend.load_dsa_private_numbers(self)
  191. def __eq__(self, other):
  192. if not isinstance(other, DSAPrivateNumbers):
  193. return NotImplemented
  194. return (
  195. self.x == other.x and self.public_numbers == other.public_numbers
  196. )
  197. def __ne__(self, other):
  198. return not self == other