dh.py 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216
  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. def generate_parameters(generator, key_size, backend=None):
  10. backend = _get_backend(backend)
  11. return backend.generate_dh_parameters(generator, key_size)
  12. class DHPrivateNumbers(object):
  13. def __init__(self, x, public_numbers):
  14. if not isinstance(x, six.integer_types):
  15. raise TypeError("x must be an integer.")
  16. if not isinstance(public_numbers, DHPublicNumbers):
  17. raise TypeError(
  18. "public_numbers must be an instance of " "DHPublicNumbers."
  19. )
  20. self._x = x
  21. self._public_numbers = public_numbers
  22. def __eq__(self, other):
  23. if not isinstance(other, DHPrivateNumbers):
  24. return NotImplemented
  25. return (
  26. self._x == other._x
  27. and self._public_numbers == other._public_numbers
  28. )
  29. def __ne__(self, other):
  30. return not self == other
  31. def private_key(self, backend=None):
  32. backend = _get_backend(backend)
  33. return backend.load_dh_private_numbers(self)
  34. public_numbers = utils.read_only_property("_public_numbers")
  35. x = utils.read_only_property("_x")
  36. class DHPublicNumbers(object):
  37. def __init__(self, y, parameter_numbers):
  38. if not isinstance(y, six.integer_types):
  39. raise TypeError("y must be an integer.")
  40. if not isinstance(parameter_numbers, DHParameterNumbers):
  41. raise TypeError(
  42. "parameters must be an instance of DHParameterNumbers."
  43. )
  44. self._y = y
  45. self._parameter_numbers = parameter_numbers
  46. def __eq__(self, other):
  47. if not isinstance(other, DHPublicNumbers):
  48. return NotImplemented
  49. return (
  50. self._y == other._y
  51. and self._parameter_numbers == other._parameter_numbers
  52. )
  53. def __ne__(self, other):
  54. return not self == other
  55. def public_key(self, backend=None):
  56. backend = _get_backend(backend)
  57. return backend.load_dh_public_numbers(self)
  58. y = utils.read_only_property("_y")
  59. parameter_numbers = utils.read_only_property("_parameter_numbers")
  60. class DHParameterNumbers(object):
  61. def __init__(self, p, g, q=None):
  62. if not isinstance(p, six.integer_types) or not isinstance(
  63. g, six.integer_types
  64. ):
  65. raise TypeError("p and g must be integers")
  66. if q is not None and not isinstance(q, six.integer_types):
  67. raise TypeError("q must be integer or None")
  68. if g < 2:
  69. raise ValueError("DH generator must be 2 or greater")
  70. self._p = p
  71. self._g = g
  72. self._q = q
  73. def __eq__(self, other):
  74. if not isinstance(other, DHParameterNumbers):
  75. return NotImplemented
  76. return (
  77. self._p == other._p and self._g == other._g and self._q == other._q
  78. )
  79. def __ne__(self, other):
  80. return not self == other
  81. def parameters(self, backend=None):
  82. backend = _get_backend(backend)
  83. return backend.load_dh_parameter_numbers(self)
  84. p = utils.read_only_property("_p")
  85. g = utils.read_only_property("_g")
  86. q = utils.read_only_property("_q")
  87. @six.add_metaclass(abc.ABCMeta)
  88. class DHParameters(object):
  89. @abc.abstractmethod
  90. def generate_private_key(self):
  91. """
  92. Generates and returns a DHPrivateKey.
  93. """
  94. @abc.abstractmethod
  95. def parameter_bytes(self, encoding, format):
  96. """
  97. Returns the parameters serialized as bytes.
  98. """
  99. @abc.abstractmethod
  100. def parameter_numbers(self):
  101. """
  102. Returns a DHParameterNumbers.
  103. """
  104. DHParametersWithSerialization = DHParameters
  105. @six.add_metaclass(abc.ABCMeta)
  106. class DHPrivateKey(object):
  107. @abc.abstractproperty
  108. def key_size(self):
  109. """
  110. The bit length of the prime modulus.
  111. """
  112. @abc.abstractmethod
  113. def public_key(self):
  114. """
  115. The DHPublicKey associated with this private key.
  116. """
  117. @abc.abstractmethod
  118. def parameters(self):
  119. """
  120. The DHParameters object associated with this private key.
  121. """
  122. @abc.abstractmethod
  123. def exchange(self, peer_public_key):
  124. """
  125. Given peer's DHPublicKey, carry out the key exchange and
  126. return shared key as bytes.
  127. """
  128. @six.add_metaclass(abc.ABCMeta)
  129. class DHPrivateKeyWithSerialization(DHPrivateKey):
  130. @abc.abstractmethod
  131. def private_numbers(self):
  132. """
  133. Returns a DHPrivateNumbers.
  134. """
  135. @abc.abstractmethod
  136. def private_bytes(self, encoding, format, encryption_algorithm):
  137. """
  138. Returns the key serialized as bytes.
  139. """
  140. @six.add_metaclass(abc.ABCMeta)
  141. class DHPublicKey(object):
  142. @abc.abstractproperty
  143. def key_size(self):
  144. """
  145. The bit length of the prime modulus.
  146. """
  147. @abc.abstractmethod
  148. def parameters(self):
  149. """
  150. The DHParameters object associated with this public key.
  151. """
  152. @abc.abstractmethod
  153. def public_numbers(self):
  154. """
  155. Returns a DHPublicNumbers.
  156. """
  157. @abc.abstractmethod
  158. def public_bytes(self, encoding, format):
  159. """
  160. Returns the key serialized as bytes.
  161. """
  162. DHPublicKeyWithSerialization = DHPublicKey