xref: /aosp_15_r20/trusty/kernel/lib/libc-ext/uuid.c (revision 344aa361028b423587d4ef3fa52a23d194628137)
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