1  using System;
  2  using System.Runtime.InteropServices;
  3  
  4  namespace MS.StrongName.Native
  5  {
  6      /// <summary>
  7      ///     P/Invoke declarations for strong name APIs
  8      /// </summary>
  9      internal static class NativeMethods
10      {
11          /// <summary>
12          ///     Return the last error
13          /// </summary>
14          /// <returns>error information for the last strong name call</returns>
15          [DllImport("mscoree.dll")]
16          public extern static int StrongNameErrorInfo();
17  
18          /// <summary>
19          ///     Free the buffer allocated by strong name functions
20          /// </summary>
21          /// <param name="pbMemory">address of memory to free</param>
22          [DllImport("mscoree.dll")]
23          public extern static void StrongNameFreeBuffer(IntPtr pbMemory);
24  
25          /// <summary>
26          ///     Retrieve the public portion of a key pair.
27          /// </summary>
28          /// <param name="wszKeyContainer">key container to extract from, null to create a temporary container</param>
29          /// <param name="pbKeyBlob">key blob to extract from, null to extract from a container</param>
30          /// <param name="cbKeyBlob">size in bytes of <paramref name="pbKeyBlob"/></param>
31          /// <param name="ppbPublicKeyBlob">[out]public key blob</param>
32          /// <param name="pcbPublicKeyBlob">[out]size of <paramref name="pcbPublicKeyBlob"/></param>
33          /// <returns>true on success, false on error</returns>
34          [DllImport("mscoree.dll")]
35          public extern static bool StrongNameGetPublicKey(
36                  [MarshalAs(UnmanagedType.LPWStr)]string wszKeyContainer,
37                  [MarshalAs(UnmanagedType.LPArray, SizeParamIndex = 2)]byte[] pbKeyBlob,
38                  [MarshalAs(UnmanagedType.U4)]int cbKeyBlob,
39                  [Out]out IntPtr ppbPublicKeyBlob,
40                  [Out, MarshalAs(UnmanagedType.U4)]out int pcbPublicKeyBlob);
41  
42          /// <summary>
43          ///     Delete a key pair from a key container
44          /// </summary>
45          /// <param name="wszKeyContainer">key container name</param>
46          /// <returns>true on success, false on failure</returns>
47          [DllImport("mscoree.dll")]
48          public extern static bool StrongNameKeyDelete(
49                  [MarshalAs(UnmanagedType.LPWStr)]string wszKeyContainer);
50  
51          /// <summary>
52          ///     Generate a new key pair with the specified key size for strong name use
53          /// </summary>
54          /// <param name="wszKeyContainer">desired key container name</param>
55          /// <param name="dwFlags">flags</param>
56          /// <param name="dwKeySize">desired key size</param>
57          /// <param name="ppbKeyBlob">[out] generated public / private key blob</param>
58          /// <param name="pcbKeyBlob">[out] size of the generated blob</param>
59          /// <returns>true if the key was generated, false if there was an error</returns>
60          [DllImport("mscoree.dll")]
61          public extern static bool StrongNameKeyGenEx(
62                  [MarshalAs(UnmanagedType.LPWStr)]string wszKeyContainer,
63                  StrongNameKeyGenFlags dwFlags,
64                  int dwKeySize,
65                  [Out]out IntPtr ppbKeyBlob,
66                  [Out]out long pcbKeyBlob);
67  
68          /// <summary>
69          ///     Import a key pair into a key container
70          /// </summary>
71          /// <param name="wszKeyContainer">desired key container name</param>
72          /// <param name="pbKeyBlob">public/private key blob</param>
73          /// <param name="cbKeyBlob">number of bytes in <paramref name="pbKeyBlob"/></param>
74          /// <returns>true on success, false on error</returns>
75          [DllImport("mscoree.dll")]
76          public extern static bool StrongNameKeyInstall(
77                  [MarshalAs(UnmanagedType.LPWStr)]string wszKeyContainer,
78                  [MarshalAs(UnmanagedType.LPArray, SizeParamIndex = 2)]byte[]pbKeyBlob,
79                  int cbKeyBlob);
80  
81          /// <summary>
82          ///     Verify a strong name/manifest against a public key blob
83          /// </summary>
84          /// <param name="wszFilePath">valid path to the PE file for the assembly</param>
85          /// <param name="fForceVerification">verify even if the settings in the registry disable it</param>
86          /// <param name="pfWasVerified">[out] set to false if verify succeeded due to registry settings</param>
87          /// <returns>true if the assembly verified, false otherwise</returns>
88          [DllImport("mscoree.dll")]
89          public static extern bool StrongNameSignatureVerificationEx(
90                  [MarshalAs(UnmanagedType.LPWStr)]string wszFilePath,
91                  bool fForceVerification,
92                  ref bool pfWasVerified);
93  
94          /// <summary>
95          ///     Create a strong name token from an assembly file, and addtionally
96          ///     return the full public key blob
97          /// </summary>
98          /// <param name="wszFilePath">path to the PE file for the assembly</param>
99          /// <param name="ppbStrongNameToken">[out]strong name token</param>
100          /// <param name="pcbStrongNameToken">[out]length of <paramref name="ppbStrongNameToken"/></param>
101          /// <param name="ppbPublicKeyBlob">[out]public key blob</param>
102          /// <param name="pcbPublicKeyBlob">[out]length of <paramref name="ppbPublicKeyBlob"/></param>
103          /// <returns>true on success, false on error</returns>
104          [DllImport("mscoree.dll")]
105          public extern static bool StrongNameTokenFromAssemblyEx(
106                  [MarshalAs(UnmanagedType.LPWStr)]string wszFilePath,
107                  [Out]out IntPtr ppbStrongNameToken,
108                  [Out, MarshalAs(UnmanagedType.U4)]out int pcbStrongNameToken,
109                  [Out]out IntPtr ppbPublicKeyBlob,
110                  [Out, MarshalAs(UnmanagedType.U4)]out int pcbPublicKeyBlob);
111  
112          /// <summary>
113          ///     Create a strong name token from a public key blob
114          /// </summary>
115          /// <param name="pbPublicKeyBlob">key blob to generate the token for</param>
116          /// <param name="cbPublicKeyBlob">number of bytes in <paramref name="pbPublicKeyBlob"/></param>
117          /// <param name="ppbStrongNameToken">[out]public key token</param>
118          /// <param name="pcbStrongNameToken">[out]number of bytes in the token</param>
119          /// <returns>true on success, false on error</returns>
120          [DllImport("mscoree.dll")]
121          public extern static bool StrongNameTokenFromPublicKey(
122                  [In, MarshalAs(UnmanagedType.LPArray, SizeParamIndex = 1)]byte[] pbPublicKeyBlob,
123                  int cbPublicKeyBlob,
124                  [Out]out IntPtr ppbStrongNameToken,
125                  [Out, MarshalAs(UnmanagedType.U4)]out int pcbStrongNameToken);
126      }
127  }