Use concrete Error for Signer
This commit is contained in:
		
							parent
							
								
									0da9572627
								
							
						
					
					
						commit
						858806149a
					
				| @ -19,20 +19,25 @@ pub fn gen_keypair() -> (Vec<u8>, Vec<u8>) { | ||||
| 
 | ||||
| #[derive(Debug)] | ||||
| pub struct Error(); | ||||
| pub type Result<T> = std::result::Result<T, Error>; | ||||
| 
 | ||||
| impl From<openssl::error::ErrorStack> for Error { | ||||
|     fn from(_: openssl::error::ErrorStack) -> Self { | ||||
|         Self() | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| pub trait Signer { | ||||
|     type Error; | ||||
| 
 | ||||
|     fn get_key_id(&self) -> String; | ||||
| 
 | ||||
|     /// Sign some data with the signer keypair
 | ||||
|     fn sign(&self, to_sign: &str) -> Result<Vec<u8>, Self::Error>; | ||||
|     fn sign(&self, to_sign: &str) -> Result<Vec<u8>>; | ||||
|     /// Verify if the signature is valid
 | ||||
|     fn verify(&self, data: &str, signature: &[u8]) -> Result<bool, Self::Error>; | ||||
|     fn verify(&self, data: &str, signature: &[u8]) -> Result<bool>; | ||||
| } | ||||
| 
 | ||||
| pub trait Signable { | ||||
|     fn sign<T>(&mut self, creator: &T) -> Result<&mut Self, Error> | ||||
|     fn sign<T>(&mut self, creator: &T) -> Result<&mut Self> | ||||
|     where | ||||
|         T: Signer; | ||||
|     fn verify<T>(self, creator: &T) -> bool | ||||
| @ -46,7 +51,7 @@ pub trait Signable { | ||||
| } | ||||
| 
 | ||||
| impl Signable for serde_json::Value { | ||||
|     fn sign<T: Signer>(&mut self, creator: &T) -> Result<&mut serde_json::Value, Error> { | ||||
|     fn sign<T: Signer>(&mut self, creator: &T) -> Result<&mut serde_json::Value> { | ||||
|         let creation_date = Utc::now().to_rfc3339(); | ||||
|         let mut options = json!({ | ||||
|             "type": "RsaSignature2017", | ||||
|  | ||||
| @ -462,24 +462,22 @@ impl AsActor<&PlumeRocket> for Blog { | ||||
| } | ||||
| 
 | ||||
| impl sign::Signer for Blog { | ||||
|     type Error = Error; | ||||
| 
 | ||||
|     fn get_key_id(&self) -> String { | ||||
|         format!("{}#main-key", self.ap_url) | ||||
|     } | ||||
| 
 | ||||
|     fn sign(&self, to_sign: &str) -> Result<Vec<u8>> { | ||||
|         let key = self.get_keypair()?; | ||||
|     fn sign(&self, to_sign: &str) -> sign::Result<Vec<u8>> { | ||||
|         let key = self.get_keypair().map_err(|_| sign::Error())?; | ||||
|         let mut signer = Signer::new(MessageDigest::sha256(), &key)?; | ||||
|         signer.update(to_sign.as_bytes())?; | ||||
|         signer.sign_to_vec().map_err(Error::from) | ||||
|         signer.sign_to_vec().map_err(sign::Error::from) | ||||
|     } | ||||
| 
 | ||||
|     fn verify(&self, data: &str, signature: &[u8]) -> Result<bool> { | ||||
|     fn verify(&self, data: &str, signature: &[u8]) -> sign::Result<bool> { | ||||
|         let key = PKey::from_rsa(Rsa::public_key_from_pem(self.public_key.as_ref())?)?; | ||||
|         let mut verifier = Verifier::new(MessageDigest::sha256(), &key)?; | ||||
|         verifier.update(data.as_bytes())?; | ||||
|         verifier.verify(signature).map_err(Error::from) | ||||
|         verifier.verify(signature).map_err(sign::Error::from) | ||||
|     } | ||||
| } | ||||
| 
 | ||||
|  | ||||
| @ -17,7 +17,7 @@ extern crate serde_json; | ||||
| extern crate tantivy; | ||||
| 
 | ||||
| use once_cell::sync::Lazy; | ||||
| use plume_common::activity_pub::inbox::InboxError; | ||||
| use plume_common::activity_pub::{inbox::InboxError, sign}; | ||||
| use posts::PostEvent; | ||||
| use riker::actors::{channel, ActorSystem, ChannelRef, SystemBuilder}; | ||||
| use users::UserEvent; | ||||
| @ -79,6 +79,12 @@ impl From<openssl::error::ErrorStack> for Error { | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| impl From<sign::Error> for Error { | ||||
|     fn from(_: sign::Error) -> Self { | ||||
|         Error::Signature | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| impl From<diesel::result::Error> for Error { | ||||
|     fn from(err: diesel::result::Error) -> Self { | ||||
|         Error::Db(err) | ||||
|  | ||||
| @ -24,7 +24,7 @@ use plume_common::{ | ||||
|     activity_pub::{ | ||||
|         ap_accept_header, | ||||
|         inbox::{AsActor, AsObject, FromId}, | ||||
|         sign::{gen_keypair, Signer}, | ||||
|         sign::{gen_keypair, Error as SignError, Result as SignResult, Signer}, | ||||
|         ActivityStream, ApSignature, Id, IntoId, PublicKey, PUBLIC_VISIBILITY, | ||||
|     }, | ||||
|     utils, | ||||
| @ -1071,24 +1071,22 @@ impl AsObject<User, Delete, &DbConn> for User { | ||||
| } | ||||
| 
 | ||||
| impl Signer for User { | ||||
|     type Error = Error; | ||||
| 
 | ||||
|     fn get_key_id(&self) -> String { | ||||
|         format!("{}#main-key", self.ap_url) | ||||
|     } | ||||
| 
 | ||||
|     fn sign(&self, to_sign: &str) -> Result<Vec<u8>> { | ||||
|         let key = self.get_keypair()?; | ||||
|     fn sign(&self, to_sign: &str) -> SignResult<Vec<u8>> { | ||||
|         let key = self.get_keypair().map_err(|_| SignError())?; | ||||
|         let mut signer = sign::Signer::new(MessageDigest::sha256(), &key)?; | ||||
|         signer.update(to_sign.as_bytes())?; | ||||
|         signer.sign_to_vec().map_err(Error::from) | ||||
|         signer.sign_to_vec().map_err(SignError::from) | ||||
|     } | ||||
| 
 | ||||
|     fn verify(&self, data: &str, signature: &[u8]) -> Result<bool> { | ||||
|     fn verify(&self, data: &str, signature: &[u8]) -> SignResult<bool> { | ||||
|         let key = PKey::from_rsa(Rsa::public_key_from_pem(self.public_key.as_ref())?)?; | ||||
|         let mut verifier = sign::Verifier::new(MessageDigest::sha256(), &key)?; | ||||
|         verifier.update(data.as_bytes())?; | ||||
|         verifier.verify(signature).map_err(Error::from) | ||||
|         verifier.verify(signature).map_err(SignError::from) | ||||
|     } | ||||
| } | ||||
| 
 | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user