/* SPDX-License-Identifier: GPL-2.0-or-later */

#include "guids.h"

#include <stdio.h>
#include <string.h>

#include <commonlib/bsd/helpers.h>

#include "udk2017.h"
#include "utils.h"

const struct guid_alias_t known_guids[] = {
	{
		"coreboot",
		{
			0xceae4c1d, 0x335b, 0x4685,
			{ 0xa4, 0xa0, 0xfc, 0x4a, 0x94, 0xee, 0xa0, 0x85 }
		},
	},
	{
		"dasharo",
		{
			0xd15b327e, 0xff2d, 0x4fc1,
			{ 0xab, 0xf6, 0xc1, 0x2b, 0xd0, 0x8c, 0x13, 0x59 }
		},
	},
	{
		"global",
		{
			0x8be4df61, 0x93ca, 0x11d2,
			{ 0xaa, 0x0d, 0x00, 0xe0, 0x98, 0x03, 0x2b, 0x8c }
		},
	},
	{
		"microsoft",
		{
			0x77fa9abd, 0x0359, 0x4d32,
			{ 0xbd, 0x60, 0x28, 0xf4, 0xe7, 0x8f, 0x78, 0x4b }
		},
	},
};

const int known_guid_count = ARRAY_SIZE(known_guids);

char *format_guid(const EFI_GUID *guid, bool use_alias)
{
	if (use_alias) {
		for (int i = 0; i < known_guid_count; ++i) {
			const struct guid_alias_t *known_guid = &known_guids[i];
			if (memcmp(&known_guid->guid, guid, sizeof(*guid)) == 0)
				return strdup(known_guid->alias);
		}
	}

	char *str = xmalloc(GUID_LEN + 1);
	snprintf(str, GUID_LEN + 1,
		 "%08x-%04x-%04x-%02x%02x%02x%02x%02x%02x%02x%02x",
		 guid->Data1, guid->Data2, guid->Data3,
		 guid->Data4[0], guid->Data4[1],
		 guid->Data4[2], guid->Data4[3],
		 guid->Data4[4], guid->Data4[5],
		 guid->Data4[6], guid->Data4[7]);
	return str;
}

bool parse_guid(const char str[], EFI_GUID *guid)
{
	for (int i = 0; i < known_guid_count; ++i) {
		const struct guid_alias_t *known_guid = &known_guids[i];
		if (str_eq(known_guid->alias, str)) {
			*guid = known_guid->guid;
			return true;
		}
	}

	if (strlen(str) != GUID_LEN)
		return false;

	int n = sscanf(str,
		       "%08x-%04hx-%04hx-"
		       "%02hhx%02hhx%02hhx%02hhx%02hhx%02hhx%02hhx%02hhx",
		       &guid->Data1, &guid->Data2, &guid->Data3,
		       &guid->Data4[0], &guid->Data4[1],
		       &guid->Data4[2], &guid->Data4[3],
		       &guid->Data4[4], &guid->Data4[5],
		       &guid->Data4[6], &guid->Data4[7]);
	return n == 11;
}
