#![warn(missing_docs)]
extern crate libc;
use libc::{c_int, c_uint};
const MD5_CBLOCK: usize = 64;
const MD5_LBLOCK: usize = MD5_CBLOCK / 4;
pub const MD5_DIGEST_LENGTH: usize = 16;
const SHA_LBLOCK: usize = 16;
pub const SHA1_DIGEST_LENGTH: usize = 20;
pub const SHA256_DIGEST_LENGTH: usize = 32;
pub const SHA384_DIGEST_LENGTH: usize = 48;
pub const SHA512_DIGEST_LENGTH: usize = 64;
#[allow(non_camel_case_types, non_snake_case)]
#[derive(Clone, Debug, Default, PartialEq)]
#[repr(C)]
pub struct CC_MD5_CTX {
A: c_uint,
B: c_uint,
C: c_uint,
D: c_uint,
Nl: c_uint,
Nh: c_uint,
data: [c_uint; MD5_LBLOCK],
num: c_uint,
}
#[allow(non_camel_case_types, non_snake_case)]
#[derive(Clone, Debug, Default, PartialEq)]
#[repr(C)]
pub struct CC_SHA_CTX {
h0: c_uint,
h1: c_uint,
h2: c_uint,
h3: c_uint,
h4: c_uint,
Nl: c_uint,
Nh: c_uint,
data: [c_uint; SHA_LBLOCK],
num: c_uint,
}
macro_rules! cc_sha2_struct {
($ctx_name: ident, $ty: ty) => {
#[allow(non_camel_case_types, non_snake_case)]
#[derive(Clone, Debug, Default, PartialEq)]
#[repr(C)]
pub struct $ctx_name {
count: [$ty; 2],
hash: [$ty; 8],
wbuf: [$ty; 16],
}
}
}
cc_sha2_struct!(CC_SHA256_CTX, u32);
cc_sha2_struct!(CC_SHA512_CTX, u64);
#[repr(C)]
pub enum CCDigestAlgorithm {
kCCDigestNone = 0,
kCCDigestMD2 = 1,
kCCDigestMD4 = 2,
kCCDigestMD5 = 3,
kCCDigestRMD128 = 4,
kCCDigestRMD160 = 5,
kCCDigestRMD256 = 6,
kCCDigestRMD320 = 7,
kCCDigestSHA1 = 8,
kCCDigestSHA224 = 9,
kCCDigestSHA256 = 10,
kCCDigestSHA384 = 11,
kCCDigestSHA512 = 12,
kCCDigestSkein128 = 13,
kCCDigestSkein160 = 14,
kCCDigestSkein224 = 16,
kCCDigestSkein256 = 17,
kCCDigestSkein384 = 18,
kCCDigestSkein512 = 19,
}
const CC_DIGEST_SIZE: usize = 1032;
#[allow(non_camel_case_types, non_snake_case)]
#[repr(C)]
pub struct CCDigestCtx {
context: [u8; CC_DIGEST_SIZE],
}
#[repr(C)]
pub enum CCPBKDFAlgorithm {
kCCPBKDF2 = 2,
}
#[repr(C)]
pub enum CCPseudoRandomAlgorithm {
kCCPRFHmacAlgSHA1 = 1,
kCCPRFHmacAlgSHA224 = 2,
kCCPRFHmacAlgSHA256 = 3,
kCCPRFHmacAlgSHA384 = 4,
kCCPRFHmacAlgSHA512 = 5,
}
extern "C" {
pub fn CC_MD5_Init(ctx: *mut CC_MD5_CTX) -> c_int;
pub fn CC_MD5_Update(ctx: *mut CC_MD5_CTX, data: *const u8, n: usize) -> c_int;
pub fn CC_MD5_Final(md: *mut u8, ctx: *mut CC_MD5_CTX) -> c_int;
pub fn CC_SHA1_Init(ctx: *mut CC_SHA_CTX) -> c_int;
pub fn CC_SHA1_Update(ctx: *mut CC_SHA_CTX, data: *const u8, n: usize) -> c_int;
pub fn CC_SHA1_Final(md: *mut u8, ctx: *mut CC_SHA_CTX) -> c_int;
pub fn CC_SHA256_Init(ctx: *mut CC_SHA256_CTX) -> c_int;
pub fn CC_SHA256_Update(ctx: *mut CC_SHA256_CTX, data: *const u8, n: usize) -> c_int;
pub fn CC_SHA256_Final(md: *mut u8, ctx: *mut CC_SHA256_CTX) -> c_int;
pub fn CC_SHA384_Init(ctx: *mut CC_SHA512_CTX) -> c_int;
pub fn CC_SHA384_Update(ctx: *mut CC_SHA512_CTX, data: *const u8, n: usize) -> c_int;
pub fn CC_SHA384_Final(md: *mut u8, ctx: *mut CC_SHA512_CTX) -> c_int;
pub fn CC_SHA512_Init(ctx: *mut CC_SHA512_CTX) -> c_int;
pub fn CC_SHA512_Update(ctx: *mut CC_SHA512_CTX, data: *const u8, n: usize) -> c_int;
pub fn CC_SHA512_Final(md: *mut u8, ctx: *mut CC_SHA512_CTX) -> c_int;
pub fn CCDigest(algorithm: CCDigestAlgorithm,
data: *const u8,
length: usize,
output: *mut u8)
-> c_int;
pub fn CCDigestCreate(algorithm: CCDigestAlgorithm) -> *mut CCDigestCtx;
pub fn CCDigestUpdate(ctx: *mut CCDigestCtx, data: *const u8, length: usize) -> c_int;
pub fn CCDigestFinal(ctx: *mut CCDigestCtx, output: *mut u8) -> c_int;
pub fn CCDigestDestroy(ctx: *mut CCDigestCtx);
pub fn CCDigestReset(ctx: *mut CCDigestCtx);
pub fn CCDigestGetDigest(ctx: *mut CCDigestCtx, output: *mut u8) -> c_int;
pub fn CCDigestGetBlockSize(algorithm: CCDigestAlgorithm) -> usize;
pub fn CCDigestGetOutputSize(algorithm: CCDigestAlgorithm) -> usize;
pub fn CCDigestGetBlockSizeFromRef(ctx: *mut CCDigestCtx) -> usize;
pub fn CCDigestGetOutputSizeFromRef(ctx: *mut CCDigestCtx) -> usize;
pub fn CCKeyDerivationPBKDF(algorithm: CCPBKDFAlgorithm,
password: *const u8,
passwordLen: usize,
salt: *const u8,
saltLen: usize,
prf: CCPseudoRandomAlgorithm,
rounds: u32,
derivedKey: *mut u8,
derivedKeyLen: usize)
-> c_int;
}