Skip to content

Commit 659c4bf

Browse files
committed
Verify X-Hub-Signature-256
1 parent 9609b8b commit 659c4bf

File tree

4 files changed

+14
-23
lines changed

4 files changed

+14
-23
lines changed

Cargo.lock

Lines changed: 3 additions & 15 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 & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -46,9 +46,8 @@ cron = { version = "0.15.0" }
4646
bytes = "1.1.0"
4747
structopt = "0.3.26"
4848
hmac = "0.12.1"
49-
sha1 = "0.10.6"
50-
digest = "0.10.7"
5149
subtle = "2.6.1"
50+
sha2 = "0.10.9"
5251

5352
[dependencies.serde]
5453
version = "1"

src/main.rs

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -190,20 +190,22 @@ async fn serve_req(
190190
.unwrap());
191191
};
192192
log::debug!("event={}", event);
193-
let signature = if let Some(sig) = req.headers.get("X-Hub-Signature") {
193+
let signature = if let Some(sig) = req.headers.get("X-Hub-Signature-256") {
194194
match sig.to_str().ok() {
195195
Some(v) => v,
196196
None => {
197197
return Ok(Response::builder()
198198
.status(StatusCode::BAD_REQUEST)
199-
.body(Body::from("X-Hub-Signature header must be UTF-8 encoded"))
199+
.body(Body::from(
200+
"X-Hub-Signature-256 header must be UTF-8 encoded",
201+
))
200202
.unwrap());
201203
}
202204
}
203205
} else {
204206
return Ok(Response::builder()
205207
.status(StatusCode::BAD_REQUEST)
206-
.body(Body::from("X-Hub-Signature header must be set"))
208+
.body(Body::from("X-Hub-Signature-256 header must be set"))
207209
.unwrap());
208210
};
209211
log::debug!("signature={}", signature);

src/payload.rs

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
use hmac::{Hmac, Mac};
2-
use sha1::Sha1;
2+
use sha2::Sha256;
33
use std::fmt;
44

55
#[derive(Debug)]
@@ -14,7 +14,9 @@ impl fmt::Display for SignedPayloadError {
1414
impl std::error::Error for SignedPayloadError {}
1515

1616
pub fn assert_signed(signature: &str, payload: &[u8]) -> Result<(), SignedPayloadError> {
17-
let signature = signature.get("sha1=".len()..).ok_or(SignedPayloadError)?;
17+
let signature = signature
18+
.strip_prefix("sha256=")
19+
.ok_or(SignedPayloadError)?;
1820
let signature = match hex::decode(&signature) {
1921
Ok(e) => e,
2022
Err(e) => {
@@ -23,7 +25,7 @@ pub fn assert_signed(signature: &str, payload: &[u8]) -> Result<(), SignedPayloa
2325
}
2426
};
2527

26-
let mut mac = Hmac::<Sha1>::new_from_slice(
28+
let mut mac = Hmac::<Sha256>::new_from_slice(
2729
std::env::var("GITHUB_WEBHOOK_SECRET")
2830
.expect("Missing GITHUB_WEBHOOK_SECRET")
2931
.as_bytes(),

0 commit comments

Comments
 (0)