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

Commit 5e3edd05 authored by Treehugger Robot's avatar Treehugger Robot Committed by Automerger Merge Worker
Browse files

Merge "CryptoAsync: CryptoException when used with cryptoInfos" into main am:...

Merge "CryptoAsync: CryptoException when used with cryptoInfos" into main am: 9e3206da am: 32ebf15c

Original change: https://android-review.googlesource.com/c/platform/frameworks/base/+/3469752



Change-Id: I53ce83641cd3d459a1dd33e9a3af78e5af907a7c
Signed-off-by: default avatarAutomerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
parents 9cd8fa5b 32ebf15c
Loading
Loading
Loading
Loading
+58 −48
Original line number Diff line number Diff line
@@ -1232,6 +1232,30 @@ static void AMessageToCryptoInfo(JNIEnv * env, const jobject & obj,
    sp<ABuffer> ivBuffer;
    CryptoPlugin::Mode mode;
    CryptoPlugin::Pattern pattern;
    CryptoPlugin::SubSample *samplesArray = nullptr;
    ScopedLocalRef<jbyteArray> keyArray(env, env->NewByteArray(16));
    ScopedLocalRef<jbyteArray> ivArray(env, env->NewByteArray(16));
    jboolean isCopy;
    sp<RefBase> cryptoInfosObj;
    if (msg->findObject("cryptoInfos", &cryptoInfosObj)) {
        sp<CryptoInfosWrapper> cryptoInfos((CryptoInfosWrapper*)cryptoInfosObj.get());
        CHECK(!cryptoInfos->value.empty() && (cryptoInfos->value[0] != nullptr));
        std::unique_ptr<CodecCryptoInfo> &info = cryptoInfos->value[0];
        mode = info->mMode;
        numSubSamples = info->mNumSubSamples;
        samplesArray = info->mSubSamples;
        pattern = info->mPattern;
        if (info->mKey != nullptr) {
            jbyte * dstKey = env->GetByteArrayElements(keyArray.get(), &isCopy);
            memcpy(dstKey, info->mKey, 16);
            env->ReleaseByteArrayElements(keyArray.get(), dstKey, 0);
        }
        if (info->mIv != nullptr) {
            jbyte * dstIv = env->GetByteArrayElements(ivArray.get(), &isCopy);
            memcpy(dstIv, info->mIv, 16);
            env->ReleaseByteArrayElements(ivArray.get(), dstIv, 0);
        }
    } else {
        CHECK(msg->findInt32("mode", (int*)&mode));
        CHECK(msg->findSize("numSubSamples", &numSubSamples));
        CHECK(msg->findBuffer("subSamples", &subSamplesBuffer));
@@ -1239,56 +1263,42 @@ static void AMessageToCryptoInfo(JNIEnv * env, const jobject & obj,
        CHECK(msg->findInt32("skipBlocks", (int32_t *)&pattern.mSkipBlocks));
        CHECK(msg->findBuffer("iv", &ivBuffer));
        CHECK(msg->findBuffer("key", &keyBuffer));

    // subsamples
        samplesArray =
                (CryptoPlugin::SubSample*)(subSamplesBuffer.get()->data());
        if (keyBuffer.get() != nullptr && keyBuffer->size() > 0) {
            jbyte * dstKey = env->GetByteArrayElements(keyArray.get(), &isCopy);
            memcpy(dstKey, keyBuffer->data(), keyBuffer->size());
            env->ReleaseByteArrayElements(keyArray.get(), dstKey, 0);
        }
        if (ivBuffer.get() != nullptr && ivBuffer->size() > 0) {
            jbyte * dstIv = env->GetByteArrayElements(ivArray.get(), &isCopy);
            memcpy(dstIv, ivBuffer->data(), ivBuffer->size());
            env->ReleaseByteArrayElements(ivArray.get(), dstIv, 0);
        }
    }
    ScopedLocalRef<jintArray> samplesOfEncryptedDataArr(env, env->NewIntArray(numSubSamples));
    ScopedLocalRef<jintArray> samplesOfClearDataArr(env, env->NewIntArray(numSubSamples));
    jboolean isCopy;
    if (numSubSamples > 0) {
        jint *dstEncryptedSamples =
            env->GetIntArrayElements(samplesOfEncryptedDataArr.get(), &isCopy);
        jint * dstClearSamples =
            env->GetIntArrayElements(samplesOfClearDataArr.get(), &isCopy);

    CryptoPlugin::SubSample * samplesArray =
        (CryptoPlugin::SubSample*)(subSamplesBuffer.get()->data());

        for(int i = 0 ; i < numSubSamples ; i++) {
            dstEncryptedSamples[i] = samplesArray[i].mNumBytesOfEncryptedData;
            dstClearSamples[i] = samplesArray[i].mNumBytesOfClearData;
        }
        env->ReleaseIntArrayElements(samplesOfEncryptedDataArr.get(), dstEncryptedSamples, 0);
        env->ReleaseIntArrayElements(samplesOfClearDataArr.get(), dstClearSamples, 0);
    // key and iv
    jbyteArray keyArray = NULL;
    jbyteArray ivArray = NULL;
    if (keyBuffer.get() != nullptr && keyBuffer->size() > 0) {
        keyArray = env->NewByteArray(keyBuffer->size());
        jbyte * dstKey = env->GetByteArrayElements(keyArray, &isCopy);
        memcpy(dstKey, keyBuffer->data(), keyBuffer->size());
        env->ReleaseByteArrayElements(keyArray,dstKey,0);
    }
    if (ivBuffer.get() != nullptr && ivBuffer->size() > 0) {
        ivArray = env->NewByteArray(ivBuffer->size());
        jbyte *dstIv = env->GetByteArrayElements(ivArray, &isCopy);
        memcpy(dstIv, ivBuffer->data(), ivBuffer->size());
        env->ReleaseByteArrayElements(ivArray, dstIv,0);
    }
    // set samples, key and iv
    env->CallVoidMethod(
        obj,
        gFields.cryptoInfoSetID,
        (jint)numSubSamples,
        samplesOfClearDataArr.get(),
        samplesOfEncryptedDataArr.get(),
        keyArray,
        ivArray,
        keyArray.get(),
        ivArray.get(),
        mode);
    if (keyArray != NULL) {
        env->DeleteLocalRef(keyArray);
    }
    if (ivArray != NULL) {
        env->DeleteLocalRef(ivArray);
    }
    // set pattern
    env->CallVoidMethod(
        obj,