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