Skip to main content

security/ffi/
mod.rs

1//! Raw FFI declarations for the subset of `Security.framework` used by this crate.
2
3#![allow(
4    non_camel_case_types,
5    non_snake_case,
6    non_upper_case_globals,
7    missing_docs
8)]
9
10use libc::{c_char, c_void, size_t};
11
12mod access_control;
13mod item;
14mod key;
15mod policy;
16
17pub use access_control::*;
18pub use item::*;
19pub use key::*;
20pub use policy::*;
21pub use apple_cf::raw::{
22    CFAllocatorRef, CFArrayRef, CFBooleanRef, CFDataRef, CFDictionaryRef, CFErrorRef,
23    CFIndex, CFMutableDictionaryRef, CFNumberRef, CFOptionFlags, CFStringRef, CFTypeID,
24    CFTypeRef,
25};
26pub type OSStatus = i32;
27pub type Boolean = u8;
28pub type SecRandomRef = *const c_void;
29pub type SecAccessControlRef = *const c_void;
30pub type SecCertificateRef = *const c_void;
31pub type SecKeyRef = *const c_void;
32pub type SecPolicyRef = *const c_void;
33pub type SecTrustRef = *const c_void;
34pub type SecCodeRef = *const c_void;
35pub type SecStaticCodeRef = *const c_void;
36pub type SecCSFlags = u32;
37
38pub const kCFStringEncodingUTF8: u32 = 0x0800_0100;
39pub const kCFNumberSInt64Type: i64 = 4;
40
41pub const kSecCSDefaultFlags: SecCSFlags = 0;
42pub const kSecCSSigningInformation: SecCSFlags = 1 << 1;
43pub const kSecCSDynamicInformation: SecCSFlags = 1 << 3;
44
45pub mod status {
46    use super::OSStatus;
47
48    pub const SUCCESS: OSStatus = 0;
49    pub const DUPLICATE_ITEM: OSStatus = -25299;
50    pub const ITEM_NOT_FOUND: OSStatus = -25300;
51    pub const INTERACTION_NOT_ALLOWED: OSStatus = -25308;
52}
53
54extern "C" {
55    pub static kCFAllocatorDefault: CFAllocatorRef;
56    pub static kCFBooleanTrue: CFBooleanRef;
57    pub static kCFTypeDictionaryKeyCallBacks: c_void;
58    pub static kCFTypeDictionaryValueCallBacks: c_void;
59    pub static kCFTypeArrayCallBacks: c_void;
60
61    pub fn CFRelease(cf: CFTypeRef);
62    pub fn CFGetTypeID(cf: CFTypeRef) -> CFTypeID;
63
64    pub fn CFStringCreateWithCString(
65        alloc: CFAllocatorRef,
66        c_str: *const c_char,
67        encoding: u32,
68    ) -> CFStringRef;
69    pub fn CFStringGetLength(string: CFStringRef) -> CFIndex;
70    pub fn CFStringGetCString(
71        string: CFStringRef,
72        buffer: *mut c_char,
73        buffer_size: CFIndex,
74        encoding: u32,
75    ) -> bool;
76    pub fn CFStringGetTypeID() -> CFTypeID;
77
78    pub fn CFDataCreate(alloc: CFAllocatorRef, bytes: *const u8, length: CFIndex) -> CFDataRef;
79    pub fn CFDataGetLength(data: CFDataRef) -> CFIndex;
80    pub fn CFDataGetBytePtr(data: CFDataRef) -> *const u8;
81    pub fn CFDataGetTypeID() -> CFTypeID;
82
83    pub fn CFArrayCreate(
84        allocator: CFAllocatorRef,
85        values: *const *const c_void,
86        num_values: CFIndex,
87        call_backs: *const c_void,
88    ) -> CFArrayRef;
89    pub fn CFArrayGetCount(array: CFArrayRef) -> CFIndex;
90    pub fn CFArrayGetValueAtIndex(array: CFArrayRef, index: CFIndex) -> *const c_void;
91    pub fn CFArrayGetTypeID() -> CFTypeID;
92
93    pub fn CFDictionaryCreateMutable(
94        allocator: CFAllocatorRef,
95        capacity: CFIndex,
96        key_call_backs: *const c_void,
97        value_call_backs: *const c_void,
98    ) -> CFMutableDictionaryRef;
99    pub fn CFDictionarySetValue(
100        dictionary: CFMutableDictionaryRef,
101        key: *const c_void,
102        value: *const c_void,
103    );
104    pub fn CFDictionaryGetValue(dictionary: CFDictionaryRef, key: *const c_void) -> *const c_void;
105    pub fn CFDictionaryGetCount(dictionary: CFDictionaryRef) -> CFIndex;
106    pub fn CFDictionaryGetKeysAndValues(
107        dictionary: CFDictionaryRef,
108        keys: *mut *const c_void,
109        values: *mut *const c_void,
110    );
111    pub fn CFDictionaryGetTypeID() -> CFTypeID;
112
113    pub fn CFBooleanGetValue(boolean: CFBooleanRef) -> bool;
114    pub fn CFBooleanGetTypeID() -> CFTypeID;
115
116    pub fn CFNumberGetValue(number: CFNumberRef, number_type: i64, value_ptr: *mut c_void) -> bool;
117    pub fn CFNumberGetTypeID() -> CFTypeID;
118
119    pub fn CFErrorCopyDescription(err: CFErrorRef) -> CFStringRef;
120
121    pub fn SecCopyErrorMessageString(status: OSStatus, reserved: *mut c_void) -> CFStringRef;
122
123    pub static kSecClass: CFStringRef;
124    pub static kSecClassGenericPassword: CFStringRef;
125    pub static kSecAttrAccount: CFStringRef;
126    pub static kSecAttrService: CFStringRef;
127    pub static kSecValueData: CFStringRef;
128    pub static kSecReturnData: CFStringRef;
129    pub static kSecReturnAttributes: CFStringRef;
130    pub static kSecMatchLimit: CFStringRef;
131    pub static kSecMatchLimitOne: CFStringRef;
132    pub static kSecMatchLimitAll: CFStringRef;
133
134    pub fn SecItemCopyMatching(query: CFDictionaryRef, result: *mut CFTypeRef) -> OSStatus;
135    pub fn SecItemAdd(attributes: CFDictionaryRef, result: *mut CFTypeRef) -> OSStatus;
136    pub fn SecItemUpdate(query: CFDictionaryRef, attributes_to_update: CFDictionaryRef)
137        -> OSStatus;
138    pub fn SecItemDelete(query: CFDictionaryRef) -> OSStatus;
139
140    pub fn SecCertificateCreateWithData(
141        allocator: CFAllocatorRef,
142        data: CFDataRef,
143    ) -> SecCertificateRef;
144    pub fn SecCertificateCopySubjectSummary(certificate: SecCertificateRef) -> CFStringRef;
145    pub fn SecCertificateCopyData(certificate: SecCertificateRef) -> CFDataRef;
146    pub fn SecCertificateCopyKey(certificate: SecCertificateRef) -> SecKeyRef;
147
148    pub fn SecPolicyCreateBasicX509() -> SecPolicyRef;
149    pub fn SecPolicyCreateSSL(server: Boolean, hostname: CFStringRef) -> SecPolicyRef;
150
151    pub fn SecTrustCreateWithCertificates(
152        certificates: CFTypeRef,
153        policies: CFTypeRef,
154        trust: *mut SecTrustRef,
155    ) -> OSStatus;
156    pub fn SecTrustSetPolicies(trust: SecTrustRef, policies: CFTypeRef) -> OSStatus;
157    pub fn SecTrustEvaluateWithError(trust: SecTrustRef, error: *mut CFErrorRef) -> Boolean;
158
159    pub fn SecCodeCopySelf(flags: SecCSFlags, self_code: *mut SecCodeRef) -> OSStatus;
160    pub static kSecCodeInfoIdentifier: CFStringRef;
161    pub static kSecCodeInfoTeamIdentifier: CFStringRef;
162    pub static kSecCodeInfoEntitlementsDict: CFStringRef;
163    pub static kSecCodeInfoStatus: CFStringRef;
164    pub fn SecCodeCopySigningInformation(
165        code: SecStaticCodeRef,
166        flags: SecCSFlags,
167        information: *mut CFDictionaryRef,
168    ) -> OSStatus;
169
170    pub static kSecRandomDefault: SecRandomRef;
171    pub fn SecRandomCopyBytes(rnd: SecRandomRef, count: size_t, bytes: *mut c_void) -> i32;
172}