added signature with keys from disk
This commit is contained in:
		
							parent
							
								
									a20d46bb49
								
							
						
					
					
						commit
						7c90c2ceda
					
				| @ -13,7 +13,7 @@ docker build -t hacker-challenge:latest . | |||||||
| 
 | 
 | ||||||
| docker ps -a | grep 'hacker-challenge' | awk '{ print $NF }' | xargs docker rm -f || true | docker ps -a | grep 'hacker-challenge' | awk '{ print $NF }' | xargs docker rm -f || true | ||||||
| 
 | 
 | ||||||
| for i in {0..10} | for i in {0..50} | ||||||
| do | do | ||||||
|   docker run -d --name "hacker-challenge_$i" \ |   docker run -d --name "hacker-challenge_$i" \ | ||||||
|     --env INIT_NODES="172.17.0.2 172.17.0.3 172.17.0.4" \ |     --env INIT_NODES="172.17.0.2 172.17.0.3 172.17.0.4" \ | ||||||
|  | |||||||
| @ -45,6 +45,12 @@ impl From<std::array::TryFromSliceError> for SigningError { | |||||||
|     } |     } | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | impl From<std::io::Error> for SigningError { | ||||||
|  |     fn from(_: std::io::Error) -> Self { | ||||||
|  |         Self::CorruptedKey | ||||||
|  |     } | ||||||
|  | } | ||||||
|  | 
 | ||||||
| type IP = String; | type IP = String; | ||||||
| 
 | 
 | ||||||
| impl std::fmt::Display for SigningError { | impl std::fmt::Display for SigningError { | ||||||
| @ -107,7 +113,7 @@ impl Store { | |||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     pub async fn tabled_disk_list(&self, page: u64) -> String { |     pub async fn tabled_disk_list(&self, page: u64) -> String { | ||||||
|         let mut offset = page.wrapping_mul(10); |         let mut offset = page.wrapping_mul(20); | ||||||
|         #[derive(Tabled)] |         #[derive(Tabled)] | ||||||
|         struct OutputRow { |         struct OutputRow { | ||||||
|             id: u64, |             id: u64, | ||||||
| @ -147,6 +153,20 @@ impl Store { | |||||||
|         Table::new(output).to_string() |         Table::new(output).to_string() | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|  |     pub async fn disk_sign_message_with_key( | ||||||
|  |         &self, | ||||||
|  |         message: &str, | ||||||
|  |         key_id: u64, | ||||||
|  |     ) -> Result<String, SigningError> { | ||||||
|  |         let crate::persistence::Node{keypair, ..} = | ||||||
|  |             self.persistence.get_node_by_id(key_id).await?; | ||||||
|  | 
 | ||||||
|  |         // let signature = format!("{:?}", signing_key.sign(message.as_bytes()));
 | ||||||
|  |         let signature = hex::encode(keypair.sign(message.as_bytes()).to_bytes()); | ||||||
|  | 
 | ||||||
|  |         Ok(signature) | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|     pub async fn sign_message_with_key( |     pub async fn sign_message_with_key( | ||||||
|         &self, |         &self, | ||||||
|         message: &str, |         message: &str, | ||||||
|  | |||||||
| @ -23,7 +23,7 @@ To access keys that are saved on disk, navigate to /disk. Disk entries are pagin | |||||||
| You can navigate to a specific page by using get params. Example: https://{ip}/disk?page={number}.
 | You can navigate to a specific page by using get params. Example: https://{ip}/disk?page={number}.
 | ||||||
| To sign a random message using a key from disk, use /disk/sign and send the key id as a get param: | To sign a random message using a key from disk, use /disk/sign and send the key id as a get param: | ||||||
| curl -G \ | curl -G \ | ||||||
|     --data-urlencode "pubkey_id=1337" \ |     --data-urlencode "key=1337" \ | ||||||
|     --data-urlencode "something=YOUR_MESSAGE_HERE" \ |     --data-urlencode "something=YOUR_MESSAGE_HERE" \ | ||||||
|     'IP_OF_THE_NODE:31372/disk/sign' |     'IP_OF_THE_NODE:31372/disk/sign' | ||||||
| 
 | 
 | ||||||
| @ -34,6 +34,7 @@ Good luck! | |||||||
| "#;
 | "#;
 | ||||||
| 
 | 
 | ||||||
| enum HTTPError { | enum HTTPError { | ||||||
|  |     NoKeyID, | ||||||
|     NoPubkey, |     NoPubkey, | ||||||
|     NoMessage, |     NoMessage, | ||||||
|     Store(SigningError), |     Store(SigningError), | ||||||
| @ -44,6 +45,7 @@ impl Writer for HTTPError { | |||||||
|     async fn write(self, _req: &mut Request, _depot: &mut Depot, res: &mut Response) { |     async fn write(self, _req: &mut Request, _depot: &mut Depot, res: &mut Response) { | ||||||
|         res.status_code(StatusCode::BAD_REQUEST); |         res.status_code(StatusCode::BAD_REQUEST); | ||||||
|         match self { |         match self { | ||||||
|  |             HTTPError::NoKeyID => res.render("key ID must be specified as a get param"), | ||||||
|             HTTPError::NoPubkey => res.render("pubkey must be specified as GET param"), |             HTTPError::NoPubkey => res.render("pubkey must be specified as GET param"), | ||||||
|             HTTPError::NoMessage => res.render("something must be specified as GET param"), |             HTTPError::NoMessage => res.render("something must be specified as GET param"), | ||||||
|             HTTPError::Store(e) => res.render(format!("{e}")), |             HTTPError::Store(e) => res.render(format!("{e}")), | ||||||
| @ -92,6 +94,25 @@ async fn disk_list(req: &mut Request, depot: &mut Depot) -> Result<String, HTTPE | |||||||
|     Ok(ds.tabled_disk_list(page).await) |     Ok(ds.tabled_disk_list(page).await) | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | #[handler] | ||||||
|  | async fn disk_sign(req: &mut Request, depot: &mut Depot) -> Result<String, HTTPError> { | ||||||
|  |     let ds = depot.obtain::<Arc<Store>>().unwrap(); | ||||||
|  |     let key = match req.query::<u64>("key") { | ||||||
|  |         Some(k) => k, | ||||||
|  |         None => return Err(HTTPError::NoKeyID), | ||||||
|  |     }; | ||||||
|  | 
 | ||||||
|  |     let something = match req.query::<String>("something") { | ||||||
|  |         Some(k) => k, | ||||||
|  |         None => return Err(HTTPError::NoMessage), | ||||||
|  |     }; | ||||||
|  | 
 | ||||||
|  |     match ds.disk_sign_message_with_key(&something, key).await { | ||||||
|  |         Ok(s) => Ok(s), | ||||||
|  |         Err(e) => Err(HTTPError::Store(e)), | ||||||
|  |     } | ||||||
|  | } | ||||||
|  | 
 | ||||||
| pub async fn init(ds: Arc<Store>) { | pub async fn init(ds: Arc<Store>) { | ||||||
|     let acceptor = TcpListener::new("0.0.0.0:31372").bind().await; |     let acceptor = TcpListener::new("0.0.0.0:31372").bind().await; | ||||||
|     let router = Router::new() |     let router = Router::new() | ||||||
| @ -102,7 +123,11 @@ pub async fn init(ds: Arc<Store>) { | |||||||
|                 .get(memory_list) |                 .get(memory_list) | ||||||
|                 .push(Router::with_path("sign").get(memory_sign)), |                 .push(Router::with_path("sign").get(memory_sign)), | ||||||
|         ) |         ) | ||||||
|         .push(Router::with_path("disk").get(disk_list)); |         .push( | ||||||
|  |             Router::with_path("disk") | ||||||
|  |                 .get(disk_list) | ||||||
|  |                 .push(Router::with_path("sign").get(disk_sign)), | ||||||
|  |         ); | ||||||
|     println!("{:?}", router); |     println!("{:?}", router); | ||||||
|     Server::new(acceptor).serve(router).await; |     Server::new(acceptor).serve(router).await; | ||||||
| } | } | ||||||
|  | |||||||
		Loading…
	
		Reference in New Issue
	
	Block a user