@@ -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 ("""
373539060eb5e0c87c4ffffb760c8fac2a7f5b06f46301ab5b8374a59cc7006aa16e7f38
0 commit comments