6
6
import email .parser
7
7
import os
8
8
import typing
9
+ from email .message import EmailMessage
9
10
10
11
import pytest
11
12
@@ -1087,6 +1088,12 @@ def test_set_data_twice(self, backend):
1087
1088
with pytest .raises (ValueError ):
1088
1089
decryptor .set_data (b"test" )
1089
1090
1091
+ def test_set_recipient_twice (self , backend ):
1092
+ cert , _ = _load_rsa_cert_key ()
1093
+ decryptor = pkcs7 .PKCS7EnvelopeDecryptor ().set_recipient (cert )
1094
+ with pytest .raises (ValueError ):
1095
+ decryptor .set_recipient (cert )
1096
+
1090
1097
def test_unsupported_encryption (self , backend ):
1091
1098
cert_non_rsa , _ = _load_cert_key ()
1092
1099
with pytest .raises (TypeError ):
@@ -1098,30 +1105,80 @@ def test_not_a_cert(self, backend):
1098
1105
b"notacert" , # type: ignore[arg-type]
1099
1106
)
1100
1107
1101
- def test_decrypt_no_recipient (self , backend ):
1102
- decryptor = pkcs7 .PKCS7EnvelopeDecryptor ().set_data (b"test" )
1108
+ def test_set_private_key_twice (self , backend ):
1109
+ _ , private_key = _load_rsa_cert_key ()
1110
+ decryptor = pkcs7 .PKCS7EnvelopeDecryptor ().set_private_key (private_key )
1103
1111
with pytest .raises (ValueError ):
1104
- decryptor .decrypt (serialization .Encoding .SMIME , [])
1112
+ decryptor .set_private_key (private_key )
1113
+
1114
+ def test_not_a_pkey (self , backend ):
1115
+ with pytest .raises (TypeError ):
1116
+ pkcs7 .PKCS7EnvelopeDecryptor ().set_private_key (
1117
+ b"notapkey" , # type: ignore[arg-type]
1118
+ )
1105
1119
1106
1120
def test_decrypt_no_data (self , backend ):
1107
1121
cert , _ = _load_rsa_cert_key ()
1108
1122
decryptor = pkcs7 .PKCS7EnvelopeDecryptor ().set_recipient (cert )
1109
1123
with pytest .raises (ValueError ):
1110
1124
decryptor .decrypt (serialization .Encoding .SMIME , [])
1111
1125
1112
- def test_decrypt_invalid_options (self , backend ):
1126
+ def test_decrypt_no_recipient (self , backend ):
1127
+ decryptor = pkcs7 .PKCS7EnvelopeDecryptor ().set_data (b"test" )
1128
+ with pytest .raises (ValueError ):
1129
+ decryptor .decrypt (serialization .Encoding .SMIME , [])
1130
+
1131
+ def test_decrypt_no_private_key (self , backend ):
1113
1132
cert , _ = _load_rsa_cert_key ()
1114
1133
decryptor = (
1115
1134
pkcs7 .PKCS7EnvelopeDecryptor ()
1116
1135
.set_data (b"test" )
1117
1136
.set_recipient (cert )
1118
1137
)
1138
+ with pytest .raises (ValueError ):
1139
+ decryptor .decrypt (serialization .Encoding .SMIME , [])
1140
+
1141
+ @pytest .fixture
1142
+ def decryptor (self , backend ) -> pkcs7 .PKCS7EnvelopeDecryptor :
1143
+ cert , private_key = _load_rsa_cert_key ()
1144
+ return (
1145
+ pkcs7 .PKCS7EnvelopeDecryptor ()
1146
+ .set_data (b"test" )
1147
+ .set_recipient (cert )
1148
+ .set_private_key (private_key )
1149
+ )
1150
+
1151
+ def test_decrypt_invalid_options (
1152
+ self , backend , decryptor : pkcs7 .PKCS7EnvelopeDecryptor
1153
+ ):
1119
1154
with pytest .raises (ValueError ):
1120
1155
decryptor .decrypt (
1121
1156
serialization .Encoding .SMIME ,
1122
1157
[b"invalid" ], # type: ignore[list-item]
1123
1158
)
1124
1159
1160
+ def test_decrypt_invalid_encoding (
1161
+ self , backend , decryptor : pkcs7 .PKCS7EnvelopeDecryptor
1162
+ ):
1163
+ with pytest .raises (ValueError ):
1164
+ decryptor .decrypt (serialization .Encoding .Raw , [])
1165
+
1166
+ @pytest .mark .parametrize (
1167
+ "invalid_options" ,
1168
+ [
1169
+ [pkcs7 .PKCS7Options .NoAttributes ],
1170
+ [pkcs7 .PKCS7Options .NoCapabilities ],
1171
+ [pkcs7 .PKCS7Options .NoCerts ],
1172
+ [pkcs7 .PKCS7Options .DetachedSignature ],
1173
+ [pkcs7 .PKCS7Options .Binary , pkcs7 .PKCS7Options .Text ],
1174
+ ],
1175
+ )
1176
+ def test_encrypt_invalid_encryption_options (
1177
+ self , backend , invalid_options , decryptor : pkcs7 .PKCS7EnvelopeDecryptor
1178
+ ):
1179
+ with pytest .raises (ValueError ):
1180
+ decryptor .decrypt (serialization .Encoding .DER , invalid_options )
1181
+
1125
1182
@pytest .mark .parametrize (
1126
1183
("encoding" , "options" ),
1127
1184
[
@@ -1134,7 +1191,6 @@ def test_decrypt_invalid_options(self, backend):
1134
1191
],
1135
1192
)
1136
1193
def test_smime_decrypt (self , backend , encoding , options ):
1137
- """Testing the round-trip of encrypting and decrypting data."""
1138
1194
# Encrypt some data
1139
1195
plain = b"hello world\n "
1140
1196
cert , private_key = _load_rsa_cert_key ()
@@ -1154,6 +1210,23 @@ def test_smime_decrypt(self, backend, encoding, options):
1154
1210
decrypted = decryptor .decrypt (encoding , options )
1155
1211
assert decrypted == plain
1156
1212
1213
+ def test_smime_decrypt_not_encrypted (self , backend ):
1214
+ # Create a plain email
1215
+ email_message = EmailMessage ()
1216
+ email_message .set_content ("hello world\n " )
1217
+
1218
+ # Test decryption failure with plain email
1219
+ cert , private_key = _load_rsa_cert_key ()
1220
+ decryptor = (
1221
+ pkcs7 .PKCS7EnvelopeDecryptor ()
1222
+ .set_data (email_message .as_bytes ())
1223
+ .set_recipient (cert )
1224
+ .set_private_key (private_key )
1225
+ )
1226
+
1227
+ with pytest .raises (ValueError ):
1228
+ decryptor .decrypt (serialization .Encoding .SMIME , [])
1229
+
1157
1230
1158
1231
@pytest .mark .supported (
1159
1232
only_if = lambda backend : backend .pkcs7_supported (),
@@ -1253,3 +1326,14 @@ class TestPKCS7EnvelopeBuilderUnsupported:
1253
1326
def test_envelope_builder_unsupported (self , backend ):
1254
1327
with raises_unsupported_algorithm (_Reasons .UNSUPPORTED_PADDING ):
1255
1328
pkcs7 .PKCS7EnvelopeBuilder ()
1329
+
1330
+
1331
+ @pytest .mark .supported (
1332
+ only_if = lambda backend : backend .pkcs7_supported ()
1333
+ and not backend .rsa_encryption_supported (padding .PKCS1v15 ()),
1334
+ skip_message = "Requires OpenSSL with no PKCS1 v1.5 padding support" ,
1335
+ )
1336
+ class TestPKCS7EnvelopeDecryptorUnsupported :
1337
+ def test_envelope_builder_unsupported (self , backend ):
1338
+ with raises_unsupported_algorithm (_Reasons .UNSUPPORTED_PADDING ):
1339
+ pkcs7 .PKCS7EnvelopeDecryptor ()
0 commit comments