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