/** * Create a new {@link MissingOpenPgpKeyException}. * * @param owner {@link BareJid} of the keys owner. * @param fingerprint {@link OpenPgpV4Fingerprint} of the missing key. */ public MissingOpenPgpKeyException(BareJid owner, OpenPgpV4Fingerprint fingerprint) { super("Missing key " + fingerprint.toString() + " for owner " + owner + "."); this.owner = owner; this.fingerprint = fingerprint; }
@Override public boolean accept(Map<OpenPgpV4Fingerprint, Date> announcedKeys, PGPPublicKeyRing publicKeys) { return announcedKeys.keySet().contains(new OpenPgpV4Fingerprint(publicKeys)); } }
public PubkeyMetadataElement(OpenPgpV4Fingerprint v4_fingerprint, Date date) { this.v4_fingerprint = Objects.requireNonNull(v4_fingerprint); this.date = Objects.requireNonNull(date); if (v4_fingerprint.length() != 40) { throw new IllegalArgumentException("OpenPGP v4 fingerprint must be 40 characters long."); } }
/** * Generate a fresh OpenPGP key pair and import it. * * @param ourJid our {@link BareJid}. * @return {@link OpenPgpV4Fingerprint} of the generated key. * @throws NoSuchAlgorithmException if the JVM doesn't support one of the used algorithms. * @throws InvalidAlgorithmParameterException if the used algorithm parameters are invalid. * @throws NoSuchProviderException if we are missing a cryptographic provider. * @throws PGPException PGP is brittle. * @throws IOException IO is dangerous. */ public OpenPgpV4Fingerprint generateAndImportKeyPair(BareJid ourJid) throws NoSuchAlgorithmException, InvalidAlgorithmParameterException, NoSuchProviderException, PGPException, IOException { throwIfNoProviderSet(); OpenPgpStore store = provider.getStore(); PGPKeyRing keys = store.generateKeyRing(ourJid); try { store.importSecretKey(ourJid, keys.getSecretKeys()); store.importPublicKey(ourJid, keys.getPublicKeys()); } catch (MissingUserIdOnKeyException e) { // This should never throw, since we set our jid literally one line above this comment. throw new AssertionError(e); } OpenPgpV4Fingerprint fingerprint = new OpenPgpV4Fingerprint(keys.getSecretKeys()); store.setTrust(ourJid, fingerprint, OpenPgpTrustStore.Trust.trusted); return fingerprint; }
@Override public PGPSecretKeyRing getSecretKeyRing(BareJid owner, OpenPgpV4Fingerprint fingerprint) throws IOException, PGPException { PGPSecretKeyRingCollection secretKeyRings = getSecretKeysOf(owner); if (secretKeyRings != null) { return secretKeyRings.getSecretKeyRing(fingerprint.getKeyId()); } return null; }
@Override public int hashCode() { return getV4Fingerprint().hashCode() + 3 * getDate().hashCode(); }
@Override public boolean equals(Object o) { if (o == null) { return false; } if (!(o instanceof PubkeyMetadataElement)) { return false; } if (o == this) { return true; } PubkeyMetadataElement otherPubkeyMetadataElement = (PubkeyMetadataElement) o; return this.getV4Fingerprint().equals(otherPubkeyMetadataElement.getV4Fingerprint()) && this.getDate().equals(otherPubkeyMetadataElement.getDate()); } }
@Test public void t00_deleteTest() throws IOException, PGPException, InvalidAlgorithmParameterException, NoSuchAlgorithmException, NoSuchProviderException, MissingUserIdOnKeyException { assertNull(openPgpStoreInstance1.getSecretKeysOf(alice)); assertNull(openPgpStoreInstance1.getPublicKeysOf(alice)); PGPKeyRing keys = openPgpStoreInstance1.generateKeyRing(alice); openPgpStoreInstance1.importSecretKey(alice, keys.getSecretKeys()); openPgpStoreInstance1.importPublicKey(alice, keys.getPublicKeys()); assertNotNull(openPgpStoreInstance1.getSecretKeysOf(alice)); assertNotNull(openPgpStoreInstance1.getPublicKeysOf(alice)); openPgpStoreInstance1.deleteSecretKeyRing(alice, new OpenPgpV4Fingerprint(keys.getSecretKeys())); openPgpStoreInstance1.deletePublicKeyRing(alice, new OpenPgpV4Fingerprint(keys.getSecretKeys())); assertNull(openPgpStoreInstance1.getPublicKeysOf(alice)); assertNull(openPgpStoreInstance1.getSecretKeysOf(alice)); }
@Override public PGPPublicKeyRing getPublicKeyRing(BareJid owner, OpenPgpV4Fingerprint fingerprint) throws IOException, PGPException { PGPPublicKeyRingCollection publicKeyRings = getPublicKeysOf(owner); if (publicKeyRings != null) { return publicKeyRings.getPublicKeyRing(fingerprint.getKeyId()); } return null; }
@Override public boolean accept(Map<OpenPgpV4Fingerprint, Date> announcedKeys, PGPSecretKeyRing secretKeys) { return announcedKeys.keySet().contains(new OpenPgpV4Fingerprint(secretKeys)); } }
public MissingOpenPgpKeyException(BareJid owner, OpenPgpV4Fingerprint fingerprint, Throwable e) { super("Missing key " + fingerprint.toString() + " for owner " + owner + ".", e); this.owner = owner; this.fingerprint = fingerprint; }
@Test public void t06_key_keyReloadTest() throws PGPException, NoSuchAlgorithmException, NoSuchProviderException, InvalidAlgorithmParameterException, IOException, MissingUserIdOnKeyException { PGPKeyRing keys = openPgpStoreInstance1.generateKeyRing(alice); PGPSecretKeyRing secretKeys = keys.getSecretKeys(); OpenPgpV4Fingerprint fingerprint = new OpenPgpV4Fingerprint(secretKeys); PGPPublicKeyRing publicKeys = keys.getPublicKeys(); openPgpStoreInstance1.importSecretKey(alice, secretKeys); openPgpStoreInstance1.importPublicKey(alice, publicKeys); assertNotNull(openPgpStoreInstance2.getSecretKeysOf(alice)); assertNotNull(openPgpStoreInstance2.getPublicKeysOf(alice)); // Clean up openPgpStoreInstance1.deletePublicKeyRing(alice, fingerprint); openPgpStoreInstance1.deleteSecretKeyRing(alice, fingerprint); openPgpStoreInstance2.deletePublicKeyRing(alice, fingerprint); openPgpStoreInstance2.deleteSecretKeyRing(alice, fingerprint); }
@Override public void deletePublicKeyRing(BareJid owner, OpenPgpV4Fingerprint fingerprint) throws IOException, PGPException { PGPPublicKeyRingCollection publicKeyRings = getPublicKeysOf(owner); if (publicKeyRings.contains(fingerprint.getKeyId())) { publicKeyRings = PGPPublicKeyRingCollection.removePublicKeyRing(publicKeyRings, publicKeyRings.getPublicKeyRing(fingerprint.getKeyId())); if (!publicKeyRings.iterator().hasNext()) { publicKeyRings = null; } this.publicKeyRingCollections.put(owner, publicKeyRings); writePublicKeysOf(owner, publicKeyRings); } }
/** * Return the {@link OpenPgpV4Fingerprint} of our signing key. * @return fingerprint of signing key * @throws IOException IO is dangerous * @throws PGPException PGP is brittle */ public OpenPgpV4Fingerprint getSigningKeyFingerprint() throws IOException, PGPException { PGPSecretKeyRing signingKeyRing = getSigningKeyRing(); return signingKeyRing != null ? new OpenPgpV4Fingerprint(signingKeyRing.getPublicKey()) : null; }
public static String TRUST_RECORD(OpenPgpV4Fingerprint fingerprint) { return fingerprint.toString() + ".trust"; }
@Override public void deleteSecretKeyRing(BareJid owner, OpenPgpV4Fingerprint fingerprint) throws IOException, PGPException { PGPSecretKeyRingCollection secretKeyRings = getSecretKeysOf(owner); if (secretKeyRings.contains(fingerprint.getKeyId())) { secretKeyRings = PGPSecretKeyRingCollection.removeSecretKeyRing(secretKeyRings, secretKeyRings.getSecretKeyRing(fingerprint.getKeyId())); if (!secretKeyRings.iterator().hasNext()) { secretKeyRings = null; } this.secretKeyRingCollections.put(owner, secretKeyRings); writeSecretKeysOf(owner, secretKeyRings); } }
/** * Return a {@link Set} of {@link OpenPgpV4Fingerprint}s of all keys in {@code publicKeys}, which are marked with the * {@link OpenPgpTrustStore.Trust} of {@code trust}. * * @param publicKeys {@link PGPPublicKeyRingCollection} of keys which are iterated. * @param trust {@link OpenPgpTrustStore.Trust} state. * @return {@link Set} of fingerprints * * @throws IOException IO error */ public Set<OpenPgpV4Fingerprint> getFingerprintsOfKeysWithState(PGPPublicKeyRingCollection publicKeys, OpenPgpTrustStore.Trust trust) throws IOException { PGPPublicKeyRingCollection keys = getPublicKeysOfTrustState(publicKeys, trust); Set<OpenPgpV4Fingerprint> fingerprints = new HashSet<>(); if (keys == null) { return fingerprints; } for (PGPPublicKeyRing ring : keys) { fingerprints.add(new OpenPgpV4Fingerprint(ring)); } return fingerprints; }
public MissingUserIdOnKeyException(BareJid owner, OpenPgpV4Fingerprint fingerprint) { super("Key " + fingerprint.toString() + " does not have a user-id of \"xmpp:" + owner.toString() + "\"."); } }
@Test public void pubkeyNodeNameTest() throws PGPException { OpenPgpV4Fingerprint fingerprint = new OpenPgpV4Fingerprint("486f7065207520646f6e2068617665204f43640a"); assertEquals("urn:xmpp:openpgp:0:public-keys:486F7065207520646F6E2068617665204F43640A", OpenPgpPubSubUtil.PEP_NODE_PUBLIC_KEY(fingerprint)); } }
@Test public void listBuilderRefusesDuplicatesTest() throws PGPException { PublicKeysListElement.Builder builder = PublicKeysListElement.builder(); String fp40 = "49545320414c4c2041424f555420444120484558"; Date oneDate = new Date(12337883234L); Date otherDate = new Date(8888348384L); // Check if size of metadata is one after insert. builder.addMetadata(new PublicKeysListElement.PubkeyMetadataElement(new OpenPgpV4Fingerprint(fp40), oneDate)); assertEquals(builder.build().getMetadata().size(), 1); // Check if size is still one after inserting element with same fp. builder.addMetadata(new PublicKeysListElement.PubkeyMetadataElement(new OpenPgpV4Fingerprint(fp40), otherDate)); assertEquals(builder.build().getMetadata().size(), 1); } }