Search in sources :

Example 21 with PGPSecretKeyRing

use of org.bouncycastle.openpgp.PGPSecretKeyRing in project Smack by igniterealtime.

the class PainlessOpenPgpProviderTest method encryptDecryptTest.

@Test
public void encryptDecryptTest() throws PGPException, NoSuchAlgorithmException, NoSuchProviderException, InvalidAlgorithmParameterException, IOException, MissingUserIdOnKeyException, XmlPullParserException {
    // Initialize
    OpenPgpStore aliceStore = new FileBasedOpenPgpStore(storagePath);
    OpenPgpStore bobStore = new FileBasedOpenPgpStore(storagePath);
    aliceStore.setKeyRingProtector(new UnprotectedKeysProtector());
    bobStore.setKeyRingProtector(new UnprotectedKeysProtector());
    XMPPConnection bobConnection = new DummyConnection();
    PainlessOpenPgpProvider aliceProvider = new PainlessOpenPgpProvider(aliceStore);
    PainlessOpenPgpProvider bobProvider = new PainlessOpenPgpProvider(bobStore);
    PGPSecretKeyRing aliceKeys = aliceStore.generateKeyRing(alice);
    PGPSecretKeyRing bobKeys = bobStore.generateKeyRing(bob);
    PGPPublicKeyRing alicePubKeys = KeyRingUtils.publicKeyRingFrom(aliceKeys);
    PGPPublicKeyRing bobPubKeys = KeyRingUtils.publicKeyRingFrom(bobKeys);
    OpenPgpV4Fingerprint aliceFingerprint = new OpenPgpV4Fingerprint(aliceKeys);
    OpenPgpV4Fingerprint bobFingerprint = new OpenPgpV4Fingerprint(bobKeys);
    aliceStore.importSecretKey(alice, aliceKeys);
    bobStore.importSecretKey(bob, bobKeys);
    aliceStore.setAnnouncedFingerprintsOf(alice, Collections.singletonMap(aliceFingerprint, new Date()));
    bobStore.setAnnouncedFingerprintsOf(bob, Collections.singletonMap(bobFingerprint, new Date()));
    OpenPgpSelf aliceSelf = new OpenPgpSelf(alice, aliceStore);
    aliceSelf.trust(aliceFingerprint);
    OpenPgpSelf bobSelf = new OpenPgpSelf(bob, bobStore);
    bobSelf.trust(bobFingerprint);
    // Exchange keys
    aliceStore.importPublicKey(bob, bobPubKeys);
    bobStore.importPublicKey(alice, alicePubKeys);
    aliceStore.setAnnouncedFingerprintsOf(bob, Collections.singletonMap(bobFingerprint, new Date()));
    bobStore.setAnnouncedFingerprintsOf(alice, Collections.singletonMap(aliceFingerprint, new Date()));
    OpenPgpContact aliceForBob = new OpenPgpContact(alice, bobStore);
    aliceForBob.trust(aliceFingerprint);
    OpenPgpContact bobForAlice = new OpenPgpContact(bob, aliceStore);
    bobForAlice.trust(bobFingerprint);
    // Prepare message
    Message.Body body = new Message.Body(null, "Lorem ipsum dolor sit amet, consectetur adipisici elit, sed eiusmod tempor incidunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquid ex ea commodi consequat. Quis aute iure reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint obcaecat cupiditat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.");
    List<ExtensionElement> payload = Collections.singletonList(body);
    OpenPgpElementAndMetadata encrypted;
    OpenPgpMessage decrypted;
    /*
        test signcrypt
         */
    SigncryptElement signcryptElement = new SigncryptElement(Collections.<Jid>singleton(bob), payload);
    // Encrypt and Sign
    encrypted = aliceProvider.signAndEncrypt(signcryptElement, aliceSelf, Collections.singleton(bobForAlice));
    // Decrypt and Verify
    decrypted = bobProvider.decryptAndOrVerify(bobConnection, encrypted.getElement(), bobSelf, aliceForBob);
    OpenPgpFingerprint decryptionFingerprint = decrypted.getMetadata().getDecryptionKey().getFingerprint();
    assertTrue(bobSelf.getSecretKeys().contains(decryptionFingerprint.getKeyId()));
    assertTrue(decrypted.getMetadata().containsVerifiedSignatureFrom(alicePubKeys));
    assertEquals(OpenPgpMessage.State.signcrypt, decrypted.getState());
    SigncryptElement decryptedSignCrypt = (SigncryptElement) decrypted.getOpenPgpContentElement();
    assertEquals(body.getMessage(), decryptedSignCrypt.<Message.Body>getExtension(Message.Body.ELEMENT, Message.Body.NAMESPACE).getMessage());
    /*
        test crypt
         */
    CryptElement cryptElement = new CryptElement(Collections.<Jid>singleton(bob), payload);
    // Encrypt
    encrypted = aliceProvider.encrypt(cryptElement, aliceSelf, Collections.singleton(bobForAlice));
    decrypted = bobProvider.decryptAndOrVerify(bobConnection, encrypted.getElement(), bobSelf, aliceForBob);
    decryptionFingerprint = decrypted.getMetadata().getDecryptionKey().getFingerprint();
    assertTrue(bobSelf.getSecretKeys().contains(decryptionFingerprint.getKeyId()));
    assertTrue(decrypted.getMetadata().getVerifiedSignatures().isEmpty());
    assertEquals(OpenPgpMessage.State.crypt, decrypted.getState());
    CryptElement decryptedCrypt = (CryptElement) decrypted.getOpenPgpContentElement();
    assertEquals(body.getMessage(), decryptedCrypt.<Message.Body>getExtension(Message.Body.ELEMENT, Message.Body.NAMESPACE).getMessage());
    /*
        test sign
         */
    SignElement signElement = new SignElement(Collections.singleton(bob), new Date(), payload);
    // Sign
    encrypted = aliceProvider.sign(signElement, aliceSelf);
    decrypted = bobProvider.decryptAndOrVerify(bobConnection, encrypted.getElement(), bobSelf, aliceForBob);
    assertNull(decrypted.getMetadata().getDecryptionKey());
    assertTrue(decrypted.getMetadata().containsVerifiedSignatureFrom(alicePubKeys));
    assertEquals(OpenPgpMessage.State.sign, decrypted.getState());
    SignElement decryptedSign = (SignElement) decrypted.getOpenPgpContentElement();
    assertEquals(body.getMessage(), decryptedSign.<Message.Body>getExtension(Message.Body.ELEMENT, Message.Body.NAMESPACE).getMessage());
}
Also used : PGPPublicKeyRing(org.bouncycastle.openpgp.PGPPublicKeyRing) SigncryptElement(org.jivesoftware.smackx.ox.element.SigncryptElement) Message(org.jivesoftware.smack.packet.Message) DummyConnection(org.jivesoftware.smack.DummyConnection) ExtensionElement(org.jivesoftware.smack.packet.ExtensionElement) XMPPConnection(org.jivesoftware.smack.XMPPConnection) Date(java.util.Date) CryptElement(org.jivesoftware.smackx.ox.element.CryptElement) OpenPgpElementAndMetadata(org.jivesoftware.smackx.ox.crypto.OpenPgpElementAndMetadata) FileBasedOpenPgpStore(org.jivesoftware.smackx.ox.store.filebased.FileBasedOpenPgpStore) UnprotectedKeysProtector(org.pgpainless.key.protection.UnprotectedKeysProtector) SignElement(org.jivesoftware.smackx.ox.element.SignElement) FileBasedOpenPgpStore(org.jivesoftware.smackx.ox.store.filebased.FileBasedOpenPgpStore) OpenPgpStore(org.jivesoftware.smackx.ox.store.definition.OpenPgpStore) OpenPgpV4Fingerprint(org.pgpainless.key.OpenPgpV4Fingerprint) OpenPgpFingerprint(org.pgpainless.key.OpenPgpFingerprint) PGPSecretKeyRing(org.bouncycastle.openpgp.PGPSecretKeyRing) PainlessOpenPgpProvider(org.jivesoftware.smackx.ox.crypto.PainlessOpenPgpProvider) Test(org.junit.jupiter.api.Test)

Example 22 with PGPSecretKeyRing

use of org.bouncycastle.openpgp.PGPSecretKeyRing in project Smack by igniterealtime.

the class SecretKeyBackupHelper method createSecretkeyElement.

/**
 * Create a {@link SecretkeyElement} which contains the secret keys listed in {@code fingerprints} and is encrypted
 * symmetrically using the {@code backupCode}.
 *
 * @param provider {@link OpenPgpProvider} for symmetric encryption.
 * @param owner owner of the secret keys (usually our jid).
 * @param fingerprints set of {@link OpenPgpV4Fingerprint}s of the keys which are going to be backed up.
 * @param backupCode passphrase for symmetric encryption.
 * @return {@link SecretkeyElement}
 *
 * @throws PGPException PGP is brittle
 * @throws IOException IO is dangerous
 * @throws MissingOpenPgpKeyException in case one of the keys whose fingerprint is in {@code fingerprints} is
 * not accessible.
 */
public static SecretkeyElement createSecretkeyElement(OpenPgpProvider provider, BareJid owner, Set<OpenPgpV4Fingerprint> fingerprints, OpenPgpSecretKeyBackupPassphrase backupCode) throws PGPException, IOException, MissingOpenPgpKeyException {
    ByteArrayOutputStream buffer = new ByteArrayOutputStream();
    for (OpenPgpV4Fingerprint fingerprint : fingerprints) {
        PGPSecretKeyRing key = provider.getStore().getSecretKeyRing(owner, fingerprint);
        if (key == null) {
            throw new MissingOpenPgpKeyException(owner, fingerprint);
        }
        byte[] bytes = key.getEncoded();
        buffer.write(bytes);
    }
    return createSecretkeyElement(buffer.toByteArray(), backupCode);
}
Also used : MissingOpenPgpKeyException(org.jivesoftware.smackx.ox.exception.MissingOpenPgpKeyException) OpenPgpV4Fingerprint(org.pgpainless.key.OpenPgpV4Fingerprint) ByteArrayOutputStream(java.io.ByteArrayOutputStream) PGPSecretKeyRing(org.bouncycastle.openpgp.PGPSecretKeyRing)

Aggregations

PGPSecretKeyRing (org.bouncycastle.openpgp.PGPSecretKeyRing)22 OpenPgpV4Fingerprint (org.pgpainless.key.OpenPgpV4Fingerprint)11 PGPPublicKeyRing (org.bouncycastle.openpgp.PGPPublicKeyRing)6 PGPSecretKey (org.bouncycastle.openpgp.PGPSecretKey)6 Test (org.junit.Test)6 PGPSecretKeyRingCollection (org.bouncycastle.openpgp.PGPSecretKeyRingCollection)5 BcKeyFingerprintCalculator (org.bouncycastle.openpgp.operator.bc.BcKeyFingerprintCalculator)3 JcePBESecretKeyDecryptorBuilder (org.bouncycastle.openpgp.operator.jcajce.JcePBESecretKeyDecryptorBuilder)3 PainlessOpenPgpProvider (org.jivesoftware.smackx.ox.crypto.PainlessOpenPgpProvider)3 SecretkeyElement (org.jivesoftware.smackx.ox.element.SecretkeyElement)3 OpenPgpStore (org.jivesoftware.smackx.ox.store.definition.OpenPgpStore)3 FileBasedOpenPgpStore (org.jivesoftware.smackx.ox.store.filebased.FileBasedOpenPgpStore)3 PGPPrivateKey (org.bouncycastle.openpgp.PGPPrivateKey)2 Test (org.junit.jupiter.api.Test)2 BareJid (org.jxmpp.jid.BareJid)2 UnprotectedKeysProtector (org.pgpainless.key.protection.UnprotectedKeysProtector)2 ByteArrayInputStream (java.io.ByteArrayInputStream)1 ByteArrayOutputStream (java.io.ByteArrayOutputStream)1 FileInputStream (java.io.FileInputStream)1 IOException (java.io.IOException)1