pub struct Keychain { /* private fields */ }Expand description
A keychain provides secure storage for private keys.
Keychains store private keys indexed by their public key fingerprints,
allowing easy lookup and signing operations. Keys must implement the
SignerKey trait, which includes both Sign and key identification
methods.
§Example
use rust_bottle::*;
use rand::rngs::OsRng;
let mut keychain = Keychain::new();
let rng = &mut OsRng;
let key1 = Ed25519Key::generate(rng);
let key2 = EcdsaP256Key::generate(rng);
keychain.add_key(key1);
keychain.add_key(key2);
let pub_key = keychain.signers().next().unwrap().public_key();
let signature = keychain.sign(rng, &pub_key, b"Message").unwrap();Implementations§
Source§impl Keychain
impl Keychain
Sourcepub fn add_key<K: SignerKey + 'static>(&mut self, key: K)
pub fn add_key<K: SignerKey + 'static>(&mut self, key: K)
Add a key to the keychain.
The key is indexed by its public key fingerprint. If a key with the same fingerprint already exists, it will be replaced.
§Arguments
key- A key implementingSignerKey(e.g.,Ed25519Key,EcdsaP256Key)
§Example
use rust_bottle::*;
use rand::rngs::OsRng;
let mut keychain = Keychain::new();
let rng = &mut OsRng;
let key = Ed25519Key::generate(rng);
keychain.add_key(key);Sourcepub fn add_keys<K: SignerKey + 'static>(&mut self, keys: Vec<K>)
pub fn add_keys<K: SignerKey + 'static>(&mut self, keys: Vec<K>)
Add multiple keys to the keychain at once.
§Arguments
keys- A vector of keys to add
§Example
use rust_bottle::*;
use rand::rngs::OsRng;
let mut keychain = Keychain::new();
let rng = &mut OsRng;
let key1 = Ed25519Key::generate(rng);
let key2 = Ed25519Key::generate(rng);
keychain.add_keys(vec![key1, key2]);Sourcepub fn get_key(&self, public_key: &[u8]) -> Result<&dyn SignerKey>
pub fn get_key(&self, public_key: &[u8]) -> Result<&dyn SignerKey>
Get a key by its public key.
The public key is hashed to find the corresponding private key in the keychain.
§Arguments
public_key- The public key to look up
§Returns
Ok(&dyn SignerKey)- Reference to the keyErr(BottleError::KeyNotFound)- If the key is not in the keychain
§Example
use rust_bottle::*;
use rand::rngs::OsRng;
let mut keychain = Keychain::new();
let rng = &mut OsRng;
let key = Ed25519Key::generate(rng);
let pub_key = key.public_key_bytes();
keychain.add_key(key);
let retrieved = keychain.get_key(&pub_key).unwrap();Sourcepub fn get_signer(&self, public_key: &[u8]) -> Result<&dyn SignerKey>
pub fn get_signer(&self, public_key: &[u8]) -> Result<&dyn SignerKey>
Sourcepub fn sign<R: RngCore>(
&self,
rng: &mut R,
public_key: &[u8],
message: &[u8],
) -> Result<Vec<u8>>
pub fn sign<R: RngCore>( &self, rng: &mut R, public_key: &[u8], message: &[u8], ) -> Result<Vec<u8>>
Sign a message with a specific key from the keychain.
This is a convenience method that looks up the key and signs the message in one operation.
§Arguments
rng- A random number generatorpublic_key- The public key of the key to use for signingmessage- The message to sign
§Returns
Ok(Vec<u8>)- Signature bytesErr(BottleError::KeyNotFound)- If the key is not in the keychainErr(BottleError::VerifyFailed)- If signing fails
§Example
use rust_bottle::*;
use rand::rngs::OsRng;
let mut keychain = Keychain::new();
let rng = &mut OsRng;
let key = Ed25519Key::generate(rng);
let pub_key = key.public_key_bytes();
keychain.add_key(key);
let signature = keychain.sign(rng, &pub_key, b"Message").unwrap();Sourcepub fn signers(&self) -> impl Iterator<Item = &dyn SignerKey>
pub fn signers(&self) -> impl Iterator<Item = &dyn SignerKey>
Iterate over all signers in the keychain.
§Returns
An iterator over all stored keys (as &dyn SignerKey)
§Example
use rust_bottle::*;
use rand::rngs::OsRng;
let mut keychain = Keychain::new();
let rng = &mut OsRng;
let key1 = Ed25519Key::generate(rng);
let key2 = EcdsaP256Key::generate(rng);
keychain.add_key(key1);
keychain.add_key(key2);
for signer in keychain.signers() {
let pub_key = signer.public_key();
println!("Key: {:?}", pub_key);
}