blob: 5b07fa0a24f351ade9808eb7188485534eb5c634 [file] [log] [blame]
Jeff Thompson25b4e612013-10-10 16:03:24 -07001/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil -*- */
Jeff Thompson41471912013-09-12 16:21:50 -07002/**
Jeff Thompson7687dc02013-09-13 11:54:07 -07003 * Copyright (C) 2013 Regents of the University of California.
Jeff Thompson06e787d2013-09-12 19:00:55 -07004 * @author: Yingdi Yu <yingdi@cs.ucla.edu>
Jeff Thompson7687dc02013-09-13 11:54:07 -07005 * @author: Jeff Thompson <jefft0@remap.ucla.edu>
Jeff Thompson41471912013-09-12 16:21:50 -07006 * See COPYING for copyright and distribution information.
7 */
8
9#ifndef NDN_IDENTITY_MANAGER_HPP
Jeff Thompsonc69163b2013-10-12 13:49:50 -070010#define NDN_IDENTITY_MANAGER_HPP
Jeff Thompson41471912013-09-12 16:21:50 -070011
Jeff Thompsonc69163b2013-10-12 13:49:50 -070012#include "../certificate/identity-certificate.hpp"
Jeff Thompson9296f0c2013-09-23 18:10:27 -070013#include "identity-storage.hpp"
Jeff Thompsone7e069b2013-09-27 15:48:48 -070014#include "../certificate/public-key.hpp"
Jeff Thompson86e1d752013-09-17 17:22:38 -070015#include "private-key-storage.hpp"
Jeff Thompson41471912013-09-12 16:21:50 -070016
Jeff Thompson958bf9b2013-10-12 17:20:51 -070017namespace ndn {
18
Jeff Thompsonffa36f92013-09-20 08:42:41 -070019/**
20 * An IdentityManager is the interface of operations related to identity, keys, and certificates.
21 */
Jeff Thompson41471912013-09-12 16:21:50 -070022class IdentityManager {
23public:
Jeff Thompson9296f0c2013-09-23 18:10:27 -070024 IdentityManager(const ptr_lib::shared_ptr<IdentityStorage>& identityStorage, const ptr_lib::shared_ptr<PrivateKeyStorage>& privateKeyStorage)
25 : identityStorage_(identityStorage), privateKeyStorage_(privateKeyStorage)
Jeff Thompson86e1d752013-09-17 17:22:38 -070026 {
27 }
28
Jeff Thompson9296f0c2013-09-23 18:10:27 -070029 /**
Jeff Thompsone7e069b2013-09-27 15:48:48 -070030 * Create an identity by creating a pair of Key-Signing-Key (KSK) for this identity and a self-signed certificate of the KSK.
31 * @param identityName The name of the identity.
32 * @return The key name of the auto-generated KSK of the identity.
Jeff Thompson9296f0c2013-09-23 18:10:27 -070033 */
34 Name
35 createIdentity(const Name& identityName);
Jeff Thompson9296f0c2013-09-23 18:10:27 -070036
37 /**
38 * Get the default identity.
39 * @return The default identity name.
40 */
41 Name
42 getDefaultIdentity()
43 {
44 return identityStorage_->getDefaultIdentity();
45 }
46
Jeff Thompson9296f0c2013-09-23 18:10:27 -070047 /**
Jeff Thompsone7e069b2013-09-27 15:48:48 -070048 * Generate a pair of RSA keys for the specified identity.
49 * @param identityName The name of the identity.
50 * @param isKsk true for generating a Key-Signing-Key (KSK), false for a Data-Signing-Key (KSK).
51 * @param keySize The size of the key.
52 * @return The generated key name.
Jeff Thompson9296f0c2013-09-23 18:10:27 -070053 */
54 Name
Jeff Thompsone7e069b2013-09-27 15:48:48 -070055 generateRSAKeyPair(const Name& identityName, bool isKsk = false, int keySize = 2048);
Jeff Thompson9296f0c2013-09-23 18:10:27 -070056
57 /**
Jeff Thompsone7e069b2013-09-27 15:48:48 -070058 * Set a key as the default key of an identity.
59 * @param keyName The name of the key.
60 * @param identityName the name of the identity. If not specified, the identity name is inferred from the keyName.
Jeff Thompson9296f0c2013-09-23 18:10:27 -070061 */
62 void
Jeff Thompsone7e069b2013-09-27 15:48:48 -070063 setDefaultKeyForIdentity(const Name& keyName, const Name& identityName = Name())
64 {
65 identityStorage_->setDefaultKeyNameForIdentity(keyName, identityName);
66 }
Jeff Thompson9296f0c2013-09-23 18:10:27 -070067
68 /**
Jeff Thompson18bf6312013-10-04 11:23:55 -070069 * Get the default key for an identity.
70 * @param identityName the name of the identity. If omitted, the identity name is inferred from the keyName.
71 * @return The default key name.
72 */
73 Name
74 getDefaultKeyNameForIdentity(const Name& identityName = Name())
75 {
76 return identityStorage_->getDefaultKeyNameForIdentity(identityName);
77 }
78
79 /**
Jeff Thompsone7e069b2013-09-27 15:48:48 -070080 * Generate a pair of RSA keys for the specified identity and set it as default key for the identity.
81 * @param identityName The name of the identity.
82 * @param isKsk true for generating a Key-Signing-Key (KSK), false for a Data-Signing-Key (KSK).
83 * @param keySize The size of the key.
84 * @return The generated key name.
Jeff Thompson9296f0c2013-09-23 18:10:27 -070085 */
86 Name
Jeff Thompsone7e069b2013-09-27 15:48:48 -070087 generateRSAKeyPairAsDefault(const Name& identityName, bool isKsk = false, int keySize = 2048);
Jeff Thompson9296f0c2013-09-23 18:10:27 -070088
89 /**
Jeff Thompsone7e069b2013-09-27 15:48:48 -070090 * Get the public key with the specified name.
91 * @param keyName The name of the key.
92 * @return The public key.
Jeff Thompson9296f0c2013-09-23 18:10:27 -070093 */
Jeff Thompsone7e069b2013-09-27 15:48:48 -070094 ptr_lib::shared_ptr<PublicKey>
95 getPublicKey(const Name& keyName)
96 {
97 return PublicKey::fromDer(identityStorage_->getKey(keyName));
98 }
Jeff Thompson9296f0c2013-09-23 18:10:27 -070099
100 /**
Jeff Thompsonc69163b2013-10-12 13:49:50 -0700101 * Create an identity certificate for a public key managed by this IdentityManager.
102 * @param keyName The name of public key to be signed.
103 * @param signerCertificateName The name of signing certificate.
104 * @param notBefore The notBefore value in the validity field of the generated certificate.
105 * @param notAfter The notAfter vallue in validity field of the generated certificate.
106 * @return The name of generated identity certificate.
107 */
108 Name
Jeff Thompson9a8e82f2013-10-17 14:13:43 -0700109 createIdentityCertificate(const Name& keyName, const Name& signerCertificateName, const MillisecondsSince1970& notBefore, const MillisecondsSince1970& notAfter);
Jeff Thompsonc69163b2013-10-12 13:49:50 -0700110
111 /**
112 * Create an identity certificate for a public key supplied by the caller.
113 * @param keyName The name of public key to be signed.
114 * @param publickey The public key to be signed.
115 * @param signerCertificateName The name of signing certificate.
116 * @param notBefore The notBefore value in the validity field of the generated certificate.
117 * @param notAfter The notAfter vallue in validity field of the generated certificate.
118 * @return The generated identity certificate.
119 */
120 ptr_lib::shared_ptr<IdentityCertificate>
121 createIdentityCertificate
Jeff Thompson9a8e82f2013-10-17 14:13:43 -0700122 (const Name& keyName, const PublicKey& publickey, const Name& signerCertificateName, const MillisecondsSince1970& notBefore, const MillisecondsSince1970& notAfter);
Jeff Thompsonc69163b2013-10-12 13:49:50 -0700123
124 /**
Jeff Thompsone7e069b2013-09-27 15:48:48 -0700125 * Add a certificate into the public key identity storage.
Jeff Thompsonc69163b2013-10-12 13:49:50 -0700126 * @param certificate The certificate to to added. This makes a copy of the certificate.
Jeff Thompson9296f0c2013-09-23 18:10:27 -0700127 */
128 void
Jeff Thompsonc69163b2013-10-12 13:49:50 -0700129 addCertificate(const IdentityCertificate& certificate)
Jeff Thompsone7e069b2013-09-27 15:48:48 -0700130 {
131 identityStorage_->addCertificate(certificate);
132 }
Jeff Thompson9296f0c2013-09-23 18:10:27 -0700133
134 /**
Jeff Thompsone7e069b2013-09-27 15:48:48 -0700135 * Set the certificate as the default for its corresponding key.
136 * @param certificateName The name of the certificate.
Jeff Thompson9296f0c2013-09-23 18:10:27 -0700137 */
138 void
139 setDefaultCertificateForKey(const Name& certificateName);
140
141 /**
Jeff Thompsone7e069b2013-09-27 15:48:48 -0700142 * Add a certificate into the public key identity storage and set the certificate as the default for its corresponding identity.
Jeff Thompsonc69163b2013-10-12 13:49:50 -0700143 * @param certificate The certificate to be added. This makes a copy of the certificate.
Jeff Thompson9296f0c2013-09-23 18:10:27 -0700144 */
145 void
Jeff Thompsonc69163b2013-10-12 13:49:50 -0700146 addCertificateAsIdentityDefault(const IdentityCertificate& certificate);
Jeff Thompson9296f0c2013-09-23 18:10:27 -0700147
148 /**
Jeff Thompsone7e069b2013-09-27 15:48:48 -0700149 * Add a certificate into the public key identity storage and set the certificate as the default of its corresponding key.
Jeff Thompsonc69163b2013-10-12 13:49:50 -0700150 * @param certificate The certificate to be added. This makes a copy of the certificate.
Jeff Thompson9296f0c2013-09-23 18:10:27 -0700151 */
152 void
Jeff Thompsonc69163b2013-10-12 13:49:50 -0700153 addCertificateAsDefault(const IdentityCertificate& certificate);
Jeff Thompson9296f0c2013-09-23 18:10:27 -0700154
155 /**
Jeff Thompsone7e069b2013-09-27 15:48:48 -0700156 * Get a certificate with the specified name.
157 * @param certificateName The name of the requested certificate.
158 * @return the requested certificate which is valid.
Jeff Thompson9296f0c2013-09-23 18:10:27 -0700159 */
Jeff Thompsonc69163b2013-10-12 13:49:50 -0700160 ptr_lib::shared_ptr<IdentityCertificate>
Jeff Thompsone7e069b2013-09-27 15:48:48 -0700161 getCertificate(const Name& certificateName)
162 {
Jeff Thompsonc69163b2013-10-12 13:49:50 -0700163 return ptr_lib::make_shared<IdentityCertificate>(*identityStorage_->getCertificate(certificateName, false));
Jeff Thompsone7e069b2013-09-27 15:48:48 -0700164 }
Jeff Thompson9296f0c2013-09-23 18:10:27 -0700165
166 /**
Jeff Thompsone7e069b2013-09-27 15:48:48 -0700167 * Get a certificate even if the certificate is not valid anymore.
168 * @param certificateName The name of the requested certificate.
169 * @return the requested certificate.
Jeff Thompson9296f0c2013-09-23 18:10:27 -0700170 */
Jeff Thompsonc69163b2013-10-12 13:49:50 -0700171 ptr_lib::shared_ptr<IdentityCertificate>
Jeff Thompsone7e069b2013-09-27 15:48:48 -0700172 getAnyCertificate(const Name& certificateName)
173 {
Jeff Thompsonc69163b2013-10-12 13:49:50 -0700174 return ptr_lib::make_shared<IdentityCertificate>(*identityStorage_->getCertificate(certificateName, true));
Jeff Thompsone7e069b2013-09-27 15:48:48 -0700175 }
Jeff Thompson9296f0c2013-09-23 18:10:27 -0700176
177 /**
178 * Get the default certificate name for the specified identity, which will be used when signing is performed based on identity.
179 * @param identityName The name of the specified identity.
180 * @return The requested certificate name.
181 */
182 Name
183 getDefaultCertificateNameForIdentity(const Name& identityName)
184 {
185 return identityStorage_->getDefaultCertificateNameForIdentity(identityName);
186 }
187
188 /**
189 * Get the default certificate name of the default identity, which will be used when signing is based on identity and
190 * the identity is not specified.
191 * @return The requested certificate name.
192 */
193 Name
194 getDefaultCertificateName()
195 {
196 return identityStorage_->getDefaultCertificateNameForIdentity(getDefaultIdentity());
197 }
198
Jeff Thompson9296f0c2013-09-23 18:10:27 -0700199 /**
Jeff Thompsonc69163b2013-10-12 13:49:50 -0700200 * Sign the byte array data based on the certificate name.
Jeff Thompsonc01e1782013-10-21 14:08:42 -0700201 * @param buffer The byte array to be signed.
202 * @param bufferLength the length of buffer.
Jeff Thompsonc69163b2013-10-12 13:49:50 -0700203 * @param certificateName The signing certificate name.
204 * @return The generated signature.
Jeff Thompson9296f0c2013-09-23 18:10:27 -0700205 */
Jeff Thompsonc69163b2013-10-12 13:49:50 -0700206 ptr_lib::shared_ptr<Signature>
Jeff Thompsonc01e1782013-10-21 14:08:42 -0700207 signByCertificate(const uint8_t* buffer, size_t bufferLength, const Name& certificateName);
208
209 /**
210 * Sign the byte array data based on the certificate name.
211 * @param buffer The byte array to be signed.
212 * @param certificateName The signing certificate name.
213 * @return The generated signature.
214 */
215 ptr_lib::shared_ptr<Signature>
216 signByCertificate(const std::vector<uint8_t>& buffer, const Name& certificateName)
217 {
218 return signByCertificate(&buffer[0], buffer.size(), certificateName);
219 }
220
Jeff Thompson41471912013-09-12 16:21:50 -0700221 /**
Jeff Thompson86e1d752013-09-17 17:22:38 -0700222 * Sign data packet based on the certificate name.
Jeff Thompson41471912013-09-12 16:21:50 -0700223 * Note: the caller must make sure the timestamp in data is correct, for example with
224 * data.getMetaInfo().setTimestampMilliseconds(time(NULL) * 1000.0).
225 * @param data The Data object to sign and update its signature.
226 * @param certificateName The Name identifying the certificate which identifies the signing key.
227 * @param wireFormat The WireFormat for calling encodeData, or WireFormat::getDefaultWireFormat() if omitted.
228 */
Jeff Thompson0050abe2013-09-17 12:50:25 -0700229 void
Jeff Thompson86e1d752013-09-17 17:22:38 -0700230 signByCertificate(Data& data, const Name& certificateName, WireFormat& wireFormat = *WireFormat::getDefaultWireFormat());
231
232private:
Jeff Thompsone7e069b2013-09-27 15:48:48 -0700233 /**
234 * Generate a key pair for the specified identity.
235 * @param identityName The name of the specified identity.
236 * @param isKsk true for generating a Key-Signing-Key (KSK), false for a Data-Signing-Key (KSK).
237 * @param keyType The type of the key pair, e.g. KEY_TYPE_RSA.
238 * @param keySize The size of the key pair.
239 * @return The name of the generated key.
240 */
241 Name
242 generateKeyPair(const Name& identityName, bool isKsk = false, KeyType keyType = KEY_TYPE_RSA, int keySize = 2048);
243
244 /**
245 * Generate a self-signed certificate for a public key.
246 * @param keyName The name of the public key.
247 * @return The generated certificate.
248 */
Jeff Thompsonc69163b2013-10-12 13:49:50 -0700249 ptr_lib::shared_ptr<IdentityCertificate>
Jeff Thompsone7e069b2013-09-27 15:48:48 -0700250 selfSign(const Name& keyName);
251
Jeff Thompson9296f0c2013-09-23 18:10:27 -0700252 ptr_lib::shared_ptr<IdentityStorage> identityStorage_;
Jeff Thompson86e1d752013-09-17 17:22:38 -0700253 ptr_lib::shared_ptr<PrivateKeyStorage> privateKeyStorage_;
Jeff Thompson41471912013-09-12 16:21:50 -0700254};
255
256}
257
258#endif