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