security: sign and verify new signed Interest format
refs #4804
Change-Id: Ib819edb977fa06c670b04185a0d730203c7d7fdb
diff --git a/ndn-cxx/interest.cpp b/ndn-cxx/interest.cpp
index 6969de5..935bd1c 100644
--- a/ndn-cxx/interest.cpp
+++ b/ndn-cxx/interest.cpp
@@ -631,6 +631,38 @@
return *this;
}
+InputBuffers
+Interest::extractSignedRanges() const
+{
+ InputBuffers bufs;
+ bufs.reserve(2); // For Name range and parameters range
+
+ wireEncode();
+
+ // Get Interest name minus any ParametersSha256DigestComponent
+ // Name is guaranteed to be non-empty if wireEncode does not throw
+ BOOST_ASSERT(!m_name.empty());
+ if (m_name[-1].type() != tlv::ParametersSha256DigestComponent) {
+ NDN_THROW(Error("Interest Name must end with a ParametersSha256DigestComponent"));
+ }
+
+ bufs.emplace_back(m_name[0].wire(), std::distance(m_name[0].wire(), m_name[-1].wire()));
+
+ // Ensure has InterestSignatureInfo field
+ auto sigInfoIt = findFirstParameter(tlv::InterestSignatureInfo);
+ if (sigInfoIt == m_parameters.end()) {
+ NDN_THROW(Error("Interest missing InterestSignatureInfo"));
+ }
+
+ // Get range from ApplicationParameters to InterestSignatureValue
+ // or end of parameters (whichever is first)
+ BOOST_ASSERT(!m_parameters.empty() && m_parameters.begin()->type() == tlv::ApplicationParameters);
+ auto sigValueIt = findFirstParameter(tlv::InterestSignatureValue);
+ bufs.emplace_back(m_parameters.begin()->wire(),
+ std::distance(m_parameters.begin()->begin(), std::prev(sigValueIt)->end()));
+ return bufs;
+}
+
// ---- ParametersSha256DigestComponent support ----
bool