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