From 340196d7bb1d9debb25ba8b055cb69f8cef0327c Mon Sep 17 00:00:00 2001 From: Alan Hollis Date: Wed, 6 Feb 2019 13:31:09 +0000 Subject: [PATCH 1/2] Allow mid frame extraction WIP Minor untested modifications to allow frames to be extracted part way through. I'm not keen on the api I've used here, a better idea might be to create a method called set_expected_frame_range(frame_from, frame_to) and a separate method to disable the footer_validation(false) --- src/aws_encryption_sdk/streaming_client.py | 20 ++++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git a/src/aws_encryption_sdk/streaming_client.py b/src/aws_encryption_sdk/streaming_client.py index 2132ea177..21fc49b8f 100644 --- a/src/aws_encryption_sdk/streaming_client.py +++ b/src/aws_encryption_sdk/streaming_client.py @@ -727,6 +727,13 @@ def __init__(self, **kwargs): # pylint: disable=unused-argument,super-init-not- """Prepares necessary initial values.""" self.last_sequence_number = 0 self.__unframed_bytes_read = 0 + self.read_to_sequence_number = -1 + + def set_initial_sequence_number(self, initial_sequence_number): + self.last_sequence_number = initial_sequence_number + + def set_read_to_sequence_number(self, read_to_sequence_number): + self.read_to_sequence_number = read_to_sequence_number def _prep_message(self): """Performs initial message setup.""" @@ -868,7 +875,7 @@ def _read_bytes_from_framed_body(self, b): _LOGGER.debug("collecting %d bytes", b) while len(plaintext) < b and not final_frame: _LOGGER.debug("Reading frame") - frame_data, final_frame = deserialize_frame( + frame_data, footer_frame = deserialize_frame( stream=self.source_stream, header=self._header, verifier=self.verifier ) _LOGGER.debug("Read complete for frame %d", frame_data.sequence_number) @@ -892,7 +899,16 @@ def _read_bytes_from_framed_body(self, b): ) plaintext_length = len(plaintext) _LOGGER.debug("bytes collected: %d", plaintext_length) - if final_frame: + + if self.last_sequence_number == self.read_to_sequence_number or footer_frame: + _LOGGER.debug("Found all requested frames") + self.footer = True + final_frame = True + + if final_frame or footer_frame: + final_frame = True + + if footer_frame: _LOGGER.debug("Reading footer") self.footer = deserialize_footer(stream=self.source_stream, verifier=self.verifier) From 1c3cfb7696cc36e014c52ee25903439ef9f024f4 Mon Sep 17 00:00:00 2001 From: Alan Hollis Date: Tue, 12 Feb 2019 12:30:58 +0000 Subject: [PATCH 2/2] Temp set footer verification to None --- src/aws_encryption_sdk/streaming_client.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/aws_encryption_sdk/streaming_client.py b/src/aws_encryption_sdk/streaming_client.py index 21fc49b8f..f304dd11e 100644 --- a/src/aws_encryption_sdk/streaming_client.py +++ b/src/aws_encryption_sdk/streaming_client.py @@ -910,7 +910,7 @@ def _read_bytes_from_framed_body(self, b): if footer_frame: _LOGGER.debug("Reading footer") - self.footer = deserialize_footer(stream=self.source_stream, verifier=self.verifier) + self.footer = deserialize_footer(stream=self.source_stream, verifier=None) return plaintext