# Keychain Services for Rust 🔐 iqlusion [![Crate][crate-image]][crate-link] [![Build Status][build-image]][build-link] [![Apache 2.0 Licensed][license-image]][license-link] ![Maintenance Status: Experimental][maintenance-image] Rust binding for macOS Keychain Services, including TouchID-guarded access to cryptographic keys stored in the Secure Enclave Processor (SEP). This binding aims to provide a thin wrapper using largely the same type names as Keychain Services itself, but also provide a safe, mostly idiomatic API which does not rely on e.g. Core Foundation types. **NOTE:** This is an unofficial binding which is in no way affiliated with Apple! [Documentation] ## Status This crate is **experimental** and may have bugs/memory safety issues. *USE AT YOUR OWN RISK!* Below is a rough outline of the Keychain Service API and what is supported by this crate: - [ ] Keychains (`SecKeychain`) - [x] Creating keychains - [x] Deleting keychains - [ ] Open keychain (`SecKeychainOpen`) - [ ] Keychain status (`SecKeychainGetStatus`) - [ ] Keychain version (`SecKeychainGetVersion`) - [ ] Set default keychain (`SecKeychainSetDefault`) - [ ] Keychain Items (`SecKeychainItem`) - [x] Creating keychain items - [x] Fetching keychain items - [x] Getting keychain item attributes - [ ] Deleting keychain items - [ ] Certificates / Identities (`SecCertificate`) - [ ] Creating certificates - [ ] Deleting certificates - [ ] Querying certificates - [ ] Signing certificates - [ ] Cryptographic keys (`SecKey`) - [x] Generating cryptographic keys - [ ] Importing cryptographic keys - [x] Exporting cryptographic keys - [ ] Deleting cryptographic keys - [x] Querying cryptographic keys - [x] Querying cryptographic key attributes - [x] Digital signatures (ECDSA/RSA) - [ ] Encryption - [x] Passwords - [x] Creating passwords - [x] Querying passwords - [ ] Deleting passwords ## Tests This crate has two suites of tests: - Core: `cargo test` - run a minimal set of tests (e.g. in CI) that work everywhere, but don't cover all functionality. - Interactive: `cargo test --features=interactive-tests --no-run` compile tests which require user interactions, and additionally must be signed by macOS's code signing in order to work. See code signing notes. ## Code Signing The Keychain Service API requires signed code to access much of its functionality. Accessing many APIs from an unsigned app will return an `ErrorKind::MissingEntitlement`. Follow the instructions here to create a self-signed code signing certificate: You will need to use the [codesign] command-line utility (or XCode) to sign your code before it will be able to access most Keychain Services API functionality. ## License Licensed under either of * Apache License, Version 2.0 ([LICENSE-APACHE](LICENSE-APACHE) or http://www.apache.org/licenses/LICENSE-2.0) * MIT license ([LICENSE-MIT](LICENSE-MIT) or http://opensource.org/licenses/MIT) at your option. ### Contribution Unless you explicitly state otherwise, any contribution intentionally submitted for inclusion in the work by you shall be dual licensed as above, without any additional terms or conditions. [crate-image]: https://img.shields.io/crates/v/keychain-services.svg [crate-link]: https://crates.io/crates/keychain-services [build-image]: https://travis-ci.org/iqlusioninc/keychain-services.rs.svg?branch=master [build-link]: https://travis-ci.org/iqlusioninc/keychain-services.rs [license-image]: https://img.shields.io/badge/license-Apache2.0/MIT-blue.svg [license-link]: https://github.com/iqlusioninc/keychain-services.rs/blob/master/LICENSE-APACHE [maintenance-image]: https://img.shields.io/badge/maintenance-experimental-blue.svg [Documentation]: https://keychain-services.rs/docs/ [codesign]: https://developer.apple.com/library/archive/documentation/Security/Conceptual/CodeSigningGuide/Procedures/Procedures.html#//apple_ref/doc/uid/TP40005929-CH4-SW4