2 * Copyright (C) 2020 Tobias Brunner
3 * Copyright (C) 2020-2021 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>
27 #include <collections/array.h>
29 ENUM_BEGIN(tls_cipher_suite_names
, TLS_NULL_WITH_NULL_NULL
,
30 TLS_DH_anon_WITH_3DES_EDE_CBC_SHA
,
31 "TLS_NULL_WITH_NULL_NULL",
32 "TLS_RSA_WITH_NULL_MD5",
33 "TLS_RSA_WITH_NULL_SHA",
34 "TLS_RSA_EXPORT_WITH_RC4_40_MD5",
35 "TLS_RSA_WITH_RC4_128_MD5",
36 "TLS_RSA_WITH_RC4_128_SHA",
37 "TLS_RSA_EXPORT_WITH_RC2_CBC_40_MD5",
38 "TLS_RSA_WITH_IDEA_CBC_SHA",
39 "TLS_RSA_EXPORT_WITH_DES40_CBC_SHA",
40 "TLS_RSA_WITH_DES_CBC_SHA",
41 "TLS_RSA_WITH_3DES_EDE_CBC_SHA",
42 "TLS_DH_DSS_EXPORT_WITH_DES40_CBC_SHA",
43 "TLS_DH_DSS_WITH_DES_CBC_SHA",
44 "TLS_DH_DSS_WITH_3DES_EDE_CBC_SHA",
45 "TLS_DH_RSA_EXPORT_WITH_DES40_CBC_SHA",
46 "TLS_DH_RSA_WITH_DES_CBC_SHA",
47 "TLS_DH_RSA_WITH_3DES_EDE_CBC_SHA",
48 "TLS_DHE_DSS_EXPORT_WITH_DES40_CBC_SHA",
49 "TLS_DHE_DSS_WITH_DES_CBC_SHA",
50 "TLS_DHE_DSS_WITH_3DES_EDE_CBC_SHA",
51 "TLS_DHE_RSA_EXPORT_WITH_DES40_CBC_SHA",
52 "TLS_DHE_RSA_WITH_DES_CBC_SHA",
53 "TLS_DHE_RSA_WITH_3DES_EDE_CBC_SHA",
54 "TLS_DH_anon_EXPORT_WITH_RC4_40_MD5",
55 "TLS_DH_anon_WITH_RC4_128_MD5",
56 "TLS_DH_anon_EXPORT_WITH_DES40_CBC_SHA",
57 "TLS_DH_anon_WITH_DES_CBC_SHA",
58 "TLS_DH_anon_WITH_3DES_EDE_CBC_SHA");
59 ENUM_NEXT(tls_cipher_suite_names
, TLS_KRB5_WITH_DES_CBC_SHA
,
60 TLS_DH_anon_WITH_CAMELLIA_128_CBC_SHA
,
61 TLS_DH_anon_WITH_3DES_EDE_CBC_SHA
,
62 "TLS_KRB5_WITH_DES_CBC_SHA",
63 "TLS_KRB5_WITH_3DES_EDE_CBC_SHA",
64 "TLS_KRB5_WITH_RC4_128_SHA",
65 "TLS_KRB5_WITH_IDEA_CBC_SHA",
66 "TLS_KRB5_WITH_DES_CBC_MD5",
67 "TLS_KRB5_WITH_3DES_EDE_CBC_MD5",
68 "TLS_KRB5_WITH_RC4_128_MD5",
69 "TLS_KRB5_WITH_IDEA_CBC_MD5",
70 "TLS_KRB5_EXPORT_WITH_DES_CBC_40_SHA",
71 "TLS_KRB5_EXPORT_WITH_RC2_CBC_40_SHA",
72 "TLS_KRB5_EXPORT_WITH_RC4_40_SHA",
73 "TLS_KRB5_EXPORT_WITH_DES_CBC_40_MD5",
74 "TLS_KRB5_EXPORT_WITH_RC2_CBC_40_MD5",
75 "TLS_KRB5_EXPORT_WITH_RC4_40_MD5",
76 "TLS_PSK_WITH_NULL_SHA",
77 "TLS_DHE_PSK_WITH_NULL_SHA",
78 "TLS_RSA_PSK_WITH_NULL_SHA",
79 "TLS_RSA_WITH_AES_128_CBC_SHA",
80 "TLS_DH_DSS_WITH_AES_128_CBC_SHA",
81 "TLS_DH_RSA_WITH_AES_128_CBC_SHA",
82 "TLS_DHE_DSS_WITH_AES_128_CBC_SHA",
83 "TLS_DHE_RSA_WITH_AES_128_CBC_SHA",
84 "TLS_DH_anon_WITH_AES_128_CBC_SHA",
85 "TLS_RSA_WITH_AES_256_CBC_SHA",
86 "TLS_DH_DSS_WITH_AES_256_CBC_SHA",
87 "TLS_DH_RSA_WITH_AES_256_CBC_SHA",
88 "TLS_DHE_DSS_WITH_AES_256_CBC_SHA",
89 "TLS_DHE_RSA_WITH_AES_256_CBC_SHA",
90 "TLS_DH_anon_WITH_AES_256_CBC_SHA",
91 "TLS_RSA_WITH_NULL_SHA256",
92 "TLS_RSA_WITH_AES_128_CBC_SHA256",
93 "TLS_RSA_WITH_AES_256_CBC_SHA256",
94 "TLS_DH_DSS_WITH_AES_128_CBC_SHA256",
95 "TLS_DH_RSA_WITH_AES_128_CBC_SHA256",
96 "TLS_DHE_DSS_WITH_AES_128_CBC_SHA256",
97 "TLS_RSA_WITH_CAMELLIA_128_CBC_SHA",
98 "TLS_DH_DSS_WITH_CAMELLIA_128_CBC_SHA",
99 "TLS_DH_RSA_WITH_CAMELLIA_128_CBC_SHA",
100 "TLS_DHE_DSS_WITH_CAMELLIA_128_CBC_SHA",
101 "TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA",
102 "TLS_DH_anon_WITH_CAMELLIA_128_CBC_SHA");
103 ENUM_NEXT(tls_cipher_suite_names
, TLS_DHE_RSA_WITH_AES_128_CBC_SHA256
,
104 TLS_DH_anon_WITH_AES_256_CBC_SHA256
,
105 TLS_DH_anon_WITH_CAMELLIA_128_CBC_SHA
,
106 "TLS_DHE_RSA_WITH_AES_128_CBC_SHA256",
107 "TLS_DH_DSS_WITH_AES_256_CBC_SHA256",
108 "TLS_DH_RSA_WITH_AES_256_CBC_SHA256",
109 "TLS_DHE_DSS_WITH_AES_256_CBC_SHA256",
110 "TLS_DHE_RSA_WITH_AES_256_CBC_SHA256",
111 "TLS_DH_anon_WITH_AES_128_CBC_SHA256",
112 "TLS_DH_anon_WITH_AES_256_CBC_SHA256");
113 ENUM_NEXT(tls_cipher_suite_names
, TLS_RSA_WITH_CAMELLIA_256_CBC_SHA
,
114 TLS_DH_anon_WITH_CAMELLIA_256_CBC_SHA256
,
115 TLS_DH_anon_WITH_AES_256_CBC_SHA256
,
116 "TLS_RSA_WITH_CAMELLIA_256_CBC_SHA",
117 "TLS_DH_DSS_WITH_CAMELLIA_256_CBC_SHA",
118 "TLS_DH_RSA_WITH_CAMELLIA_256_CBC_SHA",
119 "TLS_DHE_DSS_WITH_CAMELLIA_256_CBC_SHA",
120 "TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA",
121 "TLS_DH_anon_WITH_CAMELLIA_256_CBC_SHA",
122 "TLS_PSK_WITH_RC4_128_SHA",
123 "TLS_PSK_WITH_3DES_EDE_CBC_SHA",
124 "TLS_PSK_WITH_AES_128_CBC_SHA",
125 "TLS_PSK_WITH_AES_256_CBC_SHA",
126 "TLS_DHE_PSK_WITH_RC4_128_SHA",
127 "TLS_DHE_PSK_WITH_3DES_EDE_CBC_SHA",
128 "TLS_DHE_PSK_WITH_AES_128_CBC_SHA",
129 "TLS_DHE_PSK_WITH_AES_256_CBC_SHA",
130 "TLS_RSA_PSK_WITH_RC4_128_SHA",
131 "TLS_RSA_PSK_WITH_3DES_EDE_CBC_SHA",
132 "TLS_RSA_PSK_WITH_AES_128_CBC_SHA",
133 "TLS_RSA_PSK_WITH_AES_256_CBC_SHA",
134 "TLS_RSA_WITH_SEED_CBC_SHA",
135 "TLS_DH_DSS_WITH_SEED_CBC_SHA",
136 "TLS_DH_RSA_WITH_SEED_CBC_SHA",
137 "TLS_DHE_DSS_WITH_SEED_CBC_SHA",
138 "TLS_DHE_RSA_WITH_SEED_CBC_SHA",
139 "TLS_DH_anon_WITH_SEED_CBC_SHA",
140 "TLS_RSA_WITH_AES_128_GCM_SHA256",
141 "TLS_RSA_WITH_AES_256_GCM_SHA384",
142 "TLS_DHE_RSA_WITH_AES_128_GCM_SHA256",
143 "TLS_DHE_RSA_WITH_AES_256_GCM_SHA384",
144 "TLS_DH_RSA_WITH_AES_128_GCM_SHA256",
145 "TLS_DH_RSA_WITH_AES_256_GCM_SHA384",
146 "TLS_DHE_DSS_WITH_AES_128_GCM_SHA256",
147 "TLS_DHE_DSS_WITH_AES_256_GCM_SHA384",
148 "TLS_DH_DSS_WITH_AES_128_GCM_SHA256",
149 "TLS_DH_DSS_WITH_AES_256_GCM_SHA384",
150 "TLS_DH_anon_WITH_AES_128_GCM_SHA256",
151 "TLS_DH_anon_WITH_AES_256_GCM_SHA384",
152 "TLS_PSK_WITH_AES_128_GCM_SHA256",
153 "TLS_PSK_WITH_AES_256_GCM_SHA384",
154 "TLS_DHE_PSK_WITH_AES_128_GCM_SHA256",
155 "TLS_DHE_PSK_WITH_AES_256_GCM_SHA384",
156 "TLS_RSA_PSK_WITH_AES_128_GCM_SHA256",
157 "TLS_RSA_PSK_WITH_AES_256_GCM_SHA384",
158 "TLS_PSK_WITH_AES_128_CBC_SHA256",
159 "TLS_PSK_WITH_AES_256_CBC_SHA384",
160 "TLS_PSK_WITH_NULL_SHA256",
161 "TLS_PSK_WITH_NULL_SHA384",
162 "TLS_DHE_PSK_WITH_AES_128_CBC_SHA256",
163 "TLS_DHE_PSK_WITH_AES_256_CBC_SHA384",
164 "TLS_DHE_PSK_WITH_NULL_SHA256",
165 "TLS_DHE_PSK_WITH_NULL_SHA384",
166 "TLS_RSA_PSK_WITH_AES_128_CBC_SHA256",
167 "TLS_RSA_PSK_WITH_AES_256_CBC_SHA384",
168 "TLS_RSA_PSK_WITH_NULL_SHA256",
169 "TLS_RSA_PSK_WITH_NULL_SHA384",
170 "TLS_RSA_WITH_CAMELLIA_128_CBC_SHA256",
171 "TLS_DH_DSS_WITH_CAMELLIA_128_CBC_SHA256",
172 "TLS_DH_RSA_WITH_CAMELLIA_128_CBC_SHA256",
173 "TLS_DHE_DSS_WITH_CAMELLIA_128_CBC_SHA256",
174 "TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA256",
175 "TLS_DH_anon_WITH_CAMELLIA_128_CBC_SHA256",
176 "TLS_RSA_WITH_CAMELLIA_256_CBC_SHA256",
177 "TLS_DH_DSS_WITH_CAMELLIA_256_CBC_SHA256",
178 "TLS_DH_RSA_WITH_CAMELLIA_256_CBC_SHA256",
179 "TLS_DHE_DSS_WITH_CAMELLIA_256_CBC_SHA256",
180 "TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA256",
181 "TLS_DH_anon_WITH_CAMELLIA_256_CBC_SHA256");
182 ENUM_NEXT(tls_cipher_suite_names
, TLS_EMPTY_RENEGOTIATION_INFO_SCSV
,
183 TLS_EMPTY_RENEGOTIATION_INFO_SCSV
,
184 TLS_DH_anon_WITH_CAMELLIA_256_CBC_SHA256
,
185 "TLS_EMPTY_RENEGOTIATION_INFO_SCSV");
186 ENUM_NEXT(tls_cipher_suite_names
, TLS_AES_128_GCM_SHA256
,
187 TLS_AES_128_CCM_8_SHA256
,
188 TLS_EMPTY_RENEGOTIATION_INFO_SCSV
,
189 "TLS_AES_128_GCM_SHA256",
190 "TLS_AES_256_GCM_SHA384",
191 "TLS_CHACHA20_POLY1305_SHA256",
192 "TLS_AES_128_CCM_SHA256",
193 "TLS_AES_128_CCM_8_SHA256");
194 ENUM_NEXT(tls_cipher_suite_names
, TLS_ECDH_ECDSA_WITH_NULL_SHA
,
195 TLS_ECDHE_PSK_WITH_NULL_SHA384
,
196 TLS_AES_128_CCM_8_SHA256
,
197 "TLS_ECDH_ECDSA_WITH_NULL_SHA",
198 "TLS_ECDH_ECDSA_WITH_RC4_128_SHA",
199 "TLS_ECDH_ECDSA_WITH_3DES_EDE_CBC_SHA",
200 "TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA",
201 "TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA",
202 "TLS_ECDHE_ECDSA_WITH_NULL_SHA",
203 "TLS_ECDHE_ECDSA_WITH_RC4_128_SHA",
204 "TLS_ECDHE_ECDSA_WITH_3DES_EDE_CBC_SHA",
205 "TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA",
206 "TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA",
207 "TLS_ECDH_RSA_WITH_NULL_SHA",
208 "TLS_ECDH_RSA_WITH_RC4_128_SHA",
209 "TLS_ECDH_RSA_WITH_3DES_EDE_CBC_SHA",
210 "TLS_ECDH_RSA_WITH_AES_128_CBC_SHA",
211 "TLS_ECDH_RSA_WITH_AES_256_CBC_SHA",
212 "TLS_ECDHE_RSA_WITH_NULL_SHA",
213 "TLS_ECDHE_RSA_WITH_RC4_128_SHA",
214 "TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA",
215 "TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA",
216 "TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA",
217 "TLS_ECDH_anon_WITH_NULL_SHA",
218 "TLS_ECDH_anon_WITH_RC4_128_SHA",
219 "TLS_ECDH_anon_WITH_3DES_EDE_CBC_SHA",
220 "TLS_ECDH_anon_WITH_AES_128_CBC_SHA",
221 "TLS_ECDH_anon_WITH_AES_256_CBC_SHA",
222 "TLS_SRP_SHA_WITH_3DES_EDE_CBC_SHA",
223 "TLS_SRP_SHA_RSA_WITH_3DES_EDE_CBC_SHA",
224 "TLS_SRP_SHA_DSS_WITH_3DES_EDE_CBC_SHA",
225 "TLS_SRP_SHA_WITH_AES_128_CBC_SHA",
226 "TLS_SRP_SHA_RSA_WITH_AES_128_CBC_SHA",
227 "TLS_SRP_SHA_DSS_WITH_AES_128_CBC_SHA",
228 "TLS_SRP_SHA_WITH_AES_256_CBC_SHA",
229 "TLS_SRP_SHA_RSA_WITH_AES_256_CBC_SHA",
230 "TLS_SRP_SHA_DSS_WITH_AES_256_CBC_SHA",
231 "TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256",
232 "TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384",
233 "TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA256",
234 "TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA384",
235 "TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256",
236 "TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384",
237 "TLS_ECDH_RSA_WITH_AES_128_CBC_SHA256",
238 "TLS_ECDH_RSA_WITH_AES_256_CBC_SHA384",
239 "TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256",
240 "TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384",
241 "TLS_ECDH_ECDSA_WITH_AES_128_GCM_SHA256",
242 "TLS_ECDH_ECDSA_WITH_AES_256_GCM_SHA384",
243 "TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256",
244 "TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384",
245 "TLS_ECDH_RSA_WITH_AES_128_GCM_SHA256",
246 "TLS_ECDH_RSA_WITH_AES_256_GCM_SHA384",
247 "TLS_ECDHE_PSK_WITH_RC4_128_SHA",
248 "TLS_ECDHE_PSK_WITH_3DES_EDE_CBC_SHA",
249 "TLS_ECDHE_PSK_WITH_AES_128_CBC_SHA",
250 "TLS_ECDHE_PSK_WITH_AES_256_CBC_SHA",
251 "TLS_ECDHE_PSK_WITH_AES_128_CBC_SHA256",
252 "TLS_ECDHE_PSK_WITH_AES_256_CBC_SHA384",
253 "TLS_ECDHE_PSK_WITH_NULL_SHA",
254 "TLS_ECDHE_PSK_WITH_NULL_SHA256",
255 "TLS_ECDHE_PSK_WITH_NULL_SHA384");
256 ENUM_NEXT(tls_cipher_suite_names
, TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256
,
257 TLS_DHE_RSA_WITH_CHACHA20_POLY1305_SHA256
,
258 TLS_ECDHE_PSK_WITH_NULL_SHA384
,
259 "TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256",
260 "TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256",
261 "TLS_DHE_RSA_WITH_CHACHA20_POLY1305_SHA256");
262 ENUM_END(tls_cipher_suite_names
, TLS_DHE_RSA_WITH_CHACHA20_POLY1305_SHA256
);
265 ENUM(tls_hash_algorithm_names
, TLS_HASH_NONE
, TLS_HASH_SHA512
,
275 ENUM_BEGIN(tls_signature_scheme_names
,
276 TLS_SIG_RSA_PKCS1_SHA1
, TLS_SIG_RSA_PKCS1_SHA1
,
278 ENUM_NEXT(tls_signature_scheme_names
,
279 TLS_SIG_ECDSA_SHA1
, TLS_SIG_ECDSA_SHA1
, TLS_SIG_RSA_PKCS1_SHA1
,
281 ENUM_NEXT(tls_signature_scheme_names
,
282 TLS_SIG_RSA_PKCS1_SHA224
, TLS_SIG_ECDSA_SHA224
, TLS_SIG_ECDSA_SHA1
,
286 ENUM_NEXT(tls_signature_scheme_names
,
287 TLS_SIG_RSA_PKCS1_SHA256
, TLS_SIG_ECDSA_SHA256
, TLS_SIG_ECDSA_SHA224
,
291 ENUM_NEXT(tls_signature_scheme_names
,
292 TLS_SIG_RSA_PKCS1_SHA384
, TLS_SIG_ECDSA_SHA384
, TLS_SIG_ECDSA_SHA256
,
296 ENUM_NEXT(tls_signature_scheme_names
,
297 TLS_SIG_RSA_PKCS1_SHA512
, TLS_SIG_ECDSA_SHA512
, TLS_SIG_ECDSA_SHA384
,
301 ENUM_NEXT(tls_signature_scheme_names
,
302 TLS_SIG_RSA_PSS_RSAE_SHA256
, TLS_SIG_RSA_PSS_PSS_SHA512
, TLS_SIG_ECDSA_SHA512
,
303 "RSA_PSS_RSAE_SHA256",
304 "RSA_PSS_RSAE_SHA384",
305 "RSA_PSS_RSAE_SHA512",
308 "RSA_PSS_PSS_SHA256",
309 "RSA_PSS_PSS_SHA384",
310 "RSA_PSS_PSS_SHA512",
312 ENUM_END(tls_signature_scheme_names
, TLS_SIG_RSA_PSS_PSS_SHA512
);
314 ENUM_BEGIN(tls_client_certificate_type_names
,
315 TLS_RSA_SIGN
, TLS_DSS_EPHEMERAL_DH
,
322 ENUM_NEXT(tls_client_certificate_type_names
,
323 TLS_FORTEZZA_DMS
, TLS_FORTEZZA_DMS
, TLS_DSS_EPHEMERAL_DH
,
325 ENUM_NEXT(tls_client_certificate_type_names
,
326 TLS_ECDSA_SIGN
, TLS_ECDSA_FIXED_ECDH
, TLS_FORTEZZA_DMS
,
330 ENUM_END(tls_client_certificate_type_names
, TLS_ECDSA_FIXED_ECDH
);
332 ENUM(tls_ecc_curve_type_names
, TLS_ECC_EXPLICIT_PRIME
, TLS_ECC_NAMED_CURVE
,
338 ENUM_BEGIN(tls_named_group_names
, TLS_SECT163K1
, TLS_SECP521R1
,
365 ENUM_NEXT(tls_named_group_names
, TLS_CURVE25519
, TLS_CURVE448
, TLS_SECP521R1
,
369 ENUM_NEXT(tls_named_group_names
, TLS_FFDHE2048
, TLS_FFDHE8192
, TLS_CURVE448
,
376 ENUM_END(tls_named_group_names
, TLS_FFDHE8192
);
378 ENUM(tls_ansi_point_format_names
, TLS_ANSI_COMPRESSED
, TLS_ANSI_HYBRID_Y
,
387 ENUM(tls_ec_point_format_names
,
388 TLS_EC_POINT_UNCOMPRESSED
, TLS_EC_POINT_ANSIX962_COMPRESSED_CHAR2
,
390 "ansiX962 compressed prime",
391 "ansiX962 compressed char2",
394 typedef struct private_tls_crypto_t private_tls_crypto_t
;
397 * Private data of an tls_crypto_t object.
399 struct private_tls_crypto_t
{
402 * Public tls_crypto_t interface.
409 tls_protection_t
*protection
;
412 * List of supported/acceptable cipher suites
414 tls_cipher_suite_t
*suites
;
417 * Number of supported suites
427 * Selected cipher suite
429 tls_cipher_suite_t suite
;
452 * All handshake data concatenated
457 * Connection state TLS PRF
462 * AEAD transform for inbound traffic
467 * AEAD transform for outbound traffic
469 tls_aead_t
*aead_out
;
477 * ASCII string constant used as seed for EAP-[T]TLS MSK PRF
483 tls_cipher_suite_t suite
;
485 diffie_hellman_group_t dh
;
486 hash_algorithm_t hash
;
487 pseudo_random_function_t prf
;
488 integrity_algorithm_t mac
;
489 encryption_algorithm_t encr
;
491 tls_version_t min_version
;
492 tls_version_t max_version
;
496 * Mapping suites to a set of algorithms
498 * The order represents the descending preference of cipher suites and follows
501 * 1. TLS 1.3 > Legacy TLS
502 * 2. AES > CAMELLIA > NULL
505 * 5. ECDHE > DHE > NULL
507 * 7. SHA384 > SHA256 > SHA1
510 static suite_algs_t suite_algs
[] = {
511 /* Cipher suites of TLS 1.3: key exchange and authentication
512 * delegated to extensions, therefore KEY_ANY, MODP_NONE, PRF_UNDEFINED */
513 { TLS_AES_256_GCM_SHA384
,
515 HASH_SHA384
, PRF_UNDEFINED
,
516 AUTH_HMAC_SHA2_384_384
, ENCR_AES_GCM_ICV16
, 32,
519 { TLS_AES_128_GCM_SHA256
,
521 HASH_SHA256
, PRF_UNDEFINED
,
522 AUTH_HMAC_SHA2_256_256
, ENCR_AES_GCM_ICV16
, 16,
525 { TLS_CHACHA20_POLY1305_SHA256
,
527 HASH_SHA256
, PRF_UNDEFINED
,
528 AUTH_HMAC_SHA2_256_256
, ENCR_CHACHA20_POLY1305
, 32,
531 { TLS_AES_128_CCM_SHA256
,
533 HASH_SHA256
, PRF_UNDEFINED
,
534 AUTH_HMAC_SHA2_256_256
, ENCR_AES_CCM_ICV16
, 16,
537 { TLS_AES_128_CCM_8_SHA256
,
539 HASH_SHA256
, PRF_UNDEFINED
,
540 AUTH_HMAC_SHA2_256_256
, ENCR_AES_CCM_ICV8
, 16,
543 /* Legacy TLS cipher suites */
544 { TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384
,
545 KEY_ECDSA
, ECP_384_BIT
,
546 HASH_SHA384
, PRF_HMAC_SHA2_384
,
547 AUTH_UNDEFINED
, ENCR_AES_GCM_ICV16
, 32,
550 { TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384
,
551 KEY_ECDSA
, ECP_384_BIT
,
552 HASH_SHA384
, PRF_HMAC_SHA2_384
,
553 AUTH_HMAC_SHA2_384_384
, ENCR_AES_CBC
, 32,
556 { TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA
,
557 KEY_ECDSA
, ECP_384_BIT
,
558 HASH_SHA256
, PRF_HMAC_SHA2_256
,
559 AUTH_HMAC_SHA1_160
, ENCR_AES_CBC
, 32,
562 { TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256
,
563 KEY_ECDSA
, ECP_256_BIT
,
564 HASH_SHA256
, PRF_HMAC_SHA2_256
,
565 AUTH_UNDEFINED
, ENCR_AES_GCM_ICV16
, 16,
568 { TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256
,
569 KEY_ECDSA
, ECP_256_BIT
,
570 HASH_SHA256
, PRF_HMAC_SHA2_256
,
571 AUTH_HMAC_SHA2_256_256
, ENCR_AES_CBC
, 16,
574 { TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA
,
575 KEY_ECDSA
, ECP_256_BIT
,
576 HASH_SHA256
, PRF_HMAC_SHA2_256
,
577 AUTH_HMAC_SHA1_160
, ENCR_AES_CBC
, 16,
580 { TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384
,
581 KEY_RSA
, ECP_384_BIT
,
582 HASH_SHA384
, PRF_HMAC_SHA2_384
,
583 AUTH_UNDEFINED
, ENCR_AES_GCM_ICV16
, 32,
586 { TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384
,
587 KEY_RSA
, ECP_384_BIT
,
588 HASH_SHA384
, PRF_HMAC_SHA2_384
,
589 AUTH_HMAC_SHA2_384_384
, ENCR_AES_CBC
, 32,
592 { TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA
,
593 KEY_RSA
, ECP_384_BIT
,
594 HASH_SHA256
, PRF_HMAC_SHA2_256
,
595 AUTH_HMAC_SHA1_160
, ENCR_AES_CBC
, 32,
598 { TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256
,
599 KEY_RSA
, ECP_256_BIT
,
600 HASH_SHA256
, PRF_HMAC_SHA2_256
,
601 AUTH_UNDEFINED
, ENCR_AES_GCM_ICV16
, 16,
604 { TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256
,
605 KEY_RSA
, ECP_256_BIT
,
606 HASH_SHA256
, PRF_HMAC_SHA2_256
,
607 AUTH_HMAC_SHA2_256_256
, ENCR_AES_CBC
, 16,
610 { TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA
,
611 KEY_RSA
, ECP_256_BIT
,
612 HASH_SHA256
, PRF_HMAC_SHA2_256
,
613 AUTH_HMAC_SHA1_160
, ENCR_AES_CBC
, 16,
616 { TLS_DHE_RSA_WITH_AES_256_GCM_SHA384
,
617 KEY_RSA
, MODP_4096_BIT
,
618 HASH_SHA384
, PRF_HMAC_SHA2_384
,
619 AUTH_UNDEFINED
, ENCR_AES_GCM_ICV16
, 32,
622 { TLS_DHE_RSA_WITH_AES_256_CBC_SHA256
,
623 KEY_RSA
, MODP_4096_BIT
,
624 HASH_SHA256
, PRF_HMAC_SHA2_256
,
625 AUTH_HMAC_SHA2_256_256
, ENCR_AES_CBC
, 32,
628 { TLS_DHE_RSA_WITH_AES_256_CBC_SHA
,
629 KEY_RSA
, MODP_3072_BIT
,
630 HASH_SHA256
, PRF_HMAC_SHA2_256
,
631 AUTH_HMAC_SHA1_160
, ENCR_AES_CBC
, 32,
634 { TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA256
,
635 KEY_RSA
, MODP_4096_BIT
,
636 HASH_SHA256
, PRF_HMAC_SHA2_256
,
637 AUTH_HMAC_SHA2_256_256
, ENCR_CAMELLIA_CBC
, 32,
640 { TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA
,
641 KEY_RSA
, MODP_3072_BIT
,
642 HASH_SHA256
, PRF_HMAC_SHA2_256
,
643 AUTH_HMAC_SHA1_160
, ENCR_CAMELLIA_CBC
, 32,
646 { TLS_DHE_RSA_WITH_AES_128_GCM_SHA256
,
647 KEY_RSA
, MODP_3072_BIT
,
648 HASH_SHA256
, PRF_HMAC_SHA2_256
,
649 AUTH_UNDEFINED
, ENCR_AES_GCM_ICV16
, 16,
652 { TLS_DHE_RSA_WITH_AES_128_CBC_SHA256
,
653 KEY_RSA
, MODP_3072_BIT
,
654 HASH_SHA256
, PRF_HMAC_SHA2_256
,
655 AUTH_HMAC_SHA2_256_256
, ENCR_AES_CBC
, 16,
658 { TLS_DHE_RSA_WITH_AES_128_CBC_SHA
,
659 KEY_RSA
, MODP_2048_BIT
,
660 HASH_SHA256
,PRF_HMAC_SHA2_256
,
661 AUTH_HMAC_SHA1_160
, ENCR_AES_CBC
, 16,
664 { TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA256
,
665 KEY_RSA
, MODP_3072_BIT
,
666 HASH_SHA256
, PRF_HMAC_SHA2_256
,
667 AUTH_HMAC_SHA2_256_256
, ENCR_CAMELLIA_CBC
, 16,
670 { TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA
,
671 KEY_RSA
, MODP_2048_BIT
,
672 HASH_SHA256
, PRF_HMAC_SHA2_256
,
673 AUTH_HMAC_SHA1_160
, ENCR_CAMELLIA_CBC
, 16,
676 { TLS_RSA_WITH_AES_256_GCM_SHA384
,
678 HASH_SHA384
, PRF_HMAC_SHA2_384
,
679 AUTH_UNDEFINED
, ENCR_AES_GCM_ICV16
, 32,
682 { TLS_RSA_WITH_AES_256_CBC_SHA256
,
684 HASH_SHA256
, PRF_HMAC_SHA2_256
,
685 AUTH_HMAC_SHA2_256_256
, ENCR_AES_CBC
, 32,
688 { TLS_RSA_WITH_AES_256_CBC_SHA
,
690 HASH_SHA256
, PRF_HMAC_SHA2_256
,
691 AUTH_HMAC_SHA1_160
, ENCR_AES_CBC
, 32,
694 { TLS_RSA_WITH_AES_128_GCM_SHA256
,
696 HASH_SHA256
, PRF_HMAC_SHA2_256
,
697 AUTH_UNDEFINED
, ENCR_AES_GCM_ICV16
, 16,
700 { TLS_RSA_WITH_AES_128_CBC_SHA256
,
702 HASH_SHA256
, PRF_HMAC_SHA2_256
,
703 AUTH_HMAC_SHA2_256_256
, ENCR_AES_CBC
, 16,
706 { TLS_RSA_WITH_AES_128_CBC_SHA
,
708 HASH_SHA256
, PRF_HMAC_SHA2_256
,
709 AUTH_HMAC_SHA1_160
, ENCR_AES_CBC
, 16,
712 { TLS_RSA_WITH_CAMELLIA_256_CBC_SHA256
,
714 HASH_SHA256
, PRF_HMAC_SHA2_256
,
715 AUTH_HMAC_SHA2_256_256
, ENCR_CAMELLIA_CBC
, 32,
718 { TLS_RSA_WITH_CAMELLIA_256_CBC_SHA
,
720 HASH_SHA256
, PRF_HMAC_SHA2_256
,
721 AUTH_HMAC_SHA1_160
, ENCR_CAMELLIA_CBC
, 32,
724 { TLS_RSA_WITH_CAMELLIA_128_CBC_SHA256
,
726 HASH_SHA256
, PRF_HMAC_SHA2_256
,
727 AUTH_HMAC_SHA2_256_256
, ENCR_CAMELLIA_CBC
, 16,
730 { TLS_RSA_WITH_CAMELLIA_128_CBC_SHA
,
732 HASH_SHA256
, PRF_HMAC_SHA2_256
,
733 AUTH_HMAC_SHA1_160
, ENCR_CAMELLIA_CBC
, 16,
736 { TLS_ECDHE_ECDSA_WITH_NULL_SHA
,
737 KEY_ECDSA
, ECP_256_BIT
,
738 HASH_SHA256
, PRF_HMAC_SHA2_256
,
739 AUTH_HMAC_SHA1_160
, ENCR_NULL
, 0,
742 { TLS_ECDHE_RSA_WITH_NULL_SHA
,
743 KEY_ECDSA
, ECP_256_BIT
,
744 HASH_SHA256
, PRF_HMAC_SHA2_256
,
745 AUTH_HMAC_SHA1_160
, ENCR_NULL
, 0,
748 { TLS_RSA_WITH_NULL_SHA256
,
750 HASH_SHA256
, PRF_HMAC_SHA2_256
,
751 AUTH_HMAC_SHA2_256_256
, ENCR_NULL
, 0,
754 { TLS_RSA_WITH_NULL_SHA
,
756 HASH_SHA256
, PRF_HMAC_SHA2_256
,
757 AUTH_HMAC_SHA1_160
, ENCR_NULL
, 0,
763 * Look up algorithms by a suite
765 static suite_algs_t
*find_suite(tls_cipher_suite_t suite
)
769 for (i
= 0; i
< countof(suite_algs
); i
++)
771 if (suite_algs
[i
].suite
== suite
)
773 return &suite_algs
[i
];
780 * Filter a suite list using a transform enumerator
782 static void filter_suite(suite_algs_t suites
[], int *count
, int offset
,
783 enumerator_t
*(*create_enumerator
)(crypto_factory_t
*))
785 const char *plugin_name
;
786 suite_algs_t current
;
787 int *current_alg
, i
, remaining
= 0;
788 enumerator_t
*enumerator
;
790 memset(¤t
, 0, sizeof(current
));
791 current_alg
= (int*)((char*)¤t
+ offset
);
793 for (i
= 0; i
< *count
; i
++)
795 if (create_enumerator
== lib
->crypto
->create_crypter_enumerator
&&
796 encryption_algorithm_is_aead(suites
[i
].encr
))
797 { /* filtering crypters, but current suite uses an AEAD, apply */
798 suites
[remaining
] = suites
[i
];
802 if (create_enumerator
== lib
->crypto
->create_aead_enumerator
&&
803 !encryption_algorithm_is_aead(suites
[i
].encr
))
804 { /* filtering AEADs, but current suite doesn't use one, apply */
805 suites
[remaining
] = suites
[i
];
809 enumerator
= create_enumerator(lib
->crypto
);
810 while (enumerator
->enumerate(enumerator
, current_alg
, &plugin_name
))
812 if (current
.encr
&& current
.encr
!= suites
[i
].encr
)
814 if (suites
[i
].encr
!= ENCR_NULL
)
815 { /* skip, ENCR does not match nor is NULL */
819 if (current
.mac
&& current
.mac
!= suites
[i
].mac
)
821 if (suites
[i
].mac
!= AUTH_UNDEFINED
)
822 { /* skip, MAC does not match nor is it undefined */
826 if (current
.prf
&& current
.prf
!= suites
[i
].prf
)
828 if (suites
[i
].prf
!= PRF_UNDEFINED
)
830 /* skip, PRF does not match nor is it undefined */
834 if (current
.hash
&& current
.hash
!= suites
[i
].hash
)
835 { /* skip, hash does not match */
838 if (current
.dh
&& current
.dh
!= suites
[i
].dh
)
840 if (suites
[i
].dh
!= MODP_NONE
)
841 { /* skip DH group, does not match nor NONE */
845 /* suite supported, apply */
846 suites
[remaining
] = suites
[i
];
850 enumerator
->destroy(enumerator
);
856 * Purge NULL encryption cipher suites from list
858 static void filter_null_suites(suite_algs_t suites
[], int *count
)
860 int i
, remaining
= 0;
862 for (i
= 0; i
< *count
; i
++)
864 if (suites
[i
].encr
!= ENCR_NULL
)
866 suites
[remaining
] = suites
[i
];
874 * Purge suites using a given key type
876 static void filter_key_suites(private_tls_crypto_t
*this,
877 suite_algs_t suites
[], int *count
, key_type_t key
)
879 int i
, remaining
= 0;
881 DBG2(DBG_TLS
, "disabling %N suites, no backend found", key_type_names
, key
);
882 for (i
= 0; i
< *count
; i
++)
884 if (suites
[i
].key
!= key
)
886 suites
[remaining
] = suites
[i
];
894 * Filter suites by key exchange user config
896 static void filter_key_exchange_config_suites(private_tls_crypto_t
*this,
897 suite_algs_t suites
[], int *count
)
899 enumerator_t
*enumerator
;
900 int i
, remaining
= 0;
901 char *token
, *config
;
903 config
= lib
->settings
->get_str(lib
->settings
, "%s.tls.key_exchange", NULL
,
907 for (i
= 0; i
< *count
; i
++)
909 enumerator
= enumerator_create_token(config
, ",", " ");
910 while (enumerator
->enumerate(enumerator
, &token
))
912 if (strcaseeq(token
, "ecdhe-ecdsa") &&
913 diffie_hellman_group_is_ec(suites
[i
].dh
) &&
914 suites
[i
].key
== KEY_ECDSA
)
916 suites
[remaining
++] = suites
[i
];
919 if (strcaseeq(token
, "ecdhe-rsa") &&
920 diffie_hellman_group_is_ec(suites
[i
].dh
) &&
921 suites
[i
].key
== KEY_RSA
)
923 suites
[remaining
++] = suites
[i
];
926 if (strcaseeq(token
, "dhe-rsa") &&
927 !diffie_hellman_group_is_ec(suites
[i
].dh
) &&
928 suites
[i
].dh
!= MODP_NONE
&&
929 suites
[i
].key
== KEY_RSA
)
931 suites
[remaining
++] = suites
[i
];
934 if (strcaseeq(token
, "rsa") &&
935 suites
[i
].dh
== MODP_NONE
&&
936 suites
[i
].key
== KEY_RSA
)
938 suites
[remaining
++] = suites
[i
];
942 enumerator
->destroy(enumerator
);
949 * Filter suites by cipher user config
951 static void filter_cipher_config_suites(private_tls_crypto_t
*this,
952 suite_algs_t suites
[], int *count
)
954 enumerator_t
*enumerator
;
955 int i
, remaining
= 0;
956 char *token
, *config
;
958 config
= lib
->settings
->get_str(lib
->settings
, "%s.tls.cipher", NULL
,
962 for (i
= 0; i
< *count
; i
++)
964 enumerator
= enumerator_create_token(config
, ",", " ");
965 while (enumerator
->enumerate(enumerator
, &token
))
967 if (strcaseeq(token
, "aes128") &&
968 suites
[i
].encr
== ENCR_AES_CBC
&&
969 suites
[i
].encr_size
== 16)
971 suites
[remaining
++] = suites
[i
];
974 if (strcaseeq(token
, "aes256") &&
975 suites
[i
].encr
== ENCR_AES_CBC
&&
976 suites
[i
].encr_size
== 32)
978 suites
[remaining
++] = suites
[i
];
981 if (strcaseeq(token
, "aes128gcm") &&
982 suites
[i
].encr
== ENCR_AES_GCM_ICV16
&&
983 suites
[i
].encr_size
== 16)
985 suites
[remaining
++] = suites
[i
];
988 if (strcaseeq(token
, "aes256gcm") &&
989 suites
[i
].encr
== ENCR_AES_GCM_ICV16
&&
990 suites
[i
].encr_size
== 32)
992 suites
[remaining
++] = suites
[i
];
995 if (strcaseeq(token
, "camellia128") &&
996 suites
[i
].encr
== ENCR_CAMELLIA_CBC
&&
997 suites
[i
].encr_size
== 16)
999 suites
[remaining
++] = suites
[i
];
1002 if (strcaseeq(token
, "camellia256") &&
1003 suites
[i
].encr
== ENCR_CAMELLIA_CBC
&&
1004 suites
[i
].encr_size
== 32)
1006 suites
[remaining
++] = suites
[i
];
1009 if (strcaseeq(token
, "null") &&
1010 suites
[i
].encr
== ENCR_NULL
)
1012 suites
[remaining
++] = suites
[i
];
1016 enumerator
->destroy(enumerator
);
1023 * Filter suites by mac user config
1025 static void filter_mac_config_suites(private_tls_crypto_t
*this,
1026 suite_algs_t suites
[], int *count
)
1028 enumerator_t
*enumerator
;
1029 int i
, remaining
= 0;
1030 char *token
, *config
;
1032 config
= lib
->settings
->get_str(lib
->settings
, "%s.tls.mac", NULL
,
1036 for (i
= 0; i
< *count
; i
++)
1038 enumerator
= enumerator_create_token(config
, ",", " ");
1039 while (enumerator
->enumerate(enumerator
, &token
))
1041 if (strcaseeq(token
, "sha1") &&
1042 suites
[i
].mac
== AUTH_HMAC_SHA1_160
)
1044 suites
[remaining
++] = suites
[i
];
1047 if (strcaseeq(token
, "sha256") &&
1048 suites
[i
].mac
== AUTH_HMAC_SHA2_256_256
)
1050 suites
[remaining
++] = suites
[i
];
1053 if (strcaseeq(token
, "sha384") &&
1054 suites
[i
].mac
== AUTH_HMAC_SHA2_384_384
)
1056 suites
[remaining
++] = suites
[i
];
1060 enumerator
->destroy(enumerator
);
1067 * Filter for specific suites specified in strongswan.conf
1069 static void filter_specific_config_suites(private_tls_crypto_t
*this,
1070 suite_algs_t suites
[], int *count
)
1072 enumerator_t
*enumerator
;
1073 int i
, remaining
= 0, suite
;
1074 char *token
, *config
;
1076 config
= lib
->settings
->get_str(lib
->settings
, "%s.tls.suites", NULL
,
1080 for (i
= 0; i
< *count
; i
++)
1082 enumerator
= enumerator_create_token(config
, ",", " ");
1083 while (enumerator
->enumerate(enumerator
, &token
))
1085 if (enum_from_name(tls_cipher_suite_names
, token
, &suite
) &&
1086 suite
== suites
[i
].suite
)
1088 suites
[remaining
++] = suites
[i
];
1092 enumerator
->destroy(enumerator
);
1099 * Filter key exchange curves by curve user config
1101 static bool filter_curve_config(tls_named_group_t curve
)
1103 enumerator_t
*enumerator
;
1104 char *token
, *config
;
1106 config
= lib
->settings
->get_str(lib
->settings
, "%s.tls.ke_group", NULL
,
1110 enumerator
= enumerator_create_token(config
, ",", " ");
1111 while (enumerator
->enumerate(enumerator
, &token
))
1113 const proposal_token_t
*tok
;
1115 tok
= lib
->proposal
->get_token(lib
->proposal
, token
);
1116 if (tok
!= NULL
&& tok
->type
== DIFFIE_HELLMAN_GROUP
&&
1117 curve
== tls_ec_group_to_curve(tok
->algorithm
))
1119 enumerator
->destroy(enumerator
);
1123 enumerator
->destroy(enumerator
);
1129 * Filter out unsupported suites on given suite array
1131 static void filter_unsupported_suites(suite_algs_t suites
[], int *count
)
1133 /* filter suite list by each algorithm */
1134 filter_suite(suites
, count
, offsetof(suite_algs_t
, encr
),
1135 lib
->crypto
->create_aead_enumerator
);
1136 filter_suite(suites
, count
, offsetof(suite_algs_t
, prf
),
1137 lib
->crypto
->create_prf_enumerator
);
1138 filter_suite(suites
, count
, offsetof(suite_algs_t
, encr
),
1139 lib
->crypto
->create_crypter_enumerator
);
1140 filter_suite(suites
, count
, offsetof(suite_algs_t
, mac
),
1141 lib
->crypto
->create_signer_enumerator
);
1142 filter_suite(suites
, count
, offsetof(suite_algs_t
, hash
),
1143 lib
->crypto
->create_hasher_enumerator
);
1144 filter_suite(suites
, count
, offsetof(suite_algs_t
, dh
),
1145 lib
->crypto
->create_dh_enumerator
);
1149 * Initialize the cipher suite list
1151 static void build_cipher_suite_list(private_tls_crypto_t
*this)
1153 suite_algs_t suites
[countof(suite_algs
)];
1154 tls_version_t min_version
, max_version
, new_min_version
, new_max_version
;
1155 bool require_encryption
;
1158 switch (this->tls
->get_purpose(this->tls
))
1160 case TLS_PURPOSE_EAP_TLS
:
1161 case TLS_PURPOSE_GENERIC_NULLOK
:
1162 require_encryption
= FALSE
;
1164 case TLS_PURPOSE_EAP_PEAP
:
1165 case TLS_PURPOSE_EAP_TTLS
:
1166 case TLS_PURPOSE_GENERIC
:
1167 require_encryption
= TRUE
;
1173 min_version
= this->tls
->get_version_min(this->tls
);
1174 max_version
= this->tls
->get_version_max(this->tls
);
1176 /* copy all suites appropriate for the current min/max versions */
1177 for (i
= 0; i
< countof(suite_algs
); i
++)
1179 if (suite_algs
[i
].min_version
<= max_version
&&
1180 suite_algs
[i
].max_version
>= min_version
)
1182 suites
[count
++] = suite_algs
[i
];
1186 if (require_encryption
)
1188 filter_null_suites(suites
, &count
);
1192 filter_key_suites(this, suites
, &count
, KEY_RSA
);
1196 filter_key_suites(this, suites
, &count
, KEY_ECDSA
);
1199 filter_unsupported_suites(suites
, &count
);
1201 /* filter suites with strongswan.conf options */
1202 filter_key_exchange_config_suites(this, suites
, &count
);
1203 filter_cipher_config_suites(this, suites
, &count
);
1204 filter_mac_config_suites(this, suites
, &count
);
1205 filter_specific_config_suites(this, suites
, &count
);
1208 this->suite_count
= count
;
1209 this->suites
= malloc(sizeof(tls_cipher_suite_t
) * count
);
1211 DBG2(DBG_TLS
, "%d supported TLS cipher suites:", count
);
1212 new_min_version
= max_version
;
1213 new_max_version
= min_version
;
1214 for (i
= 0; i
< count
; i
++)
1216 DBG2(DBG_TLS
, " %N", tls_cipher_suite_names
, suites
[i
].suite
);
1217 this->suites
[i
] = suites
[i
].suite
;
1219 /* set TLS min/max versions appropriate to the final cipher suites */
1220 new_max_version
= max(new_max_version
, suites
[i
].max_version
);
1221 new_min_version
= min(new_min_version
, suites
[i
].min_version
);
1223 new_max_version
= min(new_max_version
, max_version
);
1224 new_min_version
= max(new_min_version
, min_version
);
1226 if ((min_version
!= new_min_version
|| max_version
!= new_max_version
) &&
1227 this->tls
->set_version(this->tls
, new_min_version
, new_max_version
))
1229 DBG2(DBG_TLS
, "TLS min/max %N/%N according to the cipher suites",
1230 tls_numeric_version_names
, new_min_version
,
1231 tls_numeric_version_names
, new_max_version
);
1235 METHOD(tls_crypto_t
, get_cipher_suites
, int,
1236 private_tls_crypto_t
*this, tls_cipher_suite_t
**suites
)
1240 build_cipher_suite_list(this);
1244 *suites
= this->suites
;
1246 return this->suite_count
;
1250 * Create NULL encryption transforms
1252 static bool create_null(private_tls_crypto_t
*this, suite_algs_t
*algs
)
1254 this->aead_in
= tls_aead_create_null(algs
->mac
);
1255 this->aead_out
= tls_aead_create_null(algs
->mac
);
1256 if (!this->aead_in
|| !this->aead_out
)
1258 DBG1(DBG_TLS
, "selected TLS MAC %N not supported",
1259 integrity_algorithm_names
, algs
->mac
);
1266 * Create traditional transforms
1268 static bool create_traditional(private_tls_crypto_t
*this, suite_algs_t
*algs
)
1270 if (this->tls
->get_version_max(this->tls
) < TLS_1_1
)
1272 this->aead_in
= tls_aead_create_implicit(algs
->mac
,
1273 algs
->encr
, algs
->encr_size
);
1274 this->aead_out
= tls_aead_create_implicit(algs
->mac
,
1275 algs
->encr
, algs
->encr_size
);
1279 this->aead_in
= tls_aead_create_explicit(algs
->mac
,
1280 algs
->encr
, algs
->encr_size
);
1281 this->aead_out
= tls_aead_create_explicit(algs
->mac
,
1282 algs
->encr
, algs
->encr_size
);
1284 if (!this->aead_in
|| !this->aead_out
)
1286 DBG1(DBG_TLS
, "selected TLS transforms %N-%u-%N not supported",
1287 encryption_algorithm_names
, algs
->encr
, algs
->encr_size
* 8,
1288 integrity_algorithm_names
, algs
->mac
);
1295 * Create AEAD transforms
1297 static bool create_aead(private_tls_crypto_t
*this, suite_algs_t
*algs
)
1299 if (this->tls
->get_version_max(this->tls
) < TLS_1_3
)
1301 this->aead_in
= tls_aead_create_aead(algs
->encr
, algs
->encr_size
);
1302 this->aead_out
= tls_aead_create_aead(algs
->encr
, algs
->encr_size
);
1306 this->aead_in
= tls_aead_create_seq(algs
->encr
, algs
->encr_size
);
1307 this->aead_out
= tls_aead_create_seq(algs
->encr
, algs
->encr_size
);
1309 if (!this->aead_in
|| !this->aead_out
)
1311 DBG1(DBG_TLS
, "selected TLS transforms %N-%u not supported",
1312 encryption_algorithm_names
, algs
->encr
, algs
->encr_size
* 8);
1319 * Clean up and unset AEAD transforms
1321 static void destroy_aeads(private_tls_crypto_t
*this)
1323 DESTROY_IF(this->aead_in
);
1324 DESTROY_IF(this->aead_out
);
1325 this->aead_in
= this->aead_out
= NULL
;
1329 * Create crypto primitives
1331 static bool create_ciphers(private_tls_crypto_t
*this, suite_algs_t
*algs
)
1333 destroy_aeads(this);
1334 DESTROY_IF(this->hkdf
);
1335 DESTROY_IF(this->prf
);
1336 if (this->tls
->get_version_max(this->tls
) < TLS_1_3
)
1338 if (this->tls
->get_version_max(this->tls
) < TLS_1_2
)
1340 this->prf
= tls_prf_create_10();
1344 this->prf
= tls_prf_create_12(algs
->prf
);
1348 DBG1(DBG_TLS
, "selected TLS PRF not supported");
1354 this->hkdf
= tls_hkdf_create(algs
->hash
, chunk_empty
);
1357 DBG1(DBG_TLS
, "TLS HKDF creation unsuccessful");
1361 if (algs
->encr
== ENCR_NULL
)
1363 if (create_null(this, algs
))
1368 else if (encryption_algorithm_is_aead(algs
->encr
))
1370 if (create_aead(this, algs
))
1377 if (create_traditional(this, algs
))
1382 destroy_aeads(this);
1386 METHOD(tls_crypto_t
, select_cipher_suite
, tls_cipher_suite_t
,
1387 private_tls_crypto_t
*this, tls_cipher_suite_t
*suites
, int count
,
1393 for (i
= 0; i
< this->suite_count
; i
++)
1395 for (j
= 0; j
< count
; j
++)
1397 if (this->suites
[i
] == suites
[j
])
1399 algs
= find_suite(this->suites
[i
]);
1402 if (key
== KEY_ANY
|| key
== algs
->key
||
1403 (algs
->key
== KEY_ECDSA
&& key
== KEY_ED25519
) ||
1404 (algs
->key
== KEY_ECDSA
&& key
== KEY_ED448
))
1406 if (create_ciphers(this, algs
))
1408 this->suite
= this->suites
[i
];
1419 METHOD(tls_crypto_t
, get_dh_group
, diffie_hellman_group_t
,
1420 private_tls_crypto_t
*this)
1424 algs
= find_suite(this->suite
);
1433 * Parameters for RSA/PSS signature schemes
1435 #define PSS_PARAMS(bits) static rsa_pss_params_t pss_params_sha##bits = { \
1436 .hash = HASH_SHA##bits, \
1437 .mgf1_hash = HASH_SHA##bits, \
1438 .salt_len = HASH_SIZE_SHA##bits, \
1446 tls_signature_scheme_t sig
;
1447 signature_params_t params
;
1448 /* min/max versions for use in CertificateVerify */
1449 tls_version_t min_version
;
1450 tls_version_t max_version
;
1454 * Map TLS signature schemes, ordered by preference
1456 static scheme_algs_t schemes
[] = {
1457 { TLS_SIG_ECDSA_SHA256
, { .scheme
= SIGN_ECDSA_WITH_SHA256_DER
},
1459 { TLS_SIG_ECDSA_SHA384
, { .scheme
= SIGN_ECDSA_WITH_SHA384_DER
},
1461 { TLS_SIG_ECDSA_SHA512
, { .scheme
= SIGN_ECDSA_WITH_SHA512_DER
},
1463 { TLS_SIG_ED25519
, { .scheme
= SIGN_ED25519
},
1465 { TLS_SIG_ED448
, { .scheme
= SIGN_ED448
},
1467 { TLS_SIG_RSA_PSS_RSAE_SHA256
, { .scheme
= SIGN_RSA_EMSA_PSS
, .params
= &pss_params_sha256
, },
1469 { TLS_SIG_RSA_PSS_RSAE_SHA384
, { .scheme
= SIGN_RSA_EMSA_PSS
, .params
= &pss_params_sha384
, },
1471 { TLS_SIG_RSA_PSS_RSAE_SHA512
, { .scheme
= SIGN_RSA_EMSA_PSS
, .params
= &pss_params_sha512
, },
1473 /* the parameters for the next three should actually be taken from the
1474 * public key, we currently don't have an API for that, so assume defaults */
1475 { TLS_SIG_RSA_PSS_PSS_SHA256
, { .scheme
= SIGN_RSA_EMSA_PSS
, .params
= &pss_params_sha256
, },
1477 { TLS_SIG_RSA_PSS_PSS_SHA384
, { .scheme
= SIGN_RSA_EMSA_PSS
, .params
= &pss_params_sha384
, },
1479 { TLS_SIG_RSA_PSS_PSS_SHA512
, { .scheme
= SIGN_RSA_EMSA_PSS
, .params
= &pss_params_sha512
, },
1481 { TLS_SIG_RSA_PKCS1_SHA256
, { .scheme
= SIGN_RSA_EMSA_PKCS1_SHA2_256
},
1483 { TLS_SIG_RSA_PKCS1_SHA384
, { .scheme
= SIGN_RSA_EMSA_PKCS1_SHA2_384
},
1485 { TLS_SIG_RSA_PKCS1_SHA512
, { .scheme
= SIGN_RSA_EMSA_PKCS1_SHA2_512
},
1490 * Filter signature scheme config
1492 static bool filter_signature_scheme_config(tls_signature_scheme_t signature
)
1494 enumerator_t
*enumerator
;
1495 char *token
, *config
;
1497 config
= lib
->settings
->get_str(lib
->settings
, "%s.tls.signature", NULL
,
1501 enumerator
= enumerator_create_token(config
, ",", " ");
1502 while (enumerator
->enumerate(enumerator
, &token
))
1504 tls_signature_scheme_t sig
;
1506 if (enum_from_name(tls_signature_scheme_names
, token
, &sig
) &&
1509 enumerator
->destroy(enumerator
);
1513 enumerator
->destroy(enumerator
);
1518 METHOD(tls_crypto_t
, get_signature_algorithms
, void,
1519 private_tls_crypto_t
*this, bio_writer_t
*writer
, bool cert
)
1521 bio_writer_t
*supported
;
1522 tls_version_t min_version
, max_version
;
1525 supported
= bio_writer_create(32);
1529 min_version
= this->tls
->get_version_min(this->tls
);
1530 max_version
= this->tls
->get_version_max(this->tls
);
1533 for (i
= 0; i
< countof(schemes
); i
++)
1535 if ((cert
|| (schemes
[i
].min_version
<= max_version
&&
1536 schemes
[i
].max_version
>= min_version
)) &&
1537 lib
->plugins
->has_feature(lib
->plugins
,
1538 PLUGIN_PROVIDE(PUBKEY_VERIFY
, schemes
[i
].params
.scheme
)) &&
1539 filter_signature_scheme_config(schemes
[i
].sig
))
1541 supported
->write_uint16(supported
, schemes
[i
].sig
);
1545 writer
->write_data16(writer
, supported
->get_buf(supported
));
1546 supported
->destroy(supported
);
1550 * Get the signature parameters from a TLS signature scheme
1552 static signature_params_t
*params_for_scheme(tls_signature_scheme_t sig
,
1557 for (i
= 0; i
< countof(schemes
); i
++)
1559 /* strongSwan supports only RSA_PSS_RSAE schemes for signing but can
1560 * verify public keys in rsaEncryption as well as rsassaPss encoding. */
1561 if (sign
&& (sig
== TLS_SIG_RSA_PSS_PSS_SHA256
||
1562 sig
== TLS_SIG_RSA_PSS_PSS_SHA384
||
1563 sig
== TLS_SIG_RSA_PSS_PSS_SHA512
))
1567 if (schemes
[i
].sig
== sig
)
1569 return &schemes
[i
].params
;
1576 * Mapping groups to TLS named curves
1579 diffie_hellman_group_t group
;
1580 tls_named_group_t curve
;
1582 { ECP_256_BIT
, TLS_SECP256R1
},
1583 { ECP_384_BIT
, TLS_SECP384R1
},
1584 { ECP_521_BIT
, TLS_SECP521R1
},
1585 { ECP_224_BIT
, TLS_SECP224R1
},
1586 { ECP_192_BIT
, TLS_SECP192R1
},
1587 { CURVE_25519
, TLS_CURVE25519
},
1588 { CURVE_448
, TLS_CURVE448
},
1591 CALLBACK(group_filter
, bool,
1592 void *null
, enumerator_t
*orig
, va_list args
)
1594 diffie_hellman_group_t group
, *group_out
;
1595 tls_named_group_t curve
, *curve_out
;
1598 VA_ARGS_VGET(args
, group_out
, curve_out
);
1600 while (orig
->enumerate(orig
, &group
, &plugin
))
1602 curve
= tls_ec_group_to_curve(group
);
1619 CALLBACK(config_filter
, bool,
1620 void *null
, enumerator_t
*orig
, va_list args
)
1622 diffie_hellman_group_t group
, *group_out
;
1623 tls_named_group_t curve
, *curve_out
;
1625 VA_ARGS_VGET(args
, group_out
, curve_out
);
1627 while (orig
->enumerate(orig
, &group
, &curve
))
1629 if (filter_curve_config(curve
))
1645 METHOD(tls_crypto_t
, create_ec_enumerator
, enumerator_t
*,
1646 private_tls_crypto_t
*this)
1648 return enumerator_create_filter(
1649 enumerator_create_filter(
1650 lib
->crypto
->create_dh_enumerator(lib
->crypto
),
1651 group_filter
, NULL
, NULL
),
1652 config_filter
, NULL
, NULL
);
1655 METHOD(tls_crypto_t
, set_protection
, void,
1656 private_tls_crypto_t
*this, tls_protection_t
*protection
)
1658 this->protection
= protection
;
1661 METHOD(tls_crypto_t
, append_handshake
, void,
1662 private_tls_crypto_t
*this, tls_handshake_type_t type
, chunk_t data
)
1666 /* reconstruct handshake header */
1667 header
= htonl(data
.len
| (type
<< 24));
1668 this->handshake
= chunk_cat("mcc", this->handshake
,
1669 chunk_from_thing(header
), data
);
1673 * Create a hash using the suites HASH algorithm
1675 static bool hash_data(private_tls_crypto_t
*this, chunk_t data
, chunk_t
*hash
)
1677 if (this->tls
->get_version_max(this->tls
) >= TLS_1_2
)
1682 alg
= find_suite(this->suite
);
1687 hasher
= lib
->crypto
->create_hasher(lib
->crypto
, alg
->hash
);
1688 if (!hasher
|| !hasher
->allocate_hash(hasher
, data
, hash
))
1690 DBG1(DBG_TLS
, "%N not supported", hash_algorithm_names
, alg
->hash
);
1694 hasher
->destroy(hasher
);
1698 hasher_t
*md5
, *sha1
;
1699 char buf
[HASH_SIZE_MD5
+ HASH_SIZE_SHA1
];
1701 md5
= lib
->crypto
->create_hasher(lib
->crypto
, HASH_MD5
);
1702 if (!md5
|| !md5
->get_hash(md5
, data
, buf
))
1704 DBG1(DBG_TLS
, "%N not supported", hash_algorithm_names
, HASH_MD5
);
1709 sha1
= lib
->crypto
->create_hasher(lib
->crypto
, HASH_SHA1
);
1710 if (!sha1
|| !sha1
->get_hash(sha1
, data
, buf
+ HASH_SIZE_MD5
))
1712 DBG1(DBG_TLS
, "%N not supported", hash_algorithm_names
, HASH_SHA1
);
1716 sha1
->destroy(sha1
);
1718 *hash
= chunk_clone(chunk_from_thing(buf
));
1723 METHOD(tls_crypto_t
, hash_handshake
, bool,
1724 private_tls_crypto_t
*this, chunk_t
*out
)
1728 if (!hash_data(this, this->handshake
, &hash
))
1733 chunk_free(&this->handshake
);
1734 append_handshake(this, TLS_MESSAGE_HASH
, hash
);
1748 * TLS 1.3 static part of the data the server signs (64 spaces followed by the
1749 * context string "TLS 1.3, server CertificateVerify" and a 0 byte).
1751 static chunk_t tls13_sig_data_server
= chunk_from_chars(
1752 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
1753 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
1754 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
1755 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
1756 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
1757 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
1758 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
1759 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
1760 0x54, 0x4c, 0x53, 0x20, 0x31, 0x2e, 0x33, 0x2c,
1761 0x20, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x20,
1762 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63,
1763 0x61, 0x74, 0x65, 0x56, 0x65, 0x72, 0x69, 0x66,
1768 * TLS 1.3 static part of the data the peer signs (64 spaces followed by the
1769 * context string "TLS 1.3, client CertificateVerify" and a 0 byte).
1771 static chunk_t tls13_sig_data_client
= chunk_from_chars(
1772 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
1773 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
1774 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
1775 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
1776 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
1777 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
1778 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
1779 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
1780 0x54, 0x4c, 0x53, 0x20, 0x31, 0x2e, 0x33, 0x2c,
1781 0x20, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x20,
1782 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63,
1783 0x61, 0x74, 0x65, 0x56, 0x65, 0x72, 0x69, 0x66,
1787 METHOD(tls_crypto_t
, sign
, bool,
1788 private_tls_crypto_t
*this, private_key_t
*key
, bio_writer_t
*writer
,
1789 chunk_t data
, chunk_t hashsig
)
1791 if (this->tls
->get_version_max(this->tls
) >= TLS_1_2
)
1793 /* fallback to SHA1/RSA and SHA1/ECDSA */
1794 const chunk_t hashsig_def
= chunk_from_chars(0x02, 0x01, 0x02, 0x03);
1795 signature_params_t
*params
;
1798 bio_reader_t
*reader
;
1802 if (this->tls
->get_version_max(this->tls
) >= TLS_1_3
)
1804 chunk_t transcript_hash
;
1806 if (!hash_data(this, data
, &transcript_hash
))
1808 DBG1(DBG_TLS
, "unable to create transcript hash");
1811 if (this->tls
->is_server(this->tls
))
1813 data
= chunk_cata("cm", tls13_sig_data_server
, transcript_hash
);
1817 data
= chunk_cata("cm", tls13_sig_data_client
, transcript_hash
);
1822 { /* fallback if none given */
1823 hashsig
= hashsig_def
;
1825 type
= key
->get_type(key
);
1826 reader
= bio_reader_create(hashsig
);
1827 while (reader
->remaining(reader
) >= 2)
1829 if (reader
->read_uint16(reader
, &scheme
))
1831 params
= params_for_scheme(scheme
, TRUE
);
1833 type
== key_type_from_signature_scheme(params
->scheme
) &&
1834 key
->sign(key
, params
->scheme
, params
->params
, data
, &sig
))
1841 reader
->destroy(reader
);
1844 DBG1(DBG_TLS
, "none of the proposed hash/sig algorithms supported");
1847 DBG2(DBG_TLS
, "created signature with %N", tls_signature_scheme_names
,
1849 writer
->write_uint16(writer
, scheme
);
1850 writer
->write_data16(writer
, sig
);
1858 switch (key
->get_type(key
))
1861 if (!hash_data(this, data
, &hash
))
1865 done
= key
->sign(key
, SIGN_RSA_EMSA_PKCS1_NULL
, NULL
, hash
,
1872 DBG2(DBG_TLS
, "created signature with MD5+SHA1/RSA");
1875 if (!key
->sign(key
, SIGN_ECDSA_WITH_SHA1_DER
, NULL
, data
, &sig
))
1879 DBG2(DBG_TLS
, "created signature with SHA1/ECDSA");
1882 if (!key
->sign(key
, SIGN_ED25519
, NULL
, data
, &sig
))
1886 DBG2(DBG_TLS
, "created signature with Ed25519");
1889 if (!key
->sign(key
, SIGN_ED448
, NULL
, data
, &sig
))
1893 DBG2(DBG_TLS
, "created signature with Ed448");
1898 writer
->write_data16(writer
, sig
);
1904 METHOD(tls_crypto_t
, verify
, bool,
1905 private_tls_crypto_t
*this, public_key_t
*key
, bio_reader_t
*reader
,
1908 if (this->tls
->get_version_max(this->tls
) >= TLS_1_2
)
1910 signature_params_t
*params
;
1914 if (!reader
->read_uint16(reader
, &scheme
) ||
1915 !reader
->read_data16(reader
, &sig
))
1917 DBG1(DBG_TLS
, "received invalid signature");
1920 params
= params_for_scheme(scheme
, FALSE
);
1923 DBG1(DBG_TLS
, "signature algorithms %N not supported",
1924 tls_signature_scheme_names
, scheme
);
1927 if (this->tls
->get_version_max(this->tls
) >= TLS_1_3
)
1929 chunk_t transcript_hash
;
1931 if (!hash_data(this, data
, &transcript_hash
))
1933 DBG1(DBG_TLS
, "Unable to create transcript hash");
1937 if (this->tls
->is_server(this->tls
))
1939 data
= chunk_cata("cm", tls13_sig_data_client
, transcript_hash
);
1943 data
= chunk_cata("cm", tls13_sig_data_server
, transcript_hash
);
1946 if (!key
->verify(key
, params
->scheme
, params
->params
, data
, sig
))
1948 DBG1(DBG_TLS
, "signature verification with %N failed",
1949 tls_signature_scheme_names
, scheme
);
1952 DBG2(DBG_TLS
, "verified signature with %N",
1953 tls_signature_scheme_names
, scheme
);
1960 if (!reader
->read_data16(reader
, &sig
))
1962 DBG1(DBG_TLS
, "received invalid signature");
1965 switch (key
->get_type(key
))
1968 if (!hash_data(this, data
, &hash
))
1972 done
= key
->verify(key
, SIGN_RSA_EMSA_PKCS1_NULL
, NULL
, hash
,
1979 DBG2(DBG_TLS
, "verified signature data with MD5+SHA1/RSA");
1982 if (!key
->verify(key
, SIGN_ECDSA_WITH_SHA1_DER
, NULL
, data
,
1987 DBG2(DBG_TLS
, "verified signature with SHA1/ECDSA");
1990 if (!key
->verify(key
, SIGN_ED25519
, NULL
, data
, sig
))
1994 DBG2(DBG_TLS
, "verified signature with Ed25519");
1997 if (!key
->verify(key
, SIGN_ED448
, NULL
, data
, sig
))
2001 DBG2(DBG_TLS
, "verified signature with Ed448");
2010 METHOD(tls_crypto_t
, sign_handshake
, bool,
2011 private_tls_crypto_t
*this, private_key_t
*key
, bio_writer_t
*writer
,
2014 return sign(this, key
, writer
, this->handshake
, hashsig
);
2017 METHOD(tls_crypto_t
, verify_handshake
, bool,
2018 private_tls_crypto_t
*this, public_key_t
*key
, bio_reader_t
*reader
)
2020 return verify(this, key
, reader
, this->handshake
);
2023 METHOD(tls_crypto_t
, calculate_finished_legacy
, bool,
2024 private_tls_crypto_t
*this, char *label
, char out
[12])
2032 if (!hash_data(this, this->handshake
, &seed
))
2036 if (!this->prf
->get_bytes(this->prf
, label
, seed
, 12, out
))
2045 METHOD(tls_crypto_t
, calculate_finished
, bool,
2046 private_tls_crypto_t
*this, bool server
, chunk_t
*out
)
2048 chunk_t finished_key
, finished_hash
;
2054 if (!hash_data(this, this->handshake
, &finished_hash
))
2056 DBG1(DBG_TLS
, "creating hash of handshake failed");
2059 if (!this->hkdf
->derive_finished(this->hkdf
, server
, &finished_key
))
2061 DBG1(DBG_TLS
, "generating finished key failed");
2062 chunk_clear(&finished_hash
);
2065 if (!this->hkdf
->allocate_bytes(this->hkdf
, finished_key
, finished_hash
, out
))
2067 DBG1(DBG_TLS
, "generating finished HMAC failed");
2068 chunk_clear(&finished_key
);
2069 chunk_clear(&finished_hash
);
2072 chunk_clear(&finished_key
);
2073 chunk_clear(&finished_hash
);
2078 * Derive master secret from premaster, optionally save session
2080 static bool derive_master(private_tls_crypto_t
*this, chunk_t premaster
,
2081 chunk_t session
, identification_t
*id
,
2082 chunk_t client_random
, chunk_t server_random
)
2087 /* derive master secret */
2088 seed
= chunk_cata("cc", client_random
, server_random
);
2090 if (!this->prf
->set_key(this->prf
, premaster
) ||
2091 !this->prf
->get_bytes(this->prf
, "master secret", seed
,
2092 sizeof(master
), master
) ||
2093 !this->prf
->set_key(this->prf
, chunk_from_thing(master
)))
2098 if (this->cache
&& session
.len
)
2100 this->cache
->create(this->cache
, session
, id
, chunk_from_thing(master
),
2103 memwipe(master
, sizeof(master
));
2108 * Expand key material from master secret
2110 static bool expand_keys(private_tls_crypto_t
*this,
2111 chunk_t client_random
, chunk_t server_random
)
2113 chunk_t seed
, block
;
2114 chunk_t cw_mac
, cw
, cw_iv
;
2115 chunk_t sw_mac
, sw
, sw_iv
;
2116 int mklen
, eklen
, ivlen
;
2118 if (!this->aead_in
|| !this->aead_out
)
2123 /* derive key block for key expansion */
2124 mklen
= this->aead_in
->get_mac_key_size(this->aead_in
);
2125 eklen
= this->aead_in
->get_encr_key_size(this->aead_in
);
2126 ivlen
= this->aead_in
->get_iv_size(this->aead_in
);
2127 seed
= chunk_cata("cc", server_random
, client_random
);
2128 block
= chunk_alloca((mklen
+ eklen
+ ivlen
) * 2);
2129 if (!this->prf
->get_bytes(this->prf
, "key expansion", seed
,
2130 block
.len
, block
.ptr
))
2135 /* client/server write signer keys */
2136 cw_mac
= chunk_create(block
.ptr
, mklen
);
2137 block
= chunk_skip(block
, mklen
);
2138 sw_mac
= chunk_create(block
.ptr
, mklen
);
2139 block
= chunk_skip(block
, mklen
);
2141 /* client/server write encryption keys */
2142 cw
= chunk_create(block
.ptr
, eklen
);
2143 block
= chunk_skip(block
, eklen
);
2144 sw
= chunk_create(block
.ptr
, eklen
);
2145 block
= chunk_skip(block
, eklen
);
2147 /* client/server write IV; TLS 1.0 implicit IVs or AEAD salt, if any */
2148 cw_iv
= chunk_create(block
.ptr
, ivlen
);
2149 block
= chunk_skip(block
, ivlen
);
2150 sw_iv
= chunk_create(block
.ptr
, ivlen
);
2151 block
= chunk_skip(block
, ivlen
);
2153 if (this->tls
->is_server(this->tls
))
2155 if (!this->aead_in
->set_keys(this->aead_in
, cw_mac
, cw
, cw_iv
) ||
2156 !this->aead_out
->set_keys(this->aead_out
, sw_mac
, sw
, sw_iv
))
2163 if (!this->aead_out
->set_keys(this->aead_out
, cw_mac
, cw
, cw_iv
) ||
2164 !this->aead_in
->set_keys(this->aead_in
, sw_mac
, sw
, sw_iv
))
2171 if (this->msk_label
)
2173 seed
= chunk_cata("cc", client_random
, server_random
);
2174 this->msk
= chunk_alloc(64);
2175 if (!this->prf
->get_bytes(this->prf
, this->msk_label
, seed
,
2176 this->msk
.len
, this->msk
.ptr
))
2184 METHOD(tls_crypto_t
, derive_secrets
, bool,
2185 private_tls_crypto_t
*this, chunk_t premaster
, chunk_t session
,
2186 identification_t
*id
, chunk_t client_random
, chunk_t server_random
)
2188 return derive_master(this, premaster
, session
, id
,
2189 client_random
, server_random
) &&
2190 expand_keys(this, client_random
, server_random
);
2194 * Derive and configure the client/server key/IV on an AEAD using a given label.
2196 static bool derive_labeled_key(private_tls_crypto_t
*this, bool server
,
2197 tls_hkdf_label_t label
, tls_aead_t
*aead
)
2199 chunk_t key
= chunk_empty
, iv
= chunk_empty
;
2200 bool success
= FALSE
;
2202 if (!this->hkdf
->generate_secret(this->hkdf
, label
, this->handshake
,
2204 !this->hkdf
->derive_key(this->hkdf
, server
,
2205 aead
->get_encr_key_size(aead
), &key
) ||
2206 !this->hkdf
->derive_iv(this->hkdf
, server
,
2207 aead
->get_iv_size(aead
), &iv
))
2209 DBG1(DBG_TLS
, "deriving key material failed");
2213 if (!aead
->set_keys(aead
, chunk_empty
, key
, iv
))
2215 DBG1(DBG_TLS
, "setting AEAD key material failed");
2227 * Derive and configure the keys/IVs using the given labels.
2229 static bool derive_labeled_keys(private_tls_crypto_t
*this,
2230 tls_hkdf_label_t client_label
,
2231 tls_hkdf_label_t server_label
)
2233 tls_aead_t
*aead_c
, *aead_s
;
2236 algs
= find_suite(this->suite
);
2237 destroy_aeads(this);
2238 if (!create_aead(this, algs
))
2242 aead_c
= this->aead_out
;
2243 aead_s
= this->aead_in
;
2244 if (this->tls
->is_server(this->tls
))
2246 aead_c
= this->aead_in
;
2247 aead_s
= this->aead_out
;
2249 return derive_labeled_key(this, FALSE
, client_label
, aead_c
) &&
2250 derive_labeled_key(this, TRUE
, server_label
, aead_s
);
2253 METHOD(tls_crypto_t
, derive_handshake_keys
, bool,
2254 private_tls_crypto_t
*this, chunk_t shared_secret
)
2256 this->hkdf
->set_shared_secret(this->hkdf
, shared_secret
);
2257 return derive_labeled_keys(this, TLS_HKDF_C_HS_TRAFFIC
,
2258 TLS_HKDF_S_HS_TRAFFIC
);
2261 METHOD(tls_crypto_t
, derive_app_keys
, bool,
2262 private_tls_crypto_t
*this)
2264 if (!derive_labeled_keys(this, TLS_HKDF_C_AP_TRAFFIC
,
2265 TLS_HKDF_S_AP_TRAFFIC
))
2271 if (this->msk_label
)
2273 /* because the length is encoded when expanding key material, we
2274 * request the same number of bytes as FreeRADIUS (the first 64 for
2275 * the MSK, the next for the EMSK, which we just ignore) */
2276 if (!this->hkdf
->export(this->hkdf
, this->msk_label
, chunk_empty
,
2277 this->handshake
, 128, &this->msk
))
2286 METHOD(tls_crypto_t
, update_app_keys
, bool,
2287 private_tls_crypto_t
*this, bool inbound
)
2290 tls_hkdf_label_t label
= TLS_HKDF_UPD_C_TRAFFIC
;
2292 algs
= find_suite(this->suite
);
2293 destroy_aeads(this);
2294 if (!create_aead(this, algs
))
2298 if (this->tls
->is_server(this->tls
) != inbound
)
2300 label
= TLS_HKDF_UPD_S_TRAFFIC
;
2302 return derive_labeled_key(this, label
== TLS_HKDF_UPD_S_TRAFFIC
, label
,
2303 inbound ?
this->aead_in
: this->aead_out
);
2306 METHOD(tls_crypto_t
, resume_session
, tls_cipher_suite_t
,
2307 private_tls_crypto_t
*this, chunk_t session
, identification_t
*id
,
2308 chunk_t client_random
, chunk_t server_random
)
2312 if (this->cache
&& session
.len
)
2314 this->suite
= this->cache
->lookup(this->cache
, session
, id
, &master
);
2317 this->suite
= select_cipher_suite(this, &this->suite
, 1, KEY_ANY
);
2320 if (!this->prf
->set_key(this->prf
, master
) ||
2321 !expand_keys(this, client_random
, server_random
))
2326 chunk_clear(&master
);
2333 METHOD(tls_crypto_t
, get_session
, chunk_t
,
2334 private_tls_crypto_t
*this, identification_t
*server
)
2338 return this->cache
->check(this->cache
, server
);
2343 METHOD(tls_crypto_t
, change_cipher
, void,
2344 private_tls_crypto_t
*this, bool inbound
)
2346 if (this->protection
)
2350 this->protection
->set_cipher(this->protection
, TRUE
, this->aead_in
);
2351 this->aead_in
= NULL
;
2355 this->protection
->set_cipher(this->protection
, FALSE
, this->aead_out
);
2356 this->aead_out
= NULL
;
2361 METHOD(tls_crypto_t
, get_eap_msk
, chunk_t
,
2362 private_tls_crypto_t
*this)
2367 METHOD(tls_crypto_t
, destroy
, void,
2368 private_tls_crypto_t
*this)
2370 destroy_aeads(this);
2371 free(this->handshake
.ptr
);
2372 free(this->msk
.ptr
);
2373 DESTROY_IF(this->prf
);
2374 DESTROY_IF(this->hkdf
);
2382 tls_crypto_t
*tls_crypto_create(tls_t
*tls
, tls_cache_t
*cache
)
2384 private_tls_crypto_t
*this;
2385 enumerator_t
*enumerator
;
2386 credential_type_t type
;
2391 .get_cipher_suites
= _get_cipher_suites
,
2392 .select_cipher_suite
= _select_cipher_suite
,
2393 .get_dh_group
= _get_dh_group
,
2394 .get_signature_algorithms
= _get_signature_algorithms
,
2395 .create_ec_enumerator
= _create_ec_enumerator
,
2396 .set_protection
= _set_protection
,
2397 .append_handshake
= _append_handshake
,
2398 .hash_handshake
= _hash_handshake
,
2401 .sign_handshake
= _sign_handshake
,
2402 .verify_handshake
= _verify_handshake
,
2403 .calculate_finished_legacy
= _calculate_finished_legacy
,
2404 .calculate_finished
= _calculate_finished
,
2405 .derive_secrets
= _derive_secrets
,
2406 .derive_handshake_keys
= _derive_handshake_keys
,
2407 .derive_app_keys
= _derive_app_keys
,
2408 .update_app_keys
= _update_app_keys
,
2409 .resume_session
= _resume_session
,
2410 .get_session
= _get_session
,
2411 .change_cipher
= _change_cipher
,
2412 .get_eap_msk
= _get_eap_msk
,
2413 .destroy
= _destroy
,
2419 /* FIXME: EDDSA keys are currently treated like ECDSA keys. A cleaner
2420 * separation would be welcome. */
2421 enumerator
= lib
->creds
->create_builder_enumerator(lib
->creds
);
2422 while (enumerator
->enumerate(enumerator
, &type
, &subtype
))
2424 if (type
== CRED_PUBLIC_KEY
)
2441 enumerator
->destroy(enumerator
);
2443 switch (tls
->get_purpose(tls
))
2445 case TLS_PURPOSE_EAP_TLS
:
2446 /* MSK PRF ASCII constant label according to EAP-TLS RFC 5216 */
2447 this->msk_label
= "client EAP encryption";
2449 case TLS_PURPOSE_EAP_PEAP
:
2450 this->msk_label
= "client EAP encryption";
2452 case TLS_PURPOSE_EAP_TTLS
:
2453 /* MSK PRF ASCII constant label according to EAP-TTLS RFC 5281 */
2454 this->msk_label
= "ttls keying material";
2459 return &this->public;
2465 int tls_crypto_get_supported_suites(bool null
, tls_version_t version
,
2466 tls_cipher_suite_t
**out
)
2468 suite_algs_t suites
[countof(suite_algs
)];
2471 /* initialize copy of suite list */
2472 for (i
= 0; i
< countof(suite_algs
); i
++)
2474 if (suite_algs
[i
].min_version
<= version
&&
2475 suite_algs
[i
].max_version
>= version
)
2477 suites
[count
++] = suite_algs
[i
];
2481 filter_unsupported_suites(suites
, &count
);
2485 filter_null_suites(suites
, &count
);
2490 *out
= calloc(count
, sizeof(tls_cipher_suite_t
));
2491 for (i
= 0; i
< count
; i
++)
2493 (*out
)[i
] = suites
[i
].suite
;
2502 int tls_crypto_get_supported_groups(diffie_hellman_group_t
**out
)
2504 enumerator_t
*enumerator
;
2505 diffie_hellman_group_t groups
[countof(curves
)];
2506 diffie_hellman_group_t group
;
2507 tls_named_group_t curve
;
2510 enumerator
= enumerator_create_filter(
2511 lib
->crypto
->create_dh_enumerator(lib
->crypto
),
2512 group_filter
, NULL
, NULL
);
2514 while (enumerator
->enumerate(enumerator
, &group
, &curve
))
2516 groups
[count
++] = group
;
2518 enumerator
->destroy(enumerator
);
2522 *out
= calloc(count
, sizeof(diffie_hellman_group_t
));
2523 for (i
= 0; i
< count
; i
++)
2525 (*out
)[i
] = groups
[i
];
2534 int tls_crypto_get_supported_signatures(tls_version_t version
,
2535 tls_signature_scheme_t
**out
)
2537 scheme_algs_t sigs
[countof(schemes
)];
2540 /* initialize copy of signature scheme list */
2541 for (i
= 0; i
< countof(schemes
); i
++)
2543 /* only RSA_PSS_RSAE schemes supported for signing and verifying */
2544 if (schemes
[i
].sig
== TLS_SIG_RSA_PSS_PSS_SHA256
||
2545 schemes
[i
].sig
== TLS_SIG_RSA_PSS_PSS_SHA384
||
2546 schemes
[i
].sig
== TLS_SIG_RSA_PSS_PSS_SHA512
)
2550 if (schemes
[i
].min_version
<= version
&&
2551 schemes
[i
].max_version
>= version
&&
2552 lib
->plugins
->has_feature(lib
->plugins
,
2553 PLUGIN_PROVIDE(PUBKEY_VERIFY
, schemes
[i
].params
.scheme
)))
2555 sigs
[count
++] = schemes
[i
];
2561 *out
= calloc(count
, sizeof(tls_signature_scheme_t
));
2562 for (i
= 0; i
< count
; i
++)
2564 (*out
)[i
] = sigs
[i
].sig
;
2573 tls_named_group_t
tls_ec_group_to_curve(diffie_hellman_group_t group
)
2577 for (i
= 0; i
< countof(curves
); i
++)
2579 if (curves
[i
].group
== group
)
2581 return curves
[i
].curve
;
2590 key_type_t
tls_signature_scheme_to_key_type(tls_signature_scheme_t sig
)
2594 for (i
= 0; i
< countof(schemes
); i
++)
2596 if (schemes
[i
].sig
== sig
)
2598 return key_type_from_signature_scheme(schemes
[i
].params
.scheme
);
2605 * Hashtable hash function
2607 static u_int
hash_key_type(key_type_t
*type
)
2609 return chunk_hash(chunk_from_thing(*type
));
2613 * Hashtable equals function
2615 static bool equals_key_type(key_type_t
*key1
, key_type_t
*key2
)
2617 return *key1
== *key2
;
2620 CALLBACK(filter_key_types
, bool,
2621 void *data
, enumerator_t
*orig
, va_list args
)
2623 key_type_t
*key_type
, *out
;
2625 VA_ARGS_VGET(args
, out
);
2627 if (orig
->enumerate(orig
, NULL
, &key_type
))
2635 CALLBACK(destroy_key_types
, void,
2638 ht
->destroy_function(ht
, (void*)free
);
2642 * Create an enumerator over supported key types within a specific TLS range
2644 static enumerator_t
*get_supported_key_types(tls_version_t min_version
,
2645 tls_version_t max_version
)
2648 key_type_t
*type
, lookup
;
2651 ht
= hashtable_create((hashtable_hash_t
)hash_key_type
,
2652 (hashtable_equals_t
)equals_key_type
, 4);
2653 for (i
= 0; i
< countof(schemes
); i
++)
2655 if (schemes
[i
].min_version
<= max_version
&&
2656 schemes
[i
].max_version
>= min_version
)
2658 lookup
= key_type_from_signature_scheme(schemes
[i
].params
.scheme
);
2659 if (!ht
->get(ht
, &lookup
))
2661 type
= malloc_thing(key_type_t
);
2663 ht
->put(ht
, type
, type
);
2667 return enumerator_create_filter(ht
->create_enumerator(ht
),
2668 filter_key_types
, ht
, destroy_key_types
);
2672 * Create an array of an intersection of server and peer supported key types
2674 static array_t
*create_common_key_types(enumerator_t
*enumerator
, chunk_t hashsig
)
2677 key_type_t v
, lookup
;
2678 uint16_t sig_scheme
;
2680 key_types
= array_create(sizeof(key_type_t
), 8);
2681 while (enumerator
->enumerate(enumerator
, &v
))
2683 bio_reader_t
*reader
;
2685 reader
= bio_reader_create(hashsig
);
2686 while (reader
->remaining(reader
) &&
2687 reader
->read_uint16(reader
, &sig_scheme
))
2689 lookup
= tls_signature_scheme_to_key_type(sig_scheme
);
2692 array_insert(key_types
, ARRAY_TAIL
, &lookup
);
2696 reader
->destroy(reader
);
2702 enumerator_t
public;
2704 identification_t
*peer
;
2707 } private_key_enumerator_t
;
2709 METHOD(enumerator_t
, private_key_enumerate
, bool,
2710 private_key_enumerator_t
*this, va_list args
)
2713 auth_cfg_t
**auth_out
;
2714 private_key_t
**key_out
;
2716 VA_ARGS_VGET(args
, key_out
, auth_out
);
2718 DESTROY_IF(this->key
);
2719 DESTROY_IF(this->auth
);
2720 this->auth
= auth_cfg_create();
2722 while (array_remove(this->key_types
, ARRAY_HEAD
, &type
))
2724 this->key
= lib
->credmgr
->get_private(lib
->credmgr
, type
, this->peer
,
2728 *key_out
= this->key
;
2731 *auth_out
= this->auth
;
2739 METHOD(enumerator_t
, private_key_destroy
, void,
2740 private_key_enumerator_t
*this)
2742 DESTROY_IF(this->key
);
2743 DESTROY_IF(this->auth
);
2744 array_destroy(this->key_types
);
2751 enumerator_t
*tls_create_private_key_enumerator(tls_version_t min_version
,
2752 tls_version_t max_version
,
2754 identification_t
*peer
)
2756 private_key_enumerator_t
*enumerator
;
2757 enumerator_t
*key_types
;
2759 key_types
= get_supported_key_types(min_version
, max_version
);
2763 .enumerate
= enumerator_enumerate_default
,
2764 .venumerate
= _private_key_enumerate
,
2765 .destroy
= _private_key_destroy
,
2767 .key_types
= create_common_key_types(key_types
, hashsig
),
2770 key_types
->destroy(key_types
);
2772 if (!array_count(enumerator
->key_types
))
2776 return &enumerator
->public;