Skip to content

Commit 36dcaae

Browse files
committed
zero padded and 4096 with second to last length
1 parent c03847e commit 36dcaae

File tree

1 file changed

+171
-0
lines changed

1 file changed

+171
-0
lines changed

unit_tests/test_tlslite_utils_rsakey.py

Lines changed: 171 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1914,6 +1914,33 @@ def test_invalid_decrypting_to_max_length(self):
19141914

19151915
self.assertEqual(msg, plaintext)
19161916

1917+
def test_invalid_with_zero_padded_ciphertext(self):
1918+
ciphertext = a2b_hex(remove_whitespace("""
1919+
006f89db685c0a132700c6a17f88a37a6635d0ab89de4c45dc09736c891ca5bf
1920+
3401ce34c6e5d51e94ed2f518857ddc12d9f9f9e68e01cdc30d86ae5dd83988c
1921+
0c46a8e39daa1b328a23def551d67fa1964fb15242c83ddd7dd5b1aec720a391
1922+
d0b86cb16cf4d3c466850c3df88a3ed85993900d1287a0c90c4b04d34ba29e59
1923+
967661f3f10e0c998f64e14e777e8e81371eca5318b4e0b53414292130c82147
1924+
7c51e2bff844836ab10dff293d82e4f40d345968ef268c92ed0bc238f31d50f4
1925+
d3f759c23964923e135d15527556410fbd2c451d6a2aa852dc88b01139c6fdd8
1926+
26736d8cd3780601b2977b09c080bd8c0fa471606ad59f053ad33d9eeb905f20
1927+
"""))
1928+
self.assertEqual(len(ciphertext), numBytes(self.pub_key.n))
1929+
1930+
# sanity check that the decrypted ciphertext is invalid
1931+
dec = self.priv_key._raw_private_key_op_bytes(ciphertext)
1932+
self.assertEqual(
1933+
dec[0:3],
1934+
b'\x15\x1c\x6d')
1935+
1936+
plaintext = a2b_hex(remove_whitespace("""
1937+
2b5dd72df3cae37f1aef
1938+
"""))
1939+
self.assertEqual(len(plaintext), 10)
1940+
1941+
msg = self.priv_key.decrypt(ciphertext)
1942+
self.assertEqual(msg, plaintext)
1943+
19171944
def test_invalid_decrypting_to_length_second_to_last_from_prf(self):
19181945
# the last value from the PRF is 246, which is longer than the max
19191946
# allowed length: 245, so it needs to select second to last: 2
@@ -2566,6 +2593,34 @@ def test_invalid_decrypting_to_max_length(self):
25662593

25672594
self.assertEqual(msg, plaintext)
25682595

2596+
def test_invalid_with_zero_padded_ciphertext(self):
2597+
ciphertext = a2b_hex(remove_whitespace("""
2598+
000a56cfd7abf21e2c65a28b8145fee663818b6cd218601e9e62bed7de5ac74c
2599+
eb07b435b305c99e3e286152036086b4a13eb26164f6f4bf79ac7d6c3fbcdcd7
2600+
4c6dc324c04949a0c88cbf616626cb171a4e333a0e124524b44f78e2d8100c03
2601+
e231791523b7d76db2d464e6b5e64244e04ad21128a5feb56092b4ceda35ebfb
2602+
84f7fafa8e1c098d9923d66e541b36307574db8912630fcf734af7bcd4118f1f
2603+
700804c5001a5950780188fc7862384fb3fc0708eaf3cb2b119177bb6928758f
2604+
a75e644d258ac02748dcae7a78ec6c8679598fa9deee4663f1efe27efe8bd155
2605+
72ff40676b95469aaa42eab4226d86c1160343255cce4fb7728f7349da27ed09
2606+
6b
2607+
"""))
2608+
self.assertEqual(len(ciphertext), numBytes(self.pub_key.n))
2609+
2610+
# sanity check that the decrypted ciphertext is invalid
2611+
dec = self.priv_key._raw_private_key_op_bytes(ciphertext)
2612+
self.assertEqual(
2613+
dec[0:3],
2614+
b'\x00\x13\xb7')
2615+
2616+
plaintext = a2b_hex(remove_whitespace("""
2617+
fc874af235e261083c2c
2618+
"""))
2619+
self.assertEqual(len(plaintext), 10)
2620+
2621+
msg = self.priv_key.decrypt(ciphertext)
2622+
self.assertEqual(msg, plaintext)
2623+
25692624
def test_invalid_decrypting_to_length_second_to_last_from_prf(self):
25702625
# the last value from the PRF is 247, which is longer than the max
25712626
# allowed length: 246, so it needs to select second to last: 52
@@ -3122,6 +3177,37 @@ def test_negative_with_max_len(self):
31223177

31233178
self.assertEqual(msg, plaintext)
31243179

3180+
def test_invalid_with_zero_padded_ciphertext(self):
3181+
ciphertext = a2b_hex(remove_whitespace("""
3182+
00128e116c0d348217c1d5756611be833caec3bd19f3d2ed383c4523ef3d8a5c
3183+
d1130bdb3fcd3ba1c0265322fc98c767b3b971054f5e3067a32b4878bbf7e17d
3184+
b80a855427e2e7d2ec26294b79edbb6352c7812270040e3cbaf560de1486171d
3185+
a649af786551ae0e5b6ef1fa1e22196c1c3039a50cfe09620da09716e75e9a9b
3186+
5ad164953c5a7e48f77ef9e0f59e962cf3985dc572ded966e8241632a9a5a420
3187+
3500a50d70491d80846b72019c456bfbdf7f15f740af0c2ef2a46787c54dcd90
3188+
a0e91257642f2c10b21052024b1d28ad14d78c0d9702a14b9ab9552f023bfb71
3189+
6f9c9a1f691959057f52b197086fb9bc24d45e2b063ffb235b54d3ab7575c7f3
3190+
e411398ddb30945c15f3f5d5ebbe302f22f60047d139d402f5b8a959421d1946
3191+
cf748c84065c5d0f0302f7ade6335014ab4467698ad827684d2bdeeb4757d276
3192+
f131340438506473f271c3fe24ca58e1c60dcc17aff8b0373637d897f627ea57
3193+
1da148a81d399ced9d65a4564bb6d23fbf4c14674d7551283a4293de51a1516a
3194+
"""))
3195+
self.assertEqual(len(ciphertext), numBytes(self.pub_key.n))
3196+
3197+
# sanity check that the decrypted ciphertext is invalid
3198+
dec = self.priv_key._raw_private_key_op_bytes(ciphertext)
3199+
self.assertEqual(
3200+
dec[0:3],
3201+
b'\x16\x71\x75')
3202+
3203+
plaintext = a2b_hex(remove_whitespace("""
3204+
732f025d1adea74649b4
3205+
"""))
3206+
self.assertEqual(len(plaintext), 10)
3207+
3208+
msg = self.priv_key.decrypt(ciphertext)
3209+
self.assertEqual(msg, plaintext)
3210+
31253211
def test_negative_with_max_len_plus_one_in_first_value_from_prf(self):
31263212
# an invalid ciphertext that generates last length that's one byte
31273213
# too long for the key size, so the second to last value needs to get
@@ -3730,6 +3816,91 @@ def test_invalid_decrypting_to_max_length(self):
37303816

37313817
self.assertEqual(msg, plaintext)
37323818

3819+
def test_invalid_with_zero_padded_ciphertext(self):
3820+
ciphertext = a2b_hex(remove_whitespace("""
3821+
00cd3bf408c742514e30ebfd001708e01f42de439a09d0d4b10044628becd8bc
3822+
690c45b967a6a900d6259c7d7d20ad49810c270d2fe1b75ffaa84f50071f64d1
3823+
696bce76e96dbcf2af054d77ded54c742aa38fadba52eebf7a5c8b6dbbf01f28
3824+
b3ebf4e9b3ca453c92ca8b65771c23671b9da85c51e7a2987395de45b125353d
3825+
430820b4c90b0ab9fc29e1c576a0ec35828c99c9880e208ecddf80bdaa9c3474
3826+
561e4c5bf67bf5d144b173f4f28edd1064a9dd8cf5f40b7c35e7e4dbeb370cca
3827+
bf06efb54e243645b902871a804c27904a620f31ef321af4d1589ca359de8895
3828+
24dfb43ddad51ab50617ab79a50a2d20e2325a05c9963602f2a1d7feaffc80d2
3829+
b8b88cbd3673531c399342f0bf1c04521d9a441c06593d9e95771129da942d83
3830+
bb81c627a50c8baafc2a731d97f2e1f638217f9f7b18f2644578fde5073a54a8
3831+
988fda357c64398a95965a7dd35ffdd7eb7495d4d1c9a950a0cd208a68371829
3832+
420633cb25e9da9e22b215e50f6ec2714f94ce6abb9a94fbbf6cd18f2fd5bfb7
3833+
8076034b88186957428fe0ea5e1dec7be31d753f155e2a8f7f4854a726612f43
3834+
ef91f88124011cd32f6841a347dc0411d708db65492ec277b81a335b76a86230
3835+
2acebf7db7cac724144c975ed4d91412eeec4cac3b2409696e3678cffcb7756b
3836+
de795c55f72da44f325b71dd6ac4e3c1ef512ee8ff24ab316507c6ac60031569
3837+
"""))
3838+
self.assertEqual(len(ciphertext), numBytes(self.pub_key.n))
3839+
3840+
# sanity check that the decrypted ciphertext is invalid
3841+
dec = self.priv_key._raw_private_key_op_bytes(ciphertext)
3842+
self.assertEqual(
3843+
dec[0:3],
3844+
b'\x63\x1b\x0c')
3845+
3846+
plaintext = a2b_hex(remove_whitespace("""
3847+
59ccd9c2cfe740e9287b
3848+
"""))
3849+
self.assertEqual(len(plaintext), 10)
3850+
3851+
msg = self.priv_key.decrypt(ciphertext)
3852+
self.assertEqual(msg, plaintext)
3853+
3854+
def test_invalid_decrypting_to_length_second_to_last_from_prf(self):
3855+
ciphertext = a2b_hex(remove_whitespace("""
3856+
09f010936fd77967dd2aa090be72ecdd8cb2b2a9fb954e644f08a1c1fd545000
3857+
7ece0b4e8e992831534309419c034b1c4b369269b808a890eac31d5bbfe73737
3858+
fd716e117e19638064292539e84dae20ec1d98ecd104e6c88d39d3544d5c43c9
3859+
fd4e9f4361c67116516fc2569f96e5df50a63e949d92009a7c865c7dd70ea89c
3860+
0002dd697dcd0e0304f8fa0738a3681322e672a9748f9d9eb1b7b8c1646a7bf2
3861+
a1967b2aa9793ae0ecdbaa2d601350fd931ea164bc02a33a9c22cee47f2d536d
3862+
92e465180b44e310bf044eec49cc54972d22e735123fbee76496a4c768acef89
3863+
66ae9e0ed46b753ec47e20a89af0ccf78c266aeb63aeb99d80e4c34bc4608e16
3864+
4aeffd93e886accd426e9e1cfee4f912f235940a9b8d4554953bee8753b8fe05
3865+
606fe5f46da70394b10f7e71dba3c10becf85a1f4ee619d421ef69fca837d8b1
3866+
b42598dea0232668b9c42223d77bae7fbe79a9dbf057eeaa51fceac114661a3b
3867+
572130776c36cfff9f134b08907ab2a6f927145806a779bc55bfb4215cb8c85d
3868+
ecaec5b15cd0a4be691b13e068a2381c33fb5adbdb564fd8be0938fdd710590c
3869+
08f95aa4ea90cc2cea195ef7a344e14715beff2186ad7d898e8f904861ab9133
3870+
817a13d8a6af23f83a89e5e1e7f8e163d6190e91a09c11939e3a7d48990b8e3b
3871+
5c0e01b773ba683f7df73b2f88746593c010cd9cab2ea3d9af5ebf30fba1ef0c
3872+
"""))
3873+
self.assertEqual(len(ciphertext), numBytes(self.pub_key.n))
3874+
3875+
kdk = calc_kdk(self.priv_key, ciphertext)
3876+
3877+
lengths = calc_lengths(self.priv_key, kdk)
3878+
max_len = numBytes(self.pub_key.n) - 1 - 1 - 8 -1
3879+
3880+
# the last_len is too long
3881+
self.assertGreater(lengths[-1], max_len)
3882+
self.assertEqual(lengths[-1], max_len + 1)
3883+
3884+
# while second to last is short enough
3885+
self.assertLessEqual(lengths[-2], max_len)
3886+
self.assertEqual(10, lengths[-2])
3887+
3888+
# sanity check that the decrypted ciphertext is invalid
3889+
dec = self.priv_key._raw_private_key_op_bytes(ciphertext)
3890+
self.assertNotEqual(dec[0:1], b'\x00')
3891+
self.assertNotEqual(dec[1:2], b'\x02')
3892+
self.assertNotEqual(dec[-3:], b'\x6b\xc6\x86')
3893+
3894+
plaintext = a2b_hex(remove_whitespace("""
3895+
0cfdf702efa4dc6bc686
3896+
"""))
3897+
3898+
self.assertEqual(len(plaintext), 10)
3899+
3900+
msg = self.priv_key.decrypt(ciphertext)
3901+
3902+
self.assertEqual(msg, plaintext)
3903+
37333904
def test_invalid_with_bad_version_byte(self):
37343905
ciphertext = a2b_hex(remove_whitespace("""
37353906
0eb5e0c87c4ffffb760c8fac2a7f5b06f46301ab5b8374a59cc7006aa16e7f38

0 commit comments

Comments
 (0)