use ed25519_dalek::{SigningKey, VerifyingKey};
use serde::{Deserialize, Serialize};
use super::machine_id::{machine_uid, MachineUid};
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct AccountDataForServer {
pub public_key: VerifyingKey,
pub hw_id: MachineUid,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct AccountDataForClient {
pub private_key: SigningKey,
pub public_key: VerifyingKey,
}
#[derive(Debug)]
pub struct AccountData {
pub for_server: AccountDataForServer,
pub for_client: AccountDataForClient,
}
pub fn key_pair() -> (SigningKey, VerifyingKey) {
let mut rng = rand::rngs::OsRng;
let private_key = SigningKey::generate(&mut rng);
let public_key = private_key.verifying_key();
(private_key, public_key)
}
pub fn generate_account_data_from_key_pair(
private_key: SigningKey,
public_key: VerifyingKey,
) -> anyhow::Result<AccountData> {
Ok(AccountData {
for_server: AccountDataForServer {
public_key,
hw_id: machine_uid()?,
},
for_client: AccountDataForClient {
private_key,
public_key,
},
})
}
pub fn generate_account_data() -> anyhow::Result<AccountData> {
let (private_key, public_key) = key_pair();
generate_account_data_from_key_pair(private_key, public_key)
}