diff options
| author | Vincent Breitmoser <valodim@mugenguild.com> | 2014-07-11 15:19:49 +0200 | 
|---|---|---|
| committer | Vincent Breitmoser <valodim@mugenguild.com> | 2014-07-11 15:19:49 +0200 | 
| commit | e7efd2c539a58c5a7a14bffebc287ee0b91b51d3 (patch) | |
| tree | a2bda2be9f42833f49ac3a874c99c91a856207ec /OpenKeychain-Test/src/test | |
| parent | e00c65ed82c7f6de35c2969066f279cf27f57aab (diff) | |
| download | open-keychain-e7efd2c539a58c5a7a14bffebc287ee0b91b51d3.tar.gz open-keychain-e7efd2c539a58c5a7a14bffebc287ee0b91b51d3.tar.bz2 open-keychain-e7efd2c539a58c5a7a14bffebc287ee0b91b51d3.zip  | |
test: add SubkeyChange tests
Diffstat (limited to 'OpenKeychain-Test/src/test')
| -rw-r--r-- | OpenKeychain-Test/src/test/java/org/sufficientlysecure/keychain/tests/PgpKeyOperationTest.java | 97 | 
1 files changed, 94 insertions, 3 deletions
diff --git a/OpenKeychain-Test/src/test/java/org/sufficientlysecure/keychain/tests/PgpKeyOperationTest.java b/OpenKeychain-Test/src/test/java/org/sufficientlysecure/keychain/tests/PgpKeyOperationTest.java index 0cd615012..dafaa7ef4 100644 --- a/OpenKeychain-Test/src/test/java/org/sufficientlysecure/keychain/tests/PgpKeyOperationTest.java +++ b/OpenKeychain-Test/src/test/java/org/sufficientlysecure/keychain/tests/PgpKeyOperationTest.java @@ -11,6 +11,7 @@ import org.robolectric.*;  import org.robolectric.shadows.ShadowLog;  import org.spongycastle.bcpg.BCPGInputStream;  import org.spongycastle.bcpg.Packet; +import org.spongycastle.bcpg.PacketTags;  import org.spongycastle.bcpg.SecretSubkeyPacket;  import org.spongycastle.bcpg.SignaturePacket;  import org.spongycastle.bcpg.UserIDPacket; @@ -26,6 +27,7 @@ import org.sufficientlysecure.keychain.pgp.WrappedSignature;  import org.sufficientlysecure.keychain.service.OperationResultParcel;  import org.sufficientlysecure.keychain.service.SaveKeyringParcel;  import org.sufficientlysecure.keychain.service.SaveKeyringParcel.SubkeyAdd; +import org.sufficientlysecure.keychain.service.SaveKeyringParcel.SubkeyChange;  import org.sufficientlysecure.keychain.support.KeyringBuilder;  import org.sufficientlysecure.keychain.support.KeyringTestingHelper;  import org.sufficientlysecure.keychain.support.KeyringTestingHelper.RawPacket; @@ -34,6 +36,7 @@ import org.sufficientlysecure.keychain.support.TestDataUtil;  import java.io.ByteArrayInputStream;  import java.io.IOException;  import java.util.ArrayList; +import java.util.Date;  import java.util.Iterator;  @RunWith(RobolectricTestRunner.class) @@ -113,12 +116,15 @@ public class PgpKeyOperationTest {          Assert.assertEquals("number of user ids must be two",                  2, ring.getPublicKey().getUnorderedUserIds().size()); -        Assert.assertNull("expiry must be none", -                ring.getPublicKey().getExpiryTime()); -          Assert.assertEquals("number of subkeys must be three",                  3, ring.getAvailableSubkeys().size()); +        Assert.assertTrue("key ring should have been created in the last 120 seconds", +                ring.getPublicKey().getCreationTime().after(new Date(new Date().getTime()-1000*120))); + +        Assert.assertNull("key ring should not expire", +                ring.getPublicKey().getExpiryTime()); +          Iterator<UncachedPublicKey> it = ring.getPublicKeys();          Assert.assertEquals("first (master) key can certify", @@ -165,6 +171,91 @@ public class PgpKeyOperationTest {      }      @Test +    public void testSubkeyModify() throws Exception { + +        long expiry = new Date().getTime()/1000 + 1024; +        long keyId; +        { +            Iterator<UncachedPublicKey> it = ring.getPublicKeys(); +            it.next(); +            keyId = it.next().getKeyId(); +        } + +        UncachedKeyRing modified = ring; +        { +            parcel.mChangeSubKeys.add(new SubkeyChange(keyId, null, expiry)); +            modified = applyModificationWithChecks(parcel, modified, onlyA, onlyB); + +            Assert.assertEquals("one extra packet in original", 1, onlyA.size()); +            Assert.assertEquals("one extra packet in modified", 1, onlyB.size()); + +            Assert.assertEquals("old packet must be signature", +                    PacketTags.SIGNATURE, onlyA.get(0).tag); + +            Packet p = new BCPGInputStream(new ByteArrayInputStream(onlyB.get(0).buf)).readPacket(); +            Assert.assertTrue("first new packet must be signature", p instanceof SignaturePacket); +            Assert.assertEquals("signature type must be subkey binding certificate", +                    PGPSignature.SUBKEY_BINDING, ((SignaturePacket) p).getSignatureType()); +            Assert.assertEquals("signature must have been created by master key", +                    ring.getMasterKeyId(), ((SignaturePacket) p).getKeyID()); + +            Assert.assertNotNull("modified key must have an expiry date", +                    modified.getPublicKey(keyId).getExpiryTime()); +            Assert.assertEquals("modified key must have an expiry date", +                    expiry, modified.getPublicKey(keyId).getExpiryTime().getTime()/1000); +            Assert.assertEquals("modified key must have same flags as before", +                    ring.getPublicKey(keyId).getKeyUsage(), modified.getPublicKey(keyId).getKeyUsage()); +        } + +        { +            int flags = KeyFlags.SIGN_DATA | KeyFlags.ENCRYPT_COMMS; +            parcel.reset(); +            parcel.mChangeSubKeys.add(new SubkeyChange(keyId, flags, null)); +            modified = applyModificationWithChecks(parcel, modified, onlyA, onlyB); + +            Assert.assertEquals("old packet must be signature", +                    PacketTags.SIGNATURE, onlyA.get(0).tag); + +            Packet p = new BCPGInputStream(new ByteArrayInputStream(onlyB.get(0).buf)).readPacket(); +            Assert.assertTrue("first new packet must be signature", p instanceof SignaturePacket); +            Assert.assertEquals("signature type must be subkey binding certificate", +                    PGPSignature.SUBKEY_BINDING, ((SignaturePacket) p).getSignatureType()); +            Assert.assertEquals("signature must have been created by master key", +                    ring.getMasterKeyId(), ((SignaturePacket) p).getKeyID()); + +            Assert.assertEquals("modified key must have expected flags", +                    flags, modified.getPublicKey(keyId).getKeyUsage()); +            Assert.assertNotNull("key must retain its expiry", +                    modified.getPublicKey(keyId).getExpiryTime()); +            Assert.assertEquals("key expiry must be unchanged", +                    expiry, modified.getPublicKey(keyId).getExpiryTime().getTime()/1000); +        } + +        { // a past expiry should fail +            parcel.reset(); +            parcel.mChangeSubKeys.add(new SubkeyChange(keyId, null, new Date().getTime()/1000-10)); + +            WrappedSecretKeyRing secretRing = new WrappedSecretKeyRing(ring.getEncoded(), false, 0); +            OperationResultParcel.OperationLog log = new OperationResultParcel.OperationLog(); +            modified = op.modifySecretKeyRing(secretRing, parcel, "swag", log, 0); + +            Assert.assertNull("setting subkey expiry to a past date should fail", modified); +        } + +        { // modifying nonexistent keyring should fail +            parcel.reset(); +            parcel.mChangeSubKeys.add(new SubkeyChange(123, null, null)); + +            WrappedSecretKeyRing secretRing = new WrappedSecretKeyRing(ring.getEncoded(), false, 0); +            OperationResultParcel.OperationLog log = new OperationResultParcel.OperationLog(); +            modified = op.modifySecretKeyRing(secretRing, parcel, "swag", log, 0); + +            Assert.assertNull("modifying non-existent subkey should fail", modified); +        } + +    } + +    @Test      public void testSubkeyRevoke() throws Exception {          {  | 
