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.
5 #ifndef CRYPTO_SCOPED_CAPI_TYPES_H_
6 #define CRYPTO_SCOPED_CAPI_TYPES_H_
14 #include "base/logging.h"
18 // Simple destructor for the Free family of CryptoAPI functions, such as
19 // CryptDestroyHash, which take only a single argument to release.
20 template <typename CAPIHandle
, BOOL (WINAPI
*Destroyer
)(CAPIHandle
)>
21 struct CAPIDestroyer
{
22 void operator()(CAPIHandle handle
) const {
24 BOOL ok
= Destroyer(handle
);
30 // Destructor for the Close/Release family of CryptoAPI functions, which take
31 // a second DWORD parameter indicating flags to use when closing or releasing.
32 // This includes functions like CertCloseStore or CryptReleaseContext.
33 template <typename CAPIHandle
, BOOL (WINAPI
*Destroyer
)(CAPIHandle
, DWORD
),
35 struct CAPIDestroyerWithFlags
{
36 void operator()(CAPIHandle handle
) const {
38 BOOL ok
= Destroyer(handle
, flags
);
44 // scoped_ptr-like class for the CryptoAPI cryptography and certificate
45 // handles. Because these handles are defined as integer types, and not
46 // pointers, the existing scoped classes, such as scoped_ptr_malloc, are
47 // insufficient. The semantics are the same as scoped_ptr.
48 template <class CAPIHandle
, typename FreeProc
>
49 class ScopedCAPIHandle
{
51 explicit ScopedCAPIHandle(CAPIHandle handle
= NULL
) : handle_(handle
) {}
57 void reset(CAPIHandle handle
= NULL
) {
58 if (handle_
!= handle
) {
64 operator CAPIHandle() const { return handle_
; }
65 CAPIHandle
get() const { return handle_
; }
67 CAPIHandle
* receive() {
68 CHECK(handle_
== NULL
);
72 bool operator==(CAPIHandle handle
) const {
73 return handle_
== handle
;
76 bool operator!=(CAPIHandle handle
) const {
77 return handle_
!= handle
;
80 void swap(ScopedCAPIHandle
& b
) {
81 CAPIHandle tmp
= b
.handle_
;
86 CAPIHandle
release() {
87 CAPIHandle tmp
= handle_
;
94 static const FreeProc free_
;
96 DISALLOW_COPY_AND_ASSIGN(ScopedCAPIHandle
);
99 template<class CH
, typename FP
>
100 const FP ScopedCAPIHandle
<CH
, FP
>::free_
= FP();
102 template<class CH
, typename FP
> inline
103 bool operator==(CH h
, const ScopedCAPIHandle
<CH
, FP
>& b
) {
107 template<class CH
, typename FP
> inline
108 bool operator!=(CH h
, const ScopedCAPIHandle
<CH
, FP
>& b
) {
112 typedef ScopedCAPIHandle
<
114 CAPIDestroyerWithFlags
<HCRYPTPROV
,
115 CryptReleaseContext
, 0> > ScopedHCRYPTPROV
;
117 typedef ScopedCAPIHandle
<
118 HCRYPTKEY
, CAPIDestroyer
<HCRYPTKEY
, CryptDestroyKey
> > ScopedHCRYPTKEY
;
120 typedef ScopedCAPIHandle
<
121 HCRYPTHASH
, CAPIDestroyer
<HCRYPTHASH
, CryptDestroyHash
> > ScopedHCRYPTHASH
;
123 } // namespace crypto
125 #endif // CRYPTO_SCOPED_CAPI_TYPES_H_