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
27 struct HuksService {
28 struct IHuks interface;
29 };
30
HuksModuleInit(struct IHuks * self)31 static int32_t HuksModuleInit(struct IHuks *self)
32 {
33 (void)self;
34 return HuksHdiAdapterModuleInit();
35 }
36
HuksModuleDestroy(struct IHuks * self)37 static int32_t HuksModuleDestroy(struct IHuks *self)
38 {
39 (void)self;
40 return HuksHdiAdapterModuleDestroy();
41 }
42
HuksGenerateKey(struct IHuks * self,const struct HuksBlob * keyAlias,const struct HuksParamSet * paramSet,const struct HuksBlob * keyIn,struct HuksBlob * encKeyOut)43 static 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
HuksImportKey(struct IHuks * self,const struct HuksBlob * keyAlias,const struct HuksBlob * key,const struct HuksParamSet * paramSet,struct HuksBlob * encKeyOut)52 static 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
HuksImportWrappedKey(struct IHuks * self,const struct HuksBlob * wrappingKeyAlias,const struct HuksBlob * wrappingEncKey,const struct HuksBlob * wrappedKeyData,const struct HuksParamSet * paramSet,struct HuksBlob * encKeyOut)61 static 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
HuksExportPublicKey(struct IHuks * self,const struct HuksBlob * encKey,const struct HuksParamSet * paramSet,struct HuksBlob * keyOut)72 static 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
HuksInit(struct IHuks * self,const struct HuksBlob * encKey,const struct HuksParamSet * paramSet,struct HuksBlob * handle,struct HuksBlob * token)81 static 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
HuksUpdate(struct IHuks * self,const struct HuksBlob * handle,const struct HuksParamSet * paramSet,const struct HuksBlob * inData,struct HuksBlob * outData)90 static 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
HuksFinish(struct IHuks * self,const struct HuksBlob * handle,const struct HuksParamSet * paramSet,const struct HuksBlob * inData,struct HuksBlob * outData)99 static 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
HuksAbort(struct IHuks * self,const struct HuksBlob * handle,const struct HuksParamSet * paramSet)108 static 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
HuksCheckKeyValidity(struct IHuks * self,const struct HuksParamSet * paramSet,const struct HuksBlob * encKey)116 static 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
HuksAttestKey(struct IHuks * self,const struct HuksBlob * encKey,const struct HuksParamSet * paramSet,struct HuksBlob * certChain)125 static 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
HuksGenerateRandom(struct IHuks * self,const struct HuksParamSet * paramSet,struct HuksBlob * random)134 static 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
HuksSign(struct IHuks * self,const struct HuksBlob * encKey,const struct HuksParamSet * paramSet,const struct HuksBlob * srcData,struct HuksBlob * signature)142 static 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
HuksVerify(struct IHuks * self,const struct HuksBlob * encKey,const struct HuksParamSet * paramSet,const struct HuksBlob * srcData,const struct HuksBlob * signature)151 static 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
HuksEncrypt(struct IHuks * self,const struct HuksBlob * encKey,const struct HuksParamSet * paramSet,const struct HuksBlob * plainText,struct HuksBlob * cipherText)160 static 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
HuksDecrypt(struct IHuks * self,const struct HuksBlob * encKey,const struct HuksParamSet * paramSet,const struct HuksBlob * cipherText,struct HuksBlob * plainText)169 static 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
HuksAgreeKey(struct IHuks * self,const struct HuksParamSet * paramSet,const struct HuksBlob * encPrivateKey,const struct HuksBlob * peerPublicKey,struct HuksBlob * agreedKey)178 static 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
HuksDeriveKey(struct IHuks * self,const struct HuksParamSet * paramSet,const struct HuksBlob * encKdfKey,struct HuksBlob * derivedKey)187 static 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
HuksMac(struct IHuks * self,const struct HuksBlob * encKey,const struct HuksParamSet * paramSet,const struct HuksBlob * srcData,struct HuksBlob * mac)196 static 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
HuksUpgradeKey(struct IHuks * self,const struct HuksBlob * encOldKey,const struct HuksParamSet * paramSet,struct HuksBlob * encNewKey)205 static 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
HuksExportChipsetPlatformPublicKey(struct IHuks * self,const struct HuksBlob * salt,enum HuksChipsetPlatformDecryptScene scene,struct HuksBlob * publicKey)214 static int32_t HuksExportChipsetPlatformPublicKey(struct IHuks *self, const struct HuksBlob *salt,
215 enum HuksChipsetPlatformDecryptScene scene, struct HuksBlob *publicKey)
216 {
217 (void)self;
218 int32_t ret = HUKS_FAILURE;
219 HDI_CONVERTER_FUNC_EXPORTCHIPSETPLATFORMPUBLICKEY(salt, scene, publicKey, ret,
220 HuksHdiAdapterExportChipsetPlatformPublicKey)
221 return ret;
222 }
223
HuksGetVersion(struct IHuks * self,uint32_t * majorVer,uint32_t * minorVer)224 static 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
HuksImplGetInstance(void)231 struct 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.UpgradeKey = HuksUpgradeKey;
259 service->interface.ExportChipsetPlatformPublicKey = HuksExportChipsetPlatformPublicKey;
260 service->interface.GetVersion = HuksGetVersion;
261 return &service->interface;
262 }
263
HuksImplRelease(struct IHuks * instance)264 void HuksImplRelease(struct IHuks *instance)
265 {
266 if (instance == NULL) {
267 return;
268 }
269 (void)HuksReleaseCoreEngine();
270 free(instance);
271 }
272