use std::os::raw::c_void;
use core_foundation_sys::array::CFArrayRef;
use core_foundation_sys::base::{Boolean, CFTypeID, CFTypeRef, OSStatus};
use core_foundation_sys::data::CFDataRef;
use core_foundation_sys::date::CFAbsoluteTime;
use core_foundation_sys::string::CFStringRef;
use crate::base::SecCertificateRef;
use crate::trust::SecTrustRef;
pub enum OpaqueCMSEncoderRef {}
pub type CMSEncoderRef = *mut OpaqueCMSEncoderRef;
pub enum OpaqueCMSDecoderRef {}
pub type CMSDecoderRef = *mut OpaqueCMSEncoderRef;
#[repr(i32)]
#[derive(Copy, Clone, Eq, PartialEq, Debug)]
pub enum CMSSignerStatus {
kCMSSignerUnsigned = 0,
kCMSSignerValid = 1,
kCMSSignerNeedsDetachedContent = 2,
kCMSSignerInvalidSignature = 3,
kCMSSignerInvalidCert = 4,
kCMSSignerInvalidIndex = 5,
}
pub type CMSSignedAttributes = u32;
pub const kCMSAttrNone: CMSSignedAttributes = 0x0000;
pub const kCMSAttrSmimeCapabilities: CMSSignedAttributes = 0x0001;
pub const kCMSAttrSmimeEncryptionKeyPrefs: CMSSignedAttributes = 0x0002;
pub const kCMSAttrSmimeMSEncryptionKeyPrefs: CMSSignedAttributes = 0x0004;
pub const kCMSAttrSigningTime: CMSSignedAttributes = 0x0008;
pub const kCMSAttrAppleCodesigningHashAgility: CMSSignedAttributes = 0x0010;
pub const kCMSAttrAppleCodesigningHashAgilityV2: CMSSignedAttributes = 0x0020;
pub const kCMSAttrAppleExpirationTime: CMSSignedAttributes = 0x0040;
#[repr(i32)]
#[derive(Copy, Clone, Eq, PartialEq, Debug)]
pub enum CMSCertificateChainMode {
kCMSCertificateNone = 0,
kCMSCertificateSignerOnly = 1,
kCMSCertificateChain = 2,
kCMSCertificateChainWithRoot = 3,
kCMSCertificateChainWithRootOrFail = 4,
}
extern "C" {
pub fn CMSDecoderGetTypeID() -> CFTypeID;
pub fn CMSDecoderCreate(output: *mut CMSDecoderRef) -> OSStatus;
pub fn CMSDecoderUpdateMessage(
decoder: CMSDecoderRef,
msg_bytes: *const c_void,
msg_bytes_len: usize,
) -> OSStatus;
pub fn CMSDecoderFinalizeMessage(decoder: CMSDecoderRef) -> OSStatus;
pub fn CMSDecoderSetDetachedContent(
decoder: CMSDecoderRef,
detached_content: CFDataRef,
) -> OSStatus;
pub fn CMSDecoderCopyDetachedContent(
decoder: CMSDecoderRef,
detached_content_out: *mut CFDataRef,
) -> OSStatus;
pub fn CMSDecoderGetNumSigners(
decoder: CMSDecoderRef,
num_signers_out: *mut usize,
) -> OSStatus;
pub fn CMSDecoderCopySignerStatus(
decoder: CMSDecoderRef,
signer_index: usize,
policy_or_array: CFTypeRef,
evaluate_sec_trust: Boolean,
signer_status_out: *mut CMSSignerStatus,
sec_trust_out: *mut SecTrustRef,
cert_verify_result_code_out: *mut OSStatus,
) -> OSStatus;
pub fn CMSDecoderCopySignerEmailAddress(
decoder: CMSDecoderRef,
signer_index: usize,
signer_email_address_out: *mut CFStringRef,
) -> OSStatus;
pub fn CMSDecoderCopySignerCert(
decoder: CMSDecoderRef,
signer_index: usize,
signer_cert_out: *mut SecCertificateRef,
) -> OSStatus;
pub fn CMSDecoderIsContentEncrypted(
decoder: CMSDecoderRef,
is_encrypted_out: *mut Boolean,
) -> OSStatus;
pub fn CMSDecoderCopyEncapsulatedContentType(
decoder: CMSDecoderRef,
content_type_out: *mut CFDataRef,
) -> OSStatus;
pub fn CMSDecoderCopyAllCerts(
decoder: CMSDecoderRef,
certs_out: *mut CFArrayRef,
) -> OSStatus;
pub fn CMSDecoderCopyContent(
decoder: CMSDecoderRef,
content_out: *mut CFDataRef,
) -> OSStatus;
pub fn CMSDecoderCopySignerSigningTime(
decoder: CMSDecoderRef,
signer_index: usize,
sign_time_out: *mut CFAbsoluteTime,
) -> OSStatus;
pub fn CMSDecoderCopySignerTimestamp(
decoder: CMSDecoderRef,
signer_index: usize,
timestamp: *mut CFAbsoluteTime,
) -> OSStatus;
pub fn CMSDecoderCopySignerTimestampWithPolicy(
decoder: CMSDecoderRef,
timestamp_policy: CFTypeRef,
signer_index: usize,
timestamp: *mut CFAbsoluteTime,
) -> OSStatus;
pub fn CMSDecoderCopySignerTimestampCertificates(
decoder: CMSDecoderRef,
signer_index: usize,
certificate_refs: *mut CFArrayRef,
) -> OSStatus;
pub static kCMSEncoderDigestAlgorithmSHA1: CFStringRef;
pub static kCMSEncoderDigestAlgorithmSHA256: CFStringRef;
pub fn CMSEncoderGetTypeID() -> CFTypeID;
pub fn CMSEncoderCreate(encoder_out: *mut CMSEncoderRef) -> OSStatus;
pub fn CMSEncoderSetSignerAlgorithm(
encoder: CMSEncoderRef,
digest_alogrithm: CFStringRef,
) -> OSStatus;
pub fn CMSEncoderAddSigners(
encoder: CMSEncoderRef,
signer_or_array: CFTypeRef,
) -> OSStatus;
pub fn CMSEncoderCopySigners(
encoder: CMSEncoderRef,
signers_out: *mut CFArrayRef,
) -> OSStatus;
pub fn CMSEncoderAddRecipients(
encoder: CMSEncoderRef,
recipient_or_array: CFTypeRef,
) -> OSStatus;
pub fn CMSEncoderCopyRecipients(
encoder: CMSEncoderRef,
recipients_out: *mut CFArrayRef,
) -> OSStatus;
pub fn CMSEncoderSetHasDetachedContent(
encoder: CMSEncoderRef,
detached_content: Boolean,
) -> OSStatus;
pub fn CMSEncoderGetHasDetachedContent(
encoder: CMSEncoderRef,
detached_content_out: *mut Boolean,
) -> OSStatus;
pub fn CMSEncoderSetEncapsulatedContentTypeOID(
encoder: CMSEncoderRef,
content_type_oid: CFTypeRef,
) -> OSStatus;
pub fn CMSEncoderCopyEncapsulatedContentType(
encoder: CMSEncoderRef,
content_type_out: *mut CFDataRef,
) -> OSStatus;
pub fn CMSEncoderAddSupportingCerts(
encoder: CMSEncoderRef,
cert_or_array: CFTypeRef,
) -> OSStatus;
pub fn CMSEncoderCopySupportingCerts(
encoder: CMSEncoderRef,
certs_out: *mut CFArrayRef,
) -> OSStatus;
pub fn CMSEncoderAddSignedAttributes(
encoder: CMSEncoderRef,
signed_attributes: CMSSignedAttributes,
) -> OSStatus;
pub fn CMSEncoderSetCertificateChainMode(
encoder: CMSEncoderRef,
chain_mode: CMSCertificateChainMode,
) -> OSStatus;
pub fn CMSEncoderGetCertificateChainMode(
encoder: CMSEncoderRef,
chain_mode_out: *mut CMSCertificateChainMode,
) -> OSStatus;
pub fn CMSEncoderUpdateContent(
encoder: CMSEncoderRef,
content: *const c_void,
content_len: usize,
) -> OSStatus;
pub fn CMSEncoderCopyEncodedContent(
encoder: CMSEncoderRef,
encoded_content_out: *mut CFDataRef,
) -> OSStatus;
pub fn CMSEncodeContent(
signers: CFTypeRef,
recipients: CFTypeRef,
content_type_oid: CFTypeRef,
detached_content: Boolean,
signed_attributes: CMSSignedAttributes,
content: *const c_void,
content_len: usize,
encoded_content_out: *mut CFDataRef,
) -> OSStatus;
pub fn CMSEncoderCopySignerTimestamp(
encoder: CMSEncoderRef,
signer_index: usize,
timestamp: *mut CFAbsoluteTime,
) -> OSStatus;
pub fn CMSEncoderCopySignerTimestampWithPolicy(
encoder: CMSEncoderRef,
timestamp_policy: CFTypeRef,
signer_index: usize,
timestamp: *mut CFAbsoluteTime,
) -> OSStatus;
}