/** * 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; }
@Test(expected = MissingUserIdOnKeyException.class) public void t04_key_wrongBareJidOnSecretKeyImportTest() throws PGPException, NoSuchAlgorithmException, NoSuchProviderException, InvalidAlgorithmParameterException, IOException, MissingUserIdOnKeyException { PGPSecretKeyRing secretKeys = openPgpStoreInstance1.generateKeyRing(alice).getSecretKeys(); openPgpStoreInstance1.importSecretKey(bob, secretKeys); }
@Test public void t07_multipleKeysTest() throws PGPException, NoSuchAlgorithmException, NoSuchProviderException, InvalidAlgorithmParameterException, IOException, MissingUserIdOnKeyException { PGPKeyRing one = openPgpStoreInstance1.generateKeyRing(alice); PGPKeyRing two = openPgpStoreInstance1.generateKeyRing(alice); OpenPgpV4Fingerprint fingerprint1 = new OpenPgpV4Fingerprint(one.getSecretKeys()); OpenPgpV4Fingerprint fingerprint2 = new OpenPgpV4Fingerprint(two.getSecretKeys()); openPgpStoreInstance1.importSecretKey(alice, one.getSecretKeys()); openPgpStoreInstance1.importSecretKey(alice, two.getSecretKeys()); openPgpStoreInstance1.importPublicKey(alice, one.getPublicKeys()); openPgpStoreInstance1.importPublicKey(alice, two.getPublicKeys()); assertTrue(Arrays.equals(one.getSecretKeys().getEncoded(), openPgpStoreInstance1.getSecretKeyRing(alice, fingerprint1).getEncoded())); assertTrue(Arrays.equals(two.getSecretKeys().getEncoded(), openPgpStoreInstance1.getSecretKeyRing(alice, fingerprint2).getEncoded())); assertTrue(Arrays.equals(one.getSecretKeys().getEncoded(), openPgpStoreInstance1.getSecretKeysOf(alice).getSecretKeyRing(fingerprint1.getKeyId()).getEncoded())); assertTrue(Arrays.equals(one.getPublicKeys().getEncoded(), openPgpStoreInstance1.getPublicKeyRing(alice, fingerprint1).getEncoded())); // Cleanup openPgpStoreInstance1.deletePublicKeyRing(alice, fingerprint1); openPgpStoreInstance1.deletePublicKeyRing(alice, fingerprint2); openPgpStoreInstance1.deleteSecretKeyRing(alice, fingerprint1); openPgpStoreInstance1.deleteSecretKeyRing(alice, fingerprint2); }
@Test public void createAndDecryptSecretKeyElementTest() throws PGPException, NoSuchAlgorithmException, NoSuchProviderException, InvalidAlgorithmParameterException, IOException, MissingUserIdOnKeyException, MissingOpenPgpKeyException, InvalidBackupCodeException { // Prepare store and provider and so on... FileBasedOpenPgpStore store = new FileBasedOpenPgpStore(basePath); PainlessOpenPgpProvider provider = new PainlessOpenPgpProvider(new DummyConnection(), store); // Generate and import key PGPKeyRing keyRing = PGPainless.generateKeyRing().simpleEcKeyRing("xmpp:alice@wonderland.lit"); BareJid jid = JidCreate.bareFrom("alice@wonderland.lit"); provider.getStore().importSecretKey(jid, keyRing.getSecretKeys()); // Create encrypted backup String backupCode = SecretKeyBackupHelper.generateBackupPassword(); SecretkeyElement element = SecretKeyBackupHelper.createSecretkeyElement(provider, jid, Collections.singleton(new OpenPgpV4Fingerprint(keyRing.getSecretKeys())), backupCode); // Decrypt backup and compare PGPSecretKeyRing secretKeyRing = SecretKeyBackupHelper.restoreSecretKeyBackup(element, backupCode); assertTrue(Arrays.equals(keyRing.getSecretKeys().getEncoded(), secretKeyRing.getEncoded())); }
@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)); }
PGPSecretKeyRing secretKeys = keys.getSecretKeys(); PGPPublicKeyRing publicKeys = keys.getPublicKeys(); assertNotNull(secretKeys);
OpenPgpV4Fingerprint bobFingerprint = new OpenPgpV4Fingerprint(bobKeys.getPublicKeys()); aliceStore.importSecretKey(alice, aliceKeys.getSecretKeys()); bobStore.importSecretKey(bob, bobKeys.getSecretKeys());
@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); }