aboutsummaryrefslogtreecommitdiff
path: root/src/api/common/signature/streaming.rs
diff options
context:
space:
mode:
authorAlex Auvolat <lx@deuxfleurs.fr>2025-02-18 12:00:41 +0100
committerAlex Auvolat <lx@deuxfleurs.fr>2025-02-18 12:00:41 +0100
commitf8b0817ddcfea9c537cb4b8e3a4d62bf394db3a0 (patch)
tree8ab38e0b74c7c8c2f02ffec4a8057896eb3a045d /src/api/common/signature/streaming.rs
parent21c0dda16a9a97412cfd5c0232c382388d25ec56 (diff)
downloadgarage-f8b0817ddcfea9c537cb4b8e3a4d62bf394db3a0.tar.gz
garage-f8b0817ddcfea9c537cb4b8e3a4d62bf394db3a0.zip
api: streaming signature: fix trailer parsing
Diffstat (limited to 'src/api/common/signature/streaming.rs')
-rw-r--r--src/api/common/signature/streaming.rs23
1 files changed, 13 insertions, 10 deletions
diff --git a/src/api/common/signature/streaming.rs b/src/api/common/signature/streaming.rs
index 3ffc5b2f..6afc2621 100644
--- a/src/api/common/signature/streaming.rs
+++ b/src/api/common/signature/streaming.rs
@@ -24,6 +24,11 @@ pub fn parse_streaming_body(
region: &str,
service: &str,
) -> Result<Request<ReqBody>, Error> {
+ debug!(
+ "Content signature mode: {:?}",
+ checked_signature.content_sha256_header
+ );
+
let expected_checksums = ExpectedChecksums {
sha256: match &checked_signature.content_sha256_header {
ContentSha256Header::Sha256Checksum(sha256) => Some(*sha256),
@@ -243,7 +248,7 @@ mod payload {
let (input, header_value) = try_parse!(take_while(
|c: u8| c.is_ascii_alphanumeric() || b"+/=".contains(&c)
)(input));
- let (input, _) = try_parse!(tag(b"\n")(input));
+ let (input, _) = try_parse!(tag(b"\r\n")(input));
Ok((
input,
@@ -257,15 +262,7 @@ mod payload {
pub fn parse_signed(input: &[u8]) -> nom::IResult<&[u8], Self, Error<&[u8]>> {
let (input, trailer) = Self::parse_content(input)?;
- let (input, _) = try_parse!(tag(b"\r\n\r\n")(input));
-
- Ok((input, trailer))
- }
- pub fn parse_unsigned(input: &[u8]) -> nom::IResult<&[u8], Self, Error<&[u8]>> {
- let (input, trailer) = Self::parse_content(input)?;
-
- let (input, _) = try_parse!(tag(b"\r\n")(input));
-
+ let (input, _) = try_parse!(tag(b"x-amz-trailer-signature:")(input));
let (input, data) = try_parse!(map_res(hex_digit1, hex::decode)(input));
let signature = Hash::try_from(&data).ok_or(nom::Err::Failure(Error::BadSignature))?;
let (input, _) = try_parse!(tag(b"\r\n")(input));
@@ -278,6 +275,12 @@ mod payload {
},
))
}
+ pub fn parse_unsigned(input: &[u8]) -> nom::IResult<&[u8], Self, Error<&[u8]>> {
+ let (input, trailer) = Self::parse_content(input)?;
+ let (input, _) = try_parse!(tag(b"\r\n")(input));
+
+ Ok((input, trailer))
+ }
}
}