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 #ifndef CF_MOCK_H
17 #define CF_MOCK_H
18 #include <gmock/gmock.h>
19 #include <openssl/asn1.h>
20 #include <openssl/bn.h>
21 #include <openssl/ocsp.h>
22 #include <openssl/x509v3.h>
23 #include <openssl/pkcs12.h>
24 
25 #include "certificate_openssl_common.h"
26 #include "x509_certificate.h"
27 #include "x509_certificate_openssl.h"
28 
29 using ::testing::NiceMock;
30 
31 namespace CFMock {
32 class X509OpensslMock {
33 public:
34     MOCK_METHOD(int, i2d_X509_EXTENSIONS, (X509_EXTENSIONS * a, unsigned char **out));
35     MOCK_METHOD(int, OPENSSL_sk_num, (const OPENSSL_STACK *st));
36     MOCK_METHOD(ASN1_TIME *, X509_getm_notBefore, (const X509 *x));
37     MOCK_METHOD(ASN1_TIME *, X509_getm_notAfter, (const X509 *x));
38     MOCK_METHOD(char *, X509_NAME_oneline, (const X509_NAME *a, char *buf, int size));
39     MOCK_METHOD(int, i2d_X509, (X509 * a, unsigned char **out));
40     MOCK_METHOD(BIO *, BIO_new_mem_buf, (const void *buf, int len));
41     MOCK_METHOD(void *, OPENSSL_sk_value, (const OPENSSL_STACK *st, int i));
42     MOCK_METHOD(CfResult, HcfX509CertificateCreate, (const CfEncodingBlob *inStream, HcfX509Certificate **returnObj));
43     MOCK_METHOD(OPENSSL_STACK *, OPENSSL_sk_new_null, ());
44     MOCK_METHOD(int, X509_STORE_add_cert, (X509_STORE * ctx, X509 *x));
45     MOCK_METHOD(X509_STORE_CTX *, X509_STORE_CTX_new, ());
46     MOCK_METHOD(X509_STORE *, X509_STORE_new, ());
47     MOCK_METHOD(
48         int, X509_STORE_CTX_init, (X509_STORE_CTX * ctx, X509_STORE *store, X509 *x509, STACK_OF(X509) * chain));
49     MOCK_METHOD(int, X509_verify_cert, (X509_STORE_CTX * ctx));
50     MOCK_METHOD(int, i2d_PUBKEY, (EVP_PKEY * a, unsigned char **pp));
51     MOCK_METHOD(void *, X509_get_ext_d2i, (const X509 *x, int nid, int *crit, int *idx));
52     MOCK_METHOD(int, i2d_ASN1_OCTET_STRING, (ASN1_OCTET_STRING * a, unsigned char **out));
53     MOCK_METHOD(int, i2d_AUTHORITY_KEYID, (AUTHORITY_KEYID * a, unsigned char **out));
54     MOCK_METHOD(CfResult, DeepCopyDataToBlob, (const unsigned char *data, uint32_t len, CfBlob *outBlob));
55     MOCK_METHOD(ASN1_TIME *, ASN1_TIME_new, ());
56     MOCK_METHOD(const ASN1_INTEGER *, X509_get0_serialNumber, (const X509 *x));
57     MOCK_METHOD(int, i2d_ASN1_INTEGER, (ASN1_INTEGER * a, unsigned char **out));
58     MOCK_METHOD(EVP_PKEY *, X509_get_pubkey, (X509 * x));
59     MOCK_METHOD(ASN1_OBJECT *, OBJ_nid2obj, (int n));
60     MOCK_METHOD(int, OBJ_obj2txt, (char *buf, int buf_len, const ASN1_OBJECT *a, int no_name));
61     MOCK_METHOD(BIGNUM *, BN_bin2bn, (const unsigned char *s, int len, BIGNUM *ret));
62     MOCK_METHOD(int, ASN1_TIME_normalize, (ASN1_TIME * s));
63     MOCK_METHOD(
64         void, X509_ALGOR_get0, (const ASN1_OBJECT **paobj, int *pptype, const void **ppval, const X509_ALGOR *algor));
65     MOCK_METHOD(ASN1_TYPE *, ASN1_TYPE_new, ());
66     MOCK_METHOD(int, ASN1_TYPE_set1, (ASN1_TYPE * a, int type, const void *value));
67     MOCK_METHOD(int, i2d_ASN1_TYPE, (ASN1_TYPE * a, unsigned char **out));
68     MOCK_METHOD(long, ASN1_INTEGER_get, (const ASN1_INTEGER *a));
69     MOCK_METHOD(const unsigned char *, ASN1_STRING_get0_data, (const ASN1_STRING *x));
70     MOCK_METHOD(int, i2d_GENERAL_NAME, (GENERAL_NAME * a, unsigned char **out));
71     MOCK_METHOD(X509_EXTENSION *, X509_get_ext, (const X509 *x, X509_EXTENSION *loc));
72     MOCK_METHOD(void *, X509V3_EXT_d2i, (X509_EXTENSION * ext));
73     MOCK_METHOD(void *, GENERAL_NAME_get0_value, (const GENERAL_NAME *a, int *ptype));
74     MOCK_METHOD(int, X509_verify, (X509 * a, EVP_PKEY *r));
75     MOCK_METHOD(CfResult, DeepCopyBlobToBlob, (const CfBlob *inBlob, CfBlob **outBlob));
76     MOCK_METHOD(int, OPENSSL_sk_push, (OPENSSL_STACK * st, const int data));
77     MOCK_METHOD(int, i2d_X509_REVOKED, (X509_REVOKED * a, unsigned char **out));
78     MOCK_METHOD(int, i2d_X509_CRL, (X509_CRL * a, unsigned char **out));
79     MOCK_METHOD(
80         OPENSSL_STACK *, OPENSSL_sk_deep_copy, (const OPENSSL_STACK *, OPENSSL_sk_copyfunc c, OPENSSL_sk_freefunc f));
81     MOCK_METHOD(int, OBJ_obj2nid, (const ASN1_OBJECT *o));
82     MOCK_METHOD(X509 *, X509_dup, (X509 * x509));
83     MOCK_METHOD(int, X509_check_host, (X509 * x, const char *chk, size_t chklen, unsigned int flags, char **peername));
84     MOCK_METHOD(OCSP_REQUEST *, OCSP_REQUEST_new, ());
85     MOCK_METHOD(X509_CRL *, X509_CRL_load_http, (const char *url, BIO *bio, BIO *rbio, int timeout));
86     MOCK_METHOD(struct stack_st_OPENSSL_STRING *, X509_get1_ocsp, (X509 * x));
87     MOCK_METHOD(int, OSSL_HTTP_parse_url,
88         (const char *url, int *pssl, char **puser, char **phost, char **pport, int *pport_num, char **ppath,
89             char **pquery, char **pfrag));
90 
91     MOCK_METHOD(int, X509_NAME_get0_der, (X509_NAME * nm, const unsigned char **pder, size_t *pderlen));
92     MOCK_METHOD(const char *, OBJ_nid2sn, (int n));
93     MOCK_METHOD(int, ASN1_STRING_length, (const ASN1_STRING *x));
94     MOCK_METHOD(CfResult, DeepCopyDataToOut, (const char *data, uint32_t len, CfBlob *out));
95     MOCK_METHOD(char *, CRYPTO_strdup, (const char *str, const char *file, int line));
96     MOCK_METHOD(X509_NAME *, X509_NAME_new, ());
97     MOCK_METHOD(int, OBJ_txt2nid, (const char *s));
98     MOCK_METHOD(int, X509_NAME_add_entry_by_NID,
99         (X509_NAME * name, int nid, int type, const unsigned char *bytes, int len, int loc, int set));
100     MOCK_METHOD(BIO *, BIO_new, (const BIO_METHOD *type));
101     MOCK_METHOD(int, X509_print, (BIO * bp, X509 *x));
102     MOCK_METHOD(int, BIO_ctrl, (BIO * bp, int cmd, long larg, void *parg));
103     MOCK_METHOD(int, i2d_X509_bio, (BIO * bp, X509 *x509));
104     MOCK_METHOD(int, PKCS12_parse, (PKCS12 *p12, const char *pass, EVP_PKEY **pkey, X509 **cert, STACK_OF(X509) **ca));
105     MOCK_METHOD(bool, CheckIsSelfSigned, (const X509 *cert));
106 
107     static NiceMock<X509OpensslMock> &GetInstance(void);
108     static void SetMockFlag(bool flag);
109     static void SetHcfMockFlag(bool flag);
110     static bool GetMockFlag(void);
111 
112     X509OpensslMock();
113     ~X509OpensslMock();
114 
115 private:
116     void SetMockFunDefaultBehaviorPartOne(void);
117     void SetMockFunDefaultBehaviorPartTwo(void);
118     void SetMockFunDefaultBehaviorPartThree(void);
119     void SetMockFunDefaultBehaviorPartFour(void);
120 };
121 } // namespace CFMock
122 #endif /* CF_MOCK_H */
123