apple_security_framework/os/macos/
key.rs

1//! OSX specific functionality for keys.
2use std::ptr;
3
4use core_foundation::{
5    base::TCFType, data::CFData, dictionary::CFDictionary, error::CFError, string::CFString,
6};
7use security_framework_sys::{item::kSecAttrKeyType, key::SecKeyCreateFromData};
8
9use crate::key::{KeyType, SecKey};
10
11/// An extension trait adding OSX specific functionality to `SecKey`.
12pub trait SecKeyExt {
13    /// Creates a new `SecKey` from a buffer containing key data.
14    fn from_data(key_type: KeyType, key_data: &CFData) -> Result<SecKey, CFError>;
15}
16
17impl SecKeyExt for SecKey {
18    fn from_data(key_type: KeyType, key_data: &CFData) -> Result<Self, CFError> {
19        unsafe {
20            let key = CFString::wrap_under_get_rule(kSecAttrKeyType);
21            let dict = CFDictionary::from_CFType_pairs(&[(key, key_type.to_str())]);
22
23            let mut err = ptr::null_mut();
24            let key = SecKeyCreateFromData(
25                dict.as_concrete_TypeRef(),
26                key_data.as_concrete_TypeRef(),
27                &mut err,
28            );
29            if key.is_null() {
30                Err(CFError::wrap_under_create_rule(err))
31            } else {
32                Ok(Self::wrap_under_create_rule(key))
33            }
34        }
35    }
36}