1fb299fa2Sopenharmony_ci/*
2fb299fa2Sopenharmony_ci * Copyright (c) 2022 Huawei Device Co., Ltd.
3fb299fa2Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
4fb299fa2Sopenharmony_ci * you may not use this file except in compliance with the License.
5fb299fa2Sopenharmony_ci * You may obtain a copy of the License at
6fb299fa2Sopenharmony_ci *
7fb299fa2Sopenharmony_ci *     http://www.apache.org/licenses/LICENSE-2.0
8fb299fa2Sopenharmony_ci *
9fb299fa2Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software
10fb299fa2Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
11fb299fa2Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12fb299fa2Sopenharmony_ci * See the License for the specific language governing permissions and
13fb299fa2Sopenharmony_ci * limitations under the License.
14fb299fa2Sopenharmony_ci */
15fb299fa2Sopenharmony_ci
16fb299fa2Sopenharmony_ci#ifndef CERT_VERIFY_H
17fb299fa2Sopenharmony_ci#define CERT_VERIFY_H
18fb299fa2Sopenharmony_ci
19fb299fa2Sopenharmony_ci#include <memory>
20fb299fa2Sopenharmony_ci#include <string>
21fb299fa2Sopenharmony_ci#include <openssl/x509.h>
22fb299fa2Sopenharmony_ci#include "macros_updater.h"
23fb299fa2Sopenharmony_ci
24fb299fa2Sopenharmony_cinamespace Hpackage {
25fb299fa2Sopenharmony_cistruct CertInfo {
26fb299fa2Sopenharmony_ci    X509 *rootCert = nullptr;
27fb299fa2Sopenharmony_ci    std::string subject {};
28fb299fa2Sopenharmony_ci    std::string issuer {};
29fb299fa2Sopenharmony_ci};
30fb299fa2Sopenharmony_ci
31fb299fa2Sopenharmony_ciclass CertHelper {
32fb299fa2Sopenharmony_cipublic:
33fb299fa2Sopenharmony_ci    virtual int32_t CertChainCheck(STACK_OF(X509) *certStack, X509 *cert) = 0;
34fb299fa2Sopenharmony_ci    virtual int32_t Init();
35fb299fa2Sopenharmony_ci    virtual ~CertHelper() {}
36fb299fa2Sopenharmony_ci};
37fb299fa2Sopenharmony_ci
38fb299fa2Sopenharmony_ciclass CertVerify {
39fb299fa2Sopenharmony_ci    DISALLOW_COPY_MOVE(CertVerify);
40fb299fa2Sopenharmony_cipublic:
41fb299fa2Sopenharmony_ci    void RegisterCertHelper(std::unique_ptr<CertHelper> ptr);
42fb299fa2Sopenharmony_ci    static CertVerify &GetInstance();
43fb299fa2Sopenharmony_ci    int32_t Init();
44fb299fa2Sopenharmony_ci    int32_t CheckCertChain(STACK_OF(X509) *certStack, X509 *cert);
45fb299fa2Sopenharmony_ci
46fb299fa2Sopenharmony_ciprivate:
47fb299fa2Sopenharmony_ci    CertVerify() = default;
48fb299fa2Sopenharmony_ci    ~CertVerify() = default;
49fb299fa2Sopenharmony_ci    std::unique_ptr<CertHelper> helper_ {};
50fb299fa2Sopenharmony_ci};
51fb299fa2Sopenharmony_ci
52fb299fa2Sopenharmony_ciclass SingleCertHelper : public CertHelper {
53fb299fa2Sopenharmony_cipublic:
54fb299fa2Sopenharmony_ci    SingleCertHelper() = default;
55fb299fa2Sopenharmony_ci    virtual ~SingleCertHelper();
56fb299fa2Sopenharmony_ci
57fb299fa2Sopenharmony_ci    int32_t Init() override;
58fb299fa2Sopenharmony_ci    int32_t CertChainCheck(STACK_OF(X509) *certStack, X509 *cert) override;
59fb299fa2Sopenharmony_ci
60fb299fa2Sopenharmony_ciprivate:
61fb299fa2Sopenharmony_ci    int32_t InitRootCert();
62fb299fa2Sopenharmony_ci    int32_t VerifySingleCert(X509 *cert);
63fb299fa2Sopenharmony_ci    int32_t CompareCertSubjectAndIssuer(X509 *cert);
64fb299fa2Sopenharmony_ci    CertInfo rootInfo_ {};
65fb299fa2Sopenharmony_ci};
66fb299fa2Sopenharmony_ci} // namespace Hpackage
67fb299fa2Sopenharmony_ci
68fb299fa2Sopenharmony_ci#endif
69