private static unsafe void TimestampSignedLicenseDom(XmlDocument licenseDom, string timeStampUrl) { System.Deployment.Internal.CodeSigning.Win32.CRYPT_DATA_BLOB pTimestampSignatureBlob = new System.Deployment.Internal.CodeSigning.Win32.CRYPT_DATA_BLOB(); XmlNamespaceManager nsmgr = new XmlNamespaceManager(licenseDom.NameTable); nsmgr.AddNamespace("r", "urn:mpeg:mpeg21:2003:01-REL-R-NS"); nsmgr.AddNamespace("ds", "http://www.w3.org/2000/09/xmldsig#"); nsmgr.AddNamespace("as", "http://schemas.microsoft.com/windows/pki/2005/Authenticode"); byte[] bytes = Encoding.UTF8.GetBytes(licenseDom.OuterXml); fixed(byte *numRef = bytes) { System.Deployment.Internal.CodeSigning.Win32.CRYPT_DATA_BLOB pSignedLicenseBlob = new System.Deployment.Internal.CodeSigning.Win32.CRYPT_DATA_BLOB(); IntPtr ptr = new IntPtr((void *)numRef); pSignedLicenseBlob.cbData = (uint)bytes.Length; pSignedLicenseBlob.pbData = ptr; int hr = System.Deployment.Internal.CodeSigning.Win32.CertTimestampAuthenticodeLicense(ref pSignedLicenseBlob, timeStampUrl, ref pTimestampSignatureBlob); if (hr != 0) { throw new CryptographicException(hr); } } byte[] destination = new byte[pTimestampSignatureBlob.cbData]; Marshal.Copy(pTimestampSignatureBlob.pbData, destination, 0, destination.Length); System.Deployment.Internal.CodeSigning.Win32.HeapFree(System.Deployment.Internal.CodeSigning.Win32.GetProcessHeap(), 0, pTimestampSignatureBlob.pbData); XmlElement newChild = licenseDom.CreateElement("as", "Timestamp", "http://schemas.microsoft.com/windows/pki/2005/Authenticode"); newChild.InnerText = Encoding.UTF8.GetString(destination); XmlElement element2 = licenseDom.CreateElement("Object", "http://www.w3.org/2000/09/xmldsig#"); element2.AppendChild(newChild); (licenseDom.SelectSingleNode("r:license/r:issuer/ds:Signature", nsmgr) as XmlElement).AppendChild(element2); }
private unsafe string VerifyPublicKeyToken() { byte[] buffer4; XmlNamespaceManager nsmgr = new XmlNamespaceManager(this.m_manifestDom.NameTable); nsmgr.AddNamespace("asm", "urn:schemas-microsoft-com:asm.v1"); nsmgr.AddNamespace("ds", "http://www.w3.org/2000/09/xmldsig#"); XmlElement element = this.m_manifestDom.SelectSingleNode("asm:assembly/ds:Signature/ds:KeyInfo/ds:KeyValue/ds:RSAKeyValue/ds:Modulus", nsmgr) as XmlElement; XmlElement element2 = this.m_manifestDom.SelectSingleNode("asm:assembly/ds:Signature/ds:KeyInfo/ds:KeyValue/ds:RSAKeyValue/ds:Exponent", nsmgr) as XmlElement; if ((element == null) || (element2 == null)) { throw new CryptographicException(-2146762749); } byte[] bytes = Encoding.UTF8.GetBytes(element.InnerXml); byte[] buffer2 = Encoding.UTF8.GetBytes(element2.InnerXml); string publicKeyToken = GetPublicKeyToken(this.m_manifestDom); byte[] buffer3 = HexStringToBytes(publicKeyToken); fixed(byte *numRef = bytes) { fixed(byte *numRef2 = buffer2) { System.Deployment.Internal.CodeSigning.Win32.CRYPT_DATA_BLOB pModulusBlob = new System.Deployment.Internal.CodeSigning.Win32.CRYPT_DATA_BLOB(); System.Deployment.Internal.CodeSigning.Win32.CRYPT_DATA_BLOB pExponentBlob = new System.Deployment.Internal.CodeSigning.Win32.CRYPT_DATA_BLOB(); IntPtr ppwszPublicKeyToken = new IntPtr(); pModulusBlob.cbData = (uint)bytes.Length; pModulusBlob.pbData = new IntPtr((void *)numRef); pExponentBlob.cbData = (uint)buffer2.Length; pExponentBlob.pbData = new IntPtr((void *)numRef2); int hr = System.Deployment.Internal.CodeSigning.Win32._AxlRSAKeyValueToPublicKeyToken(ref pModulusBlob, ref pExponentBlob, ref ppwszPublicKeyToken); if (hr != 0) { throw new CryptographicException(hr); } buffer4 = HexStringToBytes(Marshal.PtrToStringUni(ppwszPublicKeyToken)); System.Deployment.Internal.CodeSigning.Win32.HeapFree(System.Deployment.Internal.CodeSigning.Win32.GetProcessHeap(), 0, ppwszPublicKeyToken); } } if ((buffer3.Length == 0) || (buffer3.Length != buffer4.Length)) { throw new CryptographicException(-2146762485); } for (int i = 0; i < buffer3.Length; i++) { if (buffer3[i] != buffer4[i]) { throw new CryptographicException(-2146762485); } } return(publicKeyToken); }
private unsafe void VerifyLicense(System.Deployment.Internal.CodeSigning.CmiManifestVerifyFlags verifyFlags, bool oldFormat) { XmlNamespaceManager nsmgr = new XmlNamespaceManager(this.m_manifestDom.NameTable); nsmgr.AddNamespace("asm", "urn:schemas-microsoft-com:asm.v1"); nsmgr.AddNamespace("asm2", "urn:schemas-microsoft-com:asm.v2"); nsmgr.AddNamespace("ds", "http://www.w3.org/2000/09/xmldsig#"); nsmgr.AddNamespace("msrel", "http://schemas.microsoft.com/windows/rel/2005/reldata"); nsmgr.AddNamespace("r", "urn:mpeg:mpeg21:2003:01-REL-R-NS"); nsmgr.AddNamespace("as", "http://schemas.microsoft.com/windows/pki/2005/Authenticode"); XmlElement element = this.m_manifestDom.SelectSingleNode("asm:assembly/ds:Signature/ds:KeyInfo/msrel:RelData/r:license", nsmgr) as XmlElement; if (element != null) { this.VerifyAssemblyIdentity(nsmgr); this.m_authenticodeSignerInfo = new System.Deployment.Internal.CodeSigning.CmiAuthenticodeSignerInfo(-2146762485); byte[] bytes = Encoding.UTF8.GetBytes(element.OuterXml); fixed(byte *numRef = bytes) { System.Deployment.Internal.CodeSigning.Win32.AXL_SIGNER_INFO pSignerInfo = new System.Deployment.Internal.CodeSigning.Win32.AXL_SIGNER_INFO { cbSize = (uint)Marshal.SizeOf(typeof(System.Deployment.Internal.CodeSigning.Win32.AXL_SIGNER_INFO)) }; System.Deployment.Internal.CodeSigning.Win32.AXL_TIMESTAMPER_INFO pTimestamperInfo = new System.Deployment.Internal.CodeSigning.Win32.AXL_TIMESTAMPER_INFO { cbSize = (uint)Marshal.SizeOf(typeof(System.Deployment.Internal.CodeSigning.Win32.AXL_TIMESTAMPER_INFO)) }; System.Deployment.Internal.CodeSigning.Win32.CRYPT_DATA_BLOB pLicenseBlob = new System.Deployment.Internal.CodeSigning.Win32.CRYPT_DATA_BLOB(); IntPtr ptr = new IntPtr((void *)numRef); pLicenseBlob.cbData = (uint)bytes.Length; pLicenseBlob.pbData = ptr; int hr = System.Deployment.Internal.CodeSigning.Win32.CertVerifyAuthenticodeLicense(ref pLicenseBlob, (uint)verifyFlags, ref pSignerInfo, ref pTimestamperInfo); if (0x800b0100 != pSignerInfo.dwError) { this.m_authenticodeSignerInfo = new System.Deployment.Internal.CodeSigning.CmiAuthenticodeSignerInfo(pSignerInfo, pTimestamperInfo); } System.Deployment.Internal.CodeSigning.Win32.CertFreeAuthenticodeSignerInfo(ref pSignerInfo); System.Deployment.Internal.CodeSigning.Win32.CertFreeAuthenticodeTimestamperInfo(ref pTimestamperInfo); if (hr != 0) { throw new CryptographicException(hr); } } if (!oldFormat) { this.VerifyPublisherIdentity(nsmgr); } } }
private static unsafe void ReplacePublicKeyToken(XmlDocument manifestDom, AsymmetricAlgorithm snKey) { XmlNamespaceManager nsmgr = new XmlNamespaceManager(manifestDom.NameTable); nsmgr.AddNamespace("asm", "urn:schemas-microsoft-com:asm.v1"); XmlElement element = manifestDom.SelectSingleNode("asm:assembly/asm:assemblyIdentity", nsmgr) as XmlElement; if (element == null) { throw new CryptographicException(-2146762749); } if (!element.HasAttribute("publicKeyToken")) { throw new CryptographicException(-2146762749); } byte[] buffer = ((RSACryptoServiceProvider)snKey).ExportCspBlob(false); if ((buffer == null) || (buffer.Length == 0)) { throw new CryptographicException(-2146893821); } fixed(byte *numRef = buffer) { System.Deployment.Internal.CodeSigning.Win32.CRYPT_DATA_BLOB pCspPublicKeyBlob = new System.Deployment.Internal.CodeSigning.Win32.CRYPT_DATA_BLOB { cbData = (uint)buffer.Length, pbData = new IntPtr((void *)numRef) }; IntPtr ppwszPublicKeyToken = new IntPtr(); int hr = System.Deployment.Internal.CodeSigning.Win32._AxlPublicKeyBlobToPublicKeyToken(ref pCspPublicKeyBlob, ref ppwszPublicKeyToken); if (hr != 0) { throw new CryptographicException(hr); } string str = Marshal.PtrToStringUni(ppwszPublicKeyToken); System.Deployment.Internal.CodeSigning.Win32.HeapFree(System.Deployment.Internal.CodeSigning.Win32.GetProcessHeap(), 0, ppwszPublicKeyToken); element.SetAttribute("publicKeyToken", str); } }
private unsafe string VerifyPublicKeyToken() { byte[] buffer4; XmlNamespaceManager nsmgr = new XmlNamespaceManager(this.m_manifestDom.NameTable); nsmgr.AddNamespace("asm", "urn:schemas-microsoft-com:asm.v1"); nsmgr.AddNamespace("ds", "http://www.w3.org/2000/09/xmldsig#"); XmlElement element = this.m_manifestDom.SelectSingleNode("asm:assembly/ds:Signature/ds:KeyInfo/ds:KeyValue/ds:RSAKeyValue/ds:Modulus", nsmgr) as XmlElement; XmlElement element2 = this.m_manifestDom.SelectSingleNode("asm:assembly/ds:Signature/ds:KeyInfo/ds:KeyValue/ds:RSAKeyValue/ds:Exponent", nsmgr) as XmlElement; if ((element == null) || (element2 == null)) { throw new CryptographicException(-2146762749); } byte[] bytes = Encoding.UTF8.GetBytes(element.InnerXml); byte[] buffer2 = Encoding.UTF8.GetBytes(element2.InnerXml); string publicKeyToken = GetPublicKeyToken(this.m_manifestDom); byte[] buffer3 = HexStringToBytes(publicKeyToken); fixed (byte* numRef = bytes) { fixed (byte* numRef2 = buffer2) { System.Deployment.Internal.CodeSigning.Win32.CRYPT_DATA_BLOB pModulusBlob = new System.Deployment.Internal.CodeSigning.Win32.CRYPT_DATA_BLOB(); System.Deployment.Internal.CodeSigning.Win32.CRYPT_DATA_BLOB pExponentBlob = new System.Deployment.Internal.CodeSigning.Win32.CRYPT_DATA_BLOB(); IntPtr ppwszPublicKeyToken = new IntPtr(); pModulusBlob.cbData = (uint) bytes.Length; pModulusBlob.pbData = new IntPtr((void*) numRef); pExponentBlob.cbData = (uint) buffer2.Length; pExponentBlob.pbData = new IntPtr((void*) numRef2); int hr = System.Deployment.Internal.CodeSigning.Win32._AxlRSAKeyValueToPublicKeyToken(ref pModulusBlob, ref pExponentBlob, ref ppwszPublicKeyToken); if (hr != 0) { throw new CryptographicException(hr); } buffer4 = HexStringToBytes(Marshal.PtrToStringUni(ppwszPublicKeyToken)); System.Deployment.Internal.CodeSigning.Win32.HeapFree(System.Deployment.Internal.CodeSigning.Win32.GetProcessHeap(), 0, ppwszPublicKeyToken); } } if ((buffer3.Length == 0) || (buffer3.Length != buffer4.Length)) { throw new CryptographicException(-2146762485); } for (int i = 0; i < buffer3.Length; i++) { if (buffer3[i] != buffer4[i]) { throw new CryptographicException(-2146762485); } } return publicKeyToken; }
private unsafe void VerifyLicense(System.Deployment.Internal.CodeSigning.CmiManifestVerifyFlags verifyFlags, bool oldFormat) { XmlNamespaceManager nsmgr = new XmlNamespaceManager(this.m_manifestDom.NameTable); nsmgr.AddNamespace("asm", "urn:schemas-microsoft-com:asm.v1"); nsmgr.AddNamespace("asm2", "urn:schemas-microsoft-com:asm.v2"); nsmgr.AddNamespace("ds", "http://www.w3.org/2000/09/xmldsig#"); nsmgr.AddNamespace("msrel", "http://schemas.microsoft.com/windows/rel/2005/reldata"); nsmgr.AddNamespace("r", "urn:mpeg:mpeg21:2003:01-REL-R-NS"); nsmgr.AddNamespace("as", "http://schemas.microsoft.com/windows/pki/2005/Authenticode"); XmlElement element = this.m_manifestDom.SelectSingleNode("asm:assembly/ds:Signature/ds:KeyInfo/msrel:RelData/r:license", nsmgr) as XmlElement; if (element != null) { this.VerifyAssemblyIdentity(nsmgr); this.m_authenticodeSignerInfo = new System.Deployment.Internal.CodeSigning.CmiAuthenticodeSignerInfo(-2146762485); byte[] bytes = Encoding.UTF8.GetBytes(element.OuterXml); fixed (byte* numRef = bytes) { System.Deployment.Internal.CodeSigning.Win32.AXL_SIGNER_INFO pSignerInfo = new System.Deployment.Internal.CodeSigning.Win32.AXL_SIGNER_INFO { cbSize = (uint) Marshal.SizeOf(typeof(System.Deployment.Internal.CodeSigning.Win32.AXL_SIGNER_INFO)) }; System.Deployment.Internal.CodeSigning.Win32.AXL_TIMESTAMPER_INFO pTimestamperInfo = new System.Deployment.Internal.CodeSigning.Win32.AXL_TIMESTAMPER_INFO { cbSize = (uint) Marshal.SizeOf(typeof(System.Deployment.Internal.CodeSigning.Win32.AXL_TIMESTAMPER_INFO)) }; System.Deployment.Internal.CodeSigning.Win32.CRYPT_DATA_BLOB pLicenseBlob = new System.Deployment.Internal.CodeSigning.Win32.CRYPT_DATA_BLOB(); IntPtr ptr = new IntPtr((void*) numRef); pLicenseBlob.cbData = (uint) bytes.Length; pLicenseBlob.pbData = ptr; int hr = System.Deployment.Internal.CodeSigning.Win32.CertVerifyAuthenticodeLicense(ref pLicenseBlob, (uint) verifyFlags, ref pSignerInfo, ref pTimestamperInfo); if (0x800b0100 != pSignerInfo.dwError) { this.m_authenticodeSignerInfo = new System.Deployment.Internal.CodeSigning.CmiAuthenticodeSignerInfo(pSignerInfo, pTimestamperInfo); } System.Deployment.Internal.CodeSigning.Win32.CertFreeAuthenticodeSignerInfo(ref pSignerInfo); System.Deployment.Internal.CodeSigning.Win32.CertFreeAuthenticodeTimestamperInfo(ref pTimestamperInfo); if (hr != 0) { throw new CryptographicException(hr); } } if (!oldFormat) { this.VerifyPublisherIdentity(nsmgr); } } }
private static unsafe void TimestampSignedLicenseDom(XmlDocument licenseDom, string timeStampUrl) { System.Deployment.Internal.CodeSigning.Win32.CRYPT_DATA_BLOB pTimestampSignatureBlob = new System.Deployment.Internal.CodeSigning.Win32.CRYPT_DATA_BLOB(); XmlNamespaceManager nsmgr = new XmlNamespaceManager(licenseDom.NameTable); nsmgr.AddNamespace("r", "urn:mpeg:mpeg21:2003:01-REL-R-NS"); nsmgr.AddNamespace("ds", "http://www.w3.org/2000/09/xmldsig#"); nsmgr.AddNamespace("as", "http://schemas.microsoft.com/windows/pki/2005/Authenticode"); byte[] bytes = Encoding.UTF8.GetBytes(licenseDom.OuterXml); fixed (byte* numRef = bytes) { System.Deployment.Internal.CodeSigning.Win32.CRYPT_DATA_BLOB pSignedLicenseBlob = new System.Deployment.Internal.CodeSigning.Win32.CRYPT_DATA_BLOB(); IntPtr ptr = new IntPtr((void*) numRef); pSignedLicenseBlob.cbData = (uint) bytes.Length; pSignedLicenseBlob.pbData = ptr; int hr = System.Deployment.Internal.CodeSigning.Win32.CertTimestampAuthenticodeLicense(ref pSignedLicenseBlob, timeStampUrl, ref pTimestampSignatureBlob); if (hr != 0) { throw new CryptographicException(hr); } } byte[] destination = new byte[pTimestampSignatureBlob.cbData]; Marshal.Copy(pTimestampSignatureBlob.pbData, destination, 0, destination.Length); System.Deployment.Internal.CodeSigning.Win32.HeapFree(System.Deployment.Internal.CodeSigning.Win32.GetProcessHeap(), 0, pTimestampSignatureBlob.pbData); XmlElement newChild = licenseDom.CreateElement("as", "Timestamp", "http://schemas.microsoft.com/windows/pki/2005/Authenticode"); newChild.InnerText = Encoding.UTF8.GetString(destination); XmlElement element2 = licenseDom.CreateElement("Object", "http://www.w3.org/2000/09/xmldsig#"); element2.AppendChild(newChild); (licenseDom.SelectSingleNode("r:license/r:issuer/ds:Signature", nsmgr) as XmlElement).AppendChild(element2); }
private static unsafe void ReplacePublicKeyToken(XmlDocument manifestDom, AsymmetricAlgorithm snKey) { XmlNamespaceManager nsmgr = new XmlNamespaceManager(manifestDom.NameTable); nsmgr.AddNamespace("asm", "urn:schemas-microsoft-com:asm.v1"); XmlElement element = manifestDom.SelectSingleNode("asm:assembly/asm:assemblyIdentity", nsmgr) as XmlElement; if (element == null) { throw new CryptographicException(-2146762749); } if (!element.HasAttribute("publicKeyToken")) { throw new CryptographicException(-2146762749); } byte[] buffer = ((RSACryptoServiceProvider) snKey).ExportCspBlob(false); if ((buffer == null) || (buffer.Length == 0)) { throw new CryptographicException(-2146893821); } fixed (byte* numRef = buffer) { System.Deployment.Internal.CodeSigning.Win32.CRYPT_DATA_BLOB pCspPublicKeyBlob = new System.Deployment.Internal.CodeSigning.Win32.CRYPT_DATA_BLOB { cbData = (uint) buffer.Length, pbData = new IntPtr((void*) numRef) }; IntPtr ppwszPublicKeyToken = new IntPtr(); int hr = System.Deployment.Internal.CodeSigning.Win32._AxlPublicKeyBlobToPublicKeyToken(ref pCspPublicKeyBlob, ref ppwszPublicKeyToken); if (hr != 0) { throw new CryptographicException(hr); } string str = Marshal.PtrToStringUni(ppwszPublicKeyToken); System.Deployment.Internal.CodeSigning.Win32.HeapFree(System.Deployment.Internal.CodeSigning.Win32.GetProcessHeap(), 0, ppwszPublicKeyToken); element.SetAttribute("publicKeyToken", str); } }