github_webhook_message_validator/
lib.rs1extern crate hmac;
5extern crate sha1;
6
7use hmac::{Hmac, Mac};
8use sha1::Sha1;
9
10
11pub fn validate(secret: &[u8], signature: &[u8], message: &[u8]) -> bool {
30 let mut hmac = Hmac::<Sha1>::new_from_slice(secret)
31 .expect("HMAC can take key of any size");
32 hmac.update(message);
33 hmac.verify_slice(signature).is_ok()
34}
35
36#[cfg(test)]
37mod test {
38 use validate;
39
40 #[test]
41 fn it_returns_true_when_signature_and_message_match() {
42 let signature = &vec![
43 0x73, 0x6d, 0x7f, 0x93, 0x42,
44 0xf2, 0xa7, 0xd2, 0x39, 0xaf,
45 0xa5, 0x51, 0x3a, 0x4b, 0xb2,
46 0x28, 0x3e, 0x0e, 0x15, 0x88
47 ];
48 let secret = b"some-secret";
49 let message = b"blah-blah-blah";
50
51 assert_eq!(validate(secret, signature, message), true);
52 }
53
54 #[test]
55 fn it_returns_false_when_signature_and_message_do_not_match() {
56 let signature = &vec![
57 0x31, 0x30, 0x2b, 0x00, 0xba,
58 0xd4, 0xd6, 0xd1, 0x10, 0xa1,
59 0x18, 0x82, 0x77, 0xc4, 0xd1,
60 0x06, 0x0c, 0xb2, 0xc3, 0x73
61 ];
62 let secret = b"some-secret";
63 let message = b"blah-blah-blah?";
64
65 assert_eq!(validate(secret, signature, message), false);
66 }
67}