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
5from __future__ import annotations
6
7import abc
8
9from cryptography.hazmat.bindings._rust import openssl as rust_openssl
10from cryptography.hazmat.primitives import _serialization
11
12generate_parameters = rust_openssl.dh.generate_parameters
13
14
15DHPrivateNumbers = rust_openssl.dh.DHPrivateNumbers
16DHPublicNumbers = rust_openssl.dh.DHPublicNumbers
17DHParameterNumbers = rust_openssl.dh.DHParameterNumbers
18
19
20class DHParameters(metaclass=abc.ABCMeta):
21 @abc.abstractmethod
22 def generate_private_key(self) -> DHPrivateKey:
23 """
24 Generates and returns a DHPrivateKey.
25 """
26
27 @abc.abstractmethod
28 def parameter_bytes(
29 self,
30 encoding: _serialization.Encoding,
31 format: _serialization.ParameterFormat,
32 ) -> bytes:
33 """
34 Returns the parameters serialized as bytes.
35 """
36
37 @abc.abstractmethod
38 def parameter_numbers(self) -> DHParameterNumbers:
39 """
40 Returns a DHParameterNumbers.
41 """
42
43
44DHParametersWithSerialization = DHParameters
45DHParameters.register(rust_openssl.dh.DHParameters)
46
47
48class DHPublicKey(metaclass=abc.ABCMeta):
49 @property
50 @abc.abstractmethod
51 def key_size(self) -> int:
52 """
53 The bit length of the prime modulus.
54 """
55
56 @abc.abstractmethod
57 def parameters(self) -> DHParameters:
58 """
59 The DHParameters object associated with this public key.
60 """
61
62 @abc.abstractmethod
63 def public_numbers(self) -> DHPublicNumbers:
64 """
65 Returns a DHPublicNumbers.
66 """
67
68 @abc.abstractmethod
69 def public_bytes(
70 self,
71 encoding: _serialization.Encoding,
72 format: _serialization.PublicFormat,
73 ) -> bytes:
74 """
75 Returns the key serialized as bytes.
76 """
77
78 @abc.abstractmethod
79 def __eq__(self, other: object) -> bool:
80 """
81 Checks equality.
82 """
83
84 @abc.abstractmethod
85 def __copy__(self) -> DHPublicKey:
86 """
87 Returns a copy.
88 """
89
90
91DHPublicKeyWithSerialization = DHPublicKey
92DHPublicKey.register(rust_openssl.dh.DHPublicKey)
93
94
95class DHPrivateKey(metaclass=abc.ABCMeta):
96 @property
97 @abc.abstractmethod
98 def key_size(self) -> int:
99 """
100 The bit length of the prime modulus.
101 """
102
103 @abc.abstractmethod
104 def public_key(self) -> DHPublicKey:
105 """
106 The DHPublicKey associated with this private key.
107 """
108
109 @abc.abstractmethod
110 def parameters(self) -> DHParameters:
111 """
112 The DHParameters object associated with this private key.
113 """
114
115 @abc.abstractmethod
116 def exchange(self, peer_public_key: DHPublicKey) -> bytes:
117 """
118 Given peer's DHPublicKey, carry out the key exchange and
119 return shared key as bytes.
120 """
121
122 @abc.abstractmethod
123 def private_numbers(self) -> DHPrivateNumbers:
124 """
125 Returns a DHPrivateNumbers.
126 """
127
128 @abc.abstractmethod
129 def private_bytes(
130 self,
131 encoding: _serialization.Encoding,
132 format: _serialization.PrivateFormat,
133 encryption_algorithm: _serialization.KeySerializationEncryption,
134 ) -> bytes:
135 """
136 Returns the key serialized as bytes.
137 """
138
139 @abc.abstractmethod
140 def __copy__(self) -> DHPrivateKey:
141 """
142 Returns a copy.
143 """
144
145
146DHPrivateKeyWithSerialization = DHPrivateKey
147DHPrivateKey.register(rust_openssl.dh.DHPrivateKey)