1use core_foundation_sys::base::CFTypeID;
2use core_foundation_sys::data::CFDataRef;
3use core_foundation_sys::dictionary::CFDictionaryRef;
4use core_foundation_sys::error::CFErrorRef;
5use core_foundation_sys::string::CFStringRef;
6
7use crate::base::SecKeyRef;
8
9pub type SecKeyAlgorithm = CFStringRef;
10
11pub type SecKeyOperationType = u32;
12pub const kSecKeyOperationTypeSign: SecKeyOperationType = 0;
13pub const kSecKeyOperationTypeVerify: SecKeyOperationType = 1;
14pub const kSecKeyOperationTypeEncrypt: SecKeyOperationType = 2;
15pub const kSecKeyOperationTypeDecrypt: SecKeyOperationType = 3;
16pub const kSecKeyOperationTypeKeyExchange: SecKeyOperationType = 4;
17
18extern "C" {
19 pub fn SecKeyGetTypeID() -> CFTypeID;
20
21 pub fn SecKeyCreateRandomKey(parameters: CFDictionaryRef, error: *mut CFErrorRef) -> SecKeyRef;
22
23 pub fn SecKeyCreateWithData(
24 keyData: CFDataRef,
25 attributes: CFDictionaryRef,
26 error: *mut CFErrorRef,
27 ) -> SecKeyRef;
28
29 #[cfg(target_os = "macos")]
30 #[deprecated(note = "Deprecated by Apple. There's no replacement for symmetric keys")]
31 pub fn SecKeyCreateFromData(
32 parameters: CFDictionaryRef,
33 keyData: CFDataRef,
34 error: *mut CFErrorRef,
35 ) -> SecKeyRef;
36
37
38 pub fn SecKeyCopyExternalRepresentation(key: SecKeyRef, error: *mut CFErrorRef) -> CFDataRef;
39
40 pub fn SecKeyCopyAttributes(key: SecKeyRef) -> CFDictionaryRef;
41
42 pub fn SecKeyCopyPublicKey(key: SecKeyRef) -> SecKeyRef;
43
44
45 pub fn SecKeyCreateSignature(
46 key: SecKeyRef,
47 algorithm: SecKeyAlgorithm,
48 dataToSign: CFDataRef,
49 error: *mut CFErrorRef,
50 ) -> CFDataRef;
51
52
53 pub fn SecKeyVerifySignature(
54 key: SecKeyRef,
55 algorithm: SecKeyAlgorithm,
56 signedData: CFDataRef,
57 signature: CFDataRef,
58 error: *mut CFErrorRef,
59 ) -> core_foundation_sys::base::Boolean;
60
61
62 pub fn SecKeyCreateEncryptedData(
63 key: SecKeyRef,
64 algorithm: SecKeyAlgorithm,
65 plaintext: CFDataRef,
66 error: *mut CFErrorRef,
67 ) -> CFDataRef;
68
69
70 pub fn SecKeyCreateDecryptedData(
71 key: SecKeyRef,
72 algorithm: SecKeyAlgorithm,
73 ciphertext: CFDataRef,
74 error: *mut CFErrorRef,
75 ) -> CFDataRef;
76
77
78 pub fn SecKeyIsAlgorithmSupported(
79 key: SecKeyRef,
80 operation: SecKeyOperationType,
81 algorithm: SecKeyAlgorithm,
82 ) -> core_foundation_sys::base::Boolean;
83
84
85 pub fn SecKeyCopyKeyExchangeResult(
86 privateKey: SecKeyRef,
87 algorithm: SecKeyAlgorithm,
88 publicKey: SecKeyRef,
89 parameters: CFDictionaryRef,
90 error: *mut CFErrorRef,
91 ) -> CFDataRef;
92}
93
94macro_rules! names {
95 ($( $(# $meta:literal )* $i:ident => $x:ident),*) => {
96 extern "C" {
97 $($(#[cfg(feature = $meta)])* pub static $x: SecKeyAlgorithm;)*
98 }
99
100 #[non_exhaustive]
101 #[derive(Copy, Clone)]
102 pub enum Algorithm {
103 $( $(#[cfg(feature = $meta)])* $i, )*
104 }
105
106 impl From<Algorithm> for SecKeyAlgorithm {
107 fn from(m: Algorithm) -> Self {
108 unsafe { match m {
109 $( $(#[cfg(feature = $meta)])* Algorithm::$i => $x, )*
110 } }
111 }
112 }
113 }
114}
115
116names! {
117 ECIESEncryptionStandardX963SHA1AESGCM => kSecKeyAlgorithmECIESEncryptionStandardX963SHA1AESGCM,
118 ECIESEncryptionStandardX963SHA224AESGCM => kSecKeyAlgorithmECIESEncryptionStandardX963SHA224AESGCM,
119 ECIESEncryptionStandardX963SHA256AESGCM => kSecKeyAlgorithmECIESEncryptionStandardX963SHA256AESGCM,
120 ECIESEncryptionStandardX963SHA384AESGCM => kSecKeyAlgorithmECIESEncryptionStandardX963SHA384AESGCM,
121 ECIESEncryptionStandardX963SHA512AESGCM => kSecKeyAlgorithmECIESEncryptionStandardX963SHA512AESGCM,
122
123 ECIESEncryptionStandardVariableIVX963SHA224AESGCM => kSecKeyAlgorithmECIESEncryptionStandardVariableIVX963SHA224AESGCM,
124 ECIESEncryptionStandardVariableIVX963SHA256AESGCM => kSecKeyAlgorithmECIESEncryptionStandardVariableIVX963SHA256AESGCM,
125 ECIESEncryptionStandardVariableIVX963SHA384AESGCM => kSecKeyAlgorithmECIESEncryptionStandardVariableIVX963SHA384AESGCM,
126 ECIESEncryptionStandardVariableIVX963SHA512AESGCM => kSecKeyAlgorithmECIESEncryptionStandardVariableIVX963SHA512AESGCM,
127
128 ECIESEncryptionCofactorVariableIVX963SHA224AESGCM => kSecKeyAlgorithmECIESEncryptionCofactorVariableIVX963SHA224AESGCM,
129 ECIESEncryptionCofactorVariableIVX963SHA256AESGCM => kSecKeyAlgorithmECIESEncryptionCofactorVariableIVX963SHA256AESGCM,
130 ECIESEncryptionCofactorVariableIVX963SHA384AESGCM => kSecKeyAlgorithmECIESEncryptionCofactorVariableIVX963SHA384AESGCM,
131 ECIESEncryptionCofactorVariableIVX963SHA512AESGCM => kSecKeyAlgorithmECIESEncryptionCofactorVariableIVX963SHA512AESGCM,
132
133 ECIESEncryptionCofactorX963SHA1AESGCM => kSecKeyAlgorithmECIESEncryptionCofactorX963SHA1AESGCM,
134 ECIESEncryptionCofactorX963SHA224AESGCM => kSecKeyAlgorithmECIESEncryptionCofactorX963SHA224AESGCM,
135 ECIESEncryptionCofactorX963SHA256AESGCM => kSecKeyAlgorithmECIESEncryptionCofactorX963SHA256AESGCM,
136 ECIESEncryptionCofactorX963SHA384AESGCM => kSecKeyAlgorithmECIESEncryptionCofactorX963SHA384AESGCM,
137 ECIESEncryptionCofactorX963SHA512AESGCM => kSecKeyAlgorithmECIESEncryptionCofactorX963SHA512AESGCM,
138
139 ECDSASignatureRFC4754 => kSecKeyAlgorithmECDSASignatureRFC4754,
140
141 ECDSASignatureDigestX962 => kSecKeyAlgorithmECDSASignatureDigestX962,
142 ECDSASignatureDigestX962SHA1 => kSecKeyAlgorithmECDSASignatureDigestX962SHA1,
143 ECDSASignatureDigestX962SHA224 => kSecKeyAlgorithmECDSASignatureDigestX962SHA224,
144 ECDSASignatureDigestX962SHA256 => kSecKeyAlgorithmECDSASignatureDigestX962SHA256,
145 ECDSASignatureDigestX962SHA384 => kSecKeyAlgorithmECDSASignatureDigestX962SHA384,
146 ECDSASignatureDigestX962SHA512 => kSecKeyAlgorithmECDSASignatureDigestX962SHA512,
147
148 ECDSASignatureMessageX962SHA1 => kSecKeyAlgorithmECDSASignatureMessageX962SHA1,
149 ECDSASignatureMessageX962SHA224 => kSecKeyAlgorithmECDSASignatureMessageX962SHA224,
150 ECDSASignatureMessageX962SHA256 => kSecKeyAlgorithmECDSASignatureMessageX962SHA256,
151 ECDSASignatureMessageX962SHA384 => kSecKeyAlgorithmECDSASignatureMessageX962SHA384,
152 ECDSASignatureMessageX962SHA512 => kSecKeyAlgorithmECDSASignatureMessageX962SHA512,
153
154 ECDHKeyExchangeCofactor => kSecKeyAlgorithmECDHKeyExchangeCofactor,
155 ECDHKeyExchangeStandard => kSecKeyAlgorithmECDHKeyExchangeStandard,
156 ECDHKeyExchangeCofactorX963SHA1 => kSecKeyAlgorithmECDHKeyExchangeCofactorX963SHA1,
157 ECDHKeyExchangeStandardX963SHA1 => kSecKeyAlgorithmECDHKeyExchangeStandardX963SHA1,
158 ECDHKeyExchangeCofactorX963SHA224 => kSecKeyAlgorithmECDHKeyExchangeCofactorX963SHA224,
159 ECDHKeyExchangeCofactorX963SHA256 => kSecKeyAlgorithmECDHKeyExchangeCofactorX963SHA256,
160 ECDHKeyExchangeCofactorX963SHA384 => kSecKeyAlgorithmECDHKeyExchangeCofactorX963SHA384,
161 ECDHKeyExchangeCofactorX963SHA512 => kSecKeyAlgorithmECDHKeyExchangeCofactorX963SHA512,
162 ECDHKeyExchangeStandardX963SHA224 => kSecKeyAlgorithmECDHKeyExchangeStandardX963SHA224,
163 ECDHKeyExchangeStandardX963SHA256 => kSecKeyAlgorithmECDHKeyExchangeStandardX963SHA256,
164 ECDHKeyExchangeStandardX963SHA384 => kSecKeyAlgorithmECDHKeyExchangeStandardX963SHA384,
165 ECDHKeyExchangeStandardX963SHA512 => kSecKeyAlgorithmECDHKeyExchangeStandardX963SHA512,
166
167 RSAEncryptionRaw => kSecKeyAlgorithmRSAEncryptionRaw,
168 RSAEncryptionPKCS1 => kSecKeyAlgorithmRSAEncryptionPKCS1,
169
170 RSAEncryptionOAEPSHA1 => kSecKeyAlgorithmRSAEncryptionOAEPSHA1,
171 RSAEncryptionOAEPSHA224 => kSecKeyAlgorithmRSAEncryptionOAEPSHA224,
172 RSAEncryptionOAEPSHA256 => kSecKeyAlgorithmRSAEncryptionOAEPSHA256,
173 RSAEncryptionOAEPSHA384 => kSecKeyAlgorithmRSAEncryptionOAEPSHA384,
174 RSAEncryptionOAEPSHA512 => kSecKeyAlgorithmRSAEncryptionOAEPSHA512,
175
176 RSAEncryptionOAEPSHA1AESGCM => kSecKeyAlgorithmRSAEncryptionOAEPSHA1AESGCM,
177 RSAEncryptionOAEPSHA224AESGCM => kSecKeyAlgorithmRSAEncryptionOAEPSHA224AESGCM,
178 RSAEncryptionOAEPSHA256AESGCM => kSecKeyAlgorithmRSAEncryptionOAEPSHA256AESGCM,
179 RSAEncryptionOAEPSHA384AESGCM => kSecKeyAlgorithmRSAEncryptionOAEPSHA384AESGCM,
180 RSAEncryptionOAEPSHA512AESGCM => kSecKeyAlgorithmRSAEncryptionOAEPSHA512AESGCM,
181
182 RSASignatureRaw => kSecKeyAlgorithmRSASignatureRaw,
183
184 RSASignatureDigestPKCS1v15Raw => kSecKeyAlgorithmRSASignatureDigestPKCS1v15Raw,
185 RSASignatureDigestPKCS1v15SHA1 => kSecKeyAlgorithmRSASignatureDigestPKCS1v15SHA1,
186 RSASignatureDigestPKCS1v15SHA224 => kSecKeyAlgorithmRSASignatureDigestPKCS1v15SHA224,
187 RSASignatureDigestPKCS1v15SHA256 => kSecKeyAlgorithmRSASignatureDigestPKCS1v15SHA256,
188 RSASignatureDigestPKCS1v15SHA384 => kSecKeyAlgorithmRSASignatureDigestPKCS1v15SHA384,
189 RSASignatureDigestPKCS1v15SHA512 => kSecKeyAlgorithmRSASignatureDigestPKCS1v15SHA512,
190
191 RSASignatureMessagePKCS1v15SHA1 => kSecKeyAlgorithmRSASignatureMessagePKCS1v15SHA1,
192 RSASignatureMessagePKCS1v15SHA224 => kSecKeyAlgorithmRSASignatureMessagePKCS1v15SHA224,
193 RSASignatureMessagePKCS1v15SHA256 => kSecKeyAlgorithmRSASignatureMessagePKCS1v15SHA256,
194 RSASignatureMessagePKCS1v15SHA384 => kSecKeyAlgorithmRSASignatureMessagePKCS1v15SHA384,
195 RSASignatureMessagePKCS1v15SHA512 => kSecKeyAlgorithmRSASignatureMessagePKCS1v15SHA512,
196
197 RSASignatureDigestPSSSHA1 => kSecKeyAlgorithmRSASignatureDigestPSSSHA1,
198 RSASignatureDigestPSSSHA224 => kSecKeyAlgorithmRSASignatureDigestPSSSHA224,
199 RSASignatureDigestPSSSHA256 => kSecKeyAlgorithmRSASignatureDigestPSSSHA256,
200 RSASignatureDigestPSSSHA384 => kSecKeyAlgorithmRSASignatureDigestPSSSHA384,
201 RSASignatureDigestPSSSHA512 => kSecKeyAlgorithmRSASignatureDigestPSSSHA512,
202
203 RSASignatureMessagePSSSHA1 => kSecKeyAlgorithmRSASignatureMessagePSSSHA1,
204 RSASignatureMessagePSSSHA224 => kSecKeyAlgorithmRSASignatureMessagePSSSHA224,
205 RSASignatureMessagePSSSHA256 => kSecKeyAlgorithmRSASignatureMessagePSSSHA256,
206 RSASignatureMessagePSSSHA384 => kSecKeyAlgorithmRSASignatureMessagePSSSHA384,
207 RSASignatureMessagePSSSHA512 => kSecKeyAlgorithmRSASignatureMessagePSSSHA512
208}