| // SPDX-License-Identifier: GPL-2.0+ |
| /* |
| * Functional tests for UCLASS_FFA class |
| * |
| * Copyright 2022-2023 Arm Limited and/or its affiliates <open-source-office@arm.com> |
| * |
| * Authors: |
| * Abdellatif El Khlifi <abdellatif.elkhlifi@arm.com> |
| */ |
| |
| #include <charset.h> |
| #include <u-boot/uuid.h> |
| #include <test/lib.h> |
| #include <test/test.h> |
| #include <test/ut.h> |
| |
| #include <efi.h> |
| |
| /* test UUID */ |
| #define TEST_SVC_UUID "ed32d533-4209-99e6-2d72-cdd998a79cc0" |
| /* U-Boot default fw image namespace */ |
| #define DEFAULT_FW_IMAGE_NAMESPACE "8c9f137e-91dc-427b-b2d6-b420faebaf2a" |
| |
| #define UUID_SIZE 16 |
| |
| /* The UUID binary data (little-endian format) */ |
| static const u8 ref_uuid_bin[UUID_SIZE] = { |
| 0x33, 0xd5, 0x32, 0xed, |
| 0x09, 0x42, 0xe6, 0x99, |
| 0x72, 0x2d, 0xc0, 0x9c, |
| 0xa7, 0x98, 0xd9, 0xcd |
| }; |
| |
| static int lib_test_uuid_to_le(struct unit_test_state *uts) |
| { |
| const char *uuid_str = TEST_SVC_UUID; |
| u8 ret_uuid_bin[UUID_SIZE] = {0}; |
| |
| ut_assertok(uuid_str_to_le_bin(uuid_str, ret_uuid_bin)); |
| ut_asserteq_mem(ref_uuid_bin, ret_uuid_bin, UUID_SIZE); |
| |
| return 0; |
| } |
| LIB_TEST(lib_test_uuid_to_le, 0); |
| |
| #if defined(CONFIG_RANDOM_UUID) || defined(CONFIG_CMD_UUID) |
| /* Test UUID attribute bits (version, variant) */ |
| static int lib_test_uuid_bits(struct unit_test_state *uts) |
| { |
| unsigned char uuid[16]; |
| efi_guid_t guid; |
| int i; |
| |
| /* |
| * Reduce the chance of a randomly generated UUID disguising |
| * a regression by testing multiple times. |
| */ |
| for (i = 0; i < 5; i++) { |
| /* Test UUID v4 */ |
| gen_rand_uuid((unsigned char *)&uuid); |
| |
| printf("v4 UUID: %pUb\n", (efi_guid_t *)uuid); |
| |
| /* version 4 */ |
| ut_assert((uuid[6] & 0xf0) == 0x40); |
| /* variant 1 */ |
| ut_assert((uuid[8] & UUID_VARIANT_MASK) == (UUID_VARIANT << UUID_VARIANT_SHIFT)); |
| |
| /* Test v5, use the v4 UUID as the namespace */ |
| gen_v5_guid((struct uuid *)uuid, |
| &guid, "test", 4, NULL); |
| |
| printf("v5 GUID: %pUl\n", (efi_guid_t *)uuid); |
| |
| /* This is a GUID so bits 6 and 7 are swapped (little endian). Version 5 */ |
| ut_assert((guid.b[7] & 0xf0) == 0x50); |
| /* variant 1 */ |
| ut_assert((guid.b[8] & UUID_VARIANT_MASK) == (UUID_VARIANT << UUID_VARIANT_SHIFT)); |
| } |
| |
| return 0; |
| } |
| |
| LIB_TEST(lib_test_uuid_bits, 0); |
| #endif |
| |
| struct dynamic_uuid_test_data { |
| const char *compatible; |
| const u16 *images[4]; |
| const char *expected_uuids[4]; |
| }; |
| |
| static int lib_test_dynamic_uuid_case(struct unit_test_state *uts, |
| const struct dynamic_uuid_test_data *data) |
| { |
| struct uuid namespace; |
| int j; |
| |
| ut_assertok(uuid_str_to_bin(DEFAULT_FW_IMAGE_NAMESPACE, (unsigned char *)&namespace, |
| UUID_STR_FORMAT_GUID)); |
| |
| for (j = 0; data->images[j]; j++) { |
| const char *expected_uuid = data->expected_uuids[j]; |
| const u16 *image = data->images[j]; |
| efi_guid_t uuid; |
| char uuid_str[37]; |
| |
| gen_v5_guid(&namespace, &uuid, |
| data->compatible, strlen(data->compatible), |
| image, u16_strlen(image) * sizeof(uint16_t), |
| NULL); |
| uuid_bin_to_str((unsigned char *)&uuid, uuid_str, UUID_STR_FORMAT_GUID); |
| |
| ut_asserteq_str(expected_uuid, uuid_str); |
| } |
| |
| return 0; |
| } |
| |
| static int lib_test_dynamic_uuid(struct unit_test_state *uts) |
| { |
| int ret, i; |
| const struct dynamic_uuid_test_data test_data[] = { |
| { |
| .compatible = "sandbox", |
| .images = { |
| u"SANDBOX-UBOOT", |
| u"SANDBOX-UBOOT-ENV", |
| u"SANDBOX-FIT", |
| NULL, |
| }, |
| .expected_uuids = { |
| "985f2937-7c2e-5e9a-8a5e-8e063312964b", |
| "9e339473-c2eb-530a-a69b-0cd6bbbed40e", |
| "46610520-469e-59dc-a8dd-c11832b877ea", |
| NULL, |
| } |
| }, |
| { |
| .compatible = "qcom,qrb4210-rb2", |
| .images = { |
| u"QUALCOMM-UBOOT", |
| NULL, |
| }, |
| .expected_uuids = { |
| "d5021fac-8dd0-5ed7-90c2-763c304aaf86", |
| NULL, |
| } |
| }, |
| }; |
| |
| for (i = 0; i < ARRAY_SIZE(test_data); i++) { |
| ret = lib_test_dynamic_uuid_case(uts, &test_data[i]); |
| if (ret) |
| return ret; |
| } |
| |
| return 0; |
| } |
| |
| LIB_TEST(lib_test_dynamic_uuid, 0); |