1ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// Copyright (c) 2011 The Chromium Authors. All rights reserved.
2c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Use of this source code is governed by a BSD-style license that can be
3c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// found in the LICENSE file.
4c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
5ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "crypto/capi_util.h"
6c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
7c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/basictypes.h"
8ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "base/memory/singleton.h"
972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "base/synchronization/lock.h"
10c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
11c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochnamespace {
12c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
13c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass CAPIUtilSingleton {
14c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch public:
15c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  static CAPIUtilSingleton* GetInstance() {
16c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return Singleton<CAPIUtilSingleton>::get();
17c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
18c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
19c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Returns a lock to guard calls to CryptAcquireContext with
20c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // CRYPT_DELETEKEYSET or CRYPT_NEWKEYSET.
2172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  base::Lock& acquire_context_lock() {
22c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return acquire_context_lock_;
23c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
24c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
25c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch private:
26c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  friend class Singleton<CAPIUtilSingleton>;
27c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  friend struct DefaultSingletonTraits<CAPIUtilSingleton>;
28c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
29c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  CAPIUtilSingleton() {}
30c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
3172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  base::Lock acquire_context_lock_;
32c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
33c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  DISALLOW_COPY_AND_ASSIGN(CAPIUtilSingleton);
34c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch};
35c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
36c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}  // namespace
37c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
38ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsennamespace crypto {
39c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
40c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochBOOL CryptAcquireContextLocked(HCRYPTPROV* prov,
41731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick                               LPCWSTR container,
42731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick                               LPCWSTR provider,
43c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                               DWORD prov_type,
44ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                               DWORD flags) {
4572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  base::AutoLock lock(CAPIUtilSingleton::GetInstance()->acquire_context_lock());
46c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  return CryptAcquireContext(prov, container, provider, prov_type, flags);
47c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
48c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
49ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen}  // namespace crypto
50