blob: d9963cdd6af965711cf92b7880ee30db6cec5b6a [file] [log] [blame]
Alexander Afanasyevc169a812014-05-20 20:37:29 -04001/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
Jeff Thompson47c93cf2013-08-09 00:38:48 -07002/**
José Quevedo641de4c2016-01-29 00:11:24 +00003 * Copyright (c) 2013-2016 Regents of the University of California.
Alexander Afanasyevdfa52c42014-04-24 21:10:11 -07004 *
5 * This file is part of ndn-cxx library (NDN C++ library with eXperimental eXtensions).
Alexander Afanasyevdfa52c42014-04-24 21:10:11 -07006 *
Alexander Afanasyevc169a812014-05-20 20:37:29 -04007 * 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.
Alexander Afanasyevdfa52c42014-04-24 21:10:11 -070020 *
21 * @author Yingdi Yu <http://irl.cs.ucla.edu/~yingdi/>
Jeff Thompson47c93cf2013-08-09 00:38:48 -070022 */
23
Yingdi Yufc40d872014-02-18 12:56:04 -080024#ifndef NDN_SECURITY_KEY_CHAIN_HPP
25#define NDN_SECURITY_KEY_CHAIN_HPP
Jeff Thompson47c93cf2013-08-09 00:38:48 -070026
Yingdi Yuf56c68f2014-04-24 21:50:13 -070027#include "sec-public-info.hpp"
28#include "sec-tpm.hpp"
Yingdi Yu7036ce22014-06-19 18:53:37 -070029#include "key-params.hpp"
Yingdi Yuf56c68f2014-04-24 21:50:13 -070030#include "secured-bag.hpp"
Yingdi Yu4f324632014-01-15 18:10:03 -080031#include "signature-sha256-with-rsa.hpp"
Yingdi Yuc8f883c2014-06-20 23:25:22 -070032#include "signature-sha256-with-ecdsa.hpp"
Yingdi Yubf6a2812014-06-17 15:32:11 -070033#include "digest-sha256.hpp"
Yingdi Yu1b0311c2015-06-10 14:58:47 -070034#include "signing-info.hpp"
Yingdi Yuf56c68f2014-04-24 21:50:13 -070035
Yingdi Yu4270f202014-01-28 14:19:16 -080036#include "../interest.hpp"
Yingdi Yu21157162014-02-28 13:02:34 -080037#include "../util/crypto.hpp"
Yingdi Yu0f5fb692014-06-10 12:07:28 -070038#include "../util/random.hpp"
Alexander Afanasyev07113802015-01-15 19:14:36 -080039#include <initializer_list>
Yingdi Yu31b4af22014-01-14 14:13:00 -080040
Jeff Thompson47c93cf2013-08-09 00:38:48 -070041
42namespace ndn {
Yingdi Yu1b0311c2015-06-10 14:58:47 -070043namespace security {
Jeff Thompson47c93cf2013-08-09 00:38:48 -070044
Yingdi Yu1b0311c2015-06-10 14:58:47 -070045/**
46 * @brief The packet signing interface.
47 */
Alexander Afanasyev45a37132014-04-28 16:54:57 -070048class KeyChain : noncopyable
Yingdi Yuf56c68f2014-04-24 21:50:13 -070049{
50public:
51 class Error : public std::runtime_error
52 {
53 public:
54 explicit
55 Error(const std::string& what)
56 : std::runtime_error(what)
57 {
58 }
59 };
60
Yingdi Yu41546342014-11-30 23:37:53 -080061 /**
Yingdi Yu1b0311c2015-06-10 14:58:47 -070062 * @brief Error thrown when the supplied TPM locator to KeyChain constructor does not match
63 * the locator stored in PIB
Yingdi Yu41546342014-11-30 23:37:53 -080064 */
65 class MismatchError : public Error
66 {
67 public:
68 explicit
69 MismatchError(const std::string& what)
70 : Error(what)
71 {
72 }
73 };
Yingdi Yu7036ce22014-06-19 18:53:37 -070074
Alexander Afanasyev07113802015-01-15 19:14:36 -080075 typedef function<unique_ptr<SecPublicInfo> (const std::string&)> PibCreateFunc;
76 typedef function<unique_ptr<SecTpm>(const std::string&)> TpmCreateFunc;
Yingdi Yuf56c68f2014-04-24 21:50:13 -070077
Alexander Afanasyev07113802015-01-15 19:14:36 -080078 /**
79 * @brief Register a new PIB
Alexander Afanasyev34a37632015-01-16 17:37:36 -080080 * @param aliases List of schemes with which this PIB will be associated.
81 * The first alias in the list is considered a canonical name of the PIB instance.
Alexander Afanasyev07113802015-01-15 19:14:36 -080082 */
83 template<class PibType>
84 static void
Alexander Afanasyev34a37632015-01-16 17:37:36 -080085 registerPib(std::initializer_list<std::string> aliases);
Alexander Afanasyev07113802015-01-15 19:14:36 -080086
87 /**
88 * @brief Register a new TPM
Alexander Afanasyev34a37632015-01-16 17:37:36 -080089 * @param aliases List of schemes with which this TPM will be associated
90 * The first alias in the list is considered a canonical name of the TPM instance.
Alexander Afanasyev07113802015-01-15 19:14:36 -080091 */
92 template<class TpmType>
93 static void
Alexander Afanasyev34a37632015-01-16 17:37:36 -080094 registerTpm(std::initializer_list<std::string> aliases);
Alexander Afanasyev07113802015-01-15 19:14:36 -080095
Yingdi Yu1b0311c2015-06-10 14:58:47 -070096 /**
97 * @brief Get default PIB locator
98 */
Yingdi Yu281689a2015-06-13 14:32:32 -070099 static std::string
100 getDefaultPibLocator();
101
Yingdi Yu1b0311c2015-06-10 14:58:47 -0700102 /**
103 * @brief Create a PIB according to @p pibLocator
104 */
Yingdi Yu281689a2015-06-13 14:32:32 -0700105 static unique_ptr<SecPublicInfo>
106 createPib(const std::string& pibLocator);
107
Yingdi Yu1b0311c2015-06-10 14:58:47 -0700108 /**
109 * @brief Get default TPM locator
110 */
Yingdi Yu281689a2015-06-13 14:32:32 -0700111 static std::string
112 getDefaultTpmLocator();
113
Yingdi Yu1b0311c2015-06-10 14:58:47 -0700114 /**
115 * @brief Create a TPM according to @p tpmLocator
116 */
Yingdi Yu281689a2015-06-13 14:32:32 -0700117 static unique_ptr<SecTpm>
118 createTpm(const std::string& tpmLocator);
119
Alexander Afanasyev07113802015-01-15 19:14:36 -0800120 /**
121 * @brief Constructor to create KeyChain with default PIB and TPM
122 *
123 * Default PIB and TPM are platform-dependent and can be overriden system-wide or on
124 * per-use basis.
125 *
126 * @todo Add detailed description about config file behavior here
127 */
128 KeyChain();
Yingdi Yuf56c68f2014-04-24 21:50:13 -0700129
Yingdi Yu41546342014-11-30 23:37:53 -0800130 /**
131 * @brief KeyChain constructor
132 *
133 * @sa http://redmine.named-data.net/issues/2260
134 *
Davide Pesavento18cf81b2015-09-12 23:36:43 +0200135 * @param pibLocator PIB locator
136 * @param tpmLocator TPM locator
Yingdi Yu41546342014-11-30 23:37:53 -0800137 * @param allowReset if true, the PIB will be reset when the supplied tpmLocator
138 * mismatches the one in PIB
139 */
140 KeyChain(const std::string& pibLocator,
141 const std::string& tpmLocator,
142 bool allowReset = false);
Yingdi Yuf56c68f2014-04-24 21:50:13 -0700143
144 virtual
Yingdi Yu5ec0ee32014-06-24 16:26:09 -0700145 ~KeyChain();
Yingdi Yuf56c68f2014-04-24 21:50:13 -0700146
Yingdi Yube4150e2014-02-18 13:02:46 -0800147 /**
Yingdi Yu4b8c6a22014-04-15 23:00:54 -0700148 * @brief Create an identity by creating a pair of Key-Signing-Key (KSK) for this identity and a
149 * self-signed certificate of the KSK.
Yingdi Yube4150e2014-02-18 13:02:46 -0800150 *
Yingdi Yu2abd73f2014-01-08 23:34:11 -0800151 * @param identityName The name of the identity.
Yingdi Yu7036ce22014-06-19 18:53:37 -0700152 * @param params The key parameter if a key needs to be generated for the identity.
Yingdi Yu28fd32f2014-01-28 19:03:03 -0800153 * @return The name of the default certificate of the identity.
Yingdi Yu2abd73f2014-01-08 23:34:11 -0800154 */
Yingdi Yu7036ce22014-06-19 18:53:37 -0700155 Name
156 createIdentity(const Name& identityName, const KeyParams& params = DEFAULT_KEY_PARAMS);
Alexander Afanasyevb78bc4d2014-04-09 21:20:52 -0700157
Yingdi Yu2abd73f2014-01-08 23:34:11 -0800158 /**
Yingdi Yu2e57a582014-02-20 23:34:43 -0800159 * @brief Generate a pair of RSA keys for the specified identity.
160 *
Yingdi Yu2abd73f2014-01-08 23:34:11 -0800161 * @param identityName The name of the identity.
162 * @param isKsk true for generating a Key-Signing-Key (KSK), false for a Data-Signing-Key (KSK).
163 * @param keySize The size of the key.
164 * @return The generated key name.
Yingdi Yu1b0311c2015-06-10 14:58:47 -0700165 * @see generateEcdsaKeyPair
Yingdi Yu2abd73f2014-01-08 23:34:11 -0800166 */
Yingdi Yu41546342014-11-30 23:37:53 -0800167 Name
Yingdi Yuc8f883c2014-06-20 23:25:22 -0700168 generateRsaKeyPair(const Name& identityName, bool isKsk = false, uint32_t keySize = 2048);
Alexander Afanasyevb78bc4d2014-04-09 21:20:52 -0700169
Yingdi Yu1b0311c2015-06-10 14:58:47 -0700170 /**
171 * @brief Generate a pair of ECDSA keys for the specified identity.
172 *
173 * @param identityName The name of the identity.
174 * @param isKsk true for generating a Key-Signing-Key (KSK), false for a Data-Signing-Key (KSK).
175 * @param keySize The size of the key.
176 * @return The generated key name.
177 * @see generateRsaKeyPair
178 */
Yingdi Yu41546342014-11-30 23:37:53 -0800179 Name
Yingdi Yuc8f883c2014-06-20 23:25:22 -0700180 generateEcdsaKeyPair(const Name& identityName, bool isKsk = false, uint32_t keySize = 256);
Yingdi Yu1b0311c2015-06-10 14:58:47 -0700181
Yingdi Yu2abd73f2014-01-08 23:34:11 -0800182 /**
Yingdi Yu4b8c6a22014-04-15 23:00:54 -0700183 * @brief Generate a pair of RSA keys for the specified identity and set it as default key for
184 * the identity.
Yingdi Yu2e57a582014-02-20 23:34:43 -0800185 *
Yingdi Yu2abd73f2014-01-08 23:34:11 -0800186 * @param identityName The name of the identity.
187 * @param isKsk true for generating a Key-Signing-Key (KSK), false for a Data-Signing-Key (KSK).
188 * @param keySize The size of the key.
189 * @return The generated key name.
Yingdi Yu1b0311c2015-06-10 14:58:47 -0700190 * @see generateRsaKeyPair, generateEcdsaKeyPair, generateEcdsaKeyPairAsDefault
Yingdi Yu2abd73f2014-01-08 23:34:11 -0800191 */
Yingdi Yu7036ce22014-06-19 18:53:37 -0700192 Name
José Quevedo699d2ea2016-01-29 00:13:00 +0000193 generateRsaKeyPairAsDefault(const Name& identityName, bool isKsk = false, uint32_t keySize = 2048);
Yingdi Yuc8f883c2014-06-20 23:25:22 -0700194
Yingdi Yu1b0311c2015-06-10 14:58:47 -0700195 /**
196 * @brief Generate a pair of ECDSA keys for the specified identity and set it as default key for
197 * the identity.
198 *
199 * @param identityName The name of the identity.
200 * @param isKsk true for generating a Key-Signing-Key (KSK), false for a Data-Signing-Key (KSK).
201 * @param keySize The size of the key.
202 * @return The generated key name.
203 * @see generateRsaKeyPair, generateEcdsaKeyPair, generateRsaKeyPairAsDefault
204 */
Yingdi Yuc8f883c2014-06-20 23:25:22 -0700205 Name
José Quevedo699d2ea2016-01-29 00:13:00 +0000206 generateEcdsaKeyPairAsDefault(const Name& identityName, bool isKsk = false, uint32_t keySize = 256);
Jeff Thompson79a2d5d2013-09-27 14:32:23 -0700207
Yingdi Yu2abd73f2014-01-08 23:34:11 -0800208 /**
Yingdi Yuc55680b2014-02-26 12:31:35 -0800209 * @brief prepare an unsigned identity certificate
210 *
Alexander Afanasyev770827c2014-05-13 17:42:55 -0700211 * @param keyName Key name, e.g., `/<identity_name>/ksk-123456`.
Yingdi Yuc55680b2014-02-26 12:31:35 -0800212 * @param signingIdentity The signing identity.
213 * @param notBefore Refer to IdentityCertificate.
214 * @param notAfter Refer to IdentityCertificate.
Alexander Afanasyevb78bc4d2014-04-09 21:20:52 -0700215 * @param subjectDescription Refer to IdentityCertificate.
Yingdi Yu0eb5d722014-06-10 15:06:25 -0700216 * @param certPrefix Prefix before `KEY` component. By default, KeyChain will infer the
217 * certificate name according to the relation between the signingIdentity and
218 * the subject identity. If signingIdentity is a prefix of the subject identity,
219 * `KEY` will be inserted after the signingIdentity, otherwise `KEY` is inserted
220 * after subject identity (i.e., before `ksk-....`).
Yingdi Yuc55680b2014-02-26 12:31:35 -0800221 * @return IdentityCertificate.
222 */
223 shared_ptr<IdentityCertificate>
224 prepareUnsignedIdentityCertificate(const Name& keyName,
Yingdi Yuf56c68f2014-04-24 21:50:13 -0700225 const Name& signingIdentity,
226 const time::system_clock::TimePoint& notBefore,
227 const time::system_clock::TimePoint& notAfter,
Yingdi Yu0eb5d722014-06-10 15:06:25 -0700228 const std::vector<CertificateSubjectDescription>& subjectDescription,
229 const Name& certPrefix = DEFAULT_PREFIX);
230
231 /**
232 * @brief prepare an unsigned identity certificate
233 *
234 * @param keyName Key name, e.g., `/<identity_name>/ksk-123456`.
235 * @param publicKey Public key to sign.
236 * @param signingIdentity The signing identity.
237 * @param notBefore Refer to IdentityCertificate.
238 * @param notAfter Refer to IdentityCertificate.
239 * @param subjectDescription Refer to IdentityCertificate.
240 * @param certPrefix Prefix before `KEY` component. By default, KeyChain will infer the
241 * certificate name according to the relation between the signingIdentity and
242 * the subject identity. If signingIdentity is a prefix of the subject identity,
243 * `KEY` will be inserted after the signingIdentity, otherwise `KEY` is inserted
244 * after subject identity (i.e., before `ksk-....`).
245 * @return IdentityCertificate.
246 */
247 shared_ptr<IdentityCertificate>
248 prepareUnsignedIdentityCertificate(const Name& keyName,
249 const PublicKey& publicKey,
250 const Name& signingIdentity,
251 const time::system_clock::TimePoint& notBefore,
252 const time::system_clock::TimePoint& notAfter,
253 const std::vector<CertificateSubjectDescription>& subjectDescription,
254 const Name& certPrefix = DEFAULT_PREFIX);
Yingdi Yuc55680b2014-02-26 12:31:35 -0800255
256 /**
Yingdi Yu1b0311c2015-06-10 14:58:47 -0700257 * @brief Sign data according to the supplied signing information
Yingdi Yu2e57a582014-02-20 23:34:43 -0800258 *
Yingdi Yu1b0311c2015-06-10 14:58:47 -0700259 * This method uses the supplied signing information @p params to create the SignatureInfo block:
260 * - it selects a private key and its certificate to sign the packet
261 * - sets the KeyLocator field with the certificate name, and
262 * - adds other requested information to the SignatureInfo block).
Yingdi Yu2e57a582014-02-20 23:34:43 -0800263 *
Yingdi Yu1b0311c2015-06-10 14:58:47 -0700264 * After that, the method assigns the created SignatureInfo to the data packets, generate a
265 * signature and sets as part of the SignatureValue block.
266 *
267 * @param data The data to sign
268 * @param params The signing parameters.
269 * @throws Error if signing fails.
270 * @see SigningInfo
Yingdi Yu2abd73f2014-01-08 23:34:11 -0800271 */
Yingdi Yu2abd73f2014-01-08 23:34:11 -0800272 void
Yingdi Yu1b0311c2015-06-10 14:58:47 -0700273 sign(Data& data, const SigningInfo& params = DEFAULT_SIGNING_INFO);
Alexander Afanasyevb78bc4d2014-04-09 21:20:52 -0700274
Jeff Thompson47c93cf2013-08-09 00:38:48 -0700275 /**
Yingdi Yu1b0311c2015-06-10 14:58:47 -0700276 * @brief Sign interest according to the supplied signing information
277 *
278 * This method uses the supplied signing information @p params to create the SignatureInfo block:
279 * - it selects a private key and its certificate to sign the packet
280 * - sets the KeyLocator field with the certificate name, and
281 * - adds other requested information to the SignatureInfo block).
282 *
283 * After that, the method appends the created SignatureInfo to the interest name, generate a
284 * signature and appends it as part of the SignatureValue block to the interest name.
285 *
286 * @param interest The interest to sign
287 * @param params The signing parameters.
288 * @throws Error if signing fails.
289 * @see SigningInfo
290 */
291 void
292 sign(Interest& interest, const SigningInfo& params = DEFAULT_SIGNING_INFO);
293
294 /**
295 * @brief Sign buffer according to the supplied signing information
296 *
297 * @param buffer The buffer to sign
298 * @param bufferLength The buffer size
299 * @param params The signing parameters.
300 * @return a SignatureValue TLV block
301 * @throws Error if signing fails.
302 * @see SigningInfo
303 */
304 Block
305 sign(const uint8_t* buffer, size_t bufferLength, const SigningInfo& params);
306
307 /**
308 * @deprecated use sign sign(T&, const SigningInfo&)
Yingdi Yu2e57a582014-02-20 23:34:43 -0800309 * @brief Sign packet with a particular certificate.
310 *
311 * @param packet The packet to be signed.
312 * @param certificateName The certificate name of the key to use for signing.
313 * @throws SecPublicInfo::Error if certificate does not exist.
Jeff Thompson3c73da42013-08-12 11:19:05 -0700314 */
Yingdi Yu2e57a582014-02-20 23:34:43 -0800315 template<typename T>
Alexander Afanasyevb78bc4d2014-04-09 21:20:52 -0700316 void
Yingdi Yuf56c68f2014-04-24 21:50:13 -0700317 sign(T& packet, const Name& certificateName);
Alexander Afanasyevb78bc4d2014-04-09 21:20:52 -0700318
Jeff Thompson29ce3102013-09-27 11:47:48 -0700319 /**
Yingdi Yu1b0311c2015-06-10 14:58:47 -0700320 * @deprecated Use sign(const uint8_t*, size_t, const SigningInfo&) instead
Yingdi Yu2e57a582014-02-20 23:34:43 -0800321 * @brief Sign the byte array using a particular certificate.
322 *
Jeff Thompsonc01e1782013-10-21 14:08:42 -0700323 * @param buffer The byte array to be signed.
324 * @param bufferLength the length of buffer.
Yingdi Yu2e57a582014-02-20 23:34:43 -0800325 * @param certificateName The certificate name of the signing key.
Jeff Thompsonc01e1782013-10-21 14:08:42 -0700326 * @return The Signature.
Yingdi Yu2e57a582014-02-20 23:34:43 -0800327 * @throws SecPublicInfo::Error if certificate does not exist.
Jeff Thompsonc01e1782013-10-21 14:08:42 -0700328 */
Yingdi Yu2abd73f2014-01-08 23:34:11 -0800329 Signature
Yingdi Yuf56c68f2014-04-24 21:50:13 -0700330 sign(const uint8_t* buffer, size_t bufferLength, const Name& certificateName);
Jeff Thompsonc01e1782013-10-21 14:08:42 -0700331
332 /**
Yingdi Yu1b0311c2015-06-10 14:58:47 -0700333 * @deprecated use sign sign(T&, const SigningInfo&)
Yingdi Yu2e57a582014-02-20 23:34:43 -0800334 * @brief Sign packet using the default certificate of a particular identity.
335 *
Yingdi Yu4b8c6a22014-04-15 23:00:54 -0700336 * If there is no default certificate of that identity, this method will create a self-signed
337 * certificate.
Yingdi Yu2e57a582014-02-20 23:34:43 -0800338 *
339 * @param packet The packet to be signed.
340 * @param identityName The signing identity name.
Jeff Thompson29ce3102013-09-27 11:47:48 -0700341 */
Yingdi Yu2e57a582014-02-20 23:34:43 -0800342 template<typename T>
Alexander Afanasyevb78bc4d2014-04-09 21:20:52 -0700343 void
Yingdi Yuf56c68f2014-04-24 21:50:13 -0700344 signByIdentity(T& packet, const Name& identityName);
Alexander Afanasyevb78bc4d2014-04-09 21:20:52 -0700345
Jeff Thompson3c73da42013-08-12 11:19:05 -0700346 /**
Yingdi Yu1b0311c2015-06-10 14:58:47 -0700347 * @deprecated use sign(const uint8_t*, size_t, const SigningInfo&) instead
Yingdi Yu2e57a582014-02-20 23:34:43 -0800348 * @brief Sign the byte array using the default certificate of a particular identity.
349 *
Jeff Thompsonc01e1782013-10-21 14:08:42 -0700350 * @param buffer The byte array to be signed.
351 * @param bufferLength the length of buffer.
352 * @param identityName The identity name.
353 * @return The Signature.
354 */
Yingdi Yu7036ce22014-06-19 18:53:37 -0700355 Signature
Yingdi Yuf56c68f2014-04-24 21:50:13 -0700356 signByIdentity(const uint8_t* buffer, size_t bufferLength, const Name& identityName);
Jeff Thompsonc01e1782013-10-21 14:08:42 -0700357
358 /**
Yingdi Yu1b0311c2015-06-10 14:58:47 -0700359 * @deprecated use sign(Data&, SigningInfo(SigningInfo::SIGNER_TYPE_SHA256))
Yingdi Yu6ab67812014-11-27 15:00:34 -0800360 * @brief Set Sha256 weak signature for @p data
Yingdi Yu21157162014-02-28 13:02:34 -0800361 */
Yingdi Yu7036ce22014-06-19 18:53:37 -0700362 void
Yingdi Yuf56c68f2014-04-24 21:50:13 -0700363 signWithSha256(Data& data);
Yingdi Yu21157162014-02-28 13:02:34 -0800364
365 /**
Yingdi Yu1b0311c2015-06-10 14:58:47 -0700366 * @deprecated use sign(Interest&, SigningInfo(SigningInfo::SIGNER_TYPE_SHA256))
Yingdi Yu6ab67812014-11-27 15:00:34 -0800367 * @brief Set Sha256 weak signature for @p interest
368 */
369 void
370 signWithSha256(Interest& interest);
371
372 /**
Yingdi Yu2e57a582014-02-20 23:34:43 -0800373 * @brief Generate a self-signed certificate for a public key.
374 *
Alexander Afanasyev770827c2014-05-13 17:42:55 -0700375 * @param keyName The name of the public key
376 * @return The generated certificate, shared_ptr<IdentityCertificate>() if selfSign fails
Yingdi Yu2abd73f2014-01-08 23:34:11 -0800377 */
Yingdi Yu8dceb1d2014-02-18 12:45:10 -0800378 shared_ptr<IdentityCertificate>
Yingdi Yuf56c68f2014-04-24 21:50:13 -0700379 selfSign(const Name& keyName);
Yingdi Yu2abd73f2014-01-08 23:34:11 -0800380
381 /**
Yingdi Yu2e57a582014-02-20 23:34:43 -0800382 * @brief Self-sign the supplied identity certificate.
383 *
384 * @param cert The supplied cert.
385 * @throws SecTpm::Error if the private key does not exist.
Jeff Thompson8efe5ad2013-08-20 17:36:38 -0700386 */
Jeff Thompson2ce8f492013-09-17 18:01:25 -0700387 void
Yingdi Yuf56c68f2014-04-24 21:50:13 -0700388 selfSign(IdentityCertificate& cert);
Yingdi Yu31b4af22014-01-14 14:13:00 -0800389
Yingdi Yu2e57a582014-02-20 23:34:43 -0800390 /**
391 * @brief delete a certificate.
392 *
Yingdi Yu2e57a582014-02-20 23:34:43 -0800393 * @param certificateName The certificate to be deleted.
Yingdi Yu6147ef42014-12-08 17:48:32 -0800394 * @throws KeyChain::Error if certificate cannot be deleted.
Yingdi Yu2e57a582014-02-20 23:34:43 -0800395 */
Yingdi Yu7036ce22014-06-19 18:53:37 -0700396 void
Yingdi Yuf56c68f2014-04-24 21:50:13 -0700397 deleteCertificate(const Name& certificateName);
Yingdi Yu28fd32f2014-01-28 19:03:03 -0800398
Yingdi Yu2e57a582014-02-20 23:34:43 -0800399 /**
400 * @brief delete a key.
401 *
Yingdi Yu2e57a582014-02-20 23:34:43 -0800402 * @param keyName The key to be deleted.
Yingdi Yu6147ef42014-12-08 17:48:32 -0800403 * @throws KeyChain::Error if key cannot be deleted.
Yingdi Yu2e57a582014-02-20 23:34:43 -0800404 */
Yingdi Yu7036ce22014-06-19 18:53:37 -0700405 void
Yingdi Yuf56c68f2014-04-24 21:50:13 -0700406 deleteKey(const Name& keyName);
Yingdi Yu28fd32f2014-01-28 19:03:03 -0800407
Yingdi Yu2e57a582014-02-20 23:34:43 -0800408 /**
409 * @brief delete an identity.
410 *
Yingdi Yu2e57a582014-02-20 23:34:43 -0800411 * @param identity The identity to be deleted.
Yingdi Yu6147ef42014-12-08 17:48:32 -0800412 * @throws KeyChain::Error if identity cannot be deleted.
Yingdi Yu2e57a582014-02-20 23:34:43 -0800413 */
Yingdi Yu7036ce22014-06-19 18:53:37 -0700414 void
Yingdi Yuf56c68f2014-04-24 21:50:13 -0700415 deleteIdentity(const Name& identity);
Yingdi Yu28fd32f2014-01-28 19:03:03 -0800416
Yingdi Yu2e57a582014-02-20 23:34:43 -0800417 /**
418 * @brief export an identity.
419 *
420 * @param identity The identity to export.
421 * @param passwordStr The password to secure the private key.
Yingdi Yu64c3fb42014-02-26 17:30:04 -0800422 * @return The encoded export data.
Yingdi Yuf56c68f2014-04-24 21:50:13 -0700423 * @throws SecPublicInfo::Error if anything goes wrong in exporting.
Yingdi Yu2e57a582014-02-20 23:34:43 -0800424 */
Yingdi Yu64c3fb42014-02-26 17:30:04 -0800425 shared_ptr<SecuredBag>
Yingdi Yuf56c68f2014-04-24 21:50:13 -0700426 exportIdentity(const Name& identity, const std::string& passwordStr);
Yingdi Yu8dceb1d2014-02-18 12:45:10 -0800427
Yingdi Yu2e57a582014-02-20 23:34:43 -0800428 /**
429 * @brief import an identity.
430 *
Yingdi Yu64c3fb42014-02-26 17:30:04 -0800431 * @param securedBag The encoded import data.
Yingdi Yu2e57a582014-02-20 23:34:43 -0800432 * @param passwordStr The password to secure the private key.
433 */
Yingdi Yu8dceb1d2014-02-18 12:45:10 -0800434 void
Yingdi Yuf56c68f2014-04-24 21:50:13 -0700435 importIdentity(const SecuredBag& securedBag, const std::string& passwordStr);
436
437 SecPublicInfo&
438 getPib()
Yingdi Yu8dceb1d2014-02-18 12:45:10 -0800439 {
Yingdi Yuf56c68f2014-04-24 21:50:13 -0700440 return *m_pib;
Yingdi Yu8dceb1d2014-02-18 12:45:10 -0800441 }
442
Yingdi Yuf56c68f2014-04-24 21:50:13 -0700443 const SecPublicInfo&
444 getPib() const
445 {
446 return *m_pib;
447 }
448
449 SecTpm&
450 getTpm()
451 {
452 return *m_tpm;
453 }
454
455 const SecTpm&
456 getTpm() const
457 {
458 return *m_tpm;
459 }
460
461 /*******************************
462 * Wrapper of SecPublicInfo *
463 *******************************/
464 bool
465 doesIdentityExist(const Name& identityName) const
466 {
467 return m_pib->doesIdentityExist(identityName);
468 }
469
470 void
471 addIdentity(const Name& identityName)
472 {
473 return m_pib->addIdentity(identityName);
474 }
475
476 bool
477 doesPublicKeyExist(const Name& keyName) const
478 {
479 return m_pib->doesPublicKeyExist(keyName);
480 }
481
482 void
483 addPublicKey(const Name& keyName, KeyType keyType, const PublicKey& publicKeyDer)
484 {
Yingdi Yu41546342014-11-30 23:37:53 -0800485 return m_pib->addKey(keyName, publicKeyDer);
Yingdi Yuf56c68f2014-04-24 21:50:13 -0700486 }
487
Yingdi Yu7036ce22014-06-19 18:53:37 -0700488 void
489 addKey(const Name& keyName, const PublicKey& publicKeyDer)
490 {
491 return m_pib->addKey(keyName, publicKeyDer);
492 }
493
Yingdi Yuf56c68f2014-04-24 21:50:13 -0700494 shared_ptr<PublicKey>
495 getPublicKey(const Name& keyName) const
496 {
497 return m_pib->getPublicKey(keyName);
498 }
499
500 bool
501 doesCertificateExist(const Name& certificateName) const
502 {
503 return m_pib->doesCertificateExist(certificateName);
504 }
505
506 void
507 addCertificate(const IdentityCertificate& certificate)
508 {
509 return m_pib->addCertificate(certificate);
510 }
511
512 shared_ptr<IdentityCertificate>
513 getCertificate(const Name& certificateName) const
514 {
515 return m_pib->getCertificate(certificateName);
516 }
517
518 Name
519 getDefaultIdentity() const
520 {
521 return m_pib->getDefaultIdentity();
522 }
523
524 Name
525 getDefaultKeyNameForIdentity(const Name& identityName) const
526 {
527 return m_pib->getDefaultKeyNameForIdentity(identityName);
528 }
529
José Quevedo641de4c2016-01-29 00:11:24 +0000530 /**
531 * @brief Get default key parameters for the specified identity
532 *
533 * If identity has a previously generated key, the returned parameters
534 * will include the same type of the key. If there are no existing
535 * keys, DEFAULT_KEY_PARAMS is used.
536 */
537 const KeyParams&
538 getDefaultKeyParamsForIdentity(const Name& identityName) const;
539
Yingdi Yuf56c68f2014-04-24 21:50:13 -0700540 Name
541 getDefaultCertificateNameForKey(const Name& keyName) const
542 {
543 return m_pib->getDefaultCertificateNameForKey(keyName);
544 }
545
546 void
547 getAllIdentities(std::vector<Name>& nameList, bool isDefault) const
548 {
549 return m_pib->getAllIdentities(nameList, isDefault);
550 }
551
552 void
553 getAllKeyNames(std::vector<Name>& nameList, bool isDefault) const
554 {
555 return m_pib->getAllKeyNames(nameList, isDefault);
556 }
557
558 void
559 getAllKeyNamesOfIdentity(const Name& identity, std::vector<Name>& nameList, bool isDefault) const
560 {
561 return m_pib->getAllKeyNamesOfIdentity(identity, nameList, isDefault);
562 }
563
564 void
565 getAllCertificateNames(std::vector<Name>& nameList, bool isDefault) const
566 {
567 return m_pib->getAllCertificateNames(nameList, isDefault);
568 }
569
570 void
571 getAllCertificateNamesOfKey(const Name& keyName,
572 std::vector<Name>& nameList,
573 bool isDefault) const
574 {
575 return m_pib->getAllCertificateNamesOfKey(keyName, nameList, isDefault);
576 }
577
578 void
579 deleteCertificateInfo(const Name& certificateName)
580 {
581 return m_pib->deleteCertificateInfo(certificateName);
582 }
583
584 void
585 deletePublicKeyInfo(const Name& keyName)
586 {
587 return m_pib->deletePublicKeyInfo(keyName);
588 }
589
590 void
591 deleteIdentityInfo(const Name& identity)
592 {
593 return m_pib->deleteIdentityInfo(identity);
594 }
595
596 void
597 setDefaultIdentity(const Name& identityName)
598 {
599 return m_pib->setDefaultIdentity(identityName);
600 }
601
602 void
603 setDefaultKeyNameForIdentity(const Name& keyName)
604 {
605 return m_pib->setDefaultKeyNameForIdentity(keyName);
606 }
607
608 void
609 setDefaultCertificateNameForKey(const Name& certificateName)
610 {
611 return m_pib->setDefaultCertificateNameForKey(certificateName);
612 }
613
614 Name
615 getNewKeyName(const Name& identityName, bool useKsk)
616 {
617 return m_pib->getNewKeyName(identityName, useKsk);
618 }
619
620 Name
621 getDefaultCertificateNameForIdentity(const Name& identityName) const
622 {
623 return m_pib->getDefaultCertificateNameForIdentity(identityName);
624 }
625
626 Name
627 getDefaultCertificateName() const
628 {
629 return m_pib->getDefaultCertificateName();
630 }
631
632 void
633 addCertificateAsKeyDefault(const IdentityCertificate& certificate)
634 {
635 return m_pib->addCertificateAsKeyDefault(certificate);
636 }
637
638 void
639 addCertificateAsIdentityDefault(const IdentityCertificate& certificate)
640 {
641 return m_pib->addCertificateAsIdentityDefault(certificate);
642 }
643
644 void
645 addCertificateAsSystemDefault(const IdentityCertificate& certificate)
646 {
647 return m_pib->addCertificateAsSystemDefault(certificate);
648 }
649
650 shared_ptr<IdentityCertificate>
651 getDefaultCertificate() const
652 {
Alexander Afanasyevaab79662014-07-07 17:35:34 -0700653 if (!static_cast<bool>(m_pib->getDefaultCertificate()))
654 const_cast<KeyChain*>(this)->setDefaultCertificateInternal();
655
656 return m_pib->getDefaultCertificate();
Yingdi Yuf56c68f2014-04-24 21:50:13 -0700657 }
658
659 void
660 refreshDefaultCertificate()
661 {
662 return m_pib->refreshDefaultCertificate();
663 }
664
665 /*******************************
666 * Wrapper of SecTpm *
667 *******************************/
668
669 void
670 setTpmPassword(const uint8_t* password, size_t passwordLength)
671 {
672 return m_tpm->setTpmPassword(password, passwordLength);
673 }
674
675 void
676 resetTpmPassword()
677 {
678 return m_tpm->resetTpmPassword();
679 }
680
681 void
682 setInTerminal(bool inTerminal)
683 {
684 return m_tpm->setInTerminal(inTerminal);
685 }
686
687 bool
688 getInTerminal() const
689 {
690 return m_tpm->getInTerminal();
691 }
692
693 bool
694 isLocked() const
695 {
696 return m_tpm->isLocked();
697 }
698
699 bool
700 unlockTpm(const char* password, size_t passwordLength, bool usePassword)
701 {
702 return m_tpm->unlockTpm(password, passwordLength, usePassword);
703 }
704
705 void
Yingdi Yu7036ce22014-06-19 18:53:37 -0700706 generateKeyPairInTpm(const Name& keyName, const KeyParams& params)
Yingdi Yuf56c68f2014-04-24 21:50:13 -0700707 {
Yingdi Yu7036ce22014-06-19 18:53:37 -0700708 return m_tpm->generateKeyPairInTpm(keyName, params);
Yingdi Yuf56c68f2014-04-24 21:50:13 -0700709 }
710
711 void
712 deleteKeyPairInTpm(const Name& keyName)
713 {
714 return m_tpm->deleteKeyPairInTpm(keyName);
715 }
716
717 shared_ptr<PublicKey>
718 getPublicKeyFromTpm(const Name& keyName) const
719 {
720 return m_tpm->getPublicKeyFromTpm(keyName);
721 }
722
723 Block
724 signInTpm(const uint8_t* data, size_t dataLength,
725 const Name& keyName,
726 DigestAlgorithm digestAlgorithm)
727 {
728 return m_tpm->signInTpm(data, dataLength, keyName, digestAlgorithm);
729 }
730
731 ConstBufferPtr
732 decryptInTpm(const uint8_t* data, size_t dataLength, const Name& keyName, bool isSymmetric)
733 {
734 return m_tpm->decryptInTpm(data, dataLength, keyName, isSymmetric);
735 }
736
737 ConstBufferPtr
738 encryptInTpm(const uint8_t* data, size_t dataLength, const Name& keyName, bool isSymmetric)
739 {
740 return m_tpm->encryptInTpm(data, dataLength, keyName, isSymmetric);
741 }
742
743 void
Yingdi Yu7036ce22014-06-19 18:53:37 -0700744 generateSymmetricKeyInTpm(const Name& keyName, const KeyParams& params)
Yingdi Yuf56c68f2014-04-24 21:50:13 -0700745 {
Yingdi Yu7036ce22014-06-19 18:53:37 -0700746 return m_tpm->generateSymmetricKeyInTpm(keyName, params);
Yingdi Yuf56c68f2014-04-24 21:50:13 -0700747 }
748
749 bool
750 doesKeyExistInTpm(const Name& keyName, KeyClass keyClass) const
751 {
752 return m_tpm->doesKeyExistInTpm(keyName, keyClass);
753 }
754
755 bool
756 generateRandomBlock(uint8_t* res, size_t size) const
757 {
758 return m_tpm->generateRandomBlock(res, size);
759 }
760
761 void
762 addAppToAcl(const Name& keyName, KeyClass keyClass, const std::string& appPath, AclType acl)
763 {
764 return m_tpm->addAppToAcl(keyName, keyClass, appPath, acl);
765 }
766
767 ConstBufferPtr
768 exportPrivateKeyPkcs5FromTpm(const Name& keyName, const std::string& password)
769 {
770 return m_tpm->exportPrivateKeyPkcs5FromTpm(keyName, password);
771 }
772
773 bool
774 importPrivateKeyPkcs5IntoTpm(const Name& keyName,
775 const uint8_t* buf, size_t size,
776 const std::string& password)
777 {
778 return m_tpm->importPrivateKeyPkcs5IntoTpm(keyName, buf, size, password);
779 }
Jeff Thompson8efe5ad2013-08-20 17:36:38 -0700780
Yingdi Yu2abd73f2014-01-08 23:34:11 -0800781private:
Yingdi Yu41546342014-11-30 23:37:53 -0800782 void
Alexander Afanasyev07113802015-01-15 19:14:36 -0800783 initialize(const std::string& pibLocatorUri,
784 const std::string& tpmLocatorUri,
Yingdi Yu41546342014-11-30 23:37:53 -0800785 bool needReset);
786
Yingdi Yu2e57a582014-02-20 23:34:43 -0800787 /**
Yingdi Yu1b0311c2015-06-10 14:58:47 -0700788 * @brief Prepare a SignatureInfo TLV according to signing information and return the signing key name
Yingdi Yuc8f883c2014-06-20 23:25:22 -0700789 *
Yingdi Yu1b0311c2015-06-10 14:58:47 -0700790 * @param params The signing parameters.
791 * @return The signing key name and prepared SignatureInfo.
792 * @throw Error when the requested signing method cannot be satisfied.
Yingdi Yuc8f883c2014-06-20 23:25:22 -0700793 */
Yingdi Yu1b0311c2015-06-10 14:58:47 -0700794 std::tuple<Name, SignatureInfo>
795 prepareSignatureInfo(const SigningInfo& params);
796
797 /**
798 * @brief Internal abstraction of packet signing.
799 *
800 * @param packet The packet to sign
801 * @param params The signing parameters.
802 * @throw Error when the signing fails.
803 */
804 template<typename T>
805 void
806 signImpl(T& packet, const SigningInfo& params);
Yingdi Yuc8f883c2014-06-20 23:25:22 -0700807
808 /**
Yingdi Yuf56c68f2014-04-24 21:50:13 -0700809 * @brief Set default certificate if it is not initialized
810 */
811 void
812 setDefaultCertificateInternal();
813
814 /**
Yingdi Yu2e57a582014-02-20 23:34:43 -0800815 * @brief Generate a key pair for the specified identity.
816 *
Yingdi Yu2abd73f2014-01-08 23:34:11 -0800817 * @param identityName The name of the specified identity.
818 * @param isKsk true for generating a Key-Signing-Key (KSK), false for a Data-Signing-Key (KSK).
Yingdi Yu7036ce22014-06-19 18:53:37 -0700819 * @param params The parameter of the key.
Yingdi Yu2abd73f2014-01-08 23:34:11 -0800820 * @return The name of the generated key.
821 */
Yingdi Yu7036ce22014-06-19 18:53:37 -0700822 Name
Yingdi Yu4b8c6a22014-04-15 23:00:54 -0700823 generateKeyPair(const Name& identityName, bool isKsk = false,
Yingdi Yu7036ce22014-06-19 18:53:37 -0700824 const KeyParams& params = DEFAULT_KEY_PARAMS);
Yingdi Yu2abd73f2014-01-08 23:34:11 -0800825
Yingdi Yu8726f652014-01-23 10:35:12 -0800826 /**
Yingdi Yu2e57a582014-02-20 23:34:43 -0800827 * @brief Sign the data using a particular key.
828 *
829 * @param data Reference to the data packet.
830 * @param signature Signature to be added.
Yingdi Yu8726f652014-01-23 10:35:12 -0800831 * @param keyName The name of the signing key.
832 * @param digestAlgorithm the digest algorithm.
833 * @throws Tpm::Error
Alexander Afanasyevb78bc4d2014-04-09 21:20:52 -0700834 */
Yingdi Yu7036ce22014-06-19 18:53:37 -0700835 void
Yingdi Yuc8f883c2014-06-20 23:25:22 -0700836 signPacketWrapper(Data& data, const Signature& signature,
Yingdi Yuf56c68f2014-04-24 21:50:13 -0700837 const Name& keyName, DigestAlgorithm digestAlgorithm);
Yingdi Yu8726f652014-01-23 10:35:12 -0800838
Yingdi Yu2e57a582014-02-20 23:34:43 -0800839 /**
840 * @brief Sign the interest using a particular key.
841 *
842 * @param interest Reference to the interest packet.
843 * @param signature Signature to be added.
844 * @param keyName The name of the signing key.
845 * @param digestAlgorithm the digest algorithm.
846 * @throws Tpm::Error
Alexander Afanasyevb78bc4d2014-04-09 21:20:52 -0700847 */
Yingdi Yu7036ce22014-06-19 18:53:37 -0700848 void
Yingdi Yuc8f883c2014-06-20 23:25:22 -0700849 signPacketWrapper(Interest& interest, const Signature& signature,
Yingdi Yuf56c68f2014-04-24 21:50:13 -0700850 const Name& keyName, DigestAlgorithm digestAlgorithm);
Yingdi Yu2e57a582014-02-20 23:34:43 -0800851
Yingdi Yu1b0311c2015-06-10 14:58:47 -0700852 /**
853 * @brief Generate a SignatureValue block for a buffer @p buf with size @p size using
854 * a key with name @p keyName and digest algorithm @p digestAlgorithm.
855 */
856 Block
857 pureSign(const uint8_t* buf, size_t size, const Name& keyName, DigestAlgorithm digestAlgorithm) const;
858
Alexander Afanasyev07113802015-01-15 19:14:36 -0800859 static void
Alexander Afanasyev34a37632015-01-16 17:37:36 -0800860 registerPibImpl(const std::string& canonicalName,
861 std::initializer_list<std::string> aliases, PibCreateFunc createFunc);
Alexander Afanasyev07113802015-01-15 19:14:36 -0800862
863 static void
Alexander Afanasyev34a37632015-01-16 17:37:36 -0800864 registerTpmImpl(const std::string& canonicalName,
865 std::initializer_list<std::string> aliases, TpmCreateFunc createFunc);
Alexander Afanasyev07113802015-01-15 19:14:36 -0800866
Yingdi Yu41546342014-11-30 23:37:53 -0800867public:
Yingdi Yu1b0311c2015-06-10 14:58:47 -0700868 static tlv::SignatureTypeValue
869 getSignatureType(KeyType keyType, DigestAlgorithm digestAlgorithm);
870
871public:
Yingdi Yu41546342014-11-30 23:37:53 -0800872 static const Name DEFAULT_PREFIX;
Yingdi Yu1b0311c2015-06-10 14:58:47 -0700873 static const SigningInfo DEFAULT_SIGNING_INFO;
874
875 /**
876 * @brief A localhost identity which indicates that signature is generated using SHA-256.
877 * @todo Passing this as identity is not implemented.
878 */
879 static const Name DIGEST_SHA256_IDENTITY;
880
Yingdi Yu41546342014-11-30 23:37:53 -0800881 // RsaKeyParams is set to be default for backward compatibility.
882 static const RsaKeyParams DEFAULT_KEY_PARAMS;
Yingdi Yuf56c68f2014-04-24 21:50:13 -0700883
Yingdi Yu1b0311c2015-06-10 14:58:47 -0700884 typedef std::map<std::string, Block> SignParams;
885
Yingdi Yuf56c68f2014-04-24 21:50:13 -0700886private:
Alexander Afanasyev07113802015-01-15 19:14:36 -0800887 std::unique_ptr<SecPublicInfo> m_pib;
888 std::unique_ptr<SecTpm> m_tpm;
Yingdi Yu0f5fb692014-06-10 12:07:28 -0700889 time::milliseconds m_lastTimestamp;
Yingdi Yuf56c68f2014-04-24 21:50:13 -0700890};
891
Yingdi Yuf56c68f2014-04-24 21:50:13 -0700892template<typename T>
893void
Yingdi Yu1b0311c2015-06-10 14:58:47 -0700894KeyChain::signImpl(T& packet, const SigningInfo& params)
Yingdi Yuf56c68f2014-04-24 21:50:13 -0700895{
Yingdi Yu1b0311c2015-06-10 14:58:47 -0700896 Name keyName;
897 SignatureInfo sigInfo;
898 std::tie(keyName, sigInfo) = prepareSignatureInfo(params);
Yingdi Yuf56c68f2014-04-24 21:50:13 -0700899
Yingdi Yu1b0311c2015-06-10 14:58:47 -0700900 signPacketWrapper(packet, Signature(sigInfo),
901 keyName, params.getDigestAlgorithm());
Yingdi Yuf56c68f2014-04-24 21:50:13 -0700902}
903
904template<typename T>
905void
906KeyChain::sign(T& packet, const Name& certificateName)
907{
Yingdi Yu1b0311c2015-06-10 14:58:47 -0700908 signImpl(packet, SigningInfo(SigningInfo::SIGNER_TYPE_CERT, certificateName));
Yingdi Yuf56c68f2014-04-24 21:50:13 -0700909}
910
911template<typename T>
912void
913KeyChain::signByIdentity(T& packet, const Name& identityName)
914{
Yingdi Yu1b0311c2015-06-10 14:58:47 -0700915 signImpl(packet, SigningInfo(SigningInfo::SIGNER_TYPE_ID, identityName));
Yingdi Yuf56c68f2014-04-24 21:50:13 -0700916}
917
Alexander Afanasyev07113802015-01-15 19:14:36 -0800918template<class PibType>
919inline void
Alexander Afanasyev34a37632015-01-16 17:37:36 -0800920KeyChain::registerPib(std::initializer_list<std::string> aliases)
Alexander Afanasyev07113802015-01-15 19:14:36 -0800921{
Alexander Afanasyev34a37632015-01-16 17:37:36 -0800922 registerPibImpl(*aliases.begin(), aliases, [] (const std::string& locator) {
Davide Pesavento409cc202015-09-19 14:13:16 +0200923 return make_unique<PibType>(locator);
Alexander Afanasyev07113802015-01-15 19:14:36 -0800924 });
925}
926
927template<class TpmType>
928inline void
Alexander Afanasyev34a37632015-01-16 17:37:36 -0800929KeyChain::registerTpm(std::initializer_list<std::string> aliases)
Alexander Afanasyev07113802015-01-15 19:14:36 -0800930{
Alexander Afanasyev34a37632015-01-16 17:37:36 -0800931 registerTpmImpl(*aliases.begin(), aliases, [] (const std::string& locator) {
Davide Pesavento409cc202015-09-19 14:13:16 +0200932 return make_unique<TpmType>(locator);
Alexander Afanasyev07113802015-01-15 19:14:36 -0800933 });
934}
935
936/**
937 * \brief Register SecPib class in ndn-cxx KeyChain
938 *
939 * This macro should be placed once in the implementation file of the
940 * SecPib type within the namespace where the type is declared.
941 */
Alexander Afanasyev34a37632015-01-16 17:37:36 -0800942#define NDN_CXX_KEYCHAIN_REGISTER_PIB(PibType, ...) \
Alexander Afanasyev07113802015-01-15 19:14:36 -0800943static class NdnCxxAuto ## PibType ## PibRegistrationClass \
944{ \
945public: \
946 NdnCxxAuto ## PibType ## PibRegistrationClass() \
947 { \
948 ::ndn::KeyChain::registerPib<PibType>({__VA_ARGS__}); \
949 } \
950} ndnCxxAuto ## PibType ## PibRegistrationVariable
951
952/**
953 * \brief Register SecTpm class in ndn-cxx KeyChain
954 *
955 * This macro should be placed once in the implementation file of the
956 * SecTpm type within the namespace where the type is declared.
957 */
Alexander Afanasyev34a37632015-01-16 17:37:36 -0800958#define NDN_CXX_KEYCHAIN_REGISTER_TPM(TpmType, ...) \
Alexander Afanasyev07113802015-01-15 19:14:36 -0800959static class NdnCxxAuto ## TpmType ## TpmRegistrationClass \
960{ \
961public: \
962 NdnCxxAuto ## TpmType ## TpmRegistrationClass() \
963 { \
964 ::ndn::KeyChain::registerTpm<TpmType>({__VA_ARGS__}); \
965 } \
966} ndnCxxAuto ## TpmType ## TpmRegistrationVariable
967
Yingdi Yu1b0311c2015-06-10 14:58:47 -0700968} // namespace security
969
970using security::KeyChain;
971
Yingdi Yu6ab67812014-11-27 15:00:34 -0800972} // namespace ndn
Jeff Thompson47c93cf2013-08-09 00:38:48 -0700973
Alexander Afanasyev766cea72014-04-24 19:16:42 -0700974#endif // NDN_SECURITY_KEY_CHAIN_HPP