#![allow(unsafe_code)]
use ffi::MDataInfo;
use ffi::arrays::*;
use ffi::ipc::req::PermissionSet as FfiPermissionSet;
use rust_sodium::crypto::sign;
use std::ffi::CString;
use std::os::raw::c_char;
use std::ptr;
#[repr(C)]
pub struct AuthGranted {
pub app_keys: AppKeys,
pub access_container_info: AccessContInfo,
pub access_container_entry: AccessContainerEntry,
pub bootstrap_config_ptr: *mut u8,
pub bootstrap_config_len: usize,
pub bootstrap_config_cap: usize,
}
impl Drop for AuthGranted {
fn drop(&mut self) {
unsafe {
let _ = Vec::from_raw_parts(
self.bootstrap_config_ptr,
self.bootstrap_config_len,
self.bootstrap_config_cap,
);
}
}
}
#[repr(C)]
#[derive(Copy)]
pub struct AppKeys {
pub owner_key: SignPublicKey,
pub enc_key: SymSecretKey,
pub sign_pk: SignPublicKey,
pub sign_sk: SignSecretKey,
pub enc_pk: AsymPublicKey,
pub enc_sk: AsymSecretKey,
}
#[cfg_attr(feature = "cargo-clippy", allow(expl_impl_clone_on_copy))]
impl Clone for AppKeys {
fn clone(&self) -> Self {
let mut sign_pk = [0; sign::PUBLICKEYBYTES];
let mut sign_sk = [0; sign::SECRETKEYBYTES];
sign_pk.copy_from_slice(&self.sign_pk);
sign_sk.copy_from_slice(&self.sign_sk);
AppKeys {
owner_key: self.owner_key,
enc_key: self.enc_key,
sign_pk: sign_pk,
sign_sk: sign_sk,
enc_pk: self.enc_pk,
enc_sk: self.enc_sk,
}
}
}
#[repr(C)]
#[derive(Clone, Copy)]
pub struct AccessContInfo {
pub id: XorNameArray,
pub tag: u64,
pub nonce: SymNonce,
}
#[repr(C)]
pub struct AccessContainerEntry {
pub ptr: *const ContainerInfo,
pub len: usize,
pub cap: usize,
}
impl Drop for AccessContainerEntry {
fn drop(&mut self) {
unsafe {
let _ = Vec::from_raw_parts(self.ptr as *mut ContainerInfo, self.len, self.cap);
}
}
}
#[repr(C)]
pub struct ContainerInfo {
pub name: *const c_char,
pub mdata_info: MDataInfo,
pub permissions: FfiPermissionSet,
}
impl Drop for ContainerInfo {
fn drop(&mut self) {
unsafe {
let _ = CString::from_raw(self.name as *mut _);
}
}
}
#[repr(C)]
pub struct AppAccess {
pub sign_key: SignPublicKey,
pub permissions: FfiPermissionSet,
pub name: *const c_char,
pub app_id: *const c_char,
}
#[repr(C)]
pub struct MetadataResponse {
pub name: *const c_char,
pub description: *const c_char,
pub xor_name: XorNameArray,
pub type_tag: u64,
}
impl MetadataResponse {
pub fn invalid() -> Self {
MetadataResponse {
name: ptr::null(),
description: ptr::null(),
xor_name: Default::default(),
type_tag: 0,
}
}
}
impl Drop for MetadataResponse {
fn drop(&mut self) {
unsafe {
if !self.name.is_null() {
let _ = CString::from_raw(self.name as *mut _);
}
if !self.description.is_null() {
let _ = CString::from_raw(self.description as *mut _);
}
}
}
}
#[repr(C)]
#[derive(Clone, Copy, Debug)]
pub struct MDataValue {
pub content_ptr: *const u8,
pub content_len: usize,
pub entry_version: u64,
}
#[repr(C)]
#[derive(Clone, Copy, Debug)]
pub struct MDataKey {
pub val_ptr: *const u8,
pub val_len: usize,
}