Add a locked version of CryptAcquireContext
The function is not thread-safe when called with certain flags. This will be
useful when we move keygen onto a worker thread.
BUG=none
TEST=KeygenHandlerTest.SmokeTest (existing)
Review URL: http://codereview.chromium.org/2828019
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@50661 0039d316-1c4b-4281-b951-d872f2087c98
diff --git a/base/crypto/capi_util.h b/base/crypto/capi_util.h
new file mode 100644
index 0000000..9f264032
--- /dev/null
+++ b/base/crypto/capi_util.h
@@ -0,0 +1,31 @@
+// Copyright (c) 2010 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef BASE_CRYPTO_CAPI_UTIL_H_
+#define BASE_CRYPTO_CAPI_UTIl_H_
+
+#include <windows.h>
+#include <wincrypt.h>
+
+namespace base {
+
+// CryptAcquireContext when passed CRYPT_NEWKEYSET or CRYPT_DELETEKEYSET in
+// flags is not thread-safe. For such calls, we create a global lock to
+// synchronize it.
+//
+// From "Threading Issues with Cryptographic Service Providers",
+// <http://msdn.microsoft.com/en-us/library/aa388149(v=VS.85).aspx>:
+//
+// "The CryptAcquireContext function is generally thread safe unless
+// CRYPT_NEWKEYSET or CRYPT_DELETEKEYSET is specified in the dwFlags
+// parameter."
+BOOL CryptAcquireContextLocked(HCRYPTPROV* prov,
+ const TCHAR* container,
+ const TCHAR* provider,
+ DWORD prov_type,
+ DWORD flags);
+
+} // namespace base
+
+#endif // BASE_CRYPTO_CAPI_UTIl_H_