diff options
Diffstat (limited to 'webhook/src/handler/tests')
| -rw-r--r-- | webhook/src/handler/tests/handler_integration.rs | 15 | ||||
| -rw-r--r-- | webhook/src/handler/tests/signature.rs | 17 | ||||
| -rw-r--r-- | webhook/src/handler/tests/utils.rs | 49 |
3 files changed, 27 insertions, 54 deletions
diff --git a/webhook/src/handler/tests/handler_integration.rs b/webhook/src/handler/tests/handler_integration.rs index 6031428..906b347 100644 --- a/webhook/src/handler/tests/handler_integration.rs +++ b/webhook/src/handler/tests/handler_integration.rs @@ -4,6 +4,7 @@ use ctor; use hyper::{Body, Method, Request, StatusCode}; use lazy_static::lazy_static; use serde_json::json; +use ed25519_dalek::Keypair; use common::{ config::test_init, @@ -35,7 +36,7 @@ static mut NATS: Option<Container<Cli, GenericImage>> = None; static mut SETTINGS: Option<Settings<Config>> = None; lazy_static! { - static ref KEYPAIR: (String, [u8; 64]) = generate_keypair(); + static ref TEST_KEYPAIR: Keypair = generate_keypair(); static ref DOCKER: Cli = Cli::default(); } @@ -59,7 +60,7 @@ unsafe fn init() { address: "0.0.0.0".to_string(), }, discord: crate::config::Discord { - public_key: KEYPAIR.0.clone(), + public_key: hex::encode(TEST_KEYPAIR.public.clone()), client_id: 0, }, }, @@ -103,7 +104,7 @@ async fn respond_to_pings() { let ping = json!({ "type": 1, "id": "0", "application_id": "0", "token": "random token", "version": 1 }).to_string(); let timestamp = "my datetime :)"; let signature_data = [timestamp.as_bytes().to_vec(), ping.as_bytes().to_vec()].concat(); - let signature = sign_message(signature_data, KEYPAIR.1); + let signature = sign_message(signature_data, &TEST_KEYPAIR); let req = Request::builder() .method(Method::POST) @@ -140,7 +141,7 @@ async fn response_500_when_no_nats_response() { let ping = json!({ "type": 2, "id": "0", "application_id": "0", "token": "random token", "version": 1 }).to_string(); let timestamp = "my datetime :)"; let signature_data = [timestamp.as_bytes().to_vec(), ping.as_bytes().to_vec()].concat(); - let signature = sign_message(signature_data, KEYPAIR.1); + let signature = sign_message(signature_data, &TEST_KEYPAIR); // we must timeout let req = Request::builder() @@ -166,7 +167,7 @@ async fn respond_from_nats_response() { let ping = json!({ "type": 2, "id": "0", "application_id": "0", "token": "random token", "version": 1 }).to_string(); let timestamp = "my datetime :)"; let signature_data = [timestamp.as_bytes().to_vec(), ping.as_bytes().to_vec()].concat(); - let signature = sign_message(signature_data, KEYPAIR.1); + let signature = sign_message(signature_data, &TEST_KEYPAIR); sub.with_handler(move |msg| { info!("Received {}", &msg); @@ -191,7 +192,7 @@ async fn response_400_when_invalid_json_body() { let ping = "{".to_string(); let timestamp = "my datetime :)"; let signature_data = [timestamp.as_bytes().to_vec(), ping.as_bytes().to_vec()].concat(); - let signature = sign_message(signature_data, KEYPAIR.1); + let signature = sign_message(signature_data, &TEST_KEYPAIR); let req = Request::builder() .method(Method::POST) @@ -212,7 +213,7 @@ async fn response_400_when_invalid_utf8_body() { let timestamp = "my datetime :)"; let signature_data = [timestamp.as_bytes().to_vec(), ping.to_vec()].concat(); - let signature = sign_message(signature_data, KEYPAIR.1); + let signature = sign_message(signature_data, &TEST_KEYPAIR); let req = Request::builder() .method(Method::POST) diff --git a/webhook/src/handler/tests/signature.rs b/webhook/src/handler/tests/signature.rs index 475e446..490143b 100644 --- a/webhook/src/handler/tests/signature.rs +++ b/webhook/src/handler/tests/signature.rs @@ -1,30 +1,33 @@ use crate::handler::signature::validate_signature; - +use ed25519_dalek::PublicKey; #[test] fn validate_signature_test() { let signature = "543ec3547d57f9ddb1ec4c5c36503ebf288ffda3da3d510764c9a49c2abb57690ef974c63d174771bdd2481de1066966f57abbec12a3ec171b9f6e2373837002"; - let public_key = "eefe0c24473737cb2035232e3b4eb91c206f0a14684168f3503f7d8316058d6f"; let content = "message de test incroyable".as_bytes().to_vec(); - assert!(validate_signature(public_key, &content, signature)) + let public_key = PublicKey::from_bytes(&hex::decode("eefe0c24473737cb2035232e3b4eb91c206f0a14684168f3503f7d8316058d6f").unwrap()).unwrap(); + + assert!(validate_signature(&public_key, &content, signature)) } #[test] fn validate_signature_reverse_test() { let signature = "543ec3547d57f9ddb1ec4c5c36503ebf288ffda3da3d510764c9a49c2abb57690ef974c63d174771bdd2481de1066966f57abbec12a3ec171b9f6e2373837002"; - let public_key = "c029eea18437292c87c62aec34e7d1bd4e38fe6126f3f7c446de6375dc666044"; + let public_key = PublicKey::from_bytes(&hex::decode("c029eea18437292c87c62aec34e7d1bd4e38fe6126f3f7c446de6375dc666044").unwrap()).unwrap(); + let content = "ceci est un test qui ne fonctionnera pas!" .as_bytes() .to_vec(); - assert!(!validate_signature(public_key, &content, signature)) + assert!(!validate_signature(&public_key, &content, signature)) } #[test] fn invalid_hex() { let signature = "zzz"; - let public_key = "zzz"; + let public_key = PublicKey::from_bytes(&hex::decode("c029eea18437292c87c62aec34e7d1bd4e38fe6126f3f7c446de6375dc666044").unwrap()).unwrap(); + let content = "ceci est un test qui ne fonctionnera pas!" .as_bytes() .to_vec(); - assert!(!validate_signature(public_key, &content, signature)) + assert!(!validate_signature(&public_key, &content, signature)) }
\ No newline at end of file diff --git a/webhook/src/handler/tests/utils.rs b/webhook/src/handler/tests/utils.rs index f8cdac2..5e59f09 100644 --- a/webhook/src/handler/tests/utils.rs +++ b/webhook/src/handler/tests/utils.rs @@ -1,46 +1,15 @@ -pub fn generate_keypair() -> ( - String, - [u8; libsodium_sys::crypto_sign_ed25519_SECRETKEYBYTES as usize], -) { - use libsodium_sys::crypto_sign_ed25519_keypair; - let pk_s: String; +use rand::rngs::OsRng; +use ed25519_dalek::{Signer, Keypair, Signature}; - let mut pk = [0; libsodium_sys::crypto_sign_ed25519_PUBLICKEYBYTES as usize]; - let mut sk = [0; libsodium_sys::crypto_sign_ed25519_SECRETKEYBYTES as usize]; - - let pk_p = pk.as_mut_ptr(); - let sk_p = sk.as_mut_ptr(); - - // generate keypair - unsafe { - if crypto_sign_ed25519_keypair(pk_p, sk_p) < 0 { - panic!("keypair generation failed!"); - } - }; - - pk_s = hex::encode(pk); - return (pk_s, sk); +pub fn generate_keypair() -> Keypair { + let mut csprng = OsRng{}; + Keypair::generate(&mut csprng) } pub fn sign_message( - msg: Vec<u8>, - sk: [u8; libsodium_sys::crypto_sign_ed25519_SECRETKEYBYTES as usize], + message: Vec<u8>, + keypair: &Keypair, ) -> String { - use libc::c_ulonglong; - use libsodium_sys::crypto_sign_ed25519_detached; - - let len = msg.len(); - let mut signature_len: c_ulonglong = 0; - let mut str = [0; 64]; - unsafe { - crypto_sign_ed25519_detached( - str.as_mut_ptr(), - &mut signature_len, - msg.as_ptr(), - len as u64, - sk.as_ptr(), - ); - }; - - return hex::encode(str); + let signature: Signature = keypair.sign(&message); + return hex::encode(signature.to_bytes()); }
\ No newline at end of file |
