Merge "Use non nostd secretkeeper_* libraries" into main
diff --git a/audio/aidl/default/ModulePrimary.cpp b/audio/aidl/default/ModulePrimary.cpp
index 6cb9251..7121fe1 100644
--- a/audio/aidl/default/ModulePrimary.cpp
+++ b/audio/aidl/default/ModulePrimary.cpp
@@ -115,7 +115,7 @@
     desc->sharedMemory.fd = ndk::ScopedFileDescriptor(fd);
     desc->sharedMemory.size = bufferSizeBytes;
     desc->burstSizeFrames = bufferSizeFrames / 2;
-    desc->flags = 0;
+    desc->flags = 1 << MmapBufferDescriptor::FLAG_INDEX_APPLICATION_SHAREABLE;
     LOG(DEBUG) << __func__ << ": " << desc->toString();
     return ndk::ScopedAStatus::ok();
 }
diff --git a/audio/aidl/default/stub/StreamMmapStub.cpp b/audio/aidl/default/stub/StreamMmapStub.cpp
index f48aea4..5516702 100644
--- a/audio/aidl/default/stub/StreamMmapStub.cpp
+++ b/audio/aidl/default/stub/StreamMmapStub.cpp
@@ -269,7 +269,7 @@
     desc->sharedMemory.fd = mSharedMemoryFd.dup();
     desc->sharedMemory.size = bufferSizeBytes;
     desc->burstSizeFrames = bufferSizeFrames / 2;
-    desc->flags = 0;
+    desc->flags = 1 << MmapBufferDescriptor::FLAG_INDEX_APPLICATION_SHAREABLE;
     LOG(DEBUG) << __func__ << ": " << desc->toString();
     return ndk::ScopedAStatus::ok();
 }
diff --git a/audio/aidl/vts/VtsHalAudioEffectTargetTest.cpp b/audio/aidl/vts/VtsHalAudioEffectTargetTest.cpp
index 5b78981..6ea6453 100644
--- a/audio/aidl/vts/VtsHalAudioEffectTargetTest.cpp
+++ b/audio/aidl/vts/VtsHalAudioEffectTargetTest.cpp
@@ -72,8 +72,9 @@
             mEffect.reset();
         }
     }
-
-    static const long kInputFrameCount = 0x100, kOutputFrameCount = 0x100;
+    // Ensuring frame count keeps input clip duration above 10 ms, as
+    // preprocessing effect tests pass only for durations exceeding 10 ms.
+    static const long kInputFrameCount = 512, kOutputFrameCount = 512;
     std::shared_ptr<IFactory> mFactory;
     std::shared_ptr<IEffect> mEffect;
     Descriptor mDescriptor;
diff --git a/audio/aidl/vts/VtsHalDynamicsProcessingTest.cpp b/audio/aidl/vts/VtsHalDynamicsProcessingTest.cpp
index 98f7d79..7553b0f 100644
--- a/audio/aidl/vts/VtsHalDynamicsProcessingTest.cpp
+++ b/audio/aidl/vts/VtsHalDynamicsProcessingTest.cpp
@@ -120,7 +120,7 @@
 
     void setParamsAndProcess(std::vector<float>& input, std::vector<float>& output);
 
-    float calculateDb(const std::vector<float>& input, size_t startSamplePos);
+    float calculateDb(const std::vector<float>& input, size_t startSamplePos, size_t endSamplePos);
 
     void getMagnitudeValue(const std::vector<float>& output, std::vector<float>& bufferMag);
 
@@ -430,9 +430,11 @@
 // This function calculates power for both and mono and stereo data as the total power for
 // interleaved multichannel data can be calculated by treating it as a continuous mono input.
 float DynamicsProcessingTestHelper::calculateDb(const std::vector<float>& input,
-                                                size_t startSamplePos = 0) {
+                                                size_t startSamplePos = 0,
+                                                size_t endSamplePos = 0) {
+    size_t sampleCount = (endSamplePos == 0 ? input.size() : endSamplePos) - startSamplePos;
     return audio_utils_compute_power_mono(input.data() + startSamplePos, AUDIO_FORMAT_PCM_FLOAT,
-                                          input.size() - startSamplePos);
+                                          sampleCount);
 }
 
 void DynamicsProcessingTestHelper::setParamsAndProcess(std::vector<float>& input,
@@ -900,6 +902,54 @@
         }
     }
 
+    void testReleaseTimeParam(float thresholdDb, bool isLimiterEngaged) {
+        for (size_t i = mInput.size() / 2; i < mInput.size(); i++) {
+            mInput[i] = mInput[i] / 2;
+        }
+        float firstHalfDb = calculateDb(mInput, 0, mInput.size() / 2);
+        float secondHalfDb = calculateDb(mInput, mInput.size() / 2, mInput.size());
+        mInputDb = calculateDb(mInput, 0, mInput.size());
+
+        float referenceDb;
+        if (isLimiterEngaged) {
+            ASSERT_TRUE(thresholdDb < firstHalfDb && thresholdDb >= secondHalfDb)
+                    << "Threshold level: " << thresholdDb << "First half level: " << firstHalfDb
+                    << "Second half level: " << secondHalfDb;
+            referenceDb = FLT_MAX;
+        } else {
+            ASSERT_TRUE(thresholdDb > firstHalfDb && thresholdDb > secondHalfDb)
+                    << "Threshold level: " << thresholdDb << "First half level: " << firstHalfDb
+                    << "Second half level: " << secondHalfDb;
+            referenceDb = mInputDb;
+        }
+        std::vector<float> output(mInput.size());
+        for (float releaseTimeMs : kReleaseTimeMsValues) {
+            cleanUpLimiterConfig();
+            for (int i = 0; i < mChannelCount; i++) {
+                fillLimiterConfig(mLimiterConfigList, i, true, kDefaultLinkerGroup,
+                                  kDefaultAttackTime, releaseTimeMs, kDefaultRatio, thresholdDb,
+                                  kDefaultPostGain);
+            }
+            ASSERT_NO_FATAL_FAILURE(setLimiterParamsAndProcess(mInput, output));
+            if (!isAllParamsValid()) {
+                continue;
+            }
+            float outputDb = calculateDb(output, kStartIndex);
+            if (isLimiterEngaged) {
+                /*Release time determines how quickly the compressor returns to normal after the
+                 * input falls below the threshold. As the release time increases, it takes longer
+                 * for the compressor to stop compressing, resulting in a decrease in output
+                 * decibels as the release time increases*/
+                ASSERT_LT(outputDb, referenceDb) << "Release Time: " << releaseTimeMs;
+                referenceDb = outputDb;
+            } else {
+                // No change in the outputdB when the limiter is not enganged
+                EXPECT_NEAR(outputDb, referenceDb, kToleranceDb)
+                        << "Release Time: " << releaseTimeMs;
+            }
+        }
+    }
+
     void cleanUpLimiterConfig() {
         CleanUp();
         mLimiterConfigList.clear();
@@ -913,6 +963,7 @@
     static constexpr float kLimiterTestToleranceDb = 0.05;
     static constexpr float kMinDifferenceDb = 5;
     const std::vector<bool> kEnableValues = {true, false, true};
+    const std::vector<float> kReleaseTimeMsValues = {0, 10, 20, 30, 40, 50};
     std::vector<DynamicsProcessing::LimiterConfig> mLimiterConfigList;
     int mBufferSize;
 };
@@ -1007,6 +1058,18 @@
     }
 }
 
+TEST_P(DynamicsProcessingLimiterConfigDataTest, LimiterReleaseTime) {
+    // Using a threshold dB value that compresses only the first half of the input.
+    float thresholdDb = -7;
+    ASSERT_NO_FATAL_FAILURE(testReleaseTimeParam(thresholdDb, true));
+}
+
+TEST_P(DynamicsProcessingLimiterConfigDataTest, LimiterNotEngagedReleaseTimeTest) {
+    // Using threshold value such that limiter does not engage with the input
+    float thresholdDb = -1;
+    ASSERT_NO_FATAL_FAILURE(testReleaseTimeParam(thresholdDb, false));
+}
+
 INSTANTIATE_TEST_SUITE_P(DynamicsProcessingTest, DynamicsProcessingLimiterConfigDataTest,
                          testing::ValuesIn(EffectFactoryHelper::getAllEffectDescriptors(
                                  IFactory::descriptor, getEffectTypeUuidDynamicsProcessing())),
diff --git a/security/keymint/aidl/android/hardware/security/keymint/KeyMintHardwareInfo.aidl b/security/keymint/aidl/android/hardware/security/keymint/KeyMintHardwareInfo.aidl
index b82dee6..3efa337 100644
--- a/security/keymint/aidl/android/hardware/security/keymint/KeyMintHardwareInfo.aidl
+++ b/security/keymint/aidl/android/hardware/security/keymint/KeyMintHardwareInfo.aidl
@@ -32,21 +32,27 @@
      */
     int versionNumber;
 
-    /* securityLevel is the security level of the IKeyMintDevice implementation accessed
-     * through this aidl package.  */
+    /**
+     * securityLevel is the security level of the IKeyMintDevice implementation accessed
+     * through this aidl package.
+     */
     SecurityLevel securityLevel = SecurityLevel.SOFTWARE;
 
-    /* keyMintName is the name of the IKeyMintDevice implementation.  */
+    /**
+     * keyMintName is the name of the IKeyMintDevice implementation. The name must not be empty.
+     */
     @utf8InCpp String keyMintName;
 
-    /* keyMintAuthorName is the name of the author of the IKeyMintDevice implementation
-     *         (organization name, not individual). This name is implementation defined,
-     *         so it can be used to distinguish between different implementations from the
-     *         same author.
+    /**
+     * keyMintAuthorName is the name of the author of the IKeyMintDevice implementation
+     * (organization name, not individual). This name is implementation defined, so it can be used
+     * to distinguish between different implementations from the same author. The name must not be
+     * empty.
      */
     @utf8InCpp String keyMintAuthorName;
 
-    /* The timestampTokenRequired is a boolean flag, which when true reflects that IKeyMintDevice
+    /**
+     * The timestampTokenRequired is a boolean flag, which when true reflects that IKeyMintDevice
      * instance will expect a valid TimeStampToken with various operations. This will typically
      * required by the StrongBox implementations that generally don't have secure clock hardware to
      * generate timestamp tokens.
diff --git a/security/keymint/aidl/vts/functional/AuthTest.cpp b/security/keymint/aidl/vts/functional/AuthTest.cpp
index f435513..b3bf4d3 100644
--- a/security/keymint/aidl/vts/functional/AuthTest.cpp
+++ b/security/keymint/aidl/vts/functional/AuthTest.cpp
@@ -28,6 +28,7 @@
 #include <aidl/android/hardware/security/secureclock/ISecureClock.h>
 #include <android-base/logging.h>
 #include <android/binder_manager.h>
+#include <vendorsupport/api_level.h>
 
 using aidl::android::hardware::gatekeeper::GatekeeperEnrollResponse;
 using aidl::android::hardware::gatekeeper::GatekeeperVerifyResponse;
@@ -540,6 +541,92 @@
               Finish(message, {} /* signature */, &ciphertext, dodgy_hat.value()));
 }
 
+// Test use of a key with large message that requires an auth token for each action on the
+// operation, with a per-operation challenge value included.
+TEST_P(AuthTest, AuthPerOperationLargeMessage) {
+    if (!GatekeeperAvailable()) {
+        GTEST_SKIP() << "No Gatekeeper available";
+    }
+    if (SecLevel() == SecurityLevel::STRONGBOX &&
+        get_vendor_api_level() <= AVendorSupport_getVendorApiLevelOf(__ANDROID_API_V__)) {
+        // Certain Strongbox implementations incorrectly handle Auth-bound key
+        // operations with large input messages, leading to VERIFICATION_FAILED
+        // error. This test is skipped for these older implementations.
+        GTEST_SKIP() << "Skip test on StrongBox device with vendor-api-level <= __ANDROID_API_V__";
+    }
+
+    // Create an AES key that requires authentication per-action.
+    auto builder = AuthorizationSetBuilder()
+                           .AesEncryptionKey(256)
+                           .BlockMode(BlockMode::CBC)
+                           .Padding(PaddingMode::PKCS7)
+                           .Authorization(TAG_USER_SECURE_ID, sid_)
+                           .Authorization(TAG_USER_AUTH_TYPE, HardwareAuthenticatorType::PASSWORD);
+    vector<uint8_t> keyblob;
+    vector<KeyCharacteristics> key_characteristics;
+    vector<Certificate> cert_chain;
+    ASSERT_EQ(ErrorCode::OK,
+              GenerateKey(builder, std::nullopt, &keyblob, &key_characteristics, &cert_chain));
+
+    vector<vector<size_t>> chunk_sizes = {
+            {2048},
+            {2048, 0},
+            {1024, 1024},
+            {1024, 1024, 0},
+            {512, 512, 512, 512},
+            {512, 512, 512, 512, 0},
+    };
+    auto params = AuthorizationSetBuilder().BlockMode(BlockMode::CBC).Padding(PaddingMode::PKCS7);
+
+    for (const auto& chunks : chunk_sizes) {
+        AuthorizationSet out_params;
+        ASSERT_EQ(ErrorCode::OK, Begin(KeyPurpose::ENCRYPT, keyblob, params, &out_params));
+        auto iv = out_params.GetTagValue(TAG_NONCE);
+        EXPECT_TRUE(iv);
+
+        // Get a HAT with the challenge from an in-progress operation.
+        auto hat = doVerify(challenge_, handle_, password_);
+        ASSERT_TRUE(hat.has_value());
+        ASSERT_EQ(hat->userId, sid_);
+
+        // Encrypt in the given chunk sizes.
+        string message;
+        string ciphertext;
+        for (int i = 0; i < chunks.size(); i++) {
+            SCOPED_TRACE(testing::Message()
+                         << "chunk[" << i << "] of " << chunks.size() << ", size " << chunks[i]);
+            string msg_chunk = string(chunks[i], 'A');
+            string ct_chunk;
+            if (i < chunks.size() - 1) {
+                // Pass in n-1 chunks to `update()`
+                std::cerr << "Update(size=" << chunks[i] << ")\n";
+                ASSERT_EQ(ErrorCode::OK, Update(msg_chunk, &ct_chunk, hat.value(), {}));
+            } else {
+                // Pass the final chunk to `finish()`
+                std::cerr << "Finish(size=" << chunks[i] << ")\n";
+                ASSERT_EQ(ErrorCode::OK,
+                          Finish(msg_chunk, {} /* signature */, &ct_chunk, hat.value()));
+            }
+            message += msg_chunk;
+            ciphertext += ct_chunk;
+        }
+
+        auto params_iv = AuthorizationSetBuilder().Authorizations(params).Authorization(TAG_NONCE,
+                                                                                        iv->get());
+        out_params.Clear();
+        // Decrypt in one go
+        ASSERT_EQ(ErrorCode::OK, Begin(KeyPurpose::DECRYPT, keyblob, params_iv, &out_params));
+        hat = doVerify(challenge_, handle_, password_);
+        ASSERT_TRUE(hat.has_value());
+        ASSERT_EQ(hat->userId, sid_);
+
+        string plaintext;
+        ASSERT_EQ(ErrorCode::OK, Finish(ciphertext, {} /* signature */, &plaintext, hat.value()));
+
+        EXPECT_EQ(message, plaintext);
+    }
+}
+
 // Test use of a key that requires an auth token for each action on the operation, with
 // a per-operation challenge value included, with multiple secure IDs allowed.
 TEST_P(AuthTest, AuthPerOperationMultiSid) {
diff --git a/security/keymint/aidl/vts/functional/KeyMintAidlTestBase.cpp b/security/keymint/aidl/vts/functional/KeyMintAidlTestBase.cpp
index 0ec76a5..22c1511 100644
--- a/security/keymint/aidl/vts/functional/KeyMintAidlTestBase.cpp
+++ b/security/keymint/aidl/vts/functional/KeyMintAidlTestBase.cpp
@@ -730,7 +730,9 @@
                                              {} /* verificationToken */));
 }
 
-ErrorCode KeyMintAidlTestBase::Update(const string& input, string* output) {
+ErrorCode KeyMintAidlTestBase::Update(const string& input, string* output,
+                                      std::optional<HardwareAuthToken> hat,
+                                      std::optional<secureclock::TimeStampToken> time_token) {
     SCOPED_TRACE("Update");
 
     Status result;
@@ -740,7 +742,7 @@
     if (!op_) return ErrorCode::UNEXPECTED_NULL_POINTER;
 
     std::vector<uint8_t> o_put;
-    result = op_->update(vector<uint8_t>(input.begin(), input.end()), {}, {}, &o_put);
+    result = op_->update(vector<uint8_t>(input.begin(), input.end()), hat, time_token, &o_put);
 
     if (result.isOk()) {
         output->append(o_put.begin(), o_put.end());
diff --git a/security/keymint/aidl/vts/functional/KeyMintAidlTestBase.h b/security/keymint/aidl/vts/functional/KeyMintAidlTestBase.h
index 6c327bb..d4ce034 100644
--- a/security/keymint/aidl/vts/functional/KeyMintAidlTestBase.h
+++ b/security/keymint/aidl/vts/functional/KeyMintAidlTestBase.h
@@ -173,7 +173,9 @@
     ErrorCode Begin(KeyPurpose purpose, const AuthorizationSet& in_params);
 
     ErrorCode UpdateAad(const string& input);
-    ErrorCode Update(const string& input, string* output);
+    ErrorCode Update(const string& input, string* output) { return Update(input, output, {}, {}); }
+    ErrorCode Update(const string& input, string* output, std::optional<HardwareAuthToken> hat,
+                     std::optional<secureclock::TimeStampToken> time_token);
 
     ErrorCode Finish(const string& message, const string& signature, string* output,
                      std::optional<HardwareAuthToken> hat = std::nullopt,
diff --git a/security/keymint/aidl/vts/functional/KeyMintTest.cpp b/security/keymint/aidl/vts/functional/KeyMintTest.cpp
index 5a6eea1..0c3bbfb 100644
--- a/security/keymint/aidl/vts/functional/KeyMintTest.cpp
+++ b/security/keymint/aidl/vts/functional/KeyMintTest.cpp
@@ -8198,6 +8198,18 @@
     EXPECT_EQ(info, info2);
 }
 
+TEST_P(GetHardwareInfoTest, GetHardwareInfoNonEmptyNames) {
+    KeyMintHardwareInfo info;
+    ASSERT_TRUE(keyMint().getHardwareInfo(&info).isOk());
+    int vendor_api_level = get_vendor_api_level();
+    if (vendor_api_level <= 202504) {
+        GTEST_SKIP() << "Applies only to vendor API level > 202504, but this device is: "
+                     << vendor_api_level;
+    }
+    EXPECT_NE(info.keyMintName, "");
+    EXPECT_NE(info.keyMintAuthorName, "");
+}
+
 INSTANTIATE_KEYMINT_AIDL_TEST(GetHardwareInfoTest);
 
 typedef KeyMintAidlTestBase AddEntropyTest;