1 /*
2 * Copyright (C) 2022 Huawei Technologies Co., Ltd.
3 * Licensed under the Mulan PSL v2.
4 * You can use this software according to the terms and conditions of the Mulan PSL v2.
5 * You may obtain a copy of Mulan PSL v2 at:
6 * http://license.coscl.org.cn/MulanPSL2
7 * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR
8 * IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR
9 * PURPOSE.
10 * See the Mulan PSL v2 for more details.
11 */
12
13 #include "tee_get_native_cert.h"
14 #include "securec.h"
15 #include "tee_client_type.h"
16 #include "tee_log.h"
17
18 #ifdef LOG_TAG
19 #undef LOG_TAG
20 #endif
21 #define LOG_TAG "teecd_auth"
22 #define INVLIAD_PARAM (-1)
23
SetPathToBuf(uint8_t * buffer,uint32_t * len,uint32_t * inputLen,const char * path)24 static int SetPathToBuf(uint8_t *buffer, uint32_t *len, uint32_t *inputLen, const char *path)
25 {
26 int ret = -1;
27 uint32_t num;
28 uint32_t pathLen;
29
30 num = (uint32_t)strlen(path);
31 pathLen = num;
32
33 if (*inputLen < sizeof(pathLen)) {
34 tloge("buffer overflow for pathLen\n");
35 return ret;
36 }
37
38 ret = memcpy_s(buffer, *inputLen, &pathLen, sizeof(pathLen));
39 if (ret != EOK) {
40 tloge("copy pkgname length failed\n");
41 return ret;
42 }
43
44 buffer += sizeof(pathLen);
45 *len += (uint32_t)sizeof(pathLen);
46 *inputLen -= (uint32_t)sizeof(pathLen);
47 ret = -1;
48
49 if (num > *inputLen) {
50 tloge("buffer overflow for path\n");
51 return ret;
52 }
53
54 ret = memcpy_s(buffer, *inputLen, path, num);
55 if (ret != EOK) {
56 tloge("copy pkgname failed\n");
57 return ret;
58 }
59
60 *len += num;
61 *inputLen -= num;
62
63 return ret;
64 }
65
SetUidToBuf(uint8_t * buffer,uint32_t * len,uint32_t * inputLen,unsigned int caUid)66 static int SetUidToBuf(uint8_t *buffer, uint32_t *len, uint32_t *inputLen, unsigned int caUid)
67 {
68 int ret = -1;
69 uint32_t pubkeyLen;
70
71 pubkeyLen = sizeof(caUid);
72
73 if (*inputLen < sizeof(pubkeyLen)) {
74 tloge("buffer overflow for pubkeyLen\n");
75 return ret;
76 }
77
78 ret = memcpy_s(buffer, *inputLen, &pubkeyLen, sizeof(pubkeyLen));
79 if (ret != EOK) {
80 tloge("copy uid length failed\n");
81 return ret;
82 }
83
84 buffer += sizeof(pubkeyLen);
85 *len += (uint32_t)sizeof(pubkeyLen);
86 *inputLen -= (uint32_t)sizeof(pubkeyLen);
87 ret = -1;
88
89 if (pubkeyLen > *inputLen) {
90 tloge("buffer overflow for pubkey\n");
91 return ret;
92 }
93
94 ret = memcpy_s(buffer, *inputLen, &caUid, pubkeyLen);
95 if (ret != EOK) {
96 tloge("copy uid failed\n");
97 return ret;
98 }
99
100 *len += pubkeyLen;
101
102 return ret;
103 }
104
SetUserInfoToBuf(uint8_t * buffer,uint32_t * len,uint32_t * inputLen,unsigned int caUid)105 static int SetUserInfoToBuf(uint8_t *buffer, uint32_t *len, uint32_t *inputLen, unsigned int caUid)
106 {
107 int ret;
108
109 ret = SetUidToBuf(buffer, len, inputLen, caUid);
110 if (ret != 0) {
111 tloge("set uid failed\n");
112 }
113
114 return ret;
115 }
116
TeeGetNativeCert(int caPid,unsigned int caUid,uint32_t * len,uint8_t * buffer)117 int TeeGetNativeCert(int caPid, unsigned int caUid, uint32_t *len, uint8_t *buffer)
118 {
119 int ret;
120 char path[MAX_PATH_LENGTH] = { 0 };
121 uint32_t inputLen;
122 bool invalid = (len == NULL) || (buffer == NULL);
123 if (invalid) {
124 tloge("Param error!\n");
125 return INVLIAD_PARAM;
126 }
127 inputLen = *len;
128
129 ret = TeeGetPkgName(caPid, path, sizeof(path));
130 if (ret != 0) {
131 tloge("get ca path failed\n");
132 return ret;
133 }
134
135 *len = 0;
136
137 ret = SetPathToBuf(buffer, len, &inputLen, path);
138 if (ret != 0) {
139 tloge("set path failed\n");
140 return ret;
141 }
142 buffer += (sizeof(uint32_t) + strlen(path));
143
144 return SetUserInfoToBuf(buffer, len, &inputLen, caUid);
145 }
146