• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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, &params, 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