blob: 48c8aa3d7b804c31c89b6a4eef3231774929fe31 [file] [log] [blame]
Yingdi Yub8f8b342015-04-27 11:06:42 -07001/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
2/**
3 * Copyright (c) 2013-2015 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
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,
37 const PublicKey& publicKey, shared_ptr<PibImpl> impl)
38 : 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
94const PublicKey&
95Key::getPublicKey() const
96{
97 validityCheck();
98
99 return m_key;
100}
101
102void
103Key::addCertificate(const IdentityCertificate& certificate)
104{
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
129IdentityCertificate
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) {
143 m_certificates = std::move(CertificateContainer(m_impl->getCertificatesOfKey(m_id, m_keyId),
144 m_impl));
145 m_needRefreshCerts = false;
146 }
147
148 return m_certificates;
149}
150
151const IdentityCertificate&
152Key::setDefaultCertificate(const Name& certName)
153{
154 validityCheck();
155
156 m_defaultCertificate = m_impl->getCertificate(certName);
157 m_impl->setDefaultCertificateOfKey(m_id, m_keyId, certName);
158 m_hasDefaultCertificate = true;
159 return m_defaultCertificate;
160}
161
162const IdentityCertificate&
163Key::setDefaultCertificate(const IdentityCertificate& certificate)
164{
165 addCertificate(certificate);
166 return setDefaultCertificate(certificate.getName());
167}
168
169const IdentityCertificate&
Yingdi Yuc8209892015-06-19 17:47:56 -0700170Key::getDefaultCertificate() const
Yingdi Yub8f8b342015-04-27 11:06:42 -0700171{
172 validityCheck();
173
174 if (!m_hasDefaultCertificate) {
175 m_defaultCertificate = m_impl->getDefaultCertificateOfKey(m_id, m_keyId);
176 m_hasDefaultCertificate = true;
177 }
178
179 return m_defaultCertificate;
180}
181
182Key::operator bool() const
183{
184 return !(this->operator!());
185}
186
187bool
188Key::operator!() const
189{
190 return (m_impl == nullptr);
191}
192
193void
194Key::validityCheck() const
195{
196 if (m_impl == nullptr)
Spyridon Mastorakis0d2ed2e2015-07-27 19:09:12 -0700197 BOOST_THROW_EXCEPTION(std::domain_error("Invalid Key instance"));
Yingdi Yub8f8b342015-04-27 11:06:42 -0700198}
199
200} // namespace security
201} // namespace ndn