1extern crate libloading;
4pub struct Cades {
5 __library: ::libloading::Library,
6 pub GetLastError: unsafe extern "C" fn() -> DWORD,
7 pub CadesSignMessage: unsafe extern "C" fn(
8 pSignPara: PCADES_SIGN_MESSAGE_PARA,
9 fDetachedSignature: BOOL,
10 cToBeSigned: DWORD,
11 rgpbToBeSigned: *mut *const BYTE,
12 rgcbToBeSigned: *mut DWORD,
13 ppSignedBlob: *mut PCRYPT_DATA_BLOB,
14 ) -> BOOL,
15 pub CadesSignHash: unsafe extern "C" fn(
16 pSignPara: PCADES_SIGN_MESSAGE_PARA,
17 pbHash: *const BYTE,
18 cbHash: DWORD,
19 pszInnerContentObjID: LPCSTR,
20 ppSignedBlob: *mut PCRYPT_DATA_BLOB,
21 ) -> BOOL,
22 pub CadesVerifyHash: unsafe extern "C" fn(
23 pVerifyPara: PCADES_VERIFY_MESSAGE_PARA,
24 dwSignerIndex: DWORD,
25 pbDetachedSignBlob: *const BYTE,
26 cbDetachedSignBlob: DWORD,
27 pbHash: *const BYTE,
28 cbHash: DWORD,
29 pHashAlgorithm: PCRYPT_ALGORITHM_IDENTIFIER,
30 ppVerificationInfo: *mut PCADES_VERIFICATION_INFO,
31 ) -> BOOL,
32 pub CadesVerifyMessage: unsafe extern "C" fn(
33 pVerifyPara: PCADES_VERIFY_MESSAGE_PARA,
34 dwSignerIndex: DWORD,
35 pbSignedBlob: *const BYTE,
36 cbSignedBlob: DWORD,
37 ppDecodedBlob: *mut PCRYPT_DATA_BLOB,
38 ppVerificationInfo: *mut PCADES_VERIFICATION_INFO,
39 ) -> BOOL,
40 pub CadesVerifyDetachedMessage: unsafe extern "C" fn(
41 pVerifyPara: PCADES_VERIFY_MESSAGE_PARA,
42 dwSignerIndex: DWORD,
43 pbDetachedSignBlob: *const BYTE,
44 cbDetachedSignBlob: DWORD,
45 cToBeSigned: DWORD,
46 rgpbToBeSigned: *mut *const BYTE,
47 rgcbToBeSigned: *mut DWORD,
48 ppVerificationInfo: *mut PCADES_VERIFICATION_INFO,
49 ) -> BOOL,
50 pub CadesEnhanceMessage: unsafe extern "C" fn(
51 pEnhancePara: PCADES_ENHANCE_MESSAGE_PARA,
52 dwSignerIndex: DWORD,
53 pbSignedBlob: *const BYTE,
54 cbSignedBlob: DWORD,
55 ppEnhancedBlob: *mut PCRYPT_DATA_BLOB,
56 ) -> BOOL,
57 pub CadesFreeVerificationInfo:
58 unsafe extern "C" fn(pVerificationInfo: PCADES_VERIFICATION_INFO) -> BOOL,
59 pub CadesFreeBlob: unsafe extern "C" fn(pBlob: PCRYPT_DATA_BLOB) -> BOOL,
60 pub CadesFormatMessage: unsafe extern "C" fn(
61 dwFlags: DWORD,
62 lpSource: LPCVOID,
63 dwMessageId: DWORD,
64 dwLanguageId: DWORD,
65 lpBuffer: LPTSTR,
66 nSize: DWORD,
67 Arguments: *mut va_list,
68 ) -> DWORD,
69}
70impl Cades {
71 pub unsafe fn new<P>(path: P) -> Result<Self, ::libloading::Error>
72 where
73 P: AsRef<::std::ffi::OsStr>,
74 {
75 let library = ::libloading::Library::new(path)?;
76 Self::from_library(library)
77 }
78 pub unsafe fn from_library<L>(library: L) -> Result<Self, ::libloading::Error>
79 where
80 L: Into<::libloading::Library>,
81 {
82 let __library = library.into();
83 let GetLastError = __library.get(b"GetLastError\0").map(|sym| *sym)?;
84 let CadesSignMessage = __library.get(b"CadesSignMessage\0").map(|sym| *sym)?;
85 let CadesSignHash = __library.get(b"CadesSignHash\0").map(|sym| *sym)?;
86 let CadesVerifyHash = __library.get(b"CadesVerifyHash\0").map(|sym| *sym)?;
87 let CadesVerifyMessage = __library.get(b"CadesVerifyMessage\0").map(|sym| *sym)?;
88 let CadesVerifyDetachedMessage = __library
89 .get(b"CadesVerifyDetachedMessage\0")
90 .map(|sym| *sym)?;
91 let CadesEnhanceMessage = __library.get(b"CadesEnhanceMessage\0").map(|sym| *sym)?;
92 let CadesFreeVerificationInfo = __library
93 .get(b"CadesFreeVerificationInfo\0")
94 .map(|sym| *sym)?;
95 let CadesFreeBlob = __library.get(b"CadesFreeBlob\0").map(|sym| *sym)?;
96 let CadesFormatMessage = __library.get(b"CadesFormatMessage\0").map(|sym| *sym)?;
97 Ok(Cades {
98 __library,
99 GetLastError,
100 CadesSignMessage,
101 CadesSignHash,
102 CadesVerifyHash,
103 CadesVerifyMessage,
104 CadesVerifyDetachedMessage,
105 CadesEnhanceMessage,
106 CadesFreeVerificationInfo,
107 CadesFreeBlob,
108 CadesFormatMessage,
109 })
110 }
111 pub unsafe fn GetLastError(&self) -> DWORD {
112 (self.GetLastError)()
113 }
114 pub unsafe fn CadesSignMessage(
115 &self,
116 pSignPara: PCADES_SIGN_MESSAGE_PARA,
117 fDetachedSignature: BOOL,
118 cToBeSigned: DWORD,
119 rgpbToBeSigned: *mut *const BYTE,
120 rgcbToBeSigned: *mut DWORD,
121 ppSignedBlob: *mut PCRYPT_DATA_BLOB,
122 ) -> BOOL {
123 (self.CadesSignMessage)(
124 pSignPara,
125 fDetachedSignature,
126 cToBeSigned,
127 rgpbToBeSigned,
128 rgcbToBeSigned,
129 ppSignedBlob,
130 )
131 }
132 pub unsafe fn CadesSignHash(
133 &self,
134 pSignPara: PCADES_SIGN_MESSAGE_PARA,
135 pbHash: *const BYTE,
136 cbHash: DWORD,
137 pszInnerContentObjID: LPCSTR,
138 ppSignedBlob: *mut PCRYPT_DATA_BLOB,
139 ) -> BOOL {
140 (self.CadesSignHash)(
141 pSignPara,
142 pbHash,
143 cbHash,
144 pszInnerContentObjID,
145 ppSignedBlob,
146 )
147 }
148 pub unsafe fn CadesVerifyHash(
149 &self,
150 pVerifyPara: PCADES_VERIFY_MESSAGE_PARA,
151 dwSignerIndex: DWORD,
152 pbDetachedSignBlob: *const BYTE,
153 cbDetachedSignBlob: DWORD,
154 pbHash: *const BYTE,
155 cbHash: DWORD,
156 pHashAlgorithm: PCRYPT_ALGORITHM_IDENTIFIER,
157 ppVerificationInfo: *mut PCADES_VERIFICATION_INFO,
158 ) -> BOOL {
159 (self.CadesVerifyHash)(
160 pVerifyPara,
161 dwSignerIndex,
162 pbDetachedSignBlob,
163 cbDetachedSignBlob,
164 pbHash,
165 cbHash,
166 pHashAlgorithm,
167 ppVerificationInfo,
168 )
169 }
170 pub unsafe fn CadesVerifyMessage(
171 &self,
172 pVerifyPara: PCADES_VERIFY_MESSAGE_PARA,
173 dwSignerIndex: DWORD,
174 pbSignedBlob: *const BYTE,
175 cbSignedBlob: DWORD,
176 ppDecodedBlob: *mut PCRYPT_DATA_BLOB,
177 ppVerificationInfo: *mut PCADES_VERIFICATION_INFO,
178 ) -> BOOL {
179 (self.CadesVerifyMessage)(
180 pVerifyPara,
181 dwSignerIndex,
182 pbSignedBlob,
183 cbSignedBlob,
184 ppDecodedBlob,
185 ppVerificationInfo,
186 )
187 }
188 pub unsafe fn CadesVerifyDetachedMessage(
189 &self,
190 pVerifyPara: PCADES_VERIFY_MESSAGE_PARA,
191 dwSignerIndex: DWORD,
192 pbDetachedSignBlob: *const BYTE,
193 cbDetachedSignBlob: DWORD,
194 cToBeSigned: DWORD,
195 rgpbToBeSigned: *mut *const BYTE,
196 rgcbToBeSigned: *mut DWORD,
197 ppVerificationInfo: *mut PCADES_VERIFICATION_INFO,
198 ) -> BOOL {
199 (self.CadesVerifyDetachedMessage)(
200 pVerifyPara,
201 dwSignerIndex,
202 pbDetachedSignBlob,
203 cbDetachedSignBlob,
204 cToBeSigned,
205 rgpbToBeSigned,
206 rgcbToBeSigned,
207 ppVerificationInfo,
208 )
209 }
210 pub unsafe fn CadesEnhanceMessage(
211 &self,
212 pEnhancePara: PCADES_ENHANCE_MESSAGE_PARA,
213 dwSignerIndex: DWORD,
214 pbSignedBlob: *const BYTE,
215 cbSignedBlob: DWORD,
216 ppEnhancedBlob: *mut PCRYPT_DATA_BLOB,
217 ) -> BOOL {
218 (self.CadesEnhanceMessage)(
219 pEnhancePara,
220 dwSignerIndex,
221 pbSignedBlob,
222 cbSignedBlob,
223 ppEnhancedBlob,
224 )
225 }
226 pub unsafe fn CadesFreeVerificationInfo(
227 &self,
228 pVerificationInfo: PCADES_VERIFICATION_INFO,
229 ) -> BOOL {
230 (self.CadesFreeVerificationInfo)(pVerificationInfo)
231 }
232 pub unsafe fn CadesFreeBlob(&self, pBlob: PCRYPT_DATA_BLOB) -> BOOL {
233 (self.CadesFreeBlob)(pBlob)
234 }
235 pub unsafe fn CadesFormatMessage(
236 &self,
237 dwFlags: DWORD,
238 lpSource: LPCVOID,
239 dwMessageId: DWORD,
240 dwLanguageId: DWORD,
241 lpBuffer: LPTSTR,
242 nSize: DWORD,
243 Arguments: *mut va_list,
244 ) -> DWORD {
245 (self.CadesFormatMessage)(
246 dwFlags,
247 lpSource,
248 dwMessageId,
249 dwLanguageId,
250 lpBuffer,
251 nSize,
252 Arguments,
253 )
254 }
255}