1/*
2  *Copyright (c) 2023 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 <securec.h>
17
18#include "v1_0/ihuks.h"
19#include "v1_0/ihuks_types.h"
20
21#include "huks_hdi_passthrough_adapter.h"
22#include "huks_hdi_template.h"
23#include "huks_sa_type.h"
24
25#define HDF_LOG_TAG    huks_hdi_service
26
27struct HuksService {
28    struct IHuks interface;
29};
30
31static int32_t HuksModuleInit(struct IHuks *self)
32{
33    (void)self;
34    return HuksHdiAdapterModuleInit();
35}
36
37static int32_t HuksModuleDestroy(struct IHuks *self)
38{
39    (void)self;
40    return HuksHdiAdapterModuleDestroy();
41}
42
43static int32_t HuksGenerateKey(struct IHuks *self, const struct HuksBlob *keyAlias, const struct HuksParamSet *paramSet,
44    const struct HuksBlob *keyIn, struct HuksBlob *encKeyOut)
45{
46    (void)self;
47    int32_t ret = HUKS_FAILURE;
48    HDI_CONVERTER_FUNC_GENERATEKEY(keyAlias, paramSet, keyIn, encKeyOut, ret, HuksHdiAdapterGenerateKey)
49    return ret;
50}
51
52static int32_t HuksImportKey(struct IHuks *self, const struct HuksBlob *keyAlias, const struct HuksBlob *key,
53    const struct HuksParamSet *paramSet, struct HuksBlob *encKeyOut)
54{
55    (void)self;
56    int32_t ret = HUKS_FAILURE;
57    HDI_CONVERTER_FUNC_IMPORTKEY(keyAlias, key, paramSet, encKeyOut, ret, HuksHdiAdapterImportKey)
58    return ret;
59}
60
61static int32_t HuksImportWrappedKey(struct IHuks *self, const struct HuksBlob *wrappingKeyAlias,
62    const struct HuksBlob *wrappingEncKey, const struct HuksBlob *wrappedKeyData, const struct HuksParamSet *paramSet,
63    struct HuksBlob *encKeyOut)
64{
65    (void)self;
66    int32_t ret = HUKS_FAILURE;
67    HDI_CONVERTER_FUNC_IMPORTWRAPPEDKEY(wrappingKeyAlias, wrappingEncKey, wrappedKeyData, paramSet, encKeyOut, ret,
68        HuksHdiAdapterImportWrappedKey)
69    return ret;
70}
71
72static int32_t HuksExportPublicKey(struct IHuks *self, const struct HuksBlob *encKey,
73    const struct HuksParamSet *paramSet, struct HuksBlob *keyOut)
74{
75    (void)self;
76    int32_t ret = HUKS_FAILURE;
77    HDI_CONVERTER_FUNC_EXPORTPUBLICKEY(encKey, paramSet, keyOut, ret, HuksHdiAdapterExportPublicKey)
78    return ret;
79}
80
81static int32_t HuksInit(struct IHuks *self, const struct HuksBlob *encKey, const struct HuksParamSet *paramSet,
82    struct HuksBlob *handle, struct HuksBlob *token)
83{
84    (void)self;
85    int32_t ret = HUKS_FAILURE;
86    HDI_CONVERTER_FUNC_INIT(encKey, paramSet, handle, token, ret, HuksHdiAdapterInit)
87    return ret;
88}
89
90static int32_t HuksUpdate(struct IHuks *self, const struct HuksBlob *handle, const struct HuksParamSet *paramSet,
91    const struct HuksBlob *inData, struct HuksBlob *outData)
92{
93    (void)self;
94    int32_t ret = HUKS_FAILURE;
95    HDI_CONVERTER_FUNC_UPDATE(handle, paramSet, inData, outData, ret, HuksHdiAdapterUpdate)
96    return ret;
97}
98
99static int32_t HuksFinish(struct IHuks *self, const struct HuksBlob *handle, const struct HuksParamSet *paramSet,
100    const struct HuksBlob *inData, struct HuksBlob *outData)
101{
102    (void)self;
103    int32_t ret = HUKS_FAILURE;
104    HDI_CONVERTER_FUNC_FINISH(handle, paramSet, inData, outData, ret, HuksHdiAdapterFinish)
105    return ret;
106}
107
108static int32_t HuksAbort(struct IHuks *self, const struct HuksBlob *handle, const struct HuksParamSet *paramSet)
109{
110    (void)self;
111    int32_t ret = HUKS_FAILURE;
112    HDI_CONVERTER_FUNC_ABORT(handle, paramSet, ret, HuksHdiAdapterAbort)
113    return ret;
114}
115
116static int32_t HuksCheckKeyValidity(struct IHuks *self, const struct HuksParamSet *paramSet,
117    const struct HuksBlob *encKey)
118{
119    (void)self;
120    int32_t ret = HUKS_FAILURE;
121    HDI_CONVERTER_FUNC_CHECKKEYVALIDITY(paramSet, encKey, ret, HuksHdiAdapterGetKeyProperties)
122    return ret;
123}
124
125static int32_t HuksAttestKey(struct IHuks *self, const struct HuksBlob *encKey, const struct HuksParamSet *paramSet,
126    struct HuksBlob *certChain)
127{
128    (void)self;
129    int32_t ret = HUKS_FAILURE;
130    HDI_CONVERTER_FUNC_ATTESTKEY(encKey, paramSet, certChain, ret, HuksHdiAdapterAttestKey)
131    return ret;
132}
133
134static int32_t HuksGenerateRandom(struct IHuks *self, const struct HuksParamSet *paramSet, struct HuksBlob *random)
135{
136    (void)self;
137    int32_t ret = HUKS_FAILURE;
138    HDI_CONVERTER_FUNC_GENERATERANDOM(paramSet, random, ret, HuksHdiAdapterGenerateRandom)
139    return ret;
140}
141
142static int32_t HuksSign(struct IHuks *self, const struct HuksBlob *encKey, const struct HuksParamSet *paramSet,
143    const struct HuksBlob *srcData, struct HuksBlob *signature)
144{
145    (void)self;
146    int32_t ret = HUKS_FAILURE;
147    HDI_CONVERTER_FUNC_SIGN(encKey, paramSet, srcData, signature, ret, HuksHdiAdapterSign)
148    return ret;
149}
150
151static int32_t HuksVerify(struct IHuks *self, const struct HuksBlob *encKey, const struct HuksParamSet *paramSet,
152    const struct HuksBlob *srcData, const struct HuksBlob *signature)
153{
154    (void)self;
155    int32_t ret = HUKS_FAILURE;
156    HDI_CONVERTER_FUNC_VERIFY(encKey, paramSet, srcData, signature, ret, HuksHdiAdapterVerify)
157    return ret;
158}
159
160static int32_t HuksEncrypt(struct IHuks *self, const struct HuksBlob *encKey, const struct HuksParamSet *paramSet,
161    const struct HuksBlob *plainText, struct HuksBlob *cipherText)
162{
163    (void)self;
164    int32_t ret = HUKS_FAILURE;
165    HDI_CONVERTER_FUNC_ENCRYPT(encKey, paramSet, plainText, cipherText, ret, HuksHdiAdapterEncrypt)
166    return ret;
167}
168
169static int32_t HuksDecrypt(struct IHuks *self, const struct HuksBlob *encKey, const struct HuksParamSet *paramSet,
170    const struct HuksBlob *cipherText, struct HuksBlob *plainText)
171{
172    (void)self;
173    int32_t ret = HUKS_FAILURE;
174    HDI_CONVERTER_FUNC_DECRYPT(encKey, paramSet, cipherText, plainText, ret, HuksHdiAdapterDecrypt)
175    return ret;
176}
177
178static int32_t HuksAgreeKey(struct IHuks *self, const struct HuksParamSet *paramSet,
179    const struct HuksBlob *encPrivateKey, const struct HuksBlob *peerPublicKey, struct HuksBlob *agreedKey)
180{
181    (void)self;
182    int32_t ret = HUKS_FAILURE;
183    HDI_CONVERTER_FUNC_AGREEKEY(paramSet, encPrivateKey, peerPublicKey, agreedKey, ret, HuksHdiAdapterAgreeKey)
184    return ret;
185}
186
187static int32_t HuksDeriveKey(struct IHuks *self, const struct HuksParamSet *paramSet, const struct HuksBlob *encKdfKey,
188    struct HuksBlob *derivedKey)
189{
190    (void)self;
191    int32_t ret = HUKS_FAILURE;
192    HDI_CONVERTER_FUNC_DERIVEKEY(paramSet, encKdfKey, derivedKey, ret, HuksHdiAdapterDeriveKey)
193    return ret;
194}
195
196static int32_t HuksMac(struct IHuks *self, const struct HuksBlob *encKey, const struct HuksParamSet *paramSet,
197    const struct HuksBlob *srcData, struct HuksBlob *mac)
198{
199    (void)self;
200    int32_t ret = HUKS_FAILURE;
201    HDI_CONVERTER_FUNC_MAC(encKey, paramSet, srcData, mac, ret, HuksHdiAdapterMac)
202    return ret;
203}
204
205static int32_t HuksUpgradeKey(struct IHuks *self, const struct HuksBlob *encOldKey, const struct HuksParamSet *paramSet,
206    struct HuksBlob *encNewKey)
207{
208    (void)self;
209    int32_t ret = HUKS_FAILURE;
210    HDI_CONVERTER_FUNC_UPGRADEKEY(encOldKey, paramSet, encNewKey, ret, HuksHdiAdapterUpgradeKey)
211    return ret;
212}
213
214static int32_t HuksExportChipsetPlatformPublicKey(struct IHuks *self, const struct HuksBlob *salt,
215    enum HuksChipsetPlatformDecryptScene scene, struct HuksBlob *publicKey)
216{
217    (void)self;
218    (void)salt;
219    (void)scene;
220    (void)publicKey;
221    return HUKS_ERROR_API_NOT_SUPPORTED;
222}
223
224static int32_t HuksGetVersion(struct IHuks *self, uint32_t *majorVer, uint32_t *minorVer)
225{
226    *majorVer = IHUKS_MAJOR_VERSION;
227    *minorVer = IHUKS_MINOR_VERSION;
228    return HUKS_SUCCESS;
229}
230
231struct IHuks *HuksImplGetInstance(void)
232{
233    struct HuksService *service = (struct HuksService *)malloc(sizeof(struct HuksService));
234    if (service == NULL) {
235        return NULL;
236    }
237
238    service->interface.ModuleInit = HuksModuleInit;
239    service->interface.ModuleDestroy = HuksModuleDestroy;
240    service->interface.GenerateKey = HuksGenerateKey;
241    service->interface.ImportKey = HuksImportKey;
242    service->interface.ImportWrappedKey = HuksImportWrappedKey;
243    service->interface.ExportPublicKey = HuksExportPublicKey;
244    service->interface.Init = HuksInit;
245    service->interface.Update = HuksUpdate;
246    service->interface.Finish = HuksFinish;
247    service->interface.Abort = HuksAbort;
248    service->interface.CheckKeyValidity = HuksCheckKeyValidity;
249    service->interface.AttestKey = HuksAttestKey;
250    service->interface.GenerateRandom = HuksGenerateRandom;
251    service->interface.Sign = HuksSign;
252    service->interface.Verify = HuksVerify;
253    service->interface.Encrypt = HuksEncrypt;
254    service->interface.Decrypt = HuksDecrypt;
255    service->interface.AgreeKey = HuksAgreeKey;
256    service->interface.DeriveKey = HuksDeriveKey;
257    service->interface.Mac = HuksMac;
258    service->interface.ExportChipsetPlatformPublicKey = HuksExportChipsetPlatformPublicKey;
259    service->interface.UpgradeKey = HuksUpgradeKey;
260    service->interface.GetVersion = HuksGetVersion;
261    return &service->interface;
262}
263
264void HuksImplRelease(struct IHuks *instance)
265{
266    if (instance == NULL) {
267        return;
268    }
269    (void)HuksReleaseCoreEngine();
270    free(instance);
271}
272