void CommandInterestGenerator::generate (Interest& interest, KeyChain& keyChain, const Name& certificateName, WireFormat& wireFormat) { MillisecondsSince1970 timestamp = ::round(ndn_getNowMilliseconds()); while (timestamp <= lastTimestamp_) timestamp += 1.0; // The timestamp is encoded as a TLV nonNegativeInteger. TlvEncoder encoder(8); encoder.writeNonNegativeInteger((uint64_t)timestamp); interest.getName().append(Blob(encoder.finish())); // The random value is a TLV nonNegativeInteger too, but we know it is 8 bytes, // so we don't need to call the nonNegativeInteger encoder. uint8_t randomBuffer[8]; ndn_Error error; if ((error = CryptoLite::generateRandomBytes(randomBuffer, sizeof(randomBuffer)))) throw runtime_error(ndn_getErrorString(error)); interest.getName().append(randomBuffer, sizeof(randomBuffer)); keyChain.sign(interest, certificateName, wireFormat); if (interest.getInterestLifetimeMilliseconds() < 0) // The caller has not set the interest lifetime, so set it here. interest.setInterestLifetimeMilliseconds(1000.0); // We successfully signed the interest, so update the timestamp. lastTimestamp_ = timestamp; }
void CommandInterestGenerator::generate (Interest& interest, KeyChain& keyChain, const Name& certificateName, WireFormat& wireFormat) { prepareCommandInterestName(interest, wireFormat); keyChain.sign(interest, certificateName, wireFormat); if (interest.getInterestLifetimeMilliseconds() < 0) // The caller has not set the interest lifetime, so set it here. interest.setInterestLifetimeMilliseconds(1000.0); }
TEST_F(TestLink, EncodeDecodeInterestWithLink) { Link link1; link1.setName(Name("test")); link1.addDelegation(10, Name("/test1")); link1.addDelegation(20, Name("/test2")); link1.addDelegation(100, Name("/test3")); keyChain_->sign(link1, certificateName_); Interest interestA; interestA.setName(Name("/Test/Encode/Decode/With/Link")); interestA.setChildSelector(1); interestA.setInterestLifetimeMilliseconds(10000); interestA.setLinkWireEncoding(link1.wireEncode()); Blob interestEncoding = interestA.wireEncode(); Interest interestB; interestB.wireDecode(interestEncoding); ASSERT_EQ(interestA.getName(), interestB.getName()); Link* link2 = interestB.getLink(); ASSERT_TRUE(link2) << "Interest link object not specified"; const DelegationSet& delegations = link2->getDelegations(); for (size_t i = 0; i < delegations.size(); ++i) { if (i == 0) { ASSERT_EQ(10, delegations.get(i).getPreference()); ASSERT_EQ(Name("/test1"), delegations.get(i).getName()); } if (i == 1) { ASSERT_EQ(20, delegations.get(i).getPreference()); ASSERT_EQ(Name("/test2"), delegations.get(i).getName()); } if (i == 2) { ASSERT_EQ(100, delegations.get(i).getPreference()); ASSERT_EQ(Name("/test3"), delegations.get(i).getName()); } } }