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

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

Introduction

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

Prototype

int SIGN_DATA

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

Click Source Link

Usage

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

License:Apache License

private static final void maybeAddSubkey(List<Subkey> subkeys, PGPPublicKey masterpk, PGPPublicKey subkey,
        StringBuilder errors) throws PGPException, SignatureException, IOException {

    Iterator<PGPSignature> sigit = Util.getTypedIterator(subkey.getSignatures(), PGPSignature.class);
    if (sigit == null) {
        errors.append("Reject subkey " + nicePk(subkey) + " because no binding signatures were found.\n");
        return;//from  ww w .j av  a2s .c o  m
    }

    PGPSignature validSig = null;
    long validTs = -1L;

    while (sigit.hasNext()) {
        PGPSignature sig = sigit.next();
        switch (sig.getSignatureType()) {
        case PGPSignature.SUBKEY_BINDING:
        case PGPSignature.SUBKEY_REVOCATION:
            if (isGoodSubkeySignature(sig, masterpk, subkey, errors)) {
                if (sig.getSignatureType() == PGPSignature.SUBKEY_REVOCATION) {
                    // Reject this subkey permanently.
                    errors.append("Subkey " + nicePk(subkey) + " revoked by " + niceSig(sig) + "\n");
                    return;
                }
                // signing subkeys must have an embedded back signature.
                if (!Util.hasKeyFlag(sig, KeyFlags.SIGN_DATA)
                        || isGoodBackSignature(sig, masterpk, subkey, errors)) {
                    long ts = getSignatureTimestamp(sig, errors);
                    if (ts > validTs) {
                        validSig = sig;
                        validTs = ts;
                    }
                }
            }
            break;

        default:
            errors.append("Ignore " + niceSig(sig) + " for subkey " + nicePk(subkey) + "\n");
            break;
        }
    }
    // We need atleast one good binding.
    if (validSig == null) {
        errors.append(
                "Subkey " + nicePk(subkey) + " rejected because no valid binding signatures were found.\n");
        return;
    }
    subkeys.add(new Subkey(subkey, validSig));
}

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);//from  ww  w.  jav a2  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;//from   ww  w . ja  v  a2s .  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("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;//from   www . j  a v  a 2 s.  c  o  m
    // 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;/*from   w  w w  .j  av a 2  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.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   w w  w  .  java2  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 canSign() {
    // if key flags subpacket is available, honor it!
    if (getKeyUsage() != 0) {
        return (getKeyUsage() & KeyFlags.SIGN_DATA) != 0;
    }/*from w w w.  j  av  a 2 s  .  co  m*/

    if (UncachedKeyRing.isSigningAlgo(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;/* ww  w.j ava  2 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.PgpKeyOperation.java

License:Open Source License

static PGPSignature generateSubkeyBindingSignature(PGPSignatureGenerator sGen, Date creationTime,
        PGPPublicKey masterPublicKey, PGPPrivateKey masterPrivateKey, PGPSignatureGenerator subSigGen,
        PGPPrivateKey subPrivateKey, PGPPublicKey pKey, int flags, long expiry)
        throws IOException, PGPException, SignatureException {

    PGPSignatureSubpacketGenerator unhashedPacketsGen = new PGPSignatureSubpacketGenerator();

    // If this key can sign, we need a primary key binding signature
    if ((flags & KeyFlags.SIGN_DATA) > 0) {
        // cross-certify signing keys
        PGPSignatureSubpacketGenerator subHashedPacketsGen = new PGPSignatureSubpacketGenerator();
        subHashedPacketsGen.setSignatureCreationTime(false, creationTime);
        subSigGen.init(PGPSignature.PRIMARYKEY_BINDING, subPrivateKey);
        subSigGen.setHashedSubpackets(subHashedPacketsGen.generate());
        PGPSignature certification = subSigGen.generateCertification(masterPublicKey, pKey);
        unhashedPacketsGen.setEmbeddedSignature(true, certification);
    }//from w  w  w  .jav  a2  s .  com

    PGPSignatureSubpacketGenerator hashedPacketsGen;
    {
        hashedPacketsGen = new PGPSignatureSubpacketGenerator();
        hashedPacketsGen.setSignatureCreationTime(true, creationTime);
        hashedPacketsGen.setKeyFlags(true, flags);
        if (expiry > 0) {
            hashedPacketsGen.setKeyExpirationTime(true, expiry - pKey.getCreationTime().getTime() / 1000);
        }
    }

    sGen.init(PGPSignature.SUBKEY_BINDING, masterPrivateKey);
    sGen.setHashedSubpackets(hashedPacketsGen.generate());
    sGen.setUnhashedSubpackets(unhashedPacketsGen.generate());

    return sGen.generateCertification(masterPublicKey, pKey);

}

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");

    {//from   w w  w.j a v a 2 s.c  o  m
        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);

}