SigningInfo::SigningInfo(const std::string& signingStr) { *this = SigningInfo(); if (signingStr.empty()) { return; } size_t pos = signingStr.find(':'); if (pos == std::string::npos) { BOOST_THROW_EXCEPTION(std::invalid_argument("Invalid signing string cannot represent SigningInfo")); } std::string scheme = signingStr.substr(0, pos); std::string nameArg = signingStr.substr(pos + 1); if (scheme == "id") { if (nameArg == KeyChain::DIGEST_SHA256_IDENTITY.toUri()) { setSha256Signing(); } else { setSigningIdentity(nameArg); } } else if (scheme == "key") { setSigningKeyName(nameArg); } else if (scheme == "cert") { setSigningCertName(nameArg); } else { BOOST_THROW_EXCEPTION(std::invalid_argument("Invalid signing string scheme")); } }
/** * Create a FullPSync2017WithUsers. * @param expectedNEntries The expected number of entries in the IBLT. * @param face The application's Face. * @param syncPrefix The prefix Name of the sync group, which is copied. * @param userPrefix The prefix Name of the first user in the group, which is * copied. However, if this Name is empty, it is not added and you must call * addUserNode. * @param onUpdate When there is new data, this calls onUdate(updates) where * updates is a list of PSyncMissingDataInfo. * NOTE: The library will log any exceptions thrown by this callback, but for * better error handling the callback should catch and properly handle any * exceptions. * @param keyChain The KeyChain for signing Data packets. * @param syncInterestLifetime (optional) The Interest lifetime for the sync * Interests, in milliseconds. If omitted, use * FullPSync2017::DEFAULT_SYNC_INTEREST_LIFETIME. * @param syncReplyFreshnessPeriod (optional) The freshness period of the sync * Data packet, in milliseconds. If omitted, use * FullPSync2017::DEFAULT_SYNC_REPLY_FRESHNESS_PERIOD. * @param signingInfo (optional) The SigningInfo for signing Data packets, * which is copied. If omitted, use the default SigningInfo(). */ FullPSync2017WithUsers (size_t expectedNEntries, Face& face, const Name& syncPrefix, const Name& userPrefix, const OnUpdate& onUpdate, KeyChain& keyChain, Milliseconds syncInterestLifetime = FullPSync2017::DEFAULT_SYNC_INTEREST_LIFETIME, Milliseconds syncReplyFreshnessPeriod = FullPSync2017::DEFAULT_SYNC_REPLY_FRESHNESS_PERIOD, const SigningInfo& signingInfo = SigningInfo()) : impl_(new Impl(onUpdate)) { impl_->initialize (expectedNEntries, face, syncPrefix, userPrefix, keyChain, syncInterestLifetime, syncReplyFreshnessPeriod, signingInfo); }
BOOST_FIXTURE_TEST_CASE(GeneralSigningInterface, IdentityManagementFixture) { Name id("/id"); Name certName = m_keyChain.createIdentity(id); shared_ptr<v1::IdentityCertificate> idCert = m_keyChain.getCertificate(certName); Name keyName = idCert->getPublicKeyName(); m_keyChain.setDefaultIdentity(id); Name id2("/id2"); Name cert2Name = m_keyChain.createIdentity(id2); shared_ptr<v1::IdentityCertificate> id2Cert = m_keyChain.getCertificate(cert2Name); // SigningInfo is set to default Data data1("/data1"); m_keyChain.sign(data1); BOOST_CHECK(Validator::verifySignature(data1, idCert->getPublicKeyInfo())); BOOST_CHECK_EQUAL(data1.getSignature().getKeyLocator().getName(), certName.getPrefix(-1)); Interest interest1("/interest1"); m_keyChain.sign(interest1); BOOST_CHECK(Validator::verifySignature(interest1, idCert->getPublicKeyInfo())); SignatureInfo sigInfo1(interest1.getName()[-2].blockFromValue()); BOOST_CHECK_EQUAL(sigInfo1.getKeyLocator().getName(), certName.getPrefix(-1)); // SigningInfo is set to Identity Data data2("/data2"); m_keyChain.sign(data2, SigningInfo(SigningInfo::SIGNER_TYPE_ID, id2)); BOOST_CHECK(Validator::verifySignature(data2, id2Cert->getPublicKeyInfo())); BOOST_CHECK_EQUAL(data2.getSignature().getKeyLocator().getName(), cert2Name.getPrefix(-1)); Interest interest2("/interest2"); m_keyChain.sign(interest2, SigningInfo(SigningInfo::SIGNER_TYPE_ID, id2)); BOOST_CHECK(Validator::verifySignature(interest2, id2Cert->getPublicKeyInfo())); SignatureInfo sigInfo2(interest2.getName()[-2].blockFromValue()); BOOST_CHECK_EQUAL(sigInfo2.getKeyLocator().getName(), cert2Name.getPrefix(-1)); // SigningInfo is set to Key Data data3("/data3"); m_keyChain.sign(data3, SigningInfo(SigningInfo::SIGNER_TYPE_KEY, keyName)); BOOST_CHECK(Validator::verifySignature(data3, idCert->getPublicKeyInfo())); BOOST_CHECK_EQUAL(data3.getSignature().getKeyLocator().getName(), certName.getPrefix(-1)); Interest interest3("/interest3"); m_keyChain.sign(interest3); BOOST_CHECK(Validator::verifySignature(interest3, idCert->getPublicKeyInfo())); SignatureInfo sigInfo3(interest1.getName()[-2].blockFromValue()); BOOST_CHECK_EQUAL(sigInfo3.getKeyLocator().getName(), certName.getPrefix(-1)); // SigningInfo is set to Cert Data data4("/data4"); m_keyChain.sign(data4, SigningInfo(SigningInfo::SIGNER_TYPE_CERT, certName)); BOOST_CHECK(Validator::verifySignature(data4, idCert->getPublicKeyInfo())); BOOST_CHECK_EQUAL(data4.getSignature().getKeyLocator().getName(), certName.getPrefix(-1)); Interest interest4("/interest4"); m_keyChain.sign(interest4, SigningInfo(SigningInfo::SIGNER_TYPE_CERT, certName)); BOOST_CHECK(Validator::verifySignature(interest4, idCert->getPublicKeyInfo())); SignatureInfo sigInfo4(interest4.getName()[-2].blockFromValue()); BOOST_CHECK_EQUAL(sigInfo4.getKeyLocator().getName(), certName.getPrefix(-1)); // SigningInfo is set to DigestSha256 Data data5("/data5"); m_keyChain.sign(data5, SigningInfo(SigningInfo::SIGNER_TYPE_SHA256)); BOOST_CHECK(Validator::verifySignature(data5, DigestSha256(data5.getSignature()))); Interest interest5("/interest4"); m_keyChain.sign(interest5, SigningInfo(SigningInfo::SIGNER_TYPE_SHA256)); BOOST_CHECK(Validator::verifySignature(interest5, DigestSha256(Signature(interest5.getName()[-2].blockFromValue(), interest5.getName()[-1].blockFromValue())))); }