ptr_lib::shared_ptr<IdentityCertificate> IdentityManager::createIdentityCertificate(const Name& certificatePrefix, const PublicKey& publicKey, const Name& signerCertificateName, const MillisecondsSince1970& notBefore, const MillisecondsSince1970& notAfter) { ptr_lib::shared_ptr<IdentityCertificate> certificate(new IdentityCertificate()); Name keyName = getKeyNameFromCertificatePrefix(certificatePrefix); Name certificateName = certificatePrefix; MillisecondsSince1970 ti = ::ndn_getNowMilliseconds(); // Get the number of seconds. ostringstream oss; oss << floor(ti / 1000.0); certificateName.append("ID-CERT").append(oss.str()); certificate->setName(certificateName); certificate->setNotBefore(notBefore); certificate->setNotAfter(notAfter); certificate->setPublicKeyInfo(publicKey); certificate->addSubjectDescription(CertificateSubjectDescription("2.5.4.41", keyName.toUri())); certificate->encode(); ptr_lib::shared_ptr<Sha256WithRsaSignature> sha256Sig(new Sha256WithRsaSignature()); KeyLocator keyLocator; keyLocator.setType(ndn_KeyLocatorType_KEYNAME); keyLocator.setKeyName(signerCertificateName); sha256Sig->setKeyLocator(keyLocator); sha256Sig->getPublisherPublicKeyDigest().setPublisherPublicKeyDigest(publicKey.getDigest()); certificate->setSignature(*sha256Sig); SignedBlob unsignedData = certificate->wireEncode(); ptr_lib::shared_ptr<IdentityCertificate> signerCertificate = getCertificate(signerCertificateName); Name signerkeyName = signerCertificate->getPublicKeyName(); Blob sigBits = privateKeyStorage_->sign(unsignedData, signerkeyName); sha256Sig->setSignature(sigBits); return certificate; }
/** * Loop to encode a data packet nIterations times using C++. * @param nIterations The number of iterations. * @param useComplex If true, use a large name, large content and all fields. If false, use a small name, small content * and only required fields. * @param useCrypto If true, sign the data packet. If false, use a blank signature. * @param encoding Set this to the wire encoding. * @return The number of seconds for all iterations. */ static double benchmarkEncodeDataSecondsCpp(int nIterations, bool useComplex, bool useCrypto, Blob& encoding) { Name name; Blob content; if (useComplex) { // Use a large name and content. name = Name("/ndn/ucla.edu/apps/lwndn-test/numbers.txt/%FD%05%05%E8%0C%CE%1D/%00"); ostringstream contentStream; int count = 1; contentStream << (count++); while (contentStream.str().length() < 1115) contentStream << " " << (count++); content = Blob((uint8_t*)contentStream.str().c_str(), contentStream.str().length()); } else { // Use a small name and content. name = Name("/test"); content = Blob((uint8_t*)"abc", 3); } Blob finalBlockId((uint8_t*)"\x00", 1); // Initialize the KeyChain storage in case useCrypto is true. ptr_lib::shared_ptr<MemoryIdentityStorage> identityStorage(new MemoryIdentityStorage()); ptr_lib::shared_ptr<MemoryPrivateKeyStorage> privateKeyStorage(new MemoryPrivateKeyStorage()); KeyChain keyChain (ptr_lib::make_shared<IdentityManager>(identityStorage, privateKeyStorage), ptr_lib::make_shared<SelfVerifyPolicyManager>(identityStorage.get())); Name keyName("/testname/DSK-123"); Name certificateName = keyName.getSubName(0, keyName.size() - 1).append("KEY").append (keyName.get(keyName.size() - 1)).append("ID-CERT").append("0"); privateKeyStorage->setKeyPairForKeyName (keyName, KEY_TYPE_RSA, DEFAULT_RSA_PUBLIC_KEY_DER, sizeof(DEFAULT_RSA_PUBLIC_KEY_DER), DEFAULT_RSA_PRIVATE_KEY_DER, sizeof(DEFAULT_RSA_PRIVATE_KEY_DER)); uint8_t signatureBitsArray[256]; memset(signatureBitsArray, 0, sizeof(signatureBitsArray)); Blob signatureBits(signatureBitsArray, sizeof(signatureBitsArray)); double start = getNowSeconds(); for (int i = 0; i < nIterations; ++i) { Data data(name); data.setContent(content); if (useComplex) { data.getMetaInfo().setFreshnessPeriod(1000); data.getMetaInfo().setFinalBlockId(finalBlockId); } if (useCrypto) // This sets the signature fields. keyChain.sign(data, certificateName); else { // Imitate IdentityManager::signByCertificate to set up the signature fields, but don't sign. KeyLocator keyLocator; keyLocator.setType(ndn_KeyLocatorType_KEYNAME); keyLocator.setKeyName(certificateName); Sha256WithRsaSignature* sha256Signature = (Sha256WithRsaSignature*)data.getSignature(); sha256Signature->setKeyLocator(keyLocator); sha256Signature->setSignature(signatureBits); } encoding = data.wireEncode(); } double finish = getNowSeconds(); return finish - start; }