xref: /optee_os/lib/libutee/tee_uuid_from_str.c (revision 791ee55c91758bc4e1379755024af64bc1a53189)
1*791ee55cSJerome Forissier // SPDX-License-Identifier: BSD-2-Clause
2*791ee55cSJerome Forissier /*
3*791ee55cSJerome Forissier  * Copyright (c) 2019, Linaro Limited
4*791ee55cSJerome Forissier  */
5*791ee55cSJerome Forissier 
6*791ee55cSJerome Forissier #include <ctype.h>
7*791ee55cSJerome Forissier #include <stdint.h>
8*791ee55cSJerome Forissier #include <string.h>
9*791ee55cSJerome Forissier #include <tee_api_types.h>
10*791ee55cSJerome Forissier #include <tee_internal_api_extensions.h>
11*791ee55cSJerome Forissier 
hex(char c)12*791ee55cSJerome Forissier static int hex(char c)
13*791ee55cSJerome Forissier {
14*791ee55cSJerome Forissier 	char lc = tolower(c);
15*791ee55cSJerome Forissier 
16*791ee55cSJerome Forissier 	if (isdigit(lc))
17*791ee55cSJerome Forissier 		return lc - '0';
18*791ee55cSJerome Forissier 	if (isxdigit(lc))
19*791ee55cSJerome Forissier 		return lc - 'a' + 10;
20*791ee55cSJerome Forissier 	return -1;
21*791ee55cSJerome Forissier }
22*791ee55cSJerome Forissier 
parse_hex(const char * s,size_t nchars,uint32_t * res)23*791ee55cSJerome Forissier static uint32_t parse_hex(const char *s, size_t nchars, uint32_t *res)
24*791ee55cSJerome Forissier {
25*791ee55cSJerome Forissier 	uint32_t v = 0;
26*791ee55cSJerome Forissier 	size_t n = 0;
27*791ee55cSJerome Forissier 	int c = 0;
28*791ee55cSJerome Forissier 
29*791ee55cSJerome Forissier 	for (n = 0; n < nchars; n++) {
30*791ee55cSJerome Forissier 		c = hex(s[n]);
31*791ee55cSJerome Forissier 		if (c == -1) {
32*791ee55cSJerome Forissier 			*res = TEE_ERROR_BAD_FORMAT;
33*791ee55cSJerome Forissier 			goto out;
34*791ee55cSJerome Forissier 		}
35*791ee55cSJerome Forissier 		v = (v << 4) + c;
36*791ee55cSJerome Forissier 	}
37*791ee55cSJerome Forissier 	*res = TEE_SUCCESS;
38*791ee55cSJerome Forissier out:
39*791ee55cSJerome Forissier 	return v;
40*791ee55cSJerome Forissier }
41*791ee55cSJerome Forissier 
tee_uuid_from_str(TEE_UUID * uuid,const char * s)42*791ee55cSJerome Forissier TEE_Result tee_uuid_from_str(TEE_UUID *uuid, const char *s)
43*791ee55cSJerome Forissier {
44*791ee55cSJerome Forissier 	TEE_Result res = TEE_SUCCESS;
45*791ee55cSJerome Forissier 	TEE_UUID u = { };
46*791ee55cSJerome Forissier 	const char *p = s;
47*791ee55cSJerome Forissier 	size_t i = 0;
48*791ee55cSJerome Forissier 
49*791ee55cSJerome Forissier 	if (!p || strnlen(p, 37) != 36)
50*791ee55cSJerome Forissier 		return TEE_ERROR_BAD_FORMAT;
51*791ee55cSJerome Forissier 	if (p[8] != '-' || p[13] != '-' || p[18] != '-' || p[23] != '-')
52*791ee55cSJerome Forissier 		return TEE_ERROR_BAD_FORMAT;
53*791ee55cSJerome Forissier 
54*791ee55cSJerome Forissier 	u.timeLow = parse_hex(p, 8, &res);
55*791ee55cSJerome Forissier 	if (res)
56*791ee55cSJerome Forissier 		goto out;
57*791ee55cSJerome Forissier 	p += 9;
58*791ee55cSJerome Forissier 	u.timeMid = parse_hex(p, 4, &res);
59*791ee55cSJerome Forissier 	if (res)
60*791ee55cSJerome Forissier 		goto out;
61*791ee55cSJerome Forissier 	p += 5;
62*791ee55cSJerome Forissier 	u.timeHiAndVersion = parse_hex(p, 4, &res);
63*791ee55cSJerome Forissier 	if (res)
64*791ee55cSJerome Forissier 		goto out;
65*791ee55cSJerome Forissier 	p += 5;
66*791ee55cSJerome Forissier 	for (i = 0; i < 8; i++) {
67*791ee55cSJerome Forissier 		u.clockSeqAndNode[i] = parse_hex(p, 2, &res);
68*791ee55cSJerome Forissier 		if (res)
69*791ee55cSJerome Forissier 			goto out;
70*791ee55cSJerome Forissier 		if (i == 1)
71*791ee55cSJerome Forissier 			p += 3;
72*791ee55cSJerome Forissier 		else
73*791ee55cSJerome Forissier 			p += 2;
74*791ee55cSJerome Forissier 	}
75*791ee55cSJerome Forissier 	*uuid = u;
76*791ee55cSJerome Forissier out:
77*791ee55cSJerome Forissier 	return res;
78*791ee55cSJerome Forissier }
79