OLD | NEW |
1 # Authors: | 1 # Authors: |
2 # Trevor Perrin | 2 # Trevor Perrin |
3 # Dave Baggett (Arcode Corporation) - cleanup handling of constants | 3 # Dave Baggett (Arcode Corporation) - cleanup handling of constants |
4 # Yngve Pettersen (ported by Paul Sokolovsky) - TLS 1.2 | 4 # Yngve Pettersen (ported by Paul Sokolovsky) - TLS 1.2 |
5 # | 5 # |
6 # See the LICENSE file for legal information regarding use of this file. | 6 # See the LICENSE file for legal information regarding use of this file. |
7 | 7 |
8 """Class for setting handshake parameters.""" | 8 """Class for setting handshake parameters.""" |
9 | 9 |
10 from .constants import CertificateType | 10 from .constants import CertificateType |
11 from .utils import cryptomath | 11 from .utils import cryptomath |
12 from .utils import cipherfactory | 12 from .utils import cipherfactory |
13 | 13 |
14 # RC4 is preferred as faster in Python, works in SSL3, and immune to CBC | 14 CIPHER_NAMES = ["aes128gcm", "rc4", "aes256", "aes128", "3des"] |
15 # issues such as timing attacks | 15 MAC_NAMES = ["sha", "sha256", "aead"] # Don't allow "md5" by default. |
16 CIPHER_NAMES = ["rc4", "aes256", "aes128", "3des"] | 16 ALL_MAC_NAMES = MAC_NAMES + ["md5"] |
17 MAC_NAMES = ["sha", "sha256"] # Don't allow "md5" by default. | |
18 ALL_MAC_NAMES = ["sha", "sha256", "md5"] | |
19 KEY_EXCHANGE_NAMES = ["rsa", "dhe_rsa", "srp_sha", "srp_sha_rsa", "dh_anon"] | 17 KEY_EXCHANGE_NAMES = ["rsa", "dhe_rsa", "srp_sha", "srp_sha_rsa", "dh_anon"] |
20 CIPHER_IMPLEMENTATIONS = ["openssl", "pycrypto", "python"] | 18 CIPHER_IMPLEMENTATIONS = ["openssl", "pycrypto", "python"] |
21 CERTIFICATE_TYPES = ["x509"] | 19 CERTIFICATE_TYPES = ["x509"] |
22 TLS_INTOLERANCE_TYPES = ["alert", "close", "reset"] | 20 TLS_INTOLERANCE_TYPES = ["alert", "close", "reset"] |
23 | 21 |
24 class HandshakeSettings(object): | 22 class HandshakeSettings(object): |
25 """This class encapsulates various parameters that can be used with | 23 """This class encapsulates various parameters that can be used with |
26 a TLS handshake. | 24 a TLS handshake. |
27 @sort: minKeySize, maxKeySize, cipherNames, macNames, certificateTypes, | 25 @sort: minKeySize, maxKeySize, cipherNames, macNames, certificateTypes, |
28 minVersion, maxVersion | 26 minVersion, maxVersion |
29 | 27 |
30 @type minKeySize: int | 28 @type minKeySize: int |
31 @ivar minKeySize: The minimum bit length for asymmetric keys. | 29 @ivar minKeySize: The minimum bit length for asymmetric keys. |
32 | 30 |
33 If the other party tries to use SRP, RSA, or Diffie-Hellman | 31 If the other party tries to use SRP, RSA, or Diffie-Hellman |
34 parameters smaller than this length, an alert will be | 32 parameters smaller than this length, an alert will be |
35 signalled. The default is 1023. | 33 signalled. The default is 1023. |
36 | 34 |
37 @type maxKeySize: int | 35 @type maxKeySize: int |
38 @ivar maxKeySize: The maximum bit length for asymmetric keys. | 36 @ivar maxKeySize: The maximum bit length for asymmetric keys. |
39 | 37 |
40 If the other party tries to use SRP, RSA, or Diffie-Hellman | 38 If the other party tries to use SRP, RSA, or Diffie-Hellman |
41 parameters larger than this length, an alert will be signalled. | 39 parameters larger than this length, an alert will be signalled. |
42 The default is 8193. | 40 The default is 8193. |
43 | 41 |
44 @type cipherNames: list | 42 @type cipherNames: list |
45 @ivar cipherNames: The allowed ciphers, in order of preference. | 43 @ivar cipherNames: The allowed ciphers. |
46 | 44 |
47 The allowed values in this list are 'aes256', 'aes128', '3des', and | 45 The allowed values in this list are 'aes256', 'aes128', '3des', and |
48 'rc4'. If these settings are used with a client handshake, they | 46 'rc4'. If these settings are used with a client handshake, they |
49 determine the order of the ciphersuites offered in the ClientHello | 47 determine the order of the ciphersuites offered in the ClientHello |
50 message. | 48 message. |
51 | 49 |
52 If these settings are used with a server handshake, the server will | 50 If these settings are used with a server handshake, the server will |
53 choose whichever ciphersuite matches the earliest entry in this | 51 choose whichever ciphersuite matches the earliest entry in this |
54 list. | 52 list. |
55 | 53 |
56 NOTE: If '3des' is used in this list, but TLS Lite can't find an | 54 NOTE: If '3des' is used in this list, but TLS Lite can't find an |
57 add-on library that supports 3DES, then '3des' will be silently | 55 add-on library that supports 3DES, then '3des' will be silently |
58 removed. | 56 removed. |
59 | 57 |
60 The default value is ['rc4', 'aes256', 'aes128', '3des']. | 58 The default value is ['rc4', 'aes256', 'aes128', '3des']. |
61 | 59 |
62 @type macNames: list | 60 @type macNames: list |
63 @ivar macNames: The allowed MAC algorithms. | 61 @ivar macNames: The allowed MAC algorithms. |
64 | 62 |
65 The allowed values in this list are 'sha' and 'md5'. | 63 The allowed values in this list are 'sha' and 'md5'. |
66 | 64 |
67 The default value is ['sha']. | 65 The default value is ['sha']. |
68 | 66 |
69 | 67 |
70 @type certificateTypes: list | 68 @type certificateTypes: list |
71 @ivar certificateTypes: The allowed certificate types, in order of | 69 @ivar certificateTypes: The allowed certificate types. |
72 preference. | |
73 | 70 |
74 The only allowed certificate type is 'x509'. This list is only used with a | 71 The only allowed certificate type is 'x509'. This list is only used with a |
75 client handshake. The client will advertise to the server which certificate | 72 client handshake. The client will advertise to the server which certificate |
76 types are supported, and will check that the server uses one of the | 73 types are supported, and will check that the server uses one of the |
77 appropriate types. | 74 appropriate types. |
78 | 75 |
79 | 76 |
80 @type minVersion: tuple | 77 @type minVersion: tuple |
81 @ivar minVersion: The minimum allowed SSL/TLS version. | 78 @ivar minVersion: The minimum allowed SSL/TLS version. |
82 | 79 |
(...skipping 107 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
190 | 187 |
191 if other.minVersion > other.maxVersion: | 188 if other.minVersion > other.maxVersion: |
192 raise ValueError("Versions set incorrectly") | 189 raise ValueError("Versions set incorrectly") |
193 | 190 |
194 if not other.minVersion in ((3,0), (3,1), (3,2), (3,3)): | 191 if not other.minVersion in ((3,0), (3,1), (3,2), (3,3)): |
195 raise ValueError("minVersion set incorrectly") | 192 raise ValueError("minVersion set incorrectly") |
196 | 193 |
197 if not other.maxVersion in ((3,0), (3,1), (3,2), (3,3)): | 194 if not other.maxVersion in ((3,0), (3,1), (3,2), (3,3)): |
198 raise ValueError("maxVersion set incorrectly") | 195 raise ValueError("maxVersion set incorrectly") |
199 | 196 |
200 if other.maxVersion < (3,3): | |
201 # No sha256 pre TLS 1.2 | |
202 other.macNames = [e for e in self.macNames if e != "sha256"] | |
203 | |
204 return other | 197 return other |
205 | 198 |
206 def _getCertificateTypes(self): | 199 def _getCertificateTypes(self): |
207 l = [] | 200 l = [] |
208 for ct in self.certificateTypes: | 201 for ct in self.certificateTypes: |
209 if ct == "x509": | 202 if ct == "x509": |
210 l.append(CertificateType.x509) | 203 l.append(CertificateType.x509) |
211 else: | 204 else: |
212 raise AssertionError() | 205 raise AssertionError() |
213 return l | 206 return l |
OLD | NEW |