Search in sources :

Example 1 with EncryptedEventContent

use of org.matrix.androidsdk.crypto.model.crypto.EncryptedEventContent in project matrix-android-sdk by matrix-org.

the class MXMegolmDecryption method addEventToPendingList.

/**
 * Add an event to the list of those we couldn't decrypt the first time we
 * saw them.
 *
 * @param event      the event to try to decrypt later
 * @param timelineId the timeline identifier
 */
private void addEventToPendingList(CryptoEvent event, String timelineId) {
    EncryptedEventContent encryptedEventContent = event.toEncryptedEventContent();
    String senderKey = encryptedEventContent.sender_key;
    String sessionId = encryptedEventContent.session_id;
    String k = senderKey + "|" + sessionId;
    // avoid undefined timelineId
    if (TextUtils.isEmpty(timelineId)) {
        timelineId = "";
    }
    if (!mPendingEvents.containsKey(k)) {
        mPendingEvents.put(k, new HashMap<String, List<CryptoEvent>>());
    }
    if (!mPendingEvents.get(k).containsKey(timelineId)) {
        mPendingEvents.get(k).put(timelineId, new ArrayList<CryptoEvent>());
    }
    if (mPendingEvents.get(k).get(timelineId).indexOf(event) < 0) {
        Log.d(LOG_TAG, "## addEventToPendingList() : add Event " + event.getEventId() + " in room id " + event.getRoomId());
        mPendingEvents.get(k).get(timelineId).add(event);
    }
}
Also used : CryptoEvent(org.matrix.androidsdk.crypto.interfaces.CryptoEvent) EncryptedEventContent(org.matrix.androidsdk.crypto.model.crypto.EncryptedEventContent) ArrayList(java.util.ArrayList) List(java.util.List)

Example 2 with EncryptedEventContent

use of org.matrix.androidsdk.crypto.model.crypto.EncryptedEventContent in project matrix-android-sdk by matrix-org.

the class MXMegolmDecryption method decryptEvent.

@Nullable
private MXEventDecryptionResult decryptEvent(CryptoEvent event, String timeline, boolean requestKeysOnFail) throws MXDecryptionException {
    // sanity check
    if (null == event) {
        Log.e(LOG_TAG, "## decryptEvent() : null event");
        return null;
    }
    EncryptedEventContent encryptedEventContent = event.toEncryptedEventContent();
    String senderKey = encryptedEventContent.sender_key;
    String ciphertext = encryptedEventContent.ciphertext;
    String sessionId = encryptedEventContent.session_id;
    if (TextUtils.isEmpty(senderKey) || TextUtils.isEmpty(sessionId) || TextUtils.isEmpty(ciphertext)) {
        throw new MXDecryptionException(new MXCryptoError(MXCryptoError.MISSING_FIELDS_ERROR_CODE, MXCryptoError.UNABLE_TO_DECRYPT, MXCryptoError.MISSING_FIELDS_REASON));
    }
    MXEventDecryptionResult eventDecryptionResult = null;
    MXCryptoError cryptoError = null;
    MXDecryptionResult decryptGroupMessageResult = null;
    try {
        decryptGroupMessageResult = mOlmDevice.decryptGroupMessage(ciphertext, event.getRoomId(), timeline, sessionId, senderKey);
    } catch (MXDecryptionException e) {
        cryptoError = e.getCryptoError();
    }
    // the decryption succeeds
    if ((null != decryptGroupMessageResult) && (null != decryptGroupMessageResult.mPayload) && (null == cryptoError)) {
        eventDecryptionResult = new MXEventDecryptionResult();
        eventDecryptionResult.mClearEvent = decryptGroupMessageResult.mPayload;
        eventDecryptionResult.mSenderCurve25519Key = decryptGroupMessageResult.mSenderKey;
        if (null != decryptGroupMessageResult.mKeysClaimed) {
            eventDecryptionResult.mClaimedEd25519Key = decryptGroupMessageResult.mKeysClaimed.get("ed25519");
        }
        eventDecryptionResult.mForwardingCurve25519KeyChain = decryptGroupMessageResult.mForwardingCurve25519KeyChain;
    } else if (null != cryptoError) {
        if (cryptoError.isOlmError()) {
            if (TextUtils.equals("UNKNOWN_MESSAGE_INDEX", cryptoError.error)) {
                addEventToPendingList(event, timeline);
                if (requestKeysOnFail) {
                    requestKeysForEvent(event);
                }
            }
            String reason = String.format(MXCryptoError.OLM_REASON, cryptoError.error);
            String detailedReason = String.format(MXCryptoError.DETAILLED_OLM_REASON, ciphertext, cryptoError.error);
            throw new MXDecryptionException(new MXCryptoError(MXCryptoError.OLM_ERROR_CODE, reason, detailedReason));
        } else if (TextUtils.equals(cryptoError.errcode, MXCryptoError.UNKNOWN_INBOUND_SESSION_ID_ERROR_CODE)) {
            addEventToPendingList(event, timeline);
            if (requestKeysOnFail) {
                requestKeysForEvent(event);
            }
        }
        throw new MXDecryptionException(cryptoError);
    }
    return eventDecryptionResult;
}
Also used : MXDecryptionResult(org.matrix.androidsdk.crypto.algorithms.MXDecryptionResult) MXEventDecryptionResult(org.matrix.androidsdk.crypto.MXEventDecryptionResult) MXDecryptionException(org.matrix.androidsdk.crypto.MXDecryptionException) EncryptedEventContent(org.matrix.androidsdk.crypto.model.crypto.EncryptedEventContent) MXCryptoError(org.matrix.androidsdk.crypto.MXCryptoError) Nullable(androidx.annotation.Nullable)

Example 3 with EncryptedEventContent

use of org.matrix.androidsdk.crypto.model.crypto.EncryptedEventContent in project matrix-android-sdk by matrix-org.

the class MXMegolmDecryption method requestKeysForEvent.

/**
 * Helper for the real decryptEvent and for _retryDecryption. If
 * requestKeysOnFail is true, we'll send an m.room_key_request when we fail
 * to decrypt the event due to missing megolm keys.
 *
 * @param event the event
 */
private void requestKeysForEvent(CryptoEvent event) {
    String sender = event.getSender();
    EncryptedEventContent wireContent = event.toEncryptedEventContent();
    List<Map<String, String>> recipients = new ArrayList<>();
    Map<String, String> selfMap = new HashMap<>();
    selfMap.put("userId", mSession.getMyUserId());
    selfMap.put("deviceId", "*");
    recipients.add(selfMap);
    if (!TextUtils.equals(sender, mSession.getMyUserId())) {
        Map<String, String> senderMap = new HashMap<>();
        senderMap.put("userId", sender);
        senderMap.put("deviceId", wireContent.device_id);
        recipients.add(senderMap);
    }
    RoomKeyRequestBody requestBody = new RoomKeyRequestBody();
    requestBody.roomId = event.getRoomId();
    requestBody.algorithm = wireContent.algorithm;
    requestBody.senderKey = wireContent.sender_key;
    requestBody.sessionId = wireContent.session_id;
    mCrypto.requestRoomKey(requestBody, recipients);
}
Also used : RoomKeyRequestBody(org.matrix.androidsdk.crypto.model.crypto.RoomKeyRequestBody) HashMap(java.util.HashMap) ArrayList(java.util.ArrayList) EncryptedEventContent(org.matrix.androidsdk.crypto.model.crypto.EncryptedEventContent) HashMap(java.util.HashMap) MXUsersDevicesMap(org.matrix.androidsdk.crypto.data.MXUsersDevicesMap) Map(java.util.Map)

Aggregations

EncryptedEventContent (org.matrix.androidsdk.crypto.model.crypto.EncryptedEventContent)3 ArrayList (java.util.ArrayList)2 Nullable (androidx.annotation.Nullable)1 HashMap (java.util.HashMap)1 List (java.util.List)1 Map (java.util.Map)1 MXCryptoError (org.matrix.androidsdk.crypto.MXCryptoError)1 MXDecryptionException (org.matrix.androidsdk.crypto.MXDecryptionException)1 MXEventDecryptionResult (org.matrix.androidsdk.crypto.MXEventDecryptionResult)1 MXDecryptionResult (org.matrix.androidsdk.crypto.algorithms.MXDecryptionResult)1 MXUsersDevicesMap (org.matrix.androidsdk.crypto.data.MXUsersDevicesMap)1 CryptoEvent (org.matrix.androidsdk.crypto.interfaces.CryptoEvent)1 RoomKeyRequestBody (org.matrix.androidsdk.crypto.model.crypto.RoomKeyRequestBody)1