blob: 3a84a4740eb133a36d536df412011582abe44fdb [file] [log] [blame]
Alexander Afanasyev4c9a3d52017-01-03 17:45:19 -08001/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
Davide Pesavento10b24be2017-07-12 23:23:46 -04002/*
Alexander Afanasyev4c9a3d52017-01-03 17:45:19 -08003 * Copyright (c) 2013-2017 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 * @author Yingdi Yu <http://irl.cs.ucla.edu/~yingdi/>
22 */
23
24#ifndef NDN_SECURITY_V1_KEY_CHAIN_HPP
25#define NDN_SECURITY_V1_KEY_CHAIN_HPP
26
27#include "sec-public-info.hpp"
28#include "sec-tpm.hpp"
29#include "secured-bag.hpp"
30#include "../key-params.hpp"
31#include "../signature-sha256-with-rsa.hpp"
32#include "../signature-sha256-with-ecdsa.hpp"
33#include "../digest-sha256.hpp"
34#include "../signing-info.hpp"
Alexander Afanasyev4c9a3d52017-01-03 17:45:19 -080035#include "../../interest.hpp"
Alexander Afanasyev4c9a3d52017-01-03 17:45:19 -080036#include "../../util/random.hpp"
37#include <initializer_list>
38
39namespace ndn {
40namespace security {
41namespace v1 {
42
43/**
44 * @brief The packet signing interface.
45 *
46 * @deprecated Use v2::KeyChain
47 */
48class KeyChain : noncopyable
49{
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
61 /**
62 * @brief Error thrown when the supplied TPM locator to KeyChain constructor does not match
63 * the locator stored in PIB
64 */
65 class MismatchError : public Error
66 {
67 public:
68 explicit
69 MismatchError(const std::string& what)
70 : Error(what)
71 {
72 }
73 };
74
75 typedef function<unique_ptr<SecPublicInfo> (const std::string&)> PibCreateFunc;
76 typedef function<unique_ptr<SecTpm>(const std::string&)> TpmCreateFunc;
77
78 /**
79 * @brief Register a new PIB
80 * @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.
82 */
83 template<class PibType>
84 static void
85 registerPib(std::initializer_list<std::string> aliases);
86
87 /**
88 * @brief Register a new TPM
89 * @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.
91 */
92 template<class TpmType>
93 static void
94 registerTpm(std::initializer_list<std::string> aliases);
95
96 /**
97 * @brief Get default PIB locator
98 */
99 static std::string
100 getDefaultPibLocator();
101
102 /**
103 * @brief Create a PIB according to @p pibLocator
104 */
105 static unique_ptr<SecPublicInfo>
106 createPib(const std::string& pibLocator);
107
108 /**
109 * @brief Get default TPM locator
110 */
111 static std::string
112 getDefaultTpmLocator();
113
114 /**
115 * @brief Create a TPM according to @p tpmLocator
116 */
117 static unique_ptr<SecTpm>
118 createTpm(const std::string& tpmLocator);
119
120 /**
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();
129
130 /**
131 * @brief KeyChain constructor
132 *
Davide Pesavento10b24be2017-07-12 23:23:46 -0400133 * @sa https://redmine.named-data.net/issues/2260
Alexander Afanasyev4c9a3d52017-01-03 17:45:19 -0800134 *
135 * @param pibLocator PIB locator
136 * @param tpmLocator TPM locator
137 * @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);
143
144 virtual
145 ~KeyChain();
146
147 /**
148 * @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.
150 *
151 * @param identityName The name of the identity.
152 * @param params The key parameter if a key needs to be generated for the identity.
153 * @return The name of the default certificate of the identity.
154 */
155 Name
156 createIdentity(const Name& identityName, const KeyParams& params = DEFAULT_KEY_PARAMS);
157
158 /**
159 * @brief Generate a pair of RSA keys for the specified identity.
160 *
161 * @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.
Spyridon Mastorakis1ece2e32015-08-27 18:52:21 -0700165 * @see generateEcKeyPair
Alexander Afanasyev4c9a3d52017-01-03 17:45:19 -0800166 */
167 Name
168 generateRsaKeyPair(const Name& identityName, bool isKsk = false, uint32_t keySize = 2048);
169
170 /**
Spyridon Mastorakis1ece2e32015-08-27 18:52:21 -0700171 * @brief Generate a pair of EC keys for the specified identity.
Alexander Afanasyev4c9a3d52017-01-03 17:45:19 -0800172 *
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 */
179 Name
Spyridon Mastorakis1ece2e32015-08-27 18:52:21 -0700180 generateEcKeyPair(const Name& identityName, bool isKsk = false, uint32_t keySize = 256);
Alexander Afanasyev4c9a3d52017-01-03 17:45:19 -0800181
182 /**
183 * @brief Generate a pair of RSA keys for the specified identity and set it as default key for
184 * the identity.
185 *
186 * @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.
Spyridon Mastorakis1ece2e32015-08-27 18:52:21 -0700190 * @see generateRsaKeyPair, generateEcKeyPair, generateEcKeyPairAsDefault
Alexander Afanasyev4c9a3d52017-01-03 17:45:19 -0800191 */
192 Name
193 generateRsaKeyPairAsDefault(const Name& identityName, bool isKsk = false, uint32_t keySize = 2048);
194
195 /**
Spyridon Mastorakis1ece2e32015-08-27 18:52:21 -0700196 * @brief Generate a pair of EC keys for the specified identity and set it as default key for
Alexander Afanasyev4c9a3d52017-01-03 17:45:19 -0800197 * 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.
Spyridon Mastorakis1ece2e32015-08-27 18:52:21 -0700203 * @see generateRsaKeyPair, generateEcKeyPair, generateRsaKeyPairAsDefault
Alexander Afanasyev4c9a3d52017-01-03 17:45:19 -0800204 */
205 Name
Spyridon Mastorakis1ece2e32015-08-27 18:52:21 -0700206 generateEcKeyPairAsDefault(const Name& identityName, bool isKsk = false, uint32_t keySize = 256);
Alexander Afanasyev4c9a3d52017-01-03 17:45:19 -0800207
208 /**
209 * @brief prepare an unsigned identity certificate
210 *
211 * @param keyName Key name, e.g., `/<identity_name>/ksk-123456`.
212 * @param signingIdentity The signing identity.
213 * @param notBefore Refer to IdentityCertificate.
214 * @param notAfter Refer to IdentityCertificate.
215 * @param subjectDescription Refer to IdentityCertificate.
216 * @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-....`).
221 * @return IdentityCertificate.
222 */
223 shared_ptr<IdentityCertificate>
224 prepareUnsignedIdentityCertificate(const Name& keyName,
225 const Name& signingIdentity,
226 const time::system_clock::TimePoint& notBefore,
227 const time::system_clock::TimePoint& notAfter,
228 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);
255
256 /**
257 * @brief Sign data according to the supplied signing information
258 *
259 * 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).
263 *
264 * 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
271 */
272 void
273 sign(Data& data, const SigningInfo& params = DEFAULT_SIGNING_INFO);
274
275 /**
276 * @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&)
309 * @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.
314 */
315 template<typename T>
316 void
317 sign(T& packet, const Name& certificateName);
318
319 /**
320 * @deprecated Use sign(const uint8_t*, size_t, const SigningInfo&) instead
321 * @brief Sign the byte array using a particular certificate.
322 *
323 * @param buffer The byte array to be signed.
324 * @param bufferLength the length of buffer.
325 * @param certificateName The certificate name of the signing key.
326 * @return The Signature.
327 * @throws SecPublicInfo::Error if certificate does not exist.
328 */
329 Signature
330 sign(const uint8_t* buffer, size_t bufferLength, const Name& certificateName);
331
332 /**
333 * @deprecated use sign sign(T&, const SigningInfo&)
334 * @brief Sign packet using the default certificate of a particular identity.
335 *
336 * If there is no default certificate of that identity, this method will create a self-signed
337 * certificate.
338 *
339 * @param packet The packet to be signed.
340 * @param identityName The signing identity name.
341 */
342 template<typename T>
343 void
344 signByIdentity(T& packet, const Name& identityName);
345
346 /**
347 * @deprecated use sign(const uint8_t*, size_t, const SigningInfo&) instead
348 * @brief Sign the byte array using the default certificate of a particular identity.
349 *
350 * @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 */
355 Signature
356 signByIdentity(const uint8_t* buffer, size_t bufferLength, const Name& identityName);
357
358 /**
359 * @deprecated use sign(Data&, SigningInfo(SigningInfo::SIGNER_TYPE_SHA256))
360 * @brief Set Sha256 weak signature for @p data
361 */
362 void
363 signWithSha256(Data& data);
364
365 /**
366 * @deprecated use sign(Interest&, SigningInfo(SigningInfo::SIGNER_TYPE_SHA256))
367 * @brief Set Sha256 weak signature for @p interest
368 */
369 void
370 signWithSha256(Interest& interest);
371
372 /**
373 * @brief Generate a self-signed certificate for a public key.
374 *
375 * @param keyName The name of the public key
376 * @return The generated certificate, shared_ptr<IdentityCertificate>() if selfSign fails
377 */
378 shared_ptr<IdentityCertificate>
379 selfSign(const Name& keyName);
380
381 /**
382 * @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.
386 */
387 void
388 selfSign(IdentityCertificate& cert);
389
390 /**
391 * @brief delete a certificate.
392 *
393 * @param certificateName The certificate to be deleted.
394 * @throws KeyChain::Error if certificate cannot be deleted.
395 */
396 void
397 deleteCertificate(const Name& certificateName);
398
399 /**
400 * @brief delete a key.
401 *
402 * @param keyName The key to be deleted.
403 * @throws KeyChain::Error if key cannot be deleted.
404 */
405 void
406 deleteKey(const Name& keyName);
407
408 /**
409 * @brief delete an identity.
410 *
411 * @param identity The identity to be deleted.
412 * @throws KeyChain::Error if identity cannot be deleted.
413 */
414 void
415 deleteIdentity(const Name& identity);
416
417 /**
418 * @brief export an identity.
419 *
420 * @param identity The identity to export.
421 * @param passwordStr The password to secure the private key.
422 * @return The encoded export data.
423 * @throws SecPublicInfo::Error if anything goes wrong in exporting.
424 */
425 shared_ptr<SecuredBag>
426 exportIdentity(const Name& identity, const std::string& passwordStr);
427
428 /**
429 * @brief import an identity.
430 *
431 * @param securedBag The encoded import data.
432 * @param passwordStr The password to secure the private key.
433 */
434 void
435 importIdentity(const SecuredBag& securedBag, const std::string& passwordStr);
436
437 SecPublicInfo&
438 getPib()
439 {
440 return *m_pib;
441 }
442
443 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 {
485 return m_pib->addKey(keyName, publicKeyDer);
486 }
487
488 void
489 addKey(const Name& keyName, const PublicKey& publicKeyDer)
490 {
491 return m_pib->addKey(keyName, publicKeyDer);
492 }
493
494 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
530 /**
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
540 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 {
653 if (!static_cast<bool>(m_pib->getDefaultCertificate()))
654 const_cast<KeyChain*>(this)->setDefaultCertificateInternal();
655
656 return m_pib->getDefaultCertificate();
657 }
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
706 generateKeyPairInTpm(const Name& keyName, const KeyParams& params)
707 {
708 return m_tpm->generateKeyPairInTpm(keyName, params);
709 }
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
744 generateSymmetricKeyInTpm(const Name& keyName, const KeyParams& params)
745 {
746 return m_tpm->generateSymmetricKeyInTpm(keyName, params);
747 }
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 }
780
781private:
782 void
783 initialize(const std::string& pibLocatorUri,
784 const std::string& tpmLocatorUri,
785 bool needReset);
786
787 /**
788 * @brief Prepare a SignatureInfo TLV according to signing information and return the signing key name
789 *
790 * @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.
793 */
794 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);
807
808 /**
809 * @brief Set default certificate if it is not initialized
810 */
811 void
812 setDefaultCertificateInternal();
813
814 /**
815 * @brief Generate a key pair for the specified identity.
816 *
817 * @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).
819 * @param params The parameter of the key.
820 * @return The name of the generated key.
821 */
822 Name
823 generateKeyPair(const Name& identityName, bool isKsk = false,
824 const KeyParams& params = DEFAULT_KEY_PARAMS);
825
826 /**
827 * @brief Sign the data using a particular key.
828 *
829 * @param data Reference to the data packet.
830 * @param signature Signature to be added.
831 * @param keyName The name of the signing key.
832 * @param digestAlgorithm the digest algorithm.
833 * @throws Tpm::Error
834 */
835 void
836 signPacketWrapper(Data& data, const Signature& signature,
837 const Name& keyName, DigestAlgorithm digestAlgorithm);
838
839 /**
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
847 */
848 void
849 signPacketWrapper(Interest& interest, const Signature& signature,
850 const Name& keyName, DigestAlgorithm digestAlgorithm);
851
852 /**
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
859 static void
860 registerPibImpl(const std::string& canonicalName,
861 std::initializer_list<std::string> aliases, PibCreateFunc createFunc);
862
863 static void
864 registerTpmImpl(const std::string& canonicalName,
865 std::initializer_list<std::string> aliases, TpmCreateFunc createFunc);
866
867public:
868 static tlv::SignatureTypeValue
869 getSignatureType(KeyType keyType, DigestAlgorithm digestAlgorithm);
870
871public:
872 static const Name DEFAULT_PREFIX;
873 static const SigningInfo DEFAULT_SIGNING_INFO;
874
875 // RsaKeyParams is set to be default for backward compatibility.
876 static const RsaKeyParams DEFAULT_KEY_PARAMS;
877
878 typedef std::map<std::string, Block> SignParams;
879
880private:
881 std::unique_ptr<SecPublicInfo> m_pib;
882 std::unique_ptr<SecTpm> m_tpm;
883 time::milliseconds m_lastTimestamp;
884};
885
886template<typename T>
887void
888KeyChain::signImpl(T& packet, const SigningInfo& params)
889{
890 Name keyName;
891 SignatureInfo sigInfo;
892 std::tie(keyName, sigInfo) = prepareSignatureInfo(params);
893
894 signPacketWrapper(packet, Signature(sigInfo),
895 keyName, params.getDigestAlgorithm());
896}
897
898template<typename T>
899void
900KeyChain::sign(T& packet, const Name& certificateName)
901{
902 signImpl(packet, SigningInfo(SigningInfo::SIGNER_TYPE_CERT, certificateName));
903}
904
905template<typename T>
906void
907KeyChain::signByIdentity(T& packet, const Name& identityName)
908{
909 signImpl(packet, SigningInfo(SigningInfo::SIGNER_TYPE_ID, identityName));
910}
911
912template<class PibType>
913inline void
914KeyChain::registerPib(std::initializer_list<std::string> aliases)
915{
916 registerPibImpl(*aliases.begin(), aliases, [] (const std::string& locator) {
917 return make_unique<PibType>(locator);
918 });
919}
920
921template<class TpmType>
922inline void
923KeyChain::registerTpm(std::initializer_list<std::string> aliases)
924{
925 registerTpmImpl(*aliases.begin(), aliases, [] (const std::string& locator) {
926 return make_unique<TpmType>(locator);
927 });
928}
929
930/**
931 * \brief Register SecPib class in ndn-cxx KeyChain
932 *
933 * This macro should be placed once in the implementation file of the
934 * SecPib type within the namespace where the type is declared.
935 */
936#define NDN_CXX_V1_KEYCHAIN_REGISTER_PIB(PibType, ...) \
937static class NdnCxxAuto ## PibType ## PibRegistrationClass \
938{ \
939public: \
940 NdnCxxAuto ## PibType ## PibRegistrationClass() \
941 { \
942 ::ndn::security::v1::KeyChain::registerPib<PibType>({__VA_ARGS__}); \
943 } \
944} ndnCxxAuto ## PibType ## PibRegistrationVariable
945
946/**
947 * \brief Register SecTpm class in ndn-cxx KeyChain
948 *
949 * This macro should be placed once in the implementation file of the
950 * SecTpm type within the namespace where the type is declared.
951 */
952#define NDN_CXX_V1_KEYCHAIN_REGISTER_TPM(TpmType, ...) \
953static class NdnCxxAuto ## TpmType ## TpmRegistrationClass \
954{ \
955public: \
956 NdnCxxAuto ## TpmType ## TpmRegistrationClass() \
957 { \
958 ::ndn::security::v1::KeyChain::registerTpm<TpmType>({__VA_ARGS__}); \
959 } \
960} ndnCxxAuto ## TpmType ## TpmRegistrationVariable
961
962} // namespace v1
963} // namespace security
964} // namespace ndn
965
966#endif // NDN_SECURITY_V1_KEY_CHAIN_HPP