Skip to main content

security_framework_sys/
import_export.rs

1use core_foundation_sys::array::CFArrayRef;
2#[cfg(target_os = "macos")]
3use core_foundation_sys::base::CFTypeRef;
4use core_foundation_sys::base::OSStatus;
5use core_foundation_sys::data::CFDataRef;
6use core_foundation_sys::dictionary::CFDictionaryRef;
7use core_foundation_sys::string::CFStringRef;
8#[cfg(target_os = "macos")]
9use std::os::raw::c_uint;
10
11#[cfg(target_os = "macos")]
12use crate::base::{SecAccessRef, SecKeychainRef};
13
14#[cfg(target_os = "macos")]
15/// <https://developer.apple.com/documentation/security/secexternalformat>
16pub type SecExternalFormat = u32;
17#[cfg(target_os = "macos")]
18pub type SecExternalItemType = u32;
19#[cfg(target_os = "macos")]
20pub type SecItemImportExportFlags = u32;
21#[cfg(target_os = "macos")]
22pub type SecKeyImportExportFlags = u32;
23
24#[cfg(target_os = "macos")]
25pub const kSecKeyImportOnlyOne: SecKeyImportExportFlags = 1;
26#[cfg(target_os = "macos")]
27pub const kSecKeySecurePassphrase: SecKeyImportExportFlags = 2;
28#[cfg(target_os = "macos")]
29pub const kSecKeyNoAccessControl: SecKeyImportExportFlags = 4;
30
31#[cfg(target_os = "macos")]
32pub const SEC_KEY_IMPORT_EXPORT_PARAMS_VERSION: c_uint = 0;
33
34#[cfg(target_os = "macos")]
35mod sec_external_format {
36    use super::SecExternalFormat;
37    pub const kSecFormatUnknown: SecExternalFormat = 0;
38    /// a.k.a. X509 for public keys
39    pub const kSecFormatOpenSSL: SecExternalFormat = 1;
40    /// OpenSSH v.1
41    pub const kSecFormatSSH: SecExternalFormat = 2;
42    pub const kSecFormatBSAFE: SecExternalFormat = 3;
43    /// raw unformatted key bits
44    pub const kSecFormatRawKey: SecExternalFormat = 4;
45    pub const kSecFormatWrappedPKCS8: SecExternalFormat = 5;
46    /// traditional openssl
47    pub const kSecFormatWrappedOpenSSL: SecExternalFormat = 6;
48    /// OpenSSH v.1
49    pub const kSecFormatWrappedSSH: SecExternalFormat = 7;
50    pub const kSecFormatWrappedLSH: SecExternalFormat = 8;
51    /// DER encoded
52    pub const kSecFormatX509Cert: SecExternalFormat = 9;
53    /// sequence of certs and/or keys, implies PEM
54    pub const kSecFormatPEMSequence: SecExternalFormat = 10;
55    /// sequence of certs
56    pub const kSecFormatPKCS7: SecExternalFormat = 11;
57    /// set of certs and private keys
58    pub const kSecFormatPKCS12: SecExternalFormat = 12;
59    /// sequence of certs, form netscape-cert-sequence
60    pub const kSecFormatNetscapeCertSequence: SecExternalFormat = 13;
61    /// OpenSSH v.2
62    pub const kSecFormatSSHv2: SecExternalFormat = 14;
63}
64
65#[cfg(target_os = "macos")]
66pub use sec_external_format::*;
67
68#[repr(C)]
69#[derive(Copy, Clone)]
70#[cfg(target_os = "macos")]
71pub struct SecItemImportExportKeyParameters {
72    pub version: c_uint,
73    pub flags: SecKeyImportExportFlags,
74    pub passphrase: CFTypeRef,
75    pub alertTitle: CFStringRef,
76    pub alertPrompt: CFStringRef,
77    pub accessRef: SecAccessRef,
78    pub keyUsage: CFArrayRef,
79    pub keyAttributes: CFArrayRef,
80}
81
82extern "C" {
83    #[cfg(target_os = "macos")]
84    pub fn SecItemImport(
85        importedData: CFDataRef,
86        fileNameOrExtension: CFStringRef,
87        inputFormat: *mut SecExternalFormat,
88        itemType: *mut SecExternalItemType,
89        flags: SecItemImportExportFlags,
90        keyParams: *const SecItemImportExportKeyParameters,
91        importKeychain: SecKeychainRef,
92        outItems: *mut CFArrayRef,
93    ) -> OSStatus;
94
95    #[cfg(target_os = "macos")]
96    pub fn SecItemExport(
97        secItemOrArray: CFTypeRef,
98        outputFormat: SecExternalFormat,
99        flags: SecItemImportExportFlags,
100        keyParams: *const SecItemImportExportKeyParameters,
101        exportedData: *mut CFDataRef,
102    ) -> OSStatus;
103
104    pub static kSecImportExportPassphrase: CFStringRef;
105    #[cfg(target_os = "macos")]
106    pub static kSecImportExportKeychain: CFStringRef;
107    #[cfg(target_os = "macos")]
108    pub static kSecImportExportAccess: CFStringRef;
109
110    pub static kSecImportItemLabel: CFStringRef;
111    pub static kSecImportItemKeyID: CFStringRef;
112    pub static kSecImportItemTrust: CFStringRef;
113    pub static kSecImportItemCertChain: CFStringRef;
114    pub static kSecImportItemIdentity: CFStringRef;
115
116    pub fn SecPKCS12Import(
117        pkcs12_data: CFDataRef,
118        options: CFDictionaryRef,
119        items: *mut CFArrayRef,
120    ) -> OSStatus;
121}