# This file is dual licensed under the terms of the Apache License, Version # 2.0, and the BSD License. See the LICENSE file in the root of this repository # for complete details. from __future__ import absolute_import, division, print_function import pytest import six from cryptography.exceptions import AlreadyFinalized from cryptography.hazmat.primitives import padding class TestPKCS7(object): @pytest.mark.parametrize("size", [127, 4096, -2]) def test_invalid_block_size(self, size): with pytest.raises(ValueError): padding.PKCS7(size) @pytest.mark.parametrize( ("size", "padded"), [ (128, b"1111"), (128, b"1111111111111111"), (128, b"111111111111111\x06"), (128, b""), (128, b"\x06" * 6), (128, b"\x00" * 16), ], ) def test_invalid_padding(self, size, padded): unpadder = padding.PKCS7(size).unpadder() with pytest.raises(ValueError): unpadder.update(padded) unpadder.finalize() def test_non_bytes(self): padder = padding.PKCS7(128).padder() with pytest.raises(TypeError): padder.update(u"abc") unpadder = padding.PKCS7(128).unpadder() with pytest.raises(TypeError): unpadder.update(u"abc") def test_zany_py2_bytes_subclass(self): class mybytes(bytes): # noqa: N801 def __str__(self): return "broken" str(mybytes()) padder = padding.PKCS7(128).padder() padder.update(mybytes(b"abc")) unpadder = padding.PKCS7(128).unpadder() unpadder.update(mybytes(padder.finalize())) assert unpadder.finalize() == b"abc" @pytest.mark.parametrize( ("size", "unpadded", "padded"), [ (128, b"1111111111", b"1111111111\x06\x06\x06\x06\x06\x06"), ( 128, b"111111111111111122222222222222", b"111111111111111122222222222222\x02\x02", ), (128, b"1" * 16, b"1" * 16 + b"\x10" * 16), (128, b"1" * 17, b"1" * 17 + b"\x0F" * 15), ], ) def test_pad(self, size, unpadded, padded): padder = padding.PKCS7(size).padder() result = padder.update(unpadded) result += padder.finalize() assert result == padded @pytest.mark.parametrize( ("size", "unpadded", "padded"), [ (128, b"1111111111", b"1111111111\x06\x06\x06\x06\x06\x06"), ( 128, b"111111111111111122222222222222", b"111111111111111122222222222222\x02\x02", ), ], ) def test_unpad(self, size, unpadded, padded): unpadder = padding.PKCS7(size).unpadder() result = unpadder.update(padded) result += unpadder.finalize() assert result == unpadded def test_use_after_finalize(self): padder = padding.PKCS7(128).padder() b = padder.finalize() with pytest.raises(AlreadyFinalized): padder.update(b"") with pytest.raises(AlreadyFinalized): padder.finalize() unpadder = padding.PKCS7(128).unpadder() unpadder.update(b) unpadder.finalize() with pytest.raises(AlreadyFinalized): unpadder.update(b"") with pytest.raises(AlreadyFinalized): unpadder.finalize() def test_large_padding(self): padder = padding.PKCS7(2040).padder() padded_data = padder.update(b"") padded_data += padder.finalize() for i in six.iterbytes(padded_data): assert i == 255 unpadder = padding.PKCS7(2040).unpadder() data = unpadder.update(padded_data) data += unpadder.finalize() assert data == b"" def test_bytearray(self): padder = padding.PKCS7(128).padder() unpadded = bytearray(b"t" * 38) padded = ( padder.update(unpadded) + padder.update(unpadded) + padder.finalize() ) unpadder = padding.PKCS7(128).unpadder() final = unpadder.update(padded) + unpadder.finalize() assert final == unpadded + unpadded class TestANSIX923(object): @pytest.mark.parametrize("size", [127, 4096, -2]) def test_invalid_block_size(self, size): with pytest.raises(ValueError): padding.ANSIX923(size) @pytest.mark.parametrize( ("size", "padded"), [ (128, b"1111"), (128, b"1111111111111111"), (128, b"111111111111111\x06"), (128, b"1111111111\x06\x06\x06\x06\x06\x06"), (128, b""), (128, b"\x06" * 6), (128, b"\x00" * 16), ], ) def test_invalid_padding(self, size, padded): unpadder = padding.ANSIX923(size).unpadder() with pytest.raises(ValueError): unpadder.update(padded) unpadder.finalize() def test_non_bytes(self): padder = padding.ANSIX923(128).padder() with pytest.raises(TypeError): padder.update(u"abc") unpadder = padding.ANSIX923(128).unpadder() with pytest.raises(TypeError): unpadder.update(u"abc") def test_zany_py2_bytes_subclass(self): class mybytes(bytes): # noqa: N801 def __str__(self): return "broken" str(mybytes()) padder = padding.ANSIX923(128).padder() padder.update(mybytes(b"abc")) unpadder = padding.ANSIX923(128).unpadder() unpadder.update(mybytes(padder.finalize())) assert unpadder.finalize() == b"abc" @pytest.mark.parametrize( ("size", "unpadded", "padded"), [ (128, b"1111111111", b"1111111111\x00\x00\x00\x00\x00\x06"), ( 128, b"111111111111111122222222222222", b"111111111111111122222222222222\x00\x02", ), (128, b"1" * 16, b"1" * 16 + b"\x00" * 15 + b"\x10"), (128, b"1" * 17, b"1" * 17 + b"\x00" * 14 + b"\x0F"), ], ) def test_pad(self, size, unpadded, padded): padder = padding.ANSIX923(size).padder() result = padder.update(unpadded) result += padder.finalize() assert result == padded @pytest.mark.parametrize( ("size", "unpadded", "padded"), [ (128, b"1111111111", b"1111111111\x00\x00\x00\x00\x00\x06"), ( 128, b"111111111111111122222222222222", b"111111111111111122222222222222\x00\x02", ), ], ) def test_unpad(self, size, unpadded, padded): unpadder = padding.ANSIX923(size).unpadder() result = unpadder.update(padded) result += unpadder.finalize() assert result == unpadded def test_use_after_finalize(self): padder = padding.ANSIX923(128).padder() b = padder.finalize() with pytest.raises(AlreadyFinalized): padder.update(b"") with pytest.raises(AlreadyFinalized): padder.finalize() unpadder = padding.ANSIX923(128).unpadder() unpadder.update(b) unpadder.finalize() with pytest.raises(AlreadyFinalized): unpadder.update(b"") with pytest.raises(AlreadyFinalized): unpadder.finalize() def test_bytearray(self): padder = padding.ANSIX923(128).padder() unpadded = bytearray(b"t" * 38) padded = ( padder.update(unpadded) + padder.update(unpadded) + padder.finalize() ) unpadder = padding.ANSIX923(128).unpadder() final = unpadder.update(padded) + unpadder.finalize() assert final == unpadded + unpadded