@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); } }