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