diff options
author | Alex Auvolat <lx@deuxfleurs.fr> | 2025-02-18 12:00:41 +0100 |
---|---|---|
committer | Alex Auvolat <lx@deuxfleurs.fr> | 2025-02-18 12:00:41 +0100 |
commit | f8b0817ddcfea9c537cb4b8e3a4d62bf394db3a0 (patch) | |
tree | 8ab38e0b74c7c8c2f02ffec4a8057896eb3a045d /src/api/common/signature/streaming.rs | |
parent | 21c0dda16a9a97412cfd5c0232c382388d25ec56 (diff) | |
download | garage-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.rs | 23 |
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)) + } } } |