Search
Module:
Directory

   Desktop Functions:

   Smart Device Functions:


Show Recent Changes
Subscribe (RSS)
Misc. Pages
Comments
FAQ
Helpful Tools
Playground
Suggested Reading
Website TODO List
Download Visual Studio Add-In

StrongNameSignatureVerificationEx (mscorsn)
 
.
Summary
Verify a strong name / manifest against a public key blob

C# Signature:

    [DllImport("mscorsn.dll", SetLastError = true)]
    [return: MarshalAs(UnmanagedType.U1)]
    static extern bool StrongNameSignatureVerificationEx(
         [MarshalAs(UnmanagedType.LPWStr)]string wszFilePath,
         [MarshalAs(UnmanagedType.U1)]bool fForceVerification,
         [MarshalAs(UnmanagedType.U1)]ref bool pfWasVerified);

User-Defined Types:

None.

Notes:

This function is exported from mscorsn.dll in v1.0 and v1.1 of the .NET framework, but it will be moved to mscorwks.dll in v2.0. There is a shim in mscoree.dll which will redirect to the appropriate implementation dll, which has the same name.

Tips & Tricks:

The fForceVerification / pfWasVerified parameters can be confusion. A good blog entry to read, which explains how these work can be found here: http://blogs.msdn.com/shawnfa/archive/2004/06/07/150378.aspx

See the supporting function below for the code to the CheckToken() function - it verifies that an assembly contains the correct token data.

Sample Code:

// check the signature first
bool notForced = false;
bool verified = StrongNameSignatureVerificationEx(assembly, false, ref notForced);
Console.WriteLine("Verified: {0}\nForced: {1}", verified, !notForced);

// check to see if it is a Microsoft assembly
byte[] msClrToken = new byte[]    { 0xb7, 0x7a, 0x5c, 0x56, 0x19, 0x34, 0xe0, 0x89 };
byte[] msFxToken = new byte[]    { 0xb0, 0x3f, 0x5f, 0x7f, 0x11, 0xd5, 0x0a, 0x3a };
bool isMsAsm = CheckToken(assembly, msClrToken) || CheckToken(assembly, msFxToken);

if(isMsAsm && verified && notForced)
    Console.WriteLine("Microsoft signed assembly");
else if(isMsAsm && verified && !notForced)
    Console.WriteLine("Microsoft delay signed assembly");
else if(isMsAsm && !verified)
    Console.WriteLine("Microsoft assembly, modified since signing");
else
    Console.WriteLine("Not a Microsoft assembly");

Supporting Function:

    /// <summary>
    /// Check an assembly to see if it has the given public key token
    /// </summary>
    /// <remarks>
    /// Does not check to make sure the assembly's signature is valid.
    /// Loads the assembly in the LoadFrom context.
    /// </remarks>
    /// <param name='assembly'>Path to the assembly to check</param>
    /// <param name='expectedToken'>Token to search for</param>
    /// <exception cref='System.ArgumentNullException'>If assembly or expectedToken are null</exception>
    /// <returns>true if the assembly was signed with a key that has this token, false otherwise</returns>
    public static bool CheckToken(string assembly, byte[] expectedToken)
    {
        if (assembly == null)
        throw new ArgumentNullException("assembly");
        if (expectedToken == null)
        throw new ArgumentNullException("expectedToken");

        try
        {
        // Get the public key token of the given assembly
        Assembly asm = Assembly.LoadFrom(assembly);
        byte[] asmToken = asm.GetName().GetPublicKeyToken();

        // Compare it to the given token
        if (asmToken.Length != expectedToken.Length)
            return false;

        for (int i = 0; i < asmToken.Length; i++)
            if (asmToken[i] != expectedToken[i])
            return false;

        return true;
        }
        catch (System.IO.FileNotFoundException)
        {
        // couldn't find the assembly
        return false;
        }
        catch (BadImageFormatException)
        {
        // the given file couldn't get through the loader
        return false;
        }
    }

Alternative Managed API:

None

Documentation
None

Please edit this page!

Do you have...

  • helpful tips or sample code to share for using this API in managed code?
  • corrections to the existing content?
  • variations of the signature you want to share?
  • additional languages you want to include?

Select "Edit This Page" on the right hand toolbar and edit it! Or add new pages containing supporting types needed for this API (structures, delegates, and more).

 
Access PInvoke.net directly from VS:
Terms of Use
Edit This Page
Find References
Show Printable Version
Revisions