Annotation of embedaddon/strongswan/src/libtls/tls_crypto.c, revision 1.1.1.2
1.1 misho 1: /*
1.1.1.2 ! misho 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
! 6: *
1.1 misho 7: * Copyright (C) 2010-2014 Martin Willi
8: * Copyright (C) 2010-2014 revosec AG
9: *
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>.
14: *
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
18: * for more details.
19: */
20:
21: #include "tls_crypto.h"
1.1.1.2 ! misho 22: #include "tls_hkdf.h"
1.1 misho 23:
24: #include <utils/debug.h>
25: #include <plugins/plugin_feature.h>
1.1.1.2 ! misho 26: #include <collections/hashtable.h>
! 27: #include <collections/array.h>
1.1 misho 28:
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");
1.1.1.2 ! misho 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");
1.1 misho 194: ENUM_NEXT(tls_cipher_suite_names, TLS_ECDH_ECDSA_WITH_NULL_SHA,
195: TLS_ECDHE_PSK_WITH_NULL_SHA384,
1.1.1.2 ! misho 196: TLS_AES_128_CCM_8_SHA256,
1.1 misho 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");
1.1.1.2 ! misho 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);
! 263:
1.1 misho 264:
265: ENUM(tls_hash_algorithm_names, TLS_HASH_NONE, TLS_HASH_SHA512,
266: "NONE",
267: "MD5",
268: "SHA1",
269: "SHA224",
270: "SHA256",
271: "SHA384",
272: "SHA512",
273: );
274:
1.1.1.2 ! misho 275: ENUM_BEGIN(tls_signature_scheme_names,
! 276: TLS_SIG_RSA_PKCS1_SHA1, TLS_SIG_RSA_PKCS1_SHA1,
! 277: "RSA_PKCS1_SHA1");
! 278: ENUM_NEXT(tls_signature_scheme_names,
! 279: TLS_SIG_ECDSA_SHA1, TLS_SIG_ECDSA_SHA1, TLS_SIG_RSA_PKCS1_SHA1,
! 280: "ECDSA_SHA1");
! 281: ENUM_NEXT(tls_signature_scheme_names,
! 282: TLS_SIG_RSA_PKCS1_SHA224, TLS_SIG_ECDSA_SHA224, TLS_SIG_ECDSA_SHA1,
! 283: "RSA_PKCS1_SHA224",
! 284: "DSA_SHA224",
! 285: "ECDSA_SHA224");
! 286: ENUM_NEXT(tls_signature_scheme_names,
! 287: TLS_SIG_RSA_PKCS1_SHA256, TLS_SIG_ECDSA_SHA256, TLS_SIG_ECDSA_SHA224,
! 288: "RSA_PKCS1_SHA256",
! 289: "DSA_SHA256",
! 290: "ECDSA_SHA256");
! 291: ENUM_NEXT(tls_signature_scheme_names,
! 292: TLS_SIG_RSA_PKCS1_SHA384, TLS_SIG_ECDSA_SHA384, TLS_SIG_ECDSA_SHA256,
! 293: "RSA_PKCS1_SHA384",
! 294: "DSA_SHA384",
! 295: "ECDSA_SHA384");
! 296: ENUM_NEXT(tls_signature_scheme_names,
! 297: TLS_SIG_RSA_PKCS1_SHA512, TLS_SIG_ECDSA_SHA512, TLS_SIG_ECDSA_SHA384,
! 298: "RSA_PKCS1_SHA512",
! 299: "DSA_SHA512",
! 300: "ECDSA_SHA512");
! 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",
! 306: "ED25519",
! 307: "ED448",
! 308: "RSA_PSS_PSS_SHA256",
! 309: "RSA_PSS_PSS_SHA384",
! 310: "RSA_PSS_PSS_SHA512",
1.1 misho 311: );
1.1.1.2 ! misho 312: ENUM_END(tls_signature_scheme_names, TLS_SIG_RSA_PSS_PSS_SHA512);
1.1 misho 313:
314: ENUM_BEGIN(tls_client_certificate_type_names,
315: TLS_RSA_SIGN, TLS_DSS_EPHEMERAL_DH,
316: "RSA_SIGN",
317: "DSA_SIGN",
318: "RSA_FIXED_DH",
319: "DSS_FIXED_DH",
320: "RSA_EPHEMERAL_DH",
321: "DSS_EPHEMERAL_DH");
322: ENUM_NEXT(tls_client_certificate_type_names,
323: TLS_FORTEZZA_DMS, TLS_FORTEZZA_DMS, TLS_DSS_EPHEMERAL_DH,
324: "FORTEZZA_DMS");
325: ENUM_NEXT(tls_client_certificate_type_names,
326: TLS_ECDSA_SIGN, TLS_ECDSA_FIXED_ECDH, TLS_FORTEZZA_DMS,
327: "ECDSA_SIGN",
328: "RSA_FIXED_ECDH",
329: "ECDSA_FIXED_ECDH");
330: ENUM_END(tls_client_certificate_type_names, TLS_ECDSA_FIXED_ECDH);
331:
332: ENUM(tls_ecc_curve_type_names, TLS_ECC_EXPLICIT_PRIME, TLS_ECC_NAMED_CURVE,
333: "EXPLICIT_PRIME",
334: "EXPLICIT_CHAR2",
335: "NAMED_CURVE",
336: );
337:
1.1.1.2 ! misho 338: ENUM_BEGIN(tls_named_group_names, TLS_SECT163K1, TLS_SECP521R1,
1.1 misho 339: "SECT163K1",
340: "SECT163R1",
341: "SECT163R2",
342: "SECT193R1",
343: "SECT193R2",
344: "SECT233K1",
345: "SECT233R1",
346: "SECT239K1",
347: "SECT283K1",
348: "SECT283R1",
349: "SECT409K1",
350: "SECT409R1",
351: "SECT571K1",
352: "SECT571R1",
353: "SECP160K1",
354: "SECP160R1",
355: "SECP160R2",
356: "SECP192K1",
357: "SECP192R1",
358: "SECP224K1",
359: "SECP224R1",
360: "SECP256K1",
361: "SECP256R1",
362: "SECP384R1",
363: "SECP521R1",
364: );
1.1.1.2 ! misho 365: ENUM_NEXT(tls_named_group_names, TLS_CURVE25519, TLS_CURVE448, TLS_SECP521R1,
! 366: "CURVE25519",
! 367: "CURVE448",
! 368: );
! 369: ENUM_NEXT(tls_named_group_names, TLS_FFDHE2048, TLS_FFDHE8192, TLS_CURVE448,
! 370: "FFDHE2048",
! 371: "FFDHE3072",
! 372: "FFDHE4096",
! 373: "FFDHE6144",
! 374: "FFDHE8192",
! 375: );
! 376: ENUM_END(tls_named_group_names, TLS_FFDHE8192);
1.1 misho 377:
378: ENUM(tls_ansi_point_format_names, TLS_ANSI_COMPRESSED, TLS_ANSI_HYBRID_Y,
379: "compressed",
380: "compressed y",
381: "uncompressed",
382: "uncompressed y",
383: "hybrid",
384: "hybrid y",
385: );
386:
387: ENUM(tls_ec_point_format_names,
388: TLS_EC_POINT_UNCOMPRESSED, TLS_EC_POINT_ANSIX962_COMPRESSED_CHAR2,
389: "uncompressed",
390: "ansiX962 compressed prime",
391: "ansiX962 compressed char2",
392: );
393:
394: typedef struct private_tls_crypto_t private_tls_crypto_t;
395:
396: /**
397: * Private data of an tls_crypto_t object.
398: */
399: struct private_tls_crypto_t {
400:
401: /**
402: * Public tls_crypto_t interface.
403: */
404: tls_crypto_t public;
405:
406: /**
407: * Protection layer
408: */
409: tls_protection_t *protection;
410:
411: /**
412: * List of supported/acceptable cipher suites
413: */
414: tls_cipher_suite_t *suites;
415:
416: /**
417: * Number of supported suites
418: */
419: int suite_count;
420:
421: /**
1.1.1.2 ! misho 422: * HKDF for TLS 1.3
! 423: */
! 424: tls_hkdf_t *hkdf;
! 425:
! 426: /**
1.1 misho 427: * Selected cipher suite
428: */
429: tls_cipher_suite_t suite;
430:
431: /**
432: * RSA supported?
433: */
434: bool rsa;
435:
436: /**
437: * ECDSA supported?
438: */
439: bool ecdsa;
440:
441: /**
442: * TLS context
443: */
444: tls_t *tls;
445:
446: /**
447: * TLS session cache
448: */
449: tls_cache_t *cache;
450:
451: /**
452: * All handshake data concatenated
453: */
454: chunk_t handshake;
455:
456: /**
457: * Connection state TLS PRF
458: */
459: tls_prf_t *prf;
460:
461: /**
462: * AEAD transform for inbound traffic
463: */
464: tls_aead_t *aead_in;
465:
466: /**
467: * AEAD transform for outbound traffic
468: */
469: tls_aead_t *aead_out;
470:
471: /**
472: * EAP-[T]TLS MSK
473: */
474: chunk_t msk;
475:
476: /**
477: * ASCII string constant used as seed for EAP-[T]TLS MSK PRF
478: */
479: char *msk_label;
480: };
481:
482: typedef struct {
483: tls_cipher_suite_t suite;
484: key_type_t key;
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;
490: size_t encr_size;
1.1.1.2 ! misho 491: tls_version_t min_version;
! 492: tls_version_t max_version;
1.1 misho 493: } suite_algs_t;
494:
495: /**
496: * Mapping suites to a set of algorithms
1.1.1.2 ! misho 497: *
! 498: * The order represents the descending preference of cipher suites and follows
! 499: * this rule set:
! 500: *
! 501: * 1. TLS 1.3 > Legacy TLS
! 502: * 2. AES > CAMELLIA > NULL
! 503: * 3. AES256 > AES128
! 504: * 4. GCM > CBC
! 505: * 5. ECDHE > DHE > NULL
! 506: * 6. ECDSA > RSA
! 507: * 7. SHA384 > SHA256 > SHA1
! 508: *
1.1 misho 509: */
510: static suite_algs_t suite_algs[] = {
1.1.1.2 ! misho 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,
! 514: KEY_ANY, MODP_NONE,
! 515: HASH_SHA384, PRF_UNDEFINED,
! 516: AUTH_HMAC_SHA2_384_384, ENCR_AES_GCM_ICV16, 32,
! 517: TLS_1_3, TLS_1_3,
! 518: },
! 519: { TLS_AES_128_GCM_SHA256,
! 520: KEY_ANY, MODP_NONE,
! 521: HASH_SHA256, PRF_UNDEFINED,
! 522: AUTH_HMAC_SHA2_256_256, ENCR_AES_GCM_ICV16, 16,
! 523: TLS_1_3, TLS_1_3,
! 524: },
! 525: { TLS_CHACHA20_POLY1305_SHA256,
! 526: KEY_ANY, MODP_NONE,
! 527: HASH_SHA256, PRF_UNDEFINED,
! 528: AUTH_HMAC_SHA2_256_256, ENCR_CHACHA20_POLY1305, 32,
! 529: TLS_1_3, TLS_1_3,
! 530: },
! 531: { TLS_AES_128_CCM_SHA256,
! 532: KEY_ANY, MODP_NONE,
! 533: HASH_SHA256, PRF_UNDEFINED,
! 534: AUTH_HMAC_SHA2_256_256, ENCR_AES_CCM_ICV16, 16,
! 535: TLS_1_3, TLS_1_3,
! 536: },
! 537: { TLS_AES_128_CCM_8_SHA256,
! 538: KEY_ANY, MODP_NONE,
! 539: HASH_SHA256, PRF_UNDEFINED,
! 540: AUTH_HMAC_SHA2_256_256, ENCR_AES_CCM_ICV8, 16,
! 541: TLS_1_3, TLS_1_3,
1.1 misho 542: },
1.1.1.2 ! misho 543: /* Legacy TLS cipher suites */
! 544: { TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384,
1.1 misho 545: KEY_ECDSA, ECP_384_BIT,
1.1.1.2 ! misho 546: HASH_SHA384, PRF_HMAC_SHA2_384,
! 547: AUTH_UNDEFINED, ENCR_AES_GCM_ICV16, 32,
! 548: TLS_1_2, TLS_1_2,
1.1 misho 549: },
550: { TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384,
551: KEY_ECDSA, ECP_384_BIT,
552: HASH_SHA384, PRF_HMAC_SHA2_384,
1.1.1.2 ! misho 553: AUTH_HMAC_SHA2_384_384, ENCR_AES_CBC, 32,
! 554: TLS_1_2, TLS_1_2,
! 555: },
! 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,
! 560: TLS_1_0, TLS_1_2,
1.1 misho 561: },
562: { TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256,
563: KEY_ECDSA, ECP_256_BIT,
564: HASH_SHA256, PRF_HMAC_SHA2_256,
1.1.1.2 ! misho 565: AUTH_UNDEFINED, ENCR_AES_GCM_ICV16, 16,
! 566: TLS_1_2, TLS_1_2,
1.1 misho 567: },
1.1.1.2 ! misho 568: { TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256,
! 569: KEY_ECDSA, ECP_256_BIT,
1.1 misho 570: HASH_SHA256, PRF_HMAC_SHA2_256,
1.1.1.2 ! misho 571: AUTH_HMAC_SHA2_256_256, ENCR_AES_CBC, 16,
! 572: TLS_1_2, TLS_1_2,
1.1 misho 573: },
1.1.1.2 ! misho 574: { TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA,
! 575: KEY_ECDSA, ECP_256_BIT,
1.1 misho 576: HASH_SHA256, PRF_HMAC_SHA2_256,
1.1.1.2 ! misho 577: AUTH_HMAC_SHA1_160, ENCR_AES_CBC, 16,
! 578: TLS_1_0, TLS_1_2,
1.1 misho 579: },
1.1.1.2 ! misho 580: { TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384,
1.1 misho 581: KEY_RSA, ECP_384_BIT,
1.1.1.2 ! misho 582: HASH_SHA384, PRF_HMAC_SHA2_384,
! 583: AUTH_UNDEFINED, ENCR_AES_GCM_ICV16, 32,
! 584: TLS_1_2, TLS_1_2,
1.1 misho 585: },
586: { TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384,
587: KEY_RSA, ECP_384_BIT,
588: HASH_SHA384, PRF_HMAC_SHA2_384,
1.1.1.2 ! misho 589: AUTH_HMAC_SHA2_384_384, ENCR_AES_CBC, 32,
! 590: TLS_1_2, TLS_1_2,
! 591: },
! 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,
! 596: TLS_1_0, TLS_1_2,
1.1 misho 597: },
598: { TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,
599: KEY_RSA, ECP_256_BIT,
600: HASH_SHA256, PRF_HMAC_SHA2_256,
1.1.1.2 ! misho 601: AUTH_UNDEFINED, ENCR_AES_GCM_ICV16, 16,
! 602: TLS_1_2, TLS_1_2,
1.1 misho 603: },
1.1.1.2 ! misho 604: { TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256,
! 605: KEY_RSA, ECP_256_BIT,
1.1 misho 606: HASH_SHA256, PRF_HMAC_SHA2_256,
1.1.1.2 ! misho 607: AUTH_HMAC_SHA2_256_256, ENCR_AES_CBC, 16,
! 608: TLS_1_2, TLS_1_2,
1.1 misho 609: },
1.1.1.2 ! misho 610: { TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA,
! 611: KEY_RSA, ECP_256_BIT,
1.1 misho 612: HASH_SHA256, PRF_HMAC_SHA2_256,
1.1.1.2 ! misho 613: AUTH_HMAC_SHA1_160, ENCR_AES_CBC, 16,
! 614: TLS_1_0, TLS_1_2,
! 615: },
! 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,
! 620: TLS_1_2, TLS_1_2,
1.1 misho 621: },
622: { TLS_DHE_RSA_WITH_AES_256_CBC_SHA256,
623: KEY_RSA, MODP_4096_BIT,
624: HASH_SHA256, PRF_HMAC_SHA2_256,
1.1.1.2 ! misho 625: AUTH_HMAC_SHA2_256_256, ENCR_AES_CBC, 32,
! 626: TLS_1_2, TLS_1_2,
1.1 misho 627: },
1.1.1.2 ! misho 628: { TLS_DHE_RSA_WITH_AES_256_CBC_SHA,
1.1 misho 629: KEY_RSA, MODP_3072_BIT,
630: HASH_SHA256, PRF_HMAC_SHA2_256,
1.1.1.2 ! misho 631: AUTH_HMAC_SHA1_160, ENCR_AES_CBC, 32,
! 632: SSL_3_0, TLS_1_2,
1.1 misho 633: },
1.1.1.2 ! misho 634: { TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA256,
1.1 misho 635: KEY_RSA, MODP_4096_BIT,
636: HASH_SHA256, PRF_HMAC_SHA2_256,
1.1.1.2 ! misho 637: AUTH_HMAC_SHA2_256_256, ENCR_CAMELLIA_CBC, 32,
! 638: TLS_1_2, TLS_1_2,
1.1 misho 639: },
1.1.1.2 ! misho 640: { TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA,
1.1 misho 641: KEY_RSA, MODP_3072_BIT,
642: HASH_SHA256, PRF_HMAC_SHA2_256,
1.1.1.2 ! misho 643: AUTH_HMAC_SHA1_160, ENCR_CAMELLIA_CBC, 32,
! 644: SSL_3_0, TLS_1_2,
1.1 misho 645: },
1.1.1.2 ! misho 646: { TLS_DHE_RSA_WITH_AES_128_GCM_SHA256,
1.1 misho 647: KEY_RSA, MODP_3072_BIT,
648: HASH_SHA256, PRF_HMAC_SHA2_256,
1.1.1.2 ! misho 649: AUTH_UNDEFINED, ENCR_AES_GCM_ICV16, 16,
! 650: TLS_1_2, TLS_1_2,
1.1 misho 651: },
1.1.1.2 ! misho 652: { TLS_DHE_RSA_WITH_AES_128_CBC_SHA256,
! 653: KEY_RSA, MODP_3072_BIT,
1.1 misho 654: HASH_SHA256, PRF_HMAC_SHA2_256,
1.1.1.2 ! misho 655: AUTH_HMAC_SHA2_256_256, ENCR_AES_CBC, 16,
! 656: TLS_1_2, TLS_1_2,
1.1 misho 657: },
1.1.1.2 ! misho 658: { TLS_DHE_RSA_WITH_AES_128_CBC_SHA,
1.1 misho 659: KEY_RSA, MODP_2048_BIT,
1.1.1.2 ! misho 660: HASH_SHA256,PRF_HMAC_SHA2_256,
! 661: AUTH_HMAC_SHA1_160, ENCR_AES_CBC, 16,
! 662: SSL_3_0, TLS_1_2,
1.1 misho 663: },
1.1.1.2 ! misho 664: { TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA256,
! 665: KEY_RSA, MODP_3072_BIT,
1.1 misho 666: HASH_SHA256, PRF_HMAC_SHA2_256,
1.1.1.2 ! misho 667: AUTH_HMAC_SHA2_256_256, ENCR_CAMELLIA_CBC, 16,
! 668: TLS_1_2, TLS_1_2,
1.1 misho 669: },
1.1.1.2 ! misho 670: { TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA,
! 671: KEY_RSA, MODP_2048_BIT,
1.1 misho 672: HASH_SHA256, PRF_HMAC_SHA2_256,
1.1.1.2 ! misho 673: AUTH_HMAC_SHA1_160, ENCR_CAMELLIA_CBC, 16,
! 674: SSL_3_0, TLS_1_2,
1.1 misho 675: },
1.1.1.2 ! misho 676: { TLS_RSA_WITH_AES_256_GCM_SHA384,
1.1 misho 677: KEY_RSA, MODP_NONE,
1.1.1.2 ! misho 678: HASH_SHA384, PRF_HMAC_SHA2_384,
! 679: AUTH_UNDEFINED, ENCR_AES_GCM_ICV16, 32,
! 680: TLS_1_2, TLS_1_2,
1.1 misho 681: },
682: { TLS_RSA_WITH_AES_256_CBC_SHA256,
683: KEY_RSA, MODP_NONE,
684: HASH_SHA256, PRF_HMAC_SHA2_256,
1.1.1.2 ! misho 685: AUTH_HMAC_SHA2_256_256, ENCR_AES_CBC, 32,
! 686: TLS_1_2, TLS_1_2,
1.1 misho 687: },
1.1.1.2 ! misho 688: { TLS_RSA_WITH_AES_256_CBC_SHA,
1.1 misho 689: KEY_RSA, MODP_NONE,
690: HASH_SHA256, PRF_HMAC_SHA2_256,
1.1.1.2 ! misho 691: AUTH_HMAC_SHA1_160, ENCR_AES_CBC, 32,
! 692: SSL_3_0, TLS_1_2,
1.1 misho 693: },
1.1.1.2 ! misho 694: { TLS_RSA_WITH_AES_128_GCM_SHA256,
1.1 misho 695: KEY_RSA, MODP_NONE,
696: HASH_SHA256, PRF_HMAC_SHA2_256,
1.1.1.2 ! misho 697: AUTH_UNDEFINED, ENCR_AES_GCM_ICV16, 16,
! 698: TLS_1_2, TLS_1_2,
1.1 misho 699: },
1.1.1.2 ! misho 700: { TLS_RSA_WITH_AES_128_CBC_SHA256,
1.1 misho 701: KEY_RSA, MODP_NONE,
702: HASH_SHA256, PRF_HMAC_SHA2_256,
1.1.1.2 ! misho 703: AUTH_HMAC_SHA2_256_256, ENCR_AES_CBC, 16,
! 704: TLS_1_2, TLS_1_2,
1.1 misho 705: },
1.1.1.2 ! misho 706: { TLS_RSA_WITH_AES_128_CBC_SHA,
1.1 misho 707: KEY_RSA, MODP_NONE,
708: HASH_SHA256, PRF_HMAC_SHA2_256,
1.1.1.2 ! misho 709: AUTH_HMAC_SHA1_160, ENCR_AES_CBC, 16,
! 710: SSL_3_0, TLS_1_2,
1.1 misho 711: },
712: { TLS_RSA_WITH_CAMELLIA_256_CBC_SHA256,
713: KEY_RSA, MODP_NONE,
714: HASH_SHA256, PRF_HMAC_SHA2_256,
1.1.1.2 ! misho 715: AUTH_HMAC_SHA2_256_256, ENCR_CAMELLIA_CBC, 32,
! 716: TLS_1_2, TLS_1_2,
1.1 misho 717: },
1.1.1.2 ! misho 718: { TLS_RSA_WITH_CAMELLIA_256_CBC_SHA,
! 719: KEY_RSA, MODP_NONE,
1.1 misho 720: HASH_SHA256, PRF_HMAC_SHA2_256,
1.1.1.2 ! misho 721: AUTH_HMAC_SHA1_160, ENCR_CAMELLIA_CBC, 32,
! 722: SSL_3_0, TLS_1_2,
1.1 misho 723: },
1.1.1.2 ! misho 724: { TLS_RSA_WITH_CAMELLIA_128_CBC_SHA256,
! 725: KEY_RSA, MODP_NONE,
1.1 misho 726: HASH_SHA256, PRF_HMAC_SHA2_256,
1.1.1.2 ! misho 727: AUTH_HMAC_SHA2_256_256, ENCR_CAMELLIA_CBC, 16,
! 728: TLS_1_2, TLS_1_2,
1.1 misho 729: },
1.1.1.2 ! misho 730: { TLS_RSA_WITH_CAMELLIA_128_CBC_SHA,
1.1 misho 731: KEY_RSA, MODP_NONE,
732: HASH_SHA256, PRF_HMAC_SHA2_256,
1.1.1.2 ! misho 733: AUTH_HMAC_SHA1_160, ENCR_CAMELLIA_CBC, 16,
! 734: SSL_3_0, TLS_1_2,
1.1 misho 735: },
736: { TLS_ECDHE_ECDSA_WITH_NULL_SHA,
737: KEY_ECDSA, ECP_256_BIT,
738: HASH_SHA256, PRF_HMAC_SHA2_256,
1.1.1.2 ! misho 739: AUTH_HMAC_SHA1_160, ENCR_NULL, 0,
! 740: TLS_1_0, TLS_1_2,
1.1 misho 741: },
742: { TLS_ECDHE_RSA_WITH_NULL_SHA,
743: KEY_ECDSA, ECP_256_BIT,
744: HASH_SHA256, PRF_HMAC_SHA2_256,
1.1.1.2 ! misho 745: AUTH_HMAC_SHA1_160, ENCR_NULL, 0,
! 746: TLS_1_0, TLS_1_2,
1.1 misho 747: },
748: { TLS_RSA_WITH_NULL_SHA256,
749: KEY_RSA, MODP_NONE,
750: HASH_SHA256, PRF_HMAC_SHA2_256,
1.1.1.2 ! misho 751: AUTH_HMAC_SHA2_256_256, ENCR_NULL, 0,
! 752: TLS_1_2, TLS_1_2,
1.1 misho 753: },
1.1.1.2 ! misho 754: { TLS_RSA_WITH_NULL_SHA,
1.1 misho 755: KEY_RSA, MODP_NONE,
756: HASH_SHA256, PRF_HMAC_SHA2_256,
1.1.1.2 ! misho 757: AUTH_HMAC_SHA1_160, ENCR_NULL, 0,
! 758: SSL_3_0, TLS_1_2,
1.1 misho 759: },
760: };
761:
762: /**
763: * Look up algorithms by a suite
764: */
765: static suite_algs_t *find_suite(tls_cipher_suite_t suite)
766: {
767: int i;
768:
769: for (i = 0; i < countof(suite_algs); i++)
770: {
771: if (suite_algs[i].suite == suite)
772: {
773: return &suite_algs[i];
774: }
775: }
776: return NULL;
777: }
778:
779: /**
780: * Filter a suite list using a transform enumerator
781: */
782: static void filter_suite(suite_algs_t suites[], int *count, int offset,
783: enumerator_t*(*create_enumerator)(crypto_factory_t*))
784: {
785: const char *plugin_name;
786: suite_algs_t current;
787: int *current_alg, i, remaining = 0;
788: enumerator_t *enumerator;
789:
790: memset(¤t, 0, sizeof(current));
791: current_alg = (int*)((char*)¤t + offset);
792:
793: for (i = 0; i < *count; i++)
794: {
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];
799: remaining++;
800: continue;
801: }
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];
806: remaining++;
807: continue;
808: }
809: enumerator = create_enumerator(lib->crypto);
810: while (enumerator->enumerate(enumerator, current_alg, &plugin_name))
811: {
812: if (current.encr && current.encr != suites[i].encr)
813: {
814: if (suites[i].encr != ENCR_NULL)
815: { /* skip, ENCR does not match nor is NULL */
816: continue;
817: }
818: }
819: if (current.mac && current.mac != suites[i].mac)
820: {
821: if (suites[i].mac != AUTH_UNDEFINED)
822: { /* skip, MAC does not match nor is it undefined */
823: continue;
824: }
825: }
826: if (current.prf && current.prf != suites[i].prf)
1.1.1.2 ! misho 827: {
! 828: if (suites[i].prf != PRF_UNDEFINED)
! 829: {
! 830: /* skip, PRF does not match nor is it undefined */
! 831: continue;
! 832: }
1.1 misho 833: }
834: if (current.hash && current.hash != suites[i].hash)
835: { /* skip, hash does not match */
836: continue;
837: }
838: if (current.dh && current.dh != suites[i].dh)
839: {
1.1.1.2 ! misho 840: if (suites[i].dh != MODP_NONE &&
! 841: !(diffie_hellman_group_is_ec(current.dh) &&
! 842: diffie_hellman_group_is_ec(suites[i].dh)))
! 843: { /* skip DH group, does not match nor NONE nor both ECDH */
1.1 misho 844: continue;
845: }
846: }
847: /* suite supported, apply */
848: suites[remaining] = suites[i];
849: remaining++;
850: break;
851: }
852: enumerator->destroy(enumerator);
853: }
854: *count = remaining;
855: }
856:
857: /**
858: * Purge NULL encryption cipher suites from list
859: */
860: static void filter_null_suites(suite_algs_t suites[], int *count)
861: {
862: int i, remaining = 0;
863:
864: for (i = 0; i < *count; i++)
865: {
866: if (suites[i].encr != ENCR_NULL)
867: {
868: suites[remaining] = suites[i];
869: remaining++;
870: }
871: }
872: *count = remaining;
873: }
874:
875: /**
876: * Purge suites using a given key type
877: */
878: static void filter_key_suites(private_tls_crypto_t *this,
879: suite_algs_t suites[], int *count, key_type_t key)
880: {
881: int i, remaining = 0;
882:
883: DBG2(DBG_TLS, "disabling %N suites, no backend found", key_type_names, key);
884: for (i = 0; i < *count; i++)
885: {
886: if (suites[i].key != key)
887: {
888: suites[remaining] = suites[i];
889: remaining++;
890: }
891: }
892: *count = remaining;
893: }
894:
895: /**
896: * Filter suites by key exchange user config
897: */
898: static void filter_key_exchange_config_suites(private_tls_crypto_t *this,
899: suite_algs_t suites[], int *count)
900: {
901: enumerator_t *enumerator;
902: int i, remaining = 0;
903: char *token, *config;
904:
905: config = lib->settings->get_str(lib->settings, "%s.tls.key_exchange", NULL,
906: lib->ns);
907: if (config)
908: {
909: for (i = 0; i < *count; i++)
910: {
911: enumerator = enumerator_create_token(config, ",", " ");
912: while (enumerator->enumerate(enumerator, &token))
913: {
914: if (strcaseeq(token, "ecdhe-ecdsa") &&
915: diffie_hellman_group_is_ec(suites[i].dh) &&
916: suites[i].key == KEY_ECDSA)
917: {
918: suites[remaining++] = suites[i];
919: break;
920: }
921: if (strcaseeq(token, "ecdhe-rsa") &&
922: diffie_hellman_group_is_ec(suites[i].dh) &&
923: suites[i].key == KEY_RSA)
924: {
925: suites[remaining++] = suites[i];
926: break;
927: }
928: if (strcaseeq(token, "dhe-rsa") &&
929: !diffie_hellman_group_is_ec(suites[i].dh) &&
930: suites[i].dh != MODP_NONE &&
931: suites[i].key == KEY_RSA)
932: {
933: suites[remaining++] = suites[i];
934: break;
935: }
936: if (strcaseeq(token, "rsa") &&
937: suites[i].dh == MODP_NONE &&
938: suites[i].key == KEY_RSA)
939: {
940: suites[remaining++] = suites[i];
941: break;
942: }
943: }
944: enumerator->destroy(enumerator);
945: }
946: *count = remaining;
947: }
948: }
949:
950: /**
951: * Filter suites by cipher user config
952: */
953: static void filter_cipher_config_suites(private_tls_crypto_t *this,
954: suite_algs_t suites[], int *count)
955: {
956: enumerator_t *enumerator;
957: int i, remaining = 0;
958: char *token, *config;
959:
960: config = lib->settings->get_str(lib->settings, "%s.tls.cipher", NULL,
961: lib->ns);
962: if (config)
963: {
964: for (i = 0; i < *count; i++)
965: {
966: enumerator = enumerator_create_token(config, ",", " ");
967: while (enumerator->enumerate(enumerator, &token))
968: {
1.1.1.2 ! misho 969: const proposal_token_t *tok;
! 970:
! 971: tok = lib->proposal->get_token(lib->proposal, token);
! 972: if (tok != NULL && tok->type == ENCRYPTION_ALGORITHM &&
! 973: suites[i].encr == tok->algorithm &&
! 974: (!tok->keysize || suites[i].encr_size == tok->keysize / 8))
1.1 misho 975: {
976: suites[remaining++] = suites[i];
977: break;
978: }
979: }
980: enumerator->destroy(enumerator);
981: }
982: *count = remaining;
983: }
984: }
985:
986: /**
987: * Filter suites by mac user config
988: */
989: static void filter_mac_config_suites(private_tls_crypto_t *this,
990: suite_algs_t suites[], int *count)
991: {
992: enumerator_t *enumerator;
993: int i, remaining = 0;
994: char *token, *config;
995:
996: config = lib->settings->get_str(lib->settings, "%s.tls.mac", NULL,
997: lib->ns);
998: if (config)
999: {
1000: for (i = 0; i < *count; i++)
1001: {
1002: enumerator = enumerator_create_token(config, ",", " ");
1003: while (enumerator->enumerate(enumerator, &token))
1004: {
1005: if (strcaseeq(token, "sha1") &&
1006: suites[i].mac == AUTH_HMAC_SHA1_160)
1007: {
1008: suites[remaining++] = suites[i];
1009: break;
1010: }
1011: if (strcaseeq(token, "sha256") &&
1012: suites[i].mac == AUTH_HMAC_SHA2_256_256)
1013: {
1014: suites[remaining++] = suites[i];
1015: break;
1016: }
1017: if (strcaseeq(token, "sha384") &&
1018: suites[i].mac == AUTH_HMAC_SHA2_384_384)
1019: {
1020: suites[remaining++] = suites[i];
1021: break;
1022: }
1023: }
1024: enumerator->destroy(enumerator);
1025: }
1026: *count = remaining;
1027: }
1028: }
1029:
1030: /**
1031: * Filter for specific suites specified in strongswan.conf
1032: */
1033: static void filter_specific_config_suites(private_tls_crypto_t *this,
1034: suite_algs_t suites[], int *count)
1035: {
1036: enumerator_t *enumerator;
1037: int i, remaining = 0, suite;
1038: char *token, *config;
1039:
1040: config = lib->settings->get_str(lib->settings, "%s.tls.suites", NULL,
1041: lib->ns);
1042: if (config)
1043: {
1044: for (i = 0; i < *count; i++)
1045: {
1046: enumerator = enumerator_create_token(config, ",", " ");
1047: while (enumerator->enumerate(enumerator, &token))
1048: {
1049: if (enum_from_name(tls_cipher_suite_names, token, &suite) &&
1050: suite == suites[i].suite)
1051: {
1052: suites[remaining++] = suites[i];
1053: break;
1054: }
1055: }
1056: enumerator->destroy(enumerator);
1057: }
1058: *count = remaining;
1059: }
1060: }
1061:
1062: /**
1.1.1.2 ! misho 1063: * Filter key exchange curves by curve user config
! 1064: */
! 1065: static bool filter_curve_config(tls_named_group_t curve)
! 1066: {
! 1067: enumerator_t *enumerator;
! 1068: char *token, *config;
! 1069:
! 1070: config = lib->settings->get_str(lib->settings, "%s.tls.ke_group", NULL,
! 1071: lib->ns);
! 1072: if (config)
! 1073: {
! 1074: enumerator = enumerator_create_token(config, ",", " ");
! 1075: while (enumerator->enumerate(enumerator, &token))
! 1076: {
! 1077: const proposal_token_t *tok;
! 1078:
! 1079: tok = lib->proposal->get_token(lib->proposal, token);
! 1080: if (tok != NULL && tok->type == DIFFIE_HELLMAN_GROUP &&
! 1081: curve == tls_ec_group_to_curve(tok->algorithm))
! 1082: {
! 1083: enumerator->destroy(enumerator);
! 1084: return TRUE;
! 1085: }
! 1086: }
! 1087: enumerator->destroy(enumerator);
! 1088: }
! 1089: return !config;
! 1090: }
! 1091:
! 1092: /**
1.1 misho 1093: * Filter out unsupported suites on given suite array
1094: */
1095: static void filter_unsupported_suites(suite_algs_t suites[], int *count)
1096: {
1097: /* filter suite list by each algorithm */
1098: filter_suite(suites, count, offsetof(suite_algs_t, encr),
1099: lib->crypto->create_aead_enumerator);
1100: filter_suite(suites, count, offsetof(suite_algs_t, prf),
1101: lib->crypto->create_prf_enumerator);
1.1.1.2 ! misho 1102: filter_suite(suites, count, offsetof(suite_algs_t, encr),
! 1103: lib->crypto->create_crypter_enumerator);
! 1104: filter_suite(suites, count, offsetof(suite_algs_t, mac),
! 1105: lib->crypto->create_signer_enumerator);
1.1 misho 1106: filter_suite(suites, count, offsetof(suite_algs_t, hash),
1107: lib->crypto->create_hasher_enumerator);
1108: filter_suite(suites, count, offsetof(suite_algs_t, dh),
1109: lib->crypto->create_dh_enumerator);
1110: }
1111:
1112: /**
1113: * Initialize the cipher suite list
1114: */
1.1.1.2 ! misho 1115: static void build_cipher_suite_list(private_tls_crypto_t *this)
1.1 misho 1116: {
1117: suite_algs_t suites[countof(suite_algs)];
1.1.1.2 ! misho 1118: tls_version_t min_version, max_version, new_min_version, new_max_version;
! 1119: bool require_encryption = TRUE;
! 1120: int count = 0, i;
1.1 misho 1121:
1.1.1.2 ! misho 1122: switch (this->tls->get_purpose(this->tls))
! 1123: {
! 1124: case TLS_PURPOSE_EAP_TLS:
! 1125: require_encryption = FALSE;
! 1126: break;
! 1127: case TLS_PURPOSE_GENERIC:
! 1128: if (this->tls->get_flags(this->tls) & TLS_FLAG_ENCRYPTION_OPTIONAL)
! 1129: {
! 1130: require_encryption = FALSE;
! 1131: }
! 1132: break;
! 1133: default:
! 1134: break;
! 1135: }
! 1136:
! 1137: min_version = this->tls->get_version_min(this->tls);
! 1138: max_version = this->tls->get_version_max(this->tls);
! 1139:
! 1140: /* copy all suites appropriate for the current min/max versions */
! 1141: for (i = 0; i < countof(suite_algs); i++)
1.1 misho 1142: {
1.1.1.2 ! misho 1143: if (suite_algs[i].min_version <= max_version &&
! 1144: suite_algs[i].max_version >= min_version)
! 1145: {
! 1146: suites[count++] = suite_algs[i];
! 1147: }
1.1 misho 1148: }
1149:
1150: if (require_encryption)
1151: {
1152: filter_null_suites(suites, &count);
1153: }
1154: if (!this->rsa)
1155: {
1156: filter_key_suites(this, suites, &count, KEY_RSA);
1157: }
1158: if (!this->ecdsa)
1159: {
1160: filter_key_suites(this, suites, &count, KEY_ECDSA);
1161: }
1162:
1163: filter_unsupported_suites(suites, &count);
1164:
1165: /* filter suites with strongswan.conf options */
1166: filter_key_exchange_config_suites(this, suites, &count);
1167: filter_cipher_config_suites(this, suites, &count);
1168: filter_mac_config_suites(this, suites, &count);
1169: filter_specific_config_suites(this, suites, &count);
1170:
1171: free(this->suites);
1172: this->suite_count = count;
1173: this->suites = malloc(sizeof(tls_cipher_suite_t) * count);
1174:
1175: DBG2(DBG_TLS, "%d supported TLS cipher suites:", count);
1.1.1.2 ! misho 1176: new_min_version = max_version;
! 1177: new_max_version = min_version;
1.1 misho 1178: for (i = 0; i < count; i++)
1179: {
1180: DBG2(DBG_TLS, " %N", tls_cipher_suite_names, suites[i].suite);
1181: this->suites[i] = suites[i].suite;
1.1.1.2 ! misho 1182:
! 1183: /* set TLS min/max versions appropriate to the final cipher suites */
! 1184: new_max_version = max(new_max_version, suites[i].max_version);
! 1185: new_min_version = min(new_min_version, suites[i].min_version);
! 1186: }
! 1187: new_max_version = min(new_max_version, max_version);
! 1188: new_min_version = max(new_min_version, min_version);
! 1189:
! 1190: if ((min_version != new_min_version || max_version != new_max_version) &&
! 1191: this->tls->set_version(this->tls, new_min_version, new_max_version))
! 1192: {
! 1193: DBG2(DBG_TLS, "TLS min/max %N/%N according to the cipher suites",
! 1194: tls_numeric_version_names, new_min_version,
! 1195: tls_numeric_version_names, new_max_version);
1.1 misho 1196: }
1197: }
1198:
1199: METHOD(tls_crypto_t, get_cipher_suites, int,
1200: private_tls_crypto_t *this, tls_cipher_suite_t **suites)
1201: {
1.1.1.2 ! misho 1202: if (!this->suites)
! 1203: {
! 1204: build_cipher_suite_list(this);
! 1205: }
! 1206: if (suites)
! 1207: {
! 1208: *suites = this->suites;
! 1209: }
1.1 misho 1210: return this->suite_count;
1211: }
1212:
1213: /**
1214: * Create NULL encryption transforms
1215: */
1216: static bool create_null(private_tls_crypto_t *this, suite_algs_t *algs)
1217: {
1218: this->aead_in = tls_aead_create_null(algs->mac);
1219: this->aead_out = tls_aead_create_null(algs->mac);
1220: if (!this->aead_in || !this->aead_out)
1221: {
1222: DBG1(DBG_TLS, "selected TLS MAC %N not supported",
1223: integrity_algorithm_names, algs->mac);
1224: return FALSE;
1225: }
1226: return TRUE;
1227: }
1228:
1229: /**
1230: * Create traditional transforms
1231: */
1232: static bool create_traditional(private_tls_crypto_t *this, suite_algs_t *algs)
1233: {
1.1.1.2 ! misho 1234: if (this->tls->get_version_max(this->tls) < TLS_1_1)
1.1 misho 1235: {
1236: this->aead_in = tls_aead_create_implicit(algs->mac,
1237: algs->encr, algs->encr_size);
1238: this->aead_out = tls_aead_create_implicit(algs->mac,
1239: algs->encr, algs->encr_size);
1240: }
1241: else
1242: {
1243: this->aead_in = tls_aead_create_explicit(algs->mac,
1244: algs->encr, algs->encr_size);
1245: this->aead_out = tls_aead_create_explicit(algs->mac,
1246: algs->encr, algs->encr_size);
1247: }
1248: if (!this->aead_in || !this->aead_out)
1249: {
1250: DBG1(DBG_TLS, "selected TLS transforms %N-%u-%N not supported",
1251: encryption_algorithm_names, algs->encr, algs->encr_size * 8,
1252: integrity_algorithm_names, algs->mac);
1253: return FALSE;
1254: }
1255: return TRUE;
1256: }
1257:
1258: /**
1259: * Create AEAD transforms
1260: */
1261: static bool create_aead(private_tls_crypto_t *this, suite_algs_t *algs)
1262: {
1.1.1.2 ! misho 1263: if (this->tls->get_version_max(this->tls) < TLS_1_3)
! 1264: {
! 1265: this->aead_in = tls_aead_create_aead(algs->encr, algs->encr_size);
! 1266: this->aead_out = tls_aead_create_aead(algs->encr, algs->encr_size);
! 1267: }
! 1268: else
! 1269: {
! 1270: this->aead_in = tls_aead_create_seq(algs->encr, algs->encr_size);
! 1271: this->aead_out = tls_aead_create_seq(algs->encr, algs->encr_size);
! 1272: }
1.1 misho 1273: if (!this->aead_in || !this->aead_out)
1274: {
1275: DBG1(DBG_TLS, "selected TLS transforms %N-%u not supported",
1276: encryption_algorithm_names, algs->encr, algs->encr_size * 8);
1277: return FALSE;
1278: }
1279: return TRUE;
1280: }
1281:
1282: /**
1283: * Clean up and unset AEAD transforms
1284: */
1285: static void destroy_aeads(private_tls_crypto_t *this)
1286: {
1287: DESTROY_IF(this->aead_in);
1288: DESTROY_IF(this->aead_out);
1289: this->aead_in = this->aead_out = NULL;
1290: }
1291:
1292: /**
1293: * Create crypto primitives
1294: */
1295: static bool create_ciphers(private_tls_crypto_t *this, suite_algs_t *algs)
1296: {
1297: destroy_aeads(this);
1.1.1.2 ! misho 1298: DESTROY_IF(this->hkdf);
1.1 misho 1299: DESTROY_IF(this->prf);
1.1.1.2 ! misho 1300: if (this->tls->get_version_max(this->tls) < TLS_1_3)
1.1 misho 1301: {
1.1.1.2 ! misho 1302: if (this->tls->get_version_max(this->tls) < TLS_1_2)
! 1303: {
! 1304: this->prf = tls_prf_create_10();
! 1305: }
! 1306: else
! 1307: {
! 1308: this->prf = tls_prf_create_12(algs->prf);
! 1309: }
! 1310: if (!this->prf)
! 1311: {
! 1312: DBG1(DBG_TLS, "selected TLS PRF not supported");
! 1313: return FALSE;
! 1314: }
1.1 misho 1315: }
1316: else
1317: {
1.1.1.2 ! misho 1318: this->hkdf = tls_hkdf_create(algs->hash, chunk_empty);
! 1319: if (!this->hkdf)
! 1320: {
! 1321: DBG1(DBG_TLS, "TLS HKDF creation unsuccessful");
! 1322: return FALSE;
! 1323: }
1.1 misho 1324: }
1325: if (algs->encr == ENCR_NULL)
1326: {
1327: if (create_null(this, algs))
1328: {
1329: return TRUE;
1330: }
1331: }
1332: else if (encryption_algorithm_is_aead(algs->encr))
1333: {
1334: if (create_aead(this, algs))
1335: {
1336: return TRUE;
1337: }
1338: }
1339: else
1340: {
1341: if (create_traditional(this, algs))
1342: {
1343: return TRUE;
1344: }
1345: }
1346: destroy_aeads(this);
1347: return FALSE;
1348: }
1349:
1350: METHOD(tls_crypto_t, select_cipher_suite, tls_cipher_suite_t,
1351: private_tls_crypto_t *this, tls_cipher_suite_t *suites, int count,
1352: key_type_t key)
1353: {
1354: suite_algs_t *algs;
1355: int i, j;
1356:
1357: for (i = 0; i < this->suite_count; i++)
1358: {
1359: for (j = 0; j < count; j++)
1360: {
1361: if (this->suites[i] == suites[j])
1362: {
1363: algs = find_suite(this->suites[i]);
1364: if (algs)
1365: {
1.1.1.2 ! misho 1366: if (key == KEY_ANY || key == algs->key ||
! 1367: (algs->key == KEY_ECDSA && key == KEY_ED25519) ||
! 1368: (algs->key == KEY_ECDSA && key == KEY_ED448))
1.1 misho 1369: {
1370: if (create_ciphers(this, algs))
1371: {
1372: this->suite = this->suites[i];
1373: return this->suite;
1374: }
1375: }
1376: }
1377: }
1378: }
1379: }
1380: return 0;
1381: }
1382:
1383: /**
1.1.1.2 ! misho 1384: * Parameters for RSA/PSS signature schemes
1.1 misho 1385: */
1.1.1.2 ! misho 1386: #define PSS_PARAMS(bits) static rsa_pss_params_t pss_params_sha##bits = { \
! 1387: .hash = HASH_SHA##bits, \
! 1388: .mgf1_hash = HASH_SHA##bits, \
! 1389: .salt_len = HASH_SIZE_SHA##bits, \
! 1390: }
! 1391:
! 1392: PSS_PARAMS(256);
! 1393: PSS_PARAMS(384);
! 1394: PSS_PARAMS(512);
! 1395:
! 1396: typedef struct {
! 1397: tls_signature_scheme_t sig;
! 1398: signature_params_t params;
! 1399: /* min/max versions for use in CertificateVerify */
! 1400: tls_version_t min_version;
! 1401: tls_version_t max_version;
! 1402: } scheme_algs_t;
! 1403:
! 1404: /**
! 1405: * Map TLS signature schemes, ordered by preference
! 1406: */
! 1407: static scheme_algs_t schemes[] = {
! 1408: { TLS_SIG_ECDSA_SHA256, { .scheme = SIGN_ECDSA_WITH_SHA256_DER },
! 1409: TLS_1_0, TLS_1_3 },
! 1410: { TLS_SIG_ECDSA_SHA384, { .scheme = SIGN_ECDSA_WITH_SHA384_DER },
! 1411: TLS_1_0, TLS_1_3 },
! 1412: { TLS_SIG_ECDSA_SHA512, { .scheme = SIGN_ECDSA_WITH_SHA512_DER },
! 1413: TLS_1_0, TLS_1_3 },
! 1414: { TLS_SIG_ED25519, { .scheme = SIGN_ED25519 },
! 1415: TLS_1_0, TLS_1_3 },
! 1416: { TLS_SIG_ED448, { .scheme = SIGN_ED448 },
! 1417: TLS_1_0, TLS_1_3 },
! 1418: { TLS_SIG_RSA_PSS_RSAE_SHA256, { .scheme = SIGN_RSA_EMSA_PSS, .params = &pss_params_sha256, },
! 1419: TLS_1_2, TLS_1_3 },
! 1420: { TLS_SIG_RSA_PSS_RSAE_SHA384, { .scheme = SIGN_RSA_EMSA_PSS, .params = &pss_params_sha384, },
! 1421: TLS_1_2, TLS_1_3 },
! 1422: { TLS_SIG_RSA_PSS_RSAE_SHA512, { .scheme = SIGN_RSA_EMSA_PSS, .params = &pss_params_sha512, },
! 1423: TLS_1_2, TLS_1_3 },
! 1424: /* the parameters for the next three should actually be taken from the
! 1425: * public key, we currently don't have an API for that, so assume defaults */
! 1426: { TLS_SIG_RSA_PSS_PSS_SHA256, { .scheme = SIGN_RSA_EMSA_PSS, .params = &pss_params_sha256, },
! 1427: TLS_1_2, TLS_1_3 },
! 1428: { TLS_SIG_RSA_PSS_PSS_SHA384, { .scheme = SIGN_RSA_EMSA_PSS, .params = &pss_params_sha384, },
! 1429: TLS_1_2, TLS_1_3 },
! 1430: { TLS_SIG_RSA_PSS_PSS_SHA512, { .scheme = SIGN_RSA_EMSA_PSS, .params = &pss_params_sha512, },
! 1431: TLS_1_2, TLS_1_3 },
! 1432: { TLS_SIG_RSA_PKCS1_SHA256, { .scheme = SIGN_RSA_EMSA_PKCS1_SHA2_256 },
! 1433: TLS_1_0, TLS_1_2 },
! 1434: { TLS_SIG_RSA_PKCS1_SHA384, { .scheme = SIGN_RSA_EMSA_PKCS1_SHA2_384 },
! 1435: TLS_1_0, TLS_1_2 },
! 1436: { TLS_SIG_RSA_PKCS1_SHA512, { .scheme = SIGN_RSA_EMSA_PKCS1_SHA2_512 },
! 1437: TLS_1_0, TLS_1_2 },
1.1 misho 1438: };
1439:
1.1.1.2 ! misho 1440: /**
! 1441: * Filter signature scheme config
! 1442: */
! 1443: static bool filter_signature_scheme_config(tls_signature_scheme_t signature)
1.1 misho 1444: {
1.1.1.2 ! misho 1445: enumerator_t *enumerator;
! 1446: char *token, *config;
1.1 misho 1447:
1.1.1.2 ! misho 1448: config = lib->settings->get_str(lib->settings, "%s.tls.signature", NULL,
! 1449: lib->ns);
! 1450: if (config)
1.1 misho 1451: {
1.1.1.2 ! misho 1452: enumerator = enumerator_create_token(config, ",", " ");
! 1453: while (enumerator->enumerate(enumerator, &token))
1.1 misho 1454: {
1.1.1.2 ! misho 1455: tls_signature_scheme_t sig;
! 1456:
! 1457: if (enum_from_name(tls_signature_scheme_names, token, &sig) &&
! 1458: sig == signature)
! 1459: {
! 1460: enumerator->destroy(enumerator);
! 1461: return TRUE;
! 1462: }
1.1 misho 1463: }
1.1.1.2 ! misho 1464: enumerator->destroy(enumerator);
! 1465: }
! 1466: return !config;
! 1467: }
! 1468:
! 1469: METHOD(tls_crypto_t, get_signature_algorithms, void,
! 1470: private_tls_crypto_t *this, bio_writer_t *writer, bool cert)
! 1471: {
! 1472: bio_writer_t *supported;
! 1473: tls_version_t min_version, max_version;
! 1474: int i;
! 1475:
! 1476: supported = bio_writer_create(32);
! 1477:
! 1478: if (!cert)
! 1479: {
! 1480: min_version = this->tls->get_version_min(this->tls);
! 1481: max_version = this->tls->get_version_max(this->tls);
! 1482: }
! 1483:
! 1484: for (i = 0; i < countof(schemes); i++)
! 1485: {
! 1486: if ((cert || (schemes[i].min_version <= max_version &&
! 1487: schemes[i].max_version >= min_version)) &&
! 1488: lib->plugins->has_feature(lib->plugins,
! 1489: PLUGIN_PROVIDE(PUBKEY_VERIFY, schemes[i].params.scheme)) &&
! 1490: filter_signature_scheme_config(schemes[i].sig))
1.1 misho 1491: {
1.1.1.2 ! misho 1492: supported->write_uint16(supported, schemes[i].sig);
1.1 misho 1493: }
1494: }
1495:
1496: writer->write_data16(writer, supported->get_buf(supported));
1497: supported->destroy(supported);
1498: }
1499:
1500: /**
1.1.1.2 ! misho 1501: * Get the signature parameters from a TLS signature scheme
1.1 misho 1502: */
1.1.1.2 ! misho 1503: static signature_params_t *params_for_scheme(tls_signature_scheme_t sig,
! 1504: bool sign)
1.1 misho 1505: {
1506: int i;
1507:
1.1.1.2 ! misho 1508: for (i = 0; i < countof(schemes); i++)
1.1 misho 1509: {
1.1.1.2 ! misho 1510: /* strongSwan supports only RSA_PSS_RSAE schemes for signing but can
! 1511: * verify public keys in rsaEncryption as well as rsassaPss encoding. */
! 1512: if (sign && (sig == TLS_SIG_RSA_PSS_PSS_SHA256 ||
! 1513: sig == TLS_SIG_RSA_PSS_PSS_SHA384 ||
! 1514: sig == TLS_SIG_RSA_PSS_PSS_SHA512))
1.1 misho 1515: {
1.1.1.2 ! misho 1516: continue;
! 1517: }
! 1518: if (schemes[i].sig == sig)
! 1519: {
! 1520: return &schemes[i].params;
1.1 misho 1521: }
1522: }
1.1.1.2 ! misho 1523: return NULL;
1.1 misho 1524: }
1525:
1526: /**
1527: * Mapping groups to TLS named curves
1528: */
1529: static struct {
1530: diffie_hellman_group_t group;
1.1.1.2 ! misho 1531: tls_named_group_t curve;
1.1 misho 1532: } curves[] = {
1533: { ECP_256_BIT, TLS_SECP256R1},
1534: { ECP_384_BIT, TLS_SECP384R1},
1535: { ECP_521_BIT, TLS_SECP521R1},
1536: { ECP_224_BIT, TLS_SECP224R1},
1537: { ECP_192_BIT, TLS_SECP192R1},
1.1.1.2 ! misho 1538: { CURVE_25519, TLS_CURVE25519},
! 1539: { CURVE_448, TLS_CURVE448},
1.1 misho 1540: };
1541:
1542: CALLBACK(group_filter, bool,
1543: void *null, enumerator_t *orig, va_list args)
1544: {
1.1.1.2 ! misho 1545: diffie_hellman_group_t group, *group_out;
! 1546: tls_named_group_t curve, *curve_out;
1.1 misho 1547: char *plugin;
1548:
1.1.1.2 ! misho 1549: VA_ARGS_VGET(args, group_out, curve_out);
1.1 misho 1550:
1551: while (orig->enumerate(orig, &group, &plugin))
1552: {
1.1.1.2 ! misho 1553: curve = tls_ec_group_to_curve(group);
! 1554: if (curve)
1.1 misho 1555: {
1.1.1.2 ! misho 1556: if (group_out)
1.1 misho 1557: {
1.1.1.2 ! misho 1558: *group_out = group;
! 1559: }
! 1560: if (curve_out)
! 1561: {
! 1562: *curve_out = curve;
! 1563: }
! 1564: return TRUE;
! 1565: }
! 1566: }
! 1567: return FALSE;
! 1568: }
! 1569:
! 1570: CALLBACK(config_filter, bool,
! 1571: void *null, enumerator_t *orig, va_list args)
! 1572: {
! 1573: diffie_hellman_group_t group, *group_out;
! 1574: tls_named_group_t curve, *curve_out;
! 1575:
! 1576: VA_ARGS_VGET(args, group_out, curve_out);
! 1577:
! 1578: while (orig->enumerate(orig, &group, &curve))
! 1579: {
! 1580: if (filter_curve_config(curve))
! 1581:
! 1582: {
! 1583: if (group_out)
! 1584: {
! 1585: *group_out = group;
! 1586: }
! 1587: if (curve_out)
! 1588: {
! 1589: *curve_out = curve;
1.1 misho 1590: }
1.1.1.2 ! misho 1591: return TRUE;
1.1 misho 1592: }
1593: }
1594: return FALSE;
1595: }
1596:
1597: METHOD(tls_crypto_t, create_ec_enumerator, enumerator_t*,
1598: private_tls_crypto_t *this)
1599: {
1600: return enumerator_create_filter(
1.1.1.2 ! misho 1601: enumerator_create_filter(
! 1602: lib->crypto->create_dh_enumerator(lib->crypto),
! 1603: group_filter, NULL, NULL),
! 1604: config_filter, NULL, NULL);
! 1605: }
! 1606:
! 1607: /**
! 1608: * Check if the given ECDH group is supported or return the first one we
! 1609: * actually do support.
! 1610: */
! 1611: static diffie_hellman_group_t supported_ec_group(private_tls_crypto_t *this,
! 1612: diffie_hellman_group_t orig)
! 1613: {
! 1614: diffie_hellman_group_t current, first = MODP_NONE;
! 1615: enumerator_t *enumerator;
! 1616:
! 1617: enumerator = create_ec_enumerator(this);
! 1618: while (enumerator->enumerate(enumerator, ¤t, NULL))
! 1619: {
! 1620: if (current == orig)
! 1621: {
! 1622: enumerator->destroy(enumerator);
! 1623: return orig;
! 1624: }
! 1625: else if (first == MODP_NONE)
! 1626: {
! 1627: first = current;
! 1628: }
! 1629: }
! 1630: enumerator->destroy(enumerator);
! 1631: return first;
! 1632: }
! 1633:
! 1634: METHOD(tls_crypto_t, get_dh_group, diffie_hellman_group_t,
! 1635: private_tls_crypto_t *this)
! 1636: {
! 1637: suite_algs_t *algs;
! 1638:
! 1639: algs = find_suite(this->suite);
! 1640: if (algs)
! 1641: {
! 1642: if (diffie_hellman_group_is_ec(algs->dh))
! 1643: {
! 1644: return supported_ec_group(this, algs->dh);
! 1645: }
! 1646: return algs->dh;
! 1647: }
! 1648: return MODP_NONE;
1.1 misho 1649: }
1650:
1651: METHOD(tls_crypto_t, set_protection, void,
1652: private_tls_crypto_t *this, tls_protection_t *protection)
1653: {
1654: this->protection = protection;
1655: }
1656:
1657: METHOD(tls_crypto_t, append_handshake, void,
1658: private_tls_crypto_t *this, tls_handshake_type_t type, chunk_t data)
1659: {
1660: uint32_t header;
1661:
1662: /* reconstruct handshake header */
1663: header = htonl(data.len | (type << 24));
1664: this->handshake = chunk_cat("mcc", this->handshake,
1665: chunk_from_thing(header), data);
1666: }
1667:
1668: /**
1669: * Create a hash using the suites HASH algorithm
1670: */
1671: static bool hash_data(private_tls_crypto_t *this, chunk_t data, chunk_t *hash)
1672: {
1.1.1.2 ! misho 1673: if (this->tls->get_version_max(this->tls) >= TLS_1_2)
1.1 misho 1674: {
1675: hasher_t *hasher;
1676: suite_algs_t *alg;
1677:
1678: alg = find_suite(this->suite);
1679: if (!alg)
1680: {
1681: return FALSE;
1682: }
1683: hasher = lib->crypto->create_hasher(lib->crypto, alg->hash);
1684: if (!hasher || !hasher->allocate_hash(hasher, data, hash))
1685: {
1686: DBG1(DBG_TLS, "%N not supported", hash_algorithm_names, alg->hash);
1687: DESTROY_IF(hasher);
1688: return FALSE;
1689: }
1690: hasher->destroy(hasher);
1691: }
1692: else
1693: {
1694: hasher_t *md5, *sha1;
1695: char buf[HASH_SIZE_MD5 + HASH_SIZE_SHA1];
1696:
1697: md5 = lib->crypto->create_hasher(lib->crypto, HASH_MD5);
1698: if (!md5 || !md5->get_hash(md5, data, buf))
1699: {
1700: DBG1(DBG_TLS, "%N not supported", hash_algorithm_names, HASH_MD5);
1701: DESTROY_IF(md5);
1702: return FALSE;
1703: }
1704: md5->destroy(md5);
1705: sha1 = lib->crypto->create_hasher(lib->crypto, HASH_SHA1);
1706: if (!sha1 || !sha1->get_hash(sha1, data, buf + HASH_SIZE_MD5))
1707: {
1708: DBG1(DBG_TLS, "%N not supported", hash_algorithm_names, HASH_SHA1);
1709: DESTROY_IF(sha1);
1710: return FALSE;
1711: }
1712: sha1->destroy(sha1);
1713:
1714: *hash = chunk_clone(chunk_from_thing(buf));
1715: }
1716: return TRUE;
1717: }
1718:
1.1.1.2 ! misho 1719: METHOD(tls_crypto_t, hash_handshake, bool,
! 1720: private_tls_crypto_t *this, chunk_t *out)
! 1721: {
! 1722: chunk_t hash;
! 1723:
! 1724: if (!hash_data(this, this->handshake, &hash))
! 1725: {
! 1726: return FALSE;
! 1727: }
! 1728:
! 1729: chunk_free(&this->handshake);
! 1730: append_handshake(this, TLS_MESSAGE_HASH, hash);
! 1731:
! 1732: if (out)
! 1733: {
! 1734: *out = hash;
! 1735: }
! 1736: else
! 1737: {
! 1738: free(hash.ptr);
! 1739: }
! 1740: return TRUE;
! 1741: }
! 1742:
! 1743: /**
! 1744: * TLS 1.3 static part of the data the server signs (64 spaces followed by the
! 1745: * context string "TLS 1.3, server CertificateVerify" and a 0 byte).
! 1746: */
! 1747: static chunk_t tls13_sig_data_server = chunk_from_chars(
! 1748: 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
! 1749: 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
! 1750: 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
! 1751: 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
! 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: 0x54, 0x4c, 0x53, 0x20, 0x31, 0x2e, 0x33, 0x2c,
! 1757: 0x20, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x20,
! 1758: 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63,
! 1759: 0x61, 0x74, 0x65, 0x56, 0x65, 0x72, 0x69, 0x66,
! 1760: 0x79, 0x00,
! 1761: );
! 1762:
! 1763: /**
! 1764: * TLS 1.3 static part of the data the peer signs (64 spaces followed by the
! 1765: * context string "TLS 1.3, client CertificateVerify" and a 0 byte).
! 1766: */
! 1767: static chunk_t tls13_sig_data_client = chunk_from_chars(
! 1768: 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
! 1769: 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
! 1770: 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
! 1771: 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
! 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: 0x54, 0x4c, 0x53, 0x20, 0x31, 0x2e, 0x33, 0x2c,
! 1777: 0x20, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x20,
! 1778: 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63,
! 1779: 0x61, 0x74, 0x65, 0x56, 0x65, 0x72, 0x69, 0x66,
! 1780: 0x79, 0x00,
! 1781: );
! 1782:
1.1 misho 1783: METHOD(tls_crypto_t, sign, bool,
1784: private_tls_crypto_t *this, private_key_t *key, bio_writer_t *writer,
1785: chunk_t data, chunk_t hashsig)
1786: {
1.1.1.2 ! misho 1787: if (this->tls->get_version_max(this->tls) >= TLS_1_2)
1.1 misho 1788: {
1.1.1.2 ! misho 1789: /* fallback to SHA1/RSA and SHA1/ECDSA */
! 1790: const chunk_t hashsig_def = chunk_from_chars(0x02, 0x01, 0x02, 0x03);
! 1791: signature_params_t *params;
! 1792: key_type_t type;
! 1793: uint16_t scheme;
1.1 misho 1794: bio_reader_t *reader;
1795: chunk_t sig;
1796: bool done = FALSE;
1797:
1.1.1.2 ! misho 1798: if (this->tls->get_version_max(this->tls) >= TLS_1_3)
! 1799: {
! 1800: chunk_t transcript_hash;
! 1801:
! 1802: if (!hash_data(this, data, &transcript_hash))
! 1803: {
! 1804: DBG1(DBG_TLS, "unable to create transcript hash");
! 1805: return FALSE;
! 1806: }
! 1807: if (this->tls->is_server(this->tls))
! 1808: {
! 1809: data = chunk_cata("cm", tls13_sig_data_server, transcript_hash);
! 1810: }
! 1811: else
! 1812: {
! 1813: data = chunk_cata("cm", tls13_sig_data_client, transcript_hash);
! 1814: }
! 1815: }
! 1816:
1.1 misho 1817: if (!hashsig.len)
1818: { /* fallback if none given */
1819: hashsig = hashsig_def;
1820: }
1.1.1.2 ! misho 1821: type = key->get_type(key);
1.1 misho 1822: reader = bio_reader_create(hashsig);
1823: while (reader->remaining(reader) >= 2)
1824: {
1.1.1.2 ! misho 1825: if (reader->read_uint16(reader, &scheme))
1.1 misho 1826: {
1.1.1.2 ! misho 1827: params = params_for_scheme(scheme, TRUE);
! 1828: if (params &&
! 1829: type == key_type_from_signature_scheme(params->scheme) &&
! 1830: key->sign(key, params->scheme, params->params, data, &sig))
1.1 misho 1831: {
1832: done = TRUE;
1833: break;
1834: }
1835: }
1836: }
1837: reader->destroy(reader);
1838: if (!done)
1839: {
1840: DBG1(DBG_TLS, "none of the proposed hash/sig algorithms supported");
1841: return FALSE;
1842: }
1.1.1.2 ! misho 1843: DBG2(DBG_TLS, "created signature with %N", tls_signature_scheme_names,
! 1844: scheme);
! 1845: writer->write_uint16(writer, scheme);
1.1 misho 1846: writer->write_data16(writer, sig);
1847: free(sig.ptr);
1848: }
1849: else
1850: {
1851: chunk_t sig, hash;
1852: bool done;
1853:
1854: switch (key->get_type(key))
1855: {
1856: case KEY_RSA:
1857: if (!hash_data(this, data, &hash))
1858: {
1859: return FALSE;
1860: }
1861: done = key->sign(key, SIGN_RSA_EMSA_PKCS1_NULL, NULL, hash,
1862: &sig);
1863: free(hash.ptr);
1864: if (!done)
1865: {
1866: return FALSE;
1867: }
1868: DBG2(DBG_TLS, "created signature with MD5+SHA1/RSA");
1869: break;
1870: case KEY_ECDSA:
1871: if (!key->sign(key, SIGN_ECDSA_WITH_SHA1_DER, NULL, data, &sig))
1872: {
1873: return FALSE;
1874: }
1875: DBG2(DBG_TLS, "created signature with SHA1/ECDSA");
1876: break;
1.1.1.2 ! misho 1877: case KEY_ED25519:
! 1878: if (!key->sign(key, SIGN_ED25519, NULL, data, &sig))
! 1879: {
! 1880: return FALSE;
! 1881: }
! 1882: DBG2(DBG_TLS, "created signature with Ed25519");
! 1883: break;
! 1884: case KEY_ED448:
! 1885: if (!key->sign(key, SIGN_ED448, NULL, data, &sig))
! 1886: {
! 1887: return FALSE;
! 1888: }
! 1889: DBG2(DBG_TLS, "created signature with Ed448");
! 1890: break;
1.1 misho 1891: default:
1892: return FALSE;
1893: }
1894: writer->write_data16(writer, sig);
1895: free(sig.ptr);
1896: }
1897: return TRUE;
1898: }
1899:
1900: METHOD(tls_crypto_t, verify, bool,
1901: private_tls_crypto_t *this, public_key_t *key, bio_reader_t *reader,
1902: chunk_t data)
1903: {
1.1.1.2 ! misho 1904: if (this->tls->get_version_max(this->tls) >= TLS_1_2)
1.1 misho 1905: {
1.1.1.2 ! misho 1906: signature_params_t *params;
! 1907: uint16_t scheme;
1.1 misho 1908: chunk_t sig;
1909:
1.1.1.2 ! misho 1910: if (!reader->read_uint16(reader, &scheme) ||
1.1 misho 1911: !reader->read_data16(reader, &sig))
1912: {
1913: DBG1(DBG_TLS, "received invalid signature");
1914: return FALSE;
1915: }
1.1.1.2 ! misho 1916: params = params_for_scheme(scheme, FALSE);
! 1917: if (!params)
1.1 misho 1918: {
1.1.1.2 ! misho 1919: DBG1(DBG_TLS, "signature algorithms %N not supported",
! 1920: tls_signature_scheme_names, scheme);
1.1 misho 1921: return FALSE;
1922: }
1.1.1.2 ! misho 1923: if (this->tls->get_version_max(this->tls) >= TLS_1_3)
1.1 misho 1924: {
1.1.1.2 ! misho 1925: chunk_t transcript_hash;
! 1926:
! 1927: if (!hash_data(this, data, &transcript_hash))
! 1928: {
! 1929: DBG1(DBG_TLS, "Unable to create transcript hash");
! 1930: return FALSE;
! 1931: }
! 1932:
! 1933: if (this->tls->is_server(this->tls))
! 1934: {
! 1935: data = chunk_cata("cm", tls13_sig_data_client, transcript_hash);
! 1936: }
! 1937: else
! 1938: {
! 1939: data = chunk_cata("cm", tls13_sig_data_server, transcript_hash);
! 1940: }
! 1941: }
! 1942: if (!key->verify(key, params->scheme, params->params, data, sig))
! 1943: {
! 1944: DBG1(DBG_TLS, "signature verification with %N failed",
! 1945: tls_signature_scheme_names, scheme);
1.1 misho 1946: return FALSE;
1947: }
1.1.1.2 ! misho 1948: DBG2(DBG_TLS, "verified signature with %N",
! 1949: tls_signature_scheme_names, scheme);
1.1 misho 1950: }
1951: else
1952: {
1953: chunk_t sig, hash;
1954: bool done;
1955:
1956: if (!reader->read_data16(reader, &sig))
1957: {
1958: DBG1(DBG_TLS, "received invalid signature");
1959: return FALSE;
1960: }
1961: switch (key->get_type(key))
1962: {
1963: case KEY_RSA:
1964: if (!hash_data(this, data, &hash))
1965: {
1966: return FALSE;
1967: }
1968: done = key->verify(key, SIGN_RSA_EMSA_PKCS1_NULL, NULL, hash,
1969: sig);
1970: free(hash.ptr);
1971: if (!done)
1972: {
1973: return FALSE;
1974: }
1975: DBG2(DBG_TLS, "verified signature data with MD5+SHA1/RSA");
1976: break;
1977: case KEY_ECDSA:
1978: if (!key->verify(key, SIGN_ECDSA_WITH_SHA1_DER, NULL, data,
1979: sig))
1980: {
1981: return FALSE;
1982: }
1983: DBG2(DBG_TLS, "verified signature with SHA1/ECDSA");
1984: break;
1.1.1.2 ! misho 1985: case KEY_ED25519:
! 1986: if (!key->verify(key, SIGN_ED25519, NULL, data, sig))
! 1987: {
! 1988: return FALSE;
! 1989: }
! 1990: DBG2(DBG_TLS, "verified signature with Ed25519");
! 1991: break;
! 1992: case KEY_ED448:
! 1993: if (!key->verify(key, SIGN_ED448, NULL, data, sig))
! 1994: {
! 1995: return FALSE;
! 1996: }
! 1997: DBG2(DBG_TLS, "verified signature with Ed448");
! 1998: break;
1.1 misho 1999: default:
2000: return FALSE;
2001: }
2002: }
2003: return TRUE;
2004: }
2005:
2006: METHOD(tls_crypto_t, sign_handshake, bool,
2007: private_tls_crypto_t *this, private_key_t *key, bio_writer_t *writer,
2008: chunk_t hashsig)
2009: {
2010: return sign(this, key, writer, this->handshake, hashsig);
2011: }
2012:
2013: METHOD(tls_crypto_t, verify_handshake, bool,
2014: private_tls_crypto_t *this, public_key_t *key, bio_reader_t *reader)
2015: {
2016: return verify(this, key, reader, this->handshake);
2017: }
2018:
1.1.1.2 ! misho 2019: METHOD(tls_crypto_t, calculate_finished_legacy, bool,
1.1 misho 2020: private_tls_crypto_t *this, char *label, char out[12])
2021: {
2022: chunk_t seed;
2023:
2024: if (!this->prf)
2025: {
2026: return FALSE;
2027: }
2028: if (!hash_data(this, this->handshake, &seed))
2029: {
2030: return FALSE;
2031: }
2032: if (!this->prf->get_bytes(this->prf, label, seed, 12, out))
2033: {
2034: free(seed.ptr);
2035: return FALSE;
2036: }
2037: free(seed.ptr);
2038: return TRUE;
2039: }
2040:
1.1.1.2 ! misho 2041: METHOD(tls_crypto_t, calculate_finished, bool,
! 2042: private_tls_crypto_t *this, bool server, chunk_t *out)
! 2043: {
! 2044: chunk_t finished_key, finished_hash;
! 2045:
! 2046: if (!this->hkdf)
! 2047: {
! 2048: return FALSE;
! 2049: }
! 2050: if (!hash_data(this, this->handshake, &finished_hash))
! 2051: {
! 2052: DBG1(DBG_TLS, "creating hash of handshake failed");
! 2053: return FALSE;
! 2054: }
! 2055: if (!this->hkdf->derive_finished(this->hkdf, server, &finished_key))
! 2056: {
! 2057: DBG1(DBG_TLS, "generating finished key failed");
! 2058: chunk_clear(&finished_hash);
! 2059: return FALSE;
! 2060: }
! 2061: if (!this->hkdf->allocate_bytes(this->hkdf, finished_key, finished_hash, out))
! 2062: {
! 2063: DBG1(DBG_TLS, "generating finished HMAC failed");
! 2064: chunk_clear(&finished_key);
! 2065: chunk_clear(&finished_hash);
! 2066: return FALSE;
! 2067: }
! 2068: chunk_clear(&finished_key);
! 2069: chunk_clear(&finished_hash);
! 2070: return TRUE;
! 2071: }
! 2072:
1.1 misho 2073: /**
2074: * Derive master secret from premaster, optionally save session
2075: */
2076: static bool derive_master(private_tls_crypto_t *this, chunk_t premaster,
2077: chunk_t session, identification_t *id,
2078: chunk_t client_random, chunk_t server_random)
2079: {
2080: char master[48];
2081: chunk_t seed;
2082:
2083: /* derive master secret */
2084: seed = chunk_cata("cc", client_random, server_random);
2085:
2086: if (!this->prf->set_key(this->prf, premaster) ||
2087: !this->prf->get_bytes(this->prf, "master secret", seed,
2088: sizeof(master), master) ||
2089: !this->prf->set_key(this->prf, chunk_from_thing(master)))
2090: {
2091: return FALSE;
2092: }
2093:
2094: if (this->cache && session.len)
2095: {
2096: this->cache->create(this->cache, session, id, chunk_from_thing(master),
2097: this->suite);
2098: }
2099: memwipe(master, sizeof(master));
2100: return TRUE;
2101: }
2102:
2103: /**
2104: * Expand key material from master secret
2105: */
2106: static bool expand_keys(private_tls_crypto_t *this,
2107: chunk_t client_random, chunk_t server_random)
2108: {
2109: chunk_t seed, block;
2110: chunk_t cw_mac, cw, cw_iv;
2111: chunk_t sw_mac, sw, sw_iv;
2112: int mklen, eklen, ivlen;
2113:
2114: if (!this->aead_in || !this->aead_out)
2115: {
2116: return FALSE;
2117: }
2118:
2119: /* derive key block for key expansion */
2120: mklen = this->aead_in->get_mac_key_size(this->aead_in);
2121: eklen = this->aead_in->get_encr_key_size(this->aead_in);
2122: ivlen = this->aead_in->get_iv_size(this->aead_in);
2123: seed = chunk_cata("cc", server_random, client_random);
2124: block = chunk_alloca((mklen + eklen + ivlen) * 2);
2125: if (!this->prf->get_bytes(this->prf, "key expansion", seed,
2126: block.len, block.ptr))
2127: {
2128: return FALSE;
2129: }
2130:
2131: /* client/server write signer keys */
2132: cw_mac = chunk_create(block.ptr, mklen);
2133: block = chunk_skip(block, mklen);
2134: sw_mac = chunk_create(block.ptr, mklen);
2135: block = chunk_skip(block, mklen);
2136:
2137: /* client/server write encryption keys */
2138: cw = chunk_create(block.ptr, eklen);
2139: block = chunk_skip(block, eklen);
2140: sw = chunk_create(block.ptr, eklen);
2141: block = chunk_skip(block, eklen);
2142:
2143: /* client/server write IV; TLS 1.0 implicit IVs or AEAD salt, if any */
2144: cw_iv = chunk_create(block.ptr, ivlen);
2145: block = chunk_skip(block, ivlen);
2146: sw_iv = chunk_create(block.ptr, ivlen);
2147: block = chunk_skip(block, ivlen);
2148:
2149: if (this->tls->is_server(this->tls))
2150: {
2151: if (!this->aead_in->set_keys(this->aead_in, cw_mac, cw, cw_iv) ||
2152: !this->aead_out->set_keys(this->aead_out, sw_mac, sw, sw_iv))
2153: {
2154: return FALSE;
2155: }
2156: }
2157: else
2158: {
2159: if (!this->aead_out->set_keys(this->aead_out, cw_mac, cw, cw_iv) ||
2160: !this->aead_in->set_keys(this->aead_in, sw_mac, sw, sw_iv))
2161: {
2162: return FALSE;
2163: }
2164: }
2165:
2166: /* EAP-MSK */
2167: if (this->msk_label)
2168: {
2169: seed = chunk_cata("cc", client_random, server_random);
2170: this->msk = chunk_alloc(64);
2171: if (!this->prf->get_bytes(this->prf, this->msk_label, seed,
2172: this->msk.len, this->msk.ptr))
2173: {
2174: return FALSE;
2175: }
2176: }
2177: return TRUE;
2178: }
2179:
2180: METHOD(tls_crypto_t, derive_secrets, bool,
2181: private_tls_crypto_t *this, chunk_t premaster, chunk_t session,
2182: identification_t *id, chunk_t client_random, chunk_t server_random)
2183: {
2184: return derive_master(this, premaster, session, id,
2185: client_random, server_random) &&
2186: expand_keys(this, client_random, server_random);
2187: }
2188:
1.1.1.2 ! misho 2189: /**
! 2190: * Derive and configure the client/server key/IV on an AEAD using a given label.
! 2191: */
! 2192: static bool derive_labeled_key(private_tls_crypto_t *this, bool server,
! 2193: tls_hkdf_label_t label, tls_aead_t *aead)
! 2194: {
! 2195: chunk_t key = chunk_empty, iv = chunk_empty;
! 2196: bool success = FALSE;
! 2197:
! 2198: if (!this->hkdf->generate_secret(this->hkdf, label, this->handshake,
! 2199: NULL) ||
! 2200: !this->hkdf->derive_key(this->hkdf, server,
! 2201: aead->get_encr_key_size(aead), &key) ||
! 2202: !this->hkdf->derive_iv(this->hkdf, server,
! 2203: aead->get_iv_size(aead), &iv))
! 2204: {
! 2205: DBG1(DBG_TLS, "deriving key material failed");
! 2206: goto out;
! 2207: }
! 2208:
! 2209: if (!aead->set_keys(aead, chunk_empty, key, iv))
! 2210: {
! 2211: DBG1(DBG_TLS, "setting AEAD key material failed");
! 2212: goto out;
! 2213: }
! 2214: success = TRUE;
! 2215:
! 2216: out:
! 2217: chunk_clear(&key);
! 2218: chunk_clear(&iv);
! 2219: return success;
! 2220: }
! 2221:
! 2222: /**
! 2223: * Derive and configure the keys/IVs using the given labels.
! 2224: */
! 2225: static bool derive_labeled_keys(private_tls_crypto_t *this,
! 2226: tls_hkdf_label_t client_label,
! 2227: tls_hkdf_label_t server_label)
! 2228: {
! 2229: tls_aead_t *aead_c, *aead_s;
! 2230: suite_algs_t *algs;
! 2231:
! 2232: algs = find_suite(this->suite);
! 2233: destroy_aeads(this);
! 2234: if (!create_aead(this, algs))
! 2235: {
! 2236: return FALSE;
! 2237: }
! 2238: aead_c = this->aead_out;
! 2239: aead_s = this->aead_in;
! 2240: if (this->tls->is_server(this->tls))
! 2241: {
! 2242: aead_c = this->aead_in;
! 2243: aead_s = this->aead_out;
! 2244: }
! 2245: return derive_labeled_key(this, FALSE, client_label, aead_c) &&
! 2246: derive_labeled_key(this, TRUE, server_label, aead_s);
! 2247: }
! 2248:
! 2249: METHOD(tls_crypto_t, derive_handshake_keys, bool,
! 2250: private_tls_crypto_t *this, chunk_t shared_secret)
! 2251: {
! 2252: this->hkdf->set_shared_secret(this->hkdf, shared_secret);
! 2253: return derive_labeled_keys(this, TLS_HKDF_C_HS_TRAFFIC,
! 2254: TLS_HKDF_S_HS_TRAFFIC);
! 2255: }
! 2256:
! 2257: METHOD(tls_crypto_t, derive_app_keys, bool,
! 2258: private_tls_crypto_t *this)
! 2259: {
! 2260: if (!derive_labeled_keys(this, TLS_HKDF_C_AP_TRAFFIC,
! 2261: TLS_HKDF_S_AP_TRAFFIC))
! 2262: {
! 2263: return FALSE;
! 2264: }
! 2265:
! 2266: /* EAP-MSK */
! 2267: if (this->msk_label)
! 2268: {
! 2269: /* because the length is encoded when expanding key material, we
! 2270: * request the same number of bytes as FreeRADIUS (the first 64 for
! 2271: * the MSK, the next for the EMSK, which we just ignore) */
! 2272: if (!this->hkdf->export(this->hkdf, this->msk_label, chunk_empty,
! 2273: this->handshake, 128, &this->msk))
! 2274: {
! 2275: return FALSE;
! 2276: }
! 2277: this->msk.len = 64;
! 2278: }
! 2279: return TRUE;
! 2280: }
! 2281:
! 2282: METHOD(tls_crypto_t, update_app_keys, bool,
! 2283: private_tls_crypto_t *this, bool inbound)
! 2284: {
! 2285: suite_algs_t *algs;
! 2286: tls_hkdf_label_t label = TLS_HKDF_UPD_C_TRAFFIC;
! 2287:
! 2288: algs = find_suite(this->suite);
! 2289: destroy_aeads(this);
! 2290: if (!create_aead(this, algs))
! 2291: {
! 2292: return FALSE;
! 2293: }
! 2294: if (this->tls->is_server(this->tls) != inbound)
! 2295: {
! 2296: label = TLS_HKDF_UPD_S_TRAFFIC;
! 2297: }
! 2298: return derive_labeled_key(this, label == TLS_HKDF_UPD_S_TRAFFIC, label,
! 2299: inbound ? this->aead_in : this->aead_out);
! 2300: }
! 2301:
1.1 misho 2302: METHOD(tls_crypto_t, resume_session, tls_cipher_suite_t,
2303: private_tls_crypto_t *this, chunk_t session, identification_t *id,
2304: chunk_t client_random, chunk_t server_random)
2305: {
2306: chunk_t master;
2307:
2308: if (this->cache && session.len)
2309: {
2310: this->suite = this->cache->lookup(this->cache, session, id, &master);
2311: if (this->suite)
2312: {
2313: this->suite = select_cipher_suite(this, &this->suite, 1, KEY_ANY);
2314: if (this->suite)
2315: {
2316: if (!this->prf->set_key(this->prf, master) ||
2317: !expand_keys(this, client_random, server_random))
2318: {
2319: this->suite = 0;
2320: }
2321: }
2322: chunk_clear(&master);
2323: }
2324: return this->suite;
2325: }
2326: return 0;
2327: }
2328:
2329: METHOD(tls_crypto_t, get_session, chunk_t,
2330: private_tls_crypto_t *this, identification_t *server)
2331: {
2332: if (this->cache)
2333: {
2334: return this->cache->check(this->cache, server);
2335: }
2336: return chunk_empty;
2337: }
2338:
2339: METHOD(tls_crypto_t, change_cipher, void,
2340: private_tls_crypto_t *this, bool inbound)
2341: {
2342: if (this->protection)
2343: {
2344: if (inbound)
2345: {
2346: this->protection->set_cipher(this->protection, TRUE, this->aead_in);
1.1.1.2 ! misho 2347: this->aead_in = NULL;
1.1 misho 2348: }
2349: else
2350: {
2351: this->protection->set_cipher(this->protection, FALSE, this->aead_out);
1.1.1.2 ! misho 2352: this->aead_out = NULL;
1.1 misho 2353: }
2354: }
2355: }
2356:
2357: METHOD(tls_crypto_t, get_eap_msk, chunk_t,
2358: private_tls_crypto_t *this)
2359: {
2360: return this->msk;
2361: }
2362:
2363: METHOD(tls_crypto_t, destroy, void,
2364: private_tls_crypto_t *this)
2365: {
2366: destroy_aeads(this);
2367: free(this->handshake.ptr);
2368: free(this->msk.ptr);
2369: DESTROY_IF(this->prf);
1.1.1.2 ! misho 2370: DESTROY_IF(this->hkdf);
1.1 misho 2371: free(this->suites);
2372: free(this);
2373: }
2374:
2375: /**
2376: * See header
2377: */
2378: tls_crypto_t *tls_crypto_create(tls_t *tls, tls_cache_t *cache)
2379: {
2380: private_tls_crypto_t *this;
2381: enumerator_t *enumerator;
2382: credential_type_t type;
2383: int subtype;
2384:
2385: INIT(this,
2386: .public = {
2387: .get_cipher_suites = _get_cipher_suites,
2388: .select_cipher_suite = _select_cipher_suite,
2389: .get_dh_group = _get_dh_group,
2390: .get_signature_algorithms = _get_signature_algorithms,
2391: .create_ec_enumerator = _create_ec_enumerator,
2392: .set_protection = _set_protection,
2393: .append_handshake = _append_handshake,
1.1.1.2 ! misho 2394: .hash_handshake = _hash_handshake,
1.1 misho 2395: .sign = _sign,
2396: .verify = _verify,
2397: .sign_handshake = _sign_handshake,
2398: .verify_handshake = _verify_handshake,
1.1.1.2 ! misho 2399: .calculate_finished_legacy = _calculate_finished_legacy,
1.1 misho 2400: .calculate_finished = _calculate_finished,
2401: .derive_secrets = _derive_secrets,
1.1.1.2 ! misho 2402: .derive_handshake_keys = _derive_handshake_keys,
! 2403: .derive_app_keys = _derive_app_keys,
! 2404: .update_app_keys = _update_app_keys,
1.1 misho 2405: .resume_session = _resume_session,
2406: .get_session = _get_session,
2407: .change_cipher = _change_cipher,
2408: .get_eap_msk = _get_eap_msk,
2409: .destroy = _destroy,
2410: },
2411: .tls = tls,
2412: .cache = cache,
2413: );
2414:
1.1.1.2 ! misho 2415: /* FIXME: EDDSA keys are currently treated like ECDSA keys. A cleaner
! 2416: * separation would be welcome. */
1.1 misho 2417: enumerator = lib->creds->create_builder_enumerator(lib->creds);
2418: while (enumerator->enumerate(enumerator, &type, &subtype))
2419: {
2420: if (type == CRED_PUBLIC_KEY)
2421: {
2422: switch (subtype)
2423: {
2424: case KEY_RSA:
2425: this->rsa = TRUE;
2426: break;
2427: case KEY_ECDSA:
1.1.1.2 ! misho 2428: case KEY_ED25519:
! 2429: case KEY_ED448:
1.1 misho 2430: this->ecdsa = TRUE;
2431: break;
2432: default:
2433: break;
2434: }
2435: }
2436: }
2437: enumerator->destroy(enumerator);
2438:
2439: switch (tls->get_purpose(tls))
2440: {
2441: case TLS_PURPOSE_EAP_TLS:
2442: /* MSK PRF ASCII constant label according to EAP-TLS RFC 5216 */
2443: this->msk_label = "client EAP encryption";
2444: break;
2445: case TLS_PURPOSE_EAP_PEAP:
2446: this->msk_label = "client EAP encryption";
2447: break;
2448: case TLS_PURPOSE_EAP_TTLS:
2449: /* MSK PRF ASCII constant label according to EAP-TTLS RFC 5281 */
2450: this->msk_label = "ttls keying material";
2451: break;
2452: default:
2453: break;
2454: }
2455: return &this->public;
2456: }
2457:
2458: /**
2459: * See header.
2460: */
1.1.1.2 ! misho 2461: int tls_crypto_get_supported_suites(bool null, tls_version_t version,
! 2462: tls_cipher_suite_t **out)
1.1 misho 2463: {
2464: suite_algs_t suites[countof(suite_algs)];
1.1.1.2 ! misho 2465: int count = 0, i;
1.1 misho 2466:
2467: /* initialize copy of suite list */
1.1.1.2 ! misho 2468: for (i = 0; i < countof(suite_algs); i++)
1.1 misho 2469: {
1.1.1.2 ! misho 2470: if (suite_algs[i].min_version <= version &&
! 2471: suite_algs[i].max_version >= version)
! 2472: {
! 2473: suites[count++] = suite_algs[i];
! 2474: }
1.1 misho 2475: }
2476:
2477: filter_unsupported_suites(suites, &count);
2478:
2479: if (!null)
2480: {
2481: filter_null_suites(suites, &count);
2482: }
2483:
2484: if (out)
2485: {
2486: *out = calloc(count, sizeof(tls_cipher_suite_t));
2487: for (i = 0; i < count; i++)
2488: {
2489: (*out)[i] = suites[i].suite;
2490: }
2491: }
2492: return count;
2493: }
1.1.1.2 ! misho 2494:
! 2495: /**
! 2496: * See header.
! 2497: */
! 2498: int tls_crypto_get_supported_groups(diffie_hellman_group_t **out)
! 2499: {
! 2500: enumerator_t *enumerator;
! 2501: diffie_hellman_group_t groups[countof(curves)];
! 2502: diffie_hellman_group_t group;
! 2503: tls_named_group_t curve;
! 2504: int count = 0, i;
! 2505:
! 2506: enumerator = enumerator_create_filter(
! 2507: lib->crypto->create_dh_enumerator(lib->crypto),
! 2508: group_filter, NULL, NULL);
! 2509:
! 2510: while (enumerator->enumerate(enumerator, &group, &curve))
! 2511: {
! 2512: groups[count++] = group;
! 2513: }
! 2514: enumerator->destroy(enumerator);
! 2515:
! 2516: if (out)
! 2517: {
! 2518: *out = calloc(count, sizeof(diffie_hellman_group_t));
! 2519: for (i = 0; i < count; i++)
! 2520: {
! 2521: (*out)[i] = groups[i];
! 2522: }
! 2523: }
! 2524: return count;
! 2525: }
! 2526:
! 2527: /**
! 2528: * See header.
! 2529: */
! 2530: int tls_crypto_get_supported_signatures(tls_version_t version,
! 2531: tls_signature_scheme_t **out)
! 2532: {
! 2533: scheme_algs_t sigs[countof(schemes)];
! 2534: int count = 0, i;
! 2535:
! 2536: /* initialize copy of signature scheme list */
! 2537: for (i = 0; i < countof(schemes); i++)
! 2538: {
! 2539: /* only RSA_PSS_RSAE schemes supported for signing and verifying */
! 2540: if (schemes[i].sig == TLS_SIG_RSA_PSS_PSS_SHA256 ||
! 2541: schemes[i].sig == TLS_SIG_RSA_PSS_PSS_SHA384 ||
! 2542: schemes[i].sig == TLS_SIG_RSA_PSS_PSS_SHA512)
! 2543: {
! 2544: continue;
! 2545: }
! 2546: if (schemes[i].min_version <= version &&
! 2547: schemes[i].max_version >= version &&
! 2548: lib->plugins->has_feature(lib->plugins,
! 2549: PLUGIN_PROVIDE(PUBKEY_VERIFY, schemes[i].params.scheme)))
! 2550: {
! 2551: sigs[count++] = schemes[i];
! 2552: }
! 2553: }
! 2554:
! 2555: if (out)
! 2556: {
! 2557: *out = calloc(count, sizeof(tls_signature_scheme_t));
! 2558: for (i = 0; i < count; i++)
! 2559: {
! 2560: (*out)[i] = sigs[i].sig;
! 2561: }
! 2562: }
! 2563: return count;
! 2564: }
! 2565:
! 2566: /**
! 2567: * See header.
! 2568: */
! 2569: tls_named_group_t tls_ec_group_to_curve(diffie_hellman_group_t group)
! 2570: {
! 2571: int i;
! 2572:
! 2573: for (i = 0; i < countof(curves); i++)
! 2574: {
! 2575: if (curves[i].group == group)
! 2576: {
! 2577: return curves[i].curve;
! 2578: }
! 2579: }
! 2580: return 0;
! 2581: }
! 2582:
! 2583: /**
! 2584: * See header.
! 2585: */
! 2586: key_type_t tls_signature_scheme_to_key_type(tls_signature_scheme_t sig)
! 2587: {
! 2588: int i;
! 2589:
! 2590: for (i = 0; i < countof(schemes); i++)
! 2591: {
! 2592: if (schemes[i].sig == sig)
! 2593: {
! 2594: return key_type_from_signature_scheme(schemes[i].params.scheme);
! 2595: }
! 2596: }
! 2597: return 0;
! 2598: }
! 2599:
! 2600: /**
! 2601: * Hashtable hash function
! 2602: */
! 2603: static u_int hash_key_type(key_type_t *type)
! 2604: {
! 2605: return chunk_hash(chunk_from_thing(*type));
! 2606: }
! 2607:
! 2608: /**
! 2609: * Hashtable equals function
! 2610: */
! 2611: static bool equals_key_type(key_type_t *key1, key_type_t *key2)
! 2612: {
! 2613: return *key1 == *key2;
! 2614: }
! 2615:
! 2616: CALLBACK(filter_key_types, bool,
! 2617: void *data, enumerator_t *orig, va_list args)
! 2618: {
! 2619: key_type_t *key_type, *out;
! 2620:
! 2621: VA_ARGS_VGET(args, out);
! 2622:
! 2623: if (orig->enumerate(orig, NULL, &key_type))
! 2624: {
! 2625: *out = *key_type;
! 2626: return TRUE;
! 2627: }
! 2628: return FALSE;
! 2629: }
! 2630:
! 2631: CALLBACK(destroy_key_types, void,
! 2632: hashtable_t *ht)
! 2633: {
! 2634: ht->destroy_function(ht, (void*)free);
! 2635: }
! 2636:
! 2637: /**
! 2638: * Create an enumerator over supported key types within a specific TLS range
! 2639: */
! 2640: static enumerator_t *get_supported_key_types(tls_version_t min_version,
! 2641: tls_version_t max_version)
! 2642: {
! 2643: hashtable_t *ht;
! 2644: key_type_t *type, lookup;
! 2645: int i;
! 2646:
! 2647: ht = hashtable_create((hashtable_hash_t)hash_key_type,
! 2648: (hashtable_equals_t)equals_key_type, 4);
! 2649: for (i = 0; i < countof(schemes); i++)
! 2650: {
! 2651: if (schemes[i].min_version <= max_version &&
! 2652: schemes[i].max_version >= min_version)
! 2653: {
! 2654: lookup = key_type_from_signature_scheme(schemes[i].params.scheme);
! 2655: if (!ht->get(ht, &lookup))
! 2656: {
! 2657: type = malloc_thing(key_type_t);
! 2658: *type = lookup;
! 2659: ht->put(ht, type, type);
! 2660: }
! 2661: }
! 2662: }
! 2663: return enumerator_create_filter(ht->create_enumerator(ht),
! 2664: filter_key_types, ht, destroy_key_types);
! 2665: }
! 2666:
! 2667: /**
! 2668: * Create an array of an intersection of server and peer supported key types
! 2669: */
! 2670: static array_t *create_common_key_types(enumerator_t *enumerator, chunk_t hashsig)
! 2671: {
! 2672: array_t *key_types;
! 2673: key_type_t v, lookup;
! 2674: uint16_t sig_scheme;
! 2675:
! 2676: key_types = array_create(sizeof(key_type_t), 8);
! 2677: while (enumerator->enumerate(enumerator, &v))
! 2678: {
! 2679: bio_reader_t *reader;
! 2680:
! 2681: reader = bio_reader_create(hashsig);
! 2682: while (reader->remaining(reader) &&
! 2683: reader->read_uint16(reader, &sig_scheme))
! 2684: {
! 2685: lookup = tls_signature_scheme_to_key_type(sig_scheme);
! 2686: if (v == lookup)
! 2687: {
! 2688: array_insert(key_types, ARRAY_TAIL, &lookup);
! 2689: break;
! 2690: }
! 2691: }
! 2692: reader->destroy(reader);
! 2693: }
! 2694: return key_types;
! 2695: }
! 2696:
! 2697: typedef struct {
! 2698: enumerator_t public;
! 2699: array_t *key_types;
! 2700: identification_t *peer;
! 2701: private_key_t *key;
! 2702: auth_cfg_t *auth;
! 2703: } private_key_enumerator_t;
! 2704:
! 2705: METHOD(enumerator_t, private_key_enumerate, bool,
! 2706: private_key_enumerator_t *this, va_list args)
! 2707: {
! 2708: key_type_t type;
! 2709: auth_cfg_t **auth_out;
! 2710: private_key_t **key_out;
! 2711:
! 2712: VA_ARGS_VGET(args, key_out, auth_out);
! 2713:
! 2714: DESTROY_IF(this->key);
! 2715: DESTROY_IF(this->auth);
! 2716: this->auth = auth_cfg_create();
! 2717:
! 2718: while (array_remove(this->key_types, ARRAY_HEAD, &type))
! 2719: {
! 2720: this->key = lib->credmgr->get_private(lib->credmgr, type, this->peer,
! 2721: this->auth);
! 2722: if (this->key)
! 2723: {
! 2724: *key_out = this->key;
! 2725: if (auth_out)
! 2726: {
! 2727: *auth_out = this->auth;
! 2728: }
! 2729: return TRUE;
! 2730: }
! 2731: }
! 2732: return FALSE;
! 2733: }
! 2734:
! 2735: METHOD(enumerator_t, private_key_destroy, void,
! 2736: private_key_enumerator_t *this)
! 2737: {
! 2738: DESTROY_IF(this->key);
! 2739: DESTROY_IF(this->auth);
! 2740: array_destroy(this->key_types);
! 2741: free(this);
! 2742: }
! 2743:
! 2744: /**
! 2745: * See header.
! 2746: */
! 2747: enumerator_t *tls_create_private_key_enumerator(tls_version_t min_version,
! 2748: tls_version_t max_version,
! 2749: chunk_t hashsig,
! 2750: identification_t *peer)
! 2751: {
! 2752: private_key_enumerator_t *enumerator;
! 2753: enumerator_t *key_types;
! 2754:
! 2755: key_types = get_supported_key_types(min_version, max_version);
! 2756:
! 2757: INIT(enumerator,
! 2758: .public = {
! 2759: .enumerate = enumerator_enumerate_default,
! 2760: .venumerate = _private_key_enumerate,
! 2761: .destroy = _private_key_destroy,
! 2762: },
! 2763: .key_types = create_common_key_types(key_types, hashsig),
! 2764: .peer = peer,
! 2765: );
! 2766: key_types->destroy(key_types);
! 2767:
! 2768: if (!array_count(enumerator->key_types))
! 2769: {
! 2770: private_key_destroy(enumerator);
! 2771: return NULL;
! 2772: }
! 2773: return &enumerator->public;
! 2774: }
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>