Skip to content

Commit 54a5445

Browse files
alextwoodsnateprewitt
authored andcommitted
Signing fixes
1 parent 469451e commit 54a5445

File tree

3 files changed

+36
-13
lines changed

3 files changed

+36
-13
lines changed

codegen/core/src/main/java/software/amazon/smithy/python/codegen/ClientGenerator.java

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -536,7 +536,6 @@ await sleep(retry_token.retry_delay)
536536

537537
writer.pushState(new SignRequestSection());
538538
if (context.applicationProtocol().isHttpProtocol() && supportsAuth) {
539-
writer.addStdlibImport("binascii", "hexlify");
540539
writer.addStdlibImport("re");
541540
writer.write("""
542541
# Step 7i: sign the request
@@ -557,12 +556,12 @@ await sleep(retry_token.retry_delay)
557556
logger.debug("Signed HTTP request: %s", context.transport_request)
558557
559558
# TODO - Move this to separate resolution/population function
560-
fields = context._transport_request.fields
559+
fields = context.transport_request.fields
561560
auth_value = fields["Authorization"].as_string() # type: ignore
562561
signature = re.split("Signature=", auth_value)[-1] # type: ignore
563-
context._properties["signature"] = hexlify(signature.encode('utf-8')) # type: ignore
564-
context._properties["identity"] = identity
565-
context._properties["signer_properties"] = auth_option.signer_properties
562+
context.properties["signature"] = signature.encode('utf-8')
563+
context.properties["identity"] = identity
564+
context.properties["signer_properties"] = auth_option.signer_properties
566565
""");
567566
}
568567
writer.popState();

codegen/core/src/main/java/software/amazon/smithy/python/codegen/integrations/RestJsonProtocolGenerator.java

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
import java.util.List;
88
import java.util.Set;
99
import software.amazon.smithy.aws.traits.protocols.RestJson1Trait;
10+
import software.amazon.smithy.model.knowledge.EventStreamIndex;
1011
import software.amazon.smithy.model.knowledge.HttpBinding;
1112
import software.amazon.smithy.model.node.ArrayNode;
1213
import software.amazon.smithy.model.node.ObjectNode;
@@ -156,6 +157,21 @@ protected void serializeDocumentBody(
156157
writer.popState();
157158
}
158159

160+
@Override
161+
protected void writeDefaultHeaders(GenerationContext context, PythonWriter writer, OperationShape operation) {
162+
var eventStreamIndex = EventStreamIndex.of(context.model());
163+
if (eventStreamIndex.getInputInfo(operation).isPresent()) {
164+
writer.addImport("smithy_http", "Field");
165+
writer.write(
166+
"Field(name=\"Content-Type\", values=[$S]),",
167+
"application/vnd.amazon.eventstream");
168+
writer.write(
169+
"Field(name=\"X-Amz-Content-SHA256\", values=[$S]),",
170+
"STREAMING-AWS4-HMAC-SHA256-EVENTS\"");
171+
}
172+
}
173+
174+
159175
@Override
160176
protected void serializePayloadBody(
161177
GenerationContext context,

packages/aws-sdk-signers/src/aws_sdk_signers/signers.py

Lines changed: 16 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -744,6 +744,9 @@ async def _format_canonical_payload(
744744
request: AWSRequest,
745745
signing_properties: SigV4SigningProperties,
746746
) -> str:
747+
if "X-Amz-Content-SHA256" in request.fields and len(request.fields["X-Amz-Content-SHA256"].values) == 1:
748+
return request.fields["X-Amz-Content-SHA256"].values[0]
749+
747750
payload_hash = await self._compute_payload_hash(
748751
request=request, signing_properties=signing_properties
749752
)
@@ -819,23 +822,26 @@ async def sign_event(
819822
new_signing_properties = SigV4SigningProperties( # type: ignore
820823
**self._signing_properties
821824
)
825+
# TODO: If date is in properties, parse a datetime from it.
826+
date_obj = datetime.datetime.now(datetime.UTC)
822827
if "date" not in new_signing_properties:
823-
date_obj = datetime.datetime.now(datetime.UTC)
824828
new_signing_properties["date"] = date_obj.strftime(
825829
SIGV4_TIMESTAMP_FORMAT
826830
)
827831

828832
timestamp = new_signing_properties["date"]
829-
headers: dict[str, str | bytes] = {":date": timestamp}
833+
headers: dict[str, str | bytes] = {":date": date_obj}
830834
encoder = event_encoder_cls()
831-
encoder.encode_headers(event_message.headers)
835+
encoder.encode_headers(headers)
832836
encoded_headers = encoder.get_result()
833837

838+
payload = event_message.encode()
839+
834840
string_to_sign = await self._event_string_to_sign(
835841
timestamp=timestamp,
836842
scope=self._scope(new_signing_properties),
837843
encoded_headers=encoded_headers,
838-
payload=event_message.payload,
844+
payload=payload,
839845
prior_signature=self._prior_signature,
840846
)
841847
event_signature = await self._sign_event(
@@ -844,10 +850,12 @@ async def sign_event(
844850
signing_properties=new_signing_properties,
845851
)
846852
headers[":chunk-signature"] = event_signature
847-
event_message.headers.update(headers) # type: ignore
853+
854+
event_message.headers = headers
855+
event_message.payload = payload
848856

849857
# set new prior signature before releasing the lock
850-
self._prior_signature = event_signature
858+
self._prior_signature = hexlify(event_signature)
851859

852860
return event_message
853861

@@ -861,10 +869,10 @@ async def _event_string_to_sign(
861869
prior_signature: bytes,
862870
) -> str:
863871
return (
864-
"AWS-HMAC-SHA256-PAYLOAD\n"
872+
"AWS4-HMAC-SHA256-PAYLOAD\n"
865873
f"{timestamp}\n"
866874
f"{scope}\n"
867-
f"{hexlify(prior_signature).decode('utf-8')}\n"
875+
f"{prior_signature.decode('utf-8')}\n"
868876
f"{sha256(encoded_headers).hexdigest()}\n"
869877
f"{sha256(payload).hexdigest()}"
870878
)

0 commit comments

Comments
 (0)