Skip to content

Commit f35ed45

Browse files
committed
switch from ring to openssl
1 parent d68b832 commit f35ed45

File tree

4 files changed

+33
-40
lines changed

4 files changed

+33
-40
lines changed

.appveyor.yml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ cache:
1414
install:
1515
- appveyor-retry appveyor DownloadFile https://win.rustup.rs/ -FileName rustup-init.exe
1616
- rustup-init.exe -y --default-toolchain %CHANNEL% --default-host %TARGET%
17+
- set OPENSSL_DIR=C:\OpenSSL-v111-Win64
1718
- set PATH=%PATH%;C:\Users\appveyor\.cargo\bin
1819
- rustc -V
1920
- cargo -V

Cargo.lock

Lines changed: 12 additions & 30 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,6 @@ rand = "0.5"
3939
ref_slice = "1.1.1"
4040
regex = "1.0"
4141
reqwest = "0.9"
42-
ring = "0.13"
4342
rusoto_core = "0.35.0"
4443
rusoto_credential = "0.14.0"
4544
rusoto_s3 = "0.35.0"
@@ -63,6 +62,7 @@ warp = "0.1.9"
6362
winapi = "0.3"
6463
log = "0.4.6"
6564
env_logger = "0.6.0"
65+
openssl = "0.10.16"
6666

6767
[dev-dependencies]
6868
assert_cmd = "0.10.1"

src/server/routes/webhooks/mod.rs

Lines changed: 19 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ use crate::server::Data;
99
use bytes::buf::Buf;
1010
use http::{HeaderMap, Response, StatusCode};
1111
use hyper::Body;
12-
use ring;
12+
use openssl::{hash::MessageDigest, pkey::PKey, sign::Signer};
1313
use serde_json;
1414
use std::str::FromStr;
1515
use std::sync::Arc;
@@ -127,6 +127,15 @@ fn process_command(
127127
}
128128

129129
fn verify_signature(secret: &str, payload: &[u8], raw_signature: &str) -> bool {
130+
macro_rules! try_false {
131+
($expr:expr) => {
132+
match $expr {
133+
Ok(res) => res,
134+
Err(_) => return false,
135+
}
136+
};
137+
};
138+
130139
// The signature must have a =
131140
if !raw_signature.contains('=') {
132141
return false;
@@ -152,16 +161,17 @@ fn verify_signature(secret: &str, payload: &[u8], raw_signature: &str) -> bool {
152161

153162
// Get the correct digest
154163
let digest = match *algorithm {
155-
"sha1" => &ring::digest::SHA1,
156-
_ => {
157-
// Unknown digest, return false
158-
return false;
159-
}
164+
"sha1" => MessageDigest::sha1(),
165+
// Unknown digest, return false
166+
_ => return false,
160167
};
161168

162-
// Verify the HMAC signature
163-
let key = ring::hmac::VerificationKey::new(digest, secret.as_bytes());
164-
ring::hmac::verify(&key, payload, &signature).is_ok()
169+
// Verify the HMAC using OpenSSL
170+
let key = try_false!(PKey::hmac(secret.as_bytes()));
171+
let mut signer = try_false!(Signer::new(digest, &key));
172+
try_false!(signer.update(payload));
173+
let hmac = try_false!(signer.sign_to_vec());
174+
openssl::memcmp::eq(&hmac, &signature)
165175
}
166176

167177
fn receive_endpoint(data: Arc<Data>, headers: HeaderMap, body: FullBody) -> Fallible<()> {

0 commit comments

Comments
 (0)