public void KeyContainer() { if (!NativeMethodsShared.IsWindows) { return; // "Key container is not supported, except under Windows" } var t = new ResolveComReference.TlbImp(); t.TypeLibName = "FakeTlb.tlb"; string badParameterValue = "badKeyContainer"; string goodParameterValue = "myKeyContainer"; try { t.ToolPath = Path.GetTempPath(); Assert.Null(t.KeyContainer); // "KeyContainer should be null by default"); CommandLine.ValidateNoParameterStartsWith( t, @"/keycontainer:", false /* no response file */); t.KeyContainer = badParameterValue; Assert.Equal(badParameterValue, t.KeyContainer); // "New KeyContainer value should be set" CommandLine.ValidateHasParameter(t, @"/keycontainer:" + badParameterValue, false /* no response file */); Utilities.ExecuteTaskAndVerifyLogContainsErrorFromResource(t, "AxTlbBaseTask.StrongNameUtils.NoKeyPairInContainer", t.KeyContainer); // ensure the key does not exist in the CSP StrongNameHelpers.StrongNameKeyDelete(goodParameterValue); IntPtr publicKeyBlob = IntPtr.Zero; int publicKeyBlobSize = 0; // add key to CSP if (StrongNameHelpers.StrongNameKeyGen(goodParameterValue, 1 /* leave key registered */, out publicKeyBlob, out publicKeyBlobSize) && publicKeyBlob != IntPtr.Zero) { StrongNameHelpers.StrongNameFreeBuffer(publicKeyBlob); t.KeyContainer = goodParameterValue; Assert.Equal(goodParameterValue, t.KeyContainer); // "New KeyContainer value should be set" CommandLine.ValidateHasParameter(t, @"/keycontainer:" + goodParameterValue, false /* no response file */); Utilities.ExecuteTaskAndVerifyLogDoesNotContainErrorFromResource(t, "AxTlbBaseTask.StrongNameUtils.NoKeyPairInContainer", t.KeyContainer); } else { Assert.True(false, "Key container could not be created (perhaps you are not running as admin)."); } } finally { // remove key from CSP StrongNameHelpers.StrongNameKeyDelete(goodParameterValue); // get rid of the generated temp file if (goodParameterValue != null) { File.Delete(goodParameterValue); } } }
internal static bool GenerateStrongNameFile(string filename) { // variables that hold the unmanaged key IntPtr keyBlob = IntPtr.Zero; int generatedSize = 0; // create the key bool createdKey = StrongNameHelpers.StrongNameKeyGen(null, 0 /*No flags. 1 is to save the key in the key container */, out keyBlob, out generatedSize); // if there was a problem, translate it and report it if (!createdKey || keyBlob == IntPtr.Zero) { throw Marshal.GetExceptionForHR(StrongNameHelpers.StrongNameErrorInfo()); } try { Debug.Assert(keyBlob != IntPtr.Zero); // make sure the key size makes sense Debug.Assert(generatedSize > 0 && generatedSize <= Int32.MaxValue); if (generatedSize <= 0 || generatedSize > Int32.MaxValue) { throw new InvalidOperationException(SR.GetString(SR.Browser_InvalidStrongNameKey)); } // get the key into managed memory byte[] key = new byte[generatedSize]; Marshal.Copy(keyBlob, key, 0, (int)generatedSize); // write the key to the specified file using (FileStream snkStream = new FileStream(filename, FileMode.Create, FileAccess.Write)) { using (BinaryWriter snkWriter = new BinaryWriter(snkStream)) { snkWriter.Write(key); } } } finally { // release the unmanaged memory the key resides in if (keyBlob != IntPtr.Zero) { StrongNameHelpers.StrongNameFreeBuffer(keyBlob); } } return(true); }