1 use core_foundation_sys::array::CFArrayRef;
2 use core_foundation_sys::base::{CFTypeRef, OSStatus};
3 use core_foundation_sys::data::CFDataRef;
4 use core_foundation_sys::dictionary::CFDictionaryRef;
5 use core_foundation_sys::string::CFStringRef;
6 use std::os::raw::c_uint;
7 
8 use crate::base::{SecAccessRef, SecKeychainRef};
9 
10 #[cfg(target_os = "macos")]
11 pub type SecExternalFormat = u32;
12 #[cfg(target_os = "macos")]
13 pub type SecExternalItemType = u32;
14 #[cfg(target_os = "macos")]
15 pub type SecItemImportExportFlags = u32;
16 #[cfg(target_os = "macos")]
17 pub type SecKeyImportExportFlags = u32;
18 
19 #[cfg(target_os = "macos")]
20 pub const kSecKeyImportOnlyOne: SecKeyImportExportFlags = 1;
21 #[cfg(target_os = "macos")]
22 pub const kSecKeySecurePassphrase: SecKeyImportExportFlags = 2;
23 #[cfg(target_os = "macos")]
24 pub const kSecKeyNoAccessControl: SecKeyImportExportFlags = 4;
25 
26 #[cfg(target_os = "macos")]
27 pub const SEC_KEY_IMPORT_EXPORT_PARAMS_VERSION: c_uint = 0;
28 
29 #[repr(C)]
30 #[derive(Copy, Clone)]
31 #[cfg(target_os = "macos")]
32 pub struct SecItemImportExportKeyParameters {
33     pub version: c_uint,
34     pub flags: SecKeyImportExportFlags,
35     pub passphrase: CFTypeRef,
36     pub alertTitle: CFStringRef,
37     pub alertPrompt: CFStringRef,
38     pub accessRef: SecAccessRef,
39     pub keyUsage: CFArrayRef,
40     pub keyAttributes: CFArrayRef,
41 }
42 
43 extern "C" {
44     #[cfg(target_os = "macos")]
45     pub fn SecItemImport(
46         importedData: CFDataRef,
47         fileNameOrExtension: CFStringRef,
48         inputFormat: *mut SecExternalFormat,
49         itemType: *mut SecExternalItemType,
50         flags: SecItemImportExportFlags,
51         keyParams: *const SecItemImportExportKeyParameters,
52         importKeychain: SecKeychainRef,
53         outItems: *mut CFArrayRef,
54     ) -> OSStatus;
55 
56     #[cfg(target_os = "macos")]
57     pub fn SecItemExport(
58         secItemOrArray: CFTypeRef,
59         outputFormat: SecExternalFormat,
60         flags: SecItemImportExportFlags,
61         keyParams: *const SecItemImportExportKeyParameters,
62         exportedData: *mut CFDataRef,
63     ) -> OSStatus;
64 
65     pub static kSecImportExportPassphrase: CFStringRef;
66     #[cfg(target_os = "macos")]
67     pub static kSecImportExportKeychain: CFStringRef;
68     #[cfg(target_os = "macos")]
69     pub static kSecImportExportAccess: CFStringRef;
70 
71     pub static kSecImportItemLabel: CFStringRef;
72     pub static kSecImportItemKeyID: CFStringRef;
73     pub static kSecImportItemTrust: CFStringRef;
74     pub static kSecImportItemCertChain: CFStringRef;
75     pub static kSecImportItemIdentity: CFStringRef;
76 
77     pub fn SecPKCS12Import(
78         pkcs12_data: CFDataRef,
79         options: CFDictionaryRef,
80         items: *mut CFArrayRef,
81     ) -> OSStatus;
82 }
83