tpm.hpp
Go to the documentation of this file.
1 /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
2 /*
3  * Copyright (c) 2013-2022 Regents of the University of California.
4  *
5  * This file is part of ndn-cxx library (NDN C++ library with eXperimental eXtensions).
6  *
7  * ndn-cxx library is free software: you can redistribute it and/or modify it under the
8  * terms of the GNU Lesser General Public License as published by the Free Software
9  * Foundation, either version 3 of the License, or (at your option) any later version.
10  *
11  * ndn-cxx library is distributed in the hope that it will be useful, but WITHOUT ANY
12  * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
13  * PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details.
14  *
15  * You should have received copies of the GNU General Public License and GNU Lesser
16  * General Public License along with ndn-cxx, e.g., in COPYING.md file. If not, see
17  * <http://www.gnu.org/licenses/>.
18  *
19  * See AUTHORS.md for complete list of ndn-cxx authors and contributors.
20  */
21 
22 #ifndef NDN_CXX_SECURITY_TPM_TPM_HPP
23 #define NDN_CXX_SECURITY_TPM_TPM_HPP
24 
25 #include "ndn-cxx/name.hpp"
28 
29 #include <unordered_map>
30 #include <boost/logic/tribool.hpp>
31 
32 namespace ndn {
33 namespace security {
34 
35 namespace transform {
36 class PrivateKey;
37 } // namespace transform
38 
39 inline namespace v2 {
40 class KeyChain;
41 } // inline namespace v2
42 
43 namespace tpm {
44 
45 class BackEnd;
46 
65 class Tpm : noncopyable
66 {
67 public:
68  class Error : public std::runtime_error
69  {
70  public:
71  using std::runtime_error::runtime_error;
72  };
73 
74  ~Tpm();
75 
79  const std::string&
80  getTpmLocator() const
81  {
82  return m_locator;
83  }
84 
91  bool
92  hasKey(const Name& keyName) const;
93 
101  getPublicKey(const Name& keyName) const;
102 
110  sign(const InputBuffers& bufs, const Name& keyName, DigestAlgorithm digestAlgorithm) const;
111 
120  NDN_CXX_NODISCARD boost::logic::tribool
121  verify(const InputBuffers& bufs, span<const uint8_t> sig, const Name& keyName,
122  DigestAlgorithm digestAlgorithm) const;
123 
130  decrypt(span<const uint8_t> buf, const Name& keyName) const;
131 
132 public: // Management
136  bool
137  isTerminalMode() const;
138 
144  void
145  setTerminalMode(bool isTerminal) const;
146 
150  bool
151  isTpmLocked() const;
152 
159  NDN_CXX_NODISCARD bool
160  unlockTpm(const char* password, size_t passwordLength) const;
161 
162 NDN_CXX_PUBLIC_WITH_TESTS_ELSE_PRIVATE: // operations accessible only by KeyChain
169  Tpm(const std::string& locator, unique_ptr<BackEnd> impl);
170 
181  Name
182  createKey(const Name& identityName, const KeyParams& params);
183 
187  void
188  deleteKey(const Name& keyName);
189 
203  exportPrivateKey(const Name& keyName, const char* pw, size_t pwLen) const;
204 
217  void
218  importPrivateKey(const Name& keyName, span<const uint8_t> pkcs8, const char* pw, size_t pwLen);
219 
223  void
224  importPrivateKey(const Name& keyName, shared_ptr<transform::PrivateKey> key);
225 
231  void
232  clearKeyCache()
233  {
234  m_keys.clear();
235  }
236 
237 private:
243  const KeyHandle*
244  findKey(const Name& keyName) const;
245 
246 private:
247  const std::string m_locator;
248  const unique_ptr<BackEnd> m_backEnd;
249 
250  mutable std::unordered_map<Name, unique_ptr<KeyHandle>> m_keys;
251 
252  friend KeyChain;
253 };
254 
255 } // namespace tpm
256 
257 using tpm::Tpm;
258 
259 } // namespace security
260 } // namespace ndn
261 
262 #endif // NDN_CXX_SECURITY_TPM_TPM_HPP
#define NDN_CXX_NODISCARD
Definition: backports.hpp:68
Base class for key parameters.
Definition: key-params.hpp:36
Represents an absolute name.
Definition: name.hpp:44
TPM front-end class.
Definition: tpm.hpp:66
bool unlockTpm(const char *password, size_t passwordLength) const
Unlock the TPM.
Definition: tpm.cpp:116
void setTerminalMode(bool isTerminal) const
Set the terminal mode of the TPM.
Definition: tpm.cpp:104
ConstBufferPtr getPublicKey(const Name &keyName) const
Definition: tpm.cpp:66
ConstBufferPtr decrypt(span< const uint8_t > buf, const Name &keyName) const
Decrypt blob using the key with name keyName.
Definition: tpm.cpp:91
boost::logic::tribool verify(const InputBuffers &bufs, span< const uint8_t > sig, const Name &keyName, DigestAlgorithm digestAlgorithm) const
Verify discontiguous ranges using the key with name keyName and using the digest digestAlgorithm.
Definition: tpm.cpp:80
ConstBufferPtr sign(const InputBuffers &bufs, const Name &keyName, DigestAlgorithm digestAlgorithm) const
Sign discontiguous ranges using the key with name keyName and using the digest digestAlgorithm.
Definition: tpm.cpp:73
const std::string & getTpmLocator() const
Return the TPM Locator.
Definition: tpm.hpp:80
bool isTerminalMode() const
Check if the TPM is in terminal mode.
Definition: tpm.cpp:98
bool hasKey(const Name &keyName) const
Check if a private key exists.
Definition: tpm.cpp:41
bool isTpmLocked() const
Definition: tpm.cpp:110
Abstraction of private key in crypto transformation.
Definition: private-key.hpp:39
The main interface for signing key management.
Definition: key-chain.hpp:87
#define NDN_CXX_PUBLIC_WITH_TESTS_ELSE_PRIVATE
Definition: common.hpp:48
Definition: data.cpp:25
shared_ptr< const Buffer > ConstBufferPtr
Definition: buffer.hpp:139
InputBuffers bufs
span< const uint8_t > sig