blob: 8b5b868be4e8ad442e8e7e5a310a517421387c4b [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# pylint: disable=useless-super-delegation
32
Jerry Yu882c30d2021-12-01 10:59:59 +080033# define certificates configuration entry
34Certificate = namedtuple("Certificate", ['cafile', 'certfile', 'keyfile'])
35# define the certificate parameters for signature algorithms
Jerry Yu305bfc32021-11-24 16:04:47 +080036CERTIFICATES = {
Jerry Yu882c30d2021-12-01 10:59:59 +080037 'ecdsa_secp256r1_sha256': Certificate('data_files/test-ca2.crt',
38 'data_files/ecdsa_secp256r1.crt',
39 'data_files/ecdsa_secp256r1.key'),
40 'ecdsa_secp384r1_sha384': Certificate('data_files/test-ca2.crt',
41 'data_files/ecdsa_secp384r1.crt',
42 'data_files/ecdsa_secp384r1.key'),
43 'ecdsa_secp521r1_sha512': Certificate('data_files/test-ca2.crt',
44 'data_files/ecdsa_secp521r1.crt',
45 'data_files/ecdsa_secp521r1.key'),
46 'rsa_pss_rsae_sha256': Certificate('data_files/test-ca_cat12.crt',
47 'data_files/server2-sha256.crt', 'data_files/server2.key'
48 )
Jerry Yu29deed42021-11-25 11:09:54 +080049}
Jerry Yu305bfc32021-11-24 16:04:47 +080050
51CIPHER_SUITE_IANA_VALUE = {
52 "TLS_AES_128_GCM_SHA256": 0x1301,
53 "TLS_AES_256_GCM_SHA384": 0x1302,
54 "TLS_CHACHA20_POLY1305_SHA256": 0x1303,
55 "TLS_AES_128_CCM_SHA256": 0x1304,
56 "TLS_AES_128_CCM_8_SHA256": 0x1305
57}
58
59SIG_ALG_IANA_VALUE = {
60 "ecdsa_secp256r1_sha256": 0x0403,
61 "ecdsa_secp384r1_sha384": 0x0503,
62 "ecdsa_secp521r1_sha512": 0x0603,
Jerry Yu29deed42021-11-25 11:09:54 +080063 'rsa_pss_rsae_sha256': 0x0804,
Jerry Yu305bfc32021-11-24 16:04:47 +080064}
65
66NAMED_GROUP_IANA_VALUE = {
67 'secp256r1': 0x17,
68 'secp384r1': 0x18,
69 'secp521r1': 0x19,
70 'x25519': 0x1d,
71 'x448': 0x1e,
72}
73
74
75def remove_duplicates(seq):
76 seen = set()
77 seen_add = seen.add
78 return [x for x in seq if not (x in seen or seen_add(x))]
79
80
81class TLSProgram(metaclass=abc.ABCMeta):
82 """
83 Base class for generate server/client command.
84 """
Jerry Yu29deed42021-11-25 11:09:54 +080085
Jerry Yu305bfc32021-11-24 16:04:47 +080086 def __init__(self, ciphersuite, signature_algorithm, named_group):
Jerry Yu7918efe2021-12-01 15:29:10 +080087 self._ciphers = []
88 self._sig_algs = []
89 self._named_groups = []
Jerry Yu305bfc32021-11-24 16:04:47 +080090 self.add_ciphersuites(ciphersuite)
91 self.add_named_groups(named_group)
92 self.add_signature_algorithms(signature_algorithm)
93
Jerry Yu7918efe2021-12-01 15:29:10 +080094 # add_ciphersuites should not override by sub class
Jerry Yu305bfc32021-11-24 16:04:47 +080095 def add_ciphersuites(self, *ciphersuites):
Jerry Yu7918efe2021-12-01 15:29:10 +080096 self._ciphers.extend(
97 [cipher for cipher in ciphersuites if cipher not in self._ciphers])
Jerry Yu305bfc32021-11-24 16:04:47 +080098
Jerry Yu7918efe2021-12-01 15:29:10 +080099 # add_signature_algorithms should not override by sub class
Jerry Yu305bfc32021-11-24 16:04:47 +0800100 def add_signature_algorithms(self, *signature_algorithms):
Jerry Yu7918efe2021-12-01 15:29:10 +0800101 self._sig_algs.extend(
102 [sig_alg for sig_alg in signature_algorithms if sig_alg not in self._sig_algs])
Jerry Yu305bfc32021-11-24 16:04:47 +0800103
Jerry Yu7918efe2021-12-01 15:29:10 +0800104 # add_signature_algorithms should not override by sub class
Jerry Yu305bfc32021-11-24 16:04:47 +0800105 def add_named_groups(self, *named_groups):
Jerry Yu7918efe2021-12-01 15:29:10 +0800106 self._named_groups.extend(
107 [named_group for named_group in named_groups if named_group not in self._named_groups])
Jerry Yu305bfc32021-11-24 16:04:47 +0800108
109 @abc.abstractmethod
110 def pre_checks(self):
111 return []
112
113 @abc.abstractmethod
114 def cmd(self):
115 pass
116
117 @abc.abstractmethod
118 def post_checks(self):
119 return []
120
121
122class OpenSSLServ(TLSProgram):
123 """
124 Generate test commands for OpenSSL server.
125 """
Jerry Yu305bfc32021-11-24 16:04:47 +0800126
127 NAMED_GROUP = {
128 'secp256r1': 'P-256',
129 'secp384r1': 'P-384',
130 'secp521r1': 'P-521',
131 'x25519': 'X25519',
132 'x448': 'X448',
133 }
134
Jerry Yu305bfc32021-11-24 16:04:47 +0800135 def cmd(self):
136 ret = ['$O_NEXT_SRV_NO_CERT']
Jerry Yu7918efe2021-12-01 15:29:10 +0800137 for _, cert, key in map(lambda sig_alg: CERTIFICATES[sig_alg], self._sig_algs):
Jerry Yu305bfc32021-11-24 16:04:47 +0800138 ret += ['-cert {cert} -key {key}'.format(cert=cert, key=key)]
139 ret += ['-accept $SRV_PORT']
Jerry Yu7918efe2021-12-01 15:29:10 +0800140 ciphersuites = ','.join(self._ciphers)
141 signature_algorithms = ','.join(self._sig_algs)
142 named_groups = ','.join(
143 map(lambda named_group: self.NAMED_GROUP[named_group], self._named_groups))
Jerry Yu305bfc32021-11-24 16:04:47 +0800144 ret += ["-ciphersuites {ciphersuites}".format(ciphersuites=ciphersuites),
145 "-sigalgs {signature_algorithms}".format(
146 signature_algorithms=signature_algorithms),
147 "-groups {named_groups}".format(named_groups=named_groups)]
148 ret += ['-msg -tls1_3 -no_middlebox -num_tickets 0 -no_resume_ephemeral -no_cache']
149 return ' '.join(ret)
150
151 def pre_checks(self):
152 return ["requires_openssl_tls1_3"]
153
154 def post_checks(self):
Jerry Yu29deed42021-11-25 11:09:54 +0800155 return ['-c "HTTP/1.0 200 ok"']
Jerry Yu305bfc32021-11-24 16:04:47 +0800156
157
158class GnuTLSServ(TLSProgram):
159 """
160 Generate test commands for GnuTLS server.
161 """
162
Jerry Yu305bfc32021-11-24 16:04:47 +0800163 CIPHER_SUITE = {
164 'TLS_AES_256_GCM_SHA384': [
165 'AES-256-GCM',
166 'SHA384',
167 'AEAD'],
168 'TLS_AES_128_GCM_SHA256': [
169 'AES-128-GCM',
170 'SHA256',
171 'AEAD'],
172 'TLS_CHACHA20_POLY1305_SHA256': [
173 'CHACHA20-POLY1305',
174 'SHA256',
175 'AEAD'],
176 'TLS_AES_128_CCM_SHA256': [
177 'AES-128-CCM',
178 'SHA256',
179 'AEAD'],
180 'TLS_AES_128_CCM_8_SHA256': [
181 'AES-128-CCM-8',
182 'SHA256',
183 'AEAD']}
184
Jerry Yu305bfc32021-11-24 16:04:47 +0800185 SIGNATURE_ALGORITHM = {
186 'ecdsa_secp256r1_sha256': ['SIGN-ECDSA-SECP256R1-SHA256'],
187 'ecdsa_secp521r1_sha512': ['SIGN-ECDSA-SECP521R1-SHA512'],
Jerry Yu29deed42021-11-25 11:09:54 +0800188 'ecdsa_secp384r1_sha384': ['SIGN-ECDSA-SECP384R1-SHA384'],
189 'rsa_pss_rsae_sha256': ['SIGN-RSA-PSS-RSAE-SHA256']}
Jerry Yu305bfc32021-11-24 16:04:47 +0800190
Jerry Yu305bfc32021-11-24 16:04:47 +0800191 NAMED_GROUP = {
192 'secp256r1': ['GROUP-SECP256R1'],
193 'secp384r1': ['GROUP-SECP384R1'],
194 'secp521r1': ['GROUP-SECP521R1'],
195 'x25519': ['GROUP-X25519'],
196 'x448': ['GROUP-X448'],
197 }
198
Jerry Yu305bfc32021-11-24 16:04:47 +0800199 def pre_checks(self):
200 return ["requires_gnutls_tls1_3",
201 "requires_gnutls_next_no_ticket",
202 "requires_gnutls_next_disable_tls13_compat", ]
203
204 def post_checks(self):
Jerry Yu29deed42021-11-25 11:09:54 +0800205 return ['-c "HTTP/1.0 200 OK"']
Jerry Yu305bfc32021-11-24 16:04:47 +0800206
207 def cmd(self):
Jerry Yu7918efe2021-12-01 15:29:10 +0800208 ret = ['$G_NEXT_SRV_NO_CERT', '--http',
209 '--disable-client-cert', '--debug=4']
210
211 for _, cert, key in map(lambda sig_alg: CERTIFICATES[sig_alg], self._sig_algs):
Jerry Yu305bfc32021-11-24 16:04:47 +0800212 ret += ['--x509certfile {cert} --x509keyfile {key}'.format(
213 cert=cert, key=key)]
Jerry Yu7918efe2021-12-01 15:29:10 +0800214
215 priority_string_list = []
216
217 def update_priority_string_list(items, map_table):
218 for item in items:
219 for i in map_table[item]:
220 if i not in priority_string_list:
221 yield i
222 priority_string_list.extend(update_priority_string_list(
223 self._sig_algs, self.SIGNATURE_ALGORITHM))
224 priority_string_list.extend(
225 update_priority_string_list(self._ciphers, self.CIPHER_SUITE))
226 priority_string_list.extend(update_priority_string_list(
227 self._named_groups, self.NAMED_GROUP))
228 priority_string_list = ['NONE'] + sorted(priority_string_list) + ['VERS-TLS1.3']
229
230 priority_string = ':+'.join(priority_string_list)
231 priority_string += ':%NO_TICKETS:%DISABLE_TLS13_COMPAT_MODE'
232 ret += ['--priority={priority_string}'.format(
233 priority_string=priority_string)]
Jerry Yu305bfc32021-11-24 16:04:47 +0800234 ret = ' '.join(ret)
235 return ret
236
237
238class MbedTLSCli(TLSProgram):
239 """
240 Generate test commands for mbedTLS client.
241 """
Jerry Yu29deed42021-11-25 11:09:54 +0800242
Jerry Yu305bfc32021-11-24 16:04:47 +0800243 CIPHER_SUITE = {
244 'TLS_AES_256_GCM_SHA384': 'TLS1-3-AES-256-GCM-SHA384',
245 'TLS_AES_128_GCM_SHA256': 'TLS1-3-AES-128-GCM-SHA256',
246 'TLS_CHACHA20_POLY1305_SHA256': 'TLS1-3-CHACHA20-POLY1305-SHA256',
247 'TLS_AES_128_CCM_SHA256': 'TLS1-3-AES-128-CCM-SHA256',
248 'TLS_AES_128_CCM_8_SHA256': 'TLS1-3-AES-128-CCM-8-SHA256'}
249
Jerry Yu7918efe2021-12-01 15:29:10 +0800250 def cmd(self):
251 ret = ['$P_CLI']
252 ret += ['server_addr=127.0.0.1', 'server_port=$SRV_PORT',
253 'debug_level=4', 'force_version=tls1_3']
254 ret += ['ca_file={cafile}'.format(
255 cafile=CERTIFICATES[self._sig_algs[0]].cafile)]
Jerry Yu305bfc32021-11-24 16:04:47 +0800256
Jerry Yu7918efe2021-12-01 15:29:10 +0800257 if self._ciphers:
258 ciphers = ','.join(
259 map(lambda cipher: self.CIPHER_SUITE[cipher], self._ciphers))
260 ret += ["force_ciphersuite={ciphers}".format(ciphers=ciphers)]
Jerry Yu305bfc32021-11-24 16:04:47 +0800261
Jerry Yu7918efe2021-12-01 15:29:10 +0800262 if self._sig_algs:
263 ret += ['sig_algs={sig_algs}'.format(
264 sig_algs=','.join(self._sig_algs))]
265 for sig_alg in self._sig_algs:
266 if sig_alg in ('ecdsa_secp256r1_sha256',
267 'ecdsa_secp384r1_sha384',
268 'ecdsa_secp521r1_sha512'):
269 self.add_named_groups(sig_alg.split('_')[1])
Jerry Yu305bfc32021-11-24 16:04:47 +0800270
Jerry Yu7918efe2021-12-01 15:29:10 +0800271 if self._named_groups:
272 named_groups = ','.join(self._named_groups)
273 ret += ["curves={named_groups}".format(named_groups=named_groups)]
274
275 ret = ' '.join(ret)
276 return ret
Jerry Yu305bfc32021-11-24 16:04:47 +0800277
278 def pre_checks(self):
Jerry Yu29deed42021-11-25 11:09:54 +0800279 ret = ['requires_config_enabled MBEDTLS_DEBUG_C',
280 'requires_config_enabled MBEDTLS_SSL_CLI_C',
281 'requires_config_enabled MBEDTLS_SSL_PROTO_TLS1_3_EXPERIMENTAL',
282 'requires_config_disabled MBEDTLS_USE_PSA_CRYPTO']
Jerry Yu7918efe2021-12-01 15:29:10 +0800283 if 'rsa_pss_rsae_sha256' in self._sig_algs:
Jerry Yu29deed42021-11-25 11:09:54 +0800284 ret.append(
285 'requires_config_enabled MBEDTLS_X509_RSASSA_PSS_SUPPORT')
286 return ret
Jerry Yu305bfc32021-11-24 16:04:47 +0800287
288 def post_checks(self):
Jerry Yu7918efe2021-12-01 15:29:10 +0800289 check_strings = ["ECDH curve: {group}".format(group=self._named_groups[0]),
Jerry Yu305bfc32021-11-24 16:04:47 +0800290 "server hello, chosen ciphersuite: ( {:04x} ) - {}".format(
Jerry Yu7918efe2021-12-01 15:29:10 +0800291 CIPHER_SUITE_IANA_VALUE[self._ciphers[0]],
292 self.CIPHER_SUITE[self._ciphers[0]]),
Jerry Yu305bfc32021-11-24 16:04:47 +0800293 "Certificate Verify: Signature algorithm ( {:04x} )".format(
Jerry Yu7918efe2021-12-01 15:29:10 +0800294 SIG_ALG_IANA_VALUE[self._sig_algs[0]]),
Jerry Yu305bfc32021-11-24 16:04:47 +0800295 "Verifying peer X.509 certificate... ok", ]
296 return ['-c "{}"'.format(i) for i in check_strings]
297
Jerry Yu305bfc32021-11-24 16:04:47 +0800298
Jerry Yub4ac8f32021-12-01 10:41:37 +0800299SERVER_CLASSES = {'OpenSSL': OpenSSLServ, 'GnuTLS': GnuTLSServ}
300CLIENT_CLASSES = {'mbedTLS': MbedTLSCli}
Jerry Yu305bfc32021-11-24 16:04:47 +0800301
302
Jerry Yub4ac8f32021-12-01 10:41:37 +0800303def generate_compat_test(server=None, client=None, cipher=None, sig_alg=None, named_group=None):
Jerry Yu305bfc32021-11-24 16:04:47 +0800304 """
305 Generate test case with `ssl-opt.sh` format.
306 """
Jerry Yudda036d2021-11-30 11:19:41 +0800307 name = 'TLS 1.3 {client[0]}->{server[0]}: {cipher},{named_group},{sig_alg}'.format(
Jerry Yu305bfc32021-11-24 16:04:47 +0800308 client=client, server=server, cipher=cipher, sig_alg=sig_alg, named_group=named_group)
Jerry Yub4ac8f32021-12-01 10:41:37 +0800309 server_object = SERVER_CLASSES[server](cipher, sig_alg, named_group)
310 client_object = CLIENT_CLASSES[client](cipher, sig_alg, named_group)
Jerry Yu305bfc32021-11-24 16:04:47 +0800311
312 cmd = ['run_test "{}"'.format(name), '"{}"'.format(
Jerry Yub4ac8f32021-12-01 10:41:37 +0800313 server_object.cmd()), '"{}"'.format(client_object.cmd()), '0']
314 cmd += server_object.post_checks()
315 cmd += client_object.post_checks()
Jerry Yucdcb6832021-11-29 16:50:13 +0800316 prefix = ' \\\n' + (' '*9)
Jerry Yu305bfc32021-11-24 16:04:47 +0800317 cmd = prefix.join(cmd)
Jerry Yub4ac8f32021-12-01 10:41:37 +0800318 return '\n'.join(server_object.pre_checks() + client_object.pre_checks() + [cmd])
Jerry Yu29deed42021-11-25 11:09:54 +0800319
Jerry Yu7f5e5ad2021-11-29 17:37:19 +0800320
321SSL_OUTPUT_HEADER = '''#!/bin/sh
Jerry Yucdcb6832021-11-29 16:50:13 +0800322
323# {filename}
324#
325# Copyright The Mbed TLS Contributors
326# SPDX-License-Identifier: Apache-2.0
327#
328# Licensed under the Apache License, Version 2.0 (the "License"); you may
329# not use this file except in compliance with the License.
330# You may obtain a copy of the License at
331#
332# http://www.apache.org/licenses/LICENSE-2.0
333#
334# Unless required by applicable law or agreed to in writing, software
335# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
336# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
337# See the License for the specific language governing permissions and
338# limitations under the License.
339#
340# Purpose
341#
342# List TLS1.3 compat test cases. They are generated by
343# `generate_tls13_compat_tests.py -a`.
344#
345# PLEASE DO NOT EDIT THIS FILE. IF NEEDED, PLEASE MODIFY `generate_tls13_compat_tests.py`
346# AND REGENERATE THIS FILE.
347#
348'''
Jerry Yu29deed42021-11-25 11:09:54 +0800349
Jerry Yu7f5e5ad2021-11-29 17:37:19 +0800350
Jerry Yu305bfc32021-11-24 16:04:47 +0800351def main():
Jerry Yudda036d2021-11-30 11:19:41 +0800352 """
353 Main function of this program
354 """
Jerry Yu305bfc32021-11-24 16:04:47 +0800355 parser = argparse.ArgumentParser()
356
Jerry Yucdcb6832021-11-29 16:50:13 +0800357 parser.add_argument('-o', '--output', nargs='?',
Jerry Yu7f5e5ad2021-11-29 17:37:19 +0800358 default=None, help='Output file path if `-a` was set')
Jerry Yucdcb6832021-11-29 16:50:13 +0800359
Jerry Yuc4aa1522021-11-26 11:13:58 +0800360 parser.add_argument('-a', '--generate-all-tls13-compat-tests', action='store_true',
361 default=False, help='Generate all available tls13 compat tests')
362
Jerry Yu305bfc32021-11-24 16:04:47 +0800363 parser.add_argument('--list-ciphers', action='store_true',
364 default=False, help='List supported ciphersuites')
365
366 parser.add_argument('--list-sig-algs', action='store_true',
367 default=False, help='List supported signature algorithms')
368
369 parser.add_argument('--list-named-groups', action='store_true',
370 default=False, help='List supported named groups')
371
372 parser.add_argument('--list-servers', action='store_true',
373 default=False, help='List supported TLS servers')
374
375 parser.add_argument('--list-clients', action='store_true',
376 default=False, help='List supported TLS Clients')
377
Jerry Yub4ac8f32021-12-01 10:41:37 +0800378 parser.add_argument('server', choices=SERVER_CLASSES.keys(), nargs='?',
379 default=list(SERVER_CLASSES.keys())[0],
Jerry Yu305bfc32021-11-24 16:04:47 +0800380 help='Choose TLS server program for test')
Jerry Yub4ac8f32021-12-01 10:41:37 +0800381 parser.add_argument('client', choices=CLIENT_CLASSES.keys(), nargs='?',
382 default=list(CLIENT_CLASSES.keys())[0],
Jerry Yu305bfc32021-11-24 16:04:47 +0800383 help='Choose TLS client program for test')
384 parser.add_argument('cipher', choices=CIPHER_SUITE_IANA_VALUE.keys(), nargs='?',
385 default=list(CIPHER_SUITE_IANA_VALUE.keys())[0],
386 help='Choose cipher suite for test')
387 parser.add_argument('sig_alg', choices=SIG_ALG_IANA_VALUE.keys(), nargs='?',
388 default=list(SIG_ALG_IANA_VALUE.keys())[0],
389 help='Choose cipher suite for test')
390 parser.add_argument('named_group', choices=NAMED_GROUP_IANA_VALUE.keys(), nargs='?',
391 default=list(NAMED_GROUP_IANA_VALUE.keys())[0],
392 help='Choose cipher suite for test')
393
394 args = parser.parse_args()
Jerry Yucdcb6832021-11-29 16:50:13 +0800395
Jerry Yu7f5e5ad2021-11-29 17:37:19 +0800396 def get_all_test_cases():
Jerry Yub4ac8f32021-12-01 10:41:37 +0800397 for cipher, sig_alg, named_group, server, client in \
398 itertools.product(CIPHER_SUITE_IANA_VALUE.keys(), SIG_ALG_IANA_VALUE.keys(),
399 NAMED_GROUP_IANA_VALUE.keys(), SERVER_CLASSES.keys(),
400 CLIENT_CLASSES.keys()):
401 yield generate_compat_test(cipher=cipher, sig_alg=sig_alg, named_group=named_group,
402 server=server, client=client)
Jerry Yu7f5e5ad2021-11-29 17:37:19 +0800403
404 if args.generate_all_tls13_compat_tests:
405 if args.output:
406 with open(args.output, 'w', encoding="utf-8") as f:
Jerry Yub4ac8f32021-12-01 10:41:37 +0800407 f.write(SSL_OUTPUT_HEADER.format(
408 filename=os.path.basename(args.output)))
Jerry Yu7f5e5ad2021-11-29 17:37:19 +0800409 f.write('\n\n'.join(get_all_test_cases()))
Jerry Yudda036d2021-11-30 11:19:41 +0800410 f.write('\n')
Jerry Yu7f5e5ad2021-11-29 17:37:19 +0800411 else:
412 print('\n'.join(get_all_test_cases()))
Jerry Yuc4aa1522021-11-26 11:13:58 +0800413 return 0
414
Jerry Yu305bfc32021-11-24 16:04:47 +0800415 if args.list_ciphers or args.list_sig_algs or args.list_named_groups \
Jerry Yu29deed42021-11-25 11:09:54 +0800416 or args.list_servers or args.list_clients:
Jerry Yu305bfc32021-11-24 16:04:47 +0800417 if args.list_ciphers:
Jerry Yu7f5e5ad2021-11-29 17:37:19 +0800418 print(*CIPHER_SUITE_IANA_VALUE.keys())
Jerry Yu305bfc32021-11-24 16:04:47 +0800419 if args.list_sig_algs:
Jerry Yu7f5e5ad2021-11-29 17:37:19 +0800420 print(*SIG_ALG_IANA_VALUE.keys())
Jerry Yu305bfc32021-11-24 16:04:47 +0800421 if args.list_named_groups:
Jerry Yu7f5e5ad2021-11-29 17:37:19 +0800422 print(*NAMED_GROUP_IANA_VALUE.keys())
Jerry Yu305bfc32021-11-24 16:04:47 +0800423 if args.list_servers:
Jerry Yub4ac8f32021-12-01 10:41:37 +0800424 print(*SERVER_CLASSES.keys())
Jerry Yu305bfc32021-11-24 16:04:47 +0800425 if args.list_clients:
Jerry Yub4ac8f32021-12-01 10:41:37 +0800426 print(*CLIENT_CLASSES.keys())
Jerry Yu305bfc32021-11-24 16:04:47 +0800427 return 0
Jerry Yucdcb6832021-11-29 16:50:13 +0800428
Jerry Yu882c30d2021-12-01 10:59:59 +0800429 print(generate_compat_test(server=args.server, client=args.client, sig_alg=args.sig_alg,
430 cipher=args.cipher, named_group=args.named_group))
Jerry Yucdcb6832021-11-29 16:50:13 +0800431 return 0
Jerry Yu305bfc32021-11-24 16:04:47 +0800432
Jerry Yu29deed42021-11-25 11:09:54 +0800433
Jerry Yu305bfc32021-11-24 16:04:47 +0800434if __name__ == "__main__":
435 sys.exit(main())