Index: scoped_tss_type.h |
diff --git a/scoped_tss_type.h b/scoped_tss_type.h |
new file mode 100644 |
index 0000000000000000000000000000000000000000..b0073e2314f7d53ebf85495a66d4864cfe1c381f |
--- /dev/null |
+++ b/scoped_tss_type.h |
@@ -0,0 +1,115 @@ |
+// Copyright (c) 2011 The Chromium OS Authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+// Implements a simple framework for scoping TSS values. |
+// Based on chrome's base/scoped_ptr_malloc implementation. |
+// |
+// Example usage: |
+// ScopedTssContext context_handle; |
+// TSS_RESULT result; |
+// if (!OpenAndConnectTpm(context_handle.get(), &result)) |
+// ... |
+// ScopedTssKey srk(context_handle); |
+// if (!LoadSrk(context_handle, srk_handle.get(), &result)) |
+// ... |
+// |
+// See the bottom of this file for common typedefs. |
+ |
+#include <assert.h> |
+#include <trousers/tss.h> |
+#include <trousers/trousers.h> |
+ |
+#include <base/compiler_specific.h> |
+#include <vector> |
+ |
+#ifndef CRYPTOHOME_SCOPED_TSS_TYPE_H_ |
+#define CRYPTOHOME_SCOPED_TSS_TYPE_H_ |
+ |
+namespace cryptohome { |
+ |
+class ScopedTssContextRelease { |
+ public: |
+ inline void operator()(TSS_HCONTEXT unused, TSS_HCONTEXT context) const { |
+ // Usually, only |context| is used, but if the ScopedTssContext is |
+ // used slightly differently, it may end up with a context in |unused|. |
+ // For now, treat that as a bug. |
+ assert(unused == 0); |
+ if (context) |
+ Tspi_Context_Close(context); |
+ } |
+}; |
+ |
+class ScopedTssMemoryRelease { |
+ public: |
+ inline void operator()(TSS_HCONTEXT context, BYTE* memory) const { |
+ // TODO(wad) make the test code friendly for assert()ing context/memory != 0 |
+ if (context && memory) |
+ Tspi_Context_FreeMemory(context, memory); |
+ } |
+}; |
+ |
+class ScopedTssObjectRelease { |
+ public: |
+ inline void operator()(TSS_HCONTEXT context, TSS_HOBJECT handle) const { |
+ // TODO(wad) make the test code friendly for assert() context/handle != 0 |
+ if (context && handle) |
+ Tspi_Context_CloseObject(context, handle); |
+ } |
+}; |
+ |
+// Provide a basic scoped container for TSS managed objects. |
+template<class TssType, class ReleaseProc = ScopedTssObjectRelease> |
+class ScopedTssType { |
+ public: |
+ explicit ScopedTssType(TSS_HCONTEXT c = 0, TssType t = 0) : |
fes
2011/03/29 22:55:39
Colon goes on the next line
|
+ context_(c), |
+ type_(t) {} |
+ virtual ~ScopedTssType() { |
+ release_(context_, type_); |
+ } |
+ |
+ // Allow typecasting to TssType. |
+ operator TssType() { return type_; } |
+ |
+ // Allow direct referencing of the wrapped value. |
+ TssType* ptr() { |
+ return &type_; |
+ } |
+ |
+ // Returns the assigned context. |
+ virtual TSS_HCONTEXT context() { |
+ return context_; |
+ } |
+ |
+ virtual TssType release() WARN_UNUSED_RESULT { |
+ TssType tmp = type_; |
+ type_ = 0; |
+ context_ = 0; |
+ return tmp; |
+ } |
+ |
+ virtual void reset(TSS_HCONTEXT c = 0, TssType t = 0) { |
+ release_(context_, type_); |
+ context_ = c; |
+ type_ = t; |
+ } |
+ |
+ private: |
+ static ReleaseProc const release_; |
+ TSS_HCONTEXT context_; |
+ TssType type_; |
+}; |
+ |
+// Provide clear-cut helpers for the common cases. |
+typedef ScopedTssType<TSS_HCONTEXT, ScopedTssContextRelease> ScopedTssContext; |
+typedef ScopedTssType<BYTE*, ScopedTssMemoryRelease> ScopedTssMemory; |
+ |
+typedef ScopedTssType<TSS_HOBJECT> ScopedTssObject; |
+typedef ScopedTssType<TSS_HKEY> ScopedTssKey; |
+typedef ScopedTssType<TSS_HPOLICY> ScopedTssPolicy; |
+typedef ScopedTssType<TSS_HPCRS> ScopedTssPcrs; |
+ |
+} // namespace cryptohome |
+ |
+#endif // CRYPTOHOME_SCOPED_TSS_TYPE_H_ |