security_framework/os/macos/
key.rs

1//! OSX specific functionality for keys.
2use 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
13/// An extension trait adding OSX specific functionality to `SecKey`.
14pub trait SecKeyExt {
15    /// Creates a new `SecKey` from a buffer containing key data.
16    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}