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 security_framework_sys::key::SecKeyCreateFromData;
9use std::ptr;
10
11use crate::key::{KeyType, SecKey};
12
13pub trait SecKeyExt {
15 fn from_data(key_type: KeyType, key_data: &CFData) -> Result<SecKey, CFError>;
17}
18
19impl SecKeyExt for SecKey {
20 fn from_data(key_type: KeyType, key_data: &CFData) -> Result<Self, CFError> {
21 unsafe {
22 let key = CFString::wrap_under_get_rule(kSecAttrKeyType);
23 let dict = CFDictionary::from_CFType_pairs(&[(key, key_type.to_str())]);
24
25 let mut err = ptr::null_mut();
26 let key = SecKeyCreateFromData(
27 dict.as_concrete_TypeRef(),
28 key_data.as_concrete_TypeRef(),
29 &mut err,
30 );
31 if key.is_null() {
32 Err(CFError::wrap_under_create_rule(err))
33 } else {
34 Ok(Self::wrap_under_create_rule(key))
35 }
36 }
37 }
38}