#![forbid(missing_docs, warnings)]
#![deny(deprecated, improper_ctypes, non_shorthand_field_patterns, overflowing_literals,
plugin_as_library, private_no_mangle_fns, private_no_mangle_statics, stable_features,
unconditional_recursion, unknown_lints, unused, unused_allocation, unused_attributes,
unused_comparisons, unused_features, unused_parens, while_true)]
#![warn(trivial_casts, trivial_numeric_casts, unused, unused_extern_crates, unused_import_braces,
unused_qualifications, unused_results, variant_size_differences)]
extern crate libc;
pub mod types;
pub mod rand;
pub mod encparams;
mod ffi;
use types::{KeyPair, PrivateKey, PublicKey, Error};
use encparams::EncParams;
use rand::RandContext;
pub fn generate_key_pair(params: &EncParams, rand_context: &RandContext) -> Result<KeyPair, Error> {
let mut kp: KeyPair = Default::default();
let result = unsafe { ffi::ntru_gen_key_pair(params, &mut kp, rand_context) };
if result == 0 {
Ok(kp)
} else {
Err(Error::from(result))
}
}
pub fn generate_multiple_key_pairs(params: &EncParams,
rand_context: &RandContext,
num_pub: usize)
-> Result<(PrivateKey, Box<[PublicKey]>), Error> {
let mut private: PrivateKey = Default::default();
let mut public: Vec<PublicKey> = Vec::with_capacity(num_pub);
for _ in 0..num_pub {
public.push(Default::default());
}
let result = unsafe {
ffi::ntru_gen_key_pair_multi(params,
&mut private,
&mut public[0],
rand_context,
num_pub as u32)
};
if result == 0 {
Ok((private, public.into_boxed_slice()))
} else {
Err(Error::from(result))
}
}
pub fn generate_public(params: &EncParams,
private: &PrivateKey,
rand_context: &RandContext)
-> Result<PublicKey, Error> {
let mut public: PublicKey = Default::default();
let result = unsafe { ffi::ntru_gen_pub(params, private, &mut public, rand_context) };
if result == 0 {
Ok(public)
} else {
Err(Error::from(result))
}
}
pub fn encrypt(msg: &[u8],
public: &PublicKey,
params: &EncParams,
rand_ctx: &RandContext)
-> Result<Box<[u8]>, Error> {
let mut enc = vec![0u8; params.enc_len() as usize];
let result = unsafe {
ffi::ntru_encrypt(if msg.len() > 0 {
&msg[0]
} else {
std::ptr::null()
},
msg.len() as u16,
public,
params,
rand_ctx,
&mut enc[0])
};
if result == 0 {
Ok(enc.into_boxed_slice())
} else {
Err(Error::from(result))
}
}
pub fn decrypt(enc: &[u8], kp: &KeyPair, params: &EncParams) -> Result<Box<[u8]>, Error> {
let mut dec = vec![0u8; params.max_msg_len() as usize];
let mut dec_len = 0u16;
let result = unsafe { ffi::ntru_decrypt(&enc[0], kp, params, &mut dec[0], &mut dec_len) };
if result == 0 {
let mut final_dec = Vec::with_capacity(dec_len as usize);
final_dec.extend(dec.into_iter().take(dec_len as usize));
Ok(final_dec.into_boxed_slice())
} else {
Err(Error::from(result))
}
}