ndn-embeds 0.1.0
Lightweight NDN protocol stack for embedded systems
Loading...
Searching...
No Matches
interest.cpp
1#include "ndn/interest.hpp"
2
3#include "ndn/crypto.hpp"
4#include "ndn/tlv.hpp"
5
6#include <algorithm>
7#include <cstring>
8
9namespace ndn {
10
11Interest::Interest(const Name& name) : name_(name) {}
12
14 name_ = name;
15 return *this;
16}
17
18Error Interest::setName(std::string_view uri) {
19 auto result = Name::fromUri(uri);
20 if (!result.ok()) {
21 return result.error;
22 }
23 name_ = result.value;
24 return Error::Success;
25}
26
27Interest& Interest::setNonce(uint32_t nonce) {
28 nonce_ = nonce;
29 return *this;
30}
31
33 nonce_ = generateRandomNonce();
34 return *this;
35}
36
37Interest& Interest::setLifetime(uint32_t lifetimeMs) {
38 lifetime_ = lifetimeMs;
39 return *this;
40}
41
43 hopLimit_ = limit;
44 return *this;
45}
46
48 if (hopLimit_ && *hopLimit_ > 0) {
49 hopLimit_ = *hopLimit_ - 1;
50 }
51 return *this;
52}
53
55 canBePrefix_ = canBePrefix;
56 return *this;
57}
58
60 mustBeFresh_ = mustBeFresh;
61 return *this;
62}
63
65 if (fwHintCount_ >= FW_HINT_MAX_COUNT) {
66 return Error::Full;
67 }
68 fwHints_[fwHintCount_++] = name;
69 return Error::Success;
70}
71
72Error Interest::addForwardingHint(std::string_view uri) {
73 auto result = Name::fromUri(uri);
74 if (!result.ok()) {
75 return result.error;
76 }
77 return addForwardingHint(result.value);
78}
79
80const Name* Interest::forwardingHint(size_t index) const {
81 if (index >= fwHintCount_) {
82 return nullptr;
83 }
84 return &fwHints_[index];
85}
86
88 fwHintCount_ = 0;
89}
90
91Interest& Interest::setApplicationParameters(const uint8_t* params, size_t len) {
92 len = std::min(len, static_cast<size_t>(APP_PARAMS_MAX_SIZE));
93 std::memcpy(appParams_, params, len);
94 appParamsLen_ = len;
95 return *this;
96}
97
99 signatureSeqNum_ = seqNum;
100 return *this;
101}
102
104 keyLocator_ = name;
105 hasKeyLocator_ = true;
106 return *this;
107}
108
110 keyLocator_ = Name{};
111 hasKeyLocator_ = false;
112 return *this;
113}
114
115void Interest::generateSignatureNonce() {
116 // Generate 8-byte random nonce
117 const uint32_t rand1 = generateRandomNonce();
118 const uint32_t rand2 = generateRandomNonce();
119 signatureNonce_[0] = static_cast<uint8_t>(rand1 >> 24);
120 signatureNonce_[1] = static_cast<uint8_t>(rand1 >> 16);
121 signatureNonce_[2] = static_cast<uint8_t>(rand1 >> 8);
122 signatureNonce_[3] = static_cast<uint8_t>(rand1);
123 signatureNonce_[4] = static_cast<uint8_t>(rand2 >> 24);
124 signatureNonce_[5] = static_cast<uint8_t>(rand2 >> 16);
125 signatureNonce_[6] = static_cast<uint8_t>(rand2 >> 8);
126 signatureNonce_[7] = static_cast<uint8_t>(rand2);
127 hasSignatureNonce_ = true;
128}
129
130Error Interest::encodeInterestSignatureInfo(TlvEncoder& encoder) const {
131 uint8_t sigInfoBuf[256];
132 TlvEncoder sigInfoEncoder(sigInfoBuf, sizeof(sigInfoBuf));
133
134 // SignatureType
135 sigInfoEncoder.writeTlvNonNegativeInteger(tlv::SignatureType,
136 static_cast<uint8_t>(signatureType_));
137
138 // KeyLocator (optional)
139 if (hasKeyLocator_) {
140 uint8_t keyLocBuf[NAME_MAX_LENGTH + 4];
141 TlvEncoder keyLocEncoder(keyLocBuf, sizeof(keyLocBuf));
142 size_t nameLen = 0;
143 Error err = keyLocator_.encode(keyLocEncoder.current(), keyLocEncoder.remaining(), nameLen);
144 if (err != Error::Success) {
145 return err;
146 }
147 keyLocEncoder.setPosition(keyLocEncoder.position() + nameLen);
148 sigInfoEncoder.writeTlv(tlv::KeyLocator, keyLocBuf, keyLocEncoder.size());
149 }
150
151 // SignatureNonce (replay attack protection)
152 if (hasSignatureNonce_) {
153 sigInfoEncoder.writeTlv(tlv::SignatureNonce, signatureNonce_, SIGNATURE_NONCE_SIZE);
154 }
155
156 // SignatureTime (optional)
157 if (signatureTime_) {
158 sigInfoEncoder.writeTlvNonNegativeInteger(tlv::SignatureTime, *signatureTime_);
159 }
160
161 // SignatureSeqNum (optional)
162 if (signatureSeqNum_) {
163 sigInfoEncoder.writeTlvNonNegativeInteger(tlv::SignatureSeqNum, *signatureSeqNum_);
164 }
165
166 return encoder.writeTlv(tlv::InterestSignatureInfo, sigInfoBuf, sigInfoEncoder.size());
167}
168
169Error Interest::encodeSignedPortion(uint8_t* buf, size_t bufSize, size_t& encodedLen) const {
170 TlvEncoder encoder(buf, bufSize);
171
172 // Name
173 size_t nameLen = 0;
174 Error err = name_.encode(encoder.current(), encoder.remaining(), nameLen);
175 if (err != Error::Success) {
176 return err;
177 }
178 encoder.setPosition(encoder.position() + nameLen);
179
180 // ApplicationParameters (required for signed Interest, may be empty)
181 err = encoder.writeTlv(tlv::ApplicationParameters, appParams_, appParamsLen_);
182 if (err != Error::Success) {
183 return err;
184 }
185
186 // InterestSignatureInfo
187 err = encodeInterestSignatureInfo(encoder);
188 if (err != Error::Success) {
189 return err;
190 }
191
192 encodedLen = encoder.size();
193 return Error::Success;
194}
195
197 signatureType_ = SignatureType::DigestSha256;
198 generateSignatureNonce();
199 signatureTime_ = currentTimeMs();
200
201 // Encode the signed portion
202 uint8_t signedBuf[PACKET_MAX_SIZE];
203 size_t signedLen = 0;
204 Error err = encodeSignedPortion(signedBuf, sizeof(signedBuf), signedLen);
205 if (err != Error::Success) {
206 return err;
207 }
208
209 // Compute SHA-256 digest
210 err = crypto::sha256(signedBuf, signedLen, signatureValue_.data());
211 if (err != Error::Success) {
212 return err;
213 }
214
215 signatureSize_ = SHA256_DIGEST_SIZE;
216 return Error::Success;
217}
218
219Error Interest::signWithHmac(const uint8_t* key, size_t keyLen) {
220 if (key == nullptr || keyLen == 0) {
221 return Error::InvalidParam;
222 }
223
224 signatureType_ = SignatureType::SignatureHmacWithSha256;
225 generateSignatureNonce();
226 signatureTime_ = currentTimeMs();
227
228 // Encode the signed portion
229 uint8_t signedBuf[PACKET_MAX_SIZE];
230 size_t signedLen = 0;
231 Error err = encodeSignedPortion(signedBuf, sizeof(signedBuf), signedLen);
232 if (err != Error::Success) {
233 return err;
234 }
235
236 // Compute HMAC-SHA256
237 err = crypto::hmacSha256(key, keyLen, signedBuf, signedLen, signatureValue_.data());
238 if (err != Error::Success) {
239 return err;
240 }
241
242 signatureSize_ = HMAC_SHA256_SIZE;
243 return Error::Success;
244}
245
247 if (signatureType_ != SignatureType::DigestSha256) {
248 return false;
249 }
250 if (signatureSize_ != SHA256_DIGEST_SIZE) {
251 return false;
252 }
253
254 // Encode the signed portion
255 uint8_t signedBuf[PACKET_MAX_SIZE];
256 size_t signedLen = 0;
257 Error err = encodeSignedPortion(signedBuf, sizeof(signedBuf), signedLen);
258 if (err != Error::Success) {
259 return false;
260 }
261
262 // Compute SHA-256 digest
263 uint8_t computed[SHA256_DIGEST_SIZE];
264 err = crypto::sha256(signedBuf, signedLen, computed);
265 if (err != Error::Success) {
266 return false;
267 }
268
269 // Constant-time comparison
270 return crypto::constantTimeCompare(computed, signatureValue_.data(), SHA256_DIGEST_SIZE);
271}
272
273bool Interest::verifyHmac(const uint8_t* key, size_t keyLen) const {
274 if (key == nullptr || keyLen == 0) {
275 return false;
276 }
277 if (signatureType_ != SignatureType::SignatureHmacWithSha256) {
278 return false;
279 }
280 if (signatureSize_ != HMAC_SHA256_SIZE) {
281 return false;
282 }
283
284 // Encode the signed portion
285 uint8_t signedBuf[PACKET_MAX_SIZE];
286 size_t signedLen = 0;
287 Error err = encodeSignedPortion(signedBuf, sizeof(signedBuf), signedLen);
288 if (err != Error::Success) {
289 return false;
290 }
291
292 // Compute HMAC-SHA256
293 uint8_t computed[HMAC_SHA256_SIZE];
294 err = crypto::hmacSha256(key, keyLen, signedBuf, signedLen, computed);
295 if (err != Error::Success) {
296 return false;
297 }
298
299 // Constant-time comparison
300 return crypto::constantTimeCompare(computed, signatureValue_.data(), HMAC_SHA256_SIZE);
301}
302
303Error Interest::signWithEcdsa(const uint8_t* privKey) {
304 if (privKey == nullptr) {
305 return Error::InvalidParam;
306 }
307
308 signatureType_ = SignatureType::SignatureSha256WithEcdsa;
309 generateSignatureNonce();
310 signatureTime_ = currentTimeMs();
311
312 // Encode the signed portion
313 uint8_t signedBuf[PACKET_MAX_SIZE];
314 size_t signedLen = 0;
315 Error err = encodeSignedPortion(signedBuf, sizeof(signedBuf), signedLen);
316 if (err != Error::Success) {
317 return err;
318 }
319
320 // Generate ECDSA signature
321 err = crypto::ecdsaP256Sign(privKey, signedBuf, signedLen, signatureValue_.data(),
322 &signatureSize_);
323 return err;
324}
325
326bool Interest::verifyEcdsa(const uint8_t* pubKey) const {
327 if (pubKey == nullptr) {
328 return false;
329 }
330 if (signatureType_ != SignatureType::SignatureSha256WithEcdsa) {
331 return false;
332 }
333 if (signatureSize_ == 0 || signatureSize_ > ECDSA_P256_SIG_MAX_SIZE) {
334 return false;
335 }
336
337 // Encode the signed portion
338 uint8_t signedBuf[PACKET_MAX_SIZE];
339 size_t signedLen = 0;
340 Error err = encodeSignedPortion(signedBuf, sizeof(signedBuf), signedLen);
341 if (err != Error::Success) {
342 return false;
343 }
344
345 // Verify ECDSA signature
346 return crypto::ecdsaP256Verify(pubKey, signedBuf, signedLen, signatureValue_.data(),
347 signatureSize_);
348}
349
350Error Interest::encode(uint8_t* buf, size_t bufSize, size_t& encodedLen) const {
351 // Encode Interest contents into a temporary buffer
352 uint8_t valueBuf[PACKET_MAX_SIZE];
353 TlvEncoder valueEncoder(valueBuf, sizeof(valueBuf));
354
355 // Name (required)
356 size_t nameLen = 0;
357 Error err = name_.encode(valueEncoder.current(), valueEncoder.remaining(), nameLen);
358 if (err != Error::Success) {
359 return err;
360 }
361 valueEncoder.setPosition(valueEncoder.position() + nameLen);
362
363 // CanBePrefix (empty TLV)
364 if (canBePrefix_) {
365 err = valueEncoder.writeType(tlv::CanBePrefix);
366 if (err != Error::Success) {
367 return err;
368 }
369 err = valueEncoder.writeLength(0);
370 if (err != Error::Success) {
371 return err;
372 }
373 }
374
375 // MustBeFresh (empty TLV)
376 if (mustBeFresh_) {
377 err = valueEncoder.writeType(tlv::MustBeFresh);
378 if (err != Error::Success) {
379 return err;
380 }
381 err = valueEncoder.writeLength(0);
382 if (err != Error::Success) {
383 return err;
384 }
385 }
386
387 // ForwardingHint (list of Names)
388 if (fwHintCount_ > 0) {
389 // Encode list of Names within ForwardingHint
390 uint8_t fwHintBuf[512];
391 TlvEncoder fwHintEncoder(fwHintBuf, sizeof(fwHintBuf));
392
393 for (size_t i = 0; i < fwHintCount_; ++i) {
394 size_t hintNameLen = 0;
395 err =
396 fwHints_[i].encode(fwHintEncoder.current(), fwHintEncoder.remaining(), hintNameLen);
397 if (err != Error::Success) {
398 return err;
399 }
400 fwHintEncoder.setPosition(fwHintEncoder.position() + hintNameLen);
401 }
402
403 err = valueEncoder.writeTlv(tlv::ForwardingHint, fwHintBuf, fwHintEncoder.size());
404 if (err != Error::Success) {
405 return err;
406 }
407 }
408
409 // Nonce (fixed 4 bytes)
410 if (nonce_) {
411 err = valueEncoder.writeType(tlv::Nonce);
412 if (err != Error::Success) {
413 return err;
414 }
415 err = valueEncoder.writeLength(4);
416 if (err != Error::Success) {
417 return err;
418 }
419 // Write in big-endian
420 uint8_t nonceBytes[4] = {static_cast<uint8_t>(*nonce_ >> 24),
421 static_cast<uint8_t>(*nonce_ >> 16),
422 static_cast<uint8_t>(*nonce_ >> 8), static_cast<uint8_t>(*nonce_)};
423 err = valueEncoder.writeBytes(nonceBytes, 4);
424 if (err != Error::Success) {
425 return err;
426 }
427 }
428
429 // InterestLifetime (only if non-default)
430 if (lifetime_ != INTEREST_DEFAULT_LIFETIME_MS) {
431 err = valueEncoder.writeTlvNonNegativeInteger(tlv::InterestLifetime, lifetime_);
432 if (err != Error::Success) {
433 return err;
434 }
435 }
436
437 // HopLimit
438 if (hopLimit_) {
439 err = valueEncoder.writeType(tlv::HopLimit);
440 if (err != Error::Success) {
441 return err;
442 }
443 err = valueEncoder.writeLength(1);
444 if (err != Error::Success) {
445 return err;
446 }
447 const uint8_t hopLimitValue = *hopLimit_;
448 err = valueEncoder.writeBytes(&hopLimitValue, 1);
449 if (err != Error::Success) {
450 return err;
451 }
452 }
453
454 // ApplicationParameters (required when signed)
455 if (appParamsLen_ > 0 || signatureSize_ > 0) {
456 err = valueEncoder.writeTlv(tlv::ApplicationParameters, appParams_, appParamsLen_);
457 if (err != Error::Success) {
458 return err;
459 }
460 }
461
462 // If signed, append InterestSignatureInfo and InterestSignatureValue
463 if (signatureSize_ > 0) {
464 // InterestSignatureInfo
465 err = encodeInterestSignatureInfo(valueEncoder);
466 if (err != Error::Success) {
467 return err;
468 }
469
470 // InterestSignatureValue
471 err = valueEncoder.writeTlv(tlv::InterestSignatureValue, signatureValue_.data(),
472 signatureSize_);
473 if (err != Error::Success) {
474 return err;
475 }
476 }
477
478 // Write Interest TLV header
479 const size_t valueLen = valueEncoder.size();
480 const size_t headerSize = varNumberSize(tlv::Interest) + varNumberSize(valueLen);
481 const size_t totalSize = headerSize + valueLen;
482
483 if (bufSize < totalSize) {
484 return Error::BufferTooSmall;
485 }
486
487 TlvEncoder encoder(buf, bufSize);
488 err = encoder.writeType(tlv::Interest);
489 if (err != Error::Success) {
490 return err;
491 }
492
493 err = encoder.writeLength(valueLen);
494 if (err != Error::Success) {
495 return err;
496 }
497
498 err = encoder.writeBytes(valueBuf, valueLen);
499 if (err != Error::Success) {
500 return err;
501 }
502
503 encodedLen = encoder.size();
504 return Error::Success;
505}
506
507Error Interest::parseSignatureInfo(TlvDecoder& decoder, size_t elemLen, Interest& interest) {
508 const size_t sigInfoEnd = decoder.position() + elemLen;
509 while (decoder.position() < sigInfoEnd) {
510 auto sigInfoElemHeader = decoder.readTlvHeader();
511 if (!sigInfoElemHeader.ok()) {
512 return sigInfoElemHeader.error;
513 }
514
515 switch (sigInfoElemHeader.value.type) {
516 case tlv::SignatureType: {
517 auto stResult = decoder.readNonNegativeInteger(sigInfoElemHeader.value.length);
518 if (!stResult.ok()) {
519 return stResult.error;
520 }
521 interest.signatureType_ = static_cast<SignatureType>(stResult.value);
522 break;
523 }
524
525 case tlv::SignatureNonce: {
526 if (sigInfoElemHeader.value.length > Interest::SIGNATURE_NONCE_SIZE) {
527 decoder.skip(sigInfoElemHeader.value.length);
528 } else {
529 auto err =
530 decoder.readBytes(interest.signatureNonce_, sigInfoElemHeader.value.length);
531 if (err != Error::Success) {
532 return err;
533 }
534 interest.hasSignatureNonce_ = true;
535 }
536 break;
537 }
538
539 case tlv::SignatureTime: {
540 auto stResult = decoder.readNonNegativeInteger(sigInfoElemHeader.value.length);
541 if (!stResult.ok()) {
542 return stResult.error;
543 }
544 interest.signatureTime_ = stResult.value;
545 break;
546 }
547
549 auto seqResult = decoder.readNonNegativeInteger(sigInfoElemHeader.value.length);
550 if (!seqResult.ok()) {
551 return seqResult.error;
552 }
553 interest.signatureSeqNum_ = seqResult.value;
554 break;
555 }
556
557 case tlv::KeyLocator: {
558 const size_t keyLocEnd = decoder.position() + sigInfoElemHeader.value.length;
559 if (decoder.position() < keyLocEnd) {
560 size_t bytesRead = 0;
561 auto nameResult =
562 Name::fromWire(decoder.current(), decoder.remaining(), &bytesRead);
563 if (nameResult.ok()) {
564 interest.keyLocator_ = nameResult.value;
565 interest.hasKeyLocator_ = true;
566 }
567 decoder.setPosition(keyLocEnd);
568 }
569 break;
570 }
571
572 default:
573 decoder.skip(sigInfoElemHeader.value.length);
574 break;
575 }
576 }
577 return Error::Success;
578}
579
580Result<Interest> Interest::fromWire(const uint8_t* buf, size_t len) {
581 Interest interest;
582 TlvDecoder decoder(buf, len);
583
584 // Interest TLV header
585 auto headerResult = decoder.readTlvHeader();
586 if (!headerResult.ok()) {
587 return {.value = Interest{}, .error = headerResult.error};
588 }
589
590 if (headerResult.value.type != tlv::Interest) {
591 return {.value = Interest{}, .error = Error::InvalidPacket};
592 }
593
594 const size_t interestValueLen = headerResult.value.length;
595 const size_t interestValueEnd = decoder.position() + interestValueLen;
596
597 if (decoder.remaining() < interestValueLen) {
598 return {.value = Interest{}, .error = Error::DecodeFailed};
599 }
600
601 // Parse TLVs within the Interest
602 bool hasName = false;
603
604 while (decoder.position() < interestValueEnd) {
605 const size_t elementStart = decoder.position();
606
607 auto elemHeader = decoder.readTlvHeader();
608 if (!elemHeader.ok()) {
609 return {.value = Interest{}, .error = elemHeader.error};
610 }
611
612 const uint32_t elemType = elemHeader.value.type;
613 const size_t elemLen = elemHeader.value.length;
614
615 if (decoder.remaining() < elemLen) {
616 return {.value = Interest{}, .error = Error::DecodeFailed};
617 }
618
619 switch (elemType) {
620 case tlv::Name: {
621 // Re-decode Name (including header)
622 decoder.setPosition(elementStart);
623 size_t bytesRead = 0;
624 auto nameResult =
625 Name::fromWire(decoder.current(), decoder.remaining(), &bytesRead);
626 if (!nameResult.ok()) {
627 return {.value = Interest{}, .error = nameResult.error};
628 }
629 interest.name_ = nameResult.value;
630 decoder.skip(bytesRead);
631 hasName = true;
632 break;
633 }
634
635 case tlv::Nonce: {
636 if (elemLen != 4) {
637 return {.value = Interest{}, .error = Error::DecodeFailed};
638 }
639 auto nonceResult = decoder.readNonNegativeInteger(4);
640 if (!nonceResult.ok()) {
641 return {.value = Interest{}, .error = nonceResult.error};
642 }
643 interest.nonce_ = static_cast<uint32_t>(nonceResult.value);
644 break;
645 }
646
648 auto lifetimeResult = decoder.readNonNegativeInteger(elemLen);
649 if (!lifetimeResult.ok()) {
650 return {.value = Interest{}, .error = lifetimeResult.error};
651 }
652 interest.lifetime_ = static_cast<uint32_t>(lifetimeResult.value);
653 break;
654 }
655
656 case tlv::HopLimit: {
657 if (elemLen != 1) {
658 return {.value = Interest{}, .error = Error::DecodeFailed};
659 }
660 auto hopLimitResult = decoder.readNonNegativeInteger(1);
661 if (!hopLimitResult.ok()) {
662 return {.value = Interest{}, .error = hopLimitResult.error};
663 }
664 interest.hopLimit_ = static_cast<uint8_t>(hopLimitResult.value);
665 break;
666 }
667
668 case tlv::CanBePrefix: {
669 // Empty TLV
670 interest.canBePrefix_ = true;
671 decoder.skip(elemLen);
672 break;
673 }
674
675 case tlv::MustBeFresh: {
676 // Empty TLV
677 interest.mustBeFresh_ = true;
678 decoder.skip(elemLen);
679 break;
680 }
681
682 case tlv::ForwardingHint: {
683 // Decode list of Names within ForwardingHint
684 const size_t fwHintEnd = decoder.position() + elemLen;
685 while (decoder.position() < fwHintEnd) {
686 size_t bytesRead = 0;
687 auto nameResult =
688 Name::fromWire(decoder.current(), decoder.remaining(), &bytesRead);
689 if (!nameResult.ok()) {
690 return {.value = Interest{}, .error = nameResult.error};
691 }
692 if (interest.fwHintCount_ < Interest::FW_HINT_MAX_COUNT) {
693 interest.fwHints_[interest.fwHintCount_++] = nameResult.value;
694 }
695 decoder.skip(bytesRead);
696 }
697 break;
698 }
699
701 if (elemLen > Interest::APP_PARAMS_MAX_SIZE) {
702 return {.value = Interest{}, .error = Error::BufferTooSmall};
703 }
704 auto err = decoder.readBytes(interest.appParams_, elemLen);
705 if (err != Error::Success) {
706 return {.value = Interest{}, .error = err};
707 }
708 interest.appParamsLen_ = elemLen;
709 break;
710 }
711
713 const Error err = parseSignatureInfo(decoder, elemLen, interest);
714 if (err != Error::Success) {
715 return {.value = Interest{}, .error = err};
716 }
717 break;
718 }
719
721 if (elemLen > SIGNATURE_MAX_SIZE) {
722 return {.value = Interest{}, .error = Error::BufferTooSmall};
723 }
724 auto err = decoder.readBytes(interest.signatureValue_.data(), elemLen);
725 if (err != Error::Success) {
726 return {.value = Interest{}, .error = err};
727 }
728 interest.signatureSize_ = elemLen;
729 break;
730 }
731
732 default:
733 // Skip unknown TLVs
734 decoder.skip(elemLen);
735 break;
736 }
737 }
738
739 if (!hasName) {
740 return {.value = Interest{}, .error = Error::InvalidPacket};
741 }
742
743 return {.value = interest, .error = Error::Success};
744}
745
746} // namespace ndn
NDN Interest packet.
Definition interest.hpp:50
Error signWithDigestSha256()
Sign with DigestSha256.
Definition interest.cpp:196
bool verifyHmac(const uint8_t *key, size_t keyLen) const
Verify an HMAC-SHA256 signature.
Definition interest.cpp:273
Interest & setLifetime(uint32_t lifetimeMs)
Set the InterestLifetime.
Definition interest.cpp:37
static Result< Interest > fromWire(const uint8_t *buf, size_t len)
Decode an Interest from TLV wire format.
Definition interest.cpp:580
Interest & setCanBePrefix(bool canBePrefix)
Set the CanBePrefix flag.
Definition interest.cpp:54
bool mustBeFresh() const
Get the MustBeFresh flag.
Definition interest.hpp:242
Error signWithEcdsa(const uint8_t *privKey)
Sign with ECDSA P-256.
Definition interest.cpp:303
Interest & setApplicationParameters(const uint8_t *params, size_t len)
Set ApplicationParameters.
Definition interest.cpp:91
Error addForwardingHint(const Name &name)
Add a ForwardingHint.
Definition interest.cpp:64
Interest & setSignatureSeqNum(uint64_t seqNum)
Set the signature sequence number.
Definition interest.cpp:98
bool canBePrefix() const
Get the CanBePrefix flag.
Definition interest.hpp:220
Interest()=default
Default constructor.
Interest & setMustBeFresh(bool mustBeFresh)
Set the MustBeFresh flag.
Definition interest.cpp:59
Error encode(uint8_t *buf, size_t bufSize, size_t &encodedLen) const
Encode the Interest to TLV wire format.
Definition interest.cpp:350
const Name * forwardingHint(size_t index) const
Get a ForwardingHint by index.
Definition interest.cpp:80
bool verifyEcdsa(const uint8_t *pubKey) const
Verify an ECDSA P-256 signature.
Definition interest.cpp:326
void clearForwardingHints()
Clear all ForwardingHints.
Definition interest.cpp:87
Interest & setKeyLocator(const Name &name)
Set the KeyLocator.
Definition interest.cpp:103
Interest & setNonce(uint32_t nonce)
Set the Nonce.
Definition interest.cpp:27
Interest & generateNonce()
Generate and set a random Nonce.
Definition interest.cpp:32
bool verifyDigestSha256() const
Verify a DigestSha256 signature.
Definition interest.cpp:246
Interest & clearKeyLocator()
Clear the KeyLocator.
Definition interest.cpp:109
Interest & setName(const Name &name)
Set the Name (supports method chaining)
Definition interest.cpp:13
std::optional< uint32_t > nonce() const
Get the Nonce.
Definition interest.hpp:139
Interest & setHopLimit(uint8_t limit)
Set the HopLimit.
Definition interest.cpp:42
Error signWithHmac(const uint8_t *key, size_t keyLen)
Sign with HMAC-SHA256.
Definition interest.cpp:219
const Name & name() const
Get the Name (const reference)
Definition interest.hpp:105
Interest & decrementHopLimit()
Decrement the HopLimit by 1.
Definition interest.cpp:47
NDN Name class.
Definition name.hpp:64
Error encode(uint8_t *buf, size_t bufSize, size_t &encodedLen) const
Encode the Name to TLV wire format.
Definition name.cpp:186
static Result< Name > fromWire(const uint8_t *buf, size_t len, size_t *bytesRead=nullptr)
Decode a Name from TLV wire format.
Definition name.cpp:84
static Result< Name > fromUri(std::string_view uri)
Create a Name from a URI string.
Definition name.cpp:25
TLV decoder.
Definition tlv.hpp:235
size_t position() const
Get current position.
Definition tlv.hpp:320
void setPosition(size_t pos)
Set current position.
Definition tlv.hpp:326
const uint8_t * current() const
Pointer to current position.
Definition tlv.hpp:308
Error readBytes(uint8_t *out, size_t len)
Read a specified number of bytes.
Definition tlv.cpp:239
Result< uint64_t > readNonNegativeInteger(size_t numBytes)
Read a non-negative integer of specified byte count.
Definition tlv.cpp:191
Result< TlvHeader > readTlvHeader()
Read a TLV header (Type and Length) at once.
Definition tlv.cpp:224
Error skip(size_t len)
Skip a specified number of bytes.
Definition tlv.cpp:248
size_t remaining() const
Remaining readable bytes.
Definition tlv.hpp:302
TLV encoder.
Definition tlv.hpp:116
size_t position() const
Get current position.
Definition tlv.hpp:207
Error writeLength(size_t length)
Write a TLV Length.
Definition tlv.cpp:91
void setPosition(size_t pos)
Set current position.
Definition tlv.hpp:213
Error writeTlv(uint32_t type, const uint8_t *value, size_t valueLen)
Write a complete TLV structure.
Definition tlv.cpp:104
Error writeBytes(const uint8_t *data, size_t len)
Write a byte sequence.
Definition tlv.cpp:95
size_t size() const
Current write position (= number of bytes written)
Definition tlv.hpp:189
size_t remaining() const
Remaining writable bytes.
Definition tlv.hpp:195
Error writeTlvNonNegativeInteger(uint32_t type, uint64_t value)
Write a non-negative integer as a TLV.
Definition tlv.cpp:125
Error writeType(uint32_t type)
Write a TLV Type.
Definition tlv.cpp:87
uint8_t * current()
Pointer to current position.
Definition tlv.hpp:201
TimeMs currentTimeMs()
Get current time (milliseconds)
Definition common.cpp:7
constexpr uint32_t INTEREST_DEFAULT_LIFETIME_MS
Default Interest lifetime (milliseconds)
Definition common.hpp:125
constexpr size_t PACKET_MAX_SIZE
Maximum packet size (ESP-NOW v2.0 compatible)
Definition common.hpp:122
uint32_t generateRandomNonce()
Generate a random Nonce value.
Definition common.cpp:11
Error
Error codes.
Definition common.hpp:24
NDN cryptographic utilities.
NDN Interest packet.
constexpr uint32_t KeyLocator
Key locator.
Definition tlv.hpp:78
constexpr uint32_t ForwardingHint
Forwarding hint.
Definition tlv.hpp:50
constexpr uint32_t InterestSignatureValue
Interest signature value.
Definition tlv.hpp:89
constexpr uint32_t MustBeFresh
MustBeFresh flag.
Definition tlv.hpp:49
constexpr uint32_t HopLimit
Hop limit.
Definition tlv.hpp:53
constexpr uint32_t InterestSignatureInfo
Interest signature info.
Definition tlv.hpp:88
constexpr uint32_t ApplicationParameters
Application parameters.
Definition tlv.hpp:54
constexpr uint32_t InterestLifetime
Interest lifetime.
Definition tlv.hpp:52
constexpr uint32_t Nonce
Nonce (for loop detection)
Definition tlv.hpp:51
constexpr uint32_t SignatureSeqNum
Signature sequence number.
Definition tlv.hpp:87
constexpr uint32_t SignatureTime
Signature timestamp.
Definition tlv.hpp:86
constexpr uint32_t Name
Name.
Definition tlv.hpp:34
constexpr uint32_t Interest
Interest packet.
Definition tlv.hpp:27
constexpr uint32_t SignatureNonce
Signature nonce.
Definition tlv.hpp:85
constexpr uint32_t SignatureType
Signature type.
Definition tlv.hpp:77
constexpr uint32_t CanBePrefix
CanBePrefix flag.
Definition tlv.hpp:48
constexpr size_t SIGNATURE_MAX_SIZE
Maximum signature size (for ECDSA P-256, embedded)
Definition signature.hpp:38
constexpr size_t ECDSA_P256_SIG_MAX_SIZE
ECDSA P-256 signature max size (DER format)
Definition signature.hpp:35
constexpr size_t HMAC_SHA256_SIZE
HMAC-SHA256 size (bytes)
Definition signature.hpp:34
SignatureType
Signature type.
Definition signature.hpp:22
constexpr size_t SHA256_DIGEST_SIZE
SHA-256 digest size (bytes)
Definition signature.hpp:33
Result type template.
Definition common.hpp:147
NDN TLV (Type-Length-Value) encoding.
constexpr size_t varNumberSize(uint64_t value)
Calculate the encoded size of a VAR-NUMBER.
Definition tlv.hpp:339