如果签名有效,我打算从EmailMessage对象(Microsoft.Exchange ...)中提取附加文件。 那是我的测试邮件:
TextView
签名验证的原则如下:计算消息(m)的散列(H(m)),并使用具有验证功能(V)的发送者公钥(pubk)将结果与签名(sig)进行比较。
表示V_pubk(H(m))= sig。
我的代码:
MIME-Version: 1.0
Content-Type: multipart/signed;
protocol="application/x-pkcs7-signature";
micalg=SHA1;
boundary="----=_NextPart_000_0039_01D1C7DA.CFEBF380"
This is a multipart message in MIME format.
------=_NextPart_000_0039_01D1C7DA.CFEBF380
Content-Type: multipart/mixed;
boundary="----=_NextPart_001_003A_01D1C7DA.CFEBF380"
------=_NextPart_001_003A_01D1C7DA.CFEBF380
Content-Type: multipart/alternative;
boundary="----=_NextPart_002_003B_01D1C7DA.CFEBF380"
------=_NextPart_002_003B_01D1C7DA.CFEBF380
Content-Type: text/plain;
charset="iso-8859-1"
Content-Transfer-Encoding: quoted-printable
{body text ...}
------=_NextPart_002_003B_01D1C7DA.CFEBF380
Content-Type: text/html;
charset="iso-8859-1"
Content-Transfer-Encoding: quoted-printable
{html formating ...}
------=_NextPart_002_003B_01D1C7DA.CFEBF380--
------=_NextPart_001_003A_01D1C7DA.CFEBF380
Content-Type: application/octet-stream;
name="s15sq07 - clearing & margining.sql"
Content-Transfer-Encoding: base64
Content-Disposition: attachment;
filename="s15sq07 - clearing & margining.sql"
{file content in base64 ...}
------=_NextPart_001_003A_01D1C7DA.CFEBF380--
------=_NextPart_000_0039_01D1C7DA.CFEBF380
Content-Type: application/pkcs7-signature;
name="smime.p7s"
Content-Transfer-Encoding: base64
Content-Disposition: attachment;
filename="smime.p7s"
{signature ...}
------=_NextPart_000_0039_01D1C7DA.CFEBF380--
我尝试Howto Verify Signature of a SMIME multipart/signed application/x-pkcs7-signature Mail,http://www.mimekit.net/docs/html/WorkingWithSMime.htm(页面底部):
private static bool iDoHandleMail( EmailMessage msg )
{
try
{
msg.Load( new PropertySet( EmailMessageSchema.Attachments ) );
foreach ( Attachment att in msg.Attachments )
{
FileAttachment fatt = att as FileAttachment;
if ( fatt == null )
continue;
using ( MemoryStream ms = new MemoryStream( ) )
{
fatt.Load( ms );
ms.Position = 0;
MimeKit.MimeMessage mmsg = MimeKit.MimeMessage.Load( ms );
然后我尝试了这个没有成功:
foreach ( MimeEntity me in mmsg.BodyParts )
{
if ( string.IsNullOrEmpty( me.ContentType.Name ) ) continue;
if (me.ContentType.Name.EndsWith("p7s"))
{
ApplicationPkcs7Mime sig = me as ApplicationPkcs7Mime;
if (sig != null) // is always null; mmsg.body as ApplicationPkcs7Mime is also null
现在我达到了我无法进一步思考的程度......