public void Decode (byte[] encodedMessage) { if (encodedMessage == null) throw new ArgumentNullException ("encodedMessage"); PKCS7.ContentInfo ci = new PKCS7.ContentInfo (encodedMessage); if (ci.ContentType != PKCS7.Oid.envelopedData) throw new Exception (""); PKCS7.EnvelopedData ed = new PKCS7.EnvelopedData (ci.Content); Oid oid = new Oid (ed.ContentInfo.ContentType); _content = new ContentInfo (oid, new byte [0]); //ed.ContentInfo.Content.Value); foreach (PKCS7.RecipientInfo ri in ed.RecipientInfos) { Oid o = new Oid (ri.Oid); AlgorithmIdentifier ai = new AlgorithmIdentifier (o); SubjectIdentifier si = null; if (ri.SubjectKeyIdentifier != null) { si = new SubjectIdentifier (SubjectIdentifierType.SubjectKeyIdentifier, ri.SubjectKeyIdentifier); } else if ((ri.Issuer != null) && (ri.Serial != null)) { X509IssuerSerial xis = GetIssuerSerial (ri.Issuer, ri.Serial); si = new SubjectIdentifier (SubjectIdentifierType.IssuerAndSerialNumber, (object)xis); } KeyTransRecipientInfo _keyTrans = new KeyTransRecipientInfo (ri.Key, ai, si, ri.Version); _recipients.Add (_keyTrans); } // TODO - Certificates // TODO - UnprotectedAttributes _version = ed.Version; }
private Exception TryDecryptTrans(KeyTransRecipientInfo recipientInfo, SafeProvOrNCryptKeyHandle hKey, CryptKeySpec keySpec) { KeyTransRecipientInfoPalWindows pal = (KeyTransRecipientInfoPalWindows)(recipientInfo.Pal); CMSG_CTRL_DECRYPT_PARA decryptPara; decryptPara.cbSize = Marshal.SizeOf<CMSG_CTRL_DECRYPT_PARA>(); decryptPara.hKey = hKey; decryptPara.dwKeySpec = keySpec; decryptPara.dwRecipientIndex = pal.Index; bool success = Interop.Crypt32.CryptMsgControl(_hCryptMsg, 0, MsgControlType.CMSG_CTRL_DECRYPT, ref decryptPara); if (!success) return Marshal.GetHRForLastWin32Error().ToCryptographicException(); return null; }