use std::io::Read;
use codas::{
codec::TEMP_BUFFER_SIZE,
types::cryptography::{
CryptoHasher, CryptoKeys, CryptoSigns, EncryptedData, HasCryptoPublicKey, PrivateKeyBytes,
},
};
use super::{open_file_or_stdin, CryptographyCommand};
pub fn execute_cryptography_command(command: CryptographyCommand) {
match command {
CryptographyCommand::Hash { source } => {
let mut bytes = open_file_or_stdin(source).expect("source doesn't exist");
let mut buffer = Vec::with_capacity(TEMP_BUFFER_SIZE);
let mut hasher = CryptoHasher::default();
bytes.read_to_end(&mut buffer).expect("source read failed");
hasher.write(&buffer);
let hash = hasher.finalize();
eprintln!("Blake3 Hash (HEX): {}", hash.to_hex());
}
CryptographyCommand::Keygen { passphrase } => {
let keys = CryptoKeys::generate();
eprintln!(
"Ed25519 Public Key (HEX): {}",
keys.public_key_bytes().to_hex()
);
let encrypted_keys = EncryptedData::new(passphrase.as_bytes(), &keys.into_private())
.expect("encryption failed");
eprintln!(
"Encrypted Ed25519 Private Key (HEX): {}",
encrypted_keys.to_hex()
);
}
CryptographyCommand::Sign {
keypair,
passphrase,
source,
} => {
let mut keys = std::fs::File::open(keypair).expect("keypair data doesn't exist");
let mut keys_string = String::new();
keys.read_to_string(&mut keys_string)
.expect("keypair data is empty");
let keys_string = keys_string.trim();
let encrypted_keys =
EncryptedData::from_hex(keys_string).expect("encrypted keypair is malformed");
let decrypted_keys = encrypted_keys
.decrypt(passphrase.as_bytes())
.expect("invalid keypair passphrase");
let decrypted_keys: PrivateKeyBytes =
PrivateKeyBytes::try_from(decrypted_keys.as_slice())
.expect("decrypted keypair is malformed");
let keys =
CryptoKeys::from_private(decrypted_keys).expect("decrypted keypair is invalid");
eprintln!(
"Decrypted Ed25519 Public Key (HEX): {}",
keys.public_key_bytes().to_hex()
);
let mut bytes = open_file_or_stdin(source).expect("source doesn't exist");
let mut buffer = Vec::with_capacity(TEMP_BUFFER_SIZE);
bytes.read_to_end(&mut buffer).expect("source read failed");
let signature = keys.sign(&[&buffer]).expect("signing failed");
eprintln!("ED25519 Signature (HEX): {}", signature.to_hex());
}
}
}