24 return Error::Success;
38 lifetime_ = lifetimeMs;
48 if (hopLimit_ && *hopLimit_ > 0) {
49 hopLimit_ = *hopLimit_ - 1;
65 if (fwHintCount_ >= FW_HINT_MAX_COUNT) {
68 fwHints_[fwHintCount_++] =
name;
69 return Error::Success;
81 if (index >= fwHintCount_) {
84 return &fwHints_[index];
92 len = std::min(len,
static_cast<size_t>(APP_PARAMS_MAX_SIZE));
93 std::memcpy(appParams_, params, len);
99 signatureSeqNum_ = seqNum;
105 hasKeyLocator_ =
true;
110 keyLocator_ =
Name{};
111 hasKeyLocator_ =
false;
115void Interest::generateSignatureNonce() {
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;
130Error Interest::encodeInterestSignatureInfo(TlvEncoder& encoder)
const {
131 uint8_t sigInfoBuf[256];
132 TlvEncoder sigInfoEncoder(sigInfoBuf,
sizeof(sigInfoBuf));
136 static_cast<uint8_t
>(signatureType_));
139 if (hasKeyLocator_) {
140 uint8_t keyLocBuf[NAME_MAX_LENGTH + 4];
141 TlvEncoder keyLocEncoder(keyLocBuf,
sizeof(keyLocBuf));
143 Error err = keyLocator_.
encode(keyLocEncoder.current(), keyLocEncoder.remaining(), nameLen);
144 if (err != Error::Success) {
147 keyLocEncoder.setPosition(keyLocEncoder.position() + nameLen);
148 sigInfoEncoder.writeTlv(
tlv::KeyLocator, keyLocBuf, keyLocEncoder.size());
152 if (hasSignatureNonce_) {
157 if (signatureTime_) {
162 if (signatureSeqNum_) {
169Error Interest::encodeSignedPortion(uint8_t* buf,
size_t bufSize,
size_t& encodedLen)
const {
170 TlvEncoder encoder(buf, bufSize);
174 Error err = name_.
encode(encoder.current(), encoder.remaining(), nameLen);
175 if (err != Error::Success) {
178 encoder.setPosition(encoder.position() + nameLen);
182 if (err != Error::Success) {
187 err = encodeInterestSignatureInfo(encoder);
188 if (err != Error::Success) {
192 encodedLen = encoder.size();
193 return Error::Success;
197 signatureType_ = SignatureType::DigestSha256;
198 generateSignatureNonce();
203 size_t signedLen = 0;
204 Error err = encodeSignedPortion(signedBuf,
sizeof(signedBuf), signedLen);
205 if (err != Error::Success) {
210 err = crypto::sha256(signedBuf, signedLen, signatureValue_.data());
211 if (err != Error::Success) {
216 return Error::Success;
220 if (key ==
nullptr || keyLen == 0) {
221 return Error::InvalidParam;
224 signatureType_ = SignatureType::SignatureHmacWithSha256;
225 generateSignatureNonce();
230 size_t signedLen = 0;
231 Error err = encodeSignedPortion(signedBuf,
sizeof(signedBuf), signedLen);
232 if (err != Error::Success) {
237 err = crypto::hmacSha256(key, keyLen, signedBuf, signedLen, signatureValue_.data());
238 if (err != Error::Success) {
243 return Error::Success;
247 if (signatureType_ != SignatureType::DigestSha256) {
256 size_t signedLen = 0;
257 Error err = encodeSignedPortion(signedBuf,
sizeof(signedBuf), signedLen);
258 if (err != Error::Success) {
264 err = crypto::sha256(signedBuf, signedLen, computed);
265 if (err != Error::Success) {
270 return crypto::constantTimeCompare(computed, signatureValue_.data(),
SHA256_DIGEST_SIZE);
274 if (key ==
nullptr || keyLen == 0) {
277 if (signatureType_ != SignatureType::SignatureHmacWithSha256) {
286 size_t signedLen = 0;
287 Error err = encodeSignedPortion(signedBuf,
sizeof(signedBuf), signedLen);
288 if (err != Error::Success) {
294 err = crypto::hmacSha256(key, keyLen, signedBuf, signedLen, computed);
295 if (err != Error::Success) {
300 return crypto::constantTimeCompare(computed, signatureValue_.data(),
HMAC_SHA256_SIZE);
304 if (privKey ==
nullptr) {
305 return Error::InvalidParam;
308 signatureType_ = SignatureType::SignatureSha256WithEcdsa;
309 generateSignatureNonce();
314 size_t signedLen = 0;
315 Error err = encodeSignedPortion(signedBuf,
sizeof(signedBuf), signedLen);
316 if (err != Error::Success) {
321 err = crypto::ecdsaP256Sign(privKey, signedBuf, signedLen, signatureValue_.data(),
327 if (pubKey ==
nullptr) {
330 if (signatureType_ != SignatureType::SignatureSha256WithEcdsa) {
339 size_t signedLen = 0;
340 Error err = encodeSignedPortion(signedBuf,
sizeof(signedBuf), signedLen);
341 if (err != Error::Success) {
346 return crypto::ecdsaP256Verify(pubKey, signedBuf, signedLen, signatureValue_.data(),
353 TlvEncoder valueEncoder(valueBuf,
sizeof(valueBuf));
358 if (err != Error::Success) {
366 if (err != Error::Success) {
370 if (err != Error::Success) {
378 if (err != Error::Success) {
382 if (err != Error::Success) {
388 if (fwHintCount_ > 0) {
390 uint8_t fwHintBuf[512];
391 TlvEncoder fwHintEncoder(fwHintBuf,
sizeof(fwHintBuf));
393 for (
size_t i = 0; i < fwHintCount_; ++i) {
394 size_t hintNameLen = 0;
396 fwHints_[i].encode(fwHintEncoder.
current(), fwHintEncoder.
remaining(), hintNameLen);
397 if (err != Error::Success) {
404 if (err != Error::Success) {
412 if (err != Error::Success) {
416 if (err != Error::Success) {
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_)};
424 if (err != Error::Success) {
432 if (err != Error::Success) {
440 if (err != Error::Success) {
444 if (err != Error::Success) {
447 const uint8_t hopLimitValue = *hopLimit_;
448 err = valueEncoder.
writeBytes(&hopLimitValue, 1);
449 if (err != Error::Success) {
455 if (appParamsLen_ > 0 || signatureSize_ > 0) {
457 if (err != Error::Success) {
463 if (signatureSize_ > 0) {
465 err = encodeInterestSignatureInfo(valueEncoder);
466 if (err != Error::Success) {
473 if (err != Error::Success) {
479 const size_t valueLen = valueEncoder.
size();
481 const size_t totalSize = headerSize + valueLen;
483 if (bufSize < totalSize) {
484 return Error::BufferTooSmall;
489 if (err != Error::Success) {
494 if (err != Error::Success) {
499 if (err != Error::Success) {
503 encodedLen = encoder.
size();
504 return Error::Success;
508 const size_t sigInfoEnd = decoder.
position() + elemLen;
509 while (decoder.
position() < sigInfoEnd) {
511 if (!sigInfoElemHeader.ok()) {
512 return sigInfoElemHeader.error;
515 switch (sigInfoElemHeader.value.type) {
518 if (!stResult.ok()) {
519 return stResult.error;
521 interest.signatureType_ =
static_cast<SignatureType>(stResult.value);
526 if (sigInfoElemHeader.value.length > Interest::SIGNATURE_NONCE_SIZE) {
527 decoder.
skip(sigInfoElemHeader.value.length);
530 decoder.
readBytes(interest.signatureNonce_, sigInfoElemHeader.value.length);
531 if (err != Error::Success) {
534 interest.hasSignatureNonce_ =
true;
541 if (!stResult.ok()) {
542 return stResult.error;
544 interest.signatureTime_ = stResult.value;
550 if (!seqResult.ok()) {
551 return seqResult.error;
553 interest.signatureSeqNum_ = seqResult.value;
558 const size_t keyLocEnd = decoder.
position() + sigInfoElemHeader.value.length;
559 if (decoder.
position() < keyLocEnd) {
560 size_t bytesRead = 0;
563 if (nameResult.ok()) {
564 interest.keyLocator_ = nameResult.value;
565 interest.hasKeyLocator_ =
true;
573 decoder.
skip(sigInfoElemHeader.value.length);
577 return Error::Success;
586 if (!headerResult.ok()) {
587 return {.value =
Interest{}, .error = headerResult.error};
591 return {.value =
Interest{}, .error = Error::InvalidPacket};
594 const size_t interestValueLen = headerResult.value.length;
595 const size_t interestValueEnd = decoder.
position() + interestValueLen;
597 if (decoder.
remaining() < interestValueLen) {
598 return {.value =
Interest{}, .error = Error::DecodeFailed};
602 bool hasName =
false;
604 while (decoder.
position() < interestValueEnd) {
605 const size_t elementStart = decoder.
position();
608 if (!elemHeader.ok()) {
609 return {.value =
Interest{}, .error = elemHeader.error};
612 const uint32_t elemType = elemHeader.value.type;
613 const size_t elemLen = elemHeader.value.length;
616 return {.value =
Interest{}, .error = Error::DecodeFailed};
623 size_t bytesRead = 0;
626 if (!nameResult.ok()) {
627 return {.value =
Interest{}, .error = nameResult.error};
629 interest.name_ = nameResult.value;
630 decoder.
skip(bytesRead);
637 return {.value =
Interest{}, .error = Error::DecodeFailed};
640 if (!nonceResult.ok()) {
641 return {.value =
Interest{}, .error = nonceResult.error};
643 interest.nonce_ =
static_cast<uint32_t
>(nonceResult.value);
649 if (!lifetimeResult.ok()) {
650 return {.value =
Interest{}, .error = lifetimeResult.error};
652 interest.lifetime_ =
static_cast<uint32_t
>(lifetimeResult.value);
658 return {.value =
Interest{}, .error = Error::DecodeFailed};
661 if (!hopLimitResult.ok()) {
662 return {.value =
Interest{}, .error = hopLimitResult.error};
664 interest.hopLimit_ =
static_cast<uint8_t
>(hopLimitResult.value);
670 interest.canBePrefix_ =
true;
671 decoder.
skip(elemLen);
677 interest.mustBeFresh_ =
true;
678 decoder.
skip(elemLen);
684 const size_t fwHintEnd = decoder.
position() + elemLen;
685 while (decoder.
position() < fwHintEnd) {
686 size_t bytesRead = 0;
689 if (!nameResult.ok()) {
690 return {.value =
Interest{}, .error = nameResult.error};
692 if (interest.fwHintCount_ < Interest::FW_HINT_MAX_COUNT) {
693 interest.fwHints_[interest.fwHintCount_++] = nameResult.value;
695 decoder.
skip(bytesRead);
701 if (elemLen > Interest::APP_PARAMS_MAX_SIZE) {
702 return {.value =
Interest{}, .error = Error::BufferTooSmall};
704 auto err = decoder.
readBytes(interest.appParams_, elemLen);
705 if (err != Error::Success) {
706 return {.value =
Interest{}, .error = err};
708 interest.appParamsLen_ = elemLen;
713 const Error err = parseSignatureInfo(decoder, elemLen, interest);
714 if (err != Error::Success) {
715 return {.value =
Interest{}, .error = err};
722 return {.value =
Interest{}, .error = Error::BufferTooSmall};
724 auto err = decoder.
readBytes(interest.signatureValue_.data(), elemLen);
725 if (err != Error::Success) {
726 return {.value =
Interest{}, .error = err};
728 interest.signatureSize_ = elemLen;
734 decoder.
skip(elemLen);
740 return {.value =
Interest{}, .error = Error::InvalidPacket};
743 return {.value = interest, .error = Error::Success};
Error signWithDigestSha256()
Sign with DigestSha256.
bool verifyHmac(const uint8_t *key, size_t keyLen) const
Verify an HMAC-SHA256 signature.
Interest & setLifetime(uint32_t lifetimeMs)
Set the InterestLifetime.
static Result< Interest > fromWire(const uint8_t *buf, size_t len)
Decode an Interest from TLV wire format.
Interest & setCanBePrefix(bool canBePrefix)
Set the CanBePrefix flag.
bool mustBeFresh() const
Get the MustBeFresh flag.
Error signWithEcdsa(const uint8_t *privKey)
Sign with ECDSA P-256.
Interest & setApplicationParameters(const uint8_t *params, size_t len)
Set ApplicationParameters.
Error addForwardingHint(const Name &name)
Add a ForwardingHint.
Interest & setSignatureSeqNum(uint64_t seqNum)
Set the signature sequence number.
bool canBePrefix() const
Get the CanBePrefix flag.
Interest()=default
Default constructor.
Interest & setMustBeFresh(bool mustBeFresh)
Set the MustBeFresh flag.
Error encode(uint8_t *buf, size_t bufSize, size_t &encodedLen) const
Encode the Interest to TLV wire format.
const Name * forwardingHint(size_t index) const
Get a ForwardingHint by index.
bool verifyEcdsa(const uint8_t *pubKey) const
Verify an ECDSA P-256 signature.
void clearForwardingHints()
Clear all ForwardingHints.
Interest & setKeyLocator(const Name &name)
Set the KeyLocator.
Interest & setNonce(uint32_t nonce)
Set the Nonce.
Interest & generateNonce()
Generate and set a random Nonce.
bool verifyDigestSha256() const
Verify a DigestSha256 signature.
Interest & clearKeyLocator()
Clear the KeyLocator.
Interest & setName(const Name &name)
Set the Name (supports method chaining)
std::optional< uint32_t > nonce() const
Get the Nonce.
Interest & setHopLimit(uint8_t limit)
Set the HopLimit.
Error signWithHmac(const uint8_t *key, size_t keyLen)
Sign with HMAC-SHA256.
const Name & name() const
Get the Name (const reference)
Interest & decrementHopLimit()
Decrement the HopLimit by 1.
Error encode(uint8_t *buf, size_t bufSize, size_t &encodedLen) const
Encode the Name to TLV wire format.
static Result< Name > fromWire(const uint8_t *buf, size_t len, size_t *bytesRead=nullptr)
Decode a Name from TLV wire format.
static Result< Name > fromUri(std::string_view uri)
Create a Name from a URI string.
size_t position() const
Get current position.
void setPosition(size_t pos)
Set current position.
const uint8_t * current() const
Pointer to current position.
Error readBytes(uint8_t *out, size_t len)
Read a specified number of bytes.
Result< uint64_t > readNonNegativeInteger(size_t numBytes)
Read a non-negative integer of specified byte count.
Result< TlvHeader > readTlvHeader()
Read a TLV header (Type and Length) at once.
Error skip(size_t len)
Skip a specified number of bytes.
size_t remaining() const
Remaining readable bytes.
size_t position() const
Get current position.
Error writeLength(size_t length)
Write a TLV Length.
void setPosition(size_t pos)
Set current position.
Error writeTlv(uint32_t type, const uint8_t *value, size_t valueLen)
Write a complete TLV structure.
Error writeBytes(const uint8_t *data, size_t len)
Write a byte sequence.
size_t size() const
Current write position (= number of bytes written)
size_t remaining() const
Remaining writable bytes.
Error writeTlvNonNegativeInteger(uint32_t type, uint64_t value)
Write a non-negative integer as a TLV.
Error writeType(uint32_t type)
Write a TLV Type.
uint8_t * current()
Pointer to current position.
TimeMs currentTimeMs()
Get current time (milliseconds)
constexpr uint32_t INTEREST_DEFAULT_LIFETIME_MS
Default Interest lifetime (milliseconds)
constexpr size_t PACKET_MAX_SIZE
Maximum packet size (ESP-NOW v2.0 compatible)
uint32_t generateRandomNonce()
Generate a random Nonce value.
NDN cryptographic utilities.
constexpr uint32_t KeyLocator
Key locator.
constexpr uint32_t ForwardingHint
Forwarding hint.
constexpr uint32_t InterestSignatureValue
Interest signature value.
constexpr uint32_t MustBeFresh
MustBeFresh flag.
constexpr uint32_t HopLimit
Hop limit.
constexpr uint32_t InterestSignatureInfo
Interest signature info.
constexpr uint32_t ApplicationParameters
Application parameters.
constexpr uint32_t InterestLifetime
Interest lifetime.
constexpr uint32_t Nonce
Nonce (for loop detection)
constexpr uint32_t SignatureSeqNum
Signature sequence number.
constexpr uint32_t SignatureTime
Signature timestamp.
constexpr uint32_t Name
Name.
constexpr uint32_t Interest
Interest packet.
constexpr uint32_t SignatureNonce
Signature nonce.
constexpr uint32_t SignatureType
Signature type.
constexpr uint32_t CanBePrefix
CanBePrefix flag.
constexpr size_t SIGNATURE_MAX_SIZE
Maximum signature size (for ECDSA P-256, embedded)
constexpr size_t ECDSA_P256_SIG_MAX_SIZE
ECDSA P-256 signature max size (DER format)
constexpr size_t HMAC_SHA256_SIZE
HMAC-SHA256 size (bytes)
SignatureType
Signature type.
constexpr size_t SHA256_DIGEST_SIZE
SHA-256 digest size (bytes)
NDN TLV (Type-Length-Value) encoding.
constexpr size_t varNumberSize(uint64_t value)
Calculate the encoded size of a VAR-NUMBER.