| OLD | NEW |
| 1 // Copyright (c) 2009 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2009 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "base/crypto/cssm_init.h" | 5 #include "base/crypto/cssm_init.h" |
| 6 | 6 |
| 7 #include <Security/SecBase.h> | 7 #include <Security/SecBase.h> |
| 8 | 8 |
| 9 #include "base/logging.h" | 9 #include "base/logging.h" |
| 10 #include "base/singleton.h" | 10 #include "base/singleton.h" |
| 11 #include "base/synchronization/lock.h" | 11 #include "base/synchronization/lock.h" |
| 12 #include "base/sys_string_conversions.h" | 12 #include "base/sys_string_conversions.h" |
| 13 | 13 |
| 14 // When writing crypto code for Mac OS X, you may find the following | 14 // When writing crypto code for Mac OS X, you may find the following |
| 15 // documentation useful: | 15 // documentation useful: |
| 16 // - Common Security: CDSA and CSSM, Version 2 (with corrigenda) | 16 // - Common Security: CDSA and CSSM, Version 2 (with corrigenda) |
| 17 // http://www.opengroup.org/security/cdsa.htm | 17 // http://www.opengroup.org/security/cdsa.htm |
| 18 // - Apple Cryptographic Service Provider Functional Specification | 18 // - Apple Cryptographic Service Provider Functional Specification |
| 19 // - CryptoSample: http://developer.apple.com/SampleCode/CryptoSample/ | 19 // - CryptoSample: http://developer.apple.com/SampleCode/CryptoSample/ |
| 20 | 20 |
| 21 namespace { | 21 namespace { |
| 22 | 22 |
| 23 class CSSMInitSingleton { | 23 class CSSMInitSingleton { |
| 24 public: | 24 public: |
| 25 static CSSMInitSingleton* GetInstance() { | 25 static CSSMInitSingleton* GetInstance() { |
| 26 return Singleton<CSSMInitSingleton>::get(); | 26 return Singleton<CSSMInitSingleton, |
| 27 LeakySingletonTraits<CSSMInitSingleton> >::get(); |
| 27 } | 28 } |
| 28 | 29 |
| 29 CSSM_CSP_HANDLE csp_handle() const {return csp_handle_;} | 30 CSSM_CSP_HANDLE csp_handle() const { return csp_handle_; } |
| 30 | 31 |
| 31 private: | 32 private: |
| 32 CSSMInitSingleton() : inited_(false), loaded_(false), csp_handle_(NULL) { | 33 CSSMInitSingleton() : inited_(false), loaded_(false), csp_handle_(NULL) { |
| 33 static CSSM_VERSION version = {2, 0}; | 34 static CSSM_VERSION version = {2, 0}; |
| 34 // TODO(wtc): what should our caller GUID be? | 35 // TODO(wtc): what should our caller GUID be? |
| 35 static const CSSM_GUID test_guid = { | 36 static const CSSM_GUID test_guid = { |
| 36 0xFADE, 0, 0, { 1, 2, 3, 4, 5, 6, 7, 0 } | 37 0xFADE, 0, 0, { 1, 2, 3, 4, 5, 6, 7, 0 } |
| 37 }; | 38 }; |
| 38 CSSM_RETURN crtn; | 39 CSSM_RETURN crtn; |
| 39 CSSM_PVC_MODE pvc_policy = CSSM_PVC_NONE; | 40 CSSM_PVC_MODE pvc_policy = CSSM_PVC_NONE; |
| (...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 80 CSSM_CSP_HANDLE csp_handle_; | 81 CSSM_CSP_HANDLE csp_handle_; |
| 81 | 82 |
| 82 friend struct DefaultSingletonTraits<CSSMInitSingleton>; | 83 friend struct DefaultSingletonTraits<CSSMInitSingleton>; |
| 83 }; | 84 }; |
| 84 | 85 |
| 85 // This singleton is separate as it pertains to Apple's wrappers over | 86 // This singleton is separate as it pertains to Apple's wrappers over |
| 86 // their own CSSM handles, as opposed to our own CSSM_CSP_HANDLE. | 87 // their own CSSM handles, as opposed to our own CSSM_CSP_HANDLE. |
| 87 class SecurityServicesSingleton { | 88 class SecurityServicesSingleton { |
| 88 public: | 89 public: |
| 89 static SecurityServicesSingleton* GetInstance() { | 90 static SecurityServicesSingleton* GetInstance() { |
| 90 return Singleton<SecurityServicesSingleton>::get(); | 91 return Singleton<SecurityServicesSingleton, |
| 92 LeakySingletonTraits<SecurityServicesSingleton> >::get(); |
| 91 } | 93 } |
| 92 | 94 |
| 93 ~SecurityServicesSingleton() {} | |
| 94 | |
| 95 base::Lock& lock() { return lock_; } | 95 base::Lock& lock() { return lock_; } |
| 96 | 96 |
| 97 private: | 97 private: |
| 98 friend class Singleton<SecurityServicesSingleton>; | |
| 99 friend struct DefaultSingletonTraits<SecurityServicesSingleton>; | 98 friend struct DefaultSingletonTraits<SecurityServicesSingleton>; |
| 100 | 99 |
| 101 SecurityServicesSingleton() {} | 100 SecurityServicesSingleton() {} |
| 101 ~SecurityServicesSingleton() {} |
| 102 | 102 |
| 103 base::Lock lock_; | 103 base::Lock lock_; |
| 104 | 104 |
| 105 DISALLOW_COPY_AND_ASSIGN(SecurityServicesSingleton); | 105 DISALLOW_COPY_AND_ASSIGN(SecurityServicesSingleton); |
| 106 }; | 106 }; |
| 107 | 107 |
| 108 } // namespace | 108 } // namespace |
| 109 | 109 |
| 110 namespace base { | 110 namespace base { |
| 111 | 111 |
| (...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 152 } else { | 152 } else { |
| 153 LOG(ERROR) << fn_name << " returned " << err; | 153 LOG(ERROR) << fn_name << " returned " << err; |
| 154 } | 154 } |
| 155 } | 155 } |
| 156 | 156 |
| 157 base::Lock& GetMacSecurityServicesLock() { | 157 base::Lock& GetMacSecurityServicesLock() { |
| 158 return SecurityServicesSingleton::GetInstance()->lock(); | 158 return SecurityServicesSingleton::GetInstance()->lock(); |
| 159 } | 159 } |
| 160 | 160 |
| 161 } // namespace base | 161 } // namespace base |
| OLD | NEW |