1 #ifndef NDNPH_PACKET_DATA_HPP
2 #define NDNPH_PACKET_DATA_HPP
4 #include "../keychain/private-key.hpp"
5 #include "../keychain/public-key.hpp"
6 #include "../port/sha256/port.hpp"
7 #include "../port/timingsafe/port.hpp"
50 m_sigInfo = std::move(sigInfo);
54 if (m_key ==
nullptr) {
59 const uint8_t* afterSig = encoder.
begin();
63 const uint8_t* afterSignedPortion = encoder.
begin();
64 encodeSignedPortion(encoder);
70 ssize_t sigLen = m_key->
sign({signedPortion}, sigBuf);
76 encoder.
resetFront(
const_cast<uint8_t*
>(afterSig));
82 if (room != signedPortion.
begin()) {
83 std::memmove(room, signedPortion.begin(), signedPortion.size());
90 std::memmove(room, sigBuf, sigLen);
97 void encodeSignedPortion(
Encoder& encoder)
const {
102 TT::MetaInfo, Encoder::OmitEmpty,
103 [this](Encoder& encoder) {
104 if (obj->contentType != DataObj::DefaultContentType) {
105 encoder.prependTlv(TT::ContentType, tlv::NNI(obj->contentType));
109 if (obj->freshnessPeriod != DataObj::DefaultFreshnessPeriod) {
110 encoder.prependTlv(TT::FreshnessPeriod, tlv::NNI(obj->freshnessPeriod));
114 if (
obj->isFinalBlock) {
115 auto comp =
obj->name[-1];
120 [
this](Encoder& encoder) {
127 const PrivateKey* m_key =
nullptr;
138 using RefRegion::RefRegion;
149 return obj->contentType;
153 obj->contentType = v;
157 return obj->freshnessPeriod;
161 obj->freshnessPeriod = v;
165 return obj->isFinalBlock;
169 obj->isFinalBlock = v;
177 obj->content = std::move(v);
185 return obj->sig ==
nullptr ? nullptr : &obj->sig->sigInfo;
193 if (obj->sig ==
nullptr) {
197 obj->sig->wholePacket.encodeTo(encoder);
202 obj->sig = regionOf(obj).template make<detail::DataSigned>();
203 if (obj->sig ==
nullptr) {
207 return EvDecoder::decode(
209 EvDecoder::def<TT::MetaInfo>([
this](
const Decoder::Tlv& d) {
210 return EvDecoder::decode(d, {}, EvDecoder::defNni<TT::ContentType>(&obj->contentType),
211 EvDecoder::defNni<TT::FreshnessPeriod>(&obj->freshnessPeriod),
212 EvDecoder::def<TT::FinalBlock>([
this](
const Decoder::Tlv& d) {
213 auto comp = getName()[-1];
215 d.
length == comp.size() &&
219 EvDecoder::def<TT::Content>(&obj->content), EvDecoder::def<TT::DSigInfo>(&obj->sig->sigInfo),
222 return obj->sig->sigValue.decodeFrom(d);
231 template<
typename Encodable>
233 if (obj ==
nullptr) {
236 Encoder encoder(regionOf(obj));
237 if (!encoder.
prepend(std::forward<Encodable>(encodable))) {
255 return Signed(obj, key, std::move(sigInfo));
264 return obj->sig !=
nullptr && key.
verify({obj->sig->signedPortion}, obj->sig->sigValue.begin(),
265 obj->sig->sigValue.size());
274 if (obj->sig ==
nullptr) {
278 hash.
update(obj->sig->wholePacket.begin(), obj->sig->wholePacket.size());
279 return hash.
final(digest);
289 if (!computeImplicitDigest(digest)) {
297 CanSatisfyInCache = 1 << 0,
308 template<
typename InterestT>
310 if ((opts & CanSatisfyInCache) != 0 && interest.getMustBeFresh() && getFreshnessPeriod() == 0) {
313 const Name& interestName = interest.getName();
314 const Name& dataName = getName();
315 switch (interestName.
compare(dataName)) {
316 case Name::CMP_EQUAL:
318 case Name::CMP_LPREFIX:
319 return interest.getCanBePrefix();
320 case Name::CMP_RPREFIX: {
323 return interestName.
size() == dataName.
size() + 1 &&
325 port::TimingSafeEqual()(digest,
sizeof(digest), lastComp.
value(), lastComp.
length());
332 #ifdef NDNPH_PRINT_ARDUINO
334 return p.print(getName());
339 #ifdef NDNPH_PRINT_OSTREAM
341 operator<<(std::ostream& os,
const Data& data) {
342 return os << data.getName();
SHA256 algorithm, implemented with BearSSL.
Definition: sha256-bearssl.hpp:11
void update(const uint8_t *chunk, size_t size)
Definition: sha256-bearssl.hpp:17
bool final(uint8_t *digest)
Definition: sha256-bearssl.hpp:21
Name component.
Definition: component.hpp:16
size_t length() const
Definition: component.hpp:145
const uint8_t * value() const
Definition: component.hpp:149
bool is() const
Definition: component.hpp:189
SignatureInfo on Data.
Definition: sig-info.hpp:59
Data packet.
Definition: data.hpp:136
bool canSatisfy(const InterestT &interest, CanSatisfyOptions opts=CanSatisfyNone) const
Determine whether Data can satisfy Interest.
Definition: data.hpp:309
bool getIsFinalBlock() const
Definition: data.hpp:164
void setContentType(uint8_t v)
Definition: data.hpp:152
uint32_t getFreshnessPeriod() const
Definition: data.hpp:156
void setContent(tlv::Value v)
Definition: data.hpp:176
void setName(const Name &v)
Definition: data.hpp:144
tlv::Value getContent() const
Definition: data.hpp:172
const Name & getName() const
Definition: data.hpp:140
const DSigInfo * getSigInfo() const
Retrieve SignatureInfo.
Definition: data.hpp:184
bool decodeFrom(Encodable &&encodable)
Encode then decode as Data packet.
Definition: data.hpp:232
Signed sign(const PrivateKey &key, DSigInfo sigInfo=DSigInfo()) const
Sign the packet with a private key.
Definition: data.hpp:254
uint8_t getContentType() const
Definition: data.hpp:148
void setFreshnessPeriod(uint32_t v)
Definition: data.hpp:160
void setIsFinalBlock(bool v)
Definition: data.hpp:168
size_t printTo(::Print &p) const final
Definition: data.hpp:333
bool computeImplicitDigest(uint8_t digest[NDNPH_SHA256_LEN]) const
Compute implicit digest.
Definition: data.hpp:273
bool verify(const PublicKey &key) const
Verify the packet with a public key.
Definition: data.hpp:263
bool decodeFrom(const Decoder::Tlv &input)
Decode packet.
Definition: data.hpp:201
Name getFullName(Region ®ion) const
Obtain full name with implicit digest.
Definition: data.hpp:287
void encodeTo(Encoder &encoder) const
Prepend the original packet to Encoder.
Definition: data.hpp:192
CanSatisfyOptions
Definition: data.hpp:295
Decoded TLV.
Definition: decoder.hpp:13
const uint8_t * tlv
Definition: decoder.hpp:42
size_t length
Definition: decoder.hpp:39
const uint8_t * value
Definition: decoder.hpp:40
TLV decoder.
Definition: decoder.hpp:10
bool decode(T &target) const
Decode first TLV into target object.
Definition: decoder.hpp:158
TLV encoder that accepts items in reverse order.
Definition: encoder.hpp:10
const uint8_t * begin() const
Get output begin.
Definition: encoder.hpp:34
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
bool prependTypeLength(uint32_t type, size_t length)
Prepend TLV-TYPE and TLV-LENGTH.
Definition: encoder.hpp:103
@ OmitEmpty
Definition: encoder.hpp:131
void discard()
Release all space to the Region.
Definition: encoder.hpp:72
uint8_t * prependRoom(size_t size)
Make room to prepend an object.
Definition: encoder.hpp:90
bool prependTlv(uint32_t type, OmitEmptyTag omitEmpty, const Arg &... arg)
Prepend TLV, measuring TLV-LENGTH automatically.
Definition: encoder.hpp:143
void setError()
Indicate an error has occurred.
Definition: encoder.hpp:166
size_t size() const
Get output size.
Definition: encoder.hpp:44
void resetFront(uint8_t *pos)
Reset front to given position.
Definition: encoder.hpp:81
Base class of an object allocated in a Region.
Definition: region.hpp:202
Name.
Definition: name.hpp:14
size_t size() const
Get number of components.
Definition: name.hpp:86
CompareResult compare(const Name &other) const
Compare with other name.
Definition: name.hpp:217
Definition: printing.hpp:22
Private key.
Definition: private-key.hpp:9
virtual void updateSigInfo(SigInfo &sigInfo) const =0
Write SigType and KeyLocator.
virtual size_t getMaxSigLen() const =0
virtual ssize_t sign(std::initializer_list< tlv::Value > chunks, uint8_t *sig) const =0
Perform signing.
Public key.
Definition: public-key.hpp:9
virtual bool verify(std::initializer_list< tlv::Value > chunks, const uint8_t *sig, size_t sigLen) const =0
Perform verification.
Base class of an object referencing an InRegion object.
Definition: region.hpp:210
ObjType * obj
Definition: region.hpp:226
Region-based memory allocator thats owns memory of NDNph objects.
Definition: region.hpp:9
Region & region
Definition: region.hpp:194
Definition: convention.hpp:74
Fields in Data.
Definition: data.hpp:23
bool isFinalBlock
Definition: data.hpp:39
uint8_t contentType
Definition: data.hpp:38
@ DefaultFreshnessPeriod
Definition: data.hpp:30
@ DefaultContentType
Definition: data.hpp:29
DataObj(Region ®ion)
Definition: data.hpp:25
tlv::Value content
Definition: data.hpp:36
uint32_t freshnessPeriod
Definition: data.hpp:37
DataSigned * sig
Definition: data.hpp:34
Name name
Definition: data.hpp:35
void encodeTo(Encoder &encoder) const
Definition: data.hpp:53
SignedDataRef(DataObj *data, const PrivateKey &key, DSigInfo sigInfo)
Definition: data.hpp:46
A sequence of bytes, usually TLV-VALUE.
Definition: value.hpp:11
const uint8_t * begin() const
Definition: value.hpp:38
size_t size() const
Definition: value.hpp:46
#define NDNPH_ASSERT(x)
Definition: common.hpp:30
#define NDNPH_SHA256_LEN
SHA256 digest length.
Definition: common.hpp:34
@ Blob
Definition: an.hpp:66
@ FinalBlock
Definition: an.hpp:45
@ DSigInfo
Definition: an.hpp:47
@ Name
Definition: an.hpp:19
@ DSigValue
Definition: an.hpp:48
@ Content
Definition: an.hpp:46
@ Data
Definition: an.hpp:41
bool input(Region ®ion, T &target, std::istream &is=std::cin)
Read and decode from input stream.
Definition: io.hpp:15
Fields in Data signature.
Definition: data.hpp:15
tlv::Value signedPortion
Definition: data.hpp:18
tlv::Value sigValue
Definition: data.hpp:17
tlv::Value wholePacket
Definition: data.hpp:19
DSigInfo sigInfo
Definition: data.hpp:16