a575963da9
Former-commit-id: da6be194a6b1221998fc28233f2503bd61dd9d14
97 lines
2.3 KiB
C#
97 lines
2.3 KiB
C#
//
|
|
// Mono.Security.Cryptography.CapiContext
|
|
//
|
|
// Authors:
|
|
// Sebastien Pouliot (sebastien@ximian.com)
|
|
//
|
|
// Copyright (C) 2003 Motus Technologies Inc. (http://www.motus.com)
|
|
// Copyright (C) 2004 Novell (http://www.novell.com)
|
|
//
|
|
|
|
using System;
|
|
using System.Security.Cryptography;
|
|
|
|
namespace Mono.Security.Cryptography {
|
|
|
|
// we deal with unmanaged resources - they MUST be released after use!
|
|
public class CapiContext : IDisposable {
|
|
|
|
// handles to CryptoAPI - they are
|
|
private IntPtr providerHandle;
|
|
|
|
private CspParameters cspParams;
|
|
|
|
// has the last call succeded ?
|
|
private bool lastResult;
|
|
|
|
// Create an instance using the default CSP
|
|
public CapiContext () : this (null)
|
|
{
|
|
}
|
|
|
|
// Create an instance using the specified CSP
|
|
public CapiContext (CspParameters csp)
|
|
{
|
|
providerHandle = IntPtr.Zero;
|
|
if (csp == null) {
|
|
// default parameters
|
|
cspParams = new CspParameters ();
|
|
}
|
|
else {
|
|
// keep of copy of the parameters
|
|
cspParams = new CspParameters (csp.ProviderType, csp.ProviderName, csp.KeyContainerName);
|
|
cspParams.KeyNumber = csp.KeyNumber;
|
|
cspParams.Flags = csp.Flags;
|
|
}
|
|
|
|
// do not show user interface (CRYPT_SILENT) - if UI is required then the function fails.
|
|
uint flags = CryptoAPI.CRYPT_SILENT;
|
|
if ((cspParams.Flags & CspProviderFlags.UseMachineKeyStore) == CspProviderFlags.UseMachineKeyStore) {
|
|
flags |= CryptoAPI.CRYPT_MACHINE_KEYSET;
|
|
}
|
|
|
|
lastResult = CryptoAPI.CryptAcquireContextA (ref providerHandle, cspParams.KeyContainerName,
|
|
cspParams.ProviderName, cspParams.ProviderType, flags);
|
|
if (!lastResult) {
|
|
// key container may not exist
|
|
flags |= CryptoAPI.CRYPT_NEWKEYSET;
|
|
lastResult = CryptoAPI.CryptAcquireContextA (ref providerHandle, cspParams.KeyContainerName,
|
|
cspParams.ProviderName, cspParams.ProviderType, flags);
|
|
}
|
|
}
|
|
|
|
~CapiContext ()
|
|
{
|
|
Dispose ();
|
|
}
|
|
|
|
public int Error {
|
|
get { return CryptoAPI.GetLastError (); }
|
|
}
|
|
|
|
public IntPtr Handle {
|
|
get { return providerHandle; }
|
|
}
|
|
|
|
public bool Result {
|
|
get { return lastResult; }
|
|
}
|
|
|
|
internal bool InternalResult {
|
|
set { lastResult = value; }
|
|
}
|
|
|
|
// release unmanaged resources
|
|
public void Dispose ()
|
|
{
|
|
if (providerHandle != IntPtr.Zero) {
|
|
lastResult = CryptoAPI.CryptReleaseContext (providerHandle, 0);
|
|
GC.KeepAlive (this);
|
|
providerHandle = IntPtr.Zero;
|
|
GC.SuppressFinalize (this);
|
|
}
|
|
}
|
|
}
|
|
|
|
}
|