1 /*
2 * Copyright 2014-2022 The GmSSL Project. All Rights Reserved.
3 *
4 * Licensed under the Apache License, Version 2.0 (the License); you may
5 * not use this file except in compliance with the License.
6 *
7 * http://www.apache.org/licenses/LICENSE-2.0
8 */
9
10
11 #include <stdio.h>
12 #include <stdlib.h>
13 #include <string.h>
14 #include <dlfcn.h>
15 #include "sdf_int.h"
16
17 #define SDFerr(a,b)
18
19 #define SDF_METHOD_BIND_FUNCTION_EX(func,name) \
20 sdf->func = (SDF_##func##_FuncPtr)dlsym(sdf->dso, "SDF_"#name)
21
22 #define SDF_METHOD_BIND_FUNCTION(func) \
23 SDF_METHOD_BIND_FUNCTION_EX(func,func)
24
SDF_METHOD_load_library(const char * so_path)25 SDF_METHOD *SDF_METHOD_load_library(const char *so_path)
26 {
27 SDF_METHOD *ret = NULL;
28 SDF_METHOD *sdf = NULL;
29
30 if (!(sdf = malloc(sizeof(*sdf)))) {
31 SDFerr(SDF_F_SDF_METHOD_LOAD_LIBRARY, ERR_R_MALLOC_FAILURE);
32 goto end;
33 }
34 memset(sdf, 0, sizeof(*sdf));
35
36 if (!(sdf->dso = dlopen(so_path, RTLD_LAZY))) {
37 fprintf(stderr, "%s %d: %s\n", __FILE__, __LINE__, dlerror());
38 SDFerr(SDF_F_SDF_METHOD_LOAD_LIBRARY, SDF_R_DSO_LOAD_FAILURE);
39 goto end;
40 }
41
42 SDF_METHOD_BIND_FUNCTION(OpenDevice);
43 SDF_METHOD_BIND_FUNCTION(CloseDevice);
44 SDF_METHOD_BIND_FUNCTION(OpenSession);
45 SDF_METHOD_BIND_FUNCTION(CloseSession);
46 SDF_METHOD_BIND_FUNCTION(GetDeviceInfo);
47 SDF_METHOD_BIND_FUNCTION(GenerateRandom);
48 SDF_METHOD_BIND_FUNCTION(GetPrivateKeyAccessRight);
49 SDF_METHOD_BIND_FUNCTION(ReleasePrivateKeyAccessRight);
50 SDF_METHOD_BIND_FUNCTION(ExportSignPublicKey_RSA);
51 SDF_METHOD_BIND_FUNCTION(ExportEncPublicKey_RSA);
52 SDF_METHOD_BIND_FUNCTION(GenerateKeyPair_RSA);
53 SDF_METHOD_BIND_FUNCTION(GenerateKeyWithIPK_RSA);
54 SDF_METHOD_BIND_FUNCTION(GenerateKeyWithEPK_RSA);
55 SDF_METHOD_BIND_FUNCTION(ImportKeyWithISK_RSA);
56 SDF_METHOD_BIND_FUNCTION(ExchangeDigitEnvelopeBaseOnRSA);
57 SDF_METHOD_BIND_FUNCTION(ExportSignPublicKey_ECC);
58 SDF_METHOD_BIND_FUNCTION(ExportEncPublicKey_ECC);
59 SDF_METHOD_BIND_FUNCTION(GenerateKeyPair_ECC);
60 SDF_METHOD_BIND_FUNCTION(GenerateKeyWithIPK_ECC);
61 SDF_METHOD_BIND_FUNCTION(GenerateKeyWithEPK_ECC);
62 SDF_METHOD_BIND_FUNCTION(ImportKeyWithISK_ECC);
63 SDF_METHOD_BIND_FUNCTION(GenerateAgreementDataWithECC);
64 SDF_METHOD_BIND_FUNCTION(GenerateKeyWithECC);
65 SDF_METHOD_BIND_FUNCTION(GenerateAgreementDataAndKeyWithECC);
66 SDF_METHOD_BIND_FUNCTION(ExchangeDigitEnvelopeBaseOnECC);
67 SDF_METHOD_BIND_FUNCTION(GenerateKeyWithKEK);
68 SDF_METHOD_BIND_FUNCTION(ImportKeyWithKEK);
69 SDF_METHOD_BIND_FUNCTION(DestroyKey);
70 SDF_METHOD_BIND_FUNCTION(ExternalPublicKeyOperation_RSA);
71 //SDF_METHOD_BIND_FUNCTION(InternalPublicKeyOperation_RSA);
72 SDF_METHOD_BIND_FUNCTION(InternalPrivateKeyOperation_RSA);
73 SDF_METHOD_BIND_FUNCTION(ExternalVerify_ECC);
74 SDF_METHOD_BIND_FUNCTION(InternalSign_ECC);
75 SDF_METHOD_BIND_FUNCTION(InternalVerify_ECC);
76 SDF_METHOD_BIND_FUNCTION(ExternalEncrypt_ECC);
77 //SDF_METHOD_BIND_FUNCTION(ExternalDecrypt_ECC);
78 SDF_METHOD_BIND_FUNCTION(InternalEncrypt_ECC);
79 SDF_METHOD_BIND_FUNCTION(InternalDecrypt_ECC);
80 SDF_METHOD_BIND_FUNCTION(Encrypt);
81 SDF_METHOD_BIND_FUNCTION(Decrypt);
82 SDF_METHOD_BIND_FUNCTION(CalculateMAC);
83 SDF_METHOD_BIND_FUNCTION(HashInit);
84 SDF_METHOD_BIND_FUNCTION(HashUpdate);
85 SDF_METHOD_BIND_FUNCTION(HashFinal);
86 SDF_METHOD_BIND_FUNCTION_EX(CreateObject,CreateFile);
87 SDF_METHOD_BIND_FUNCTION_EX(ReadObject,ReadFile);
88 SDF_METHOD_BIND_FUNCTION_EX(WriteObject,WriteFile);
89 SDF_METHOD_BIND_FUNCTION_EX(DeleteObject,DeleteFile);
90
91 ret = sdf;
92 sdf = NULL;
93
94 end:
95 SDF_METHOD_free(sdf);
96 return ret;
97 }
98
SDF_METHOD_free(SDF_METHOD * meth)99 void SDF_METHOD_free(SDF_METHOD *meth)
100 {
101 if (meth) free(meth->dso);
102 free(meth);
103 }
104
105
106