Example usage for org.bouncycastle.bcpg.sig KeyFlags ENCRYPT_COMMS

List of usage examples for org.bouncycastle.bcpg.sig KeyFlags ENCRYPT_COMMS

Introduction

In this page you can find the example usage for org.bouncycastle.bcpg.sig KeyFlags ENCRYPT_COMMS.

Prototype

int ENCRYPT_COMMS

To view the source code for org.bouncycastle.bcpg.sig KeyFlags ENCRYPT_COMMS.

Click Source Link

Usage

From source file:com.google.e2e.bcdriver.Decryptor.java

License:Apache License

static final PGPPrivateKey extractDecryptionKey(PGPSecretKeyRing pskr, String pass) throws PGPException {
    Iterator<PGPSecretKey> skit = Util.getTypedIterator(pskr.getSecretKeys(), PGPSecretKey.class);

    PGPSecretKey selected = null;/*from   w  ww  .jav  a  2s .c  o  m*/

    // Pass #1 - use key flags on signatures.
    while (skit.hasNext()) {
        PGPSecretKey sk = skit.next();
        Iterator<PGPSignature> sigit = Util.getTypedIterator(sk.getPublicKey().getSignatures(),
                PGPSignature.class);
        while (sigit.hasNext()) {
            if (Util.hasKeyFlag(sigit.next(), KeyFlags.ENCRYPT_COMMS | KeyFlags.ENCRYPT_STORAGE)) {
                selected = sk;
                break;
            }
        }
    }
    if (selected == null) {
        // Pass #2 - use intrinsic key capabilities, but prefer subkeys
        // where possible.
        skit = Util.getTypedIterator(pskr.getSecretKeys(), PGPSecretKey.class);
        while (skit.hasNext()) {
            PGPSecretKey sk = skit.next();
            if (sk.getPublicKey().isEncryptionKey()) {
                selected = sk;
                // But continue the loop, so subkeys will be chosen.
            }
        }
    }

    if (selected != null) {
        return selected
                .extractPrivateKey(new BcPBESecretKeyDecryptorBuilder(new BcPGPDigestCalculatorProvider())
                        .build(pass.toCharArray()));
    } else {
        return null;
    }
}

From source file:keygenerator.KeyGenerator.java

public final static PGPKeyRingGenerator generateKeyRingGenerator(String id, char[] pass, int s2kcount)
        throws Exception {
    // This object generates individual key-pairs.
    RSAKeyPairGenerator kpg = new RSAKeyPairGenerator();

    // Boilerplate RSA parameters, no need to change anything
    // except for the RSA key-size (2048). You can use whatever
    // key-size makes sense for you -- 4096, etc.
    kpg.init(new RSAKeyGenerationParameters(BigInteger.valueOf(0x10001), new SecureRandom(), 2048, 12));

    // First create the master (signing) key with the generator.
    PGPKeyPair rsakp_sign = new BcPGPKeyPair(PGPPublicKey.RSA_SIGN, kpg.generateKeyPair(), new Date());
    // Then an encryption subkey.
    PGPKeyPair rsakp_enc = new BcPGPKeyPair(PGPPublicKey.RSA_ENCRYPT, kpg.generateKeyPair(), new Date());

    // Add a self-signature on the id
    PGPSignatureSubpacketGenerator signhashgen = new PGPSignatureSubpacketGenerator();

    // Add signed metadata on the signature.
    // 1) Declare its purpose
    signhashgen.setKeyFlags(false, KeyFlags.SIGN_DATA | KeyFlags.CERTIFY_OTHER);
    // 2) Set preferences for secondary crypto algorithms to use
    //    when sending messages to this key.
    signhashgen.setPreferredSymmetricAlgorithms(false, new int[] { SymmetricKeyAlgorithmTags.AES_256,
            SymmetricKeyAlgorithmTags.AES_192, SymmetricKeyAlgorithmTags.AES_128 });
    signhashgen.setPreferredHashAlgorithms(false, new int[] { HashAlgorithmTags.SHA256, HashAlgorithmTags.SHA1,
            HashAlgorithmTags.SHA384, HashAlgorithmTags.SHA512, HashAlgorithmTags.SHA224, });
    // 3) Request senders add additional checksums to the
    //    message (useful when verifying unsigned messages.)
    signhashgen.setFeature(false, Features.FEATURE_MODIFICATION_DETECTION);

    // Create a signature on the encryption subkey.
    PGPSignatureSubpacketGenerator enchashgen = new PGPSignatureSubpacketGenerator();
    // Add metadata to declare its purpose
    enchashgen.setKeyFlags(false, KeyFlags.ENCRYPT_COMMS | KeyFlags.ENCRYPT_STORAGE);

    // Objects used to encrypt the secret key.
    PGPDigestCalculator sha1Calc = new BcPGPDigestCalculatorProvider().get(HashAlgorithmTags.SHA1);
    PGPDigestCalculator sha256Calc = new BcPGPDigestCalculatorProvider().get(HashAlgorithmTags.SHA256);

    // bcpg 1.48 exposes this API that includes s2kcount. Earlier
    // versions use a default of 0x60.
    PBESecretKeyEncryptor pske = (new BcPBESecretKeyEncryptorBuilder(PGPEncryptedData.AES_256, sha256Calc,
            s2kcount)).build(pass);//  w  w  w  . jav a  2  s. com

    // Finally, create the keyring itself. The constructor
    // takes parameters that allow it to generate the self
    // signature.

    BcPGPContentSignerBuilder signerBuilder = new BcPGPContentSignerBuilder(
            rsakp_sign.getPublicKey().getAlgorithm(), HashAlgorithmTags.SHA1);

    PGPKeyRingGenerator keyRingGen;
    keyRingGen = new PGPKeyRingGenerator(PGPSignature.POSITIVE_CERTIFICATION, rsakp_sign, id, sha1Calc,
            signhashgen.generate(), null, signerBuilder, pske);

    // Add our encryption subkey, together with its signature.
    keyRingGen.addSubKey(rsakp_enc, enchashgen.generate(), null);
    return keyRingGen;
}

From source file:org.sufficientlysecure.keychain.operations.BackupOperationTest.java

License:Open Source License

@BeforeClass
public static void setUpOnce() throws Exception {
    Security.insertProviderAt(new BouncyCastleProvider(), 1);
    oldShadowStream = ShadowLog.stream;/*w w w .  ja  va  2  s. c om*/
    // ShadowLog.stream = System.out;

    PgpKeyOperation op = new PgpKeyOperation(null);

    {
        SaveKeyringParcel parcel = new SaveKeyringParcel();
        parcel.mAddSubKeys.add(new SaveKeyringParcel.SubkeyAdd(Algorithm.ECDSA, 0,
                SaveKeyringParcel.Curve.NIST_P256, KeyFlags.CERTIFY_OTHER, 0L));
        parcel.mAddSubKeys.add(new SaveKeyringParcel.SubkeyAdd(Algorithm.ECDSA, 0,
                SaveKeyringParcel.Curve.NIST_P256, KeyFlags.SIGN_DATA, 0L));
        parcel.mAddSubKeys.add(new SaveKeyringParcel.SubkeyAdd(Algorithm.ECDH, 0,
                SaveKeyringParcel.Curve.NIST_P256, KeyFlags.ENCRYPT_COMMS, 0L));
        parcel.mAddUserIds.add("snips");
        parcel.setNewUnlock(new ChangeUnlockParcel(mKeyPhrase1));

        PgpEditKeyResult result = op.createSecretKeyRing(parcel);
        assertTrue("initial test key creation must succeed", result.success());
        Assert.assertNotNull("initial test key creation must succeed", result.getRing());

        mStaticRing1 = result.getRing();
    }

    {
        SaveKeyringParcel parcel = new SaveKeyringParcel();
        parcel.mAddSubKeys.add(new SaveKeyringParcel.SubkeyAdd(Algorithm.ECDSA, 0,
                SaveKeyringParcel.Curve.NIST_P256, KeyFlags.CERTIFY_OTHER, 0L));
        parcel.mAddSubKeys.add(new SaveKeyringParcel.SubkeyAdd(Algorithm.ECDSA, 0,
                SaveKeyringParcel.Curve.NIST_P256, KeyFlags.SIGN_DATA, 0L));
        parcel.mAddSubKeys.add(new SaveKeyringParcel.SubkeyAdd(Algorithm.ECDH, 0,
                SaveKeyringParcel.Curve.NIST_P256, KeyFlags.ENCRYPT_COMMS, 0L));
        parcel.mAddUserIds.add("snails");
        parcel.setNewUnlock(new ChangeUnlockParcel(new Passphrase("1234")));

        PgpEditKeyResult result = op.createSecretKeyRing(parcel);
        assertTrue("initial test key creation must succeed", result.success());
        Assert.assertNotNull("initial test key creation must succeed", result.getRing());

        mStaticRing2 = result.getRing();
        mStaticRing2 = UncachedKeyRing.forTestingOnlyAddDummyLocalSignature(mStaticRing2, "1234");
    }

}

From source file:org.sufficientlysecure.keychain.operations.CertifyOperationTest.java

License:Open Source License

@BeforeClass
public static void setUpOnce() throws Exception {
    Security.insertProviderAt(new BouncyCastleProvider(), 1);
    oldShadowStream = ShadowLog.stream;//  w  ww  .  j  a  v a 2s. c om
    // ShadowLog.stream = System.out;

    Random random = new Random();

    PgpKeyOperation op = new PgpKeyOperation(null);

    {
        SaveKeyringParcel parcel = new SaveKeyringParcel();
        parcel.mAddSubKeys.add(new SaveKeyringParcel.SubkeyAdd(Algorithm.ECDSA, 0,
                SaveKeyringParcel.Curve.NIST_P256, KeyFlags.CERTIFY_OTHER, 0L));
        parcel.mAddSubKeys.add(new SaveKeyringParcel.SubkeyAdd(Algorithm.ECDSA, 0,
                SaveKeyringParcel.Curve.NIST_P256, KeyFlags.SIGN_DATA, 0L));
        parcel.mAddSubKeys.add(new SaveKeyringParcel.SubkeyAdd(Algorithm.ECDH, 0,
                SaveKeyringParcel.Curve.NIST_P256, KeyFlags.ENCRYPT_COMMS, 0L));
        parcel.mAddUserIds.add("derp");
        parcel.setNewUnlock(new ChangeUnlockParcel(mKeyPhrase1));

        PgpEditKeyResult result = op.createSecretKeyRing(parcel);
        Assert.assertTrue("initial test key creation must succeed", result.success());
        Assert.assertNotNull("initial test key creation must succeed", result.getRing());

        mStaticRing1 = result.getRing();
    }

    {
        SaveKeyringParcel parcel = new SaveKeyringParcel();
        parcel.mAddSubKeys.add(new SaveKeyringParcel.SubkeyAdd(Algorithm.ECDSA, 0,
                SaveKeyringParcel.Curve.NIST_P256, KeyFlags.CERTIFY_OTHER, 0L));
        parcel.mAddSubKeys.add(new SaveKeyringParcel.SubkeyAdd(Algorithm.ECDSA, 0,
                SaveKeyringParcel.Curve.NIST_P256, KeyFlags.SIGN_DATA, 0L));
        parcel.mAddSubKeys.add(new SaveKeyringParcel.SubkeyAdd(Algorithm.ECDH, 0,
                SaveKeyringParcel.Curve.NIST_P256, KeyFlags.ENCRYPT_COMMS, 0L));

        parcel.mAddUserIds.add("ditz");
        byte[] uatdata = new byte[random.nextInt(150) + 10];
        random.nextBytes(uatdata);
        parcel.mAddUserAttribute.add(WrappedUserAttribute.fromSubpacket(random.nextInt(100) + 1, uatdata));

        parcel.setNewUnlock(new ChangeUnlockParcel(mKeyPhrase2));

        PgpEditKeyResult result = op.createSecretKeyRing(parcel);
        Assert.assertTrue("initial test key creation must succeed", result.success());
        Assert.assertNotNull("initial test key creation must succeed", result.getRing());

        mStaticRing2 = result.getRing();
    }

}

From source file:org.sufficientlysecure.keychain.operations.ExportTest.java

License:Open Source License

@BeforeClass
public static void setUpOnce() throws Exception {
    Security.insertProviderAt(new BouncyCastleProvider(), 1);
    oldShadowStream = ShadowLog.stream;// w  ww.  j  a va 2  s .  c  om
    // ShadowLog.stream = System.out;

    PgpKeyOperation op = new PgpKeyOperation(null);

    {
        SaveKeyringParcel parcel = new SaveKeyringParcel();
        parcel.mAddSubKeys.add(new SaveKeyringParcel.SubkeyAdd(Algorithm.ECDSA, 0,
                SaveKeyringParcel.Curve.NIST_P256, KeyFlags.CERTIFY_OTHER, 0L));
        parcel.mAddSubKeys.add(new SaveKeyringParcel.SubkeyAdd(Algorithm.ECDSA, 0,
                SaveKeyringParcel.Curve.NIST_P256, KeyFlags.SIGN_DATA, 0L));
        parcel.mAddSubKeys.add(new SaveKeyringParcel.SubkeyAdd(Algorithm.ECDH, 0,
                SaveKeyringParcel.Curve.NIST_P256, KeyFlags.ENCRYPT_COMMS, 0L));
        parcel.mAddUserIds.add("snips");
        parcel.mNewUnlock = new ChangeUnlockParcel(mKeyPhrase1);

        PgpEditKeyResult result = op.createSecretKeyRing(parcel);
        assertTrue("initial test key creation must succeed", result.success());
        Assert.assertNotNull("initial test key creation must succeed", result.getRing());

        mStaticRing1 = result.getRing();
    }

    {
        SaveKeyringParcel parcel = new SaveKeyringParcel();
        parcel.mAddSubKeys.add(new SaveKeyringParcel.SubkeyAdd(Algorithm.ECDSA, 0,
                SaveKeyringParcel.Curve.NIST_P256, KeyFlags.CERTIFY_OTHER, 0L));
        parcel.mAddSubKeys.add(new SaveKeyringParcel.SubkeyAdd(Algorithm.ECDSA, 0,
                SaveKeyringParcel.Curve.NIST_P256, KeyFlags.SIGN_DATA, 0L));
        parcel.mAddSubKeys.add(new SaveKeyringParcel.SubkeyAdd(Algorithm.ECDH, 0,
                SaveKeyringParcel.Curve.NIST_P256, KeyFlags.ENCRYPT_COMMS, 0L));
        parcel.mAddUserIds.add("snails");
        parcel.mNewUnlock = new ChangeUnlockParcel(new Passphrase("1234"));

        PgpEditKeyResult result = op.createSecretKeyRing(parcel);
        assertTrue("initial test key creation must succeed", result.success());
        Assert.assertNotNull("initial test key creation must succeed", result.getRing());

        mStaticRing2 = result.getRing();
        mStaticRing2 = UncachedKeyRing.forTestingOnlyAddDummyLocalSignature(mStaticRing2, "1234");
    }

}

From source file:org.sufficientlysecure.keychain.operations.PromoteKeyOperationTest.java

License:Open Source License

@BeforeClass
public static void setUpOnce() throws Exception {
    Security.insertProviderAt(new BouncyCastleProvider(), 1);
    oldShadowStream = ShadowLog.stream;//from  www.j a  v  a 2  s . c  o m
    // ShadowLog.stream = System.out;

    PgpKeyOperation op = new PgpKeyOperation(null);

    {
        SaveKeyringParcel parcel = new SaveKeyringParcel();
        parcel.mAddSubKeys.add(new SaveKeyringParcel.SubkeyAdd(Algorithm.ECDSA, 0,
                SaveKeyringParcel.Curve.NIST_P256, KeyFlags.CERTIFY_OTHER, 0L));
        parcel.mAddSubKeys.add(new SaveKeyringParcel.SubkeyAdd(Algorithm.ECDSA, 0,
                SaveKeyringParcel.Curve.NIST_P256, KeyFlags.SIGN_DATA, 0L));
        parcel.mAddSubKeys.add(new SaveKeyringParcel.SubkeyAdd(Algorithm.ECDH, 0,
                SaveKeyringParcel.Curve.NIST_P256, KeyFlags.ENCRYPT_COMMS, 0L));
        parcel.mAddUserIds.add("derp");
        parcel.setNewUnlock(new ChangeUnlockParcel(mKeyPhrase1));

        PgpEditKeyResult result = op.createSecretKeyRing(parcel);
        Assert.assertTrue("initial test key creation must succeed", result.success());
        Assert.assertNotNull("initial test key creation must succeed", result.getRing());

        mStaticRing = result.getRing();
    }

}

From source file:org.sufficientlysecure.keychain.pgp.CanonicalizedPublicKey.java

License:Open Source License

public boolean canEncrypt() {
    // if key flags subpacket is available, honor it!
    if (getKeyUsage() != 0) {
        return (getKeyUsage() & (KeyFlags.ENCRYPT_COMMS | KeyFlags.ENCRYPT_STORAGE)) != 0;
    }/*from   w w w  .  jav a  2  s .co  m*/

    // RSA_GENERAL, RSA_ENCRYPT, ELGAMAL_ENCRYPT, ELGAMAL_GENERAL, ECDH
    if (UncachedKeyRing.isEncryptionAlgo(mPublicKey.getAlgorithm())) {
        return true;
    }

    return false;
}

From source file:org.sufficientlysecure.keychain.pgp.PgpEncryptDecryptTest.java

License:Open Source License

@BeforeClass
public static void setUpOnce() throws Exception {
    Security.insertProviderAt(new BouncyCastleProvider(), 1);
    oldShadowStream = ShadowLog.stream;// www.j  av a2 s  .  co m
    // ShadowLog.stream = System.out;

    PgpKeyOperation op = new PgpKeyOperation(null);

    {
        SaveKeyringParcel parcel = new SaveKeyringParcel();
        parcel.mAddSubKeys.add(new SaveKeyringParcel.SubkeyAdd(Algorithm.ECDSA, 0,
                SaveKeyringParcel.Curve.NIST_P256, KeyFlags.CERTIFY_OTHER, 0L));
        parcel.mAddSubKeys.add(new SaveKeyringParcel.SubkeyAdd(Algorithm.ECDSA, 0,
                SaveKeyringParcel.Curve.NIST_P256, KeyFlags.SIGN_DATA, 0L));
        parcel.mAddSubKeys.add(new SaveKeyringParcel.SubkeyAdd(Algorithm.ECDH, 0,
                SaveKeyringParcel.Curve.NIST_P256, KeyFlags.ENCRYPT_COMMS, 0L));
        parcel.mAddSubKeys.add(new SaveKeyringParcel.SubkeyAdd(Algorithm.ECDH, 0,
                SaveKeyringParcel.Curve.NIST_P256, KeyFlags.ENCRYPT_COMMS, 0L));
        parcel.mAddUserIds.add("bloom");
        parcel.setNewUnlock(new ChangeUnlockParcel(mKeyPhrase1));

        PgpEditKeyResult result = op.createSecretKeyRing(parcel);
        Assert.assertTrue("initial test key creation must succeed", result.success());
        Assert.assertNotNull("initial test key creation must succeed", result.getRing());

        mStaticRing1 = result.getRing();
    }

    {
        SaveKeyringParcel parcel = new SaveKeyringParcel();
        parcel.mAddSubKeys.add(new SaveKeyringParcel.SubkeyAdd(Algorithm.ECDSA, 0,
                SaveKeyringParcel.Curve.NIST_P256, KeyFlags.CERTIFY_OTHER, 0L));
        parcel.mAddSubKeys.add(new SaveKeyringParcel.SubkeyAdd(Algorithm.ECDSA, 0,
                SaveKeyringParcel.Curve.NIST_P256, KeyFlags.SIGN_DATA, 0L));
        parcel.mAddSubKeys.add(new SaveKeyringParcel.SubkeyAdd(Algorithm.ECDH, 0,
                SaveKeyringParcel.Curve.NIST_P256, KeyFlags.ENCRYPT_COMMS, 0L));
        parcel.mAddUserIds.add("belle");
        parcel.setNewUnlock(new ChangeUnlockParcel(mKeyPhrase2));

        PgpEditKeyResult result = op.createSecretKeyRing(parcel);
        Assert.assertTrue("initial test key creation must succeed", result.success());
        Assert.assertNotNull("initial test key creation must succeed", result.getRing());

        mStaticRing2 = result.getRing();
    }

    //        {
    //            // insecure (1024 bit) RSA key
    //            SaveKeyringParcel parcel = new SaveKeyringParcel();
    //            parcel.mAddSubKeys.add(new SaveKeyringParcel.SubkeyAdd(
    //                    Algorithm.RSA, 1024, null, KeyFlags.CERTIFY_OTHER, 0L));
    //            parcel.mAddSubKeys.add(new SaveKeyringParcel.SubkeyAdd(
    //                    Algorithm.RSA, 1024, null, KeyFlags.SIGN_DATA, 0L));
    //            parcel.mAddSubKeys.add(new SaveKeyringParcel.SubkeyAdd(
    //                    Algorithm.RSA, 1024, null, KeyFlags.ENCRYPT_COMMS, 0L));
    //            parcel.mAddUserIds.add("eve");
    //            parcel.mNewUnlock = new ChangeUnlockParcel(mKeyPhraseInsecure);
    //
    //            PgpEditKeyResult result = op.createSecretKeyRing(parcel);
    //            Assert.assertTrue("initial test key creation must succeed", result.success());
    //            Assert.assertNotNull("initial test key creation must succeed", result.getRing());
    //
    //            mStaticRingInsecure = result.getRing();
    //        }

}

From source file:org.sufficientlysecure.keychain.pgp.PgpKeyOperationTest.java

License:Open Source License

@BeforeClass
public static void setUpOnce() throws Exception {
    Security.insertProviderAt(new BouncyCastleProvider(), 1);
    ShadowLog.stream = System.out;

    SaveKeyringParcel parcel = new SaveKeyringParcel();
    parcel.mAddSubKeys.add(new SaveKeyringParcel.SubkeyAdd(Algorithm.ECDSA, 0,
            SaveKeyringParcel.Curve.NIST_P256, KeyFlags.CERTIFY_OTHER, 0L));
    parcel.mAddSubKeys.add(new SaveKeyringParcel.SubkeyAdd(Algorithm.ECDSA, 0,
            SaveKeyringParcel.Curve.NIST_P256, KeyFlags.SIGN_DATA, 0L));
    parcel.mAddSubKeys.add(new SaveKeyringParcel.SubkeyAdd(Algorithm.ECDH, 0, SaveKeyringParcel.Curve.NIST_P256,
            KeyFlags.ENCRYPT_COMMS, 0L));

    parcel.mAddUserIds.add("twi");
    parcel.mAddUserIds.add("pink");

    {/*w  w  w  .  j a  va2s.  com*/
        int type = 42;
        byte[] data = new byte[] { 0, 1, 2, 3, 4 };
        WrappedUserAttribute uat = WrappedUserAttribute.fromSubpacket(type, data);
        parcel.mAddUserAttribute.add(uat);
    }

    parcel.setNewUnlock(new ChangeUnlockParcel(passphrase));
    PgpKeyOperation op = new PgpKeyOperation(null);

    PgpEditKeyResult result = op.createSecretKeyRing(parcel);
    Assert.assertTrue("initial test key creation must succeed", result.success());
    Assert.assertNotNull("initial test key creation must succeed", result.getRing());

    staticRing = result.getRing();
    staticRing = staticRing.canonicalize(new OperationLog(), 0).getUncachedKeyRing();

    // we sleep here for a second, to make sure all new certificates have different timestamps
    Thread.sleep(1000);

    cryptoInput = new CryptoInputParcel(new Date(), passphrase);

}

From source file:org.sufficientlysecure.keychain.pgp.PgpKeyOperationTest.java

License:Open Source License

@Test
public void testCreatedKey() throws Exception {

    // an empty modification should change nothing. this also ensures the keyring
    // is constant through canonicalization.
    // applyModificationWithChecks(parcel, ring, onlyA, onlyB);

    Assert.assertNotNull("key creation failed", ring);

    Assert.assertNull("primary user id must be empty", ring.getPublicKey().getPrimaryUserId());

    Assert.assertEquals("number of user ids must be two", 2, ring.getPublicKey().getUnorderedUserIds().size());

    ArrayList<WrappedUserAttribute> attributes = ring.getPublicKey().getUnorderedUserAttributes();
    Assert.assertEquals("number of user attributes must be one", 1, attributes.size());
    Assert.assertEquals("user attribute must be correct type", 42, attributes.get(0).getType());
    Assert.assertEquals("user attribute must have one subpacket", 1, attributes.get(0).getSubpackets().length);
    Assert.assertArrayEquals("user attribute must have correct data", new byte[] { 0, 1, 2, 3, 4 },
            attributes.get(0).getSubpackets()[0]);

    List<UncachedPublicKey> subkeys = KeyringTestingHelper.itToList(ring.getPublicKeys());
    Assert.assertEquals("number of subkeys must be three", 3, subkeys.size());

    Assert.assertTrue("key ring should have been created in the last 360 seconds",
            ring.getPublicKey().getCreationTime().after(new Date(new Date().getTime() - 1000 * 360)));

    Assert.assertNull("key ring should not expire", ring.getPublicKey().getUnsafeExpiryTimeForTesting());

    Assert.assertEquals("first (master) key can certify", KeyFlags.CERTIFY_OTHER,
            (long) subkeys.get(0).getKeyUsage());

    Assert.assertEquals("second key can sign", KeyFlags.SIGN_DATA, (long) subkeys.get(1).getKeyUsage());
    ArrayList<WrappedSignature> sigs = subkeys.get(1).getSignatures().next().getEmbeddedSignatures();
    Assert.assertEquals("signing key signature should have one embedded signature", 1, sigs.size());
    Assert.assertEquals("embedded signature should be of primary key binding type",
            PGPSignature.PRIMARYKEY_BINDING, sigs.get(0).getSignatureType());
    Assert.assertEquals("primary key binding signature issuer should be signing subkey",
            subkeys.get(1).getKeyId(), sigs.get(0).getKeyId());

    Assert.assertEquals("third key can encrypt", KeyFlags.ENCRYPT_COMMS, (long) subkeys.get(2).getKeyUsage());

}