|
1 | 1 | use anyhow::{anyhow, Context}; |
2 | | -use std::{fs::File, io::prelude::*, io::Write, path::Path, sync::Arc}; |
| 2 | +use std::{ |
| 3 | + fs::File, |
| 4 | + io::{prelude::*, Write}, |
| 5 | + path::{Path, PathBuf}, |
| 6 | + sync::Arc, |
| 7 | +}; |
3 | 8 |
|
4 | 9 | use mithril_common::{ |
5 | 10 | certificate_chain::{CertificateGenesisProducer, CertificateVerifier}, |
@@ -201,16 +206,25 @@ impl GenesisTools { |
201 | 206 | })?; |
202 | 207 | Ok(()) |
203 | 208 | } |
| 209 | + |
| 210 | + /// Export the genesis keypair to a folder and returns the paths to the files (secret key, verification_key) |
| 211 | + pub fn create_and_save_genesis_keypair(keypair_path: &Path) -> StdResult<(PathBuf, PathBuf)> { |
| 212 | + let genesis_signer = ProtocolGenesisSigner::create_non_deterministic_genesis_signer(); |
| 213 | + |
| 214 | + genesis_signer.export_keypair_to_files(keypair_path) |
| 215 | + } |
204 | 216 | } |
205 | 217 |
|
206 | 218 | #[cfg(test)] |
207 | 219 | mod tests { |
208 | 220 | use mithril_common::{ |
209 | 221 | certificate_chain::MithrilCertificateVerifier, |
210 | | - crypto_helper::ProtocolGenesisSigner, |
| 222 | + crypto_helper::{ |
| 223 | + ProtocolGenesisSecretKey, ProtocolGenesisSigner, ProtocolGenesisVerificationKey, |
| 224 | + }, |
211 | 225 | test_utils::{fake_data, MithrilFixtureBuilder, TempDir}, |
212 | 226 | }; |
213 | | - use std::path::PathBuf; |
| 227 | + use std::{fs::read_to_string, path::PathBuf}; |
214 | 228 |
|
215 | 229 | use crate::database::test_helper::main_db_connection; |
216 | 230 | use crate::test_tools::TestLogger; |
@@ -266,14 +280,13 @@ mod tests { |
266 | 280 | let test_dir = get_temp_dir("export_payload_to_sign"); |
267 | 281 | let payload_path = test_dir.join("payload.txt"); |
268 | 282 | let signed_payload_path = test_dir.join("payload-signed.txt"); |
269 | | - let genesis_secret_key_path = test_dir.join("genesis.sk"); |
270 | 283 | let genesis_signer = ProtocolGenesisSigner::create_deterministic_genesis_signer(); |
271 | 284 | let (genesis_tools, certificate_store, genesis_verifier, certificate_verifier) = |
272 | 285 | build_tools(&genesis_signer); |
273 | 286 |
|
274 | | - genesis_signer |
275 | | - .export_to_file(&genesis_secret_key_path) |
276 | | - .expect("exporting the secret key should not fail"); |
| 287 | + let (genesis_secret_key_path, _) = genesis_signer |
| 288 | + .export_keypair_to_files(&test_dir) |
| 289 | + .expect("exporting the keypair should not fail"); |
277 | 290 | genesis_tools |
278 | 291 | .export_payload_to_sign(&payload_path) |
279 | 292 | .expect("export_payload_to_sign should not fail"); |
@@ -327,4 +340,27 @@ mod tests { |
327 | 340 | "verify_genesis_certificate should successfully validate the genesis certificate", |
328 | 341 | ); |
329 | 342 | } |
| 343 | + |
| 344 | + #[test] |
| 345 | + fn test_create_and_save_genesis_keypair() { |
| 346 | + let temp_dir = get_temp_dir("test_create_and_save_genesis_keypair"); |
| 347 | + let (genesis_secret_key_path, genesis_verification_key_path) = |
| 348 | + GenesisTools::create_and_save_genesis_keypair(&temp_dir) |
| 349 | + .expect("Failed to create and save genesis keypair"); |
| 350 | + let genesis_secret_key = ProtocolGenesisSecretKey::from_json_hex( |
| 351 | + &read_to_string(&genesis_secret_key_path) |
| 352 | + .expect("Failed to read genesis secret key file"), |
| 353 | + ) |
| 354 | + .expect("Failed to parse genesis secret key"); |
| 355 | + let genesis_verification_key = ProtocolGenesisVerificationKey::from_json_hex( |
| 356 | + &read_to_string(&genesis_verification_key_path) |
| 357 | + .expect("Failed to read genesis verification key file"), |
| 358 | + ) |
| 359 | + .expect("Failed to parse genesis verification key"); |
| 360 | + let genesis_verifier = |
| 361 | + ProtocolGenesisSigner::from_secret_key(genesis_secret_key).create_genesis_verifier(); |
| 362 | + |
| 363 | + let expected_genesis_verification_key = genesis_verifier.to_verification_key(); |
| 364 | + assert_eq!(expected_genesis_verification_key, genesis_verification_key); |
| 365 | + } |
330 | 366 | } |
0 commit comments