public void testUnlimitedRecords()
        {
            fixture_ = new ValidationPolicyCommandInterestFixture(
                new ValidationPolicyCommandInterest.Options(15 * 1000.0d, -1));

            ArrayList <PibIdentity> identities = new ArrayList <PibIdentity>();

            for (int i = 0; i < 20; ++i)
            {
                PibIdentity identity = fixture_.addSubCertificate(new Name(
                                                                      "/Security/V2/ValidatorFixture/Sub" + i),
                                                                  fixture_.identity_);
                fixture_.cache_.insert(identity.getDefaultKey()
                                       .getDefaultCertificate());
                ILOG.J2CsMapping.Collections.Collections.Add(identities, identity);
            }

            // Signed at 0 seconds.
            Interest interest1 = fixture_.makeCommandInterest(identities[0]);

            fixture_.setNowOffsetMilliseconds(1 * 1000.0d);
            for (int i_0 = 0; i_0 < 20; ++i_0)
            {
                // Signed at +1 seconds.
                Interest interest2 = fixture_
                                     .makeCommandInterest(identities[i_0]);

                validateExpectSuccess(interest2, "Should succeed");
            }

            validateExpectFailure(interest1, "Should fail (timestamp reorder)");
        }
 /// <summary>
 /// Save the identity's certificate to a file.
 /// </summary>
 ///
 /// <param name="identity">The PibIdentity.</param>
 /// <param name="filePath">The file path, which should be writable.</param>
 /// <returns>True if successful.</returns>
 public bool saveCertificate(PibIdentity identity, String filePath)
 {
     try {
         CertificateV2 certificate = identity.getDefaultKey()
                                     .getDefaultCertificate();
         return(saveCertificateToFile(certificate, filePath));
     } catch (Pib.Error ex) {
         return(false);
     }
 }
        public void testFindByInterest()
        {
            anchorContainer.insert("group1", certificatePath1.FullName,
                                   400.0d);
            Interest interest = new Interest(identity1.getName());

            Assert.AssertTrue(anchorContainer.find(interest) != null);
            Interest interest1 = new Interest(identity1.getName().getPrefix(-1));

            Assert.AssertTrue(anchorContainer.find(interest1) != null);
            Interest interest2 = new Interest(
                new Name(identity1.getName()).appendVersion(1));

            Assert.AssertTrue(anchorContainer.find(interest2) == null);

            CertificateV2 certificate3 = fixture.addCertificate(
                identity1.getDefaultKey(), "3");
            CertificateV2 certificate4 = fixture.addCertificate(
                identity1.getDefaultKey(), "4");
            CertificateV2 certificate5 = fixture.addCertificate(
                identity1.getDefaultKey(), "5");

            CertificateV2 certificate3Copy = new CertificateV2(certificate3);

            anchorContainer.insert("group2", certificate3Copy);
            anchorContainer.insert("group3", certificate4);
            anchorContainer.insert("group4", certificate5);

            Interest      interest3        = new Interest(certificate3.getKeyName());
            CertificateV2 foundCertificate = anchorContainer.find(interest3);

            Assert.AssertTrue(foundCertificate != null);
            Assert.AssertTrue(interest3.getName().isPrefixOf(foundCertificate.getName()));
            Assert.AssertTrue(certificate3.getName().equals(foundCertificate.getName()));

            interest3.getExclude().appendComponent(
                certificate3.getName().get(net.named_data.jndn.security.v2.CertificateV2.ISSUER_ID_OFFSET));
            foundCertificate = anchorContainer.find(interest3);
            Assert.AssertTrue(foundCertificate != null);
            Assert.AssertTrue(interest3.getName().isPrefixOf(foundCertificate.getName()));
            Assert.AssertTrue(!foundCertificate.getName().equals(certificate3.getName()));
        }
        public void testLimitedRecords()
        {
            fixture_ = new ValidationPolicyCommandInterestFixture(
                new ValidationPolicyCommandInterest.Options(15 * 1000.0d, 3));

            PibIdentity identity1 = fixture_.addSubCertificate(new Name(
                                                                   "/Security/V2/ValidatorFixture/Sub1"), fixture_.identity_);

            fixture_.cache_.insert(identity1.getDefaultKey()
                                   .getDefaultCertificate());
            PibIdentity identity2 = fixture_.addSubCertificate(new Name(
                                                                   "/Security/V2/ValidatorFixture/Sub2"), fixture_.identity_);

            fixture_.cache_.insert(identity2.getDefaultKey()
                                   .getDefaultCertificate());
            PibIdentity identity3 = fixture_.addSubCertificate(new Name(
                                                                   "/Security/V2/ValidatorFixture/Sub3"), fixture_.identity_);

            fixture_.cache_.insert(identity3.getDefaultKey()
                                   .getDefaultCertificate());
            PibIdentity identity4 = fixture_.addSubCertificate(new Name(
                                                                   "/Security/V2/ValidatorFixture/Sub4"), fixture_.identity_);

            fixture_.cache_.insert(identity4.getDefaultKey()
                                   .getDefaultCertificate());

            Interest interest1 = fixture_.makeCommandInterest(identity2);
            Interest interest2 = fixture_.makeCommandInterest(identity3);
            Interest interest3 = fixture_.makeCommandInterest(identity4);
            // Signed at 0 seconds.
            Interest interest00 = fixture_.makeCommandInterest(identity1);

            // Signed at +1 seconds.
            fixture_.setNowOffsetMilliseconds(1 * 1000.0d);
            Interest interest01 = fixture_.makeCommandInterest(identity1);

            // Signed at +2 seconds.
            fixture_.setNowOffsetMilliseconds(2 * 1000.0d);
            Interest interest02 = fixture_.makeCommandInterest(identity1);

            validateExpectSuccess(interest00, "Should succeed");

            validateExpectSuccess(interest02, "Should succeed");

            validateExpectSuccess(interest1, "Should succeed");

            validateExpectSuccess(interest2, "Should succeed");

            validateExpectSuccess(interest3, "Should succeed, forgets identity1");

            validateExpectSuccess(
                interest01,
                "Should succeed despite timestamp is reordered, because the record has been evicted");
        }
        /// <summary>
        /// Create an AccessManagerV2 to serve the NAC public key for other data
        /// producers to fetch, and to serve encrypted versions of the private keys
        /// (as safe bags) for authorized consumers to fetch.
        /// KEK and KDK naming:
        /// [identity]/NAC/[dataset]/KEK            /[key-id]                           (== KEK, public key)
        /// [identity]/NAC/[dataset]/KDK/[key-id]   /ENCRYPTED-BY/[user]/KEY/[key-id]   (== KDK, encrypted private key)
        /// \_____________  ______________/
        /// \/
        /// registered with NFD
        /// </summary>
        ///
        /// <param name="identity"></param>
        /// <param name="dataset">The name of dataset that this manager is controlling.</param>
        /// <param name="keyChain">The KeyChain used to sign Data packets.</param>
        /// <param name="face"></param>
        public AccessManagerV2(PibIdentity identity, Name dataset,
                               KeyChain keyChain, Face face)
        {
            this.storage_ = new InMemoryStorageRetaining();
            identity_     = identity;
            keyChain_     = keyChain;
            face_         = face;

            // The NAC identity is: <identity>/NAC/<dataset>
            // Generate the NAC key.
            PibIdentity nacIdentity = keyChain_.createIdentityV2(
                new Name(identity.getName()).append(
                    net.named_data.jndn.encrypt.EncryptorV2.NAME_COMPONENT_NAC).append(dataset),
                new RsaKeyParams());

            nacKey_ = nacIdentity.getDefaultKey();
            if (nacKey_.getKeyType() != net.named_data.jndn.security.KeyType.RSA)
            {
                logger_.log(ILOG.J2CsMapping.Util.Logging.Level.INFO,
                            "Cannot re-use existing KEK/KDK pair, as it is not an RSA key, regenerating");
                nacKey_ = keyChain_.createKey(nacIdentity, new RsaKeyParams());
            }
            Name.Component nacKeyId = nacKey_.getName().get(-1);

            Name kekPrefix = new Name(nacKey_.getIdentityName())
                             .append(net.named_data.jndn.encrypt.EncryptorV2.NAME_COMPONENT_KEK);

            Data kekData = new Data(nacKey_.getDefaultCertificate());

            kekData.setName(new Name(kekPrefix).append(nacKeyId));
            kekData.getMetaInfo().setFreshnessPeriod(
                DEFAULT_KEK_FRESHNESS_PERIOD_MS);
            keyChain_.sign(kekData, new SigningInfo(identity_));
            // A KEK looks like a certificate, but doesn't have a ValidityPeriod.
            storage_.insert(kekData);

            OnInterestCallback serveFromStorage = new AccessManagerV2.Anonymous_C1(this);

            OnRegisterFailed onRegisterFailed = new AccessManagerV2.Anonymous_C0();

            kekRegisteredPrefixId_ = face_.registerPrefix(kekPrefix,
                                                          serveFromStorage, onRegisterFailed);

            Name kdkPrefix = new Name(nacKey_.getIdentityName()).append(
                net.named_data.jndn.encrypt.EncryptorV2.NAME_COMPONENT_KDK).append(nacKeyId);

            kdkRegisteredPrefixId_ = face_.registerPrefix(kdkPrefix,
                                                          serveFromStorage, onRegisterFailed);
        }
        /// <summary>
        /// Issue a certificate for subIdentityName signed by issuer. If the identity
        /// does not exist, it is created. A new key is generated as the default key
        /// for the identity. A default certificate for the key is signed by the
        /// issuer using its default certificate.
        /// </summary>
        ///
        /// <param name="subIdentityName">The name to issue the certificate for.</param>
        /// <param name="issuer">The identity of the signer.</param>
        /// <param name="params"></param>
        /// <returns>The sub identity.</returns>
        internal PibIdentity addSubCertificate(Name subIdentityName, PibIdentity issuer,
                                               KeyParams paras)
        {
            PibIdentity subIdentity = addIdentity(subIdentityName, paras);

            CertificateV2 request = subIdentity.getDefaultKey()
                                    .getDefaultCertificate();

            request.setName(request.getKeyName().append("parent").appendVersion(1));

            SigningInfo certificateParams = new SigningInfo(issuer);
            // Validity period of 20 years.
            double now = net.named_data.jndn.util.Common.getNowMilliseconds();

            certificateParams.setValidityPeriod(new ValidityPeriod(now, now + 20
                                                                   * 365 * 24 * 3600 * 1000.0d));

            // Skip the AdditionalDescription.

            keyChain_.sign(request, certificateParams);
            keyChain_.setDefaultCertificate(subIdentity.getDefaultKey(), request);

            return(subIdentity);
        }
        public void setUp()
        {
            anchorContainer = new TrustAnchorContainer();
            fixture         = new IdentityManagementFixture();

            // Create a directory and prepares two certificates.
            certificateDirectoryPath = new FileInfo(System.IO.Path.Combine(net.named_data.jndn.tests.integration_tests.IntegrationTestsCommon.getPolicyConfigDirectory().FullName, "test-cert-dir"));
            System.IO.Directory.CreateDirectory(certificateDirectoryPath.FullName);

            certificatePath1 = new FileInfo(System.IO.Path.Combine(certificateDirectoryPath.FullName, "trust-anchor-1.cert"));
            certificatePath2 = new FileInfo(System.IO.Path.Combine(certificateDirectoryPath.FullName, "trust-anchor-2.cert"));

            identity1    = fixture.addIdentity(new Name("/TestAnchorContainer/First"));
            certificate1 = identity1.getDefaultKey().getDefaultCertificate();
            fixture.saveCertificateToFile(certificate1,
                                          certificatePath1.FullName);

            identity2 = fixture
                        .addIdentity(new Name("/TestAnchorContainer/Second"));
            certificate2 = identity2.getDefaultKey().getDefaultCertificate();
            fixture.saveCertificateToFile(certificate2,
                                          certificatePath2.FullName);
        }
Exemple #8
0
        public void testManagement()
        {
            Name identityName  = new Name("/test/id");
            Name identity2Name = new Name("/test/id2");

            Assert.AssertEquals(0, fixture_.keyChain_.getPib().getIdentities_().size());
            try {
                fixture_.keyChain_.getPib().getDefaultIdentity();
                Assert.Fail("Did not throw the expected exception");
            } catch (Pib.Error ex) {
            } catch (Exception ex_0) {
                Assert.Fail("Did not throw the expected exception");
            }

            // Create an identity.
            PibIdentity id = fixture_.keyChain_.createIdentityV2(identityName);

            Assert.AssertTrue(id != null);
            Assert.AssertTrue(fixture_.keyChain_.getPib().getIdentities_()
                              .getIdentities_().Contains(identityName));

            // The first added identity becomes the default identity.
            try {
                fixture_.keyChain_.getPib().getDefaultIdentity();
            } catch (Exception ex_1) {
                Assert.Fail("Unexpected exception: " + ex_1.Message);
            }

            // The default key of the added identity must exist.
            PibKey key = null;

            try {
                key = id.getDefaultKey();
            } catch (Exception ex_2) {
                Assert.Fail("Unexpected exception: " + ex_2.Message);
            }

            // The default certificate of the default key must exist.
            try {
                key.getDefaultCertificate();
            } catch (Exception ex_3) {
                Assert.Fail("Unexpected exception: " + ex_3.Message);
            }

            // Delete the key.
            Name key1Name = key.getName();

            try {
                id.getKey(key1Name);
            } catch (Exception ex_4) {
                Assert.Fail("Unexpected exception: " + ex_4.Message);
            }

            Assert.AssertEquals(1, id.getKeys_().size());
            fixture_.keyChain_.deleteKey(id, key);

            /* TODO: Implement key validity.
             *  // The key instance should not be valid anymore.
             *  assertTrue(!key);
             */

            try {
                id.getKey(key1Name);
                Assert.Fail("Did not throw the expected exception");
            } catch (Pib.Error ex_5) {
            } catch (Exception ex_6) {
                Assert.Fail("Did not throw the expected exception");
            }

            Assert.AssertEquals(0, id.getKeys_().size());

            // Create another key.
            fixture_.keyChain_.createKey(id);
            // The added key becomes the default key.
            try {
                id.getDefaultKey();
            } catch (Exception ex_7) {
                Assert.Fail("Unexpected exception: " + ex_7.Message);
            }

            PibKey key2 = id.getDefaultKey();

            Assert.AssertTrue(key2 != null);
            Assert.AssertTrue(!key2.getName().equals(key1Name));
            Assert.AssertEquals(1, id.getKeys_().size());
            try {
                key2.getDefaultCertificate();
            } catch (Exception ex_8) {
                Assert.Fail("Unexpected exception: " + ex_8.Message);
            }

            // Create a third key.
            PibKey key3 = fixture_.keyChain_.createKey(id);

            Assert.AssertTrue(!key3.getName().equals(key2.getName()));
            // The added key will not be the default key, because the default key already exists.
            Assert.AssertTrue(id.getDefaultKey().getName().equals(key2.getName()));
            Assert.AssertEquals(2, id.getKeys_().size());
            try {
                key3.getDefaultCertificate();
            } catch (Exception ex_9) {
                Assert.Fail("Unexpected exception: " + ex_9.Message);
            }

            // Delete the certificate.
            Assert.AssertEquals(1, key3.getCertificates_().size());
            CertificateV2 key3Cert1 = (CertificateV2)ILOG.J2CsMapping.Collections.Collections.ToArray(key3.getCertificates_()
                                                                                                      .getCertificates_().Values)[0];
            Name key3CertName = key3Cert1.getName();

            fixture_.keyChain_.deleteCertificate(key3, key3CertName);
            Assert.AssertEquals(0, key3.getCertificates_().size());
            try {
                key3.getDefaultCertificate();
                Assert.Fail("Did not throw the expected exception");
            } catch (Pib.Error ex_10) {
            } catch (Exception ex_11) {
                Assert.Fail("Did not throw the expected exception");
            }

            // Add a certificate.
            fixture_.keyChain_.addCertificate(key3, key3Cert1);
            Assert.AssertEquals(1, key3.getCertificates_().size());
            try {
                key3.getDefaultCertificate();
            } catch (Exception ex_12) {
                Assert.Fail("Unexpected exception: " + ex_12.Message);
            }

            // Overwriting the certificate should work.
            fixture_.keyChain_.addCertificate(key3, key3Cert1);
            Assert.AssertEquals(1, key3.getCertificates_().size());
            // Add another certificate.
            CertificateV2 key3Cert2     = new CertificateV2(key3Cert1);
            Name          key3Cert2Name = new Name(key3.getName());

            key3Cert2Name.append("Self");
            key3Cert2Name.appendVersion(1);
            key3Cert2.setName(key3Cert2Name);
            fixture_.keyChain_.addCertificate(key3, key3Cert2);
            Assert.AssertEquals(2, key3.getCertificates_().size());

            // Set the default certificate.
            Assert.AssertTrue(key3.getDefaultCertificate().getName().equals(key3CertName));
            fixture_.keyChain_.setDefaultCertificate(key3, key3Cert2);
            Assert.AssertTrue(key3.getDefaultCertificate().getName().equals(key3Cert2Name));

            // Set the default key.
            Assert.AssertTrue(id.getDefaultKey().getName().equals(key2.getName()));
            fixture_.keyChain_.setDefaultKey(id, key3);
            Assert.AssertTrue(id.getDefaultKey().getName().equals(key3.getName()));

            // Set the default identity.
            PibIdentity id2 = fixture_.keyChain_.createIdentityV2(identity2Name);

            Assert.AssertTrue(fixture_.keyChain_.getPib().getDefaultIdentity().getName()
                              .equals(id.getName()));
            fixture_.keyChain_.setDefaultIdentity(id2);
            Assert.AssertTrue(fixture_.keyChain_.getPib().getDefaultIdentity().getName()
                              .equals(id2.getName()));

            // Delete an identity.
            fixture_.keyChain_.deleteIdentity(id);

            /* TODO: Implement identity validity.
             *  // The identity instance should not be valid any more.
             *  BOOST_CHECK(!id);
             */
            try {
                fixture_.keyChain_.getPib().getIdentity(identityName);
                Assert.Fail("Did not throw the expected exception");
            } catch (Pib.Error ex_13) {
            } catch (Exception ex_14) {
                Assert.Fail("Did not throw the expected exception");
            }

            Assert.AssertTrue(!fixture_.keyChain_.getPib().getIdentities_()
                              .getIdentities_().Contains(identityName));
        }