1#![allow(non_camel_case_types)]
2
3use std::os::raw::{c_char, c_int, c_void};
4
5pub type context_t = c_void;
6pub type mifare_t = c_void;
7pub type device_t = c_void;
8pub type realm_t = c_void;
9#[repr(u32)]
10pub enum BaudRate {
11 NBR_UNDEFINED = 0,
12 NBR_106 = 1,
13 NBR_212 = 2,
14 NBR_424 = 3,
15 NBR_847 = 4,
16}
17#[derive(Copy, Clone)]
18#[repr(u32)]
19pub enum ModulationType {
20 NMT_ISO14443A = 1,
21 NMT_JEWEL = 2,
22 NMT_ISO14443B = 3,
23 NMT_ISO14443BI = 4,
24 NMT_ISO14443B2SR = 5,
25 NMT_ISO14443B2CT = 6,
26 NMT_FELICA = 7,
27 NMT_DEP = 8,
28}
29#[repr(C)]
30pub struct Modulation {
31 pub nmt: ModulationType,
32 pub nbr: BaudRate,
33}
34pub type modulation_t = Modulation;
35#[repr(C)]
36pub struct Union_Unnamed11 {
38 pub _bindgen_data_: [u8; 283usize],
39}
40pub type nfc_target_info = Union_Unnamed11;
41#[repr(C)]
42pub struct NfcTarget {
43 pub nti: nfc_target_info,
44 pub nm: modulation_t,
45}
46pub type nfc_target = NfcTarget;
47#[derive(Copy, Clone)]
48#[repr(u32)]
49pub enum NfcProperty {
50 NP_TIMEOUT_COMMAND = 0,
51 NP_TIMEOUT_ATR = 1,
52 NP_TIMEOUT_COM = 2,
53 NP_HANDLE_CRC = 3,
54 NP_HANDLE_PARITY = 4,
55 NP_ACTIVATE_FIELD = 5,
56 NP_ACTIVATE_CRYPTO1 = 6,
57 NP_INFINITE_SELECT = 7,
58 NP_ACCEPT_INVALID_FRAMES = 8,
59 NP_ACCEPT_MULTIPLE_FRAMES = 9,
60 NP_AUTO_ISO14443_4 = 10,
61 NP_EASY_FRAMING = 11,
62 NP_FORCE_ISO14443_A = 12,
63 NP_FORCE_ISO14443_B = 13,
64 NP_FORCE_SPEED_106 = 14,
65}
66pub type nfc_property = NfcProperty;
67
68#[link(name = "gatekeeper")]
69extern "C" {
70 pub fn realm_create(
71 slot: u8,
72 name: *const c_char,
73 association_id: *const c_char,
74 auth_key: *const c_char,
75 read_key: *const c_char,
76 update_key: *const c_char,
77 public_key: *const c_char,
78 private_key: *const c_char,
79 ) -> *mut realm_t;
80
81 pub fn realm_free(realm: *mut realm_t);
82
83 pub fn format_tag(tag: *mut mifare_t, uid: *const c_char, system_secret: *const c_char) -> i32;
84
85 pub fn issue_tag(
86 tag: *mut mifare_t,
87 system_secret: *const c_char,
88 uid: *const c_char,
89 realms: *mut *mut c_void,
90 num_realms: usize,
91 ) -> i32;
92
93 pub fn authenticate_tag(
94 tag: *mut mifare_t,
95 realm: *mut realm_t,
96 association_id: *mut u8,
97 ) -> i32;
98}
99
100#[link(name = "nfc")]
101extern "C" {
102 pub fn nfc_init(context: *mut *mut context_t);
103 pub fn nfc_list_devices(
104 context: *mut context_t,
105 devices: *mut *const c_char,
106 device_count: usize,
107 ) -> u32;
108 pub fn nfc_open(context: *mut context_t, device_id: *const c_char) -> *mut device_t;
109 pub fn nfc_perror(device: *const device_t, message: *const c_char);
110 pub fn nfc_device_get_last_error(device: *const device_t) -> c_int;
111 pub fn nfc_initiator_init(device: *mut device_t) -> c_int;
112 pub fn nfc_close(context: *mut device_t);
113 pub fn nfc_exit(context: *mut context_t);
114 pub fn nfc_initiator_transceive_bytes(
115 device: *mut device_t,
116 bytes: *const u8,
117 byte_count: usize,
118 rx_bytes: *const u8,
119 rx_byte_count: usize,
120 timeout: c_int,
121 ) -> c_int;
122 pub fn nfc_initiator_select_passive_target(
123 device: *mut device_t,
124 nfc_modulation: modulation_t,
125 pbt_init_data: *const u8,
126 sz_init_data: usize,
127 pnt: *mut nfc_target,
128 ) -> c_int;
129 pub fn nfc_initiator_deselect_target(device: *mut device_t) -> c_int;
130 pub fn nfc_device_set_property_bool(
131 pnd: *mut device_t,
132 property: nfc_property,
133 bEnable: u8,
134 ) -> c_int;
135}
136
137#[link(name = "freefare")]
138extern "C" {
139 pub fn freefare_get_tags(device: *const device_t) -> *mut *mut mifare_t;
140 pub fn freefare_get_tag_type(tag: *mut mifare_t) -> i8;
141 pub fn freefare_get_tag_uid(tag: *mut mifare_t) -> *mut c_char;
142 pub fn freefare_get_tag_friendly_name(tag: *mut mifare_t) -> *const c_char;
143 pub fn freefare_free_tags(tags: *mut *mut mifare_t);
144 pub fn free(data: *mut c_void);
145}