On .net framework (e.g. 4.5, 4.8) you'll get RSAES_OAEP, on .net 6-10 you'll get RSA.
This is because on .net framework CmsEnvelope is implemented using Windows Security Api and on .net core it's not.
My understanding is that it's not possible on .net core.
There is a way to do that using BouncyCastle.Cryptography package:
public class SMIMEBouncyCastleEncryptor : ISMIMEEncryptor
{
public byte[] Encrypt(
byte[] plain,
EncryptionConfiguration configuration)
{
AlgorithmIdentifier oaepAlgId =
new AlgorithmIdentifier(
PkcsObjectIdentifiers.IdRsaesOaep,
new RsaesOaepParameters(
new AlgorithmIdentifier(
OiwObjectIdentifiers.IdSha1),//digest
new AlgorithmIdentifier(
PkcsObjectIdentifiers.IdMgf1,
new AlgorithmIdentifier(
OiwObjectIdentifiers.IdSha1)),//mgf
new AlgorithmIdentifier(
PkcsObjectIdentifiers.IdPSpecified,
DerNull.Instance) // PSpecified
)
);
CmsEnvelopedDataGenerator generator =
new CmsEnvelopedDataGenerator();
foreach (X509Certificate2 certificate2 in
configuration.Certificates)
{
X509Certificate cert =
DotNetUtilities.FromX509Certificate(
certificate2
);
IKeyWrapper keyWrapper = new Asn1KeyWrapper(
oaepAlgId,
cert.GetPublicKey()
);
generator.AddRecipientInfoGenerator(
new KeyTransRecipientInfoGenerator(
cert,
keyWrapper)
);
}
return generator.Generate(
new CmsProcessableByteArray(plain),
CmsEnvelopedGenerator.Aes256Cbc).GetEncoded();
}
}
You can then plug-in custom Encrypt using CryptoContext:
CryptoContext.SMIMEEncryptor =
new SMIMEBouncyCastleEncryptor();
X509Certificate2 cert = ...;
MailBuilder builder = new MailBuilder();
builder.Text = "test";
builder.EncryptWith(cert);
byte[] eml = builder.Create().Render();
// parse
IMail encrypted = new MailBuilder
{
SMIMEConfiguration =
{
DecryptAutomatically = false
}
}.CreateFromEml(eml);
// Key exchange algorithm used for particular recipient:
EnvelopedCms cms = encrypted.GetEnvelopedCms();
Oid oid = cms.RecipientInfos[0].KeyEncryptionAlgorithm.Oid;
Assert.AreEqual("1.2.840.113549.1.1.7", oid.Value);
Assert.AreEqual("RSAES_OAEP", oid.FriendlyName);
// Encryption algorithm used:
Assert.AreEqual("aes256",
cms.ContentEncryptionAlgorithm.Oid.FriendlyName);
Assert.AreEqual("test",
encrypted.Decrypt(cert).Text);