esp8266ndn
NDN Arduino library for ESP8266 and more
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
certificate.hpp
Go to the documentation of this file.
1#ifndef NDNPH_KEYCHAIN_CERTIFICATE_HPP
2#define NDNPH_KEYCHAIN_CERTIFICATE_HPP
3
4#include "../packet/data.hpp"
5#include "helper.hpp"
6#include "validity-period.hpp"
7
8namespace ndnph {
9namespace certificate {
10
12inline Component
14 static const uint8_t tlv[]{0x08, 0x03, 'K', 'E', 'Y'};
15 static const Component comp = Component::constant(tlv, sizeof(tlv));
16 return comp;
17}
18
20inline Component
22 static const uint8_t tlv[]{0x08, 0x05, 'N', 'D', 'N', 'p', 'h'};
23 static const Component comp = Component::constant(tlv, sizeof(tlv));
24 return comp;
25}
26
28inline Component
30 static const uint8_t tlv[]{0x08, 0x04, 's', 'e', 'l', 'f'};
31 static const Component comp = Component::constant(tlv, sizeof(tlv));
32 return comp;
33}
34
36inline bool
37isKeyName(const Name& name) {
38 return name[-2] == getKeyComponent();
39}
40
42inline bool
43isCertName(const Name& name) {
44 return name[-4] == getKeyComponent();
45}
46
55inline Name
56toSubjectName(Region& region, const Name& input, bool mustCopy = false) {
57 Name result;
58 if (isKeyName(input)) {
59 result = input.getPrefix(-2);
60 } else if (isCertName(input)) {
61 result = input.getPrefix(-4);
62 } else {
63 result = input;
64 }
65
66 if (mustCopy) {
67 return result.clone(region);
68 }
69 return result;
70}
71
81inline Name
82toKeyName(Region& region, const Name& input, bool mustCopy = false) {
83 Name result;
84 if (isKeyName(input)) {
85 result = input;
86 } else if (isCertName(input)) {
87 result = input.getPrefix(-2);
88 } else {
89 return input.append(region, getKeyComponent(), convention::GenericNumber(),
91 }
92
93 if (mustCopy) {
94 return result.clone(region);
95 }
96 return result;
97}
98
110inline Name
111toCertName(Region& region, const Name& input, bool mustCopy = false) {
112 if (isCertName(input)) {
113 if (mustCopy) {
114 return input.clone(region);
115 }
116 return input;
117 }
118
119 if (isKeyName(input)) {
120 return input.append(region, getIssuerDefault(), convention::Version(), convention::TimeValue());
121 }
122
123 return input.append(region, getKeyComponent(), convention::GenericNumber(),
126}
127
135inline Name
136makeKeyName(Region& region, const Name& input, const Component& keyId) {
137 return toSubjectName(region, input).append(region, getKeyComponent(), keyId);
138}
139
148inline Name
149makeCertName(Region& region, const Name& input, const Component& issuerId,
150 const Component& version) {
151 return toKeyName(region, input).append(region, issuerId, version);
152}
153
162inline Name
163makeCertName(Region& region, const Name& input, const Component& issuerId, uint64_t version = 0) {
164 return toKeyName(region, input)
165 .append(region, issuerId, convention::Version(), convention::TimeValue(version));
166}
167
169inline bool
170isCertificate(const Data& data) {
171 return data && data.getContentType() == ContentType::Key && isCertName(data.getName());
172}
173
174inline Name
175getIssuer(const Data& data) {
176 const DSigInfo* sigInfo = data.getSigInfo();
177 if (sigInfo != nullptr) {
178 return sigInfo->name;
179 }
180 return Name();
181}
182
183inline ValidityPeriod
184getValidity(const Data& data) {
186
187 const DSigInfo* sigInfo = data.getSigInfo();
188 if (sigInfo == nullptr) {
189 return vp;
190 }
191
192 auto decoder = sigInfo->extensions.makeDecoder();
193 for (const auto& tlv : decoder) {
194 if (vp.decodeFrom(tlv)) {
195 return vp;
196 }
197 }
198
199 return ValidityPeriod();
200}
201
202} // namespace certificate
203namespace detail {
204
205template<typename Signer, typename Modify>
207buildCertificate(Region& region, const Name& name, const ValidityPeriod& validity,
208 const Signer& signer, const Modify& modify) {
209 auto data = region.create<Data>();
210 if (!data) {
211 return Data::Signed();
212 }
213 data.setName(certificate::toCertName(region, name));
214 data.setContentType(ContentType::Key);
215 data.setFreshnessPeriod(3600000);
216
217 DSigInfo si;
218 {
219 Encoder encoder(region);
220 encoder.prepend(validity);
221 si.extensions = tlv::Value(encoder);
222 encoder.trim();
223 }
224
225 if (!modify(data)) {
226 return Data::Signed();
227 }
228 return data.sign(signer, std::move(si));
229}
230
231} // namespace detail
232} // namespace ndnph
233
234#endif // NDNPH_KEYCHAIN_CERTIFICATE_HPP
Name component.
Definition component.hpp:16
static Component constant(const uint8_t *tlv, size_t size)
Construct from const TLV buffer.
Definition component.hpp:64
SignatureInfo on Data.
Definition sig-info.hpp:59
Data packet.
Definition data.hpp:136
const DSigInfo * getSigInfo() const
Retrieve SignatureInfo.
Definition data.hpp:184
detail::SignedDataRef Signed
Result of Data::sign operation.
Definition data.hpp:246
const Name & getName() const
Definition data.hpp:140
uint8_t getContentType() const
Definition data.hpp:148
TLV encoder that accepts items in reverse order.
Definition encoder.hpp:10
bool prepend(const First &first, const Arg &... arg)
Prepend a sequence of values.
Definition encoder.hpp:123
void trim() const
Release unused space to the Region.
Definition encoder.hpp:58
Name.
Definition name.hpp:14
Name append(Region &region, const C &... comps) const
Append a sequence of components.
Definition name.hpp:183
Name clone(Region &region) const
Clone TLV-VALUE into given region.
Definition name.hpp:203
Region-based memory allocator thats owns memory of NDNph objects.
Definition region.hpp:9
RefType create(Arg &&... arg)
Allocate and create an object, and return its reference.
Definition region.hpp:90
Name name
Definition sig-info.hpp:45
tlv::Value extensions
Definition sig-info.hpp:46
ValidityPeriod of a certificate.
Definition validity-period.hpp:37
bool decodeFrom(const Decoder::Tlv &input)
Definition validity-period.hpp:81
Indicate that TLV-VALUE should be a random number.
Definition convention.hpp:13
Indicate that TLV-VALUE should be a timestamp.
Definition convention.hpp:27
Definition convention.hpp:111
A sequence of bytes, usually TLV-VALUE.
Definition value.hpp:11
Decoder makeDecoder() const
Create a Decoder over this value buffer.
Definition value.hpp:64
@ Key
Definition an.hpp:68
ValidityPeriod getValidity(const Data &data)
Definition certificate.hpp:184
bool isCertificate(const Data &data)
Determine if the Data packet is a certificate.
Definition certificate.hpp:170
bool isKeyName(const Name &name)
Determine if the input is a key name.
Definition certificate.hpp:37
Component getIssuerSelf()
Return 'self' component as self-signed issuerId.
Definition certificate.hpp:29
Component getKeyComponent()
Return 'KEY' component.
Definition certificate.hpp:13
Name toKeyName(Region &region, const Name &input, bool mustCopy=false)
Convert to key name.
Definition certificate.hpp:82
Name makeKeyName(Region &region, const Name &input, const Component &keyId)
Construct key name with specified keyId.
Definition certificate.hpp:136
Name toCertName(Region &region, const Name &input, bool mustCopy=false)
Convert to certificate name.
Definition certificate.hpp:111
Name toSubjectName(Region &region, const Name &input, bool mustCopy=false)
Convert to subject name.
Definition certificate.hpp:56
Component getIssuerDefault()
Return 'NDNph' component as default issuerId.
Definition certificate.hpp:21
Name getIssuer(const Data &data)
Definition certificate.hpp:175
bool isCertName(const Name &name)
Determine if the input is a certificate name.
Definition certificate.hpp:43
Name makeCertName(Region &region, const Name &input, const Component &issuerId, const Component &version)
Construct certificate name with specified issuerId and version.
Definition certificate.hpp:149
Data::Signed buildCertificate(Region &region, const Name &name, const ValidityPeriod &validity, const Signer &signer, const Modify &modify)
Definition certificate.hpp:207
Definition fs.hpp:33