Mate Toth-Pal | b2508d5 | 2022-04-30 14:10:06 +0200 | [diff] [blame] | 1 | #------------------------------------------------------------------------------- |
| 2 | # Copyright (c) 2022, Arm Limited. All rights reserved. |
| 3 | # |
| 4 | # SPDX-License-Identifier: BSD-3-Clause |
| 5 | # |
| 6 | #------------------------------------------------------------------------------- |
| 7 | |
| 8 | """This module contains utility functions for tests.""" |
| 9 | |
| 10 | import os |
| 11 | import tempfile |
| 12 | from io import BytesIO |
| 13 | from cbor2 import CBOREncoder |
| 14 | from iatverifier.util import read_token_map |
| 15 | |
| 16 | def bytes_equal_to_file(data, filepath): |
| 17 | """ |
| 18 | return compare a bytestring and the content of a file and return whether they are the same |
| 19 | """ |
| 20 | with open(filepath, 'rb') as file: |
| 21 | file_data = file.read() |
| 22 | if len(file_data) != len(data): |
| 23 | return False |
| 24 | for bytes1, bytes2 in zip(data, file_data): |
| 25 | if bytes1 != bytes2: |
| 26 | return False |
| 27 | return True |
| 28 | |
Mate Toth-Pal | e305e55 | 2022-10-07 14:04:53 +0200 | [diff] [blame] | 29 | def convert_map_to_token_bytes(token_map, verifier): |
Mate Toth-Pal | b2508d5 | 2022-04-30 14:10:06 +0200 | [diff] [blame] | 30 | """Converts a map to cbor token""" |
| 31 | with BytesIO() as bytes_io: |
| 32 | encoder = CBOREncoder(bytes_io) |
| 33 | verifier.convert_map_to_token( |
| 34 | encoder, |
| 35 | token_map, |
Mate Toth-Pal | b2508d5 | 2022-04-30 14:10:06 +0200 | [diff] [blame] | 36 | name_as_key=True, |
| 37 | parse_raw_value=True, |
| 38 | root=True) |
| 39 | return bytes_io.getvalue() |
| 40 | |
Mate Toth-Pal | e305e55 | 2022-10-07 14:04:53 +0200 | [diff] [blame] | 41 | def create_token(data_dir, source_name, verifier): |
Thomas Fossati | f4e1ca3 | 2024-08-16 16:01:31 +0000 | [diff] [blame^] | 42 | """Create a cbor token from a yaml file.""" |
Mate Toth-Pal | b2508d5 | 2022-04-30 14:10:06 +0200 | [diff] [blame] | 43 | source_path = os.path.join(data_dir, source_name) |
| 44 | token_map = read_token_map(source_path) |
Mate Toth-Pal | e305e55 | 2022-10-07 14:04:53 +0200 | [diff] [blame] | 45 | return convert_map_to_token_bytes(token_map, verifier) |
Mate Toth-Pal | b2508d5 | 2022-04-30 14:10:06 +0200 | [diff] [blame] | 46 | |
Mate Toth-Pal | e305e55 | 2022-10-07 14:04:53 +0200 | [diff] [blame] | 47 | def create_token_file(data_dir, source_name, verifier, dest_path): |
Mate Toth-Pal | f03ea69 | 2022-07-28 21:49:25 +0200 | [diff] [blame] | 48 | """Create a cbor token from a yaml file and write it to a file |
| 49 | """ |
| 50 | token = create_token( |
| 51 | data_dir=data_dir, |
| 52 | source_name=source_name, |
Mate Toth-Pal | e305e55 | 2022-10-07 14:04:53 +0200 | [diff] [blame] | 53 | verifier=verifier) |
Mate Toth-Pal | f03ea69 | 2022-07-28 21:49:25 +0200 | [diff] [blame] | 54 | |
| 55 | with open(dest_path, 'wb') as wfh: |
| 56 | wfh.write(token) |
| 57 | |
Mate Toth-Pal | b2508d5 | 2022-04-30 14:10:06 +0200 | [diff] [blame] | 58 | def create_token_tmp_file(data_dir, source_name, verifier): |
| 59 | """Create a cbor token from a yaml file and write it to a temp file. Return the name of the temp |
| 60 | file |
| 61 | """ |
| 62 | temp_file, dest_path = tempfile.mkstemp() |
| 63 | os.close(temp_file) |
Mate Toth-Pal | f03ea69 | 2022-07-28 21:49:25 +0200 | [diff] [blame] | 64 | create_token_file(data_dir, source_name, verifier, dest_path) |
Mate Toth-Pal | b2508d5 | 2022-04-30 14:10:06 +0200 | [diff] [blame] | 65 | return dest_path |
| 66 | |
| 67 | |
Mate Toth-Pal | e305e55 | 2022-10-07 14:04:53 +0200 | [diff] [blame] | 68 | def read_iat(data_dir, filename, verifier): |
Mate Toth-Pal | b2508d5 | 2022-04-30 14:10:06 +0200 | [diff] [blame] | 69 | """Read a cbor file and returns the parsed dictionary""" |
| 70 | filepath = os.path.join(data_dir, filename) |
| 71 | with open(filepath, 'rb') as file: |
Mate Toth-Pal | c7404e9 | 2022-07-15 11:11:13 +0200 | [diff] [blame] | 72 | token_item = verifier.parse_token( |
Mate Toth-Pal | b2508d5 | 2022-04-30 14:10:06 +0200 | [diff] [blame] | 73 | token=file.read(), |
Mate Toth-Pal | b2508d5 | 2022-04-30 14:10:06 +0200 | [diff] [blame] | 74 | lower_case_key=False) |
Mate Toth-Pal | c7404e9 | 2022-07-15 11:11:13 +0200 | [diff] [blame] | 75 | token_item.verify() |
Mate Toth-Pal | c941766 | 2022-10-09 13:34:08 +0200 | [diff] [blame] | 76 | token_item.get_token_map() |
Mate Toth-Pal | c7404e9 | 2022-07-15 11:11:13 +0200 | [diff] [blame] | 77 | return token_item |
Mate Toth-Pal | b2508d5 | 2022-04-30 14:10:06 +0200 | [diff] [blame] | 78 | |
| 79 | def create_and_read_iat(data_dir, source_name, verifier): |
| 80 | """Read a yaml file, compile it into a cbor token, and read it back""" |
| 81 | token_file = create_token_tmp_file(data_dir, source_name, verifier) |
| 82 | return read_iat(data_dir, token_file, verifier) |