1 // Licensed to the .NET Foundation under one or more agreements. 2 // The .NET Foundation licenses this file to you under the MIT license. 3 // See the LICENSE file in the project root for more information. 4 5 using System.IO; 6 using System.Linq; 7 using System.Globalization; 8 using System.Collections.Generic; 9 using System.Security.Cryptography; 10 using System.Runtime.InteropServices; 11 using System.Text; 12 using System.Security.Cryptography.Pkcs; 13 using System.Security.Cryptography.Xml; 14 using System.Security.Cryptography.X509Certificates; 15 using Xunit; 16 17 using Test.Cryptography; 18 using System.Security.Cryptography.Pkcs.Tests; 19 20 namespace System.Security.Cryptography.Pkcs.EnvelopedCmsTests.Tests 21 { 22 public static partial class GeneralTests 23 { 24 [Fact] DecodeVersion0_RoundTrip()25 public static void DecodeVersion0_RoundTrip() 26 { 27 ContentInfo contentInfo = new ContentInfo(new byte[] { 1, 2, 3 }); 28 EnvelopedCms ecms = new EnvelopedCms(contentInfo); 29 using (X509Certificate2 cert = Certificates.RSAKeyTransfer1.GetCertificate()) 30 { 31 CmsRecipient cmsRecipient = new CmsRecipient(cert); 32 ecms.Encrypt(cmsRecipient); 33 } 34 byte[] encodedMessage = ecms.Encode(); 35 36 VerifyVersion0(encodedMessage); 37 } 38 39 [Fact] DecodeVersion0_FixedValue()40 public static void DecodeVersion0_FixedValue() 41 { 42 byte[] encodedMessage = 43 ("3082010c06092a864886f70d010703a081fe3081fb0201003181c83081c5020100302e301a311830160603550403130f5253" 44 + "414b65795472616e7366657231021031d935fb63e8cfab48a0bf7b397b67c0300d06092a864886f70d010101050004818013" 45 + "dc0eb2984a445d04a1f6246b8fe41f1d24507548d449d454d5bb5e0638d75ed101bf78c0155a5d208eb746755fbccbc86923" 46 + "8443760a9ae94770d6373e0197be23a6a891f0c522ca96b3e8008bf23547474b7e24e7f32e8134df3862d84f4dea2470548e" 47 + "c774dd74f149a56cdd966e141122900d00ad9d10ea1848541294a1302b06092a864886f70d010701301406082a864886f70d" 48 + "030704089c8119f6cf6b174c8008bcea3a10d0737eb9").HexToByteArray(); 49 50 VerifyVersion0(encodedMessage); 51 } 52 VerifyVersion0(byte[] encodedMessage)53 private static void VerifyVersion0(byte[] encodedMessage) 54 { 55 EnvelopedCms ecms = new EnvelopedCms(); 56 ecms.Decode(encodedMessage); 57 int version = ecms.Version; 58 Assert.Equal(0, version); 59 } 60 61 [Fact] DecodeRecipients3_RoundTrip()62 public static void DecodeRecipients3_RoundTrip() 63 { 64 ContentInfo contentInfo = new ContentInfo(new byte[] { 1, 2, 3 }); 65 EnvelopedCms ecms = new EnvelopedCms(contentInfo); 66 CmsRecipientCollection recipients = new CmsRecipientCollection(); 67 foreach (X509Certificate2 cert in s_certs) 68 { 69 recipients.Add(new CmsRecipient(cert)); 70 } 71 ecms.Encrypt(recipients); 72 byte[] encodedMessage = ecms.Encode(); 73 74 VerifyRecipients3(encodedMessage); 75 } 76 77 [Fact] DecodeRecipients3_FixedValue()78 public static void DecodeRecipients3_FixedValue() 79 { 80 byte[] encodedMessage = 81 ("3082032b06092a864886f70d010703a082031c30820318020102318202e43081c5020100302e301a31183016060355040313" 82 + "0f5253414b65795472616e7366657231021031d935fb63e8cfab48a0bf7b397b67c0300d06092a864886f70d010101050004" 83 + "81805d4b13a055c512c2367db4ac4ad4470415ef1113ee78f6b22d114873759ddc1135027f59a8583d24527ceee38b34be52" 84 + "22400e37a265d5b4be67df685a21db2a1512d46d857c9c9ac8d801807131118efe68b8f89bfb81c06171cf12756e679bd518" 85 + "3501193a86bb3b3893a34d6907698e2391701a0ddcd8fe337734db83a54c3081c5020100302e301a31183016060355040313" 86 + "0f5253414b65795472616e736665723202102bce9f9ece39f98044f0cd2faa9a14e7300d06092a864886f70d010101050004" 87 + "818030e318a393ec982869cccec4d7ea24106f996892abf35c4faa0f88b0d2f5d97371f761ef2e60dfe46b9c63bc004a433a" 88 + "16504adeda4edb3f37d3da5e602d97d8a049bca07c0e092c1f43682d8b8ba0c8f495ba0265231f68624e74d263efee580629" 89 + "b97e4faf8d66c053f9bf214ed76a2e81b03b0771baacd0b07ee775d06244a1820150020103a08195a18192300906072a8648" 90 + "ce3e02010381840002818054287a01a44b38468f629e28d11b9f80de6cb0ab3dc0828cf41ff077d256beafaf06ae111e5235" 91 + "d90c57a37a22fb10fd22d11fb47f0c278d5b23c5914475452dcac8cfb6bff3f326450ab7a666c183f89f96d966336464cc2f" 92 + "39f61263996c3e56b9e782b8264a4e8cd57e5576174dca5d02bc7f33f7fdfe71af1ff1f11b287b301e060b2a864886f70d01" 93 + "09100305300f060b2a864886f70d0109100306050030819230818f3063304f314d304b06035504031e44004d0061006e0061" 94 + "00670065006400200050004b00430053002300370020005400650073007400200052006f006f007400200041007500740068" 95 + "006f007200690074007902100ae59b0cb8119f8942eda74163413a0204285aadd33713104d128c5e1d70d9281f7c0df6fa42" 96 + "64fd9fa77fcde800aaf8ea33d533b8572a1b9c4a302b06092a864886f70d010701301406082a864886f70d03070408fc6d30" 97 + "2f218ea61f8008de1137262232ceae").HexToByteArray(); 98 99 VerifyRecipients3(encodedMessage); 100 } 101 VerifyRecipients3(byte[] encodedMessage)102 private static void VerifyRecipients3(byte[] encodedMessage) 103 { 104 string[] expectedIssuers = s_certs.Select(c => c.Issuer).OrderBy(s => s).ToArray(); 105 106 EnvelopedCms ecms = new EnvelopedCms(); 107 ecms.Decode(encodedMessage); 108 109 RecipientInfoCollection col = ecms.RecipientInfos; 110 int numRecipients = col.Count; 111 Assert.Equal(3, numRecipients); 112 113 RecipientInfo[] recipients = new RecipientInfo[numRecipients]; 114 col.CopyTo(recipients, 0); 115 116 string[] actualIssuers = recipients.Select(r => r.RecipientIdentifier.Value).Cast<X509IssuerSerial>().Select(xis => xis.IssuerName).OrderBy(s => s).ToArray(); 117 Assert.Equal<string>(expectedIssuers, actualIssuers); 118 } 119 120 [Fact] TestGetContentTypeEnveloped()121 public static void TestGetContentTypeEnveloped() 122 { 123 byte[] encodedMessage = 124 ("3082010c06092a864886f70d010703a081fe3081fb0201003181c83081c5020100302e301a311830160603550403130f5253" 125 + "414b65795472616e7366657231021031d935fb63e8cfab48a0bf7b397b67c0300d06092a864886f70d010101050004818013" 126 + "dc0eb2984a445d04a1f6246b8fe41f1d24507548d449d454d5bb5e0638d75ed101bf78c0155a5d208eb746755fbccbc86923" 127 + "8443760a9ae94770d6373e0197be23a6a891f0c522ca96b3e8008bf23547474b7e24e7f32e8134df3862d84f4dea2470548e" 128 + "c774dd74f149a56cdd966e141122900d00ad9d10ea1848541294a1302b06092a864886f70d010701301406082a864886f70d" 129 + "030704089c8119f6cf6b174c8008bcea3a10d0737eb9").HexToByteArray(); 130 131 Oid contentType = ContentInfo.GetContentType(encodedMessage); 132 Assert.Equal(Oids.Pkcs7Enveloped, contentType.Value); 133 } 134 135 [Fact] TestContentTypeSigned()136 public static void TestContentTypeSigned() 137 { 138 byte[] encodedMessage = 139 ("3082032506092a864886f70d010702a082031630820312020101310b300906052b0e03021a0500301206092a864886f70d01" 140 + "0701a0050403010203a08202103082020c30820179a00302010202105d2ffff863babc9b4d3c80ab178a4cca300906052b0e" 141 + "03021d0500301e311c301a060355040313135253414b65795472616e736665724361706931301e170d313530343135303730" 142 + "3030305a170d3235303431353037303030305a301e311c301a060355040313135253414b65795472616e7366657243617069" 143 + "3130819f300d06092a864886f70d010101050003818d0030818902818100aa272700586c0cc41b05c65c7d846f5a2bc27b03" 144 + "e301c37d9bff6d75b6eb6671ba9596c5c63ba2b1af5c318d9ca39e7400d10c238ac72630579211b86570d1a1d44ec86aa8f6" 145 + "c9d2b4e283ea3535923f398a312a23eaeacd8d34faaca965cd910b37da4093ef76c13b337c1afab7d1d07e317b41a336baa4" 146 + "111299f99424408d0203010001a3533051304f0603551d0104483046801015432db116b35d07e4ba89edb2469d7aa120301e" 147 + "311c301a060355040313135253414b65795472616e73666572436170693182105d2ffff863babc9b4d3c80ab178a4cca3009" 148 + "06052b0e03021d05000381810081e5535d8eceef265acbc82f6c5f8bc9d84319265f3ccf23369fa533c8dc1938952c593166" 149 + "2d9ecd8b1e7b81749e48468167e2fce3d019fa70d54646975b6dc2a3ba72d5a5274c1866da6d7a5df47938e034a075d11957" 150 + "d653b5c78e5291e4401045576f6d4eda81bef3c369af56121e49a083c8d1adb09f291822e99a4296463181d73081d4020101" 151 + "3032301e311c301a060355040313135253414b65795472616e73666572436170693102105d2ffff863babc9b4d3c80ab178a" 152 + "4cca300906052b0e03021a0500300d06092a864886f70d010101050004818031a718ea1483c88494661e1d3dedfea0a3d97e" 153 + "eb64c3e093a628b257c0cfc183ecf11697ac84f2af882b8de0c793572af38dc15d1b6f3d8f2392ba1cc71210e177c146fd16" 154 + "b77a583b6411e801d7a2640d612f2fe99d87e9718e0e505a7ab9536d71dbde329da21816ce7da1416a74a3e0a112b86b33af" 155 + "336a2ba6ae2443d0ab").HexToByteArray(); 156 157 Oid contentType = ContentInfo.GetContentType(encodedMessage); 158 Assert.Equal(Oids.Pkcs7Signed, contentType.Value); 159 } 160 161 private static X509Certificate2[] s_certs = 162 { 163 Certificates.RSAKeyTransfer1.GetCertificate(), 164 Certificates.RSAKeyTransfer2.GetCertificate(), 165 Certificates.DHKeyAgree1.GetCertificate(), 166 }; 167 } 168 } 169 170 171