back-end.cpp
Go to the documentation of this file.
1 /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
22 #include "back-end.hpp"
23 #include "key-handle.hpp"
24 #include "tpm.hpp"
25 #include "../transform.hpp"
26 #include "../../encoding/buffer-stream.hpp"
27 #include "../../util/random.hpp"
28 #include "../pib/key.hpp"
29 
30 namespace ndn {
31 namespace security {
32 namespace tpm {
33 
34 BackEnd::~BackEnd() = default;
35 
36 bool
37 BackEnd::hasKey(const Name& keyName) const
38 {
39  return doHasKey(keyName);
40 }
41 
42 unique_ptr<KeyHandle>
43 BackEnd::getKeyHandle(const Name& keyName) const
44 {
45  return doGetKeyHandle(keyName);
46 }
47 
48 unique_ptr<KeyHandle>
49 BackEnd::createKey(const Name& identity, const KeyParams& params)
50 {
51  // key name checking
52  switch (params.getKeyIdType()) {
53  case KeyIdType::USER_SPECIFIED: { // keyId is pre-set.
54  Name keyName = v2::constructKeyName(identity, params.getKeyId());
55  if (hasKey(keyName)) {
56  BOOST_THROW_EXCEPTION(Tpm::Error("Key `" + keyName.toUri() + "` already exists"));
57  }
58  break;
59  }
60  case KeyIdType::SHA256: {
61  // KeyName will be assigned in setKeyName after key is generated
62  break;
63  }
64  case KeyIdType::RANDOM: {
65  Name keyName;
66  name::Component keyId;
67  do {
69  keyName = v2::constructKeyName(identity, keyId);
70  } while (hasKey(keyName));
71 
72  const_cast<KeyParams&>(params).setKeyId(keyId);
73  break;
74  }
75  default: {
76  BOOST_THROW_EXCEPTION(Error("Unsupported key id type"));
77  }
78  }
79 
80  return doCreateKey(identity, params);
81 }
82 
83 void
84 BackEnd::deleteKey(const Name& keyName)
85 {
86  doDeleteKey(keyName);
87 }
88 
90 BackEnd::exportKey(const Name& keyName, const char* pw, size_t pwLen)
91 {
92  if (!hasKey(keyName)) {
93  BOOST_THROW_EXCEPTION(Error("Key `" + keyName.toUri() + "` does not exist"));
94  }
95  return doExportKey(keyName, pw, pwLen);
96 }
97 
98 void
99 BackEnd::importKey(const Name& keyName, const uint8_t* pkcs8, size_t pkcs8Len, const char* pw, size_t pwLen)
100 {
101  if (hasKey(keyName)) {
102  BOOST_THROW_EXCEPTION(Error("Key `" + keyName.toUri() + "` already exists"));
103  }
104  doImportKey(keyName, pkcs8, pkcs8Len, pw, pwLen);
105 }
106 
107 void
108 BackEnd::setKeyName(KeyHandle& keyHandle, const Name& identity, const KeyParams& params)
109 {
110  name::Component keyId;
111  switch (params.getKeyIdType()) {
113  keyId = params.getKeyId();
114  break;
115  case KeyIdType::SHA256: {
116  using namespace transform;
117 
118  OBufferStream os;
119  bufferSource(*keyHandle.derivePublicKey()) >> digestFilter() >> streamSink(os);
120  keyId = name::Component(os.buf());
121  break;
122  }
123  case KeyIdType::RANDOM: {
124  BOOST_ASSERT(!params.getKeyId().empty());
125  keyId = params.getKeyId();
126  break;
127  }
128  default: {
129  BOOST_ASSERT(false);
130  }
131  }
132 
133  keyHandle.setKeyName(v2::constructKeyName(identity, keyId));
134 }
135 
136 bool
138 {
139  return true;
140 }
141 
142 void
143 BackEnd::setTerminalMode(bool isTerminal) const
144 {
145 }
146 
147 bool
149 {
150  return false;
151 }
152 
153 bool
154 BackEnd::unlockTpm(const char* pw, size_t pwLen) const
155 {
156  return !isTpmLocked();
157 }
158 
159 } // namespace tpm
160 } // namespace security
161 } // namespace ndn
void setKeyName(const Name &keyName)
Definition: key-handle.cpp:49
static Component fromNumber(uint64_t number)
Create a component encoded as nonNegativeInteger.
Copyright (c) 2013-2016 Regents of the University of California.
Definition: common.hpp:74
ConstBufferPtr derivePublicKey() const
Definition: key-handle.cpp:43
unique_ptr< KeyHandle > createKey(const Name &identity, const KeyParams &params)
Create key for identity according to params.
Definition: back-end.cpp:49
uint64_t generateSecureWord64()
Generate a cryptographically secure random integer from the range [0, 2^64)
Definition: random.cpp:39
virtual void setTerminalMode(bool isTerminal) const
Set the terminal mode of TPM.
Definition: back-end.cpp:143
void importKey(const Name &keyName, const uint8_t *pkcs8, size_t pkcs8Len, const char *pw, size_t pwLen)
Import a private key in encrypted PKCS #8 format.
Definition: back-end.cpp:99
void deleteKey(const Name &keyName)
Delete a key with name keyName.
Definition: back-end.cpp:84
Abstraction of TPM key handle.
Definition: key-handle.hpp:38
virtual bool isTpmLocked() const
Definition: back-end.cpp:148
std::string toUri() const
Encode this name as a URI.
Definition: name.cpp:171
ConstBufferPtr exportKey(const Name &keyName, const char *pw, size_t pwLen)
Definition: back-end.cpp:90
virtual bool isTerminalMode() const
Check if TPM is in terminal mode.
Definition: back-end.cpp:137
bool hasKey(const Name &keyName) const
Definition: back-end.cpp:37
unique_ptr< Sink > streamSink(std::ostream &os)
Definition: stream-sink.cpp:51
unique_ptr< Transform > digestFilter(DigestAlgorithm algo)
Use the SHA256 hash of the public key as the key id.
Name abstraction to represent an absolute name.
Definition: name.hpp:46
static void setKeyName(KeyHandle &keyHandle, const Name &identity, const KeyParams &params)
Set the key name in keyHandle according to identity and params.
Definition: back-end.cpp:108
virtual bool unlockTpm(const char *pw, size_t pwLen) const
Unlock TPM.
Definition: back-end.cpp:154
KeyIdType getKeyIdType() const
Definition: key-params.hpp:59
unique_ptr< KeyHandle > getKeyHandle(const Name &keyName) const
Definition: back-end.cpp:43
Component holds a read-only name component value.
shared_ptr< Buffer > buf()
Flush written data to the stream and return shared pointer to the underlying buffer.
Name constructKeyName(const Name &identity, const name::Component &keyId)
Construct key name based on the appropriate naming conventions.
Definition: key.cpp:131
Use a 64-bit random number as the key id.
Base class of key parameters.
Definition: key-params.hpp:36
implements an output stream that constructs ndn::Buffer
User-specified key ID.
shared_ptr< const Buffer > ConstBufferPtr
Definition: buffer.hpp:33
const name::Component & getKeyId() const
Definition: key-params.hpp:71