3333import org .bouncycastle .operator .OutputEncryptor ;
3434import org .bouncycastle .operator .jcajce .JcaAlgorithmParametersConverter ;
3535import org .bouncycastle .util .Store ;
36+ import org .jetbrains .annotations .Nullable ;
3637
3738import javax .crypto .spec .OAEPParameterSpec ;
3839import javax .crypto .spec .PSource ;
@@ -87,15 +88,14 @@ private static void updateMailcapCommandMap() {
8788 /**
8889 * Encrypts a MIME message and yields a new S/MIME encrypted MIME message.
8990 *
90- * @param session The {@link Session} that is used in conjunction with the
91- * original {@link MimeMessage} .
91+ * @param session The {@link Session} that is used in conjunction with the original {@link MimeMessage}.
92+ * @param messageId Optional MessageID that should be preserved on the encrypted MimeMessage result .
9293 * @param mimeMessage The original {@link MimeMessage} to be encrypted.
93- * @param certificate The {@link X509Certificate} used to obtain the
94- * {@link PublicKey} to encrypt the original message with.
94+ * @param certificate The {@link X509Certificate} used to obtain the {@link PublicKey} to encrypt the original message with.
9595 * @return The new S/MIME encrypted {@link MimeMessage}.
9696 */
97- public static MimeMessage encrypt (Session session , MimeMessage mimeMessage , X509Certificate certificate ) {
98- return encrypt (session , mimeMessage , certificate , DEFAULT_KEY_ENCAPSULATION_ALGORITHM , DEFAULT_CIPHER );
97+ public static MimeMessage encrypt (Session session , @ Nullable String messageId , MimeMessage mimeMessage , X509Certificate certificate ) {
98+ return encrypt (session , mimeMessage , messageId , certificate , DEFAULT_KEY_ENCAPSULATION_ALGORITHM , DEFAULT_CIPHER );
9999 }
100100
101101 /**
@@ -104,16 +104,17 @@ public static MimeMessage encrypt(Session session, MimeMessage mimeMessage, X509
104104 * @param session The {@link Session} that is used in conjunction with the
105105 * original {@link MimeMessage}.
106106 * @param mimeMessage The original {@link MimeMessage} to be encrypted.
107+ * @param messageId Optional MessageID that should be preserved on the encrypted MimeMessage result.
107108 * @param certificate The {@link X509Certificate} used to obtain the
108109 * {@link PublicKey} to encrypt the original message with.
109110 * @param keyEncapsulationAlgorithm Algorithm used to encapsulate the symmetric encryption key.
110111 * Currently, RSA RSA-OAEP with various SHA digest lengths are supported.
111112 * @param cmsAlgorithm Encryption algorithm for symmetric content encryption.
112113 * @return The new S/MIME encrypted {@link MimeMessage}.
113114 */
114- public static MimeMessage encrypt (Session session , MimeMessage mimeMessage , X509Certificate certificate , KeyEncapsulationAlgorithm keyEncapsulationAlgorithm , ASN1ObjectIdentifier cmsAlgorithm ) {
115+ public static MimeMessage encrypt (Session session , MimeMessage mimeMessage , @ Nullable String messageId , X509Certificate certificate , KeyEncapsulationAlgorithm keyEncapsulationAlgorithm , ASN1ObjectIdentifier cmsAlgorithm ) {
115116 try {
116- MimeMessage encryptedMimeMessage = new MimeMessage (session );
117+ MimeMessage encryptedMimeMessage = new SmimeMessageIdFixingMimeMessage (session , messageId );
117118 copyHeaders (mimeMessage , encryptedMimeMessage );
118119
119120 SMIMEEnvelopedGenerator generator = prepareGenerator (certificate , keyEncapsulationAlgorithm );
@@ -408,34 +409,31 @@ private static JcaCertStore getCertificateStore(SmimeKey smimeKey) throws Certif
408409 /**
409410 * Signs a MIME message and yields a new S/MIME signed MIME message.
410411 *
411- * @param session The {@link Session} that is used in conjunction with the
412- * original {@link MimeMessage} .
412+ * @param session The {@link Session} that is used in conjunction with the original {@link MimeMessage}.
413+ * @param messageId Optional MessageID that should be preserved on the signed MimeMessage.
413414 * @param mimeMessage The original {@link MimeMessage} or {@link SMTPMessage} to be signed.
414- * @param smimeKey The {@link SmimeKey} used to obtain the {@link PrivateKey} to
415- * sign the original message with.
415+ * @param smimeKey The {@link SmimeKey} used to obtain the {@link PrivateKey} to sign the original message with.
416416 * @return The new S/MIME signed {@link MimeMessage} or {@link SMTPMessage}.
417417 */
418- public static <T extends MimeMessage > T sign (Session session , T mimeMessage , SmimeKey smimeKey ) {
419- return sign (session , mimeMessage , smimeKey , DEFAULT_SIGNATURE_ALGORITHM_NAME );
418+ public static <T extends MimeMessage > T sign (Session session , @ Nullable String messageId , T mimeMessage , SmimeKey smimeKey ) {
419+ return sign (session , messageId , mimeMessage , smimeKey , DEFAULT_SIGNATURE_ALGORITHM_NAME );
420420 }
421421
422422 /**
423423 * Signs a MIME message and yields a new S/MIME signed MIME message.
424424 *
425- * @param session The {@link Session} that is used in conjunction with the
426- * original {@link MimeMessage} .
425+ * @param session The {@link Session} that is used in conjunction with the original {@link MimeMessage}.
426+ * @param messageId Optional MessageID that should be preserved on the signed MimeMessage.
427427 * @param mimeMessage The original {@link MimeMessage} or {@link SMTPMessage} to be signed.
428- * @param smimeKey The {@link SmimeKey} used to obtain the {@link PrivateKey} to
429- * sign the original message with.
430- * @param algorithmName The name of the signature algorithm to use. Must be an algorithm
431- * supported by the Bouncy Castle security provider.
428+ * @param smimeKey The {@link SmimeKey} used to obtain the {@link PrivateKey} to sign the original message with.
429+ * @param algorithmName The name of the signature algorithm to use. Must be an algorithm supported by the Bouncy Castle security provider.
432430 * @return The new S/MIME signed {@link MimeMessage} or {@link SMTPMessage}.
433431 */
434- public static <T extends MimeMessage > T sign (Session session , T mimeMessage , SmimeKey smimeKey , String algorithmName ) {
432+ public static <T extends MimeMessage > T sign (Session session , @ Nullable String messageId , T mimeMessage , SmimeKey smimeKey , String algorithmName ) {
435433 //noinspection unchecked
436434 return (mimeMessage instanceof SMTPMessage )
437- ? sign (mimeMessage , (T ) new SMTPMessage (session ), smimeKey , algorithmName )
438- : sign (mimeMessage , (T ) new MimeMessage (session ), smimeKey , algorithmName );
435+ ? sign (mimeMessage , (T ) new SmimeMessageIdFixingSMTPMessage (session , messageId ), smimeKey , algorithmName )
436+ : sign (mimeMessage , (T ) new SmimeMessageIdFixingMimeMessage (session , messageId ), smimeKey , algorithmName );
439437 }
440438
441439 private static <T extends MimeMessage > T sign (T mimeMessage , T signedMessage , SmimeKey smimeKey , String algorithmName ) {
0 commit comments