File: StrongNameHelper.cs
Web Access
Project: Microsoft.DotNet.StrongName.csproj (Microsoft.DotNet.StrongName)
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.

using System;
using System.IO;

namespace Microsoft.DotNet.StrongName;

public static class StrongNameHelper
{
    /// <summary>
    /// Returns true if the file has a valid strong name signature.
    /// </summary>
    /// <param name="file">Path to file</param>
    /// <param name="snPath">Path to sn.exe, if available and desired.</param>
    /// <returns>True if the file has a valid strong name signature, false otherwise.</returns>
    public static bool IsSigned(string file, string snPath = null) =>
        Verification.IsSigned(file, snPath);

    /// <summary>
    /// Determine whether the file is strong named, using sn.exe instead
    /// of the custom implementation
    /// </summary>
    /// <param name="file">Path to file</param>
    /// <param name="snPath">sn.exe path</param>
    /// <returns>True if the file is strong named, false otherwise.</returns>
    public static bool IsSigned_Legacy(string file, string snPath) =>
        Verification.IsSigned_Legacy(file, snPath);

    /// <summary>
    /// Unset the strong name signing bit from a file. This is required for sn
    /// </summary>
    /// <param name="file"></param>
    public static void ClearStrongNameSignedBit(string file) =>
        Signing.ClearStrongNameSignedBit(file);

    /// <summary>
    /// Gets the public key token from a strong named file.
    /// </summary>
    /// <param name="file">Path to file</param>
    /// <returns>Public key token</returns>
    public static int GetStrongNameTokenFromAssembly(string file, out string tokenStr) =>
        Signing.GetStrongNameTokenFromAssembly(file, out tokenStr);

    /// <summary>
    /// Strong names an existing previously signed or delay-signed binary with keyfile.
    /// Fall back to legacy signing if available and new signing fails.
    /// </summary>
    /// <param name="file">Path to file to sign</param>
    /// <param name="keyFile">Path to key pair.</param>
    /// <param name="snPath">Optional path to sn.exe</param>
    /// <returns>True if the file was signed successfully, false otherwise</returns>
    public static bool Sign(string file, string keyFile, string snPath = null) =>
        Signing.Sign(file, keyFile, snPath);

    /// <summary>
    /// Strong names an existing previously signed or delay-signed binary with keyfile
    //  using sn.exe instead of the custom implementation.
    /// </summary>
    /// <param name="file">Path to file</param>
    /// <param name="snPath">sn.exe path</param>
    /// <returns>True if the file is strong named, false otherwise.</returns>
    public static bool Sign_Legacy(string file, string keyfile,  string snPath) =>
        Signing.Sign_Legacy(file, keyfile, snPath);

    /// <summary>
    /// Given a key file, sets the strong name in the managed binary
    /// </summary>
    /// <param name="peStream"></param>
    /// <param name="keyFile"></param>
    /// <exception cref="InvalidOperationException"></exception>
    /// <exception cref="Exception"></exception>
    public static void Sign(Stream peStream, string keyFile) =>
        Signing.Sign(peStream, keyFile);

    // Internal for testing to avoid having to write a file to disk.
    internal static bool IsSigned(Stream peStream) =>
        Verification.IsSigned(peStream);
}