Exemplo n.º 1
0
        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);
        }
Exemplo n.º 2
0
        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);
        }
Exemplo n.º 3
0
        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);
                }
            }
        }
Exemplo n.º 4
0
        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);
     }
 }