tawasuyu

tawasuyu/brahman

Rust 332TOML 127JSON 17Markdown 154710 Definitions

⎇ 53dbdf0f1deea10d6fc567ea2b43e1e75d6d60cd crates/modules/semantic_dht/minga-store/src/keypair_file.rs Rust · 41 lines · 1.1 KB History Who touched what raw

chore: monorepo inicial con arje + minga + yahweh absorbidos 53dbdf0f1 · Sergio ·

1//! Persistencia en disco de keypairs cifrados.
2//!
3//! El cifrado en sí (AES-GCM + Argon2id) vive en `minga-core`, que es
4//! pure logic. Aquí solo se monta la parte de IO: leer/escribir
5//! bytes a un archivo.
6//!
7//! Layout del archivo: el blob crudo que produce
8//! `Keypair::encrypt(passphrase)`. 85 bytes total.
9
10use std::fs;
11use std::io;
12use std::path::Path;
13
14use minga_core::{Keypair, KeypairCryptoError};
15
16#[derive(Debug, thiserror::Error)]
17pub enum KeypairFileError {
18    #[error("io: {0}")]
19    Io(#[from] io::Error),
20
21    #[error("crypto: {0}")]
22    Crypto(#[from] KeypairCryptoError),
23}
24
25/// Guarda un keypair cifrado con la passphrase en `path`. Si el
26/// archivo ya existe, lo sobrescribe.
27pub fn save<P: AsRef<Path>>(
28    keypair: &Keypair,
29    path: P,
30    passphrase: &str,
31) -> Result<(), KeypairFileError> {
32    let blob = keypair.encrypt(passphrase)?;
33    fs::write(path, blob)?;
34    Ok(())
35}
36
37/// Carga un keypair desde un archivo cifrado.
38pub fn load<P: AsRef<Path>>(path: P, passphrase: &str) -> Result<Keypair, KeypairFileError> {
39    let blob = fs::read(path)?;
40    Ok(Keypair::decrypt(&blob, passphrase)?)
41}