1 /*
2 * Copyright (C) 2022 Huawei Device Co., Ltd.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 * http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15
16 #include <securec.h>
17 #include "device_attest_oem_file.h"
18 #include "device_attest_oem_adapter.h"
19
20 static const char g_tokenMagicNum[] = {1, 2, 3, 4};
21 #define TOKEN_MAGIC_NUM_SIZE (sizeof(g_tokenMagicNum)/sizeof(g_tokenMagicNum[0]))
22
ReadTokenWithFlag(char * path,char * fileName,char * result,unsigned int len)23 static int ReadTokenWithFlag(char* path, char* fileName, char* result, unsigned int len)
24 {
25 const unsigned int buffLen = TOKEN_MAGIC_NUM_SIZE + TOKEN_WITH_FLAG_SIZE + 1;
26 char buf[buffLen];
27 (void)memset_s(buf, buffLen, 0, buffLen);
28 if (OEMReadFile(path, fileName, buf, buffLen) != 0) {
29 return DEVICE_ATTEST_OEM_ERR;
30 }
31 int isTokenValid = 1;
32 for (unsigned int i = 0; i < TOKEN_MAGIC_NUM_SIZE; i++) {
33 if (buf[i] != g_tokenMagicNum[i]) {
34 isTokenValid = 0;
35 break;
36 }
37 }
38 if (isTokenValid == 0) {
39 return DEVICE_ATTEST_OEM_ERR;
40 }
41 (void)memcpy_s(result, TOKEN_WITH_FLAG_SIZE, buf + TOKEN_MAGIC_NUM_SIZE, TOKEN_WITH_FLAG_SIZE);
42 return DEVICE_ATTEST_OEM_OK;
43 }
44
WriteTokenWithFlag(char * path,char * fileName,const char * tokenWithFlag,unsigned int len)45 static int WriteTokenWithFlag(char* path, char* fileName, const char* tokenWithFlag, unsigned int len)
46 {
47 const unsigned int buffLen = TOKEN_MAGIC_NUM_SIZE + TOKEN_WITH_FLAG_SIZE + 1;
48 char buf[buffLen];
49 (void)memset_s(buf, buffLen, 0, buffLen);
50
51 for (unsigned int i = 0; i < TOKEN_MAGIC_NUM_SIZE; i++) {
52 buf[i] = g_tokenMagicNum[i];
53 }
54 (void)memcpy_s(buf + TOKEN_MAGIC_NUM_SIZE, TOKEN_WITH_FLAG_SIZE, tokenWithFlag, TOKEN_WITH_FLAG_SIZE);
55
56 if (OEMCreateFile(path, fileName) != 0) {
57 return DEVICE_ATTEST_OEM_ERR;
58 }
59 return OEMWriteFile(path, fileName, buf, buffLen);
60 }
61
GetTokenFlag(const char tokenWithFlag[])62 static uint32_t GetTokenFlag(const char tokenWithFlag[])
63 {
64 unsigned result = 0;
65 for (unsigned int i = 0; i < TOKEN_FLAG_SIZE; i++) {
66 result |= ((uint8_t)tokenWithFlag[TOKEN_SIZE + i]) << ((TOKEN_FLAG_SIZE - 1 - i) * BITS_PER_BYTE);
67 }
68 return result;
69 }
70
SetTokenFlag(unsigned char flag[],uint32_t value)71 static void SetTokenFlag(unsigned char flag[], uint32_t value)
72 {
73 for (unsigned int i = 0; i < TOKEN_FLAG_SIZE; i++) {
74 flag[i] = (value >> (BITS_PER_BYTE * (TOKEN_FLAG_SIZE - 1 - i))) & 0xFF;
75 }
76 }
77
OEMReadToken(char * token,uint32_t len)78 int32_t OEMReadToken(char *token, uint32_t len)
79 {
80 if (token == NULL || len == 0) {
81 return DEVICE_ATTEST_OEM_ERR;
82 }
83 char tokenWithFlagA[TOKEN_WITH_FLAG_SIZE] = {0};
84 char tokenWithFlagB[TOKEN_WITH_FLAG_SIZE] = {0};
85 int32_t retA = ReadTokenWithFlag(TOKEN_ADDR, TOKEN_A_ADDR, tokenWithFlagA, TOKEN_WITH_FLAG_SIZE);
86 int32_t retB = ReadTokenWithFlag(TOKEN_ADDR, TOKEN_B_ADDR, tokenWithFlagB, TOKEN_WITH_FLAG_SIZE);
87 if ((retA != DEVICE_ATTEST_OEM_OK) && (retB != DEVICE_ATTEST_OEM_OK)) {
88 return DEVICE_ATTEST_OEM_UNPRESET;
89 } else if ((retA == DEVICE_ATTEST_OEM_OK) && (retB != DEVICE_ATTEST_OEM_OK)) {
90 (void)memcpy_s(token, len, tokenWithFlagA, len);
91 return DEVICE_ATTEST_OEM_OK;
92 } else if ((retA != DEVICE_ATTEST_OEM_OK) && (retB == DEVICE_ATTEST_OEM_OK)) {
93 (void)memcpy_s(token, len, tokenWithFlagB, len);
94 return DEVICE_ATTEST_OEM_OK;
95 } else {
96 uint32_t flagA = GetTokenFlag(tokenWithFlagA);
97 uint32_t flagB = GetTokenFlag(tokenWithFlagB);
98 if (flagA > flagB) {
99 (void)memcpy_s(token, len, tokenWithFlagA, len);
100 return DEVICE_ATTEST_OEM_OK;
101 } else {
102 (void)memcpy_s(token, len, tokenWithFlagB, len);
103 return DEVICE_ATTEST_OEM_OK;
104 }
105 }
106 }
107
OEMWriteToken(const char * token,uint32_t len)108 int32_t OEMWriteToken(const char *token, uint32_t len)
109 {
110 if (token == NULL || len == 0) {
111 return DEVICE_ATTEST_OEM_ERR;
112 }
113 char tokenWithFlagA[TOKEN_WITH_FLAG_SIZE] = {0};
114 char tokenWithFlagB[TOKEN_WITH_FLAG_SIZE] = {0};
115 int32_t retA = ReadTokenWithFlag(TOKEN_ADDR, TOKEN_A_ADDR, tokenWithFlagA, TOKEN_WITH_FLAG_SIZE);
116 int32_t retB = ReadTokenWithFlag(TOKEN_ADDR, TOKEN_B_ADDR, tokenWithFlagB, TOKEN_WITH_FLAG_SIZE);
117 if ((retA != DEVICE_ATTEST_OEM_OK) && (retB != DEVICE_ATTEST_OEM_OK)) {
118 unsigned char flag[TOKEN_FLAG_SIZE] = {0};
119 if ((memcpy_s(tokenWithFlagA, TOKEN_WITH_FLAG_SIZE, token, len) != 0) ||
120 (memcpy_s(tokenWithFlagA + len, TOKEN_WITH_FLAG_SIZE - len, flag, TOKEN_FLAG_SIZE) != 0)) {
121 return DEVICE_ATTEST_OEM_ERR;
122 }
123 if (WriteTokenWithFlag(TOKEN_ADDR, TOKEN_A_ADDR, tokenWithFlagA, TOKEN_WITH_FLAG_SIZE) != 0) {
124 return DEVICE_ATTEST_OEM_ERR;
125 }
126 return DEVICE_ATTEST_OEM_OK;
127 } else if ((retA == DEVICE_ATTEST_OEM_OK) && (retB != DEVICE_ATTEST_OEM_OK)) {
128 (void)memset_s(tokenWithFlagB, TOKEN_WITH_FLAG_SIZE, 0, TOKEN_WITH_FLAG_SIZE);
129 uint32_t flagA = GetTokenFlag(tokenWithFlagA);
130 unsigned char flag[TOKEN_FLAG_SIZE] = {0};
131 SetTokenFlag(flag, (uint32_t)(flagA + 1));
132 if ((memcpy_s(tokenWithFlagB, TOKEN_WITH_FLAG_SIZE, token, len) != 0) ||
133 (memcpy_s(tokenWithFlagB + len, TOKEN_WITH_FLAG_SIZE - len, flag, TOKEN_FLAG_SIZE) != 0)) {
134 return DEVICE_ATTEST_OEM_ERR;
135 }
136 if (WriteTokenWithFlag(TOKEN_ADDR, TOKEN_B_ADDR, tokenWithFlagB, TOKEN_WITH_FLAG_SIZE) != 0) {
137 return DEVICE_ATTEST_OEM_ERR;
138 }
139 return DEVICE_ATTEST_OEM_OK;
140 } else if ((retA != DEVICE_ATTEST_OEM_OK) && (retB == DEVICE_ATTEST_OEM_OK)) {
141 (void)memset_s(tokenWithFlagA, TOKEN_WITH_FLAG_SIZE, 0, TOKEN_WITH_FLAG_SIZE);
142 uint32_t flagB = GetTokenFlag(tokenWithFlagB);
143 unsigned char flag[TOKEN_FLAG_SIZE] = {0};
144 SetTokenFlag(flag, (uint32_t)(flagB + 1));
145 if ((memcpy_s(tokenWithFlagA, TOKEN_WITH_FLAG_SIZE, token, len) != 0) ||
146 (memcpy_s(tokenWithFlagA + len, TOKEN_WITH_FLAG_SIZE - len, flag, TOKEN_FLAG_SIZE) != 0)) {
147 return DEVICE_ATTEST_OEM_ERR;
148 }
149 if (WriteTokenWithFlag(TOKEN_ADDR, TOKEN_A_ADDR, tokenWithFlagA, TOKEN_WITH_FLAG_SIZE) != 0) {
150 return DEVICE_ATTEST_OEM_ERR;
151 }
152 return DEVICE_ATTEST_OEM_OK;
153 } else {
154 uint32_t flagA = GetTokenFlag(tokenWithFlagA);
155 uint32_t flagB = GetTokenFlag(tokenWithFlagB);
156 if (flagA > flagB) {
157 (void)memset_s(tokenWithFlagB, TOKEN_WITH_FLAG_SIZE, 0, TOKEN_WITH_FLAG_SIZE);
158 unsigned char flag[TOKEN_FLAG_SIZE] = {0};
159 SetTokenFlag(flag, (uint32_t)(flagA + 1));
160 if ((memcpy_s(tokenWithFlagB, TOKEN_WITH_FLAG_SIZE, token, len) != 0) ||
161 (memcpy_s(tokenWithFlagB + len, TOKEN_WITH_FLAG_SIZE - len, flag, TOKEN_FLAG_SIZE) != 0)) {
162 return DEVICE_ATTEST_OEM_ERR;
163 }
164 if (WriteTokenWithFlag(TOKEN_ADDR, TOKEN_B_ADDR, tokenWithFlagB, TOKEN_WITH_FLAG_SIZE) != 0) {
165 return DEVICE_ATTEST_OEM_ERR;
166 }
167 return DEVICE_ATTEST_OEM_OK;
168 } else {
169 (void)memset_s(tokenWithFlagA, TOKEN_WITH_FLAG_SIZE, 0, TOKEN_WITH_FLAG_SIZE);
170 unsigned char flag[TOKEN_FLAG_SIZE] = {0};
171 SetTokenFlag(flag, (uint32_t)(flagB + 1));
172 if ((memcpy_s(tokenWithFlagA, TOKEN_WITH_FLAG_SIZE, token, len) != 0) ||
173 (memcpy_s(tokenWithFlagA + len, TOKEN_WITH_FLAG_SIZE - len, flag, TOKEN_FLAG_SIZE) != 0)) {
174 return DEVICE_ATTEST_OEM_ERR;
175 }
176 if (WriteTokenWithFlag(TOKEN_ADDR, TOKEN_A_ADDR, tokenWithFlagA, TOKEN_WITH_FLAG_SIZE) != 0) {
177 return DEVICE_ATTEST_OEM_ERR;
178 }
179 return DEVICE_ATTEST_OEM_OK;
180 }
181 }
182 }
183
OEMGetManufacturekey(char * manufacturekey,uint32_t len)184 int32_t OEMGetManufacturekey(char* manufacturekey, uint32_t len)
185 {
186 if ((manufacturekey == NULL) || (len == 0)) {
187 return DEVICE_ATTEST_OEM_ERR;
188 }
189 const char manufacturekeyBuf[] = {
190 0x13, 0x42, 0x3F, 0x3F, 0x53, 0x3F, 0x72, 0x30, 0x3F, 0x3F, 0x1C, 0x3F, 0x2F, 0x3F, 0x2E, 0x42,
191 0x3F, 0x08, 0x3F, 0x57, 0x3F, 0x10, 0x3F, 0x3F, 0x29, 0x17, 0x52, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F,
192 0x57, 0x16, 0x3F, 0x7D, 0x4A, 0x0F, 0x3F, 0x3F, 0x3F, 0x30, 0x0C, 0x3F, 0x3F, 0x4C, 0x3F, 0x47
193 };
194 uint32_t manufacturekeyBufLen = sizeof(manufacturekeyBuf);
195 if (len < manufacturekeyBufLen) {
196 return DEVICE_ATTEST_OEM_ERR;
197 }
198
199 int32_t ret = memcpy_s(manufacturekey, len, manufacturekeyBuf, manufacturekeyBufLen);
200 return ret;
201 }
202
OEMGetProductId(char * productId,uint32_t len)203 int32_t OEMGetProductId(char* productId, uint32_t len)
204 {
205 if ((productId == NULL) || (len == 0)) {
206 return DEVICE_ATTEST_OEM_ERR;
207 }
208 const char productIdBuf[] = "OH00000D";
209 uint32_t productIdLen = strlen(productIdBuf);
210 if (len < productIdLen) {
211 return DEVICE_ATTEST_OEM_ERR;
212 }
213
214 int32_t ret = memcpy_s(productId, len, productIdBuf, productIdLen);
215 return ret;
216 }
217
218 /* It is temporarily useless */
OEMGetProductKey(char * productKey,uint32_t len)219 int32_t OEMGetProductKey(char* productKey, uint32_t len)
220 {
221 if ((productKey == NULL) || (len == 0)) {
222 return DEVICE_ATTEST_OEM_ERR;
223 }
224 const char productKeyBuf[] = "test";
225 uint32_t productKeyLen = sizeof(productKeyBuf);
226 if (len < productKeyLen) {
227 return DEVICE_ATTEST_OEM_ERR;
228 }
229
230 int32_t ret = memcpy_s(productKey, len, productKeyBuf, productKeyLen);
231 return ret;
232 }
233