xref: /aosp_15_r20/external/mbedtls/tests/scripts/analyze_outcomes.py (revision 62c56f9862f102b96d72393aff6076c951fb8148)
1*62c56f98SSadaf Ebrahimi#!/usr/bin/env python3
2*62c56f98SSadaf Ebrahimi
3*62c56f98SSadaf Ebrahimi"""Analyze the test outcomes from a full CI run.
4*62c56f98SSadaf Ebrahimi
5*62c56f98SSadaf EbrahimiThis script can also run on outcomes from a partial run, but the results are
6*62c56f98SSadaf Ebrahimiless likely to be useful.
7*62c56f98SSadaf Ebrahimi"""
8*62c56f98SSadaf Ebrahimi
9*62c56f98SSadaf Ebrahimiimport argparse
10*62c56f98SSadaf Ebrahimiimport sys
11*62c56f98SSadaf Ebrahimiimport traceback
12*62c56f98SSadaf Ebrahimiimport re
13*62c56f98SSadaf Ebrahimiimport subprocess
14*62c56f98SSadaf Ebrahimiimport os
15*62c56f98SSadaf Ebrahimi
16*62c56f98SSadaf Ebrahimiimport check_test_cases
17*62c56f98SSadaf Ebrahimi
18*62c56f98SSadaf Ebrahimiclass Results:
19*62c56f98SSadaf Ebrahimi    """Process analysis results."""
20*62c56f98SSadaf Ebrahimi
21*62c56f98SSadaf Ebrahimi    def __init__(self):
22*62c56f98SSadaf Ebrahimi        self.error_count = 0
23*62c56f98SSadaf Ebrahimi        self.warning_count = 0
24*62c56f98SSadaf Ebrahimi
25*62c56f98SSadaf Ebrahimi    @staticmethod
26*62c56f98SSadaf Ebrahimi    def log(fmt, *args, **kwargs):
27*62c56f98SSadaf Ebrahimi        sys.stderr.write((fmt + '\n').format(*args, **kwargs))
28*62c56f98SSadaf Ebrahimi
29*62c56f98SSadaf Ebrahimi    def error(self, fmt, *args, **kwargs):
30*62c56f98SSadaf Ebrahimi        self.log('Error: ' + fmt, *args, **kwargs)
31*62c56f98SSadaf Ebrahimi        self.error_count += 1
32*62c56f98SSadaf Ebrahimi
33*62c56f98SSadaf Ebrahimi    def warning(self, fmt, *args, **kwargs):
34*62c56f98SSadaf Ebrahimi        self.log('Warning: ' + fmt, *args, **kwargs)
35*62c56f98SSadaf Ebrahimi        self.warning_count += 1
36*62c56f98SSadaf Ebrahimi
37*62c56f98SSadaf Ebrahimiclass TestCaseOutcomes:
38*62c56f98SSadaf Ebrahimi    """The outcomes of one test case across many configurations."""
39*62c56f98SSadaf Ebrahimi    # pylint: disable=too-few-public-methods
40*62c56f98SSadaf Ebrahimi
41*62c56f98SSadaf Ebrahimi    def __init__(self):
42*62c56f98SSadaf Ebrahimi        # Collect a list of witnesses of the test case succeeding or failing.
43*62c56f98SSadaf Ebrahimi        # Currently we don't do anything with witnesses except count them.
44*62c56f98SSadaf Ebrahimi        # The format of a witness is determined by the read_outcome_file
45*62c56f98SSadaf Ebrahimi        # function; it's the platform and configuration joined by ';'.
46*62c56f98SSadaf Ebrahimi        self.successes = []
47*62c56f98SSadaf Ebrahimi        self.failures = []
48*62c56f98SSadaf Ebrahimi
49*62c56f98SSadaf Ebrahimi    def hits(self):
50*62c56f98SSadaf Ebrahimi        """Return the number of times a test case has been run.
51*62c56f98SSadaf Ebrahimi
52*62c56f98SSadaf Ebrahimi        This includes passes and failures, but not skips.
53*62c56f98SSadaf Ebrahimi        """
54*62c56f98SSadaf Ebrahimi        return len(self.successes) + len(self.failures)
55*62c56f98SSadaf Ebrahimi
56*62c56f98SSadaf Ebrahimidef execute_reference_driver_tests(ref_component, driver_component, outcome_file):
57*62c56f98SSadaf Ebrahimi    """Run the tests specified in ref_component and driver_component. Results
58*62c56f98SSadaf Ebrahimi    are stored in the output_file and they will be used for the following
59*62c56f98SSadaf Ebrahimi    coverage analysis"""
60*62c56f98SSadaf Ebrahimi    # If the outcome file already exists, we assume that the user wants to
61*62c56f98SSadaf Ebrahimi    # perform the comparison analysis again without repeating the tests.
62*62c56f98SSadaf Ebrahimi    if os.path.exists(outcome_file):
63*62c56f98SSadaf Ebrahimi        Results.log("Outcome file (" + outcome_file + ") already exists. " + \
64*62c56f98SSadaf Ebrahimi                    "Tests will be skipped.")
65*62c56f98SSadaf Ebrahimi        return
66*62c56f98SSadaf Ebrahimi
67*62c56f98SSadaf Ebrahimi    shell_command = "tests/scripts/all.sh --outcome-file " + outcome_file + \
68*62c56f98SSadaf Ebrahimi                    " " + ref_component + " " + driver_component
69*62c56f98SSadaf Ebrahimi    Results.log("Running: " + shell_command)
70*62c56f98SSadaf Ebrahimi    ret_val = subprocess.run(shell_command.split(), check=False).returncode
71*62c56f98SSadaf Ebrahimi
72*62c56f98SSadaf Ebrahimi    if ret_val != 0:
73*62c56f98SSadaf Ebrahimi        Results.log("Error: failed to run reference/driver components")
74*62c56f98SSadaf Ebrahimi        sys.exit(ret_val)
75*62c56f98SSadaf Ebrahimi
76*62c56f98SSadaf Ebrahimidef analyze_coverage(results, outcomes, allow_list, full_coverage):
77*62c56f98SSadaf Ebrahimi    """Check that all available test cases are executed at least once."""
78*62c56f98SSadaf Ebrahimi    available = check_test_cases.collect_available_test_cases()
79*62c56f98SSadaf Ebrahimi    for key in available:
80*62c56f98SSadaf Ebrahimi        hits = outcomes[key].hits() if key in outcomes else 0
81*62c56f98SSadaf Ebrahimi        if hits == 0 and key not in allow_list:
82*62c56f98SSadaf Ebrahimi            if full_coverage:
83*62c56f98SSadaf Ebrahimi                results.error('Test case not executed: {}', key)
84*62c56f98SSadaf Ebrahimi            else:
85*62c56f98SSadaf Ebrahimi                results.warning('Test case not executed: {}', key)
86*62c56f98SSadaf Ebrahimi        elif hits != 0 and key in allow_list:
87*62c56f98SSadaf Ebrahimi            # Test Case should be removed from the allow list.
88*62c56f98SSadaf Ebrahimi            if full_coverage:
89*62c56f98SSadaf Ebrahimi                results.error('Allow listed test case was executed: {}', key)
90*62c56f98SSadaf Ebrahimi            else:
91*62c56f98SSadaf Ebrahimi                results.warning('Allow listed test case was executed: {}', key)
92*62c56f98SSadaf Ebrahimi
93*62c56f98SSadaf Ebrahimidef analyze_driver_vs_reference(outcomes, component_ref, component_driver,
94*62c56f98SSadaf Ebrahimi                                ignored_suites, ignored_test=None):
95*62c56f98SSadaf Ebrahimi    """Check that all tests executed in the reference component are also
96*62c56f98SSadaf Ebrahimi    executed in the corresponding driver component.
97*62c56f98SSadaf Ebrahimi    Skip:
98*62c56f98SSadaf Ebrahimi    - full test suites provided in ignored_suites list
99*62c56f98SSadaf Ebrahimi    - only some specific test inside a test suite, for which the corresponding
100*62c56f98SSadaf Ebrahimi      output string is provided
101*62c56f98SSadaf Ebrahimi    """
102*62c56f98SSadaf Ebrahimi    available = check_test_cases.collect_available_test_cases()
103*62c56f98SSadaf Ebrahimi    result = True
104*62c56f98SSadaf Ebrahimi
105*62c56f98SSadaf Ebrahimi    for key in available:
106*62c56f98SSadaf Ebrahimi        # Continue if test was not executed by any component
107*62c56f98SSadaf Ebrahimi        hits = outcomes[key].hits() if key in outcomes else 0
108*62c56f98SSadaf Ebrahimi        if hits == 0:
109*62c56f98SSadaf Ebrahimi            continue
110*62c56f98SSadaf Ebrahimi        # Skip ignored test suites
111*62c56f98SSadaf Ebrahimi        full_test_suite = key.split(';')[0] # retrieve full test suite name
112*62c56f98SSadaf Ebrahimi        test_string = key.split(';')[1] # retrieve the text string of this test
113*62c56f98SSadaf Ebrahimi        test_suite = full_test_suite.split('.')[0] # retrieve main part of test suite name
114*62c56f98SSadaf Ebrahimi        if test_suite in ignored_suites or full_test_suite in ignored_suites:
115*62c56f98SSadaf Ebrahimi            continue
116*62c56f98SSadaf Ebrahimi        if ((full_test_suite in ignored_test) and
117*62c56f98SSadaf Ebrahimi                (test_string in ignored_test[full_test_suite])):
118*62c56f98SSadaf Ebrahimi            continue
119*62c56f98SSadaf Ebrahimi        # Search for tests that run in reference component and not in driver component
120*62c56f98SSadaf Ebrahimi        driver_test_passed = False
121*62c56f98SSadaf Ebrahimi        reference_test_passed = False
122*62c56f98SSadaf Ebrahimi        for entry in outcomes[key].successes:
123*62c56f98SSadaf Ebrahimi            if component_driver in entry:
124*62c56f98SSadaf Ebrahimi                driver_test_passed = True
125*62c56f98SSadaf Ebrahimi            if component_ref in entry:
126*62c56f98SSadaf Ebrahimi                reference_test_passed = True
127*62c56f98SSadaf Ebrahimi        if(reference_test_passed and not driver_test_passed):
128*62c56f98SSadaf Ebrahimi            Results.log(key)
129*62c56f98SSadaf Ebrahimi            result = False
130*62c56f98SSadaf Ebrahimi    return result
131*62c56f98SSadaf Ebrahimi
132*62c56f98SSadaf Ebrahimidef analyze_outcomes(outcomes, args):
133*62c56f98SSadaf Ebrahimi    """Run all analyses on the given outcome collection."""
134*62c56f98SSadaf Ebrahimi    results = Results()
135*62c56f98SSadaf Ebrahimi    analyze_coverage(results, outcomes, args['allow_list'],
136*62c56f98SSadaf Ebrahimi                     args['full_coverage'])
137*62c56f98SSadaf Ebrahimi    return results
138*62c56f98SSadaf Ebrahimi
139*62c56f98SSadaf Ebrahimidef read_outcome_file(outcome_file):
140*62c56f98SSadaf Ebrahimi    """Parse an outcome file and return an outcome collection.
141*62c56f98SSadaf Ebrahimi
142*62c56f98SSadaf EbrahimiAn outcome collection is a dictionary mapping keys to TestCaseOutcomes objects.
143*62c56f98SSadaf EbrahimiThe keys are the test suite name and the test case description, separated
144*62c56f98SSadaf Ebrahimiby a semicolon.
145*62c56f98SSadaf Ebrahimi"""
146*62c56f98SSadaf Ebrahimi    outcomes = {}
147*62c56f98SSadaf Ebrahimi    with open(outcome_file, 'r', encoding='utf-8') as input_file:
148*62c56f98SSadaf Ebrahimi        for line in input_file:
149*62c56f98SSadaf Ebrahimi            (platform, config, suite, case, result, _cause) = line.split(';')
150*62c56f98SSadaf Ebrahimi            key = ';'.join([suite, case])
151*62c56f98SSadaf Ebrahimi            setup = ';'.join([platform, config])
152*62c56f98SSadaf Ebrahimi            if key not in outcomes:
153*62c56f98SSadaf Ebrahimi                outcomes[key] = TestCaseOutcomes()
154*62c56f98SSadaf Ebrahimi            if result == 'PASS':
155*62c56f98SSadaf Ebrahimi                outcomes[key].successes.append(setup)
156*62c56f98SSadaf Ebrahimi            elif result == 'FAIL':
157*62c56f98SSadaf Ebrahimi                outcomes[key].failures.append(setup)
158*62c56f98SSadaf Ebrahimi    return outcomes
159*62c56f98SSadaf Ebrahimi
160*62c56f98SSadaf Ebrahimidef do_analyze_coverage(outcome_file, args):
161*62c56f98SSadaf Ebrahimi    """Perform coverage analysis."""
162*62c56f98SSadaf Ebrahimi    outcomes = read_outcome_file(outcome_file)
163*62c56f98SSadaf Ebrahimi    Results.log("\n*** Analyze coverage ***\n")
164*62c56f98SSadaf Ebrahimi    results = analyze_outcomes(outcomes, args)
165*62c56f98SSadaf Ebrahimi    return results.error_count == 0
166*62c56f98SSadaf Ebrahimi
167*62c56f98SSadaf Ebrahimidef do_analyze_driver_vs_reference(outcome_file, args):
168*62c56f98SSadaf Ebrahimi    """Perform driver vs reference analyze."""
169*62c56f98SSadaf Ebrahimi    execute_reference_driver_tests(args['component_ref'], \
170*62c56f98SSadaf Ebrahimi                                    args['component_driver'], outcome_file)
171*62c56f98SSadaf Ebrahimi
172*62c56f98SSadaf Ebrahimi    ignored_suites = ['test_suite_' + x for x in args['ignored_suites']]
173*62c56f98SSadaf Ebrahimi
174*62c56f98SSadaf Ebrahimi    outcomes = read_outcome_file(outcome_file)
175*62c56f98SSadaf Ebrahimi    Results.log("\n*** Analyze driver {} vs reference {} ***\n".format(
176*62c56f98SSadaf Ebrahimi        args['component_driver'], args['component_ref']))
177*62c56f98SSadaf Ebrahimi    return analyze_driver_vs_reference(outcomes, args['component_ref'],
178*62c56f98SSadaf Ebrahimi                                       args['component_driver'], ignored_suites,
179*62c56f98SSadaf Ebrahimi                                       args['ignored_tests'])
180*62c56f98SSadaf Ebrahimi
181*62c56f98SSadaf Ebrahimi# List of tasks with a function that can handle this task and additional arguments if required
182*62c56f98SSadaf EbrahimiTASKS = {
183*62c56f98SSadaf Ebrahimi    'analyze_coverage':                 {
184*62c56f98SSadaf Ebrahimi        'test_function': do_analyze_coverage,
185*62c56f98SSadaf Ebrahimi        'args': {
186*62c56f98SSadaf Ebrahimi            'allow_list': [
187*62c56f98SSadaf Ebrahimi                # Algorithm not supported yet
188*62c56f98SSadaf Ebrahimi                'test_suite_psa_crypto_metadata;Asymmetric signature: pure EdDSA',
189*62c56f98SSadaf Ebrahimi                # Algorithm not supported yet
190*62c56f98SSadaf Ebrahimi                'test_suite_psa_crypto_metadata;Cipher: XTS',
191*62c56f98SSadaf Ebrahimi            ],
192*62c56f98SSadaf Ebrahimi            'full_coverage': False,
193*62c56f98SSadaf Ebrahimi        }
194*62c56f98SSadaf Ebrahimi    },
195*62c56f98SSadaf Ebrahimi    # There are 2 options to use analyze_driver_vs_reference_xxx locally:
196*62c56f98SSadaf Ebrahimi    # 1. Run tests and then analysis:
197*62c56f98SSadaf Ebrahimi    #   - tests/scripts/all.sh --outcome-file "$PWD/out.csv" <component_ref> <component_driver>
198*62c56f98SSadaf Ebrahimi    #   - tests/scripts/analyze_outcomes.py out.csv analyze_driver_vs_reference_xxx
199*62c56f98SSadaf Ebrahimi    # 2. Let this script run both automatically:
200*62c56f98SSadaf Ebrahimi    #   - tests/scripts/analyze_outcomes.py out.csv analyze_driver_vs_reference_xxx
201*62c56f98SSadaf Ebrahimi    'analyze_driver_vs_reference_hash': {
202*62c56f98SSadaf Ebrahimi        'test_function': do_analyze_driver_vs_reference,
203*62c56f98SSadaf Ebrahimi        'args': {
204*62c56f98SSadaf Ebrahimi            'component_ref': 'test_psa_crypto_config_reference_hash_use_psa',
205*62c56f98SSadaf Ebrahimi            'component_driver': 'test_psa_crypto_config_accel_hash_use_psa',
206*62c56f98SSadaf Ebrahimi            'ignored_suites': [
207*62c56f98SSadaf Ebrahimi                'shax', 'mdx', # the software implementations that are being excluded
208*62c56f98SSadaf Ebrahimi                'md.psa',  # purposefully depends on whether drivers are present
209*62c56f98SSadaf Ebrahimi                'psa_crypto_low_hash.generated', # testing the builtins
210*62c56f98SSadaf Ebrahimi            ],
211*62c56f98SSadaf Ebrahimi            'ignored_tests': {
212*62c56f98SSadaf Ebrahimi            }
213*62c56f98SSadaf Ebrahimi        }
214*62c56f98SSadaf Ebrahimi    },
215*62c56f98SSadaf Ebrahimi    'analyze_driver_vs_reference_ecp_light_only': {
216*62c56f98SSadaf Ebrahimi        'test_function': do_analyze_driver_vs_reference,
217*62c56f98SSadaf Ebrahimi        'args': {
218*62c56f98SSadaf Ebrahimi            'component_ref': 'test_psa_crypto_config_reference_ecc_ecp_light_only',
219*62c56f98SSadaf Ebrahimi            'component_driver': 'test_psa_crypto_config_accel_ecc_ecp_light_only',
220*62c56f98SSadaf Ebrahimi            'ignored_suites': [
221*62c56f98SSadaf Ebrahimi                'ecdsa',
222*62c56f98SSadaf Ebrahimi                'ecdh',
223*62c56f98SSadaf Ebrahimi                'ecjpake',
224*62c56f98SSadaf Ebrahimi            ],
225*62c56f98SSadaf Ebrahimi            'ignored_tests': {
226*62c56f98SSadaf Ebrahimi                'test_suite_random': [
227*62c56f98SSadaf Ebrahimi                    'PSA classic wrapper: ECDSA signature (SECP256R1)',
228*62c56f98SSadaf Ebrahimi                ],
229*62c56f98SSadaf Ebrahimi                # In the accelerated test ECP_C is not set (only ECP_LIGHT is)
230*62c56f98SSadaf Ebrahimi                # so we must ignore disparities in the tests for which ECP_C
231*62c56f98SSadaf Ebrahimi                # is required.
232*62c56f98SSadaf Ebrahimi                'test_suite_ecp': [
233*62c56f98SSadaf Ebrahimi                    'ECP check public-private #1 (OK)',
234*62c56f98SSadaf Ebrahimi                    'ECP check public-private #2 (group none)',
235*62c56f98SSadaf Ebrahimi                    'ECP check public-private #3 (group mismatch)',
236*62c56f98SSadaf Ebrahimi                    'ECP check public-private #4 (Qx mismatch)',
237*62c56f98SSadaf Ebrahimi                    'ECP check public-private #5 (Qy mismatch)',
238*62c56f98SSadaf Ebrahimi                    'ECP check public-private #6 (wrong Qx)',
239*62c56f98SSadaf Ebrahimi                    'ECP check public-private #7 (wrong Qy)',
240*62c56f98SSadaf Ebrahimi                    'ECP gen keypair [#1]',
241*62c56f98SSadaf Ebrahimi                    'ECP gen keypair [#2]',
242*62c56f98SSadaf Ebrahimi                    'ECP gen keypair [#3]',
243*62c56f98SSadaf Ebrahimi                    'ECP gen keypair wrapper',
244*62c56f98SSadaf Ebrahimi                    'ECP point muladd secp256r1 #1',
245*62c56f98SSadaf Ebrahimi                    'ECP point muladd secp256r1 #2',
246*62c56f98SSadaf Ebrahimi                    'ECP point multiplication Curve25519 (element of order 2: origin) #3',
247*62c56f98SSadaf Ebrahimi                    'ECP point multiplication Curve25519 (element of order 4: 1) #4',
248*62c56f98SSadaf Ebrahimi                    'ECP point multiplication Curve25519 (element of order 8) #5',
249*62c56f98SSadaf Ebrahimi                    'ECP point multiplication Curve25519 (normalized) #1',
250*62c56f98SSadaf Ebrahimi                    'ECP point multiplication Curve25519 (not normalized) #2',
251*62c56f98SSadaf Ebrahimi                    'ECP point multiplication rng fail Curve25519',
252*62c56f98SSadaf Ebrahimi                    'ECP point multiplication rng fail secp256r1',
253*62c56f98SSadaf Ebrahimi                    'ECP test vectors Curve25519',
254*62c56f98SSadaf Ebrahimi                    'ECP test vectors Curve448 (RFC 7748 6.2, after decodeUCoordinate)',
255*62c56f98SSadaf Ebrahimi                    'ECP test vectors brainpoolP256r1 rfc 7027',
256*62c56f98SSadaf Ebrahimi                    'ECP test vectors brainpoolP384r1 rfc 7027',
257*62c56f98SSadaf Ebrahimi                    'ECP test vectors brainpoolP512r1 rfc 7027',
258*62c56f98SSadaf Ebrahimi                    'ECP test vectors secp192k1',
259*62c56f98SSadaf Ebrahimi                    'ECP test vectors secp192r1 rfc 5114',
260*62c56f98SSadaf Ebrahimi                    'ECP test vectors secp224k1',
261*62c56f98SSadaf Ebrahimi                    'ECP test vectors secp224r1 rfc 5114',
262*62c56f98SSadaf Ebrahimi                    'ECP test vectors secp256k1',
263*62c56f98SSadaf Ebrahimi                    'ECP test vectors secp256r1 rfc 5114',
264*62c56f98SSadaf Ebrahimi                    'ECP test vectors secp384r1 rfc 5114',
265*62c56f98SSadaf Ebrahimi                    'ECP test vectors secp521r1 rfc 5114',
266*62c56f98SSadaf Ebrahimi                ],
267*62c56f98SSadaf Ebrahimi                'test_suite_psa_crypto': [
268*62c56f98SSadaf Ebrahimi                    'PSA key derivation: HKDF-SHA-256 -> ECC secp256r1',
269*62c56f98SSadaf Ebrahimi                    'PSA key derivation: HKDF-SHA-256 -> ECC secp256r1 (1 redraw)',
270*62c56f98SSadaf Ebrahimi                    'PSA key derivation: HKDF-SHA-256 -> ECC secp256r1, exercise ECDSA',
271*62c56f98SSadaf Ebrahimi                    'PSA key derivation: HKDF-SHA-256 -> ECC secp384r1',
272*62c56f98SSadaf Ebrahimi                    'PSA key derivation: HKDF-SHA-256 -> ECC secp521r1 #0',
273*62c56f98SSadaf Ebrahimi                    'PSA key derivation: HKDF-SHA-256 -> ECC secp521r1 #1',
274*62c56f98SSadaf Ebrahimi                ],
275*62c56f98SSadaf Ebrahimi                'test_suite_ssl': [
276*62c56f98SSadaf Ebrahimi                    'Test configuration of groups for DHE through mbedtls_ssl_conf_curves()',
277*62c56f98SSadaf Ebrahimi                ],
278*62c56f98SSadaf Ebrahimi            }
279*62c56f98SSadaf Ebrahimi        }
280*62c56f98SSadaf Ebrahimi    },
281*62c56f98SSadaf Ebrahimi    'analyze_driver_vs_reference_no_ecp_at_all': {
282*62c56f98SSadaf Ebrahimi        'test_function': do_analyze_driver_vs_reference,
283*62c56f98SSadaf Ebrahimi        'args': {
284*62c56f98SSadaf Ebrahimi            'component_ref': 'test_psa_crypto_config_reference_ecc_no_ecp_at_all',
285*62c56f98SSadaf Ebrahimi            'component_driver': 'test_psa_crypto_config_accel_ecc_no_ecp_at_all',
286*62c56f98SSadaf Ebrahimi            'ignored_suites': [
287*62c56f98SSadaf Ebrahimi                # Ignore test suites for the modules that are disabled in the
288*62c56f98SSadaf Ebrahimi                # accelerated test case.
289*62c56f98SSadaf Ebrahimi                'ecp',
290*62c56f98SSadaf Ebrahimi                'ecdsa',
291*62c56f98SSadaf Ebrahimi                'ecdh',
292*62c56f98SSadaf Ebrahimi                'ecjpake',
293*62c56f98SSadaf Ebrahimi            ],
294*62c56f98SSadaf Ebrahimi            'ignored_tests': {
295*62c56f98SSadaf Ebrahimi                'test_suite_random': [
296*62c56f98SSadaf Ebrahimi                    'PSA classic wrapper: ECDSA signature (SECP256R1)',
297*62c56f98SSadaf Ebrahimi                ],
298*62c56f98SSadaf Ebrahimi                'test_suite_psa_crypto': [
299*62c56f98SSadaf Ebrahimi                    'PSA key derivation: HKDF-SHA-256 -> ECC secp256r1',
300*62c56f98SSadaf Ebrahimi                    'PSA key derivation: HKDF-SHA-256 -> ECC secp256r1 (1 redraw)',
301*62c56f98SSadaf Ebrahimi                    'PSA key derivation: HKDF-SHA-256 -> ECC secp256r1, exercise ECDSA',
302*62c56f98SSadaf Ebrahimi                    'PSA key derivation: HKDF-SHA-256 -> ECC secp384r1',
303*62c56f98SSadaf Ebrahimi                    'PSA key derivation: HKDF-SHA-256 -> ECC secp521r1 #0',
304*62c56f98SSadaf Ebrahimi                    'PSA key derivation: HKDF-SHA-256 -> ECC secp521r1 #1',
305*62c56f98SSadaf Ebrahimi                    'PSA key derivation: bits=7 invalid for ECC BRAINPOOL_P_R1 (ECC enabled)',
306*62c56f98SSadaf Ebrahimi                    'PSA key derivation: bits=7 invalid for ECC SECP_K1 (ECC enabled)',
307*62c56f98SSadaf Ebrahimi                    'PSA key derivation: bits=7 invalid for ECC SECP_R1 (ECC enabled)',
308*62c56f98SSadaf Ebrahimi                    'PSA key derivation: bits=7 invalid for ECC SECP_R2 (ECC enabled)',
309*62c56f98SSadaf Ebrahimi                    'PSA key derivation: bits=7 invalid for ECC SECT_K1 (ECC enabled)',
310*62c56f98SSadaf Ebrahimi                    'PSA key derivation: bits=7 invalid for ECC SECT_R1 (ECC enabled)',
311*62c56f98SSadaf Ebrahimi                    'PSA key derivation: bits=7 invalid for ECC SECT_R2 (ECC enabled)',
312*62c56f98SSadaf Ebrahimi                ],
313*62c56f98SSadaf Ebrahimi                'test_suite_pkparse': [
314*62c56f98SSadaf Ebrahimi                    # When PK_PARSE_C and ECP_C are defined then PK_PARSE_EC_COMPRESSED
315*62c56f98SSadaf Ebrahimi                    # is automatically enabled in build_info.h (backward compatibility)
316*62c56f98SSadaf Ebrahimi                    # even if it is disabled in config_psa_crypto_no_ecp_at_all(). As a
317*62c56f98SSadaf Ebrahimi                    # consequence compressed points are supported in the reference
318*62c56f98SSadaf Ebrahimi                    # component but not in the accelerated one, so they should be skipped
319*62c56f98SSadaf Ebrahimi                    # while checking driver's coverage.
320*62c56f98SSadaf Ebrahimi                    'Parse EC Key #10a (SEC1 PEM, secp384r1, compressed)',
321*62c56f98SSadaf Ebrahimi                    'Parse EC Key #11a (SEC1 PEM, secp521r1, compressed)',
322*62c56f98SSadaf Ebrahimi                    'Parse EC Key #12a (SEC1 PEM, bp256r1, compressed)',
323*62c56f98SSadaf Ebrahimi                    'Parse EC Key #13a (SEC1 PEM, bp384r1, compressed)',
324*62c56f98SSadaf Ebrahimi                    'Parse EC Key #14a (SEC1 PEM, bp512r1, compressed)',
325*62c56f98SSadaf Ebrahimi                    'Parse EC Key #2a (SEC1 PEM, secp192r1, compressed)',
326*62c56f98SSadaf Ebrahimi                    'Parse EC Key #8a (SEC1 PEM, secp224r1, compressed)',
327*62c56f98SSadaf Ebrahimi                    'Parse EC Key #9a (SEC1 PEM, secp256r1, compressed)',
328*62c56f98SSadaf Ebrahimi                    'Parse Public EC Key #2a (RFC 5480, PEM, secp192r1, compressed)',
329*62c56f98SSadaf Ebrahimi                    'Parse Public EC Key #3a (RFC 5480, secp224r1, compressed)',
330*62c56f98SSadaf Ebrahimi                    'Parse Public EC Key #4a (RFC 5480, secp256r1, compressed)',
331*62c56f98SSadaf Ebrahimi                    'Parse Public EC Key #5a (RFC 5480, secp384r1, compressed)',
332*62c56f98SSadaf Ebrahimi                    'Parse Public EC Key #6a (RFC 5480, secp521r1, compressed)',
333*62c56f98SSadaf Ebrahimi                    'Parse Public EC Key #7a (RFC 5480, brainpoolP256r1, compressed)',
334*62c56f98SSadaf Ebrahimi                    'Parse Public EC Key #8a (RFC 5480, brainpoolP384r1, compressed)',
335*62c56f98SSadaf Ebrahimi                    'Parse Public EC Key #9a (RFC 5480, brainpoolP512r1, compressed)',
336*62c56f98SSadaf Ebrahimi                ],
337*62c56f98SSadaf Ebrahimi                'test_suite_ssl': [
338*62c56f98SSadaf Ebrahimi                    'Test configuration of groups for DHE through mbedtls_ssl_conf_curves()',
339*62c56f98SSadaf Ebrahimi                ],
340*62c56f98SSadaf Ebrahimi            }
341*62c56f98SSadaf Ebrahimi        }
342*62c56f98SSadaf Ebrahimi    },
343*62c56f98SSadaf Ebrahimi    'analyze_driver_vs_reference_ecc_no_bignum': {
344*62c56f98SSadaf Ebrahimi        'test_function': do_analyze_driver_vs_reference,
345*62c56f98SSadaf Ebrahimi        'args': {
346*62c56f98SSadaf Ebrahimi            'component_ref': 'test_psa_crypto_config_reference_ecc_no_bignum',
347*62c56f98SSadaf Ebrahimi            'component_driver': 'test_psa_crypto_config_accel_ecc_no_bignum',
348*62c56f98SSadaf Ebrahimi            'ignored_suites': [
349*62c56f98SSadaf Ebrahimi                # Ignore test suites for the modules that are disabled in the
350*62c56f98SSadaf Ebrahimi                # accelerated test case.
351*62c56f98SSadaf Ebrahimi                'ecp',
352*62c56f98SSadaf Ebrahimi                'ecdsa',
353*62c56f98SSadaf Ebrahimi                'ecdh',
354*62c56f98SSadaf Ebrahimi                'ecjpake',
355*62c56f98SSadaf Ebrahimi                'bignum_core',
356*62c56f98SSadaf Ebrahimi                'bignum_random',
357*62c56f98SSadaf Ebrahimi                'bignum_mod',
358*62c56f98SSadaf Ebrahimi                'bignum_mod_raw',
359*62c56f98SSadaf Ebrahimi                'bignum.generated',
360*62c56f98SSadaf Ebrahimi                'bignum.misc',
361*62c56f98SSadaf Ebrahimi            ],
362*62c56f98SSadaf Ebrahimi            'ignored_tests': {
363*62c56f98SSadaf Ebrahimi                'test_suite_random': [
364*62c56f98SSadaf Ebrahimi                    'PSA classic wrapper: ECDSA signature (SECP256R1)',
365*62c56f98SSadaf Ebrahimi                ],
366*62c56f98SSadaf Ebrahimi                'test_suite_psa_crypto': [
367*62c56f98SSadaf Ebrahimi                    'PSA key derivation: HKDF-SHA-256 -> ECC secp256r1',
368*62c56f98SSadaf Ebrahimi                    'PSA key derivation: HKDF-SHA-256 -> ECC secp256r1 (1 redraw)',
369*62c56f98SSadaf Ebrahimi                    'PSA key derivation: HKDF-SHA-256 -> ECC secp256r1, exercise ECDSA',
370*62c56f98SSadaf Ebrahimi                    'PSA key derivation: HKDF-SHA-256 -> ECC secp384r1',
371*62c56f98SSadaf Ebrahimi                    'PSA key derivation: HKDF-SHA-256 -> ECC secp521r1 #0',
372*62c56f98SSadaf Ebrahimi                    'PSA key derivation: HKDF-SHA-256 -> ECC secp521r1 #1',
373*62c56f98SSadaf Ebrahimi                    'PSA key derivation: bits=7 invalid for ECC BRAINPOOL_P_R1 (ECC enabled)',
374*62c56f98SSadaf Ebrahimi                    'PSA key derivation: bits=7 invalid for ECC SECP_K1 (ECC enabled)',
375*62c56f98SSadaf Ebrahimi                    'PSA key derivation: bits=7 invalid for ECC SECP_R1 (ECC enabled)',
376*62c56f98SSadaf Ebrahimi                    'PSA key derivation: bits=7 invalid for ECC SECP_R2 (ECC enabled)',
377*62c56f98SSadaf Ebrahimi                    'PSA key derivation: bits=7 invalid for ECC SECT_K1 (ECC enabled)',
378*62c56f98SSadaf Ebrahimi                    'PSA key derivation: bits=7 invalid for ECC SECT_R1 (ECC enabled)',
379*62c56f98SSadaf Ebrahimi                    'PSA key derivation: bits=7 invalid for ECC SECT_R2 (ECC enabled)',
380*62c56f98SSadaf Ebrahimi                ],
381*62c56f98SSadaf Ebrahimi                'test_suite_pkparse': [
382*62c56f98SSadaf Ebrahimi                    # See the description provided above in the
383*62c56f98SSadaf Ebrahimi                    # analyze_driver_vs_reference_no_ecp_at_all component.
384*62c56f98SSadaf Ebrahimi                    'Parse EC Key #10a (SEC1 PEM, secp384r1, compressed)',
385*62c56f98SSadaf Ebrahimi                    'Parse EC Key #11a (SEC1 PEM, secp521r1, compressed)',
386*62c56f98SSadaf Ebrahimi                    'Parse EC Key #12a (SEC1 PEM, bp256r1, compressed)',
387*62c56f98SSadaf Ebrahimi                    'Parse EC Key #13a (SEC1 PEM, bp384r1, compressed)',
388*62c56f98SSadaf Ebrahimi                    'Parse EC Key #14a (SEC1 PEM, bp512r1, compressed)',
389*62c56f98SSadaf Ebrahimi                    'Parse EC Key #2a (SEC1 PEM, secp192r1, compressed)',
390*62c56f98SSadaf Ebrahimi                    'Parse EC Key #8a (SEC1 PEM, secp224r1, compressed)',
391*62c56f98SSadaf Ebrahimi                    'Parse EC Key #9a (SEC1 PEM, secp256r1, compressed)',
392*62c56f98SSadaf Ebrahimi                    'Parse Public EC Key #2a (RFC 5480, PEM, secp192r1, compressed)',
393*62c56f98SSadaf Ebrahimi                    'Parse Public EC Key #3a (RFC 5480, secp224r1, compressed)',
394*62c56f98SSadaf Ebrahimi                    'Parse Public EC Key #4a (RFC 5480, secp256r1, compressed)',
395*62c56f98SSadaf Ebrahimi                    'Parse Public EC Key #5a (RFC 5480, secp384r1, compressed)',
396*62c56f98SSadaf Ebrahimi                    'Parse Public EC Key #6a (RFC 5480, secp521r1, compressed)',
397*62c56f98SSadaf Ebrahimi                    'Parse Public EC Key #7a (RFC 5480, brainpoolP256r1, compressed)',
398*62c56f98SSadaf Ebrahimi                    'Parse Public EC Key #8a (RFC 5480, brainpoolP384r1, compressed)',
399*62c56f98SSadaf Ebrahimi                    'Parse Public EC Key #9a (RFC 5480, brainpoolP512r1, compressed)',
400*62c56f98SSadaf Ebrahimi                ],
401*62c56f98SSadaf Ebrahimi                'test_suite_asn1parse': [
402*62c56f98SSadaf Ebrahimi                    # This test depends on BIGNUM_C
403*62c56f98SSadaf Ebrahimi                    'INTEGER too large for mpi',
404*62c56f98SSadaf Ebrahimi                ],
405*62c56f98SSadaf Ebrahimi                'test_suite_asn1write': [
406*62c56f98SSadaf Ebrahimi                    # Following tests depends on BIGNUM_C
407*62c56f98SSadaf Ebrahimi                    'ASN.1 Write mpi 0 (1 limb)',
408*62c56f98SSadaf Ebrahimi                    'ASN.1 Write mpi 0 (null)',
409*62c56f98SSadaf Ebrahimi                    'ASN.1 Write mpi 0x100',
410*62c56f98SSadaf Ebrahimi                    'ASN.1 Write mpi 0x7f',
411*62c56f98SSadaf Ebrahimi                    'ASN.1 Write mpi 0x7f with leading 0 limb',
412*62c56f98SSadaf Ebrahimi                    'ASN.1 Write mpi 0x80',
413*62c56f98SSadaf Ebrahimi                    'ASN.1 Write mpi 0x80 with leading 0 limb',
414*62c56f98SSadaf Ebrahimi                    'ASN.1 Write mpi 0xff',
415*62c56f98SSadaf Ebrahimi                    'ASN.1 Write mpi 1',
416*62c56f98SSadaf Ebrahimi                    'ASN.1 Write mpi, 127*8 bits',
417*62c56f98SSadaf Ebrahimi                    'ASN.1 Write mpi, 127*8+1 bits',
418*62c56f98SSadaf Ebrahimi                    'ASN.1 Write mpi, 127*8-1 bits',
419*62c56f98SSadaf Ebrahimi                    'ASN.1 Write mpi, 255*8 bits',
420*62c56f98SSadaf Ebrahimi                    'ASN.1 Write mpi, 255*8-1 bits',
421*62c56f98SSadaf Ebrahimi                    'ASN.1 Write mpi, 256*8-1 bits',
422*62c56f98SSadaf Ebrahimi                ],
423*62c56f98SSadaf Ebrahimi                'test_suite_debug': [
424*62c56f98SSadaf Ebrahimi                    # Following tests depends on BIGNUM_C
425*62c56f98SSadaf Ebrahimi                    'Debug print mbedtls_mpi #2: 3 bits',
426*62c56f98SSadaf Ebrahimi                    'Debug print mbedtls_mpi: 0 (empty representation)',
427*62c56f98SSadaf Ebrahimi                    'Debug print mbedtls_mpi: 0 (non-empty representation)',
428*62c56f98SSadaf Ebrahimi                    'Debug print mbedtls_mpi: 49 bits',
429*62c56f98SSadaf Ebrahimi                    'Debug print mbedtls_mpi: 759 bits',
430*62c56f98SSadaf Ebrahimi                    'Debug print mbedtls_mpi: 764 bits #1',
431*62c56f98SSadaf Ebrahimi                    'Debug print mbedtls_mpi: 764 bits #2',
432*62c56f98SSadaf Ebrahimi                ],
433*62c56f98SSadaf Ebrahimi                'test_suite_ssl': [
434*62c56f98SSadaf Ebrahimi                    'Test configuration of groups for DHE through mbedtls_ssl_conf_curves()',
435*62c56f98SSadaf Ebrahimi                ],
436*62c56f98SSadaf Ebrahimi            }
437*62c56f98SSadaf Ebrahimi        }
438*62c56f98SSadaf Ebrahimi    },
439*62c56f98SSadaf Ebrahimi    'analyze_driver_vs_reference_ecc_ffdh_no_bignum': {
440*62c56f98SSadaf Ebrahimi        'test_function': do_analyze_driver_vs_reference,
441*62c56f98SSadaf Ebrahimi        'args': {
442*62c56f98SSadaf Ebrahimi            'component_ref': 'test_psa_crypto_config_reference_ecc_ffdh_no_bignum',
443*62c56f98SSadaf Ebrahimi            'component_driver': 'test_psa_crypto_config_accel_ecc_ffdh_no_bignum',
444*62c56f98SSadaf Ebrahimi            'ignored_suites': [
445*62c56f98SSadaf Ebrahimi                # Ignore test suites for the modules that are disabled in the
446*62c56f98SSadaf Ebrahimi                # accelerated test case.
447*62c56f98SSadaf Ebrahimi                'ecp',
448*62c56f98SSadaf Ebrahimi                'ecdsa',
449*62c56f98SSadaf Ebrahimi                'ecdh',
450*62c56f98SSadaf Ebrahimi                'ecjpake',
451*62c56f98SSadaf Ebrahimi                'bignum_core',
452*62c56f98SSadaf Ebrahimi                'bignum_random',
453*62c56f98SSadaf Ebrahimi                'bignum_mod',
454*62c56f98SSadaf Ebrahimi                'bignum_mod_raw',
455*62c56f98SSadaf Ebrahimi                'bignum.generated',
456*62c56f98SSadaf Ebrahimi                'bignum.misc',
457*62c56f98SSadaf Ebrahimi                'dhm',
458*62c56f98SSadaf Ebrahimi            ],
459*62c56f98SSadaf Ebrahimi            'ignored_tests': {
460*62c56f98SSadaf Ebrahimi                'test_suite_random': [
461*62c56f98SSadaf Ebrahimi                    'PSA classic wrapper: ECDSA signature (SECP256R1)',
462*62c56f98SSadaf Ebrahimi                ],
463*62c56f98SSadaf Ebrahimi                'test_suite_psa_crypto': [
464*62c56f98SSadaf Ebrahimi                    'PSA key derivation: HKDF-SHA-256 -> ECC secp256r1',
465*62c56f98SSadaf Ebrahimi                    'PSA key derivation: HKDF-SHA-256 -> ECC secp256r1 (1 redraw)',
466*62c56f98SSadaf Ebrahimi                    'PSA key derivation: HKDF-SHA-256 -> ECC secp256r1, exercise ECDSA',
467*62c56f98SSadaf Ebrahimi                    'PSA key derivation: HKDF-SHA-256 -> ECC secp384r1',
468*62c56f98SSadaf Ebrahimi                    'PSA key derivation: HKDF-SHA-256 -> ECC secp521r1 #0',
469*62c56f98SSadaf Ebrahimi                    'PSA key derivation: HKDF-SHA-256 -> ECC secp521r1 #1',
470*62c56f98SSadaf Ebrahimi                    'PSA key derivation: bits=7 invalid for ECC BRAINPOOL_P_R1 (ECC enabled)',
471*62c56f98SSadaf Ebrahimi                    'PSA key derivation: bits=7 invalid for ECC SECP_K1 (ECC enabled)',
472*62c56f98SSadaf Ebrahimi                    'PSA key derivation: bits=7 invalid for ECC SECP_R1 (ECC enabled)',
473*62c56f98SSadaf Ebrahimi                    'PSA key derivation: bits=7 invalid for ECC SECP_R2 (ECC enabled)',
474*62c56f98SSadaf Ebrahimi                    'PSA key derivation: bits=7 invalid for ECC SECT_K1 (ECC enabled)',
475*62c56f98SSadaf Ebrahimi                    'PSA key derivation: bits=7 invalid for ECC SECT_R1 (ECC enabled)',
476*62c56f98SSadaf Ebrahimi                    'PSA key derivation: bits=7 invalid for ECC SECT_R2 (ECC enabled)',
477*62c56f98SSadaf Ebrahimi                ],
478*62c56f98SSadaf Ebrahimi                'test_suite_pkparse': [
479*62c56f98SSadaf Ebrahimi                    # See the description provided above in the
480*62c56f98SSadaf Ebrahimi                    # analyze_driver_vs_reference_no_ecp_at_all component.
481*62c56f98SSadaf Ebrahimi                    'Parse EC Key #10a (SEC1 PEM, secp384r1, compressed)',
482*62c56f98SSadaf Ebrahimi                    'Parse EC Key #11a (SEC1 PEM, secp521r1, compressed)',
483*62c56f98SSadaf Ebrahimi                    'Parse EC Key #12a (SEC1 PEM, bp256r1, compressed)',
484*62c56f98SSadaf Ebrahimi                    'Parse EC Key #13a (SEC1 PEM, bp384r1, compressed)',
485*62c56f98SSadaf Ebrahimi                    'Parse EC Key #14a (SEC1 PEM, bp512r1, compressed)',
486*62c56f98SSadaf Ebrahimi                    'Parse EC Key #2a (SEC1 PEM, secp192r1, compressed)',
487*62c56f98SSadaf Ebrahimi                    'Parse EC Key #8a (SEC1 PEM, secp224r1, compressed)',
488*62c56f98SSadaf Ebrahimi                    'Parse EC Key #9a (SEC1 PEM, secp256r1, compressed)',
489*62c56f98SSadaf Ebrahimi                    'Parse Public EC Key #2a (RFC 5480, PEM, secp192r1, compressed)',
490*62c56f98SSadaf Ebrahimi                    'Parse Public EC Key #3a (RFC 5480, secp224r1, compressed)',
491*62c56f98SSadaf Ebrahimi                    'Parse Public EC Key #4a (RFC 5480, secp256r1, compressed)',
492*62c56f98SSadaf Ebrahimi                    'Parse Public EC Key #5a (RFC 5480, secp384r1, compressed)',
493*62c56f98SSadaf Ebrahimi                    'Parse Public EC Key #6a (RFC 5480, secp521r1, compressed)',
494*62c56f98SSadaf Ebrahimi                    'Parse Public EC Key #7a (RFC 5480, brainpoolP256r1, compressed)',
495*62c56f98SSadaf Ebrahimi                    'Parse Public EC Key #8a (RFC 5480, brainpoolP384r1, compressed)',
496*62c56f98SSadaf Ebrahimi                    'Parse Public EC Key #9a (RFC 5480, brainpoolP512r1, compressed)',
497*62c56f98SSadaf Ebrahimi                ],
498*62c56f98SSadaf Ebrahimi                'test_suite_asn1parse': [
499*62c56f98SSadaf Ebrahimi                    # This test depends on BIGNUM_C
500*62c56f98SSadaf Ebrahimi                    'INTEGER too large for mpi',
501*62c56f98SSadaf Ebrahimi                ],
502*62c56f98SSadaf Ebrahimi                'test_suite_asn1write': [
503*62c56f98SSadaf Ebrahimi                    # Following tests depends on BIGNUM_C
504*62c56f98SSadaf Ebrahimi                    'ASN.1 Write mpi 0 (1 limb)',
505*62c56f98SSadaf Ebrahimi                    'ASN.1 Write mpi 0 (null)',
506*62c56f98SSadaf Ebrahimi                    'ASN.1 Write mpi 0x100',
507*62c56f98SSadaf Ebrahimi                    'ASN.1 Write mpi 0x7f',
508*62c56f98SSadaf Ebrahimi                    'ASN.1 Write mpi 0x7f with leading 0 limb',
509*62c56f98SSadaf Ebrahimi                    'ASN.1 Write mpi 0x80',
510*62c56f98SSadaf Ebrahimi                    'ASN.1 Write mpi 0x80 with leading 0 limb',
511*62c56f98SSadaf Ebrahimi                    'ASN.1 Write mpi 0xff',
512*62c56f98SSadaf Ebrahimi                    'ASN.1 Write mpi 1',
513*62c56f98SSadaf Ebrahimi                    'ASN.1 Write mpi, 127*8 bits',
514*62c56f98SSadaf Ebrahimi                    'ASN.1 Write mpi, 127*8+1 bits',
515*62c56f98SSadaf Ebrahimi                    'ASN.1 Write mpi, 127*8-1 bits',
516*62c56f98SSadaf Ebrahimi                    'ASN.1 Write mpi, 255*8 bits',
517*62c56f98SSadaf Ebrahimi                    'ASN.1 Write mpi, 255*8-1 bits',
518*62c56f98SSadaf Ebrahimi                    'ASN.1 Write mpi, 256*8-1 bits',
519*62c56f98SSadaf Ebrahimi                ],
520*62c56f98SSadaf Ebrahimi                'test_suite_debug': [
521*62c56f98SSadaf Ebrahimi                    # Following tests depends on BIGNUM_C
522*62c56f98SSadaf Ebrahimi                    'Debug print mbedtls_mpi #2: 3 bits',
523*62c56f98SSadaf Ebrahimi                    'Debug print mbedtls_mpi: 0 (empty representation)',
524*62c56f98SSadaf Ebrahimi                    'Debug print mbedtls_mpi: 0 (non-empty representation)',
525*62c56f98SSadaf Ebrahimi                    'Debug print mbedtls_mpi: 49 bits',
526*62c56f98SSadaf Ebrahimi                    'Debug print mbedtls_mpi: 759 bits',
527*62c56f98SSadaf Ebrahimi                    'Debug print mbedtls_mpi: 764 bits #1',
528*62c56f98SSadaf Ebrahimi                    'Debug print mbedtls_mpi: 764 bits #2',
529*62c56f98SSadaf Ebrahimi                ],
530*62c56f98SSadaf Ebrahimi                'test_suite_ssl': [
531*62c56f98SSadaf Ebrahimi                    'Test configuration of groups for DHE through mbedtls_ssl_conf_curves()',
532*62c56f98SSadaf Ebrahimi                ],
533*62c56f98SSadaf Ebrahimi            }
534*62c56f98SSadaf Ebrahimi        }
535*62c56f98SSadaf Ebrahimi    },
536*62c56f98SSadaf Ebrahimi    'analyze_driver_vs_reference_ffdh_alg': {
537*62c56f98SSadaf Ebrahimi        'test_function': do_analyze_driver_vs_reference,
538*62c56f98SSadaf Ebrahimi        'args': {
539*62c56f98SSadaf Ebrahimi            'component_ref': 'test_psa_crypto_config_reference_ffdh',
540*62c56f98SSadaf Ebrahimi            'component_driver': 'test_psa_crypto_config_accel_ffdh',
541*62c56f98SSadaf Ebrahimi            'ignored_suites': ['dhm'],
542*62c56f98SSadaf Ebrahimi            'ignored_tests': {}
543*62c56f98SSadaf Ebrahimi        }
544*62c56f98SSadaf Ebrahimi    },
545*62c56f98SSadaf Ebrahimi    'analyze_driver_vs_reference_tfm_config': {
546*62c56f98SSadaf Ebrahimi        'test_function':  do_analyze_driver_vs_reference,
547*62c56f98SSadaf Ebrahimi        'args': {
548*62c56f98SSadaf Ebrahimi            'component_ref': 'test_tfm_config',
549*62c56f98SSadaf Ebrahimi            'component_driver': 'test_tfm_config_p256m_driver_accel_ec',
550*62c56f98SSadaf Ebrahimi            'ignored_suites': [
551*62c56f98SSadaf Ebrahimi                # Ignore test suites for the modules that are disabled in the
552*62c56f98SSadaf Ebrahimi                # accelerated test case.
553*62c56f98SSadaf Ebrahimi                'ecp',
554*62c56f98SSadaf Ebrahimi                'ecdsa',
555*62c56f98SSadaf Ebrahimi                'ecdh',
556*62c56f98SSadaf Ebrahimi                'ecjpake',
557*62c56f98SSadaf Ebrahimi                'bignum_core',
558*62c56f98SSadaf Ebrahimi                'bignum_random',
559*62c56f98SSadaf Ebrahimi                'bignum_mod',
560*62c56f98SSadaf Ebrahimi                'bignum_mod_raw',
561*62c56f98SSadaf Ebrahimi                'bignum.generated',
562*62c56f98SSadaf Ebrahimi                'bignum.misc',
563*62c56f98SSadaf Ebrahimi            ],
564*62c56f98SSadaf Ebrahimi            'ignored_tests': {
565*62c56f98SSadaf Ebrahimi                # Ignore all tests that require DERIVE support which is disabled
566*62c56f98SSadaf Ebrahimi                # in the driver version
567*62c56f98SSadaf Ebrahimi                'test_suite_psa_crypto': [
568*62c56f98SSadaf Ebrahimi                    'PSA key agreement setup: ECDH + HKDF-SHA-256: good',
569*62c56f98SSadaf Ebrahimi                    ('PSA key agreement setup: ECDH + HKDF-SHA-256: good, key algorithm broader '
570*62c56f98SSadaf Ebrahimi                     'than required'),
571*62c56f98SSadaf Ebrahimi                    'PSA key agreement setup: ECDH + HKDF-SHA-256: public key not on curve',
572*62c56f98SSadaf Ebrahimi                    'PSA key agreement setup: KDF instead of a key agreement algorithm',
573*62c56f98SSadaf Ebrahimi                    'PSA key agreement setup: bad key agreement algorithm',
574*62c56f98SSadaf Ebrahimi                    'PSA key agreement: ECDH SECP256R1 (RFC 5903) + HKDF-SHA-256: capacity=8160',
575*62c56f98SSadaf Ebrahimi                    'PSA key agreement: ECDH SECP256R1 (RFC 5903) + HKDF-SHA-256: read 0+32',
576*62c56f98SSadaf Ebrahimi                    'PSA key agreement: ECDH SECP256R1 (RFC 5903) + HKDF-SHA-256: read 1+31',
577*62c56f98SSadaf Ebrahimi                    'PSA key agreement: ECDH SECP256R1 (RFC 5903) + HKDF-SHA-256: read 31+1',
578*62c56f98SSadaf Ebrahimi                    'PSA key agreement: ECDH SECP256R1 (RFC 5903) + HKDF-SHA-256: read 32+0',
579*62c56f98SSadaf Ebrahimi                    'PSA key agreement: ECDH SECP256R1 (RFC 5903) + HKDF-SHA-256: read 32+32',
580*62c56f98SSadaf Ebrahimi                    'PSA key agreement: ECDH SECP256R1 (RFC 5903) + HKDF-SHA-256: read 64+0',
581*62c56f98SSadaf Ebrahimi                    'PSA key derivation: ECDH on P256 with HKDF-SHA256, info first',
582*62c56f98SSadaf Ebrahimi                    'PSA key derivation: ECDH on P256 with HKDF-SHA256, key output',
583*62c56f98SSadaf Ebrahimi                    'PSA key derivation: ECDH on P256 with HKDF-SHA256, missing info',
584*62c56f98SSadaf Ebrahimi                    'PSA key derivation: ECDH on P256 with HKDF-SHA256, omitted salt',
585*62c56f98SSadaf Ebrahimi                    'PSA key derivation: ECDH on P256 with HKDF-SHA256, raw output',
586*62c56f98SSadaf Ebrahimi                    'PSA key derivation: ECDH on P256 with HKDF-SHA256, salt after secret',
587*62c56f98SSadaf Ebrahimi                    'PSA key derivation: ECDH with TLS 1.2 PRF SHA-256, good case',
588*62c56f98SSadaf Ebrahimi                    'PSA key derivation: ECDH with TLS 1.2 PRF SHA-256, missing label',
589*62c56f98SSadaf Ebrahimi                    'PSA key derivation: ECDH with TLS 1.2 PRF SHA-256, missing label and secret',
590*62c56f98SSadaf Ebrahimi                    'PSA key derivation: ECDH with TLS 1.2 PRF SHA-256, no inputs',
591*62c56f98SSadaf Ebrahimi                    'PSA key derivation: HKDF-SHA-256 -> ECC secp256r1',
592*62c56f98SSadaf Ebrahimi                    'PSA key derivation: HKDF-SHA-256 -> ECC secp256r1 (1 redraw)',
593*62c56f98SSadaf Ebrahimi                    'PSA key derivation: HKDF-SHA-256 -> ECC secp256r1, exercise ECDSA',
594*62c56f98SSadaf Ebrahimi                    'PSA key derivation: TLS 1.2 Mix-PSK-to-MS, SHA-256, 0+48, ka',
595*62c56f98SSadaf Ebrahimi                    'PSA key derivation: TLS 1.2 Mix-PSK-to-MS, SHA-256, 24+24, ka',
596*62c56f98SSadaf Ebrahimi                    'PSA key derivation: TLS 1.2 Mix-PSK-to-MS, SHA-256, 48+0, ka',
597*62c56f98SSadaf Ebrahimi                    'PSA key derivation: TLS 1.2 Mix-PSK-to-MS, bad state #1, ka',
598*62c56f98SSadaf Ebrahimi                    'PSA key derivation: TLS 1.2 Mix-PSK-to-MS, bad state #3, ka',
599*62c56f98SSadaf Ebrahimi                    'PSA key derivation: TLS 1.2 Mix-PSK-to-MS, bad state #4, ka',
600*62c56f98SSadaf Ebrahimi                    'PSA key derivation: bits=7 invalid for ECC BRAINPOOL_P_R1 (ECC enabled)',
601*62c56f98SSadaf Ebrahimi                    'PSA key derivation: bits=7 invalid for ECC MONTGOMERY (ECC enabled)',
602*62c56f98SSadaf Ebrahimi                    'PSA key derivation: bits=7 invalid for ECC SECP_K1 (ECC enabled)',
603*62c56f98SSadaf Ebrahimi                    'PSA key derivation: bits=7 invalid for ECC SECP_R1 (ECC enabled)',
604*62c56f98SSadaf Ebrahimi                    'PSA key derivation: bits=7 invalid for ECC SECP_R2 (ECC enabled)',
605*62c56f98SSadaf Ebrahimi                    'PSA key derivation: bits=7 invalid for ECC SECT_K1 (ECC enabled)',
606*62c56f98SSadaf Ebrahimi                    'PSA key derivation: bits=7 invalid for ECC SECT_R1 (ECC enabled)',
607*62c56f98SSadaf Ebrahimi                    'PSA key derivation: bits=7 invalid for ECC SECT_R2 (ECC enabled)',
608*62c56f98SSadaf Ebrahimi                    'PSA raw key agreement: ECDH SECP256R1 (RFC 5903)',
609*62c56f98SSadaf Ebrahimi                ],
610*62c56f98SSadaf Ebrahimi                'test_suite_random': [
611*62c56f98SSadaf Ebrahimi                    'PSA classic wrapper: ECDSA signature (SECP256R1)',
612*62c56f98SSadaf Ebrahimi                ],
613*62c56f98SSadaf Ebrahimi                'test_suite_psa_crypto_pake': [
614*62c56f98SSadaf Ebrahimi                    'PSA PAKE: ecjpake size macros',
615*62c56f98SSadaf Ebrahimi                ],
616*62c56f98SSadaf Ebrahimi                'test_suite_asn1parse': [
617*62c56f98SSadaf Ebrahimi                    # This test depends on BIGNUM_C
618*62c56f98SSadaf Ebrahimi                    'INTEGER too large for mpi',
619*62c56f98SSadaf Ebrahimi                ],
620*62c56f98SSadaf Ebrahimi                'test_suite_asn1write': [
621*62c56f98SSadaf Ebrahimi                    # Following tests depends on BIGNUM_C
622*62c56f98SSadaf Ebrahimi                    'ASN.1 Write mpi 0 (1 limb)',
623*62c56f98SSadaf Ebrahimi                    'ASN.1 Write mpi 0 (null)',
624*62c56f98SSadaf Ebrahimi                    'ASN.1 Write mpi 0x100',
625*62c56f98SSadaf Ebrahimi                    'ASN.1 Write mpi 0x7f',
626*62c56f98SSadaf Ebrahimi                    'ASN.1 Write mpi 0x7f with leading 0 limb',
627*62c56f98SSadaf Ebrahimi                    'ASN.1 Write mpi 0x80',
628*62c56f98SSadaf Ebrahimi                    'ASN.1 Write mpi 0x80 with leading 0 limb',
629*62c56f98SSadaf Ebrahimi                    'ASN.1 Write mpi 0xff',
630*62c56f98SSadaf Ebrahimi                    'ASN.1 Write mpi 1',
631*62c56f98SSadaf Ebrahimi                    'ASN.1 Write mpi, 127*8 bits',
632*62c56f98SSadaf Ebrahimi                    'ASN.1 Write mpi, 127*8+1 bits',
633*62c56f98SSadaf Ebrahimi                    'ASN.1 Write mpi, 127*8-1 bits',
634*62c56f98SSadaf Ebrahimi                    'ASN.1 Write mpi, 255*8 bits',
635*62c56f98SSadaf Ebrahimi                    'ASN.1 Write mpi, 255*8-1 bits',
636*62c56f98SSadaf Ebrahimi                    'ASN.1 Write mpi, 256*8-1 bits',
637*62c56f98SSadaf Ebrahimi                ],
638*62c56f98SSadaf Ebrahimi            }
639*62c56f98SSadaf Ebrahimi        }
640*62c56f98SSadaf Ebrahimi    }
641*62c56f98SSadaf Ebrahimi}
642*62c56f98SSadaf Ebrahimi
643*62c56f98SSadaf Ebrahimidef main():
644*62c56f98SSadaf Ebrahimi    try:
645*62c56f98SSadaf Ebrahimi        parser = argparse.ArgumentParser(description=__doc__)
646*62c56f98SSadaf Ebrahimi        parser.add_argument('outcomes', metavar='OUTCOMES.CSV',
647*62c56f98SSadaf Ebrahimi                            help='Outcome file to analyze')
648*62c56f98SSadaf Ebrahimi        parser.add_argument('task', default='all', nargs='?',
649*62c56f98SSadaf Ebrahimi                            help='Analysis to be done. By default, run all tasks. '
650*62c56f98SSadaf Ebrahimi                                 'With one or more TASK, run only those. '
651*62c56f98SSadaf Ebrahimi                                 'TASK can be the name of a single task or '
652*62c56f98SSadaf Ebrahimi                                 'comma/space-separated list of tasks. ')
653*62c56f98SSadaf Ebrahimi        parser.add_argument('--list', action='store_true',
654*62c56f98SSadaf Ebrahimi                            help='List all available tasks and exit.')
655*62c56f98SSadaf Ebrahimi        parser.add_argument('--require-full-coverage', action='store_true',
656*62c56f98SSadaf Ebrahimi                            dest='full_coverage', help="Require all available "
657*62c56f98SSadaf Ebrahimi                            "test cases to be executed and issue an error "
658*62c56f98SSadaf Ebrahimi                            "otherwise. This flag is ignored if 'task' is "
659*62c56f98SSadaf Ebrahimi                            "neither 'all' nor 'analyze_coverage'")
660*62c56f98SSadaf Ebrahimi        options = parser.parse_args()
661*62c56f98SSadaf Ebrahimi
662*62c56f98SSadaf Ebrahimi        if options.list:
663*62c56f98SSadaf Ebrahimi            for task in TASKS:
664*62c56f98SSadaf Ebrahimi                Results.log(task)
665*62c56f98SSadaf Ebrahimi            sys.exit(0)
666*62c56f98SSadaf Ebrahimi
667*62c56f98SSadaf Ebrahimi        result = True
668*62c56f98SSadaf Ebrahimi
669*62c56f98SSadaf Ebrahimi        if options.task == 'all':
670*62c56f98SSadaf Ebrahimi            tasks = TASKS.keys()
671*62c56f98SSadaf Ebrahimi        else:
672*62c56f98SSadaf Ebrahimi            tasks = re.split(r'[, ]+', options.task)
673*62c56f98SSadaf Ebrahimi
674*62c56f98SSadaf Ebrahimi            for task in tasks:
675*62c56f98SSadaf Ebrahimi                if task not in TASKS:
676*62c56f98SSadaf Ebrahimi                    Results.log('Error: invalid task: {}'.format(task))
677*62c56f98SSadaf Ebrahimi                    sys.exit(1)
678*62c56f98SSadaf Ebrahimi
679*62c56f98SSadaf Ebrahimi        TASKS['analyze_coverage']['args']['full_coverage'] = \
680*62c56f98SSadaf Ebrahimi            options.full_coverage
681*62c56f98SSadaf Ebrahimi
682*62c56f98SSadaf Ebrahimi        for task in TASKS:
683*62c56f98SSadaf Ebrahimi            if task in tasks:
684*62c56f98SSadaf Ebrahimi                if not TASKS[task]['test_function'](options.outcomes, TASKS[task]['args']):
685*62c56f98SSadaf Ebrahimi                    result = False
686*62c56f98SSadaf Ebrahimi
687*62c56f98SSadaf Ebrahimi        if result is False:
688*62c56f98SSadaf Ebrahimi            sys.exit(1)
689*62c56f98SSadaf Ebrahimi        Results.log("SUCCESS :-)")
690*62c56f98SSadaf Ebrahimi    except Exception: # pylint: disable=broad-except
691*62c56f98SSadaf Ebrahimi        # Print the backtrace and exit explicitly with our chosen status.
692*62c56f98SSadaf Ebrahimi        traceback.print_exc()
693*62c56f98SSadaf Ebrahimi        sys.exit(120)
694*62c56f98SSadaf Ebrahimi
695*62c56f98SSadaf Ebrahimiif __name__ == '__main__':
696*62c56f98SSadaf Ebrahimi    main()
697