blob: 02b575f58898bd9896fade1dafc1e450f1421b47 [file] [log] [blame]
Yingdi Yu0b60e7a2015-07-16 21:05:11 -07001/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
2/**
3 * Copyright (c) 2013-2016 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_SECURITY_TPM_BACK_END_FILE_HPP
23#define NDN_SECURITY_TPM_BACK_END_FILE_HPP
24
25#include "back-end.hpp"
26
27namespace ndn {
28namespace security {
29namespace transform {
30class PrivateKey;
31} // namespace transform
32
33namespace tpm {
34
35/**
36 * @brief The back-end implementation of file-based TPM.
37 *
38 * In this TPM, each private key is stored in a separate file with permission 0400, i.e.,
39 * owner read-only. The key is stored in PKCS #1 format in base64 encoding.
40 */
41class BackEndFile : public BackEnd
42{
43public:
44 class Error : public BackEnd::Error
45 {
46 public:
47 explicit
48 Error(const std::string& what)
49 : BackEnd::Error(what)
50 {
51 }
52 };
53
54public:
55 explicit
56 BackEndFile(const std::string& location = "");
57
58 ~BackEndFile() override;
59
60private: // inherited from tpm::BackEnd
61 /**
62 * @return True if a key with name @p keyName exists in TPM.
63 */
64 bool
65 doHasKey(const Name& keyName) const final;
66
67 /**
68 * @return The handle of a key with name @p keyName, or nullptr if the key does not exist
69 */
70 unique_ptr<KeyHandle>
71 doGetKeyHandle(const Name& keyName) const final;
72
73 /**
74 * @brief Create key for @p identityName according to @p params.
75 *
76 * The created key is named as: /<identityName>/[keyId]/KEY
77 * The key name is set in the returned KeyHandle.
78 *
79 * If the key with the same name exists, the old key will be overwritten.
80 * The behavior of using KeyHandler of removed key is undefined.
81 *
82 * @return The handle of the created key.
83 */
84 unique_ptr<KeyHandle>
85 doCreateKey(const Name& identityName, const KeyParams& params) final;
86
87 /**
88 * @brief Delete a key with name @p keyName.
89 *
90 * @throws Error if the deletion fails.
91 */
92 void
93 doDeleteKey(const Name& keyName) final;
94
95 /**
96 * @return A private key with name @p keyName in encrypted PKCS #8 format using password @p pw
97 * @throws Error if the key cannot be exported, e.g., not enough privilege
98 */
99 ConstBufferPtr
100 doExportKey(const Name& keyName, const char* pw, size_t pwLen) final;
101
102 /**
103 * @brief Import a private key in encrypted PKCS #8 format
104 *
105 * @param keyName The name of imported private key
106 * @param buf Pointer to the key in encrypted PKCS #8 format
107 * @param size The size of the key in encrypted PKCS #8 format
108 * @param pw The password to decrypt the key
109 * @param pwLen The length of the password
110 * @throws Error if import fails.
111 */
112 void
113 doImportKey(const Name& keyName, const uint8_t* buf, size_t size, const char* pw, size_t pwLen) final;
114
115private:
116 /**
117 * @brief Load a private key with name @p keyName from the key file directory
118 */
119 shared_ptr<transform::PrivateKey>
120 loadKey(const Name& keyName) const;
121
122 /**
123 * @brief Save a private key with name @p keyName into the key file directory
124 */
125 void
126 saveKey(const Name& keyName, shared_ptr<transform::PrivateKey> key);
127
128private:
129 class Impl;
130 unique_ptr<Impl> m_impl;
131};
132
133} // namespace tpm
134} // namespace security
135} // namespace ndn
136
137#endif // NDN_SECURITY_TPM_BACK_END_FILE_HPP