/** * Returns true if this is a preKeyMessage. * * @return preKeyMessage? */ public boolean isPreKeyMessage() { return getMessageType() == TYPE_OMEMO_PREKEY_MESSAGE; } }
@Test public void ciphertextTupleTest() { byte[] c = OmemoMessageBuilder.generateIv(); CiphertextTuple c1 = new CiphertextTuple(c, OmemoElement.TYPE_OMEMO_PREKEY_MESSAGE); assertTrue(c1.isPreKeyMessage()); assertArrayEquals(c, c1.getCiphertext()); assertEquals(OmemoElement.TYPE_OMEMO_PREKEY_MESSAGE, c1.getMessageType()); CiphertextTuple c2 = new CiphertextTuple(c, OmemoElement.TYPE_OMEMO_MESSAGE); assertFalse(c2.isPreKeyMessage()); assertEquals(OmemoElement.TYPE_OMEMO_MESSAGE, c2.getMessageType()); }
/** * Add a new recipient device to the message. * * @param contactsDevice device of the recipient * @throws NoIdentityKeyException if we have no identityKey of that device. Can be fixed by fetching and * processing the devices bundle. * @throws CorruptedOmemoKeyException if the identityKey of that device is corrupted. * @throws UndecidedOmemoIdentityException if the user hasn't yet decided whether to trust that device or not. * @throws UntrustedOmemoIdentityException if the user has decided not to trust that device. */ public void addRecipient(OmemoDevice contactsDevice) throws NoIdentityKeyException, CorruptedOmemoKeyException, UndecidedOmemoIdentityException, UntrustedOmemoIdentityException { OmemoFingerprint fingerprint; fingerprint = OmemoService.getInstance().getOmemoStoreBackend().getFingerprint(userDevice, contactsDevice); switch (trustCallback.getTrust(contactsDevice, fingerprint)) { case undecided: throw new UndecidedOmemoIdentityException(contactsDevice); case trusted: CiphertextTuple encryptedKey = ratchet.doubleRatchetEncrypt(contactsDevice, messageKey); keys.add(new OmemoKeyElement(encryptedKey.getCiphertext(), contactsDevice.getDeviceId(), encryptedKey.isPreKeyMessage())); break; case untrusted: throw new UntrustedOmemoIdentityException(contactsDevice, fingerprint); } }
@Override public CiphertextTuple doubleRatchetEncrypt(OmemoDevice recipient, byte[] messageKey) { CiphertextMessage ciphertextMessage; try { ciphertextMessage = getCipher(recipient).encrypt(messageKey); } catch (UntrustedIdentityException e) { throw new AssertionError("Signals trust management MUST be disabled."); } // TODO: Figure out, if this is enough... int type = (ciphertextMessage.getType() == CiphertextMessage.PREKEY_TYPE ? OmemoElement.TYPE_OMEMO_PREKEY_MESSAGE : OmemoElement.TYPE_OMEMO_MESSAGE); return new CiphertextTuple(ciphertextMessage.serialize(), type); }
@Override public CiphertextTuple doubleRatchetEncrypt(OmemoDevice recipient, byte[] messageKey) { CiphertextMessage ciphertextMessage; try { ciphertextMessage = getCipher(recipient).encrypt(messageKey); } catch (UntrustedIdentityException e) { throw new AssertionError("Signals trust management MUST be disabled."); } // TODO: Figure out, if this is enough... int type = (ciphertextMessage.getType() == CiphertextMessage.PREKEY_TYPE ? OmemoElement.TYPE_OMEMO_PREKEY_MESSAGE : OmemoElement.TYPE_OMEMO_MESSAGE); return new CiphertextTuple(ciphertextMessage.serialize(), type); }