skf_api/native/content.rs
1//! 应用管理接口
2//! - SKF_CreateApplication
3//! - SKF_EnumApplication
4//! - SKF_DeleteApplication
5//! - SKF_OpenApplication
6//! - SKF_CloseApplication
7//!
8//! 文件管理接口
9//! - SKF_CreateFile
10//! - SKF_DeleteFile
11//! - SKF_EnumFiles
12//! - SKF_GetFileInfo
13//! - SKF_ReadFile
14//! - SKF_WriteFile
15//!
16//! 容器管理接口
17//! - SKF_CreateContainer
18//! - SKF_DeleteContainer
19//! - SKF_OpenContainer
20//! - SKF_CloseContainer
21//! - SKF_EnumContainer
22//!
23//! see [GM/T 0016-2012](https://github.com/guanzhi/GM-Standards/blob/master/GMT%E5%AF%86%E7%A0%81%E8%A1%8C%E6%A0%87/GMT%200017-2012%20%E6%99%BA%E8%83%BD%E5%AF%86%E7%A0%81%E9%92%A5%E5%8C%99%E5%AF%86%E7%A0%81%E5%BA%94%E7%94%A8%E6%8E%A5%E5%8F%A3%E6%95%B0%E6%8D%AE%E6%A0%BC%E5%BC%8F%E8%A7%84%E8%8C%83.PDF)
24
25use crate::native::types::{FileAttribute, BOOL, BYTE, CHAR, DWORD, HANDLE, LPSTR, ULONG};
26
27#[allow(non_camel_case_types)]
28extern "C" {
29
30 /// 创建一个应用
31 ///
32 /// [device_handle] `[IN]`连接设备时返回的设备句柄
33 ///
34 /// [sz_app_name] `[IN]`应用名称
35 ///
36 /// [sz_admin_pin] `[IN]`管理员PIN
37 ///
38 /// [admin_pin_retry_count] `[IN]`管理员PIN最大重试次数
39 ///
40 /// [sz_user_pin] `[IN]`用户PIN
41 ///
42 /// [user_pin_retry_count] `[IN]`用户PIN最大重试次数
43 ///
44 /// [create_file_rights] `[IN]`在该应用下创建文件和容器的权限
45 ///
46 /// [app_handle] `[OUT]`应用的句柄
47 pub fn SKF_CreateApplication(
48 device_handle: HANDLE,
49 sz_app_name: LPSTR,
50 sz_admin_pin: LPSTR,
51 admin_pin_retry_count: DWORD,
52 sz_user_pin: LPSTR,
53 user_pin_retry_count: DWORD,
54 create_file_rights: DWORD,
55 app_handle: *mut HANDLE,
56 ) -> ULONG;
57
58 /// 枚举设备中所存在的所有应用
59 ///
60 /// [device_handle] `[IN]`连接设备时返回的设备句柄
61 ///
62 /// [sz_app_name_list] `[OUT]`返回应用名称列表, 如果该参数为空,将由`size`返回所需要的内存空间大小。每个应用的名称以单个'\0'结束,以双'\0'表示列表的结束。
63 ///
64 /// [size] `[IN,OUT]`输入参数,输入应用名称的缓冲区长度,输出参数,返回`sz_app_name_list`所占用的的空间大小
65 pub fn SKF_EnumApplication(
66 device_handle: HANDLE,
67 sz_app_name_list: LPSTR,
68 size: *mut ULONG,
69 ) -> ULONG;
70
71 /// 打开指定的应用
72 ///
73 /// [device_handle] `[IN]`连接设备时返回的设备句柄
74 ///
75 /// [sz_app_name] `[IN]`应用名称
76 ///
77 /// [app_handle] `[OUT]`应用的句柄
78 pub fn SKF_OpenApplication(
79 device_handle: HANDLE,
80 sz_app_name: LPSTR,
81 app_handle: *mut HANDLE,
82 ) -> ULONG;
83
84 /// 删除指定的应用
85 ///
86 /// [device_handle] `[IN]`连接设备时返回的设备句柄
87 ///
88 /// [sz_app_name] `[IN]`应用名称
89 pub fn SKF_DeleteApplication(device_handle: HANDLE, sz_app_name: LPSTR) -> ULONG;
90
91 /// 关闭应用并释放应用句柄
92 ///
93 /// [app_handle] `[IN]`应用的句柄
94 pub fn SKF_CloseApplication(app_handle: HANDLE) -> ULONG;
95
96 /// 创建一个文件。创建文件时要指定文件的名称,大小,以及文件的读写权限
97 ///
98 /// [app_handle] `[IN]`应用句柄
99 ///
100 /// [sz_file_name] `[IN]`文件名称,长度不得大于32个字节
101 ///
102 /// [file_size] `[IN]`文件大小
103 ///
104 /// [read_rights] `[IN]`文件读权限
105 ///
106 /// [write_rights] `[IN]`文件写权限,取值为 :`SECURE_NEVER_ACCOUNT`, `SECURE_ADM_ACCOUNT`, `SECURE_USER_ACCOUNT`, `SECURE_EVERYONE_ACCOUNT`
107 pub fn SKF_CreateFile(
108 app_handle: HANDLE,
109 sz_file_name: LPSTR,
110 file_size: ULONG,
111 read_rights: ULONG,
112 write_rights: ULONG,
113 ) -> ULONG;
114
115 /// 删除指定文件,文件删除后,文件中写入的所有信息将丢失。文件在设备中的占用的空间将被释放。
116 ///
117 /// [app_handle] `[IN]`要删除文件所在的应用句柄
118 ///
119 /// [sz_file_name] `[IN]`要删除文件的名称
120 pub fn SKF_DeleteFile(app_handle: HANDLE, sz_file_name: LPSTR) -> ULONG;
121
122 /// 枚举一个应用下存在的所有文件
123 ///
124 /// [app_handle] `[IN]`应用的句柄
125 ///
126 /// [sz_file_list] `[OUT]`返回文件名称列表,该参数为空,由`size`返回文件信息所需要的空间大小。每个文件名称以单个`'\0'`结束,以双`'\0'`表示列表的结束。
127 ///
128 /// [size] `[IN,OUT]`输入时表示数据缓冲区的大小,输出时表示实际文件名称列表的长度。
129 pub fn SKF_EnumFiles(app_handle: HANDLE, sz_file_list: *mut CHAR, size: *mut ULONG) -> ULONG;
130
131 /// 获取应用文件的属性信息,例如文件的大小、权限等
132 ///
133 /// [app_handle] `[IN]`文件所在应用的句柄
134 ///
135 /// [sz_file_name] `[IN]`文件名称
136 ///
137 /// [file_info] `[OUT]`文件信息,指向文件属性结构的指针
138 pub fn SKF_GetFileInfo(
139 app_handle: HANDLE,
140 sz_file_name: LPSTR,
141 file_info: *mut FileAttribute,
142 ) -> ULONG;
143
144 /// 读取文件内容
145 ///
146 /// [app_handle] `[IN]`文件所在的应用句柄
147 ///
148 /// [sz_file_name] `[IN]`文件名
149 ///
150 /// [offset] `[IN]`文件读取偏移位置
151 ///
152 /// [size] `[IN]`要读取的长度
153 ///
154 /// [out_data] `[OUT]`返回数据的缓冲区
155 ///
156 /// [out_len] `[OUT]`输入表示给出的缓冲区大小,输出表示实际读取返回的数据大小
157 pub fn SKF_ReadFile(
158 app_handle: HANDLE,
159 sz_file_name: LPSTR,
160 offset: ULONG,
161 size: ULONG,
162 out_data: *mut BYTE,
163 out_len: *mut ULONG,
164 ) -> ULONG;
165
166 /// 写数据到文件中
167 ///
168 /// [app_handle] `[IN]`文件所在的应用句柄
169 ///
170 /// [sz_file_name] `[IN]`文件名
171 ///
172 /// [offset] `[IN]`写入文件的偏移量
173 ///
174 /// [data] `[IN]`写入数据缓冲区
175 ///
176 /// [size] `[IN]`写入数据的大小
177 pub fn SKF_WriteFile(
178 app_handle: HANDLE,
179 sz_file_name: LPSTR,
180 offset: ULONG,
181 data: *const BYTE,
182 size: ULONG,
183 ) -> ULONG;
184
185 /// 在应用下建立指定名称的容器并返回容器句柄
186 ///
187 /// [app_handle] `[IN]`应用句柄
188 ///
189 /// [sz_container_name] `[IN]`ASCII字符串,表示所建立容器的名称,容器名称的最大长度不能超过64字节
190 ///
191 /// [container_handle] `[OUT]`返回所建立容器的容器句柄
192 pub fn SKF_CreateContainer(
193 app_handle: HANDLE,
194 sz_container_name: LPSTR,
195 container_handle: *mut HANDLE,
196 ) -> ULONG;
197
198 /// 在应用下删除指定名称的容器并释放容器相关的资源
199 ///
200 /// [app_handle] `[IN]`应用句柄
201 ///
202 /// [sz_container_name] `[IN]`指向删除容器的名称
203 pub fn SKF_DeleteContainer(app_handle: HANDLE, sz_container_name: LPSTR) -> ULONG;
204
205 /// 获取容器句柄
206 ///
207 /// [app_handle] `[IN]`应用句柄
208 ///
209 /// [sz_container_name] `[IN]`容器名称
210 ///
211 /// [container_handle] `[OUT]`返回所打开容器的句柄
212 pub fn SKF_OpenContainer(
213 app_handle: HANDLE,
214 sz_container_name: LPSTR,
215 container_handle: *mut HANDLE,
216 ) -> ULONG;
217
218 /// 关闭容器句柄,并释放容器句柄相关资源
219 ///
220 /// [container_handle] `[IN]`容器句柄
221 ///
222 pub fn SKF_CloseContainer(container_handle: HANDLE) -> ULONG;
223
224 /// 枚举应用下的所有容器并返回容器名称列表
225 ///
226 /// [app_handle] `[IN]`应用句柄
227 ///
228 /// [list] `[OUT]`指向容器名称列表缓冲区
229 /// 如果此参数为`NULL`时,`size`表示返回数据所需要缓冲区的长度,如果此参数不为`NULL`时,返回容器名称列表,每个容器名以单个`'\0'`为结束,列表以双`'\0'`结束
230 ///
231 /// [size] `[IN,OUT]`输入参数,输入容器名称列表的缓冲区长度,输出参数,返回容器名称列表所占用的的空间大小
232 pub fn SKF_EnumContainer(app_handle: HANDLE, list: *mut CHAR, size: *mut ULONG) -> ULONG;
233
234 /// 获取容器的类型
235 ///
236 /// [container_handle] `[IN]`容器句柄
237 ///
238 /// [container_type] `[OUT]`获得的容器类型。值为`0`表示未定、尚未分配类型或者为空容器,`1`表示为`RSA`容器,`2`表示为`ECC`容器。
239 pub fn SKF_GetContainerType(container_handle: HANDLE, container_type: *mut ULONG) -> ULONG;
240
241 /// 向容器内导入数字证书。
242 ///
243 /// [container_handle] `[IN]`容器句柄。
244 ///
245 /// [sign_flag] `[IN]` `TRUE`表示签名证书,`FALSE`表示加密证书。
246 ///
247 /// [cert] `[IN]`指向证书内容缓冲区。
248 ///
249 /// [cert_len] `[IN]`证书长度。
250 pub fn SKF_ImportCertificate(
251 container_handle: HANDLE,
252 sign_flag: BOOL,
253 cert: *const BYTE,
254 cert_len: ULONG,
255 ) -> ULONG;
256
257 /// 从容器内导出数字证书。
258 ///
259 /// [container_handle] `[IN]`容器句柄。
260 ///
261 /// [sign_flag] `[IN]` `TRUE`表示签名证书,`FALSE`表示加密证书。
262 ///
263 /// [cert] `[OUT]`指向证书内容缓冲区,如果此参数为 `NULL`时,`cert_len`表示返回数据所需要缓冲区的长度。如果此参数不为 `NULL`时,返回数字证书内容
264 ///
265 /// [cert_len] `[IN,OUT]`输入时表示`cert`缓冲区的长度,输出时表示证书内容的长度。
266 pub fn SKF_ExportCertificate(
267 container_handle: HANDLE,
268 sign_flag: BOOL,
269 cert: *mut BYTE,
270 cert_len: *mut ULONG,
271 ) -> ULONG;
272}