1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
#![allow(non_camel_case_types)]

use std::os::raw::{c_void, c_char};

pub type context_t = c_void;
pub type mifare_t = c_void;
pub type device_t = c_void;
pub type realm_t = c_void;

#[link(name = "gatekeeper")]
extern {
    pub fn realm_create(
        slot: u8,
        name: *const c_char,
        association_id: *const c_char,
        auth_key: *const c_char,
        read_key: *const c_char,
        update_key: *const c_char,
        public_key: *const c_char,
        private_key: *const c_char,
    ) -> *mut realm_t;

    pub fn realm_free(realm: *mut realm_t);

    pub fn format_tag(
        tag: *mut mifare_t,
        uid: *const c_char,
        system_secret: *const c_char
    ) -> i32;

    pub fn issue_tag(
        tag: *mut mifare_t,
        system_secret: *const c_char,
        uid: *const c_char,
        realms: *mut *mut c_void,
        num_realms: usize,
    ) -> i32;

    pub fn authenticate_tag(
        tag: *mut mifare_t,
        realm: *mut realm_t,
        association_id: *mut u8,
    ) -> i32;
}

#[link(name = "nfc")]
extern {
    pub fn nfc_init(context: *mut *mut context_t);
    pub fn nfc_list_devices(context: *mut context_t, devices: *mut *const c_char, device_count: usize) -> u32;
    pub fn nfc_open(context: *mut context_t, device_id: *const c_char) -> *mut device_t;
    pub fn nfc_close(context: *mut device_t);
    pub fn nfc_exit(context: *mut context_t);
}

#[link(name = "freefare")]
extern {
    pub fn freefare_get_tags(device: *const device_t) -> *mut *mut mifare_t;
    pub fn freefare_get_tag_type(tag: *mut mifare_t) -> i8;
    pub fn freefare_get_tag_uid(tag: *mut mifare_t) -> *mut c_char;
    pub fn freefare_get_tag_friendly_name(tag: *mut mifare_t) -> *const c_char;
    pub fn freefare_free_tags(tags: *mut *mut mifare_t);
    pub fn free(data: *mut c_void);
}