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 "cf_param.h"
17
18 #include "cj_x509_certificate.h"
19
FfiCertCjX509CertificateNewInstance(const CfEncodingBlob * blob,CjX509Certificate * returnObj)20 int32_t FfiCertCjX509CertificateNewInstance(const CfEncodingBlob *blob, CjX509Certificate *returnObj)
21 {
22 auto cert = static_cast<HcfX509Certificate *>(malloc(sizeof(HcfX509Certificate)));
23 if (cert == nullptr) {
24 return CF_ERR_MALLOC;
25 }
26 CfResult errCode = HcfX509CertificateCreate(blob, &cert);
27 if (errCode != CF_SUCCESS) {
28 free(cert);
29 return errCode;
30 }
31 auto cfObj = static_cast<CfObject *>(malloc(sizeof(CfObject)));
32 if (cfObj == nullptr) {
33 free(cert);
34 return CF_ERR_MALLOC;
35 }
36 errCode = CfResult(CfCreate(CF_OBJ_TYPE_CERT, blob, &cfObj));
37 if (errCode != CF_SUCCESS) {
38 CfObjDestroy(cert);
39 free(cfObj);
40 return errCode;
41 }
42 returnObj->cert = cert;
43 returnObj->cfObj = cfObj;
44 return CF_SUCCESS;
45 }
46
FfiCertCjX509CertificateDeleteInstance(CjX509Certificate self)47 void FfiCertCjX509CertificateDeleteInstance(CjX509Certificate self)
48 {
49 CfObjDestroy(self.cert);
50 self.cfObj->destroy(&self.cfObj);
51 }
52
FfiCertCjX509CertificateFromHcfCert(HcfX509Certificate * hcfCert,CjX509Certificate * returnObj)53 CfResult FfiCertCjX509CertificateFromHcfCert(HcfX509Certificate *hcfCert, CjX509Certificate *returnObj)
54 {
55 CfEncodingBlob blob = {};
56 CfResult errCode = hcfCert->base.getEncoded(&hcfCert->base, &blob);
57 if (errCode != CF_SUCCESS) {
58 return errCode;
59 }
60 auto cert = static_cast<HcfX509Certificate *>(malloc(sizeof(HcfX509Certificate)));
61 if (cert == nullptr) {
62 free(blob.data);
63 return CF_ERR_MALLOC;
64 }
65 errCode = HcfX509CertificateCreate(&blob, &cert);
66 if (errCode != CF_SUCCESS) {
67 free(blob.data);
68 free(cert);
69 return errCode;
70 }
71 auto cfObj = static_cast<CfObject *>(malloc(sizeof(CfObject)));
72 if (cfObj == nullptr) {
73 free(blob.data);
74 free(cert);
75 return CF_ERR_MALLOC;
76 }
77
78 errCode = CfResult(CfCreate(CF_OBJ_TYPE_CERT, &blob, &cfObj));
79 if (errCode != CF_SUCCESS) {
80 free(blob.data);
81 CfObjDestroy(cert);
82 free(cfObj);
83 return errCode;
84 }
85 returnObj->cert = cert;
86 returnObj->cfObj = cfObj;
87 free(blob.data);
88 return errCode;
89 }
90
FfiCertCjX509CertificateVerify(const CjX509Certificate self,HcfPubKey * pubKey)91 CfResult FfiCertCjX509CertificateVerify(const CjX509Certificate self, HcfPubKey *pubKey)
92 {
93 return self.cert->base.verify(&self.cert->base, pubKey);
94 }
95
FfiCertCjX509CertificateGetEncoded(const CjX509Certificate self,CfEncodingBlob * encodedByte)96 CfResult FfiCertCjX509CertificateGetEncoded(const CjX509Certificate self, CfEncodingBlob *encodedByte)
97 {
98 return self.cert->base.getEncoded(&self.cert->base, encodedByte);
99 }
100
FfiCertCjX509CertificateGetPublicKey(const CjX509Certificate self,HcfPubKey ** retPubKey)101 CfResult FfiCertCjX509CertificateGetPublicKey(const CjX509Certificate self, HcfPubKey **retPubKey)
102 {
103 HcfPubKey *pubKey = nullptr;
104 const CfResult errCode = self.cert->base.getPublicKey(&self.cert->base, (void **) &pubKey);
105 if (errCode == CF_SUCCESS) {
106 *retPubKey = pubKey;
107 }
108 return errCode;
109 }
110
FfiCertCjX509CertificateCheckValidityWithDate(const CjX509Certificate self,const char * date)111 CfResult FfiCertCjX509CertificateCheckValidityWithDate(const CjX509Certificate self, const char *date)
112 {
113 return self.cert->checkValidityWithDate(self.cert, date);
114 }
115
FfiCertCjX509CertificateGetVersion(const CjX509Certificate self)116 long FfiCertCjX509CertificateGetVersion(const CjX509Certificate self)
117 {
118 return self.cert->getVersion(self.cert);
119 }
120
FfiCertCjX509CertificateGetSerialNumber(const CjX509Certificate self,CfBlob * out)121 CfResult FfiCertCjX509CertificateGetSerialNumber(const CjX509Certificate self, CfBlob *out)
122 {
123 return self.cert->getSerialNumber(self.cert, out);
124 }
125
FfiCertCjX509CertificateGetIssuerName(const CjX509Certificate self,CfBlob * out)126 CfResult FfiCertCjX509CertificateGetIssuerName(const CjX509Certificate self, CfBlob *out)
127 {
128 return self.cert->getIssuerName(self.cert, out);
129 }
130
FfiCertCjX509CertificateGetSubjectName(const CjX509Certificate self,CfBlob * out)131 CfResult FfiCertCjX509CertificateGetSubjectName(const CjX509Certificate self, CfBlob *out)
132 {
133 return self.cert->getSubjectName(self.cert, out);
134 }
135
FfiCertCjX509CertificateGetNotBeforeTime(const CjX509Certificate self,CfBlob * outDate)136 CfResult FfiCertCjX509CertificateGetNotBeforeTime(const CjX509Certificate self, CfBlob *outDate)
137 {
138 return self.cert->getNotBeforeTime(self.cert, outDate);
139 }
140
FfiCertCjX509CertificateGetNotAfterTime(const CjX509Certificate self,CfBlob * outDate)141 CfResult FfiCertCjX509CertificateGetNotAfterTime(const CjX509Certificate self, CfBlob *outDate)
142 {
143 return self.cert->getNotAfterTime(self.cert, outDate);
144 }
145
FfiCertCjX509CertificateGetSignature(const CjX509Certificate self,CfBlob * sigOut)146 CfResult FfiCertCjX509CertificateGetSignature(const CjX509Certificate self, CfBlob *sigOut)
147 {
148 return self.cert->getSignature(self.cert, sigOut);
149 }
150
FfiCertCjX509CertificateGetSignatureAlgName(const CjX509Certificate self,CfBlob * outName)151 CfResult FfiCertCjX509CertificateGetSignatureAlgName(const CjX509Certificate self, CfBlob *outName)
152 {
153 return self.cert->getSignatureAlgName(self.cert, outName);
154 }
155
FfiCertCjX509CertificateGetSignatureAlgOid(const CjX509Certificate self,CfBlob * out)156 CfResult FfiCertCjX509CertificateGetSignatureAlgOid(const CjX509Certificate self, CfBlob *out)
157 {
158 return self.cert->getSignatureAlgOid(self.cert, out);
159 }
160
FfiCertCjX509CertificateGetSignatureAlgParams(const CjX509Certificate self,CfBlob * sigAlgParamsOut)161 CfResult FfiCertCjX509CertificateGetSignatureAlgParams(const CjX509Certificate self, CfBlob *sigAlgParamsOut)
162 {
163 return self.cert->getSignatureAlgParams(self.cert, sigAlgParamsOut);
164 }
165
FfiCertCjX509CertificateGetKeyUsage(const CjX509Certificate self,CfBlob * boolArr)166 CfResult FfiCertCjX509CertificateGetKeyUsage(const CjX509Certificate self, CfBlob *boolArr)
167 {
168 return self.cert->getKeyUsage(self.cert, boolArr);
169 }
170
FfiCertCjX509CertificateGetExtKeyUsage(const CjX509Certificate self,CfArray * keyUsageOut)171 CfResult FfiCertCjX509CertificateGetExtKeyUsage(const CjX509Certificate self, CfArray *keyUsageOut)
172 {
173 return self.cert->getExtKeyUsage(self.cert, keyUsageOut);
174 }
175
FfiCertCjX509CertificateGetBasicConstraints(const CjX509Certificate self)176 int32_t FfiCertCjX509CertificateGetBasicConstraints(const CjX509Certificate self)
177 {
178 return self.cert->getBasicConstraints(self.cert);
179 }
180
FfiCertCjX509CertificateGetSubjectAltNames(const CjX509Certificate self,CfArray * outName)181 CfResult FfiCertCjX509CertificateGetSubjectAltNames(const CjX509Certificate self, CfArray *outName)
182 {
183 return self.cert->getSubjectAltNames(self.cert, outName);
184 }
185
FfiCertCjX509CertificateGetIssuerAltNames(const CjX509Certificate self,CfArray * outName)186 CfResult FfiCertCjX509CertificateGetIssuerAltNames(const CjX509Certificate self, CfArray *outName)
187 {
188 return self.cert->getIssuerAltNames(self.cert, outName);
189 }
190
FfiCertCjX509CertificateMatch(const CjX509Certificate self,const CjX509CertMatchParams * matchParams,bool * out)191 CfResult FfiCertCjX509CertificateMatch(const CjX509Certificate self, const CjX509CertMatchParams *matchParams,
192 bool *out)
193 {
194 SubAltNameArray *subjectAlternativeNamesPtr = nullptr;
195 SubAltNameArray subjectAlternativeNames;
196 if (matchParams->subjectAlternativeNameCnt != 0) {
197 subjectAlternativeNames = SubAltNameArray{
198 .data = matchParams->subjectAlternativeNames,
199 .count = matchParams->subjectAlternativeNameCnt
200 };
201 subjectAlternativeNamesPtr = &subjectAlternativeNames;
202 }
203
204 HcfCertificate *certPtr = nullptr;
205 if (matchParams->x509Cert) {
206 certPtr = &matchParams->x509Cert->base;
207 }
208
209 const auto params = HcfX509CertMatchParams{
210 certPtr,
211 matchParams->validDate,
212 matchParams->issuer,
213 matchParams->keyUsage,
214 matchParams->serialNumber,
215 matchParams->subject,
216 matchParams->publicKey,
217 matchParams->publicKeyAlgID,
218 subjectAlternativeNamesPtr,
219 matchParams->matchAllSubjectAltNames,
220 matchParams->authorityKeyIdentifier,
221 matchParams->minPathLenConstraint,
222 matchParams->extendedKeyUsage,
223 matchParams->nameConstraints,
224 matchParams->certPolicy,
225 matchParams->privateKeyValid,
226 matchParams->subjectKeyIdentifier,
227 };
228
229 return self.cert->match(self.cert, ¶ms, out);
230 }
231
FfiCertCjX509CertificateGetCRLDistributionPointsURI(const CjX509Certificate self,CfArray * outURI)232 CfResult FfiCertCjX509CertificateGetCRLDistributionPointsURI(const CjX509Certificate self, CfArray *outURI)
233 {
234 return self.cert->getCRLDistributionPointsURI(self.cert, outURI);
235 }
236
FfiCertCjX509CertificateToString(const CjX509Certificate self,CfBlob * out)237 CfResult FfiCertCjX509CertificateToString(const CjX509Certificate self, CfBlob *out)
238 {
239 return self.cert->toString(self.cert, out);
240 }
241
FfiCertCjX509CertificateHashCode(const CjX509Certificate self,CfBlob * out)242 CfResult FfiCertCjX509CertificateHashCode(const CjX509Certificate self, CfBlob *out)
243 {
244 return self.cert->hashCode(self.cert, out);
245 }
246
FfiCertCjX509CertificateGetExtensionsObject(const CjX509Certificate self,CfBlob * out)247 CfResult FfiCertCjX509CertificateGetExtensionsObject(const CjX509Certificate self, CfBlob *out)
248 {
249 return self.cert->getExtensionsObject(self.cert, out);
250 }
251
FfiCertCjX509CertificateGetSubjectNameEx(const CjX509Certificate self,const CfEncodinigType encodingType,CfBlob * out)252 CfResult FfiCertCjX509CertificateGetSubjectNameEx(const CjX509Certificate self, const CfEncodinigType encodingType,
253 CfBlob *out)
254 {
255 return self.cert->getSubjectNameEx(self.cert, encodingType, out);
256 }
257
FfiCertCjX509CertificateGetItem(const CjX509Certificate self,const int32_t itemType,CfBlob * out)258 CfResult FfiCertCjX509CertificateGetItem(const CjX509Certificate self, const int32_t itemType, CfBlob *out)
259 {
260 CfParamSet *inParamSet = nullptr;
261 int32_t ret;
262 if ((ret = CfInitParamSet(&inParamSet)) != CF_SUCCESS) {
263 return CfResult(ret);
264 }
265
266 const CfParam param[] = {
267 CfParam{.tag = CF_TAG_GET_TYPE, .int32Param = CF_GET_TYPE_CERT_ITEM},
268 CfParam{.tag = CF_TAG_PARAM0_INT32, .int32Param = itemType}
269 };
270 if ((ret = CfAddParams(inParamSet, param, sizeof(param) / sizeof(CfParam))) != CF_SUCCESS) {
271 CfFreeParamSet(&inParamSet);
272 return CfResult(ret);
273 }
274
275 CfParamSet *outParamSet = nullptr;
276 if ((ret = self.cfObj->get(self.cfObj, inParamSet, &outParamSet)) != CF_SUCCESS) {
277 CfFreeParamSet(&inParamSet);
278 return CfResult(ret);
279 }
280
281 CfParam *resultParam = nullptr;
282 ret = CfGetParam(outParamSet, CF_TAG_RESULT_BYTES, &resultParam);
283 CfFreeParamSet(&inParamSet);
284 CfFreeParamSet(&outParamSet);
285
286 if (ret == CF_SUCCESS) {
287 *out = resultParam->blob;
288 }
289 return CfResult(ret);
290 }
291