Notes - Yash-777/Java_Mail GitHub Wiki

redhat.com: Public-key cryptography and related standards underlie the security features of many products such as signed and encrypted email, single sign-on, and Secure Sockets Layer (SSL) communications.

Symmetric-Key Encryption Public-Key Encryption
Asymmetric Encryption

Each public key is published, and the corresponding private key is kept secret.

Generating and Verifying Signatures : Oracle

PKCS12: Multipart Multiple Mail : Use Loop

MimeMessage message = new MimeMessage((Session)null);
message.addRecipient(RecipientType.TO/CC/BCC, new InternetAddress(recipientId));

message.setSubject(subject);
message.addHeader( ... );

MimeBodyPart messageText = new MimeBodyPart();
messageText.setText(body);

InputStream is = attachment.getContent();
DataSource attachementDataSource = new ByteArrayDataSource(is, attachment.getContentType(),attachment.getName());
attachmentMimeBody.setDataHandler(new DataHandler(attachementDataSource));
attachmentMimeBody.setFileName(attachementDataSource.getName());

OLD WAY to get Cert from CF:
KeyStore keystore = KeyStore.getInstance("PKCS12", "BC");
keystore.load(is, password.toCharArray());
Enumeration<String> keyStoreAliasEnum = keystore.aliases();
// First Alias Enumaration
PrivateKey privateKey = (PrivateKey) keystore.getKey(alias, password.toCharArray());

CertificateFactory cf = CertificateFactory.getInstance("X.509");
Certificate certificate = keystore.getCertificate(alias);
ByteArrayInputStream bais = new ByteArrayInputStream(certificate.getEncoded());
X509Certificate x509Certificate = (X509Certificate) cf.generateCertificate(bais);
Certificate[] chain = (Certificate[]) keystore.getCertificateChain(alias);
if (chain != null) {
	signerCertificatesChain = new X509Certificate[chain.length];
	for (int i = 0; i < chain.length; i++) {
		signerCertificatesChain[i] = (X509Certificate) chain[i];
	}
}

//Signing Data: https://www.baeldung.com/java-bouncy-castle
//------------
CMSSignedDataGenerator cmsGenerator = new CMSSignedDataGenerator();
cmsGenerator.addSignerInfoGenerator(
		new JcaSignerInfoGeneratorBuilder(new JcaDigestCalculatorProviderBuilder()
			.setProvider(MailDomain.EMAIL_PROVIDER.getValue()).build()).build(contentSigner, x509Certificate));
cmsGenerator.addCertificates(certs);

Log4J.consoleLog("Original Message : " + secretMessage);
byte[] data = secretMessage.getBytes();

CMSTypedData cmsData= new CMSProcessableByteArray(data);
CMSSignedData cms = cmsGenerator.generate(cmsData, true);
byte[] signedMessage = cms.getEncoded();


//Encryption Enveloped:
//--------------------
SMIMEEnvelopedGenerator encrypter = new SMIMEEnvelopedGenerator();
encrypter.addRecipientInfoGenerator(new JceKeyTransRecipientInfoGenerator(encryptionCertificate).setProvider("BC"));
CMSEnvelopedData encryptedPart = encrypter.generate(MimeMessage message,
				new JceCMSContentEncryptorBuilder(CMSAlgorithm.RC2_CBC, 40).setProvider("BC").build());
byte[] encryptedData = cmsEnvelopedData.getEncoded();

SMTPMessage msg = new SMTPMessage(finalMimeMessage);
msg.setReplyTo(message.getAllRecipients());
msg.setNotifyOptions(SMTPMessage.NOTIFY_SUCCESS + SMTPMessage.NOTIFY_FAILURE);
msg.setReturnOption(SMTPMessage.RETURN_HDRS);
⚠️ **GitHub.com Fallback** ⚠️