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