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