Skip to content

Commit fd07fbb

Browse files
authored
Merge pull request #106 from mattsb42-aws/log-cleanup
Log cleanup
2 parents 8f047fb + a5415cb commit fd07fbb

File tree

6 files changed

+62
-19
lines changed

6 files changed

+62
-19
lines changed

src/aws_encryption_sdk/internal/formatting/deserialize.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -344,7 +344,7 @@ def deserialize_frame(stream, header, verifier=None):
344344
(sequence_number,) = unpack_values(">I", stream, verifier)
345345
final_frame = True
346346
else:
347-
_LOGGER.debug("Deserializing frame sequence number %s", int(sequence_number))
347+
_LOGGER.debug("Deserializing frame sequence number %d", int(sequence_number))
348348
frame_data["final_frame"] = final_frame
349349
frame_data["sequence_number"] = sequence_number
350350
(frame_iv,) = unpack_values(">{iv_len}s".format(iv_len=header.algorithm.iv_len), stream, verifier)

src/aws_encryption_sdk/internal/formatting/encryption_context.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -150,7 +150,7 @@ def deserialize_encryption_context(serialized_encryption_context):
150150
encryption_context = {}
151151

152152
dict_size, deserialized_size = read_short(source=serialized_encryption_context, offset=deserialized_size)
153-
_LOGGER.debug("Found %s keys", dict_size)
153+
_LOGGER.debug("Found %d keys", dict_size)
154154
for _ in range(dict_size):
155155
key_size, deserialized_size = read_short(source=serialized_encryption_context, offset=deserialized_size)
156156
key, deserialized_size = read_string(

src/aws_encryption_sdk/streaming_client.py

Lines changed: 14 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -214,7 +214,7 @@ def read(self, b=-1):
214214
if b is None or b < 0:
215215
b = -1
216216

217-
_LOGGER.debug("Stream read called, requesting %s bytes", b)
217+
_LOGGER.debug("Stream read called, requesting %d bytes", b)
218218
output = io.BytesIO()
219219

220220
if not self._message_prepped:
@@ -234,7 +234,7 @@ def read(self, b=-1):
234234
self.output_buffer = b""
235235

236236
self.bytes_read += output.tell()
237-
_LOGGER.debug("Returning %s bytes of %s bytes requested", output.tell(), b)
237+
_LOGGER.debug("Returning %d bytes of %d bytes requested", output.tell(), b)
238238
return output.getvalue()
239239

240240
def tell(self):
@@ -538,7 +538,7 @@ def _read_bytes_to_framed_body(self, b):
538538
:returns: Bytes read from source stream, encrypted, and serialized
539539
:rtype: bytes
540540
"""
541-
_LOGGER.debug("collecting %s bytes", b)
541+
_LOGGER.debug("collecting %d bytes", b)
542542
_b = b
543543

544544
if b > 0:
@@ -565,10 +565,11 @@ def _read_bytes_to_framed_body(self, b):
565565
# If finalizing on this pass, wait until final frame is written
566566
or (finalize and not final_frame_written)
567567
):
568-
is_final_frame = finalize and len(plaintext) < self.config.frame_length
569-
bytes_in_frame = min(len(plaintext), self.config.frame_length)
568+
current_plaintext_length = len(plaintext)
569+
is_final_frame = finalize and current_plaintext_length < self.config.frame_length
570+
bytes_in_frame = min(current_plaintext_length, self.config.frame_length)
570571
_LOGGER.debug(
571-
"Writing %s bytes into%s frame %s",
572+
"Writing %d bytes into%s frame %d",
572573
bytes_in_frame,
573574
" final" if is_final_frame else "",
574575
self.sequence_number,
@@ -719,7 +720,7 @@ def _read_header(self):
719720
and header.frame_length > self.config.max_body_length
720721
):
721722
raise CustomMaximumValueExceeded(
722-
"Frame Size in header found larger than custom value: {found} > {custom}".format(
723+
"Frame Size in header found larger than custom value: {found:d} > {custom:d}".format(
723724
found=header.frame_length, custom=self.config.max_body_length
724725
)
725726
)
@@ -758,7 +759,7 @@ def _prep_non_framed(self):
758759

759760
if self.config.max_body_length is not None and self.body_length > self.config.max_body_length:
760761
raise CustomMaximumValueExceeded(
761-
"Non-framed message content length found larger than custom value: {found} > {custom}".format(
762+
"Non-framed message content length found larger than custom value: {found:d} > {custom:d}".format(
762763
found=self.body_length, custom=self.config.max_body_length
763764
)
764765
)
@@ -792,7 +793,7 @@ def _read_bytes_from_non_framed_body(self, b):
792793
_LOGGER.debug("starting non-framed body read")
793794
# Always read the entire message for non-framed message bodies.
794795
bytes_to_read = self.body_end - self.source_stream.tell()
795-
_LOGGER.debug("%s bytes requested; reading %s bytes", b, bytes_to_read)
796+
_LOGGER.debug("%d bytes requested; reading %d bytes", b, bytes_to_read)
796797
ciphertext = self.source_stream.read(bytes_to_read)
797798

798799
if len(self.output_buffer) + len(ciphertext) < self.body_length:
@@ -821,13 +822,13 @@ def _read_bytes_from_framed_body(self, b):
821822
"""
822823
plaintext = b""
823824
final_frame = False
824-
_LOGGER.debug("collecting %s bytes", b)
825+
_LOGGER.debug("collecting %d bytes", b)
825826
while len(plaintext) < b and not final_frame:
826827
_LOGGER.debug("Reading frame")
827828
frame_data, final_frame = aws_encryption_sdk.internal.formatting.deserialize.deserialize_frame(
828829
stream=self.source_stream, header=self._header, verifier=self.verifier
829830
)
830-
_LOGGER.debug("Read complete for frame %s", frame_data.sequence_number)
831+
_LOGGER.debug("Read complete for frame %d", frame_data.sequence_number)
831832
if frame_data.sequence_number != self.last_sequence_number + 1:
832833
raise SerializationError("Malformed message: frames out of order")
833834
self.last_sequence_number += 1
@@ -846,7 +847,8 @@ def _read_bytes_from_framed_body(self, b):
846847
encrypted_data=frame_data,
847848
associated_data=associated_data,
848849
)
849-
_LOGGER.debug("bytes collected: %s", len(plaintext))
850+
plaintext_length = len(plaintext)
851+
_LOGGER.debug("bytes collected: %d", plaintext_length)
850852
if final_frame:
851853
_LOGGER.debug("Reading footer")
852854
self.footer = aws_encryption_sdk.internal.formatting.deserialize.deserialize_footer(

src/aws_encryption_sdk/structures.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,7 @@ class RawDataKey(object):
7575
"""
7676

7777
key_provider = attr.ib(hash=True, validator=attr.validators.instance_of(MasterKeyInfo))
78-
data_key = attr.ib(hash=True, validator=attr.validators.instance_of(bytes))
78+
data_key = attr.ib(hash=True, repr=False, validator=attr.validators.instance_of(bytes))
7979

8080

8181
@attr.s(hash=True)
@@ -89,7 +89,7 @@ class DataKey(object):
8989
"""
9090

9191
key_provider = attr.ib(hash=True, validator=attr.validators.instance_of(MasterKeyInfo))
92-
data_key = attr.ib(hash=True, validator=attr.validators.instance_of(bytes))
92+
data_key = attr.ib(hash=True, repr=False, validator=attr.validators.instance_of(bytes))
9393
encrypted_data_key = attr.ib(hash=True, validator=attr.validators.instance_of(bytes))
9494

9595

test/functional/test_f_aws_encryption_sdk_client.py

Lines changed: 21 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -324,7 +324,9 @@ def test_encrypt_ciphertext_message(frame_length, algorithm, encryption_context)
324324
(WrappingAlgorithm.RSA_OAEP_SHA1_MGF1, EncryptionKeyType.PUBLIC, EncryptionKeyType.PRIVATE),
325325
),
326326
)
327-
def test_encryption_cycle_raw_mkp(wrapping_algorithm, encryption_key_type, decryption_key_type):
327+
def test_encryption_cycle_raw_mkp(caplog, wrapping_algorithm, encryption_key_type, decryption_key_type):
328+
caplog.set_level(logging.DEBUG)
329+
328330
encrypting_key_provider = build_fake_raw_key_provider(wrapping_algorithm, encryption_key_type)
329331
decrypting_key_provider = build_fake_raw_key_provider(wrapping_algorithm, decryption_key_type)
330332
ciphertext, _ = aws_encryption_sdk.encrypt(
@@ -334,7 +336,10 @@ def test_encryption_cycle_raw_mkp(wrapping_algorithm, encryption_key_type, decry
334336
frame_length=0,
335337
)
336338
plaintext, _ = aws_encryption_sdk.decrypt(source=ciphertext, key_provider=decrypting_key_provider)
339+
337340
assert plaintext == VALUES["plaintext_128"]
341+
for member in encrypting_key_provider._members:
342+
assert repr(member.config.wrapping_key._wrapping_key)[2:-1] not in caplog.text
338343

339344

340345
@pytest.mark.skipif(
@@ -685,7 +690,11 @@ def _prep_plaintext_and_logs(log_catcher, plaintext_length):
685690

686691

687692
def _look_in_logs(log_catcher, plaintext):
693+
# Verify that no plaintext chunks are in the logs
688694
logs = log_catcher.text
695+
# look for all fake KMS data keys
696+
for args in VALUES["data_keys"].values():
697+
assert repr(args["plaintext"])[2:-1] not in logs
689698
# look for every possible 32-byte chunk
690699
start = 0
691700
end = 32
@@ -698,25 +707,33 @@ def _look_in_logs(log_catcher, plaintext):
698707
end += 1
699708

700709

710+
def _error_check(capsys_instance):
711+
# Verify that no error were caught and ignored.
712+
# The intent is to catch logging errors, but others will be caught as well.
713+
stderr = capsys_instance.readouterr().err
714+
assert "Call stack:" not in stderr
715+
716+
701717
@pytest.mark.parametrize("frame_size", (0, LINE_LENGTH // 2, LINE_LENGTH, LINE_LENGTH * 2))
702718
@pytest.mark.parametrize(
703719
"plaintext_length", (1, LINE_LENGTH // 2, LINE_LENGTH, int(LINE_LENGTH * 1.5), LINE_LENGTH * 2)
704720
)
705-
def test_plaintext_logs_oneshot(caplog, plaintext_length, frame_size):
721+
def test_plaintext_logs_oneshot(caplog, capsys, plaintext_length, frame_size):
706722
plaintext, key_provider = _prep_plaintext_and_logs(caplog, plaintext_length)
707723

708724
_ciphertext, _header = aws_encryption_sdk.encrypt(
709725
source=plaintext, key_provider=key_provider, frame_length=frame_size
710726
)
711727

712728
_look_in_logs(caplog, plaintext)
729+
_error_check(capsys)
713730

714731

715732
@pytest.mark.parametrize("frame_size", (0, LINE_LENGTH // 2, LINE_LENGTH, LINE_LENGTH * 2))
716733
@pytest.mark.parametrize(
717734
"plaintext_length", (1, LINE_LENGTH // 2, LINE_LENGTH, int(LINE_LENGTH * 1.5), LINE_LENGTH * 2)
718735
)
719-
def test_plaintext_logs_stream(caplog, plaintext_length, frame_size):
736+
def test_plaintext_logs_stream(caplog, capsys, plaintext_length, frame_size):
720737
plaintext, key_provider = _prep_plaintext_and_logs(caplog, plaintext_length)
721738

722739
ciphertext = b""
@@ -727,3 +744,4 @@ def test_plaintext_logs_stream(caplog, plaintext_length, frame_size):
727744
ciphertext += line
728745

729746
_look_in_logs(caplog, plaintext)
747+
_error_check(capsys)

test/unit/test_structures.py

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -84,3 +84,26 @@ def test_master_key_info_convert(kwargs, attribute, expected_value):
8484
test = MasterKeyInfo(**kwargs)
8585

8686
assert getattr(test, attribute) == expected_value
87+
88+
89+
@pytest.mark.parametrize(
90+
"cls, params",
91+
(
92+
(DataKey, ("key_provider", "data_key", "encrypted_data_key")),
93+
(RawDataKey, ("key_provider", "data_key")),
94+
(EncryptedDataKey, ("key_provider", "encrypted_data_key")),
95+
),
96+
)
97+
def test_data_key_repr_str(cls, params):
98+
data_key = b"plaintext data key ioasuwenvfiuawehnviuawh\x02\x99sd"
99+
encrypted_data_key = b"encrypted data key josaidejoawuief\x02\x99sd"
100+
base_params = dict(
101+
key_provider=MasterKeyInfo(provider_id="asdf", key_info=b"fdsa"),
102+
data_key=data_key,
103+
encrypted_data_key=encrypted_data_key,
104+
)
105+
test = cls(**{key: base_params[key] for key in params})
106+
data_key_check = repr(data_key)[2:-1]
107+
108+
assert data_key_check not in str(test)
109+
assert data_key_check not in repr(test)

0 commit comments

Comments
 (0)