blob: bf29644eca6b86f7cec8005392cb982a3c1bb1f3 [file] [log] [blame]
Yingdi Yu0b60e7a2015-07-16 21:05:11 -07001/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
Davide Pesavento3b101d02018-07-21 22:44:09 -04002/*
3 * Copyright (c) 2013-2018 Regents of the University of California.
Yingdi Yu0b60e7a2015-07-16 21:05:11 -07004 *
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 {
Davide Pesavento3b101d02018-07-21 22:44:09 -040029
Yingdi Yu0b60e7a2015-07-16 21:05:11 -070030namespace transform {
31class PrivateKey;
32} // namespace transform
33
34namespace tpm {
35
36/**
Davide Pesavento5ee8ec02018-09-01 19:06:12 -040037 * @brief The back-end implementation of a file-based TPM.
Yingdi Yu0b60e7a2015-07-16 21:05:11 -070038 *
39 * In this TPM, each private key is stored in a separate file with permission 0400, i.e.,
40 * owner read-only. The key is stored in PKCS #1 format in base64 encoding.
41 */
Davide Pesavento5ee8ec02018-09-01 19:06:12 -040042class BackEndFile final : public BackEnd
Yingdi Yu0b60e7a2015-07-16 21:05:11 -070043{
44public:
Yingdi Yufe4733a2015-10-22 14:24:12 -070045 /**
Davide Pesavento5ee8ec02018-09-01 19:06:12 -040046 * @brief Create file-based TPM backend.
47 *
48 * @param location Directory to store private keys.
Yingdi Yufe4733a2015-10-22 14:24:12 -070049 */
Yingdi Yu0b60e7a2015-07-16 21:05:11 -070050 explicit
51 BackEndFile(const std::string& location = "");
52
Davide Pesavento5ee8ec02018-09-01 19:06:12 -040053 ~BackEndFile() final;
Yingdi Yu0b60e7a2015-07-16 21:05:11 -070054
Yingdi Yufe4733a2015-10-22 14:24:12 -070055 static const std::string&
56 getScheme();
57
Yingdi Yu0b60e7a2015-07-16 21:05:11 -070058private: // inherited from tpm::BackEnd
Yingdi Yu0b60e7a2015-07-16 21:05:11 -070059 bool
60 doHasKey(const Name& keyName) const final;
61
Yingdi Yu0b60e7a2015-07-16 21:05:11 -070062 unique_ptr<KeyHandle>
63 doGetKeyHandle(const Name& keyName) const final;
64
Yingdi Yu0b60e7a2015-07-16 21:05:11 -070065 unique_ptr<KeyHandle>
66 doCreateKey(const Name& identityName, const KeyParams& params) final;
67
Yingdi Yu0b60e7a2015-07-16 21:05:11 -070068 void
69 doDeleteKey(const Name& keyName) final;
70
Yingdi Yu0b60e7a2015-07-16 21:05:11 -070071 ConstBufferPtr
72 doExportKey(const Name& keyName, const char* pw, size_t pwLen) final;
73
Yingdi Yu0b60e7a2015-07-16 21:05:11 -070074 void
75 doImportKey(const Name& keyName, const uint8_t* buf, size_t size, const char* pw, size_t pwLen) final;
76
77private:
78 /**
Davide Pesavento5ee8ec02018-09-01 19:06:12 -040079 * @brief Load a private key with name @p keyName from the key directory.
Yingdi Yu0b60e7a2015-07-16 21:05:11 -070080 */
Davide Pesavento3b101d02018-07-21 22:44:09 -040081 unique_ptr<transform::PrivateKey>
Yingdi Yu0b60e7a2015-07-16 21:05:11 -070082 loadKey(const Name& keyName) const;
83
84 /**
Davide Pesavento5ee8ec02018-09-01 19:06:12 -040085 * @brief Save a private key with name @p keyName into the key directory.
Yingdi Yu0b60e7a2015-07-16 21:05:11 -070086 */
87 void
Davide Pesavento3b101d02018-07-21 22:44:09 -040088 saveKey(const Name& keyName, const transform::PrivateKey& key);
Yingdi Yu0b60e7a2015-07-16 21:05:11 -070089
90private:
91 class Impl;
Davide Pesavento794f6872017-05-15 23:33:38 -040092 const unique_ptr<Impl> m_impl;
Yingdi Yu0b60e7a2015-07-16 21:05:11 -070093};
94
95} // namespace tpm
96} // namespace security
97} // namespace ndn
98
99#endif // NDN_SECURITY_TPM_BACK_END_FILE_HPP