⎇ 53dbdf0f1deea10d6fc567ea2b43e1e75d6d60cd
crates/modules/semantic_dht/minga-store/src/keypair_file.rs
History
Who touched what
raw
chore: monorepo inicial con arje + minga + yahweh absorbidos
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}