Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 8bcdce14 authored by TreeHugger Robot's avatar TreeHugger Robot Committed by Automerger Merge Worker
Browse files

Merge "Optimization: Restrict signing to ACTION_UP and ACTION_DOWN while doing...

Merge "Optimization: Restrict signing to ACTION_UP and ACTION_DOWN while doing a motion gesture such as scrolling apps" into rvc-dev am: c89d3444 am: c5ea7cef

Change-Id: I7fb167b6a4930b31bbc5af179bf364d85cc745d4
parents 04961491 c5ea7cef
Loading
Loading
Loading
Loading
+2 −2
Original line number Original line Diff line number Diff line
@@ -468,7 +468,7 @@ status_t InputPublisher::publishKeyEvent(uint32_t seq, int32_t eventId, int32_t
    msg.body.key.deviceId = deviceId;
    msg.body.key.deviceId = deviceId;
    msg.body.key.source = source;
    msg.body.key.source = source;
    msg.body.key.displayId = displayId;
    msg.body.key.displayId = displayId;
    msg.body.key.hmac = hmac;
    msg.body.key.hmac = std::move(hmac);
    msg.body.key.action = action;
    msg.body.key.action = action;
    msg.body.key.flags = flags;
    msg.body.key.flags = flags;
    msg.body.key.keyCode = keyCode;
    msg.body.key.keyCode = keyCode;
@@ -526,7 +526,7 @@ status_t InputPublisher::publishMotionEvent(
    msg.body.motion.deviceId = deviceId;
    msg.body.motion.deviceId = deviceId;
    msg.body.motion.source = source;
    msg.body.motion.source = source;
    msg.body.motion.displayId = displayId;
    msg.body.motion.displayId = displayId;
    msg.body.motion.hmac = hmac;
    msg.body.motion.hmac = std::move(hmac);
    msg.body.motion.action = action;
    msg.body.motion.action = action;
    msg.body.motion.actionButton = actionButton;
    msg.body.motion.actionButton = actionButton;
    msg.body.motion.flags = flags;
    msg.body.motion.flags = flags;
+30 −17
Original line number Original line Diff line number Diff line
@@ -352,18 +352,16 @@ std::array<uint8_t, 32> HmacKeyManager::sign(const VerifiedInputEvent& event) co
            break;
            break;
        }
        }
    }
    }
    std::vector<uint8_t> data;
    const uint8_t* start = reinterpret_cast<const uint8_t*>(&event);
    const uint8_t* start = reinterpret_cast<const uint8_t*>(&event);
    data.assign(start, start + size);
    return sign(start, size);
    return sign(data);
}
}


std::array<uint8_t, 32> HmacKeyManager::sign(const std::vector<uint8_t>& data) const {
std::array<uint8_t, 32> HmacKeyManager::sign(const uint8_t* data, size_t size) const {
    // SHA256 always generates 32-bytes result
    // SHA256 always generates 32-bytes result
    std::array<uint8_t, 32> hash;
    std::array<uint8_t, 32> hash;
    unsigned int hashLen = 0;
    unsigned int hashLen = 0;
    uint8_t* result = HMAC(EVP_sha256(), mHmacKey.data(), mHmacKey.size(), data.data(), data.size(),
    uint8_t* result =
                           hash.data(), &hashLen);
            HMAC(EVP_sha256(), mHmacKey.data(), mHmacKey.size(), data, size, hash.data(), &hashLen);
    if (result == nullptr) {
    if (result == nullptr) {
        ALOGE("Could not sign the data using HMAC");
        ALOGE("Could not sign the data using HMAC");
        return INVALID_HMAC;
        return INVALID_HMAC;
@@ -2451,11 +2449,8 @@ void InputDispatcher::startDispatchCycleLocked(nsecs_t currentTime,
        EventEntry* eventEntry = dispatchEntry->eventEntry;
        EventEntry* eventEntry = dispatchEntry->eventEntry;
        switch (eventEntry->type) {
        switch (eventEntry->type) {
            case EventEntry::Type::KEY: {
            case EventEntry::Type::KEY: {
                KeyEntry* keyEntry = static_cast<KeyEntry*>(eventEntry);
                const KeyEntry* keyEntry = static_cast<KeyEntry*>(eventEntry);
                VerifiedKeyEvent verifiedEvent = verifiedKeyEventFromKeyEntry(*keyEntry);
                std::array<uint8_t, 32> hmac = getSignature(*keyEntry, *dispatchEntry);
                verifiedEvent.flags = dispatchEntry->resolvedFlags & VERIFIED_KEY_EVENT_FLAGS;
                verifiedEvent.action = dispatchEntry->resolvedAction;
                std::array<uint8_t, 32> hmac = mHmacKeyManager.sign(verifiedEvent);


                // Publish the key event.
                // Publish the key event.
                status =
                status =
@@ -2507,12 +2502,8 @@ void InputDispatcher::startDispatchCycleLocked(nsecs_t currentTime,
                        usingCoords = scaledCoords;
                        usingCoords = scaledCoords;
                    }
                    }
                }
                }
                VerifiedMotionEvent verifiedEvent =

                        verifiedMotionEventFromMotionEntry(*motionEntry);
                std::array<uint8_t, 32> hmac = getSignature(*motionEntry, *dispatchEntry);
                verifiedEvent.actionMasked =
                        dispatchEntry->resolvedAction & AMOTION_EVENT_ACTION_MASK;
                verifiedEvent.flags = dispatchEntry->resolvedFlags & VERIFIED_MOTION_EVENT_FLAGS;
                std::array<uint8_t, 32> hmac = mHmacKeyManager.sign(verifiedEvent);


                // Publish the motion event.
                // Publish the motion event.
                status = connection->inputPublisher
                status = connection->inputPublisher
@@ -2592,6 +2583,28 @@ void InputDispatcher::startDispatchCycleLocked(nsecs_t currentTime,
    }
    }
}
}


const std::array<uint8_t, 32> InputDispatcher::getSignature(
        const MotionEntry& motionEntry, const DispatchEntry& dispatchEntry) const {
    int32_t actionMasked = dispatchEntry.resolvedAction & AMOTION_EVENT_ACTION_MASK;
    if ((actionMasked == AMOTION_EVENT_ACTION_UP) || (actionMasked == AMOTION_EVENT_ACTION_DOWN)) {
        // Only sign events up and down events as the purely move events
        // are tied to their up/down counterparts so signing would be redundant.
        VerifiedMotionEvent verifiedEvent = verifiedMotionEventFromMotionEntry(motionEntry);
        verifiedEvent.actionMasked = actionMasked;
        verifiedEvent.flags = dispatchEntry.resolvedFlags & VERIFIED_MOTION_EVENT_FLAGS;
        return mHmacKeyManager.sign(verifiedEvent);
    }
    return INVALID_HMAC;
}

const std::array<uint8_t, 32> InputDispatcher::getSignature(
        const KeyEntry& keyEntry, const DispatchEntry& dispatchEntry) const {
    VerifiedKeyEvent verifiedEvent = verifiedKeyEventFromKeyEntry(keyEntry);
    verifiedEvent.flags = dispatchEntry.resolvedFlags & VERIFIED_KEY_EVENT_FLAGS;
    verifiedEvent.action = dispatchEntry.resolvedAction;
    return mHmacKeyManager.sign(verifiedEvent);
}

void InputDispatcher::finishDispatchCycleLocked(nsecs_t currentTime,
void InputDispatcher::finishDispatchCycleLocked(nsecs_t currentTime,
                                                const sp<Connection>& connection, uint32_t seq,
                                                const sp<Connection>& connection, uint32_t seq,
                                                bool handled) {
                                                bool handled) {
+6 −2
Original line number Original line Diff line number Diff line
@@ -62,7 +62,7 @@ public:
    std::array<uint8_t, 32> sign(const VerifiedInputEvent& event) const;
    std::array<uint8_t, 32> sign(const VerifiedInputEvent& event) const;


private:
private:
    std::array<uint8_t, 32> sign(const std::vector<uint8_t>& data) const;
    std::array<uint8_t, 32> sign(const uint8_t* data, size_t size) const;
    const std::array<uint8_t, 128> mHmacKey;
    const std::array<uint8_t, 128> mHmacKey;
};
};


@@ -219,7 +219,11 @@ private:
    // the pointer stream in order to claim it for a system gesture.
    // the pointer stream in order to claim it for a system gesture.
    std::unordered_map<int32_t, std::vector<Monitor>> mGestureMonitorsByDisplay GUARDED_BY(mLock);
    std::unordered_map<int32_t, std::vector<Monitor>> mGestureMonitorsByDisplay GUARDED_BY(mLock);


    HmacKeyManager mHmacKeyManager;
    const HmacKeyManager mHmacKeyManager;
    const std::array<uint8_t, 32> getSignature(const MotionEntry& motionEntry,
                                               const DispatchEntry& dispatchEntry) const;
    const std::array<uint8_t, 32> getSignature(const KeyEntry& keyEntry,
                                               const DispatchEntry& dispatchEntry) const;


    // Event injection and synchronization.
    // Event injection and synchronization.
    std::condition_variable mInjectionResultAvailable;
    std::condition_variable mInjectionResultAvailable;