2 * Copyright (C) 2020 Tobias Brunner
3 * Copyright (C) 2020 Pascal Knecht
4 * Copyright (C) 2020 Méline Sieber
5 * HSR Hochschule fuer Technik Rapperswil
7 * Copyright (C) 2010-2014 Martin Willi
8 * Copyright (C) 2010-2014 revosec AG
10 * This program is free software; you can redistribute it and/or modify it
11 * under the terms of the GNU General Public License as published by the
12 * Free Software Foundation; either version 2 of the License, or (at your
13 * option) any later version. See <http://www.fsf.org/copyleft/gpl.txt>.
15 * This program is distributed in the hope that it will be useful, but
16 * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
17 * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
21 #include "tls_crypto.h"
24 #include <utils/debug.h>
25 #include <plugins/plugin_feature.h>
26 #include <collections/hashtable.h>
28 ENUM_BEGIN(tls_cipher_suite_names
, TLS_NULL_WITH_NULL_NULL
,
29 TLS_DH_anon_WITH_3DES_EDE_CBC_SHA
,
30 "TLS_NULL_WITH_NULL_NULL",
31 "TLS_RSA_WITH_NULL_MD5",
32 "TLS_RSA_WITH_NULL_SHA",
33 "TLS_RSA_EXPORT_WITH_RC4_40_MD5",
34 "TLS_RSA_WITH_RC4_128_MD5",
35 "TLS_RSA_WITH_RC4_128_SHA",
36 "TLS_RSA_EXPORT_WITH_RC2_CBC_40_MD5",
37 "TLS_RSA_WITH_IDEA_CBC_SHA",
38 "TLS_RSA_EXPORT_WITH_DES40_CBC_SHA",
39 "TLS_RSA_WITH_DES_CBC_SHA",
40 "TLS_RSA_WITH_3DES_EDE_CBC_SHA",
41 "TLS_DH_DSS_EXPORT_WITH_DES40_CBC_SHA",
42 "TLS_DH_DSS_WITH_DES_CBC_SHA",
43 "TLS_DH_DSS_WITH_3DES_EDE_CBC_SHA",
44 "TLS_DH_RSA_EXPORT_WITH_DES40_CBC_SHA",
45 "TLS_DH_RSA_WITH_DES_CBC_SHA",
46 "TLS_DH_RSA_WITH_3DES_EDE_CBC_SHA",
47 "TLS_DHE_DSS_EXPORT_WITH_DES40_CBC_SHA",
48 "TLS_DHE_DSS_WITH_DES_CBC_SHA",
49 "TLS_DHE_DSS_WITH_3DES_EDE_CBC_SHA",
50 "TLS_DHE_RSA_EXPORT_WITH_DES40_CBC_SHA",
51 "TLS_DHE_RSA_WITH_DES_CBC_SHA",
52 "TLS_DHE_RSA_WITH_3DES_EDE_CBC_SHA",
53 "TLS_DH_anon_EXPORT_WITH_RC4_40_MD5",
54 "TLS_DH_anon_WITH_RC4_128_MD5",
55 "TLS_DH_anon_EXPORT_WITH_DES40_CBC_SHA",
56 "TLS_DH_anon_WITH_DES_CBC_SHA",
57 "TLS_DH_anon_WITH_3DES_EDE_CBC_SHA");
58 ENUM_NEXT(tls_cipher_suite_names
, TLS_KRB5_WITH_DES_CBC_SHA
,
59 TLS_DH_anon_WITH_CAMELLIA_128_CBC_SHA
,
60 TLS_DH_anon_WITH_3DES_EDE_CBC_SHA
,
61 "TLS_KRB5_WITH_DES_CBC_SHA",
62 "TLS_KRB5_WITH_3DES_EDE_CBC_SHA",
63 "TLS_KRB5_WITH_RC4_128_SHA",
64 "TLS_KRB5_WITH_IDEA_CBC_SHA",
65 "TLS_KRB5_WITH_DES_CBC_MD5",
66 "TLS_KRB5_WITH_3DES_EDE_CBC_MD5",
67 "TLS_KRB5_WITH_RC4_128_MD5",
68 "TLS_KRB5_WITH_IDEA_CBC_MD5",
69 "TLS_KRB5_EXPORT_WITH_DES_CBC_40_SHA",
70 "TLS_KRB5_EXPORT_WITH_RC2_CBC_40_SHA",
71 "TLS_KRB5_EXPORT_WITH_RC4_40_SHA",
72 "TLS_KRB5_EXPORT_WITH_DES_CBC_40_MD5",
73 "TLS_KRB5_EXPORT_WITH_RC2_CBC_40_MD5",
74 "TLS_KRB5_EXPORT_WITH_RC4_40_MD5",
75 "TLS_PSK_WITH_NULL_SHA",
76 "TLS_DHE_PSK_WITH_NULL_SHA",
77 "TLS_RSA_PSK_WITH_NULL_SHA",
78 "TLS_RSA_WITH_AES_128_CBC_SHA",
79 "TLS_DH_DSS_WITH_AES_128_CBC_SHA",
80 "TLS_DH_RSA_WITH_AES_128_CBC_SHA",
81 "TLS_DHE_DSS_WITH_AES_128_CBC_SHA",
82 "TLS_DHE_RSA_WITH_AES_128_CBC_SHA",
83 "TLS_DH_anon_WITH_AES_128_CBC_SHA",
84 "TLS_RSA_WITH_AES_256_CBC_SHA",
85 "TLS_DH_DSS_WITH_AES_256_CBC_SHA",
86 "TLS_DH_RSA_WITH_AES_256_CBC_SHA",
87 "TLS_DHE_DSS_WITH_AES_256_CBC_SHA",
88 "TLS_DHE_RSA_WITH_AES_256_CBC_SHA",
89 "TLS_DH_anon_WITH_AES_256_CBC_SHA",
90 "TLS_RSA_WITH_NULL_SHA256",
91 "TLS_RSA_WITH_AES_128_CBC_SHA256",
92 "TLS_RSA_WITH_AES_256_CBC_SHA256",
93 "TLS_DH_DSS_WITH_AES_128_CBC_SHA256",
94 "TLS_DH_RSA_WITH_AES_128_CBC_SHA256",
95 "TLS_DHE_DSS_WITH_AES_128_CBC_SHA256",
96 "TLS_RSA_WITH_CAMELLIA_128_CBC_SHA",
97 "TLS_DH_DSS_WITH_CAMELLIA_128_CBC_SHA",
98 "TLS_DH_RSA_WITH_CAMELLIA_128_CBC_SHA",
99 "TLS_DHE_DSS_WITH_CAMELLIA_128_CBC_SHA",
100 "TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA",
101 "TLS_DH_anon_WITH_CAMELLIA_128_CBC_SHA");
102 ENUM_NEXT(tls_cipher_suite_names
, TLS_DHE_RSA_WITH_AES_128_CBC_SHA256
,
103 TLS_DH_anon_WITH_AES_256_CBC_SHA256
,
104 TLS_DH_anon_WITH_CAMELLIA_128_CBC_SHA
,
105 "TLS_DHE_RSA_WITH_AES_128_CBC_SHA256",
106 "TLS_DH_DSS_WITH_AES_256_CBC_SHA256",
107 "TLS_DH_RSA_WITH_AES_256_CBC_SHA256",
108 "TLS_DHE_DSS_WITH_AES_256_CBC_SHA256",
109 "TLS_DHE_RSA_WITH_AES_256_CBC_SHA256",
110 "TLS_DH_anon_WITH_AES_128_CBC_SHA256",
111 "TLS_DH_anon_WITH_AES_256_CBC_SHA256");
112 ENUM_NEXT(tls_cipher_suite_names
, TLS_RSA_WITH_CAMELLIA_256_CBC_SHA
,
113 TLS_DH_anon_WITH_CAMELLIA_256_CBC_SHA256
,
114 TLS_DH_anon_WITH_AES_256_CBC_SHA256
,
115 "TLS_RSA_WITH_CAMELLIA_256_CBC_SHA",
116 "TLS_DH_DSS_WITH_CAMELLIA_256_CBC_SHA",
117 "TLS_DH_RSA_WITH_CAMELLIA_256_CBC_SHA",
118 "TLS_DHE_DSS_WITH_CAMELLIA_256_CBC_SHA",
119 "TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA",
120 "TLS_DH_anon_WITH_CAMELLIA_256_CBC_SHA",
121 "TLS_PSK_WITH_RC4_128_SHA",
122 "TLS_PSK_WITH_3DES_EDE_CBC_SHA",
123 "TLS_PSK_WITH_AES_128_CBC_SHA",
124 "TLS_PSK_WITH_AES_256_CBC_SHA",
125 "TLS_DHE_PSK_WITH_RC4_128_SHA",
126 "TLS_DHE_PSK_WITH_3DES_EDE_CBC_SHA",
127 "TLS_DHE_PSK_WITH_AES_128_CBC_SHA",
128 "TLS_DHE_PSK_WITH_AES_256_CBC_SHA",
129 "TLS_RSA_PSK_WITH_RC4_128_SHA",
130 "TLS_RSA_PSK_WITH_3DES_EDE_CBC_SHA",
131 "TLS_RSA_PSK_WITH_AES_128_CBC_SHA",
132 "TLS_RSA_PSK_WITH_AES_256_CBC_SHA",
133 "TLS_RSA_WITH_SEED_CBC_SHA",
134 "TLS_DH_DSS_WITH_SEED_CBC_SHA",
135 "TLS_DH_RSA_WITH_SEED_CBC_SHA",
136 "TLS_DHE_DSS_WITH_SEED_CBC_SHA",
137 "TLS_DHE_RSA_WITH_SEED_CBC_SHA",
138 "TLS_DH_anon_WITH_SEED_CBC_SHA",
139 "TLS_RSA_WITH_AES_128_GCM_SHA256",
140 "TLS_RSA_WITH_AES_256_GCM_SHA384",
141 "TLS_DHE_RSA_WITH_AES_128_GCM_SHA256",
142 "TLS_DHE_RSA_WITH_AES_256_GCM_SHA384",
143 "TLS_DH_RSA_WITH_AES_128_GCM_SHA256",
144 "TLS_DH_RSA_WITH_AES_256_GCM_SHA384",
145 "TLS_DHE_DSS_WITH_AES_128_GCM_SHA256",
146 "TLS_DHE_DSS_WITH_AES_256_GCM_SHA384",
147 "TLS_DH_DSS_WITH_AES_128_GCM_SHA256",
148 "TLS_DH_DSS_WITH_AES_256_GCM_SHA384",
149 "TLS_DH_anon_WITH_AES_128_GCM_SHA256",
150 "TLS_DH_anon_WITH_AES_256_GCM_SHA384",
151 "TLS_PSK_WITH_AES_128_GCM_SHA256",
152 "TLS_PSK_WITH_AES_256_GCM_SHA384",
153 "TLS_DHE_PSK_WITH_AES_128_GCM_SHA256",
154 "TLS_DHE_PSK_WITH_AES_256_GCM_SHA384",
155 "TLS_RSA_PSK_WITH_AES_128_GCM_SHA256",
156 "TLS_RSA_PSK_WITH_AES_256_GCM_SHA384",
157 "TLS_PSK_WITH_AES_128_CBC_SHA256",
158 "TLS_PSK_WITH_AES_256_CBC_SHA384",
159 "TLS_PSK_WITH_NULL_SHA256",
160 "TLS_PSK_WITH_NULL_SHA384",
161 "TLS_DHE_PSK_WITH_AES_128_CBC_SHA256",
162 "TLS_DHE_PSK_WITH_AES_256_CBC_SHA384",
163 "TLS_DHE_PSK_WITH_NULL_SHA256",
164 "TLS_DHE_PSK_WITH_NULL_SHA384",
165 "TLS_RSA_PSK_WITH_AES_128_CBC_SHA256",
166 "TLS_RSA_PSK_WITH_AES_256_CBC_SHA384",
167 "TLS_RSA_PSK_WITH_NULL_SHA256",
168 "TLS_RSA_PSK_WITH_NULL_SHA384",
169 "TLS_RSA_WITH_CAMELLIA_128_CBC_SHA256",
170 "TLS_DH_DSS_WITH_CAMELLIA_128_CBC_SHA256",
171 "TLS_DH_RSA_WITH_CAMELLIA_128_CBC_SHA256",
172 "TLS_DHE_DSS_WITH_CAMELLIA_128_CBC_SHA256",
173 "TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA256",
174 "TLS_DH_anon_WITH_CAMELLIA_128_CBC_SHA256",
175 "TLS_RSA_WITH_CAMELLIA_256_CBC_SHA256",
176 "TLS_DH_DSS_WITH_CAMELLIA_256_CBC_SHA256",
177 "TLS_DH_RSA_WITH_CAMELLIA_256_CBC_SHA256",
178 "TLS_DHE_DSS_WITH_CAMELLIA_256_CBC_SHA256",
179 "TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA256",
180 "TLS_DH_anon_WITH_CAMELLIA_256_CBC_SHA256");
181 ENUM_NEXT(tls_cipher_suite_names
, TLS_EMPTY_RENEGOTIATION_INFO_SCSV
,
182 TLS_EMPTY_RENEGOTIATION_INFO_SCSV
,
183 TLS_DH_anon_WITH_CAMELLIA_256_CBC_SHA256
,
184 "TLS_EMPTY_RENEGOTIATION_INFO_SCSV");
185 ENUM_NEXT(tls_cipher_suite_names
, TLS_AES_128_GCM_SHA256
,
186 TLS_AES_128_CCM_8_SHA256
,
187 TLS_EMPTY_RENEGOTIATION_INFO_SCSV
,
188 "TLS_AES_128_GCM_SHA256",
189 "TLS_AES_256_GCM_SHA384",
190 "TLS_CHACHA20_POLY1305_SHA256",
191 "TLS_AES_128_CCM_SHA256",
192 "TLS_AES_128_CCM_8_SHA256");
193 ENUM_NEXT(tls_cipher_suite_names
, TLS_ECDH_ECDSA_WITH_NULL_SHA
,
194 TLS_ECDHE_PSK_WITH_NULL_SHA384
,
195 TLS_AES_128_CCM_8_SHA256
,
196 "TLS_ECDH_ECDSA_WITH_NULL_SHA",
197 "TLS_ECDH_ECDSA_WITH_RC4_128_SHA",
198 "TLS_ECDH_ECDSA_WITH_3DES_EDE_CBC_SHA",
199 "TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA",
200 "TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA",
201 "TLS_ECDHE_ECDSA_WITH_NULL_SHA",
202 "TLS_ECDHE_ECDSA_WITH_RC4_128_SHA",
203 "TLS_ECDHE_ECDSA_WITH_3DES_EDE_CBC_SHA",
204 "TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA",
205 "TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA",
206 "TLS_ECDH_RSA_WITH_NULL_SHA",
207 "TLS_ECDH_RSA_WITH_RC4_128_SHA",
208 "TLS_ECDH_RSA_WITH_3DES_EDE_CBC_SHA",
209 "TLS_ECDH_RSA_WITH_AES_128_CBC_SHA",
210 "TLS_ECDH_RSA_WITH_AES_256_CBC_SHA",
211 "TLS_ECDHE_RSA_WITH_NULL_SHA",
212 "TLS_ECDHE_RSA_WITH_RC4_128_SHA",
213 "TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA",
214 "TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA",
215 "TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA",
216 "TLS_ECDH_anon_WITH_NULL_SHA",
217 "TLS_ECDH_anon_WITH_RC4_128_SHA",
218 "TLS_ECDH_anon_WITH_3DES_EDE_CBC_SHA",
219 "TLS_ECDH_anon_WITH_AES_128_CBC_SHA",
220 "TLS_ECDH_anon_WITH_AES_256_CBC_SHA",
221 "TLS_SRP_SHA_WITH_3DES_EDE_CBC_SHA",
222 "TLS_SRP_SHA_RSA_WITH_3DES_EDE_CBC_SHA",
223 "TLS_SRP_SHA_DSS_WITH_3DES_EDE_CBC_SHA",
224 "TLS_SRP_SHA_WITH_AES_128_CBC_SHA",
225 "TLS_SRP_SHA_RSA_WITH_AES_128_CBC_SHA",
226 "TLS_SRP_SHA_DSS_WITH_AES_128_CBC_SHA",
227 "TLS_SRP_SHA_WITH_AES_256_CBC_SHA",
228 "TLS_SRP_SHA_RSA_WITH_AES_256_CBC_SHA",
229 "TLS_SRP_SHA_DSS_WITH_AES_256_CBC_SHA",
230 "TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256",
231 "TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384",
232 "TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA256",
233 "TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA384",
234 "TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256",
235 "TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384",
236 "TLS_ECDH_RSA_WITH_AES_128_CBC_SHA256",
237 "TLS_ECDH_RSA_WITH_AES_256_CBC_SHA384",
238 "TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256",
239 "TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384",
240 "TLS_ECDH_ECDSA_WITH_AES_128_GCM_SHA256",
241 "TLS_ECDH_ECDSA_WITH_AES_256_GCM_SHA384",
242 "TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256",
243 "TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384",
244 "TLS_ECDH_RSA_WITH_AES_128_GCM_SHA256",
245 "TLS_ECDH_RSA_WITH_AES_256_GCM_SHA384",
246 "TLS_ECDHE_PSK_WITH_RC4_128_SHA",
247 "TLS_ECDHE_PSK_WITH_3DES_EDE_CBC_SHA",
248 "TLS_ECDHE_PSK_WITH_AES_128_CBC_SHA",
249 "TLS_ECDHE_PSK_WITH_AES_256_CBC_SHA",
250 "TLS_ECDHE_PSK_WITH_AES_128_CBC_SHA256",
251 "TLS_ECDHE_PSK_WITH_AES_256_CBC_SHA384",
252 "TLS_ECDHE_PSK_WITH_NULL_SHA",
253 "TLS_ECDHE_PSK_WITH_NULL_SHA256",
254 "TLS_ECDHE_PSK_WITH_NULL_SHA384");
255 ENUM_NEXT(tls_cipher_suite_names
, TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256
,
256 TLS_DHE_RSA_WITH_CHACHA20_POLY1305_SHA256
,
257 TLS_ECDHE_PSK_WITH_NULL_SHA384
,
258 "TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256",
259 "TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256",
260 "TLS_DHE_RSA_WITH_CHACHA20_POLY1305_SHA256");
261 ENUM_END(tls_cipher_suite_names
, TLS_DHE_RSA_WITH_CHACHA20_POLY1305_SHA256
);
264 ENUM(tls_hash_algorithm_names
, TLS_HASH_NONE
, TLS_HASH_SHA512
,
274 ENUM_BEGIN(tls_signature_scheme_names
,
275 TLS_SIG_RSA_PKCS1_SHA1
, TLS_SIG_RSA_PKCS1_SHA1
,
277 ENUM_NEXT(tls_signature_scheme_names
,
278 TLS_SIG_ECDSA_SHA1
, TLS_SIG_ECDSA_SHA1
, TLS_SIG_RSA_PKCS1_SHA1
,
280 ENUM_NEXT(tls_signature_scheme_names
,
281 TLS_SIG_RSA_PKCS1_SHA224
, TLS_SIG_ECDSA_SHA224
, TLS_SIG_ECDSA_SHA1
,
285 ENUM_NEXT(tls_signature_scheme_names
,
286 TLS_SIG_RSA_PKCS1_SHA256
, TLS_SIG_ECDSA_SHA256
, TLS_SIG_ECDSA_SHA224
,
290 ENUM_NEXT(tls_signature_scheme_names
,
291 TLS_SIG_RSA_PKCS1_SHA384
, TLS_SIG_ECDSA_SHA384
, TLS_SIG_ECDSA_SHA256
,
295 ENUM_NEXT(tls_signature_scheme_names
,
296 TLS_SIG_RSA_PKCS1_SHA512
, TLS_SIG_ECDSA_SHA512
, TLS_SIG_ECDSA_SHA384
,
300 ENUM_NEXT(tls_signature_scheme_names
,
301 TLS_SIG_RSA_PSS_RSAE_SHA256
, TLS_SIG_RSA_PSS_PSS_SHA512
, TLS_SIG_ECDSA_SHA512
,
302 "RSA_PSS_RSAE_SHA256",
303 "RSA_PSS_RSAE_SHA384",
304 "RSA_PSS_RSAE_SHA512",
307 "RSA_PSS_PSS_SHA256",
308 "RSA_PSS_PSS_SHA384",
309 "RSA_PSS_PSS_SHA512",
311 ENUM_END(tls_signature_scheme_names
, TLS_SIG_RSA_PSS_PSS_SHA512
);
313 ENUM_BEGIN(tls_client_certificate_type_names
,
314 TLS_RSA_SIGN
, TLS_DSS_EPHEMERAL_DH
,
321 ENUM_NEXT(tls_client_certificate_type_names
,
322 TLS_FORTEZZA_DMS
, TLS_FORTEZZA_DMS
, TLS_DSS_EPHEMERAL_DH
,
324 ENUM_NEXT(tls_client_certificate_type_names
,
325 TLS_ECDSA_SIGN
, TLS_ECDSA_FIXED_ECDH
, TLS_FORTEZZA_DMS
,
329 ENUM_END(tls_client_certificate_type_names
, TLS_ECDSA_FIXED_ECDH
);
331 ENUM(tls_ecc_curve_type_names
, TLS_ECC_EXPLICIT_PRIME
, TLS_ECC_NAMED_CURVE
,
337 ENUM_BEGIN(tls_named_group_names
, TLS_SECT163K1
, TLS_SECP521R1
,
364 ENUM_NEXT(tls_named_group_names
, TLS_CURVE25519
, TLS_CURVE448
, TLS_SECP521R1
,
368 ENUM_NEXT(tls_named_group_names
, TLS_FFDHE2048
, TLS_FFDHE8192
, TLS_CURVE448
,
375 ENUM_END(tls_named_group_names
, TLS_FFDHE8192
);
377 ENUM(tls_ansi_point_format_names
, TLS_ANSI_COMPRESSED
, TLS_ANSI_HYBRID_Y
,
386 ENUM(tls_ec_point_format_names
,
387 TLS_EC_POINT_UNCOMPRESSED
, TLS_EC_POINT_ANSIX962_COMPRESSED_CHAR2
,
389 "ansiX962 compressed prime",
390 "ansiX962 compressed char2",
393 typedef struct private_tls_crypto_t private_tls_crypto_t
;
396 * Private data of an tls_crypto_t object.
398 struct private_tls_crypto_t
{
401 * Public tls_crypto_t interface.
408 tls_protection_t
*protection
;
411 * List of supported/acceptable cipher suites
413 tls_cipher_suite_t
*suites
;
416 * Number of supported suites
426 * Selected cipher suite
428 tls_cipher_suite_t suite
;
451 * All handshake data concatenated
456 * Connection state TLS PRF
461 * AEAD transform for inbound traffic
466 * AEAD transform for outbound traffic
468 tls_aead_t
*aead_out
;
476 * ASCII string constant used as seed for EAP-[T]TLS MSK PRF
482 tls_cipher_suite_t suite
;
484 diffie_hellman_group_t dh
;
485 hash_algorithm_t hash
;
486 pseudo_random_function_t prf
;
487 integrity_algorithm_t mac
;
488 encryption_algorithm_t encr
;
490 tls_version_t min_version
;
491 tls_version_t max_version
;
495 * Mapping suites to a set of algorithms
497 * The order represents the descending preference of cipher suites and follows
500 * 1. TLS 1.3 > Legacy TLS
501 * 2. AES > CAMELLIA > NULL
504 * 5. ECDHE > DHE > NULL
506 * 7. SHA384 > SHA256 > SHA1
509 static suite_algs_t suite_algs
[] = {
510 /* Cipher suites of TLS 1.3: key exchange and authentication
511 * delegated to extensions, therefore KEY_ANY, MODP_NONE, PRF_UNDEFINED */
512 { TLS_AES_256_GCM_SHA384
,
514 HASH_SHA384
, PRF_UNDEFINED
,
515 AUTH_HMAC_SHA2_384_384
, ENCR_AES_GCM_ICV16
, 32,
518 { TLS_AES_128_GCM_SHA256
,
520 HASH_SHA256
, PRF_UNDEFINED
,
521 AUTH_HMAC_SHA2_256_256
, ENCR_AES_GCM_ICV16
, 16,
524 { TLS_CHACHA20_POLY1305_SHA256
,
526 HASH_SHA256
, PRF_UNDEFINED
,
527 AUTH_HMAC_SHA2_256_256
, ENCR_CHACHA20_POLY1305
, 32,
530 { TLS_AES_128_CCM_SHA256
,
532 HASH_SHA256
, PRF_UNDEFINED
,
533 AUTH_HMAC_SHA2_256_256
, ENCR_AES_CCM_ICV16
, 16,
536 { TLS_AES_128_CCM_8_SHA256
,
538 HASH_SHA256
, PRF_UNDEFINED
,
539 AUTH_HMAC_SHA2_256_256
, ENCR_AES_CCM_ICV8
, 16,
542 /* Legacy TLS cipher suites */
543 { TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384
,
544 KEY_ECDSA
, ECP_384_BIT
,
545 HASH_SHA384
, PRF_HMAC_SHA2_384
,
546 AUTH_UNDEFINED
, ENCR_AES_GCM_ICV16
, 32,
549 { TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384
,
550 KEY_ECDSA
, ECP_384_BIT
,
551 HASH_SHA384
, PRF_HMAC_SHA2_384
,
552 AUTH_HMAC_SHA2_384_384
, ENCR_AES_CBC
, 32,
555 { TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA
,
556 KEY_ECDSA
, ECP_384_BIT
,
557 HASH_SHA256
, PRF_HMAC_SHA2_256
,
558 AUTH_HMAC_SHA1_160
, ENCR_AES_CBC
, 32,
561 { TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256
,
562 KEY_ECDSA
, ECP_256_BIT
,
563 HASH_SHA256
, PRF_HMAC_SHA2_256
,
564 AUTH_UNDEFINED
, ENCR_AES_GCM_ICV16
, 16,
567 { TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256
,
568 KEY_ECDSA
, ECP_256_BIT
,
569 HASH_SHA256
, PRF_HMAC_SHA2_256
,
570 AUTH_HMAC_SHA2_256_256
, ENCR_AES_CBC
, 16,
573 { TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA
,
574 KEY_ECDSA
, ECP_256_BIT
,
575 HASH_SHA256
, PRF_HMAC_SHA2_256
,
576 AUTH_HMAC_SHA1_160
, ENCR_AES_CBC
, 16,
579 { TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384
,
580 KEY_RSA
, ECP_384_BIT
,
581 HASH_SHA384
, PRF_HMAC_SHA2_384
,
582 AUTH_UNDEFINED
, ENCR_AES_GCM_ICV16
, 32,
585 { TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384
,
586 KEY_RSA
, ECP_384_BIT
,
587 HASH_SHA384
, PRF_HMAC_SHA2_384
,
588 AUTH_HMAC_SHA2_384_384
, ENCR_AES_CBC
, 32,
591 { TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA
,
592 KEY_RSA
, ECP_384_BIT
,
593 HASH_SHA256
, PRF_HMAC_SHA2_256
,
594 AUTH_HMAC_SHA1_160
, ENCR_AES_CBC
, 32,
597 { TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256
,
598 KEY_RSA
, ECP_256_BIT
,
599 HASH_SHA256
, PRF_HMAC_SHA2_256
,
600 AUTH_UNDEFINED
, ENCR_AES_GCM_ICV16
, 16,
603 { TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256
,
604 KEY_RSA
, ECP_256_BIT
,
605 HASH_SHA256
, PRF_HMAC_SHA2_256
,
606 AUTH_HMAC_SHA2_256_256
, ENCR_AES_CBC
, 16,
609 { TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA
,
610 KEY_RSA
, ECP_256_BIT
,
611 HASH_SHA256
, PRF_HMAC_SHA2_256
,
612 AUTH_HMAC_SHA1_160
, ENCR_AES_CBC
, 16,
615 { TLS_DHE_RSA_WITH_AES_256_GCM_SHA384
,
616 KEY_RSA
, MODP_4096_BIT
,
617 HASH_SHA384
, PRF_HMAC_SHA2_384
,
618 AUTH_UNDEFINED
, ENCR_AES_GCM_ICV16
, 32,
621 { TLS_DHE_RSA_WITH_AES_256_CBC_SHA256
,
622 KEY_RSA
, MODP_4096_BIT
,
623 HASH_SHA256
, PRF_HMAC_SHA2_256
,
624 AUTH_HMAC_SHA2_256_256
, ENCR_AES_CBC
, 32,
627 { TLS_DHE_RSA_WITH_AES_256_CBC_SHA
,
628 KEY_RSA
, MODP_3072_BIT
,
629 HASH_SHA256
, PRF_HMAC_SHA2_256
,
630 AUTH_HMAC_SHA1_160
, ENCR_AES_CBC
, 32,
633 { TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA256
,
634 KEY_RSA
, MODP_4096_BIT
,
635 HASH_SHA256
, PRF_HMAC_SHA2_256
,
636 AUTH_HMAC_SHA2_256_256
, ENCR_CAMELLIA_CBC
, 32,
639 { TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA
,
640 KEY_RSA
, MODP_3072_BIT
,
641 HASH_SHA256
, PRF_HMAC_SHA2_256
,
642 AUTH_HMAC_SHA1_160
, ENCR_CAMELLIA_CBC
, 32,
645 { TLS_DHE_RSA_WITH_AES_128_GCM_SHA256
,
646 KEY_RSA
, MODP_3072_BIT
,
647 HASH_SHA256
, PRF_HMAC_SHA2_256
,
648 AUTH_UNDEFINED
, ENCR_AES_GCM_ICV16
, 16,
651 { TLS_DHE_RSA_WITH_AES_128_CBC_SHA256
,
652 KEY_RSA
, MODP_3072_BIT
,
653 HASH_SHA256
, PRF_HMAC_SHA2_256
,
654 AUTH_HMAC_SHA2_256_256
, ENCR_AES_CBC
, 16,
657 { TLS_DHE_RSA_WITH_AES_128_CBC_SHA
,
658 KEY_RSA
, MODP_2048_BIT
,
659 HASH_SHA256
,PRF_HMAC_SHA2_256
,
660 AUTH_HMAC_SHA1_160
, ENCR_AES_CBC
, 16,
663 { TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA256
,
664 KEY_RSA
, MODP_3072_BIT
,
665 HASH_SHA256
, PRF_HMAC_SHA2_256
,
666 AUTH_HMAC_SHA2_256_256
, ENCR_CAMELLIA_CBC
, 16,
669 { TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA
,
670 KEY_RSA
, MODP_2048_BIT
,
671 HASH_SHA256
, PRF_HMAC_SHA2_256
,
672 AUTH_HMAC_SHA1_160
, ENCR_CAMELLIA_CBC
, 16,
675 { TLS_RSA_WITH_AES_256_GCM_SHA384
,
677 HASH_SHA384
, PRF_HMAC_SHA2_384
,
678 AUTH_UNDEFINED
, ENCR_AES_GCM_ICV16
, 32,
681 { TLS_RSA_WITH_AES_256_CBC_SHA256
,
683 HASH_SHA256
, PRF_HMAC_SHA2_256
,
684 AUTH_HMAC_SHA2_256_256
, ENCR_AES_CBC
, 32,
687 { TLS_RSA_WITH_AES_256_CBC_SHA
,
689 HASH_SHA256
, PRF_HMAC_SHA2_256
,
690 AUTH_HMAC_SHA1_160
, ENCR_AES_CBC
, 32,
693 { TLS_RSA_WITH_AES_128_GCM_SHA256
,
695 HASH_SHA256
, PRF_HMAC_SHA2_256
,
696 AUTH_UNDEFINED
, ENCR_AES_GCM_ICV16
, 16,
699 { TLS_RSA_WITH_AES_128_CBC_SHA256
,
701 HASH_SHA256
, PRF_HMAC_SHA2_256
,
702 AUTH_HMAC_SHA2_256_256
, ENCR_AES_CBC
, 16,
705 { TLS_RSA_WITH_AES_128_CBC_SHA
,
707 HASH_SHA256
, PRF_HMAC_SHA2_256
,
708 AUTH_HMAC_SHA1_160
, ENCR_AES_CBC
, 16,
711 { TLS_RSA_WITH_CAMELLIA_256_CBC_SHA256
,
713 HASH_SHA256
, PRF_HMAC_SHA2_256
,
714 AUTH_HMAC_SHA2_256_256
, ENCR_CAMELLIA_CBC
, 32,
717 { TLS_RSA_WITH_CAMELLIA_256_CBC_SHA
,
719 HASH_SHA256
, PRF_HMAC_SHA2_256
,
720 AUTH_HMAC_SHA1_160
, ENCR_CAMELLIA_CBC
, 32,
723 { TLS_RSA_WITH_CAMELLIA_128_CBC_SHA256
,
725 HASH_SHA256
, PRF_HMAC_SHA2_256
,
726 AUTH_HMAC_SHA2_256_256
, ENCR_CAMELLIA_CBC
, 16,
729 { TLS_RSA_WITH_CAMELLIA_128_CBC_SHA
,
731 HASH_SHA256
, PRF_HMAC_SHA2_256
,
732 AUTH_HMAC_SHA1_160
, ENCR_CAMELLIA_CBC
, 16,
735 { TLS_ECDHE_ECDSA_WITH_NULL_SHA
,
736 KEY_ECDSA
, ECP_256_BIT
,
737 HASH_SHA256
, PRF_HMAC_SHA2_256
,
738 AUTH_HMAC_SHA1_160
, ENCR_NULL
, 0,
741 { TLS_ECDHE_RSA_WITH_NULL_SHA
,
742 KEY_ECDSA
, ECP_256_BIT
,
743 HASH_SHA256
, PRF_HMAC_SHA2_256
,
744 AUTH_HMAC_SHA1_160
, ENCR_NULL
, 0,
747 { TLS_RSA_WITH_NULL_SHA256
,
749 HASH_SHA256
, PRF_HMAC_SHA2_256
,
750 AUTH_HMAC_SHA2_256_256
, ENCR_NULL
, 0,
753 { TLS_RSA_WITH_NULL_SHA
,
755 HASH_SHA256
, PRF_HMAC_SHA2_256
,
756 AUTH_HMAC_SHA1_160
, ENCR_NULL
, 0,
762 * Look up algorithms by a suite
764 static suite_algs_t
*find_suite(tls_cipher_suite_t suite
)
768 for (i
= 0; i
< countof(suite_algs
); i
++)
770 if (suite_algs
[i
].suite
== suite
)
772 return &suite_algs
[i
];
779 * Filter a suite list using a transform enumerator
781 static void filter_suite(suite_algs_t suites
[], int *count
, int offset
,
782 enumerator_t
*(*create_enumerator
)(crypto_factory_t
*))
784 const char *plugin_name
;
785 suite_algs_t current
;
786 int *current_alg
, i
, remaining
= 0;
787 enumerator_t
*enumerator
;
789 memset(¤t
, 0, sizeof(current
));
790 current_alg
= (int*)((char*)¤t
+ offset
);
792 for (i
= 0; i
< *count
; i
++)
794 if (create_enumerator
== lib
->crypto
->create_crypter_enumerator
&&
795 encryption_algorithm_is_aead(suites
[i
].encr
))
796 { /* filtering crypters, but current suite uses an AEAD, apply */
797 suites
[remaining
] = suites
[i
];
801 if (create_enumerator
== lib
->crypto
->create_aead_enumerator
&&
802 !encryption_algorithm_is_aead(suites
[i
].encr
))
803 { /* filtering AEADs, but current suite doesn't use one, apply */
804 suites
[remaining
] = suites
[i
];
808 enumerator
= create_enumerator(lib
->crypto
);
809 while (enumerator
->enumerate(enumerator
, current_alg
, &plugin_name
))
811 if (current
.encr
&& current
.encr
!= suites
[i
].encr
)
813 if (suites
[i
].encr
!= ENCR_NULL
)
814 { /* skip, ENCR does not match nor is NULL */
818 if (current
.mac
&& current
.mac
!= suites
[i
].mac
)
820 if (suites
[i
].mac
!= AUTH_UNDEFINED
)
821 { /* skip, MAC does not match nor is it undefined */
825 if (current
.prf
&& current
.prf
!= suites
[i
].prf
)
827 if (suites
[i
].prf
!= PRF_UNDEFINED
)
829 /* skip, PRF does not match nor is it undefined */
833 if (current
.hash
&& current
.hash
!= suites
[i
].hash
)
834 { /* skip, hash does not match */
837 if (current
.dh
&& current
.dh
!= suites
[i
].dh
)
839 if (suites
[i
].dh
!= MODP_NONE
)
840 { /* skip DH group, does not match nor NONE */
844 /* suite supported, apply */
845 suites
[remaining
] = suites
[i
];
849 enumerator
->destroy(enumerator
);
855 * Purge NULL encryption cipher suites from list
857 static void filter_null_suites(suite_algs_t suites
[], int *count
)
859 int i
, remaining
= 0;
861 for (i
= 0; i
< *count
; i
++)
863 if (suites
[i
].encr
!= ENCR_NULL
)
865 suites
[remaining
] = suites
[i
];
873 * Purge suites using a given key type
875 static void filter_key_suites(private_tls_crypto_t
*this,
876 suite_algs_t suites
[], int *count
, key_type_t key
)
878 int i
, remaining
= 0;
880 DBG2(DBG_TLS
, "disabling %N suites, no backend found", key_type_names
, key
);
881 for (i
= 0; i
< *count
; i
++)
883 if (suites
[i
].key
!= key
)
885 suites
[remaining
] = suites
[i
];
893 * Filter suites by key exchange user config
895 static void filter_key_exchange_config_suites(private_tls_crypto_t
*this,
896 suite_algs_t suites
[], int *count
)
898 enumerator_t
*enumerator
;
899 int i
, remaining
= 0;
900 char *token
, *config
;
902 config
= lib
->settings
->get_str(lib
->settings
, "%s.tls.key_exchange", NULL
,
906 for (i
= 0; i
< *count
; i
++)
908 enumerator
= enumerator_create_token(config
, ",", " ");
909 while (enumerator
->enumerate(enumerator
, &token
))
911 if (strcaseeq(token
, "ecdhe-ecdsa") &&
912 diffie_hellman_group_is_ec(suites
[i
].dh
) &&
913 suites
[i
].key
== KEY_ECDSA
)
915 suites
[remaining
++] = suites
[i
];
918 if (strcaseeq(token
, "ecdhe-rsa") &&
919 diffie_hellman_group_is_ec(suites
[i
].dh
) &&
920 suites
[i
].key
== KEY_RSA
)
922 suites
[remaining
++] = suites
[i
];
925 if (strcaseeq(token
, "dhe-rsa") &&
926 !diffie_hellman_group_is_ec(suites
[i
].dh
) &&
927 suites
[i
].dh
!= MODP_NONE
&&
928 suites
[i
].key
== KEY_RSA
)
930 suites
[remaining
++] = suites
[i
];
933 if (strcaseeq(token
, "rsa") &&
934 suites
[i
].dh
== MODP_NONE
&&
935 suites
[i
].key
== KEY_RSA
)
937 suites
[remaining
++] = suites
[i
];
941 enumerator
->destroy(enumerator
);
948 * Filter suites by cipher user config
950 static void filter_cipher_config_suites(private_tls_crypto_t
*this,
951 suite_algs_t suites
[], int *count
)
953 enumerator_t
*enumerator
;
954 int i
, remaining
= 0;
955 char *token
, *config
;
957 config
= lib
->settings
->get_str(lib
->settings
, "%s.tls.cipher", NULL
,
961 for (i
= 0; i
< *count
; i
++)
963 enumerator
= enumerator_create_token(config
, ",", " ");
964 while (enumerator
->enumerate(enumerator
, &token
))
966 if (strcaseeq(token
, "aes128") &&
967 suites
[i
].encr
== ENCR_AES_CBC
&&
968 suites
[i
].encr_size
== 16)
970 suites
[remaining
++] = suites
[i
];
973 if (strcaseeq(token
, "aes256") &&
974 suites
[i
].encr
== ENCR_AES_CBC
&&
975 suites
[i
].encr_size
== 32)
977 suites
[remaining
++] = suites
[i
];
980 if (strcaseeq(token
, "aes128gcm") &&
981 suites
[i
].encr
== ENCR_AES_GCM_ICV16
&&
982 suites
[i
].encr_size
== 16)
984 suites
[remaining
++] = suites
[i
];
987 if (strcaseeq(token
, "aes256gcm") &&
988 suites
[i
].encr
== ENCR_AES_GCM_ICV16
&&
989 suites
[i
].encr_size
== 32)
991 suites
[remaining
++] = suites
[i
];
994 if (strcaseeq(token
, "camellia128") &&
995 suites
[i
].encr
== ENCR_CAMELLIA_CBC
&&
996 suites
[i
].encr_size
== 16)
998 suites
[remaining
++] = suites
[i
];
1001 if (strcaseeq(token
, "camellia256") &&
1002 suites
[i
].encr
== ENCR_CAMELLIA_CBC
&&
1003 suites
[i
].encr_size
== 32)
1005 suites
[remaining
++] = suites
[i
];
1008 if (strcaseeq(token
, "null") &&
1009 suites
[i
].encr
== ENCR_NULL
)
1011 suites
[remaining
++] = suites
[i
];
1015 enumerator
->destroy(enumerator
);
1022 * Filter suites by mac user config
1024 static void filter_mac_config_suites(private_tls_crypto_t
*this,
1025 suite_algs_t suites
[], int *count
)
1027 enumerator_t
*enumerator
;
1028 int i
, remaining
= 0;
1029 char *token
, *config
;
1031 config
= lib
->settings
->get_str(lib
->settings
, "%s.tls.mac", NULL
,
1035 for (i
= 0; i
< *count
; i
++)
1037 enumerator
= enumerator_create_token(config
, ",", " ");
1038 while (enumerator
->enumerate(enumerator
, &token
))
1040 if (strcaseeq(token
, "sha1") &&
1041 suites
[i
].mac
== AUTH_HMAC_SHA1_160
)
1043 suites
[remaining
++] = suites
[i
];
1046 if (strcaseeq(token
, "sha256") &&
1047 suites
[i
].mac
== AUTH_HMAC_SHA2_256_256
)
1049 suites
[remaining
++] = suites
[i
];
1052 if (strcaseeq(token
, "sha384") &&
1053 suites
[i
].mac
== AUTH_HMAC_SHA2_384_384
)
1055 suites
[remaining
++] = suites
[i
];
1059 enumerator
->destroy(enumerator
);
1066 * Filter for specific suites specified in strongswan.conf
1068 static void filter_specific_config_suites(private_tls_crypto_t
*this,
1069 suite_algs_t suites
[], int *count
)
1071 enumerator_t
*enumerator
;
1072 int i
, remaining
= 0, suite
;
1073 char *token
, *config
;
1075 config
= lib
->settings
->get_str(lib
->settings
, "%s.tls.suites", NULL
,
1079 for (i
= 0; i
< *count
; i
++)
1081 enumerator
= enumerator_create_token(config
, ",", " ");
1082 while (enumerator
->enumerate(enumerator
, &token
))
1084 if (enum_from_name(tls_cipher_suite_names
, token
, &suite
) &&
1085 suite
== suites
[i
].suite
)
1087 suites
[remaining
++] = suites
[i
];
1091 enumerator
->destroy(enumerator
);
1098 * Filter key exchange curves by curve user config
1100 static bool filter_curve_config(tls_named_group_t curve
)
1102 enumerator_t
*enumerator
;
1103 char *token
, *config
;
1105 config
= lib
->settings
->get_str(lib
->settings
, "%s.tls.curve", NULL
, lib
->ns
);
1108 enumerator
= enumerator_create_token(config
, ",", " ");
1109 while (enumerator
->enumerate(enumerator
, &token
))
1111 const proposal_token_t
*tok
;
1113 tok
= lib
->proposal
->get_token(lib
->proposal
, token
);
1114 if (tok
!= NULL
&& tok
->type
== DIFFIE_HELLMAN_GROUP
&&
1115 curve
== tls_ec_group_to_curve(tok
->algorithm
))
1117 enumerator
->destroy(enumerator
);
1121 enumerator
->destroy(enumerator
);
1127 * Filter out unsupported suites on given suite array
1129 static void filter_unsupported_suites(suite_algs_t suites
[], int *count
)
1131 /* filter suite list by each algorithm */
1132 filter_suite(suites
, count
, offsetof(suite_algs_t
, encr
),
1133 lib
->crypto
->create_aead_enumerator
);
1134 filter_suite(suites
, count
, offsetof(suite_algs_t
, prf
),
1135 lib
->crypto
->create_prf_enumerator
);
1136 filter_suite(suites
, count
, offsetof(suite_algs_t
, encr
),
1137 lib
->crypto
->create_crypter_enumerator
);
1138 filter_suite(suites
, count
, offsetof(suite_algs_t
, mac
),
1139 lib
->crypto
->create_signer_enumerator
);
1140 filter_suite(suites
, count
, offsetof(suite_algs_t
, hash
),
1141 lib
->crypto
->create_hasher_enumerator
);
1142 filter_suite(suites
, count
, offsetof(suite_algs_t
, dh
),
1143 lib
->crypto
->create_dh_enumerator
);
1147 * Initialize the cipher suite list
1149 static void build_cipher_suite_list(private_tls_crypto_t
*this)
1151 suite_algs_t suites
[countof(suite_algs
)];
1152 tls_version_t min_version
, max_version
, new_min_version
, new_max_version
;
1153 bool require_encryption
;
1156 switch (this->tls
->get_purpose(this->tls
))
1158 case TLS_PURPOSE_EAP_TLS
:
1159 case TLS_PURPOSE_GENERIC_NULLOK
:
1160 require_encryption
= FALSE
;
1162 case TLS_PURPOSE_EAP_PEAP
:
1163 case TLS_PURPOSE_EAP_TTLS
:
1164 case TLS_PURPOSE_GENERIC
:
1165 require_encryption
= TRUE
;
1171 min_version
= this->tls
->get_version_min(this->tls
);
1172 max_version
= this->tls
->get_version_max(this->tls
);
1174 /* copy all suites appropriate for the current min/max versions */
1175 for (i
= 0; i
< countof(suite_algs
); i
++)
1177 if (suite_algs
[i
].min_version
<= max_version
&&
1178 suite_algs
[i
].max_version
>= min_version
)
1180 suites
[count
++] = suite_algs
[i
];
1184 if (require_encryption
)
1186 filter_null_suites(suites
, &count
);
1190 filter_key_suites(this, suites
, &count
, KEY_RSA
);
1194 filter_key_suites(this, suites
, &count
, KEY_ECDSA
);
1197 filter_unsupported_suites(suites
, &count
);
1199 /* filter suites with strongswan.conf options */
1200 filter_key_exchange_config_suites(this, suites
, &count
);
1201 filter_cipher_config_suites(this, suites
, &count
);
1202 filter_mac_config_suites(this, suites
, &count
);
1203 filter_specific_config_suites(this, suites
, &count
);
1206 this->suite_count
= count
;
1207 this->suites
= malloc(sizeof(tls_cipher_suite_t
) * count
);
1209 DBG2(DBG_TLS
, "%d supported TLS cipher suites:", count
);
1210 new_min_version
= max_version
;
1211 new_max_version
= min_version
;
1212 for (i
= 0; i
< count
; i
++)
1214 DBG2(DBG_TLS
, " %N", tls_cipher_suite_names
, suites
[i
].suite
);
1215 this->suites
[i
] = suites
[i
].suite
;
1217 /* set TLS min/max versions appropriate to the final cipher suites */
1218 new_max_version
= max(new_max_version
, suites
[i
].max_version
);
1219 new_min_version
= min(new_min_version
, suites
[i
].min_version
);
1221 new_max_version
= min(new_max_version
, max_version
);
1222 new_min_version
= max(new_min_version
, min_version
);
1224 if (min_version
!= new_min_version
|| max_version
!= new_max_version
)
1226 this->tls
->set_version(this->tls
, new_min_version
, new_max_version
);
1227 DBG2(DBG_TLS
, "TLS min/max %N/%N according to the cipher suites",
1228 tls_version_names
, new_min_version
,
1229 tls_version_names
, new_max_version
);
1233 METHOD(tls_crypto_t
, get_cipher_suites
, int,
1234 private_tls_crypto_t
*this, tls_cipher_suite_t
**suites
)
1238 build_cipher_suite_list(this);
1242 *suites
= this->suites
;
1244 return this->suite_count
;
1248 * Create NULL encryption transforms
1250 static bool create_null(private_tls_crypto_t
*this, suite_algs_t
*algs
)
1252 this->aead_in
= tls_aead_create_null(algs
->mac
);
1253 this->aead_out
= tls_aead_create_null(algs
->mac
);
1254 if (!this->aead_in
|| !this->aead_out
)
1256 DBG1(DBG_TLS
, "selected TLS MAC %N not supported",
1257 integrity_algorithm_names
, algs
->mac
);
1264 * Create traditional transforms
1266 static bool create_traditional(private_tls_crypto_t
*this, suite_algs_t
*algs
)
1268 if (this->tls
->get_version_max(this->tls
) < TLS_1_1
)
1270 this->aead_in
= tls_aead_create_implicit(algs
->mac
,
1271 algs
->encr
, algs
->encr_size
);
1272 this->aead_out
= tls_aead_create_implicit(algs
->mac
,
1273 algs
->encr
, algs
->encr_size
);
1277 this->aead_in
= tls_aead_create_explicit(algs
->mac
,
1278 algs
->encr
, algs
->encr_size
);
1279 this->aead_out
= tls_aead_create_explicit(algs
->mac
,
1280 algs
->encr
, algs
->encr_size
);
1282 if (!this->aead_in
|| !this->aead_out
)
1284 DBG1(DBG_TLS
, "selected TLS transforms %N-%u-%N not supported",
1285 encryption_algorithm_names
, algs
->encr
, algs
->encr_size
* 8,
1286 integrity_algorithm_names
, algs
->mac
);
1293 * Create AEAD transforms
1295 static bool create_aead(private_tls_crypto_t
*this, suite_algs_t
*algs
)
1297 if (this->tls
->get_version_max(this->tls
) < TLS_1_3
)
1299 this->aead_in
= tls_aead_create_aead(algs
->encr
, algs
->encr_size
);
1300 this->aead_out
= tls_aead_create_aead(algs
->encr
, algs
->encr_size
);
1304 this->aead_in
= tls_aead_create_seq(algs
->encr
, algs
->encr_size
);
1305 this->aead_out
= tls_aead_create_seq(algs
->encr
, algs
->encr_size
);
1307 if (!this->aead_in
|| !this->aead_out
)
1309 DBG1(DBG_TLS
, "selected TLS transforms %N-%u not supported",
1310 encryption_algorithm_names
, algs
->encr
, algs
->encr_size
* 8);
1317 * Clean up and unset AEAD transforms
1319 static void destroy_aeads(private_tls_crypto_t
*this)
1321 DESTROY_IF(this->aead_in
);
1322 DESTROY_IF(this->aead_out
);
1323 this->aead_in
= this->aead_out
= NULL
;
1327 * Create crypto primitives
1329 static bool create_ciphers(private_tls_crypto_t
*this, suite_algs_t
*algs
)
1331 destroy_aeads(this);
1332 DESTROY_IF(this->hkdf
);
1333 DESTROY_IF(this->prf
);
1334 if (this->tls
->get_version_max(this->tls
) < TLS_1_3
)
1336 if (this->tls
->get_version_max(this->tls
) < TLS_1_2
)
1338 this->prf
= tls_prf_create_10();
1342 this->prf
= tls_prf_create_12(algs
->prf
);
1346 DBG1(DBG_TLS
, "selected TLS PRF not supported");
1352 this->hkdf
= tls_hkdf_create(algs
->hash
, chunk_empty
);
1355 DBG1(DBG_TLS
, "TLS HKDF creation unsuccessful");
1359 if (algs
->encr
== ENCR_NULL
)
1361 if (create_null(this, algs
))
1366 else if (encryption_algorithm_is_aead(algs
->encr
))
1368 if (create_aead(this, algs
))
1375 if (create_traditional(this, algs
))
1380 destroy_aeads(this);
1384 METHOD(tls_crypto_t
, select_cipher_suite
, tls_cipher_suite_t
,
1385 private_tls_crypto_t
*this, tls_cipher_suite_t
*suites
, int count
,
1391 for (i
= 0; i
< this->suite_count
; i
++)
1393 for (j
= 0; j
< count
; j
++)
1395 if (this->suites
[i
] == suites
[j
])
1397 algs
= find_suite(this->suites
[i
]);
1400 if (key
== KEY_ANY
|| key
== algs
->key
||
1401 (algs
->key
== KEY_ECDSA
&& key
== KEY_ED25519
) ||
1402 (algs
->key
== KEY_ECDSA
&& key
== KEY_ED448
))
1404 if (create_ciphers(this, algs
))
1406 this->suite
= this->suites
[i
];
1417 METHOD(tls_crypto_t
, get_dh_group
, diffie_hellman_group_t
,
1418 private_tls_crypto_t
*this)
1422 algs
= find_suite(this->suite
);
1431 * Parameters for RSA/PSS signature schemes
1433 #define PSS_PARAMS(bits) static rsa_pss_params_t pss_params_sha##bits = { \
1434 .hash = HASH_SHA##bits, \
1435 .mgf1_hash = HASH_SHA##bits, \
1436 .salt_len = HASH_SIZE_SHA##bits, \
1444 * Map TLS signature schemes, ordered by preference
1447 tls_signature_scheme_t sig
;
1448 signature_params_t params
;
1449 /* min/max versions for use in CertificateVerify */
1450 tls_version_t min_version
;
1451 tls_version_t max_version
;
1453 { TLS_SIG_ECDSA_SHA256
, { .scheme
= SIGN_ECDSA_WITH_SHA256_DER
},
1455 { TLS_SIG_ECDSA_SHA384
, { .scheme
= SIGN_ECDSA_WITH_SHA384_DER
},
1457 { TLS_SIG_ECDSA_SHA512
, { .scheme
= SIGN_ECDSA_WITH_SHA512_DER
},
1459 { TLS_SIG_ED25519
, { .scheme
= SIGN_ED25519
},
1461 { TLS_SIG_ED448
, { .scheme
= SIGN_ED448
},
1463 { TLS_SIG_RSA_PSS_RSAE_SHA256
, { .scheme
= SIGN_RSA_EMSA_PSS
, .params
= &pss_params_sha256
, },
1465 { TLS_SIG_RSA_PSS_RSAE_SHA384
, { .scheme
= SIGN_RSA_EMSA_PSS
, .params
= &pss_params_sha384
, },
1467 { TLS_SIG_RSA_PSS_RSAE_SHA512
, { .scheme
= SIGN_RSA_EMSA_PSS
, .params
= &pss_params_sha512
, },
1469 /* the parameters for the next three should actually be taken from the
1470 * public key, we currently don't have an API for that, so assume defaults */
1471 { TLS_SIG_RSA_PSS_PSS_SHA256
, { .scheme
= SIGN_RSA_EMSA_PSS
, .params
= &pss_params_sha256
, },
1473 { TLS_SIG_RSA_PSS_PSS_SHA384
, { .scheme
= SIGN_RSA_EMSA_PSS
, .params
= &pss_params_sha384
, },
1475 { TLS_SIG_RSA_PSS_PSS_SHA512
, { .scheme
= SIGN_RSA_EMSA_PSS
, .params
= &pss_params_sha512
, },
1477 { TLS_SIG_RSA_PKCS1_SHA256
, { .scheme
= SIGN_RSA_EMSA_PKCS1_SHA2_256
},
1479 { TLS_SIG_RSA_PKCS1_SHA384
, { .scheme
= SIGN_RSA_EMSA_PKCS1_SHA2_384
},
1481 { TLS_SIG_RSA_PKCS1_SHA512
, { .scheme
= SIGN_RSA_EMSA_PKCS1_SHA2_512
},
1485 METHOD(tls_crypto_t
, get_signature_algorithms
, void,
1486 private_tls_crypto_t
*this, bio_writer_t
*writer
, bool cert
)
1488 bio_writer_t
*supported
;
1489 tls_version_t min_version
, max_version
;
1492 supported
= bio_writer_create(32);
1496 min_version
= this->tls
->get_version_min(this->tls
);
1497 max_version
= this->tls
->get_version_max(this->tls
);
1500 for (i
= 0; i
< countof(schemes
); i
++)
1502 if ((cert
|| (schemes
[i
].min_version
<= max_version
&&
1503 schemes
[i
].max_version
>= min_version
)) &&
1504 lib
->plugins
->has_feature(lib
->plugins
,
1505 PLUGIN_PROVIDE(PUBKEY_VERIFY
, schemes
[i
].params
.scheme
)))
1507 supported
->write_uint16(supported
, schemes
[i
].sig
);
1511 writer
->write_data16(writer
, supported
->get_buf(supported
));
1512 supported
->destroy(supported
);
1516 * Get the signature parameters from a TLS signature scheme
1518 static signature_params_t
*params_for_scheme(tls_signature_scheme_t sig
,
1523 for (i
= 0; i
< countof(schemes
); i
++)
1525 /* strongSwan supports only RSA_PSS_RSAE schemes for signing but can
1526 * verify public keys in rsaEncryption as well as rsassaPss encoding. */
1527 if (sign
&& (sig
== TLS_SIG_RSA_PSS_PSS_SHA256
||
1528 sig
== TLS_SIG_RSA_PSS_PSS_SHA384
||
1529 sig
== TLS_SIG_RSA_PSS_PSS_SHA512
))
1533 if (schemes
[i
].sig
== sig
)
1535 return &schemes
[i
].params
;
1542 * Mapping groups to TLS named curves
1545 diffie_hellman_group_t group
;
1546 tls_named_group_t curve
;
1548 { ECP_256_BIT
, TLS_SECP256R1
},
1549 { ECP_384_BIT
, TLS_SECP384R1
},
1550 { ECP_521_BIT
, TLS_SECP521R1
},
1551 { ECP_224_BIT
, TLS_SECP224R1
},
1552 { ECP_192_BIT
, TLS_SECP192R1
},
1553 { CURVE_25519
, TLS_CURVE25519
},
1554 { CURVE_448
, TLS_CURVE448
},
1557 CALLBACK(group_filter
, bool,
1558 void *null
, enumerator_t
*orig
, va_list args
)
1560 diffie_hellman_group_t group
, *group_out
;
1561 tls_named_group_t curve
, *curve_out
;
1564 VA_ARGS_VGET(args
, group_out
, curve_out
);
1566 while (orig
->enumerate(orig
, &group
, &plugin
))
1568 curve
= tls_ec_group_to_curve(group
);
1585 CALLBACK(config_filter
, bool,
1586 void *null
, enumerator_t
*orig
, va_list args
)
1588 diffie_hellman_group_t group
, *group_out
;
1589 tls_named_group_t curve
, *curve_out
;
1591 VA_ARGS_VGET(args
, group_out
, curve_out
);
1593 while (orig
->enumerate(orig
, &group
, &curve
))
1595 if (filter_curve_config(curve
))
1611 METHOD(tls_crypto_t
, create_ec_enumerator
, enumerator_t
*,
1612 private_tls_crypto_t
*this)
1614 return enumerator_create_filter(
1615 enumerator_create_filter(
1616 lib
->crypto
->create_dh_enumerator(lib
->crypto
),
1617 group_filter
, NULL
, NULL
),
1618 config_filter
, NULL
, NULL
);
1621 METHOD(tls_crypto_t
, set_protection
, void,
1622 private_tls_crypto_t
*this, tls_protection_t
*protection
)
1624 this->protection
= protection
;
1627 METHOD(tls_crypto_t
, append_handshake
, void,
1628 private_tls_crypto_t
*this, tls_handshake_type_t type
, chunk_t data
)
1632 /* reconstruct handshake header */
1633 header
= htonl(data
.len
| (type
<< 24));
1634 this->handshake
= chunk_cat("mcc", this->handshake
,
1635 chunk_from_thing(header
), data
);
1639 * Create a hash using the suites HASH algorithm
1641 static bool hash_data(private_tls_crypto_t
*this, chunk_t data
, chunk_t
*hash
)
1643 if (this->tls
->get_version_max(this->tls
) >= TLS_1_2
)
1648 alg
= find_suite(this->suite
);
1653 hasher
= lib
->crypto
->create_hasher(lib
->crypto
, alg
->hash
);
1654 if (!hasher
|| !hasher
->allocate_hash(hasher
, data
, hash
))
1656 DBG1(DBG_TLS
, "%N not supported", hash_algorithm_names
, alg
->hash
);
1660 hasher
->destroy(hasher
);
1664 hasher_t
*md5
, *sha1
;
1665 char buf
[HASH_SIZE_MD5
+ HASH_SIZE_SHA1
];
1667 md5
= lib
->crypto
->create_hasher(lib
->crypto
, HASH_MD5
);
1668 if (!md5
|| !md5
->get_hash(md5
, data
, buf
))
1670 DBG1(DBG_TLS
, "%N not supported", hash_algorithm_names
, HASH_MD5
);
1675 sha1
= lib
->crypto
->create_hasher(lib
->crypto
, HASH_SHA1
);
1676 if (!sha1
|| !sha1
->get_hash(sha1
, data
, buf
+ HASH_SIZE_MD5
))
1678 DBG1(DBG_TLS
, "%N not supported", hash_algorithm_names
, HASH_SHA1
);
1682 sha1
->destroy(sha1
);
1684 *hash
= chunk_clone(chunk_from_thing(buf
));
1689 METHOD(tls_crypto_t
, hash_handshake
, bool,
1690 private_tls_crypto_t
*this, chunk_t
*out
)
1694 if (!hash_data(this, this->handshake
, &hash
))
1699 chunk_free(&this->handshake
);
1700 append_handshake(this, TLS_MESSAGE_HASH
, hash
);
1714 * TLS 1.3 static part of the data the server signs (64 spaces followed by the
1715 * context string "TLS 1.3, server CertificateVerify" and a 0 byte).
1717 static chunk_t tls13_sig_data_server
= chunk_from_chars(
1718 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
1719 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
1720 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
1721 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
1722 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
1723 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
1724 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
1725 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
1726 0x54, 0x4c, 0x53, 0x20, 0x31, 0x2e, 0x33, 0x2c,
1727 0x20, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x20,
1728 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63,
1729 0x61, 0x74, 0x65, 0x56, 0x65, 0x72, 0x69, 0x66,
1734 * TLS 1.3 static part of the data the peer signs (64 spaces followed by the
1735 * context string "TLS 1.3, client CertificateVerify" and a 0 byte).
1737 static chunk_t tls13_sig_data_client
= chunk_from_chars(
1738 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
1739 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
1740 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
1741 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
1742 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
1743 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
1744 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
1745 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
1746 0x54, 0x4c, 0x53, 0x20, 0x31, 0x2e, 0x33, 0x2c,
1747 0x20, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x20,
1748 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63,
1749 0x61, 0x74, 0x65, 0x56, 0x65, 0x72, 0x69, 0x66,
1753 METHOD(tls_crypto_t
, sign
, bool,
1754 private_tls_crypto_t
*this, private_key_t
*key
, bio_writer_t
*writer
,
1755 chunk_t data
, chunk_t hashsig
)
1757 if (this->tls
->get_version_max(this->tls
) >= TLS_1_2
)
1759 /* fallback to SHA1/RSA and SHA1/ECDSA */
1760 const chunk_t hashsig_def
= chunk_from_chars(0x02, 0x01, 0x02, 0x03);
1761 signature_params_t
*params
;
1764 bio_reader_t
*reader
;
1768 if (this->tls
->get_version_max(this->tls
) >= TLS_1_3
)
1770 chunk_t transcript_hash
;
1772 if (!hash_data(this, data
, &transcript_hash
))
1774 DBG1(DBG_TLS
, "unable to create transcript hash");
1777 data
= chunk_cata("cm", tls13_sig_data_server
, transcript_hash
);
1781 { /* fallback if none given */
1782 hashsig
= hashsig_def
;
1784 type
= key
->get_type(key
);
1785 reader
= bio_reader_create(hashsig
);
1786 while (reader
->remaining(reader
) >= 2)
1788 if (reader
->read_uint16(reader
, &scheme
))
1790 params
= params_for_scheme(scheme
, TRUE
);
1792 type
== key_type_from_signature_scheme(params
->scheme
) &&
1793 key
->sign(key
, params
->scheme
, params
->params
, data
, &sig
))
1800 reader
->destroy(reader
);
1803 DBG1(DBG_TLS
, "none of the proposed hash/sig algorithms supported");
1806 DBG2(DBG_TLS
, "created signature with %N", tls_signature_scheme_names
,
1808 writer
->write_uint16(writer
, scheme
);
1809 writer
->write_data16(writer
, sig
);
1817 switch (key
->get_type(key
))
1820 if (!hash_data(this, data
, &hash
))
1824 done
= key
->sign(key
, SIGN_RSA_EMSA_PKCS1_NULL
, NULL
, hash
,
1831 DBG2(DBG_TLS
, "created signature with MD5+SHA1/RSA");
1834 if (!key
->sign(key
, SIGN_ECDSA_WITH_SHA1_DER
, NULL
, data
, &sig
))
1838 DBG2(DBG_TLS
, "created signature with SHA1/ECDSA");
1841 if (!key
->sign(key
, SIGN_ED25519
, NULL
, data
, &sig
))
1845 DBG2(DBG_TLS
, "created signature with Ed25519");
1848 if (!key
->sign(key
, SIGN_ED448
, NULL
, data
, &sig
))
1852 DBG2(DBG_TLS
, "created signature with Ed448");
1857 writer
->write_data16(writer
, sig
);
1863 METHOD(tls_crypto_t
, verify
, bool,
1864 private_tls_crypto_t
*this, public_key_t
*key
, bio_reader_t
*reader
,
1867 if (this->tls
->get_version_max(this->tls
) >= TLS_1_2
)
1869 signature_params_t
*params
;
1873 if (!reader
->read_uint16(reader
, &scheme
) ||
1874 !reader
->read_data16(reader
, &sig
))
1876 DBG1(DBG_TLS
, "received invalid signature");
1879 params
= params_for_scheme(scheme
, FALSE
);
1882 DBG1(DBG_TLS
, "signature algorithms %N not supported",
1883 tls_signature_scheme_names
, scheme
);
1886 if (this->tls
->get_version_max(this->tls
) == TLS_1_3
)
1888 chunk_t transcript_hash
;
1890 if (!hash_data(this, data
, &transcript_hash
))
1892 DBG1(DBG_TLS
, "Unable to create transcript hash");
1896 if (this->tls
->is_server(this->tls
))
1898 data
= chunk_cata("cm", tls13_sig_data_client
, transcript_hash
);
1902 data
= chunk_cata("cm", tls13_sig_data_server
, transcript_hash
);
1905 if (!key
->verify(key
, params
->scheme
, params
->params
, data
, sig
))
1907 DBG1(DBG_TLS
, "signature verification with %N failed",
1908 tls_signature_scheme_names
, scheme
);
1911 DBG2(DBG_TLS
, "verified signature with %N",
1912 tls_signature_scheme_names
, scheme
);
1919 if (!reader
->read_data16(reader
, &sig
))
1921 DBG1(DBG_TLS
, "received invalid signature");
1924 switch (key
->get_type(key
))
1927 if (!hash_data(this, data
, &hash
))
1931 done
= key
->verify(key
, SIGN_RSA_EMSA_PKCS1_NULL
, NULL
, hash
,
1938 DBG2(DBG_TLS
, "verified signature data with MD5+SHA1/RSA");
1941 if (!key
->verify(key
, SIGN_ECDSA_WITH_SHA1_DER
, NULL
, data
,
1946 DBG2(DBG_TLS
, "verified signature with SHA1/ECDSA");
1949 if (!key
->verify(key
, SIGN_ED25519
, NULL
, data
, sig
))
1953 DBG2(DBG_TLS
, "verified signature with Ed25519");
1956 if (!key
->verify(key
, SIGN_ED448
, NULL
, data
, sig
))
1960 DBG2(DBG_TLS
, "verified signature with Ed448");
1969 METHOD(tls_crypto_t
, sign_handshake
, bool,
1970 private_tls_crypto_t
*this, private_key_t
*key
, bio_writer_t
*writer
,
1973 return sign(this, key
, writer
, this->handshake
, hashsig
);
1976 METHOD(tls_crypto_t
, verify_handshake
, bool,
1977 private_tls_crypto_t
*this, public_key_t
*key
, bio_reader_t
*reader
)
1979 return verify(this, key
, reader
, this->handshake
);
1982 METHOD(tls_crypto_t
, calculate_finished_legacy
, bool,
1983 private_tls_crypto_t
*this, char *label
, char out
[12])
1991 if (!hash_data(this, this->handshake
, &seed
))
1995 if (!this->prf
->get_bytes(this->prf
, label
, seed
, 12, out
))
2004 METHOD(tls_crypto_t
, calculate_finished
, bool,
2005 private_tls_crypto_t
*this, bool server
, chunk_t
*out
)
2007 chunk_t finished_key
, finished_hash
;
2013 if (!hash_data(this, this->handshake
, &finished_hash
))
2015 DBG1(DBG_TLS
, "creating hash of handshake failed");
2018 if (!this->hkdf
->derive_finished(this->hkdf
, server
, &finished_key
))
2020 DBG1(DBG_TLS
, "generating finished key failed");
2021 chunk_clear(&finished_hash
);
2024 if (!this->hkdf
->allocate_bytes(this->hkdf
, finished_key
, finished_hash
, out
))
2026 DBG1(DBG_TLS
, "generating finished HMAC failed");
2027 chunk_clear(&finished_key
);
2028 chunk_clear(&finished_hash
);
2031 chunk_clear(&finished_key
);
2032 chunk_clear(&finished_hash
);
2037 * Derive master secret from premaster, optionally save session
2039 static bool derive_master(private_tls_crypto_t
*this, chunk_t premaster
,
2040 chunk_t session
, identification_t
*id
,
2041 chunk_t client_random
, chunk_t server_random
)
2046 /* derive master secret */
2047 seed
= chunk_cata("cc", client_random
, server_random
);
2049 if (!this->prf
->set_key(this->prf
, premaster
) ||
2050 !this->prf
->get_bytes(this->prf
, "master secret", seed
,
2051 sizeof(master
), master
) ||
2052 !this->prf
->set_key(this->prf
, chunk_from_thing(master
)))
2057 if (this->cache
&& session
.len
)
2059 this->cache
->create(this->cache
, session
, id
, chunk_from_thing(master
),
2062 memwipe(master
, sizeof(master
));
2067 * Expand key material from master secret
2069 static bool expand_keys(private_tls_crypto_t
*this,
2070 chunk_t client_random
, chunk_t server_random
)
2072 chunk_t seed
, block
;
2073 chunk_t cw_mac
, cw
, cw_iv
;
2074 chunk_t sw_mac
, sw
, sw_iv
;
2075 int mklen
, eklen
, ivlen
;
2077 if (!this->aead_in
|| !this->aead_out
)
2082 /* derive key block for key expansion */
2083 mklen
= this->aead_in
->get_mac_key_size(this->aead_in
);
2084 eklen
= this->aead_in
->get_encr_key_size(this->aead_in
);
2085 ivlen
= this->aead_in
->get_iv_size(this->aead_in
);
2086 seed
= chunk_cata("cc", server_random
, client_random
);
2087 block
= chunk_alloca((mklen
+ eklen
+ ivlen
) * 2);
2088 if (!this->prf
->get_bytes(this->prf
, "key expansion", seed
,
2089 block
.len
, block
.ptr
))
2094 /* client/server write signer keys */
2095 cw_mac
= chunk_create(block
.ptr
, mklen
);
2096 block
= chunk_skip(block
, mklen
);
2097 sw_mac
= chunk_create(block
.ptr
, mklen
);
2098 block
= chunk_skip(block
, mklen
);
2100 /* client/server write encryption keys */
2101 cw
= chunk_create(block
.ptr
, eklen
);
2102 block
= chunk_skip(block
, eklen
);
2103 sw
= chunk_create(block
.ptr
, eklen
);
2104 block
= chunk_skip(block
, eklen
);
2106 /* client/server write IV; TLS 1.0 implicit IVs or AEAD salt, if any */
2107 cw_iv
= chunk_create(block
.ptr
, ivlen
);
2108 block
= chunk_skip(block
, ivlen
);
2109 sw_iv
= chunk_create(block
.ptr
, ivlen
);
2110 block
= chunk_skip(block
, ivlen
);
2112 if (this->tls
->is_server(this->tls
))
2114 if (!this->aead_in
->set_keys(this->aead_in
, cw_mac
, cw
, cw_iv
) ||
2115 !this->aead_out
->set_keys(this->aead_out
, sw_mac
, sw
, sw_iv
))
2122 if (!this->aead_out
->set_keys(this->aead_out
, cw_mac
, cw
, cw_iv
) ||
2123 !this->aead_in
->set_keys(this->aead_in
, sw_mac
, sw
, sw_iv
))
2130 if (this->msk_label
)
2132 seed
= chunk_cata("cc", client_random
, server_random
);
2133 this->msk
= chunk_alloc(64);
2134 if (!this->prf
->get_bytes(this->prf
, this->msk_label
, seed
,
2135 this->msk
.len
, this->msk
.ptr
))
2143 METHOD(tls_crypto_t
, derive_secrets
, bool,
2144 private_tls_crypto_t
*this, chunk_t premaster
, chunk_t session
,
2145 identification_t
*id
, chunk_t client_random
, chunk_t server_random
)
2147 return derive_master(this, premaster
, session
, id
,
2148 client_random
, server_random
) &&
2149 expand_keys(this, client_random
, server_random
);
2153 * Derive and configure the client/server key/IV on an AEAD using a given label.
2155 static bool derive_labeled_key(private_tls_crypto_t
*this, bool server
,
2156 tls_hkdf_label_t label
, tls_aead_t
*aead
)
2158 chunk_t key
= chunk_empty
, iv
= chunk_empty
;
2159 bool success
= FALSE
;
2161 if (!this->hkdf
->generate_secret(this->hkdf
, label
, this->handshake
,
2163 !this->hkdf
->derive_key(this->hkdf
, server
,
2164 aead
->get_encr_key_size(aead
), &key
) ||
2165 !this->hkdf
->derive_iv(this->hkdf
, server
,
2166 aead
->get_iv_size(aead
), &iv
))
2168 DBG1(DBG_TLS
, "deriving key material failed");
2172 if (!aead
->set_keys(aead
, chunk_empty
, key
, iv
))
2174 DBG1(DBG_TLS
, "setting AEAD key material failed");
2186 * Derive and configure the keys/IVs using the given labels.
2188 static bool derive_labeled_keys(private_tls_crypto_t
*this,
2189 tls_hkdf_label_t client_label
,
2190 tls_hkdf_label_t server_label
)
2192 tls_aead_t
*aead_c
, *aead_s
;
2195 algs
= find_suite(this->suite
);
2196 destroy_aeads(this);
2197 if (!create_aead(this, algs
))
2201 aead_c
= this->aead_out
;
2202 aead_s
= this->aead_in
;
2203 if (this->tls
->is_server(this->tls
))
2205 aead_c
= this->aead_in
;
2206 aead_s
= this->aead_out
;
2208 return derive_labeled_key(this, FALSE
, client_label
, aead_c
) &&
2209 derive_labeled_key(this, TRUE
, server_label
, aead_s
);
2212 METHOD(tls_crypto_t
, derive_handshake_keys
, bool,
2213 private_tls_crypto_t
*this, chunk_t shared_secret
)
2215 this->hkdf
->set_shared_secret(this->hkdf
, shared_secret
);
2216 return derive_labeled_keys(this, TLS_HKDF_C_HS_TRAFFIC
,
2217 TLS_HKDF_S_HS_TRAFFIC
);
2220 METHOD(tls_crypto_t
, derive_app_keys
, bool,
2221 private_tls_crypto_t
*this)
2223 if (!derive_labeled_keys(this, TLS_HKDF_C_AP_TRAFFIC
,
2224 TLS_HKDF_S_AP_TRAFFIC
))
2230 if (this->msk_label
)
2232 /* because the length is encoded when expanding key material, we
2233 * request the same number of bytes as FreeRADIUS (the first 64 for
2234 * the MSK, the next for the EMSK, which we just ignore) */
2235 if (!this->hkdf
->export(this->hkdf
, this->msk_label
, chunk_empty
,
2236 this->handshake
, 128, &this->msk
))
2245 METHOD(tls_crypto_t
, update_app_keys
, bool,
2246 private_tls_crypto_t
*this, bool inbound
)
2249 tls_hkdf_label_t label
= TLS_HKDF_UPD_C_TRAFFIC
;
2251 algs
= find_suite(this->suite
);
2252 destroy_aeads(this);
2253 if (!create_aead(this, algs
))
2257 if (this->tls
->is_server(this->tls
) != inbound
)
2259 label
= TLS_HKDF_UPD_S_TRAFFIC
;
2261 return derive_labeled_key(this, label
== TLS_HKDF_UPD_S_TRAFFIC
, label
,
2262 inbound ?
this->aead_in
: this->aead_out
);
2265 METHOD(tls_crypto_t
, resume_session
, tls_cipher_suite_t
,
2266 private_tls_crypto_t
*this, chunk_t session
, identification_t
*id
,
2267 chunk_t client_random
, chunk_t server_random
)
2271 if (this->cache
&& session
.len
)
2273 this->suite
= this->cache
->lookup(this->cache
, session
, id
, &master
);
2276 this->suite
= select_cipher_suite(this, &this->suite
, 1, KEY_ANY
);
2279 if (!this->prf
->set_key(this->prf
, master
) ||
2280 !expand_keys(this, client_random
, server_random
))
2285 chunk_clear(&master
);
2292 METHOD(tls_crypto_t
, get_session
, chunk_t
,
2293 private_tls_crypto_t
*this, identification_t
*server
)
2297 return this->cache
->check(this->cache
, server
);
2302 METHOD(tls_crypto_t
, change_cipher
, void,
2303 private_tls_crypto_t
*this, bool inbound
)
2305 if (this->protection
)
2309 this->protection
->set_cipher(this->protection
, TRUE
, this->aead_in
);
2310 this->aead_in
= NULL
;
2314 this->protection
->set_cipher(this->protection
, FALSE
, this->aead_out
);
2315 this->aead_out
= NULL
;
2320 METHOD(tls_crypto_t
, get_eap_msk
, chunk_t
,
2321 private_tls_crypto_t
*this)
2326 METHOD(tls_crypto_t
, destroy
, void,
2327 private_tls_crypto_t
*this)
2329 destroy_aeads(this);
2330 free(this->handshake
.ptr
);
2331 free(this->msk
.ptr
);
2332 DESTROY_IF(this->prf
);
2333 DESTROY_IF(this->hkdf
);
2341 tls_crypto_t
*tls_crypto_create(tls_t
*tls
, tls_cache_t
*cache
)
2343 private_tls_crypto_t
*this;
2344 enumerator_t
*enumerator
;
2345 credential_type_t type
;
2350 .get_cipher_suites
= _get_cipher_suites
,
2351 .select_cipher_suite
= _select_cipher_suite
,
2352 .get_dh_group
= _get_dh_group
,
2353 .get_signature_algorithms
= _get_signature_algorithms
,
2354 .create_ec_enumerator
= _create_ec_enumerator
,
2355 .set_protection
= _set_protection
,
2356 .append_handshake
= _append_handshake
,
2357 .hash_handshake
= _hash_handshake
,
2360 .sign_handshake
= _sign_handshake
,
2361 .verify_handshake
= _verify_handshake
,
2362 .calculate_finished_legacy
= _calculate_finished_legacy
,
2363 .calculate_finished
= _calculate_finished
,
2364 .derive_secrets
= _derive_secrets
,
2365 .derive_handshake_keys
= _derive_handshake_keys
,
2366 .derive_app_keys
= _derive_app_keys
,
2367 .update_app_keys
= _update_app_keys
,
2368 .resume_session
= _resume_session
,
2369 .get_session
= _get_session
,
2370 .change_cipher
= _change_cipher
,
2371 .get_eap_msk
= _get_eap_msk
,
2372 .destroy
= _destroy
,
2378 /* FIXME: EDDSA keys are currently treated like ECDSA keys. A cleaner
2379 * separation would be welcome. */
2380 enumerator
= lib
->creds
->create_builder_enumerator(lib
->creds
);
2381 while (enumerator
->enumerate(enumerator
, &type
, &subtype
))
2383 if (type
== CRED_PUBLIC_KEY
)
2400 enumerator
->destroy(enumerator
);
2402 switch (tls
->get_purpose(tls
))
2404 case TLS_PURPOSE_EAP_TLS
:
2405 /* MSK PRF ASCII constant label according to EAP-TLS RFC 5216 */
2406 this->msk_label
= "client EAP encryption";
2408 case TLS_PURPOSE_EAP_PEAP
:
2409 this->msk_label
= "client EAP encryption";
2411 case TLS_PURPOSE_EAP_TTLS
:
2412 /* MSK PRF ASCII constant label according to EAP-TTLS RFC 5281 */
2413 this->msk_label
= "ttls keying material";
2418 return &this->public;
2424 int tls_crypto_get_supported_suites(bool null
, tls_version_t version
,
2425 tls_cipher_suite_t
**out
)
2427 suite_algs_t suites
[countof(suite_algs
)];
2430 /* initialize copy of suite list */
2431 for (i
= 0; i
< countof(suite_algs
); i
++)
2433 if (suite_algs
[i
].min_version
<= version
&&
2434 suite_algs
[i
].max_version
>= version
)
2436 suites
[count
++] = suite_algs
[i
];
2440 filter_unsupported_suites(suites
, &count
);
2444 filter_null_suites(suites
, &count
);
2449 *out
= calloc(count
, sizeof(tls_cipher_suite_t
));
2450 for (i
= 0; i
< count
; i
++)
2452 (*out
)[i
] = suites
[i
].suite
;
2461 int tls_crypto_get_supported_groups(diffie_hellman_group_t
**out
)
2463 enumerator_t
*enumerator
;
2464 diffie_hellman_group_t groups
[countof(curves
)];
2465 diffie_hellman_group_t group
;
2466 tls_named_group_t curve
;
2469 enumerator
= enumerator_create_filter(
2470 lib
->crypto
->create_dh_enumerator(lib
->crypto
),
2471 group_filter
, NULL
, NULL
);
2473 while (enumerator
->enumerate(enumerator
, &group
, &curve
))
2475 groups
[count
++] = group
;
2477 enumerator
->destroy(enumerator
);
2481 *out
= calloc(count
, sizeof(diffie_hellman_group_t
));
2482 for (i
= 0; i
< count
; i
++)
2484 (*out
)[i
] = groups
[i
];
2493 tls_named_group_t
tls_ec_group_to_curve(diffie_hellman_group_t group
)
2497 for (i
= 0; i
< countof(curves
); i
++)
2499 if (curves
[i
].group
== group
)
2501 return curves
[i
].curve
;
2510 key_type_t
tls_signature_scheme_to_key_type(tls_signature_scheme_t sig
)
2514 for (i
= 0; i
< countof(schemes
); i
++)
2516 if (schemes
[i
].sig
== sig
)
2518 return key_type_from_signature_scheme(schemes
[i
].params
.scheme
);
2525 * Hashtable hash function
2527 static u_int
hash_key_type(key_type_t
*type
)
2529 return chunk_hash(chunk_from_thing(*type
));
2533 * Hashtable equals function
2535 static bool equals_key_type(key_type_t
*key1
, key_type_t
*key2
)
2537 return *key1
== *key2
;
2540 CALLBACK(filter_key_types
, bool,
2541 void *data
, enumerator_t
*orig
, va_list args
)
2543 key_type_t
*key_type
, *out
;
2545 VA_ARGS_VGET(args
, out
);
2547 if (orig
->enumerate(orig
, NULL
, &key_type
))
2555 CALLBACK(destroy_key_types
, void,
2558 ht
->destroy_function(ht
, (void*)free
);
2564 enumerator_t
*tls_get_supported_key_types(tls_version_t min_version
,
2565 tls_version_t max_version
)
2568 key_type_t
*type
, lookup
;
2571 ht
= hashtable_create((hashtable_hash_t
)hash_key_type
,
2572 (hashtable_equals_t
)equals_key_type
, 4);
2573 for (i
= 0; i
< countof(schemes
); i
++)
2575 if (schemes
[i
].min_version
<= max_version
&&
2576 schemes
[i
].max_version
>= min_version
)
2578 lookup
= key_type_from_signature_scheme(schemes
[i
].params
.scheme
);
2579 if (!ht
->get(ht
, &lookup
))
2581 type
= malloc_thing(key_type_t
);
2583 ht
->put(ht
, type
, type
);
2587 return enumerator_create_filter(ht
->create_enumerator(ht
),
2588 filter_key_types
, ht
, destroy_key_types
);