81 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			Rust
		
	
	
	
	
	
			
		
		
	
	
			81 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			Rust
		
	
	
	
	
	
| //! The `signature` module provides functionality for public, and private keys.
 | |
| 
 | |
| use bs58;
 | |
| use generic_array::typenum::U64;
 | |
| use generic_array::GenericArray;
 | |
| use pubkey::Pubkey;
 | |
| use ring::signature::Ed25519KeyPair;
 | |
| use ring::{rand, signature};
 | |
| use serde_json;
 | |
| use std::error;
 | |
| use std::fmt;
 | |
| use std::fs::File;
 | |
| use untrusted::Input;
 | |
| 
 | |
| pub type Keypair = Ed25519KeyPair;
 | |
| 
 | |
| #[derive(Serialize, Deserialize, Clone, Copy, Default, Eq, PartialEq, Ord, PartialOrd, Hash)]
 | |
| pub struct Signature(GenericArray<u8, U64>);
 | |
| 
 | |
| impl Signature {
 | |
|     pub fn new(signature_slice: &[u8]) -> Self {
 | |
|         Signature(GenericArray::clone_from_slice(&signature_slice))
 | |
|     }
 | |
| 
 | |
|     pub fn verify(&self, pubkey_bytes: &[u8], message_bytes: &[u8]) -> bool {
 | |
|         let pubkey = Input::from(pubkey_bytes);
 | |
|         let message = Input::from(message_bytes);
 | |
|         let signature = Input::from(self.0.as_slice());
 | |
|         signature::verify(&signature::ED25519, pubkey, message, signature).is_ok()
 | |
|     }
 | |
| }
 | |
| 
 | |
| impl AsRef<[u8]> for Signature {
 | |
|     fn as_ref(&self) -> &[u8] {
 | |
|         &self.0[..]
 | |
|     }
 | |
| }
 | |
| 
 | |
| impl fmt::Debug for Signature {
 | |
|     fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
 | |
|         write!(f, "{}", bs58::encode(self.0).into_string())
 | |
|     }
 | |
| }
 | |
| 
 | |
| impl fmt::Display for Signature {
 | |
|     fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
 | |
|         write!(f, "{}", bs58::encode(self.0).into_string())
 | |
|     }
 | |
| }
 | |
| 
 | |
| pub trait KeypairUtil {
 | |
|     fn new() -> Self;
 | |
|     fn pubkey(&self) -> Pubkey;
 | |
| }
 | |
| 
 | |
| impl KeypairUtil for Ed25519KeyPair {
 | |
|     /// Return a new ED25519 keypair
 | |
|     fn new() -> Self {
 | |
|         let rng = rand::SystemRandom::new();
 | |
|         let pkcs8_bytes = Ed25519KeyPair::generate_pkcs8(&rng).expect("generate_pkcs8");
 | |
|         Ed25519KeyPair::from_pkcs8(Input::from(&pkcs8_bytes)).expect("from_pcks8")
 | |
|     }
 | |
| 
 | |
|     /// Return the public key for the given keypair
 | |
|     fn pubkey(&self) -> Pubkey {
 | |
|         Pubkey::new(self.public_key_bytes())
 | |
|     }
 | |
| }
 | |
| 
 | |
| pub fn read_pkcs8(path: &str) -> Result<Vec<u8>, Box<error::Error>> {
 | |
|     let file = File::open(path.to_string())?;
 | |
|     let pkcs8: Vec<u8> = serde_json::from_reader(file)?;
 | |
|     Ok(pkcs8)
 | |
| }
 | |
| 
 | |
| pub fn read_keypair(path: &str) -> Result<Keypair, Box<error::Error>> {
 | |
|     let pkcs8 = read_pkcs8(path)?;
 | |
|     let keypair = Ed25519KeyPair::from_pkcs8(Input::from(&pkcs8))?;
 | |
|     Ok(keypair)
 | |
| }
 |