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