ntrumls/
ffi.rs

1use libc::{c_int, c_uchar, c_char, uint8_t, int8_t, uint16_t, int64_t};
2
3#[derive(Clone, Debug)]
4#[repr(i32)]
5pub enum PQParamSetID {
6    Xxx20140508n401,
7    Xxx20140508n439,
8    Xxx20140508n593,
9    Xxx20140508n743,
10
11    Xxx20151024n401,
12    Xxx20151024n443,
13    Xxx20151024n563,
14    Xxx20151024n743,
15    Xxx20151024n907,
16}
17
18#[derive(Clone, Debug)]
19#[repr(C)]
20pub struct PQParamSet {
21    pub id: PQParamSetID,
22    pub name: *mut c_char,
23    pub oid: [uint8_t; 3],
24    pub n_bits: uint8_t,
25    pub q_bits: uint8_t,
26    pub n: uint16_t,
27    pub p: int8_t,
28    pub q: int64_t,
29    pub b_s: int64_t,
30    pub b_t: int64_t,
31    pub norm_bound_s: int64_t,
32    pub norm_bound_t: int64_t,
33    pub d1: uint8_t,
34    pub d2: uint8_t,
35    pub d3: uint8_t,
36    pub padded_n: uint16_t,
37}
38
39extern "C" {
40    pub fn pq_gen_key(params: *const PQParamSet,
41                      privkey_blob_len: *mut isize,
42                      privkey_blob: *mut c_uchar,
43                      pubkey_blob_len: *mut isize,
44                      pubkey_blob: *mut c_uchar) -> c_int;
45
46    pub fn pq_gen_key_fg(params: *const PQParamSet,
47                         fg: *const u16,
48                         privkey_blob_len: *mut isize,
49                         privkey_blob: *mut c_uchar,
50                         pubkey_blob_len: *mut isize,
51                         pubkey_blob: *mut c_uchar) -> c_int;
52
53    pub fn unpack_private_key(params: *const PQParamSet,
54                         f: *mut u16,
55                         g: *mut u16,
56                         ginv: *mut i64,
57                         blob_len: isize,
58                         blob: *const c_uchar) -> c_int;
59
60    pub fn pq_get_param_set_by_id(id: PQParamSetID) -> *mut PQParamSet;
61    pub fn bench_param_set(id: PQParamSetID) -> c_int;
62    pub fn pq_sign(packed_sig_len: *mut usize, packed_sig: *mut c_uchar, private_key_len: usize, private_key_blob: *const c_uchar, public_key_len: usize, public_key_blob: *const c_uchar, msg_len: usize, msg: *const c_uchar) -> c_int;
63    pub fn pq_verify(packed_sig_len: usize, packed_sig: *const c_uchar, public_key_len: usize, public_key_blob: *const c_uchar, msg_len: usize, msg: *const c_uchar) -> c_int;
64}