blob: 451187df0c7abeef39be60a7cf1040c4024a36ab [file] [log] [blame]
Jerry Yu305bfc32021-11-24 16:04:47 +08001#!/usr/bin/env python3
2
3# generate_tls13_compat_tests.py
4#
5# Copyright The Mbed TLS Contributors
6# SPDX-License-Identifier: Apache-2.0
7#
8# Licensed under the Apache License, Version 2.0 (the "License"); you may
9# not use this file except in compliance with the License.
10# You may obtain a copy of the License at
11#
12# http://www.apache.org/licenses/LICENSE-2.0
13#
14# Unless required by applicable law or agreed to in writing, software
15# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
16# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
17# See the License for the specific language governing permissions and
18# limitations under the License.
19
20"""
21Generate TLSv1.3 Compat test cases
22
23"""
24
25import sys
Jerry Yudda036d2021-11-30 11:19:41 +080026import os
Jerry Yu305bfc32021-11-24 16:04:47 +080027import abc
28import argparse
Jerry Yuc4aa1522021-11-26 11:13:58 +080029import itertools
Jerry Yu882c30d2021-12-01 10:59:59 +080030from collections import namedtuple
Jerry Yu305bfc32021-11-24 16:04:47 +080031
Jerry Yu882c30d2021-12-01 10:59:59 +080032# define certificates configuration entry
33Certificate = namedtuple("Certificate", ['cafile', 'certfile', 'keyfile'])
34# define the certificate parameters for signature algorithms
Jerry Yu305bfc32021-11-24 16:04:47 +080035CERTIFICATES = {
Jerry Yu882c30d2021-12-01 10:59:59 +080036 'ecdsa_secp256r1_sha256': Certificate('data_files/test-ca2.crt',
37 'data_files/ecdsa_secp256r1.crt',
38 'data_files/ecdsa_secp256r1.key'),
39 'ecdsa_secp384r1_sha384': Certificate('data_files/test-ca2.crt',
40 'data_files/ecdsa_secp384r1.crt',
41 'data_files/ecdsa_secp384r1.key'),
42 'ecdsa_secp521r1_sha512': Certificate('data_files/test-ca2.crt',
43 'data_files/ecdsa_secp521r1.crt',
44 'data_files/ecdsa_secp521r1.key'),
45 'rsa_pss_rsae_sha256': Certificate('data_files/test-ca_cat12.crt',
46 'data_files/server2-sha256.crt', 'data_files/server2.key'
47 )
Jerry Yu29deed42021-11-25 11:09:54 +080048}
Jerry Yu305bfc32021-11-24 16:04:47 +080049
50CIPHER_SUITE_IANA_VALUE = {
51 "TLS_AES_128_GCM_SHA256": 0x1301,
52 "TLS_AES_256_GCM_SHA384": 0x1302,
53 "TLS_CHACHA20_POLY1305_SHA256": 0x1303,
54 "TLS_AES_128_CCM_SHA256": 0x1304,
55 "TLS_AES_128_CCM_8_SHA256": 0x1305
56}
57
58SIG_ALG_IANA_VALUE = {
59 "ecdsa_secp256r1_sha256": 0x0403,
60 "ecdsa_secp384r1_sha384": 0x0503,
61 "ecdsa_secp521r1_sha512": 0x0603,
Jerry Yu29deed42021-11-25 11:09:54 +080062 'rsa_pss_rsae_sha256': 0x0804,
Jerry Yu305bfc32021-11-24 16:04:47 +080063}
64
65NAMED_GROUP_IANA_VALUE = {
66 'secp256r1': 0x17,
67 'secp384r1': 0x18,
68 'secp521r1': 0x19,
69 'x25519': 0x1d,
70 'x448': 0x1e,
71}
72
XiaokangQian7069cbc2022-02-24 08:30:39 +000073SERVER_NAMED_GROUP_IANA_VALUE = {
74 'secp256r1': 0x17,
75 'secp384r1': 0x18,
76 'secp521r1': 0x19,
77 'x448': 0x1e,
78}
79
80CLIENT_NAMED_GROUP_IANA_VALUE = {
81 'x25519': 0x1d,
82}
Jerry Yu7de79852022-03-23 16:50:47 +080083
Jerry Yu305bfc32021-11-24 16:04:47 +080084class TLSProgram(metaclass=abc.ABCMeta):
85 """
86 Base class for generate server/client command.
87 """
Jerry Yu7de79852022-03-23 16:50:47 +080088 # pylint: disable=too-many-arguments
89 def __init__(self, ciphersuite=None, signature_algorithm=None, named_group=None,
XiaokangQian7069cbc2022-02-24 08:30:39 +000090 is_hrr=False, cert_sig_alg=None, compat_mode=True):
Jerry Yu7918efe2021-12-01 15:29:10 +080091 self._ciphers = []
92 self._sig_algs = []
93 self._named_groups = []
XiaokangQian7069cbc2022-02-24 08:30:39 +000094 self._is_hrr = is_hrr
Jerry Yu7de79852022-03-23 16:50:47 +080095 self._cert_sig_algs = []
96 if ciphersuite:
97 self.add_ciphersuites(ciphersuite)
98 if named_group:
99 self.add_named_groups(named_group)
100 if signature_algorithm:
101 self.add_signature_algorithms(signature_algorithm)
102 if cert_sig_alg:
103 self.add_cert_signature_algorithms(cert_sig_alg)
Ronald Cronae937252021-12-10 09:55:15 +0100104 self._compat_mode = compat_mode
Jerry Yu305bfc32021-11-24 16:04:47 +0800105
Jerry Yu7918efe2021-12-01 15:29:10 +0800106 # add_ciphersuites should not override by sub class
Jerry Yu305bfc32021-11-24 16:04:47 +0800107 def add_ciphersuites(self, *ciphersuites):
Jerry Yu7918efe2021-12-01 15:29:10 +0800108 self._ciphers.extend(
109 [cipher for cipher in ciphersuites if cipher not in self._ciphers])
Jerry Yu305bfc32021-11-24 16:04:47 +0800110
Jerry Yu7918efe2021-12-01 15:29:10 +0800111 # add_signature_algorithms should not override by sub class
Jerry Yu305bfc32021-11-24 16:04:47 +0800112 def add_signature_algorithms(self, *signature_algorithms):
Jerry Yu7918efe2021-12-01 15:29:10 +0800113 self._sig_algs.extend(
114 [sig_alg for sig_alg in signature_algorithms if sig_alg not in self._sig_algs])
Jerry Yu305bfc32021-11-24 16:04:47 +0800115
Jerry Yu7de79852022-03-23 16:50:47 +0800116 # add_named_groups should not override by sub class
Jerry Yu305bfc32021-11-24 16:04:47 +0800117 def add_named_groups(self, *named_groups):
Jerry Yu7918efe2021-12-01 15:29:10 +0800118 self._named_groups.extend(
119 [named_group for named_group in named_groups if named_group not in self._named_groups])
Jerry Yu305bfc32021-11-24 16:04:47 +0800120
Jerry Yu7de79852022-03-23 16:50:47 +0800121 # add_cert_signature_algorithms should not override by sub class
122 def add_cert_signature_algorithms(self, *signature_algorithms):
123 self._cert_sig_algs.extend(
124 [sig_alg for sig_alg in signature_algorithms if sig_alg not in self._cert_sig_algs])
125
Jerry Yu305bfc32021-11-24 16:04:47 +0800126 @abc.abstractmethod
127 def pre_checks(self):
128 return []
129
130 @abc.abstractmethod
131 def cmd(self):
Jerry Yu7de79852022-03-23 16:50:47 +0800132 if not self._cert_sig_algs:
133 self._cert_sig_algs = list(CERTIFICATES.keys())
Jerry Yu305bfc32021-11-24 16:04:47 +0800134
135 @abc.abstractmethod
136 def post_checks(self):
137 return []
138
139
140class OpenSSLServ(TLSProgram):
141 """
142 Generate test commands for OpenSSL server.
143 """
Jerry Yu305bfc32021-11-24 16:04:47 +0800144
145 NAMED_GROUP = {
146 'secp256r1': 'P-256',
147 'secp384r1': 'P-384',
148 'secp521r1': 'P-521',
149 'x25519': 'X25519',
150 'x448': 'X448',
151 }
152
Jerry Yu305bfc32021-11-24 16:04:47 +0800153 def cmd(self):
Jerry Yu7de79852022-03-23 16:50:47 +0800154 super().cmd()
Jerry Yu305bfc32021-11-24 16:04:47 +0800155 ret = ['$O_NEXT_SRV_NO_CERT']
Jerry Yu7de79852022-03-23 16:50:47 +0800156 for _, cert, key in map(lambda sig_alg: CERTIFICATES[sig_alg], self._cert_sig_algs):
Jerry Yu305bfc32021-11-24 16:04:47 +0800157 ret += ['-cert {cert} -key {key}'.format(cert=cert, key=key)]
158 ret += ['-accept $SRV_PORT']
Jerry Yu7de79852022-03-23 16:50:47 +0800159
160 if self._ciphers:
161 ciphersuites = ':'.join(self._ciphers)
162 ret += ["-ciphersuites {ciphersuites}".format(ciphersuites=ciphersuites)]
163
164 if self._sig_algs:
Jerry Yu72d81e52022-03-24 22:08:34 +0800165 signature_algorithms = set(self._sig_algs + self._cert_sig_algs)
166 signature_algorithms = ':'.join(signature_algorithms)
Jerry Yu7de79852022-03-23 16:50:47 +0800167 ret += ["-sigalgs {signature_algorithms}".format(
168 signature_algorithms=signature_algorithms)]
169
170 if self._named_groups:
171 named_groups = ':'.join(
172 map(lambda named_group: self.NAMED_GROUP[named_group], self._named_groups))
173 ret += ["-groups {named_groups}".format(named_groups=named_groups)]
174
Ronald Cronfdb0e3f2021-12-09 10:39:19 +0100175 ret += ['-msg -tls1_3 -num_tickets 0 -no_resume_ephemeral -no_cache']
Ronald Cronae937252021-12-10 09:55:15 +0100176 if not self._compat_mode:
177 ret += ['-no_middlebox']
178
Jerry Yu305bfc32021-11-24 16:04:47 +0800179 return ' '.join(ret)
180
181 def pre_checks(self):
182 return ["requires_openssl_tls1_3"]
183
184 def post_checks(self):
Jerry Yu29deed42021-11-25 11:09:54 +0800185 return ['-c "HTTP/1.0 200 ok"']
Jerry Yu305bfc32021-11-24 16:04:47 +0800186
187
188class GnuTLSServ(TLSProgram):
189 """
190 Generate test commands for GnuTLS server.
191 """
192
Jerry Yu305bfc32021-11-24 16:04:47 +0800193 CIPHER_SUITE = {
194 'TLS_AES_256_GCM_SHA384': [
195 'AES-256-GCM',
196 'SHA384',
197 'AEAD'],
198 'TLS_AES_128_GCM_SHA256': [
199 'AES-128-GCM',
200 'SHA256',
201 'AEAD'],
202 'TLS_CHACHA20_POLY1305_SHA256': [
203 'CHACHA20-POLY1305',
204 'SHA256',
205 'AEAD'],
206 'TLS_AES_128_CCM_SHA256': [
207 'AES-128-CCM',
208 'SHA256',
209 'AEAD'],
210 'TLS_AES_128_CCM_8_SHA256': [
211 'AES-128-CCM-8',
212 'SHA256',
213 'AEAD']}
214
Jerry Yu305bfc32021-11-24 16:04:47 +0800215 SIGNATURE_ALGORITHM = {
216 'ecdsa_secp256r1_sha256': ['SIGN-ECDSA-SECP256R1-SHA256'],
217 'ecdsa_secp521r1_sha512': ['SIGN-ECDSA-SECP521R1-SHA512'],
Jerry Yu29deed42021-11-25 11:09:54 +0800218 'ecdsa_secp384r1_sha384': ['SIGN-ECDSA-SECP384R1-SHA384'],
219 'rsa_pss_rsae_sha256': ['SIGN-RSA-PSS-RSAE-SHA256']}
Jerry Yu305bfc32021-11-24 16:04:47 +0800220
Jerry Yu305bfc32021-11-24 16:04:47 +0800221 NAMED_GROUP = {
222 'secp256r1': ['GROUP-SECP256R1'],
223 'secp384r1': ['GROUP-SECP384R1'],
224 'secp521r1': ['GROUP-SECP521R1'],
225 'x25519': ['GROUP-X25519'],
226 'x448': ['GROUP-X448'],
227 }
228
Jerry Yu305bfc32021-11-24 16:04:47 +0800229 def pre_checks(self):
230 return ["requires_gnutls_tls1_3",
231 "requires_gnutls_next_no_ticket",
232 "requires_gnutls_next_disable_tls13_compat", ]
233
234 def post_checks(self):
Jerry Yu29deed42021-11-25 11:09:54 +0800235 return ['-c "HTTP/1.0 200 OK"']
Jerry Yu305bfc32021-11-24 16:04:47 +0800236
237 def cmd(self):
Jerry Yu7de79852022-03-23 16:50:47 +0800238 super().cmd()
Jerry Yu7918efe2021-12-01 15:29:10 +0800239 ret = ['$G_NEXT_SRV_NO_CERT', '--http',
240 '--disable-client-cert', '--debug=4']
241
Jerry Yu7de79852022-03-23 16:50:47 +0800242 for _, cert, key in map(lambda sig_alg: CERTIFICATES[sig_alg], self._cert_sig_algs):
Jerry Yu305bfc32021-11-24 16:04:47 +0800243 ret += ['--x509certfile {cert} --x509keyfile {key}'.format(
244 cert=cert, key=key)]
Jerry Yu7918efe2021-12-01 15:29:10 +0800245
246 priority_string_list = []
247
248 def update_priority_string_list(items, map_table):
249 for item in items:
250 for i in map_table[item]:
251 if i not in priority_string_list:
252 yield i
Jerry Yu7de79852022-03-23 16:50:47 +0800253
254 if self._ciphers:
255 priority_string_list.extend(update_priority_string_list(
256 self._ciphers, self.CIPHER_SUITE))
257 else:
258 priority_string_list.append('CIPHER-ALL')
259
260 if self._sig_algs:
Jerry Yu72d81e52022-03-24 22:08:34 +0800261 signature_algorithms = set(self._sig_algs + self._cert_sig_algs)
Jerry Yu7de79852022-03-23 16:50:47 +0800262 priority_string_list.extend(update_priority_string_list(
Jerry Yu72d81e52022-03-24 22:08:34 +0800263 signature_algorithms, self.SIGNATURE_ALGORITHM))
Jerry Yu7de79852022-03-23 16:50:47 +0800264 else:
265 priority_string_list.append('SIGN-ALL')
266
267
268 if self._named_groups:
269 priority_string_list.extend(update_priority_string_list(
270 self._named_groups, self.NAMED_GROUP))
271 else:
272 priority_string_list.append('GROUP-ALL')
273
274 priority_string_list = ['NONE'] + \
275 sorted(priority_string_list) + ['VERS-TLS1.3']
Jerry Yu7918efe2021-12-01 15:29:10 +0800276
277 priority_string = ':+'.join(priority_string_list)
Ronald Cronfdb0e3f2021-12-09 10:39:19 +0100278 priority_string += ':%NO_TICKETS'
Jerry Yu7de79852022-03-23 16:50:47 +0800279
Ronald Cronae937252021-12-10 09:55:15 +0100280 if not self._compat_mode:
281 priority_string += [':%DISABLE_TLS13_COMPAT_MODE']
282
Jerry Yu7918efe2021-12-01 15:29:10 +0800283 ret += ['--priority={priority_string}'.format(
284 priority_string=priority_string)]
Jerry Yu305bfc32021-11-24 16:04:47 +0800285 ret = ' '.join(ret)
286 return ret
287
288
289class MbedTLSCli(TLSProgram):
290 """
291 Generate test commands for mbedTLS client.
292 """
Jerry Yu29deed42021-11-25 11:09:54 +0800293
Jerry Yu305bfc32021-11-24 16:04:47 +0800294 CIPHER_SUITE = {
295 'TLS_AES_256_GCM_SHA384': 'TLS1-3-AES-256-GCM-SHA384',
296 'TLS_AES_128_GCM_SHA256': 'TLS1-3-AES-128-GCM-SHA256',
297 'TLS_CHACHA20_POLY1305_SHA256': 'TLS1-3-CHACHA20-POLY1305-SHA256',
298 'TLS_AES_128_CCM_SHA256': 'TLS1-3-AES-128-CCM-SHA256',
299 'TLS_AES_128_CCM_8_SHA256': 'TLS1-3-AES-128-CCM-8-SHA256'}
300
Jerry Yu7918efe2021-12-01 15:29:10 +0800301 def cmd(self):
Jerry Yu7de79852022-03-23 16:50:47 +0800302 super().cmd()
Jerry Yu7918efe2021-12-01 15:29:10 +0800303 ret = ['$P_CLI']
304 ret += ['server_addr=127.0.0.1', 'server_port=$SRV_PORT',
Jerry Yu52a6e7e2021-12-06 18:24:46 +0800305 'debug_level=4', 'force_version=tls13']
Jerry Yu7918efe2021-12-01 15:29:10 +0800306 ret += ['ca_file={cafile}'.format(
Jerry Yu7de79852022-03-23 16:50:47 +0800307 cafile=CERTIFICATES[self._cert_sig_algs[0]].cafile)]
Jerry Yu305bfc32021-11-24 16:04:47 +0800308
Jerry Yu7918efe2021-12-01 15:29:10 +0800309 if self._ciphers:
310 ciphers = ','.join(
311 map(lambda cipher: self.CIPHER_SUITE[cipher], self._ciphers))
312 ret += ["force_ciphersuite={ciphers}".format(ciphers=ciphers)]
Jerry Yu305bfc32021-11-24 16:04:47 +0800313
Jerry Yu72d81e52022-03-24 22:08:34 +0800314 if self._sig_algs + self._cert_sig_algs:
Jerry Yu7918efe2021-12-01 15:29:10 +0800315 ret += ['sig_algs={sig_algs}'.format(
Jerry Yu72d81e52022-03-24 22:08:34 +0800316 sig_algs=','.join(set(self._sig_algs + self._cert_sig_algs)))]
Jerry Yu305bfc32021-11-24 16:04:47 +0800317
Jerry Yu7918efe2021-12-01 15:29:10 +0800318 if self._named_groups:
319 named_groups = ','.join(self._named_groups)
XiaokangQian7069cbc2022-02-24 08:30:39 +0000320 if self._is_hrr:
321 named_groups += ','
322 self_group_list = list(NAMED_GROUP_IANA_VALUE.keys())
323 self_group_list.remove(self._named_groups[0])
324 self_group = ','.join(self_group_list)
325 named_groups += (self_group)
Jerry Yu7918efe2021-12-01 15:29:10 +0800326 ret += ["curves={named_groups}".format(named_groups=named_groups)]
327
328 ret = ' '.join(ret)
329 return ret
Jerry Yu305bfc32021-11-24 16:04:47 +0800330
331 def pre_checks(self):
Jerry Yu29deed42021-11-25 11:09:54 +0800332 ret = ['requires_config_enabled MBEDTLS_DEBUG_C',
333 'requires_config_enabled MBEDTLS_SSL_CLI_C',
Ronald Cron135427c2022-01-07 22:14:24 +0100334 'requires_config_enabled MBEDTLS_SSL_PROTO_TLS1_3']
Ronald Cronae937252021-12-10 09:55:15 +0100335
336 if self._compat_mode:
337 ret += ['requires_config_enabled MBEDTLS_SSL_TLS1_3_COMPATIBILITY_MODE']
338
Jerry Yu7de79852022-03-23 16:50:47 +0800339 if 'rsa_pss_rsae_sha256' in self._sig_algs + self._cert_sig_algs:
Jerry Yu29deed42021-11-25 11:09:54 +0800340 ret.append(
341 'requires_config_enabled MBEDTLS_X509_RSASSA_PSS_SUPPORT')
342 return ret
Jerry Yu305bfc32021-11-24 16:04:47 +0800343
344 def post_checks(self):
Jerry Yu7de79852022-03-23 16:50:47 +0800345 check_strings = []
346 if self._ciphers:
347 check_strings.append(
348 "server hello, chosen ciphersuite: ( {:04x} ) - {}".format(
349 CIPHER_SUITE_IANA_VALUE[self._ciphers[0]],
350 self.CIPHER_SUITE[self._ciphers[0]]))
351 if self._sig_algs:
352 check_strings.append(
353 "Certificate Verify: Signature algorithm ( {:04x} )".format(
354 SIG_ALG_IANA_VALUE[self._sig_algs[0]]))
355
356 for named_group in self._named_groups:
357 check_strings += ['NamedGroup: {named_group} ( {iana_value:x} )'.format(
358 named_group=named_group,
359 iana_value=NAMED_GROUP_IANA_VALUE[named_group])]
360
361 check_strings.append("Verifying peer X.509 certificate... ok")
Jerry Yu305bfc32021-11-24 16:04:47 +0800362 return ['-c "{}"'.format(i) for i in check_strings]
363
XiaokangQian7069cbc2022-02-24 08:30:39 +0000364 def post_hrr_checks(self):
365 check_strings = ["server hello, chosen ciphersuite: ( {:04x} ) - {}".format(
366 CIPHER_SUITE_IANA_VALUE[self._ciphers[0]],
367 self.CIPHER_SUITE[self._ciphers[0]]),
368 "Certificate Verify: Signature algorithm ( {:04x} )".format(
369 SIG_ALG_IANA_VALUE[self._sig_algs[0]]),
370 "<= ssl_tls13_process_server_hello ( HelloRetryRequest )",
371 "Verifying peer X.509 certificate... ok", ]
372 return ['-c "{}"'.format(i) for i in check_strings]
373
Jerry Yu305bfc32021-11-24 16:04:47 +0800374
Jerry Yub4ac8f32021-12-01 10:41:37 +0800375SERVER_CLASSES = {'OpenSSL': OpenSSLServ, 'GnuTLS': GnuTLSServ}
376CLIENT_CLASSES = {'mbedTLS': MbedTLSCli}
Jerry Yu305bfc32021-11-24 16:04:47 +0800377
378
Jerry Yub4ac8f32021-12-01 10:41:37 +0800379def generate_compat_test(server=None, client=None, cipher=None, sig_alg=None, named_group=None):
Jerry Yu305bfc32021-11-24 16:04:47 +0800380 """
381 Generate test case with `ssl-opt.sh` format.
382 """
Jerry Yudda036d2021-11-30 11:19:41 +0800383 name = 'TLS 1.3 {client[0]}->{server[0]}: {cipher},{named_group},{sig_alg}'.format(
Jerry Yu305bfc32021-11-24 16:04:47 +0800384 client=client, server=server, cipher=cipher, sig_alg=sig_alg, named_group=named_group)
Jerry Yu7de79852022-03-23 16:50:47 +0800385
386 server_object = SERVER_CLASSES[server](ciphersuite=cipher,
387 named_group=named_group,
388 signature_algorithm=sig_alg,
389 cert_sig_alg=sig_alg)
390 client_object = CLIENT_CLASSES[client](ciphersuite=cipher,
391 named_group=named_group,
392 signature_algorithm=sig_alg,
393 cert_sig_alg=sig_alg)
Jerry Yu305bfc32021-11-24 16:04:47 +0800394
395 cmd = ['run_test "{}"'.format(name), '"{}"'.format(
Jerry Yub4ac8f32021-12-01 10:41:37 +0800396 server_object.cmd()), '"{}"'.format(client_object.cmd()), '0']
397 cmd += server_object.post_checks()
398 cmd += client_object.post_checks()
Jerry Yu7de79852022-03-23 16:50:47 +0800399 cmd += ['-C "received HelloRetryRequest message"']
Jerry Yucdcb6832021-11-29 16:50:13 +0800400 prefix = ' \\\n' + (' '*9)
Jerry Yu305bfc32021-11-24 16:04:47 +0800401 cmd = prefix.join(cmd)
Jerry Yub4ac8f32021-12-01 10:41:37 +0800402 return '\n'.join(server_object.pre_checks() + client_object.pre_checks() + [cmd])
Jerry Yu29deed42021-11-25 11:09:54 +0800403
XiaokangQian7069cbc2022-02-24 08:30:39 +0000404def generate_compat_hrr_test(server=None, client=None, cipher=None, sig_alg=None, client_named_group=None, server_named_group=None):
405 """
406 Generate test case with `ssl-opt.sh` format.
407 """
408 name = 'TLS 1.3 {client[0]}->{server[0]}: {cipher},{named_group},{sig_alg}, force hrr'.format(
409 client=client, server=server, cipher=cipher, sig_alg=sig_alg, named_group=server_named_group)
410 server_object = SERVER_CLASSES[server](cipher, sig_alg, server_named_group)
411 client_object = CLIENT_CLASSES[client](cipher, sig_alg, client_named_group, True)
412
413 cmd = ['run_test "{}"'.format(name), '"{}"'.format(
414 server_object.cmd()), '"{}"'.format(client_object.cmd()), '0']
415 cmd += server_object.post_checks()
416 cmd += client_object.post_hrr_checks()
417 prefix = ' \\\n' + (' '*9)
418 cmd = prefix.join(cmd)
419 return '\n'.join(server_object.pre_checks() + client_object.pre_checks() + [cmd])
420
Jerry Yu7f5e5ad2021-11-29 17:37:19 +0800421
422SSL_OUTPUT_HEADER = '''#!/bin/sh
Jerry Yucdcb6832021-11-29 16:50:13 +0800423
424# {filename}
425#
426# Copyright The Mbed TLS Contributors
427# SPDX-License-Identifier: Apache-2.0
428#
429# Licensed under the Apache License, Version 2.0 (the "License"); you may
430# not use this file except in compliance with the License.
431# You may obtain a copy of the License at
432#
433# http://www.apache.org/licenses/LICENSE-2.0
434#
435# Unless required by applicable law or agreed to in writing, software
436# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
437# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
438# See the License for the specific language governing permissions and
439# limitations under the License.
440#
441# Purpose
442#
443# List TLS1.3 compat test cases. They are generated by
Jerry Yu7de79852022-03-23 16:50:47 +0800444# `{cmd}`.
Jerry Yucdcb6832021-11-29 16:50:13 +0800445#
446# PLEASE DO NOT EDIT THIS FILE. IF NEEDED, PLEASE MODIFY `generate_tls13_compat_tests.py`
447# AND REGENERATE THIS FILE.
448#
449'''
Jerry Yu29deed42021-11-25 11:09:54 +0800450
Jerry Yu7f5e5ad2021-11-29 17:37:19 +0800451
Jerry Yu305bfc32021-11-24 16:04:47 +0800452def main():
Jerry Yudda036d2021-11-30 11:19:41 +0800453 """
454 Main function of this program
455 """
Jerry Yu305bfc32021-11-24 16:04:47 +0800456 parser = argparse.ArgumentParser()
457
Jerry Yucdcb6832021-11-29 16:50:13 +0800458 parser.add_argument('-o', '--output', nargs='?',
Jerry Yu7f5e5ad2021-11-29 17:37:19 +0800459 default=None, help='Output file path if `-a` was set')
Jerry Yucdcb6832021-11-29 16:50:13 +0800460
Jerry Yuc4aa1522021-11-26 11:13:58 +0800461 parser.add_argument('-a', '--generate-all-tls13-compat-tests', action='store_true',
462 default=False, help='Generate all available tls13 compat tests')
463
XiaokangQian7069cbc2022-02-24 08:30:39 +0000464 parser.add_argument('-r', '--generate-hrr-tls13-compat-tests', action='store_true',
465 default=False, help='Generate all hrr tls13 compat tests')
466
Jerry Yu305bfc32021-11-24 16:04:47 +0800467 parser.add_argument('--list-ciphers', action='store_true',
468 default=False, help='List supported ciphersuites')
469
470 parser.add_argument('--list-sig-algs', action='store_true',
471 default=False, help='List supported signature algorithms')
472
473 parser.add_argument('--list-named-groups', action='store_true',
474 default=False, help='List supported named groups')
475
476 parser.add_argument('--list-servers', action='store_true',
477 default=False, help='List supported TLS servers')
478
479 parser.add_argument('--list-clients', action='store_true',
480 default=False, help='List supported TLS Clients')
481
Jerry Yub4ac8f32021-12-01 10:41:37 +0800482 parser.add_argument('server', choices=SERVER_CLASSES.keys(), nargs='?',
483 default=list(SERVER_CLASSES.keys())[0],
Jerry Yu305bfc32021-11-24 16:04:47 +0800484 help='Choose TLS server program for test')
Jerry Yub4ac8f32021-12-01 10:41:37 +0800485 parser.add_argument('client', choices=CLIENT_CLASSES.keys(), nargs='?',
486 default=list(CLIENT_CLASSES.keys())[0],
Jerry Yu305bfc32021-11-24 16:04:47 +0800487 help='Choose TLS client program for test')
488 parser.add_argument('cipher', choices=CIPHER_SUITE_IANA_VALUE.keys(), nargs='?',
489 default=list(CIPHER_SUITE_IANA_VALUE.keys())[0],
490 help='Choose cipher suite for test')
491 parser.add_argument('sig_alg', choices=SIG_ALG_IANA_VALUE.keys(), nargs='?',
492 default=list(SIG_ALG_IANA_VALUE.keys())[0],
493 help='Choose cipher suite for test')
494 parser.add_argument('named_group', choices=NAMED_GROUP_IANA_VALUE.keys(), nargs='?',
495 default=list(NAMED_GROUP_IANA_VALUE.keys())[0],
496 help='Choose cipher suite for test')
497
XiaokangQian7069cbc2022-02-24 08:30:39 +0000498 parser.add_argument('client_named_group', choices=CLIENT_NAMED_GROUP_IANA_VALUE.keys(), nargs='?',
499 default=list(CLIENT_NAMED_GROUP_IANA_VALUE.keys())[0],
500 help='Choose cipher suite for test')
501
502 parser.add_argument('server_named_group', choices=SERVER_NAMED_GROUP_IANA_VALUE.keys(), nargs='?',
503 default=list(SERVER_NAMED_GROUP_IANA_VALUE.keys())[0],
504 help='Choose cipher suite for test')
505
Jerry Yu305bfc32021-11-24 16:04:47 +0800506 args = parser.parse_args()
Jerry Yucdcb6832021-11-29 16:50:13 +0800507
Jerry Yu7f5e5ad2021-11-29 17:37:19 +0800508 def get_all_test_cases():
Jerry Yu7de79852022-03-23 16:50:47 +0800509 # Generate normal compat test cases
Jerry Yub4ac8f32021-12-01 10:41:37 +0800510 for cipher, sig_alg, named_group, server, client in \
Jerry Yu7de79852022-03-23 16:50:47 +0800511 itertools.product(CIPHER_SUITE_IANA_VALUE.keys(),
512 SIG_ALG_IANA_VALUE.keys(),
513 NAMED_GROUP_IANA_VALUE.keys(),
514 SERVER_CLASSES.keys(),
Jerry Yub4ac8f32021-12-01 10:41:37 +0800515 CLIENT_CLASSES.keys()):
516 yield generate_compat_test(cipher=cipher, sig_alg=sig_alg, named_group=named_group,
517 server=server, client=client)
Jerry Yu7f5e5ad2021-11-29 17:37:19 +0800518
XiaokangQian7069cbc2022-02-24 08:30:39 +0000519 def get_hrr_test_cases():
520 for cipher, sig_alg, client_named_group, server_named_group, server, client in \
521 itertools.product(CIPHER_SUITE_IANA_VALUE.keys(), SIG_ALG_IANA_VALUE.keys(),
522 NAMED_GROUP_IANA_VALUE.keys(),NAMED_GROUP_IANA_VALUE.keys(), SERVER_CLASSES.keys(),
523 CLIENT_CLASSES.keys()):
524 if client_named_group != server_named_group:
525 yield generate_compat_hrr_test(cipher=cipher, sig_alg=sig_alg,
526 client_named_group=client_named_group,
527 server_named_group=server_named_group,
528 server=server, client=client)
Jerry Yu7de79852022-03-23 16:50:47 +0800529
Jerry Yu7f5e5ad2021-11-29 17:37:19 +0800530 if args.generate_all_tls13_compat_tests:
531 if args.output:
532 with open(args.output, 'w', encoding="utf-8") as f:
Jerry Yub4ac8f32021-12-01 10:41:37 +0800533 f.write(SSL_OUTPUT_HEADER.format(
Jerry Yu7de79852022-03-23 16:50:47 +0800534 filename=os.path.basename(args.output), cmd=' '.join(sys.argv)))
Jerry Yu7f5e5ad2021-11-29 17:37:19 +0800535 f.write('\n\n'.join(get_all_test_cases()))
Jerry Yudda036d2021-11-30 11:19:41 +0800536 f.write('\n')
Jerry Yu7f5e5ad2021-11-29 17:37:19 +0800537 else:
Jerry Yu7de79852022-03-23 16:50:47 +0800538 print('\n\n'.join(get_all_test_cases()))
Jerry Yuc4aa1522021-11-26 11:13:58 +0800539 return 0
540
XiaokangQian7069cbc2022-02-24 08:30:39 +0000541 if args.generate_hrr_tls13_compat_tests:
542 if args.output:
543 with open(args.output, 'w', encoding="utf-8") as f:
544 f.write(SSL_OUTPUT_HEADER.format(
545 filename=os.path.basename(args.output)))
546 f.write('\n\n'.join(get_hrr_test_cases()))
547 f.write('\n')
548 else:
549 print('\n'.join(get_hrr_test_cases()))
550 return 0
551
Jerry Yu305bfc32021-11-24 16:04:47 +0800552 if args.list_ciphers or args.list_sig_algs or args.list_named_groups \
Jerry Yu29deed42021-11-25 11:09:54 +0800553 or args.list_servers or args.list_clients:
Jerry Yu305bfc32021-11-24 16:04:47 +0800554 if args.list_ciphers:
Jerry Yu7f5e5ad2021-11-29 17:37:19 +0800555 print(*CIPHER_SUITE_IANA_VALUE.keys())
Jerry Yu305bfc32021-11-24 16:04:47 +0800556 if args.list_sig_algs:
Jerry Yu7f5e5ad2021-11-29 17:37:19 +0800557 print(*SIG_ALG_IANA_VALUE.keys())
Jerry Yu305bfc32021-11-24 16:04:47 +0800558 if args.list_named_groups:
Jerry Yu7f5e5ad2021-11-29 17:37:19 +0800559 print(*NAMED_GROUP_IANA_VALUE.keys())
Jerry Yu305bfc32021-11-24 16:04:47 +0800560 if args.list_servers:
Jerry Yub4ac8f32021-12-01 10:41:37 +0800561 print(*SERVER_CLASSES.keys())
Jerry Yu305bfc32021-11-24 16:04:47 +0800562 if args.list_clients:
Jerry Yub4ac8f32021-12-01 10:41:37 +0800563 print(*CLIENT_CLASSES.keys())
Jerry Yu305bfc32021-11-24 16:04:47 +0800564 return 0
Jerry Yucdcb6832021-11-29 16:50:13 +0800565
XiaokangQian7069cbc2022-02-24 08:30:39 +0000566 if args.generate_all_tls13_compat_tests:
567 print(generate_compat_test(server=args.server, client=args.client, sig_alg=args.sig_alg,
568 cipher=args.cipher, named_group=args.named_group))
569
570 if args.generate_hrr_tls13_compat_tests:
571 print(generate_compat_hrr_test(server=args.server, client=args.client,
572 sig_alg=args.sig_alg, cipher=args.cipher,
573 client_named_group=args.client_named_group,
574 server_named_group=args.server_named_group))
Jerry Yucdcb6832021-11-29 16:50:13 +0800575 return 0
Jerry Yu305bfc32021-11-24 16:04:47 +0800576
Jerry Yu29deed42021-11-25 11:09:54 +0800577
Jerry Yu305bfc32021-11-24 16:04:47 +0800578if __name__ == "__main__":
579 sys.exit(main())