1*344aa361SAndroid Build Coastguard Worker /*
2*344aa361SAndroid Build Coastguard Worker * Copyright (C) 2019 The Android Open Source Project
3*344aa361SAndroid Build Coastguard Worker *
4*344aa361SAndroid Build Coastguard Worker * Permission is hereby granted, free of charge, to any person obtaining
5*344aa361SAndroid Build Coastguard Worker * a copy of this software and associated documentation files
6*344aa361SAndroid Build Coastguard Worker * (the "Software"), to deal in the Software without restriction,
7*344aa361SAndroid Build Coastguard Worker * including without limitation the rights to use, copy, modify, merge,
8*344aa361SAndroid Build Coastguard Worker * publish, distribute, sublicense, and/or sell copies of the Software,
9*344aa361SAndroid Build Coastguard Worker * and to permit persons to whom the Software is furnished to do so,
10*344aa361SAndroid Build Coastguard Worker * subject to the following conditions:
11*344aa361SAndroid Build Coastguard Worker *
12*344aa361SAndroid Build Coastguard Worker * The above copyright notice and this permission notice shall be
13*344aa361SAndroid Build Coastguard Worker * included in all copies or substantial portions of the Software.
14*344aa361SAndroid Build Coastguard Worker *
15*344aa361SAndroid Build Coastguard Worker * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
16*344aa361SAndroid Build Coastguard Worker * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
17*344aa361SAndroid Build Coastguard Worker * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
18*344aa361SAndroid Build Coastguard Worker * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
19*344aa361SAndroid Build Coastguard Worker * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
20*344aa361SAndroid Build Coastguard Worker * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
21*344aa361SAndroid Build Coastguard Worker * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
22*344aa361SAndroid Build Coastguard Worker */
23*344aa361SAndroid Build Coastguard Worker
24*344aa361SAndroid Build Coastguard Worker #include <inttypes.h>
25*344aa361SAndroid Build Coastguard Worker #include <stdbool.h>
26*344aa361SAndroid Build Coastguard Worker #include <stdio.h>
27*344aa361SAndroid Build Coastguard Worker #include <string.h>
28*344aa361SAndroid Build Coastguard Worker #include <trusty/uuid.h>
29*344aa361SAndroid Build Coastguard Worker
uuid_to_str(const struct uuid * uuid,char * str)30*344aa361SAndroid Build Coastguard Worker void uuid_to_str(const struct uuid* uuid, char* str) {
31*344aa361SAndroid Build Coastguard Worker sprintf(str,
32*344aa361SAndroid Build Coastguard Worker "%08" PRIx32 "-%04" PRIx16 "-%04" PRIx16 "-%02" PRIx8 "%02" PRIx8
33*344aa361SAndroid Build Coastguard Worker "-%02" PRIx8 "%02" PRIx8 "%02" PRIx8 "%02" PRIx8 "%02" PRIx8
34*344aa361SAndroid Build Coastguard Worker "%02" PRIx8,
35*344aa361SAndroid Build Coastguard Worker uuid->time_low, uuid->time_mid, uuid->time_hi_and_version,
36*344aa361SAndroid Build Coastguard Worker uuid->clock_seq_and_node[0], uuid->clock_seq_and_node[1],
37*344aa361SAndroid Build Coastguard Worker uuid->clock_seq_and_node[2], uuid->clock_seq_and_node[3],
38*344aa361SAndroid Build Coastguard Worker uuid->clock_seq_and_node[4], uuid->clock_seq_and_node[5],
39*344aa361SAndroid Build Coastguard Worker uuid->clock_seq_and_node[6], uuid->clock_seq_and_node[7]);
40*344aa361SAndroid Build Coastguard Worker }
41*344aa361SAndroid Build Coastguard Worker
parse_dash(const char ** str)42*344aa361SAndroid Build Coastguard Worker static bool parse_dash(const char** str) {
43*344aa361SAndroid Build Coastguard Worker if (**str != '-') {
44*344aa361SAndroid Build Coastguard Worker return false;
45*344aa361SAndroid Build Coastguard Worker }
46*344aa361SAndroid Build Coastguard Worker
47*344aa361SAndroid Build Coastguard Worker *str += 1;
48*344aa361SAndroid Build Coastguard Worker return true;
49*344aa361SAndroid Build Coastguard Worker }
50*344aa361SAndroid Build Coastguard Worker
parse_hex_digit(const char ** str,uint8_t * dst)51*344aa361SAndroid Build Coastguard Worker static bool parse_hex_digit(const char** str, uint8_t* dst) {
52*344aa361SAndroid Build Coastguard Worker char c;
53*344aa361SAndroid Build Coastguard Worker
54*344aa361SAndroid Build Coastguard Worker c = **str;
55*344aa361SAndroid Build Coastguard Worker *str += 1;
56*344aa361SAndroid Build Coastguard Worker
57*344aa361SAndroid Build Coastguard Worker if (c >= '0' && c <= '9') {
58*344aa361SAndroid Build Coastguard Worker *dst = c - '0';
59*344aa361SAndroid Build Coastguard Worker return true;
60*344aa361SAndroid Build Coastguard Worker }
61*344aa361SAndroid Build Coastguard Worker
62*344aa361SAndroid Build Coastguard Worker if (c >= 'a' && c <= 'f') {
63*344aa361SAndroid Build Coastguard Worker *dst = c - 'a' + 10;
64*344aa361SAndroid Build Coastguard Worker return true;
65*344aa361SAndroid Build Coastguard Worker }
66*344aa361SAndroid Build Coastguard Worker
67*344aa361SAndroid Build Coastguard Worker return false;
68*344aa361SAndroid Build Coastguard Worker }
69*344aa361SAndroid Build Coastguard Worker
parse_u8(const char ** str,uint8_t * dst)70*344aa361SAndroid Build Coastguard Worker static bool parse_u8(const char** str, uint8_t* dst) {
71*344aa361SAndroid Build Coastguard Worker uint8_t msn;
72*344aa361SAndroid Build Coastguard Worker uint8_t lsn;
73*344aa361SAndroid Build Coastguard Worker
74*344aa361SAndroid Build Coastguard Worker if (!parse_hex_digit(str, &msn)) {
75*344aa361SAndroid Build Coastguard Worker return false;
76*344aa361SAndroid Build Coastguard Worker }
77*344aa361SAndroid Build Coastguard Worker
78*344aa361SAndroid Build Coastguard Worker if (!parse_hex_digit(str, &lsn)) {
79*344aa361SAndroid Build Coastguard Worker return false;
80*344aa361SAndroid Build Coastguard Worker }
81*344aa361SAndroid Build Coastguard Worker
82*344aa361SAndroid Build Coastguard Worker *dst = (msn << 4) + lsn;
83*344aa361SAndroid Build Coastguard Worker return true;
84*344aa361SAndroid Build Coastguard Worker }
85*344aa361SAndroid Build Coastguard Worker
parse_u16(const char ** str,uint16_t * dst)86*344aa361SAndroid Build Coastguard Worker static bool parse_u16(const char** str, uint16_t* dst) {
87*344aa361SAndroid Build Coastguard Worker uint8_t msb;
88*344aa361SAndroid Build Coastguard Worker uint8_t lsb;
89*344aa361SAndroid Build Coastguard Worker
90*344aa361SAndroid Build Coastguard Worker if (!parse_u8(str, &msb)) {
91*344aa361SAndroid Build Coastguard Worker return false;
92*344aa361SAndroid Build Coastguard Worker }
93*344aa361SAndroid Build Coastguard Worker
94*344aa361SAndroid Build Coastguard Worker if (!parse_u8(str, &lsb)) {
95*344aa361SAndroid Build Coastguard Worker return false;
96*344aa361SAndroid Build Coastguard Worker }
97*344aa361SAndroid Build Coastguard Worker
98*344aa361SAndroid Build Coastguard Worker *dst = ((uint16_t)msb << 8) + lsb;
99*344aa361SAndroid Build Coastguard Worker return true;
100*344aa361SAndroid Build Coastguard Worker }
101*344aa361SAndroid Build Coastguard Worker
parse_u32(const char ** str,uint32_t * dst)102*344aa361SAndroid Build Coastguard Worker static bool parse_u32(const char** str, uint32_t* dst) {
103*344aa361SAndroid Build Coastguard Worker uint16_t msh;
104*344aa361SAndroid Build Coastguard Worker uint16_t lsh;
105*344aa361SAndroid Build Coastguard Worker
106*344aa361SAndroid Build Coastguard Worker if (!parse_u16(str, &msh)) {
107*344aa361SAndroid Build Coastguard Worker return false;
108*344aa361SAndroid Build Coastguard Worker }
109*344aa361SAndroid Build Coastguard Worker
110*344aa361SAndroid Build Coastguard Worker if (!parse_u16(str, &lsh)) {
111*344aa361SAndroid Build Coastguard Worker return false;
112*344aa361SAndroid Build Coastguard Worker }
113*344aa361SAndroid Build Coastguard Worker
114*344aa361SAndroid Build Coastguard Worker *dst = ((uint32_t)msh << 16) + lsh;
115*344aa361SAndroid Build Coastguard Worker return true;
116*344aa361SAndroid Build Coastguard Worker }
117*344aa361SAndroid Build Coastguard Worker
str_to_uuid(const char * str,struct uuid * uuid)118*344aa361SAndroid Build Coastguard Worker int str_to_uuid(const char* str, struct uuid* uuid) {
119*344aa361SAndroid Build Coastguard Worker int len;
120*344aa361SAndroid Build Coastguard Worker
121*344aa361SAndroid Build Coastguard Worker len = strnlen(str, UUID_STR_SIZE);
122*344aa361SAndroid Build Coastguard Worker if (len == UUID_STR_SIZE) {
123*344aa361SAndroid Build Coastguard Worker return -1;
124*344aa361SAndroid Build Coastguard Worker }
125*344aa361SAndroid Build Coastguard Worker
126*344aa361SAndroid Build Coastguard Worker if (!parse_u32(&str, &uuid->time_low)) {
127*344aa361SAndroid Build Coastguard Worker return -1;
128*344aa361SAndroid Build Coastguard Worker }
129*344aa361SAndroid Build Coastguard Worker
130*344aa361SAndroid Build Coastguard Worker if (!parse_dash(&str)) {
131*344aa361SAndroid Build Coastguard Worker return -1;
132*344aa361SAndroid Build Coastguard Worker }
133*344aa361SAndroid Build Coastguard Worker
134*344aa361SAndroid Build Coastguard Worker if (!parse_u16(&str, &uuid->time_mid)) {
135*344aa361SAndroid Build Coastguard Worker return -1;
136*344aa361SAndroid Build Coastguard Worker }
137*344aa361SAndroid Build Coastguard Worker
138*344aa361SAndroid Build Coastguard Worker if (!parse_dash(&str)) {
139*344aa361SAndroid Build Coastguard Worker return -1;
140*344aa361SAndroid Build Coastguard Worker }
141*344aa361SAndroid Build Coastguard Worker
142*344aa361SAndroid Build Coastguard Worker if (!parse_u16(&str, &uuid->time_hi_and_version)) {
143*344aa361SAndroid Build Coastguard Worker return -1;
144*344aa361SAndroid Build Coastguard Worker }
145*344aa361SAndroid Build Coastguard Worker
146*344aa361SAndroid Build Coastguard Worker if (!parse_dash(&str)) {
147*344aa361SAndroid Build Coastguard Worker return -1;
148*344aa361SAndroid Build Coastguard Worker }
149*344aa361SAndroid Build Coastguard Worker
150*344aa361SAndroid Build Coastguard Worker if (!parse_u8(&str, uuid->clock_seq_and_node)) {
151*344aa361SAndroid Build Coastguard Worker return -1;
152*344aa361SAndroid Build Coastguard Worker }
153*344aa361SAndroid Build Coastguard Worker
154*344aa361SAndroid Build Coastguard Worker if (!parse_u8(&str, uuid->clock_seq_and_node + 1)) {
155*344aa361SAndroid Build Coastguard Worker return -1;
156*344aa361SAndroid Build Coastguard Worker }
157*344aa361SAndroid Build Coastguard Worker
158*344aa361SAndroid Build Coastguard Worker if (!parse_dash(&str)) {
159*344aa361SAndroid Build Coastguard Worker return -1;
160*344aa361SAndroid Build Coastguard Worker }
161*344aa361SAndroid Build Coastguard Worker
162*344aa361SAndroid Build Coastguard Worker for (int i = 2; i < 8; i++) {
163*344aa361SAndroid Build Coastguard Worker if (!parse_u8(&str, uuid->clock_seq_and_node + i)) {
164*344aa361SAndroid Build Coastguard Worker return -1;
165*344aa361SAndroid Build Coastguard Worker }
166*344aa361SAndroid Build Coastguard Worker }
167*344aa361SAndroid Build Coastguard Worker
168*344aa361SAndroid Build Coastguard Worker return 0;
169*344aa361SAndroid Build Coastguard Worker }
170