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}