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_auth_common.h" 14e656c62eSopenharmony_ci#include <securec.h> 15e656c62eSopenharmony_ci#include <stdbool.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 23e656c62eSopenharmony_cistatic int ReadCmdLine(const char *path, char *buffer, size_t bufferLen, char *caName, size_t nameLen) 24e656c62eSopenharmony_ci{ 25e656c62eSopenharmony_ci FILE *fd = fopen(path, "rb"); 26e656c62eSopenharmony_ci if (fd == NULL) { 27e656c62eSopenharmony_ci tloge("fopen is error: %d\n", errno); 28e656c62eSopenharmony_ci return -1; 29e656c62eSopenharmony_ci } 30e656c62eSopenharmony_ci int bytesRead = (int)fread(buffer, sizeof(char), bufferLen - 1, fd); 31e656c62eSopenharmony_ci bool readError = (bytesRead <= 0 || (ferror(fd) != 0)); 32e656c62eSopenharmony_ci if (readError) { 33e656c62eSopenharmony_ci tloge("cannot read from cmdline\n"); 34e656c62eSopenharmony_ci fclose(fd); 35e656c62eSopenharmony_ci return -1; 36e656c62eSopenharmony_ci } 37e656c62eSopenharmony_ci (void)fclose(fd); 38e656c62eSopenharmony_ci 39e656c62eSopenharmony_ci size_t firstStringLen = strnlen(buffer, bufferLen - 1); 40e656c62eSopenharmony_ci errno_t res = strncpy_s(caName, nameLen - 1, buffer, firstStringLen); 41e656c62eSopenharmony_ci if (res != EOK) { 42e656c62eSopenharmony_ci tloge("copy caName failed\n"); 43e656c62eSopenharmony_ci return -1; 44e656c62eSopenharmony_ci } 45e656c62eSopenharmony_ci 46e656c62eSopenharmony_ci return bytesRead; 47e656c62eSopenharmony_ci} 48e656c62eSopenharmony_ci 49e656c62eSopenharmony_ci/* 50e656c62eSopenharmony_ci * this file "/proc/pid/cmdline" can be modified by any user, 51e656c62eSopenharmony_ci * so the package name we get from it is not to be trusted, 52e656c62eSopenharmony_ci * the CA authentication strategy does not rely much on the pkgname, 53e656c62eSopenharmony_ci * this is mainly to make it compatible with POHNE_PLATFORM 54e656c62eSopenharmony_ci */ 55e656c62eSopenharmony_cistatic int TeeGetCaName(int caPid, char *caName, size_t nameLen) 56e656c62eSopenharmony_ci{ 57e656c62eSopenharmony_ci char path[MAX_PATH_LENGTH] = { 0 }; 58e656c62eSopenharmony_ci char temp[CMD_MAX_SIZE] = { 0 }; 59e656c62eSopenharmony_ci 60e656c62eSopenharmony_ci if (caName == NULL || nameLen == 0) { 61e656c62eSopenharmony_ci tloge("input :caName invalid\n"); 62e656c62eSopenharmony_ci return -1; 63e656c62eSopenharmony_ci } 64e656c62eSopenharmony_ci 65e656c62eSopenharmony_ci int ret = snprintf_s(path, sizeof(path), sizeof(path) - 1, "/proc/%d/cmdline", caPid); 66e656c62eSopenharmony_ci if (ret == -1) { 67e656c62eSopenharmony_ci tloge("tee get ca name snprintf_s err\n"); 68e656c62eSopenharmony_ci return ret; 69e656c62eSopenharmony_ci } 70e656c62eSopenharmony_ci 71e656c62eSopenharmony_ci int bytesRead = ReadCmdLine(path, temp, CMD_MAX_SIZE, caName, nameLen); 72e656c62eSopenharmony_ci 73e656c62eSopenharmony_ci return bytesRead; 74e656c62eSopenharmony_ci} 75e656c62eSopenharmony_ci 76e656c62eSopenharmony_ciint TeeGetPkgName(int caPid, char *path, size_t pathLen) 77e656c62eSopenharmony_ci{ 78e656c62eSopenharmony_ci if (path == NULL || pathLen > MAX_PATH_LENGTH) { 79e656c62eSopenharmony_ci tloge("path is null or path len overflow\n"); 80e656c62eSopenharmony_ci return -1; 81e656c62eSopenharmony_ci } 82e656c62eSopenharmony_ci 83e656c62eSopenharmony_ci if (TeeGetCaName(caPid, path, pathLen) < 0) { 84e656c62eSopenharmony_ci tloge("get ca name failed\n"); 85e656c62eSopenharmony_ci return -1; 86e656c62eSopenharmony_ci } 87e656c62eSopenharmony_ci 88e656c62eSopenharmony_ci return 0; 89e656c62eSopenharmony_ci} 90