1/*
2 * Copyright (c) 2024 Huawei Device Co., Ltd.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 *    http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15
16#include <string.h>
17
18#include "hks_api.h"
19#include "hks_errcode_adapter.h"
20
21#include "cj_huks_ffi.h"
22
23int32_t FfiOHOSGetSdkVersion(struct HksBlob *sdkVersion)
24{
25    return HksGetSdkVersion(sdkVersion);
26}
27
28int32_t FfiOHOSInitSession(const char *keyAlias, const struct HksParamSet *paramSet,
29                           struct HksBlob *handle, struct HksBlob *token)
30{
31    struct HksBlob keyAliasBlob = {strlen(keyAlias), (uint8_t *)keyAlias};
32    return HksInit(&keyAliasBlob, paramSet, handle, token);
33}
34
35int32_t FfiOHOSUpdateSession(const struct HksBlob *handle, const struct HksParamSet *paramSet,
36                             const struct HksBlob *inData, struct HksBlob *outData)
37{
38    return HksUpdate(handle, paramSet, inData, outData);
39}
40
41int32_t FfiOHOSFinishSession(const struct HksBlob *handle, const struct HksParamSet *paramSet,
42                             const struct HksBlob *inData, struct HksBlob *outData)
43{
44    return HksFinish(handle, paramSet, inData, outData);
45}
46
47int32_t FfiOHOSAbortSession(const struct HksBlob *handle, const struct HksParamSet *paramSet)
48{
49    return HksAbort(handle, paramSet);
50}
51
52int32_t FfiOHOSIsKeyExist(const char *keyAlias, const struct HksParamSet *paramSet)
53{
54    struct HksBlob keyAliasBlob = {strlen(keyAlias), (uint8_t *)keyAlias};
55    return HksKeyExist(&keyAliasBlob, paramSet);
56}
57
58int32_t FfiOHOSGetKeyItemProperties(const char *keyAlias,
59                                    const struct HksParamSet *paramSetIn, struct HksParamSet *paramSetOut)
60{
61    struct HksBlob keyAliasBlob = {strlen(keyAlias), (uint8_t *)keyAlias};
62    return HksGetKeyParamSet(&keyAliasBlob, paramSetIn, paramSetOut);
63}
64
65int32_t FfiOHOSHAttestKey(const char *keyAlias, const struct HksParamSet *paramSet,
66                          struct HksCertChain *certChain)
67{
68    struct HksBlob keyAliasBlob = {strlen(keyAlias), (uint8_t *)keyAlias};
69    return HksAttestKey(&keyAliasBlob, paramSet, certChain);
70}
71
72int32_t FfiOHOSHAnonAttestKey(const char *keyAlias, const struct HksParamSet *paramSet,
73                              struct HksCertChain *certChain)
74{
75    struct HksBlob keyAliasBlob = {strlen(keyAlias), (uint8_t *)keyAlias};
76    return HksAnonAttestKey(&keyAliasBlob, paramSet, certChain);
77}
78
79int32_t FfiOHOSExportKey(const char *keyAlias, const struct HksParamSet *paramSet,
80                         struct HksBlob *key)
81{
82    struct HksBlob keyAliasBlob = {strlen(keyAlias), (uint8_t *)keyAlias};
83    return HksExportPublicKey(&keyAliasBlob, paramSet, key);
84}
85
86int32_t FfiOHOSImportWrappedKey(const char *keyAlias, const char *wrappingKeyAlias,
87                                const struct HksParamSet *paramSet, const struct HksBlob *wrappedKeyData)
88{
89    struct HksBlob keyAliasBlob = {strlen(keyAlias), (uint8_t *)keyAlias};
90    struct HksBlob wrappingKeyAliasBlob = {strlen(wrappingKeyAlias), (uint8_t *)wrappingKeyAlias};
91    return HksImportWrappedKey(&keyAliasBlob, &wrappingKeyAliasBlob, paramSet, wrappedKeyData);
92}
93
94int32_t FfiOHOSGenerateKey(const char *keyAlias, const struct HksParamSet *paramSetIn,
95                           struct HksParamSet *paramSetOut)
96{
97    struct HksBlob keyAliasBlob = {strlen(keyAlias), (uint8_t *)keyAlias};
98    return HksGenerateKey(&keyAliasBlob, paramSetIn, paramSetOut);
99}
100
101int32_t FfiOHOSDeleteKey(const char *keyAlias, const struct HksParamSet *paramSet)
102{
103    struct HksBlob keyAliasBlob = {strlen(keyAlias), (uint8_t *)keyAlias};
104    return HksDeleteKey(&keyAliasBlob, paramSet);
105}
106
107int32_t FfiOHOSImportKey(const char *keyAlias, const struct HksParamSet *paramSet, struct HksBlob *key)
108{
109    struct HksBlob keyAliasBlob = {strlen(keyAlias), (uint8_t *)keyAlias};
110    return HksImportKey(&keyAliasBlob, paramSet, key);
111}
112
113void FfiOHOSConvertErrCode(int32_t hksCode, struct HksResult *ret)
114{
115    *ret = HksConvertErrCode(hksCode);
116}
117
118int32_t FfiOHOSListAliases(const struct HksParamSet *paramSet, uint32_t *retAliasesCnt, struct HksBlob **retAliases)
119{
120    struct HksKeyAliasSet *outSet = NULL;
121    int32_t result = HksListAliases(paramSet, &outSet);
122    if (result == HKS_SUCCESS) {
123        // Though HKS_SUCCESS, when query result is empty, `outSet` is still NULL.
124        if (outSet == NULL) {
125            return HKS_SUCCESS;
126        }
127        *retAliasesCnt = outSet->aliasesCnt;
128        // ATTENTION: aliases will be released by caller
129        *retAliases = outSet->aliases;
130        free(outSet);
131    }
132    return result;
133}
134