Skip to content

Instantly share code, notes, and snippets.

@jonny-novikov
Last active February 24, 2016 22:03
Show Gist options
  • Save jonny-novikov/2de51707112c407b19a2 to your computer and use it in GitHub Desktop.
Save jonny-novikov/2de51707112c407b19a2 to your computer and use it in GitHub Desktop.
Verify and decrypt p7m-mime
Hi!
I have a data Content-Type: application/pkcs7-mime
Here is openssl command verifies and print the decoded content in console:
openssl smime -verify -in request.p7m -inform PEM -nointern -certfile yamoney.pem -CAfile yamoney.pem
It works fine. But I want to use MimeKit and ApplicationPkcs7Mime to simplify the usage in my application pipeline.
Parsing yamoney.pem I have a X509CertificateStore.
using (var fs = File.OpenRead(@"request.p7m"))
{
var mime = new ApplicationPkcs7Mime(SecureMimeType.SignedData, fs); // This throws...
...
There is a request file in a git (request.p7m).
And pem - it is not secret.
using System;
using System.IO;
using System.Text;
using Org.BouncyCastle.Asn1.Cms;
using Org.BouncyCastle.OpenSsl;
using Org.BouncyCastle.X509;
using MimeKit;
using MimeKit.IO;
using MimeKit.Cryptography;
namespace P7mVerify
{
class Program
{
public const string RequestPkcs7File = @"request.p7m";
public const string CertsFile = @"yamoney.pem";
private byte[] GetRawRequest()
{
using (var reader = File.OpenText(RequestPkcs7File))
{
var pem = new PemReader(reader);
var contentInfo = (ContentInfo) pem.ReadObject();
return contentInfo.GetEncoded();
}
}
public static void Main ()
{
using (var pem = File.OpenRead(CertsFile))
{
using (var ctx = PemSecureMimeContext.Create(pem))
{
Stream stream = null;
try
{
using (var content = new MemoryStream(GetRawRequest(), false))
{
var signatures = ctx.Verify(content, out stream);
foreach (var signature in signatures)
{
try
{
if (!signature.Verify())
{
Console.WriteLine("Bad signature from {0}",
signature.SignerCertificate.Email);
}
else
{
Console.WriteLine("Verified. Sender: {0}", signature.SignerCertificate.Email);
}
}
catch (DigitalSignatureVerifyException ex)
{
Console.WriteLine("Failed to verify signature: {0}", ex);
}
}
XDocument xResponse = XDocument.Load(stream);
// show decoded xml
Console.WriteLine(xResponse.ToString(SaveOptions.None));
}
}
catch (Exception e)
{
// something goes wrong
}
finally
{
stream?.Dispose();
}
}
}
}
}
}
using System;
using System.Collections.Generic;
using System.IO;
using MimeKit.Cryptography;
using Org.BouncyCastle.Cms;
using Org.BouncyCastle.X509;
namespace P7mVerify
{
public class PemSecureMimeContext : TemporarySecureMimeContext
{
public static PemSecureMimeContext Create(Stream s)
{
var ctx = new PemSecureMimeContext();
ctx.ImportUnique(s);
return ctx;
}
readonly HashSet<X509Certificate> unique = new HashSet<X509Certificate>();
public DigitalSignatureCollection Verify(Stream signedData, out Stream stream)
{
if (signedData == null)
throw new ArgumentNullException("signedData");
var parser = new CmsSignedDataParser(signedData);
var signed = parser.GetSignedContent();
stream = new MemoryStream();
signed.ContentStream.CopyTo(stream, 4096);
stream.Position = 0;
return GetDigitalSignatures(parser);
}
/// <summary>
/// Imports the certificate(s) from the specified stream.
/// </summary>
/// <remarks>
/// Imports the certificate(s) from the specified stream.
/// </remarks>
/// <param name="stream">The stream to import.</param>
/// <exception cref="System.ArgumentNullException">
/// <paramref name="stream"/> is <c>null</c>.
/// </exception>
/// <exception cref="System.IO.IOException">
/// An error occurred reading the stream.
/// </exception>
public void ImportUnique(Stream stream)
{
if (stream == null)
throw new ArgumentNullException("stream");
var parser = new X509CertificateParser();
foreach (X509Certificate certificate in parser.ReadCertificates(stream))
{
if (unique.Add(certificate))
Import(certificate);
}
}
}
}
-----BEGIN PKCS7-----
MIAGCSqGSIb3DQEHAqCAMIACAQExCzAJBgUrDgMCGgUAMIAGCSqGSIb3DQEHAaCA
JIAEggPoPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiID8+PHBh
eW1lbnRBdmlzb1JlcXVlc3QgcGF5bWVudERhdGV0aW1lPSIyMDE1LTAzLTA1VDE1
OjI0OjQ1LjQ1OSswMzowMCIgb3JkZXJTdW1CYW5rUGF5Y2FzaD0iMTAwMyIgc2hv
cFN1bUJhbmtQYXljYXNoPSIxMDAzIiByZXF1ZXN0RGF0ZXRpbWU9IjIwMTUtMDMt
MDVUMTc6NDA6NTcuODI4KzAzOjAwIiBpbnZvaWNlSWQ9IjIwMDAwMDA0MTk4NjUi
IHBheW1lbnRUeXBlPSJQQyIgY3VzdG9tZXJOdW1iZXI9ImJhaWJpayIgc2hvcFN1
bUFtb3VudD0iOTkuMDAiIHNob3BTdW1DdXJyZW5jeVBheWNhc2g9IjEwNjQzIiBv
cmRlckNyZWF0ZWREYXRldGltZT0iMjAxNS0wMy0wNVQxNToyNDoyOS4wMTMrMDM6
MDAiIG9yZGVyU3VtQW1vdW50PSIxMDAuMDAiIHBheW1lbnRQYXllckNvZGU9IjQx
MDAzMjIzNDQ3NzkiIHJlYmlsbGluZ09uPSJmYWxzZSIgc2hvcElkPSIxNTEiIHNo
b3BBcnRpY2xlSWQ9IjE1MSIgb3JkZXJTdW1DdXJyZW5jeVBheWNhc2g9IjEwNjQz
Ij48cGFyYW0ga2V5PSJ0YXJnZXRjdXJyZW5jeSIgdmFsPSI2NDMiPjwvcGFyYW0+
PHBhcmFtIGtleT0id2JwX1Nob3BLZXlJRCIgdmFsPSIyMzUwNDg0MTQ3Ij48L3Bh
cmFtPjxwYXJhbSBrZXk9ImNwc190aGVtZSIgdmFsPSJkZWZhdWx0Ij48L3BhcmFt
PjxwYXJhbSBrZXk9ImlzT1VUc2hvcCIgdmFsPSJ0cnVlIj48L3BhcmFtPjxwYXJh
bSBrZXk9IndicF9zaG9wZXJyb3JpbmZvIiB2YWw9IlNob3AgZXJyb3IiPjwvcGFy
YW0+PHBhcmFtIGtleT0ibWVyY2hhbnRfb3JkZXJfaWQiIHZhbD0iYmFpYmlrXzA1
MDMxNTE1MjQyN18xNTFfMTUxIj48L3BhcmFtPjxwYXJhbSBrZXk9InN1bUN1cnJl
bmN5IiB2YWw9IjEwNjQzIj48L3BhcmFtPjxwYXJhbSBrZXk9IndicF9WZXJzaW9u
IiB2YWw9IjIiPjwvcGFyYW0+PHBhcmFtIGtleT0iY3BzX3VzZXJfY291bnRyeV9j
b2RlIiB2YWw9IlJVIj48L3BhcmFtPjxwYXJhbSBrZXk9IndicF9TaG9wRW5jcgSC
A+h5cHRpb25LZXkiIHZhbD0iaEFBQUVpY0JBSS9nV1o3blBtdlBDRWY2Q3lOWnJE
VC9NNWRxaHhGMElRZUIrcHY3dmV0VTFhMzVpckRSdVNoZ3dzeVVqeHNVeEhpd0Zn
b09PNTFRcWVkblZyZWVXWk8xNkFQc0haaFdGUUd3NGNaaFN6T2xDNTQ3MFBnR1NH
dC9NWlRxeGV0dVNZZTlaYm5hT01YcXkzZ3JFa3pCL1oxaWltNDBLSHRUeWV3aUlp
WEpoQUtKIj48L3BhcmFtPjxwYXJhbSBrZXk9IkVycm9yVGVtcGxhdGUiIHZhbD0i
eW0yeG1sZXJyb3IiPjwvcGFyYW0+PHBhcmFtIGtleT0iY3BzX3VzZXJfaXAiIHZh
bD0iNzcuNzUuMTUzLjIyIj48L3BhcmFtPjxwYXJhbSBrZXk9InN1Y2Nlc3NVUkwi
IHZhbD0iIj48L3BhcmFtPjxwYXJhbSBrZXk9ImNwc19jaGFuZ2VTdW0iIHZhbD0i
ZmFsc2UiPjwvcGFyYW0+PHBhcmFtIGtleT0icGF5bWVudC1uYW1lIiB2YWw9ItCR
0LDQudCx0LjQui3QqNC+0L8iPjwvcGFyYW0+PHBhcmFtIGtleT0iY3BzX3JlYmls
bGluZ0FsbG93ZWQiIHZhbD0iZmFsc2UiPjwvcGFyYW0+PHBhcmFtIGtleT0id2Jw
X1Nob3BBZGRyZXNzIiB2YWw9Ijc3Ljc1LjE1Ny4xNjc6OTEyOCI+PC9wYXJhbT48
cGFyYW0ga2V5PSJ3YnBfQ29ycmVzcG9uZGVudElEIiB2YWw9IkY1NUVGREUyRDE2
QkEwNDU2QjJEREJFNDY4QTZDMEY4QjFEMEQxMDUiPjwvcGFyYW0+PHBhcmFtIGtl
eT0id2JwX1Nob3BBZGRpdGlvbmFsQWRkcmVzcyIgdmFsPSI3Ny43NS4xNTcuMTY3
OjkxMzgiPjwvcGFyYW0+PHBhcmFtIGtleT0id2JwX0luYWN0aXZpdHlQZXJpb2Qi
IHZhbD0iMiI+PC9wYXJhbT48cGFyYW0ga2V5PSJpc1ZpYVdlYiIgdmFsPSJ0cnVl
Ij48L3BhcmFtPjxwYXJhbSBrZXk9ImNwc19yZWdpb25faWQiIHZhbD0iMiI+PC9w
YXJhbT48cGFyYW0ga2V5PSJTdWNjZXNzVGVtcGxhdGUiIHZhbD0ieW0yeG1sc3Vj
Y2VzcyI+PC9wYXJhbT48cGFyYW0ga2V5PSJXQVNob3BJRCIgdmFsPSIxOTM2ODAz
NjYwIj48L3BhcmFtPjxwYXJhbSBrZXk9ImNwcy1zb3VyY2UiIHZhbD0iBIHcZGVm
YXVsdCI+PC9wYXJhbT48cGFyYW0ga2V5PSJuc3RfdW5pbGFiZWwiIHZhbD0iMWM4
YTVlYmItMDAwMS01MDAwLTgwMDAtMDAwMDAwMDM3YzRiIj48L3BhcmFtPjxwYXJh
bSBrZXk9IndicF9tZXNzYWdldHlwZSIgdmFsPSJNb25leUludml0YXRpb25SZXF1
ZXN0Ij48L3BhcmFtPjxwYXJhbSBrZXk9InNjaWQiIHZhbD0iNTk4MTYiPjwvcGFy
YW0+PC9wYXltZW50QXZpc29SZXF1ZXN0PgAAAAAAAKCAMIIE2TCCBEKgAwIBAgIK
eSU5HgACAAA1mzANBgkqhkiG9w0BAQUFADBJMQswCQYDVQQGEwJSVTEYMBYGA1UE
ChMPUFMgWWFuZGV4Lk1vbmV5MSAwHgYDVQQDExdZYW5kZXggTW9uZXkgSXNzdWlu
ZyBDQTAeFw0xNDA0MjkwODA3MThaFw0xNjA0MjkwODE3MThaMIGpMQswCQYDVQQG
EwJSVTEPMA0GA1UECBMGUnVzc2lhMRkwFwYDVQQHExBTYWludC1QZXRlcnNidXJn
MRkwFwYDVQQKExBOS08gWWFuZGV4Lk1vbmV5MQswCQYDVQQLEwJJVDEWMBQGA1UE
AxMNUGF5bWVudENlbnRlcjEuMCwGCSqGSIb3DQEJARYfc3lzdGVtYWRtaW5pc3Ry
YXRvcnNAeWFtb25leS5ydTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB
AMuptoMIfqHmau5pMsPLU+wJxH+JX0NQhbQ/1szLrJYqYHZrlqntyeyQVfVhkYmj
de80/MN1qnDcCPlDvzODiFgysnP7k5Td+MHsqERxwPqMxTVbeZ8eM3C8LUzl4+om
GvNtrxWr7EBEiFTrUDXH0TaNyAlHuDHNm94dcBpyVKCJjFuTJZOKJiEY0PD11/fq
HEoIKrrLB0CbLdRJMkHdjK48iMLlwk984/nOeqwlqJrA1CnaUvgSmVSDL4JSDwRx
KiWg5arvYXvCNvSLaMdSCdKqYO45SrF5GAoBGlaew+HihD6GJ19r72ZNAybLfUjH
baUUSoZXO10FuavJ+Nl/828CAwEAAaOCAeEwggHdMB0GA1UdDgQWBBRGlToBHhGL
aCvdwoYSXkRTAYKhOjAfBgNVHSMEGDAWgBTmLOeIVWnILDo9dmAW41baXjKS3DA1
BgNVHR8ELjAsMCqgKKAmhiRodHRwOi8vY3Jscy55YW1vbmV5LnJ1L2lzc3Vpbmdj
YS5jcmwwgc4GCCsGAQUFBwEBBIHBMIG+MIG7BggrBgEFBQcwAoaBrmxkYXA6Ly8v
Q049WWFuZGV4JTIwTW9uZXklMjBJc3N1aW5nJTIwQ0EsQ049QUlBLENOPVB1Ymxp
YyUyMEtleSUyMFNlcnZpY2VzLENOPVNlcnZpY2VzLENOPUNvbmZpZ3VyYXRpb24s
REM9eWFtb25leSxEQz1ydT9jQUNlcnRpZmljYXRlP2Jhc2U/b2JqZWN0Q2xhc3M9
Y2VydGlmaWNhdGlvbkF1dGhvcml0eTALBgNVHQ8EBAMCB4AwPgYJKwYBBAGCNxUH
BDEwLwYnKwYBBAGCNxUIhNPQNYT06hSDyY0lh++3M4S2zAGBZ4eBn3mBhPNdAgFk
AgEEMB0GA1UdJQQWMBQGCCsGAQUFBwMEBggrBgEFBQcDAjAnBgkrBgEEAYI3FQoE
GjAYMAoGCCsGAQUFBwMEMAoGCCsGAQUFBwMCMA0GCSqGSIb3DQEBBQUAA4GBAF7A
wYyU5FWVYqSVHIqMZ5gzdtQeAy4tPr2lu6fnfq3RvOH6rbU0SAHW+Iy+4GBaeVXl
3549BxszJzZnXClDLNYpjXIIcvLRaZKYlTw/NrebqVDV5SCIxrhP9W/oRi93Rbq+
TGjVKfyV5jrf9zJ3lbWzqbwv9FrC/L0+GxYy+iW3AAAxggHdMIIB2QIBATBXMEkx
CzAJBgNVBAYTAlJVMRgwFgYDVQQKEw9QUyBZYW5kZXguTW9uZXkxIDAeBgNVBAMT
F1lhbmRleCBNb25leSBJc3N1aW5nIENBAgp5JTkeAAIAADWbMAkGBSsOAwIaBQCg
XTAYBgkqhkiG9w0BCQMxCwYJKoZIhvcNAQcBMBwGCSqGSIb3DQEJBTEPFw0xNTAz
MDUxNDQwNTdaMCMGCSqGSIb3DQEJBDEWBBSd0J93n6UUuPYBcLAchb8gQ6S33DAN
BgkqhkiG9w0BAQEFAASCAQCTqBnmim1YnBOoiCq+DgQAoz3T6qpgahF+jhlh2us7
mlW7PhcUSHr0Tq5dU3AquGh9AV0vDEChrjbRHNJgXoFETkjOW5u2sf8U9oEjI9gf
GsnMNDAmeow01LJrtJzBX/6QEV2emRJ+vuEFnGZDnB1QmVkxFbylOkaoGoVUqsxw
5NCWG7OYsyacbAVZT69M7rOiFceQpw486wLVzzdRQMFJD0RFNEdJwQDMhywa12zJ
LQnavA38TVetaOJ7A8IIoYSzDjmkwyDcA4FRRpTZ/MnjusHeuqIO5sCBx0ZEnHVv
w3Hr/6IzcWSz4FvexFHHGN2IVi47UZ4KbZ1/haWs1j+GAAAAAAAA
-----END PKCS7-----
subject=/C=RU/L=Saint-Petersburg/O=Yandex.Money/OU=IT/CN=PaymentCenter/emailAddress=systemadministrators@yamoney.ru
issuer=/C=RU/O=PS Yandex.Money/CN=Yandex Money Issuing CA
-----BEGIN CERTIFICATE-----
MIIE2TCCBEKgAwIBAgIKeSU5HgACAAA1mzANBgkqhkiG9w0BAQUFADBJMQswCQYD
VQQGEwJSVTEYMBYGA1UEChMPUFMgWWFuZGV4Lk1vbmV5MSAwHgYDVQQDExdZYW5k
ZXggTW9uZXkgSXNzdWluZyBDQTAeFw0xNDA0MjkwODA3MThaFw0xNjA0MjkwODE3
MThaMIGpMQswCQYDVQQGEwJSVTEPMA0GA1UECBMGUnVzc2lhMRkwFwYDVQQHExBT
YWludC1QZXRlcnNidXJnMRkwFwYDVQQKExBOS08gWWFuZGV4Lk1vbmV5MQswCQYD
VQQLEwJJVDEWMBQGA1UEAxMNUGF5bWVudENlbnRlcjEuMCwGCSqGSIb3DQEJARYf
c3lzdGVtYWRtaW5pc3RyYXRvcnNAeWFtb25leS5ydTCCASIwDQYJKoZIhvcNAQEB
BQADggEPADCCAQoCggEBAMuptoMIfqHmau5pMsPLU+wJxH+JX0NQhbQ/1szLrJYq
YHZrlqntyeyQVfVhkYmjde80/MN1qnDcCPlDvzODiFgysnP7k5Td+MHsqERxwPqM
xTVbeZ8eM3C8LUzl4+omGvNtrxWr7EBEiFTrUDXH0TaNyAlHuDHNm94dcBpyVKCJ
jFuTJZOKJiEY0PD11/fqHEoIKrrLB0CbLdRJMkHdjK48iMLlwk984/nOeqwlqJrA
1CnaUvgSmVSDL4JSDwRxKiWg5arvYXvCNvSLaMdSCdKqYO45SrF5GAoBGlaew+Hi
hD6GJ19r72ZNAybLfUjHbaUUSoZXO10FuavJ+Nl/828CAwEAAaOCAeEwggHdMB0G
A1UdDgQWBBRGlToBHhGLaCvdwoYSXkRTAYKhOjAfBgNVHSMEGDAWgBTmLOeIVWnI
LDo9dmAW41baXjKS3DA1BgNVHR8ELjAsMCqgKKAmhiRodHRwOi8vY3Jscy55YW1v
bmV5LnJ1L2lzc3VpbmdjYS5jcmwwgc4GCCsGAQUFBwEBBIHBMIG+MIG7BggrBgEF
BQcwAoaBrmxkYXA6Ly8vQ049WWFuZGV4JTIwTW9uZXklMjBJc3N1aW5nJTIwQ0Es
Q049QUlBLENOPVB1YmxpYyUyMEtleSUyMFNlcnZpY2VzLENOPVNlcnZpY2VzLENO
PUNvbmZpZ3VyYXRpb24sREM9eWFtb25leSxEQz1ydT9jQUNlcnRpZmljYXRlP2Jh
c2U/b2JqZWN0Q2xhc3M9Y2VydGlmaWNhdGlvbkF1dGhvcml0eTALBgNVHQ8EBAMC
B4AwPgYJKwYBBAGCNxUHBDEwLwYnKwYBBAGCNxUIhNPQNYT06hSDyY0lh++3M4S2
zAGBZ4eBn3mBhPNdAgFkAgEEMB0GA1UdJQQWMBQGCCsGAQUFBwMEBggrBgEFBQcD
AjAnBgkrBgEEAYI3FQoEGjAYMAoGCCsGAQUFBwMEMAoGCCsGAQUFBwMCMA0GCSqG
SIb3DQEBBQUAA4GBAF7AwYyU5FWVYqSVHIqMZ5gzdtQeAy4tPr2lu6fnfq3RvOH6
rbU0SAHW+Iy+4GBaeVXl3549BxszJzZnXClDLNYpjXIIcvLRaZKYlTw/NrebqVDV
5SCIxrhP9W/oRi93Rbq+TGjVKfyV5jrf9zJ3lbWzqbwv9FrC/L0+GxYy+iW3
-----END CERTIFICATE-----
subject=/C=RU/O=PS Yandex.Money/CN=Yandex Money Issuing CA
issuer=/C=RU/O=PS Yandex.Money/CN=Yandex Money Root CA
-----BEGIN CERTIFICATE-----
MIIDwDCCAqigAwIBAgIBBzANBgkqhkiG9w0BAQUFADBGMQswCQYDVQQGEwJSVTEY
MBYGA1UEChMPUFMgWWFuZGV4Lk1vbmV5MR0wGwYDVQQDExRZYW5kZXggTW9uZXkg
Um9vdCBDQTAeFw0xMzAxMTgxMzUyMTJaFw0xODAxMTcxMzUyMTJaMEkxCzAJBgNV
BAYTAlJVMRgwFgYDVQQKEw9QUyBZYW5kZXguTW9uZXkxIDAeBgNVBAMTF1lhbmRl
eCBNb25leSBJc3N1aW5nIENBMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDN
GJm1Clk6TQA0nd+FJMYaQLj58puo7dzaOSjkBex2FiQfD/DjJ3c+rBArKQO2xdEB
tnbYXsfPIx5UeqEIWAXeIV03aP5PFJgQvSCOUZc3NJ1peVc4pfIhjQ3vuULVpmUD
zLaSXkbquGCPGORnlIBcE9YFCfxWe5X/uIhkE5D8AQIDAQABo4IBODCCATQwHQYD
VR0OBBYEFOYs54hVacgsOj12YBbjVtpeMpLcMHYGA1UdIwRvMG2AFCUMTTkJAIhu
s3EnCL6nJyB6oy0QoUqkSDBGMQswCQYDVQQGEwJSVTEYMBYGA1UEChMPUFMgWWFu
ZGV4Lk1vbmV5MR0wGwYDVQQDExRZYW5kZXggTW9uZXkgUm9vdCBDQYIJAJjDBQmy
njdSMAwGA1UdEwQFMAMBAf8wLgYDVR0fBCcwJTAjoCGgH4YdaHR0cDovL2NybHMu
eWFtb25leS5ydS95bS5jcmwwCwYDVR0PBAQDAgEGMBAGCSsGAQQBgjcVAQQDAgEC
MCMGCSsGAQQBgjcVAgQWBBSef2laqr3b8E7GfhqWqtJanSJtrTAZBgkrBgEEAYI3
FAIEDB4KAFMAdQBiAEMAQTANBgkqhkiG9w0BAQUFAAOCAQEAjq8fKq/JMni/Yozn
x/JE3Q1jcYqxkew6maKCayyJAYTDbBEz6nQFOKCj0Il5Bk6RDyt2lOAkKYzumuZ7
YNF7VKf2aGoSLr7aC6ODaSdgI2snYhyOZv3625Y1L89evxQLK/wJdEd2Z0/IsUid
VOLg3Ms4eOD8etMc+lLNW7VW2v4IqPC9POak4yMGjed33ee6XU+QDI43snse+N58
qYQWXH4UK8T7yYPVgF5yXBE4HBNaGQ+qEJ61oC4QAbq3mgp8MoYB1J9yjnD5g1cT
q/104c9iRSYRmVtx0ifdJN2zDirwPLiRNzN6aNZNyI7VYeiabnW2wXf6u2/KwEpX
3Mce+g==
-----END CERTIFICATE-----
subject=/C=RU/O=PS Yandex.Money/CN=Yandex Money Root CA
issuer=/C=RU/O=PS Yandex.Money/CN=Yandex Money Root CA
-----BEGIN CERTIFICATE-----
MIID9TCCAt2gAwIBAgIJAJjDBQmynjdSMA0GCSqGSIb3DQEBBQUAMEYxCzAJBgNV
BAYTAlJVMRgwFgYDVQQKEw9QUyBZYW5kZXguTW9uZXkxHTAbBgNVBAMTFFlhbmRl
eCBNb25leSBSb290IENBMB4XDTEzMDExODEzNDIxNloXDTIzMDExNjEzNDIxNlow
RjELMAkGA1UEBhMCUlUxGDAWBgNVBAoTD1BTIFlhbmRleC5Nb25leTEdMBsGA1UE
AxMUWWFuZGV4IE1vbmV5IFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAw
ggEKAoIBAQDDFBsDMxIC5BdNHQ+VxFjF3P6fVzDwF/4W6qCaXSc29PF5msWAqZoU
/irwqaY5Hnzp2/tShQVxac2Gel59r9fN1tiuR1fT1y709vYg2sj/4Bwc/n9HJ3NS
6f5FEEJu62PawhD1XUbbXDAvFeQA5vAHmxKggE2WGRkZZCcoGcaEipvlL2oAE4HV
jW+nSn8RQvkB8hXxMXZKeKNRzHCK52Icelc1Oip0f4jPetbtduXUowAIJdyWwP3y
JKwzjtsSsBic4BWzTA0fifQN3Vxy+YPfF8jw8xkBdgEPTmWbJ83G2Jc98mYEji9b
83YPAn1OgQXn0wYHTyfzO7EhTj7voP5zAgMBAAGjgeUwgeIwHQYDVR0OBBYEFCUM
TTkJAIhus3EnCL6nJyB6oy0QMHYGA1UdIwRvMG2AFCUMTTkJAIhus3EnCL6nJyB6
oy0QoUqkSDBGMQswCQYDVQQGEwJSVTEYMBYGA1UEChMPUFMgWWFuZGV4Lk1vbmV5
MR0wGwYDVQQDExRZYW5kZXggTW9uZXkgUm9vdCBDQYIJAJjDBQmynjdSMAwGA1Ud
EwQFMAMBAf8wLgYDVR0fBCcwJTAjoCGgH4YdaHR0cDovL2NybHMueWFtb25leS5y
dS95bS5jcmwwCwYDVR0PBAQDAgEGMA0GCSqGSIb3DQEBBQUAA4IBAQAJcYTLHZgw
rsm1htBDq2YZxAqIN+dvQU9lY/tuQ/ggCL9JHkSyUbFtk8DsRWgYl9w0Y8f9HKYh
/nF6nYsfhSStIRMdyOMjfLGJp7esIqzyj0Sx88y8tnHSWs/Sls0lJIl4IS7YfHsZ
OZggRg/TGItwOtGcq6q7u19KreueVpfqAHwZygtwqf+Ic419TBpeOc6CuyFcwd2a
C4DhQKui58+sODqucGXkzSOeG97azuTFQ2Hnunv15+Jr/OwHQqKzieUf9+oBq5ZW
iQ3NHYUvgldVGW2fByvlgjG0tw6NrNwJEK0TEevgA8uNXE9FjaoqC/0+vsoQ4DMA
xsN5poPvsYTC
-----END CERTIFICATE-----
@jonny-novikov
Copy link
Author

Brilliant! I modified PemSecureMimeContext with static Create function and ability to avoid duplicate X509 certs and added simple program for this stuff P7mVerifyXml.cs which uses this crypto context and shows verification message and output request XML.
But, yes, I made method GetDigitalSignatures protected to compile this.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment