• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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