コード例 #1
0
        public PublicKey Open()
        {
            var dialog = new OpenFileDialog()
            {
                Filter           = PickFilenameConstants.StrongNameKeyFilter,
                RestoreDirectory = true,
            };

            if (dialog.ShowDialog() != DialogResult.OK)
            {
                return(null);
            }
            if (string.IsNullOrEmpty(dialog.FileName))
            {
                return(null);
            }

            try {
                var snk = new StrongNameKey(dialog.FileName);
                return(new PublicKey(snk.PublicKey));
            }
            catch {
            }

            try {
                var snk = new StrongNamePublicKey(dialog.FileName);
                return(new PublicKey(snk.CreatePublicKey()));
            }
            catch {
            }

            MsgBox.Instance.Show(string.Format(dnSpy_AsmEditor_Resources.Error_NotSNKFile, dialog.FileName), MsgBoxButton.OK, ownerWindow);
            return(null);
        }
コード例 #2
0
        public void CanSignAssembly(string inputAssembly, string outputAssembly)
        {
            string keyFile = Path.Combine(KeyDir, "test.snk");
            var    key     = new StrongNameKey(keyFile);

            var signer = new StrongNameSigner();

            signer.SignAssembly(inputAssembly, key, outputAssembly);

            if (Environment.OSVersion.Platform == PlatformID.Win32NT)
            {
                int exitCode = Exec.RunNetFxTool("sn.exe", new[] { "-v", outputAssembly });
                exitCode.Should()
                .Be(0);
            }

            PEReader assemblyReader = GetPEReader(outputAssembly);

            assemblyReader.PEHeaders.CorHeader.Flags.Should()
            .HaveFlag(CorFlags.StrongNameSigned);

            AssemblyName        assemblyName = GetAssemblyName(assemblyReader.GetMetadataReader());
            StrongNamePublicKey publicKey    = key.GetPublicKey();

            assemblyName.GetPublicKey()
            .Should()
            .BeEquivalentTo(publicKey.CreatePublicKey());

            assemblyName.GetPublicKeyToken()
            .Should()
            .BeEquivalentTo(publicKey.CreatePublicKeyToken());
        }
コード例 #3
0
        public static byte[] CreatePublicKeyToken(this StrongNamePublicKey key)
        {
            byte[] publicKey = key.CreatePublicKey();

            string hashAlg;

            switch (key.HashAlgorithm)
            {
            case AssemblyHashAlgorithm.SHA1:
                hashAlg = HashAlgorithmName.SHA1.Name;
                break;

            case AssemblyHashAlgorithm.SHA_256:
                hashAlg = HashAlgorithmName.SHA256.Name;
                break;

            case AssemblyHashAlgorithm.SHA_384:
                hashAlg = HashAlgorithmName.SHA384.Name;
                break;

            case AssemblyHashAlgorithm.SHA_512:
                hashAlg = HashAlgorithmName.SHA512.Name;
                break;

            default:
                throw new ArgumentOutOfRangeException();
            }

            var ha = HashAlgorithm.Create("SHA1");

            byte[] hash     = ha.ComputeHash(publicKey);
            var    keyToken = new byte[8];

            Buffer.BlockCopy(hash, (hash.Length - 8), keyToken, 0, 8);
            Array.Reverse(keyToken, 0, 8);
            return(keyToken);
        }
コード例 #4
0
        public void CanDelaySignAssembly(string inputAssembly, string outputAssembly)
        {
            string keyFile   = Path.Combine(KeyDir, "test_public_sha1.snk");
            var    publicKey = new StrongNamePublicKey(keyFile);

            var signer = new StrongNameSigner();

            signer.DelaySignAssembly(inputAssembly, publicKey, outputAssembly);

            PEReader assemblyReader = GetPEReader(outputAssembly);

            assemblyReader.PEHeaders.CorHeader.Flags.Should()
            .NotHaveFlag(CorFlags.StrongNameSigned);

            AssemblyName assemblyName = GetAssemblyName(assemblyReader.GetMetadataReader());

            assemblyName.GetPublicKey()
            .Should()
            .BeEquivalentTo(publicKey.CreatePublicKey());

            assemblyName.GetPublicKeyToken()
            .Should()
            .BeEquivalentTo(publicKey.CreatePublicKeyToken());
        }