blob: c59a39dfb5c1ad2b0572d7bbdbcb16dbe5c4e860 [file] [log] [blame]
Yingdi Yub8f8b342015-04-27 11:06:42 -07001/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
2/**
Alexander Afanasyev2fa59392016-07-29 17:24:23 -07003 * Copyright (c) 2013-2016 Regents of the University of California.
Yingdi Yub8f8b342015-04-27 11:06:42 -07004 *
5 * This file is part of ndn-cxx library (NDN C++ library with eXperimental eXtensions).
6 *
7 * ndn-cxx library is free software: you can redistribute it and/or modify it under the
8 * terms of the GNU Lesser General Public License as published by the Free Software
9 * Foundation, either version 3 of the License, or (at your option) any later version.
10 *
11 * ndn-cxx library is distributed in the hope that it will be useful, but WITHOUT ANY
12 * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
13 * PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details.
14 *
15 * You should have received copies of the GNU General Public License and GNU Lesser
16 * General Public License along with ndn-cxx, e.g., in COPYING.md file. If not, see
17 * <http://www.gnu.org/licenses/>.
18 *
19 * See AUTHORS.md for complete list of ndn-cxx authors and contributors.
20 */
21
22#include "key.hpp"
23#include "pib-impl.hpp"
24#include "pib.hpp"
25
26namespace ndn {
27namespace security {
28
29Key::Key()
30 : m_hasDefaultCertificate(false)
31 , m_needRefreshCerts(false)
32 , m_impl(nullptr)
33{
34}
35
36Key::Key(const Name& identityName, const name::Component& keyId,
Alexander Afanasyev2fa59392016-07-29 17:24:23 -070037 const v1::PublicKey& publicKey, shared_ptr<PibImpl> impl)
Yingdi Yub8f8b342015-04-27 11:06:42 -070038 : m_id(identityName)
39 , m_keyId(keyId)
40 , m_key(publicKey)
41 , m_hasDefaultCertificate(false)
42 , m_needRefreshCerts(true)
43 , m_impl(impl)
44{
45 validityCheck();
46
47 m_keyName = m_id;
48 m_keyName.append(m_keyId);
49
50 m_impl->addIdentity(m_id);
51 m_impl->addKey(m_id, m_keyId, publicKey);
52}
53
54Key::Key(const Name& identityName, const name::Component& keyId,
55 shared_ptr<PibImpl> impl)
56 : m_id(identityName)
57 , m_keyId(keyId)
58 , m_hasDefaultCertificate(false)
59 , m_needRefreshCerts(true)
60 , m_impl(impl)
61{
62 validityCheck();
63
64 m_keyName = m_id;
65 m_keyName.append(m_keyId);
66
67 m_key = m_impl->getKeyBits(m_id, m_keyId);
68}
69
70const Name&
71Key::getName() const
72{
73 validityCheck();
74
75 return m_keyName;
76}
77
78const Name&
79Key::getIdentity() const
80{
81 validityCheck();
82
83 return m_id;
84}
85
86const name::Component&
87Key::getKeyId() const
88{
89 validityCheck();
90
91 return m_keyId;
92}
93
Alexander Afanasyev2fa59392016-07-29 17:24:23 -070094const v1::PublicKey&
Yingdi Yub8f8b342015-04-27 11:06:42 -070095Key::getPublicKey() const
96{
97 validityCheck();
98
99 return m_key;
100}
101
102void
Alexander Afanasyev2fa59392016-07-29 17:24:23 -0700103Key::addCertificate(const v1::IdentityCertificate& certificate)
Yingdi Yub8f8b342015-04-27 11:06:42 -0700104{
105 validityCheck();
106
107 if (!m_needRefreshCerts &&
108 m_certificates.find(certificate.getName()) == m_certificates.end()) {
109 // if we have already loaded all the certificate, but the new certificate is not one of them
110 // the CertificateContainer should be refreshed
111 m_needRefreshCerts = true;
112 }
113
114 m_impl->addCertificate(certificate);
115}
116
117void
118Key::removeCertificate(const Name& certName)
119{
120 validityCheck();
121
122 if (m_hasDefaultCertificate && m_defaultCertificate.getName() == certName)
123 m_hasDefaultCertificate = false;
124
125 m_impl->removeCertificate(certName);
126 m_needRefreshCerts = true;
127}
128
Alexander Afanasyev2fa59392016-07-29 17:24:23 -0700129v1::IdentityCertificate
Yingdi Yuc8209892015-06-19 17:47:56 -0700130Key::getCertificate(const Name& certName) const
Yingdi Yub8f8b342015-04-27 11:06:42 -0700131{
132 validityCheck();
133
134 return m_impl->getCertificate(certName);
135}
136
Yingdi Yuc8209892015-06-19 17:47:56 -0700137const CertificateContainer&
138Key::getCertificates() const
Yingdi Yub8f8b342015-04-27 11:06:42 -0700139{
140 validityCheck();
141
142 if (m_needRefreshCerts) {
Alexander Afanasyev66ca2032015-12-04 13:17:02 -0800143 m_certificates = CertificateContainer(m_impl->getCertificatesOfKey(m_id, m_keyId), m_impl);
Yingdi Yub8f8b342015-04-27 11:06:42 -0700144 m_needRefreshCerts = false;
145 }
146
147 return m_certificates;
148}
149
Alexander Afanasyev2fa59392016-07-29 17:24:23 -0700150const v1::IdentityCertificate&
Yingdi Yub8f8b342015-04-27 11:06:42 -0700151Key::setDefaultCertificate(const Name& certName)
152{
153 validityCheck();
154
155 m_defaultCertificate = m_impl->getCertificate(certName);
156 m_impl->setDefaultCertificateOfKey(m_id, m_keyId, certName);
157 m_hasDefaultCertificate = true;
158 return m_defaultCertificate;
159}
160
Alexander Afanasyev2fa59392016-07-29 17:24:23 -0700161const v1::IdentityCertificate&
162Key::setDefaultCertificate(const v1::IdentityCertificate& certificate)
Yingdi Yub8f8b342015-04-27 11:06:42 -0700163{
164 addCertificate(certificate);
165 return setDefaultCertificate(certificate.getName());
166}
167
Alexander Afanasyev2fa59392016-07-29 17:24:23 -0700168const v1::IdentityCertificate&
Yingdi Yuc8209892015-06-19 17:47:56 -0700169Key::getDefaultCertificate() const
Yingdi Yub8f8b342015-04-27 11:06:42 -0700170{
171 validityCheck();
172
173 if (!m_hasDefaultCertificate) {
174 m_defaultCertificate = m_impl->getDefaultCertificateOfKey(m_id, m_keyId);
175 m_hasDefaultCertificate = true;
176 }
177
178 return m_defaultCertificate;
179}
180
181Key::operator bool() const
182{
183 return !(this->operator!());
184}
185
186bool
187Key::operator!() const
188{
189 return (m_impl == nullptr);
190}
191
192void
193Key::validityCheck() const
194{
195 if (m_impl == nullptr)
Spyridon Mastorakis0d2ed2e2015-07-27 19:09:12 -0700196 BOOST_THROW_EXCEPTION(std::domain_error("Invalid Key instance"));
Yingdi Yub8f8b342015-04-27 11:06:42 -0700197}
198
199} // namespace security
200} // namespace ndn