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
) {
65 operator CAPIHandle() const { return handle_
; }
66 CAPIHandle
get() const { return handle_
; }
68 CAPIHandle
* receive() {
69 CHECK(handle_
== NULL
);
73 bool operator==(CAPIHandle handle
) const {
74 return handle_
== handle
;
77 bool operator!=(CAPIHandle handle
) const {
78 return handle_
!= handle
;
81 void swap(ScopedCAPIHandle
& b
) {
82 CAPIHandle tmp
= b
.handle_
;
87 CAPIHandle
release() {
88 CAPIHandle tmp
= handle_
;
96 DISALLOW_COPY_AND_ASSIGN(ScopedCAPIHandle
);
99 template<class CH
, typename FP
> inline
100 bool operator==(CH h
, const ScopedCAPIHandle
<CH
, FP
>& b
) {
104 template<class CH
, typename FP
> inline
105 bool operator!=(CH h
, const ScopedCAPIHandle
<CH
, FP
>& b
) {
109 typedef ScopedCAPIHandle
<
111 CAPIDestroyerWithFlags
<HCRYPTPROV
,
112 CryptReleaseContext
, 0> > ScopedHCRYPTPROV
;
114 typedef ScopedCAPIHandle
<
115 HCRYPTKEY
, CAPIDestroyer
<HCRYPTKEY
, CryptDestroyKey
> > ScopedHCRYPTKEY
;
117 typedef ScopedCAPIHandle
<
118 HCRYPTHASH
, CAPIDestroyer
<HCRYPTHASH
, CryptDestroyHash
> > ScopedHCRYPTHASH
;
120 } // namespace crypto
122 #endif // CRYPTO_SCOPED_CAPI_TYPES_H_