security_framework/os/macos/
key.rs1use core_foundation::base::TCFType;
3use core_foundation::data::CFData;
4use core_foundation::dictionary::CFDictionary;
5use core_foundation::error::CFError;
6use core_foundation::string::CFString;
7use security_framework_sys::item::kSecAttrKeyType;
8use std::ptr;
9
10use crate::key::{KeyType, SecKey};
11
12#[deprecated(note = "Deprecated by Apple. There's no replacement for symmetric keys")]
14pub trait SecKeyExt {
15 fn from_data(key_type: KeyType, key_data: &CFData) -> Result<SecKey, CFError>;
17}
18
19#[allow(deprecated)]
20impl SecKeyExt for SecKey {
21 fn from_data(key_type: KeyType, key_data: &CFData) -> Result<Self, CFError> {
22 unsafe {
23 let key = CFString::wrap_under_get_rule(kSecAttrKeyType);
24 let dict = CFDictionary::from_CFType_pairs(&[(key, key_type.to_str())]);
25
26 let mut err = ptr::null_mut();
27 let key = security_framework_sys::key::SecKeyCreateFromData(
28 dict.as_concrete_TypeRef(),
29 key_data.as_concrete_TypeRef(),
30 &mut err,
31 );
32 if key.is_null() {
33 Err(CFError::wrap_under_create_rule(err))
34 } else {
35 Ok(Self::wrap_under_create_rule(key))
36 }
37 }
38 }
39}