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

Commit 42278a2b authored by Treehugger Robot's avatar Treehugger Robot Committed by Gerrit Code Review
Browse files

Merge changes from topic "NIAP for AOSP"

* changes:
  NIAP: Try to compute data if use keystore function fail
  NIAP: implement bluetooth keystore interface.(1/2)
  NIAP: Add new argument to determine config checksum check result.(1/4)
  NIAP: Implement BluetoothKeystore feature
parents ada218ed 14112a55
Loading
Loading
Loading
Loading
+2 −0
Original line number Original line Diff line number Diff line
@@ -153,6 +153,8 @@ int register_com_android_bluetooth_gatt (JNIEnv* env);
int register_com_android_bluetooth_sdp (JNIEnv* env);
int register_com_android_bluetooth_sdp (JNIEnv* env);


int register_com_android_bluetooth_hearing_aid(JNIEnv* env);
int register_com_android_bluetooth_hearing_aid(JNIEnv* env);

int register_com_android_bluetooth_btservice_BluetoothKeystore(JNIEnv* env);
}
}


#endif /* COM_ANDROID_BLUETOOTH_H */
#endif /* COM_ANDROID_BLUETOOTH_H */
+12 −5
Original line number Original line Diff line number Diff line
@@ -680,7 +680,7 @@ static void classInitNative(JNIEnv* env, jclass clazz) {
}
}


static bool initNative(JNIEnv* env, jobject obj, jboolean isGuest,
static bool initNative(JNIEnv* env, jobject obj, jboolean isGuest,
                       jboolean isNiapMode) {
                       jboolean isNiapMode, int configCompareResult) {
  ALOGV("%s", __func__);
  ALOGV("%s", __func__);


  android_bluetooth_UidTraffic.clazz =
  android_bluetooth_UidTraffic.clazz =
@@ -694,9 +694,9 @@ static bool initNative(JNIEnv* env, jobject obj, jboolean isGuest,
    return JNI_FALSE;
    return JNI_FALSE;
  }
  }


  int ret = sBluetoothInterface->init(&sBluetoothCallbacks,
  int ret = sBluetoothInterface->init(
                                      isGuest == JNI_TRUE ? 1 : 0,
      &sBluetoothCallbacks, isGuest == JNI_TRUE ? 1 : 0,
                                      isNiapMode == JNI_TRUE ? 1 : 0);
      isNiapMode == JNI_TRUE ? 1 : 0, configCompareResult);
  if (ret != BT_STATUS_SUCCESS) {
  if (ret != BT_STATUS_SUCCESS) {
    ALOGE("Error while setting the callbacks: %d\n", ret);
    ALOGE("Error while setting the callbacks: %d\n", ret);
    sBluetoothInterface = NULL;
    sBluetoothInterface = NULL;
@@ -1312,7 +1312,7 @@ static int getMetricIdNative(JNIEnv* env, jobject obj, jbyteArray address) {
static JNINativeMethod sMethods[] = {
static JNINativeMethod sMethods[] = {
    /* name, signature, funcPtr */
    /* name, signature, funcPtr */
    {"classInitNative", "()V", (void*)classInitNative},
    {"classInitNative", "()V", (void*)classInitNative},
    {"initNative", "(ZZ)Z", (void*)initNative},
    {"initNative", "(ZZI)Z", (void*)initNative},
    {"cleanupNative", "()V", (void*)cleanupNative},
    {"cleanupNative", "()V", (void*)cleanupNative},
    {"enableNative", "()Z", (void*)enableNative},
    {"enableNative", "()Z", (void*)enableNative},
    {"disableNative", "()Z", (void*)disableNative},
    {"disableNative", "()Z", (void*)disableNative},
@@ -1377,6 +1377,13 @@ jint JNI_OnLoad(JavaVM* jvm, void* reserved) {
    return JNI_ERR;
    return JNI_ERR;
  }
  }


  status =
      android::register_com_android_bluetooth_btservice_BluetoothKeystore(e);
  if (status < 0) {
    ALOGE("jni BluetoothKeyStore registration failure: %d", status);
    return JNI_ERR;
  }

  status = android::register_com_android_bluetooth_hfp(e);
  status = android::register_com_android_bluetooth_hfp(e);
  if (status < 0) {
  if (status < 0) {
    ALOGE("jni hfp registration failure, status: %d", status);
    ALOGE("jni hfp registration failure, status: %d", status);
+171 −0
Original line number Original line Diff line number Diff line
/*
 * Copyright 2020 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#define LOG_TAG "BluetoothKeystoreServiceJni"

#include "base/logging.h"
#include "com_android_bluetooth.h"
#include "hardware/bt_keystore.h"

#include <string.h>
#include <shared_mutex>

using bluetooth::bluetooth_keystore::BluetoothKeystoreCallbacks;
using bluetooth::bluetooth_keystore::BluetoothKeystoreInterface;

namespace android {
static jmethodID method_setEncryptKeyOrRemoveKeyCallback;
static jmethodID method_getKeyCallback;

static BluetoothKeystoreInterface* sBluetoothKeystoreInterface = nullptr;
static std::shared_timed_mutex interface_mutex;

static jobject mCallbacksObj = nullptr;
static std::shared_timed_mutex callbacks_mutex;

class BluetoothKeystoreCallbacksImpl
    : public bluetooth::bluetooth_keystore::BluetoothKeystoreCallbacks {
 public:
  ~BluetoothKeystoreCallbacksImpl() = default;

  void set_encrypt_key_or_remove_key(
      const std::string prefixString,
      const std::string decryptedString) override {
    LOG(INFO) << __func__;

    std::shared_lock<std::shared_timed_mutex> lock(callbacks_mutex);
    CallbackEnv sCallbackEnv(__func__);
    if (!sCallbackEnv.valid() || mCallbacksObj == nullptr) return;

    jstring j_prefixString = sCallbackEnv->NewStringUTF(prefixString.c_str());
    jstring j_decryptedString =
        sCallbackEnv->NewStringUTF(decryptedString.c_str());

    sCallbackEnv->CallVoidMethod(mCallbacksObj,
                                 method_setEncryptKeyOrRemoveKeyCallback,
                                 j_prefixString, j_decryptedString);
  }

  std::string get_key(const std::string prefixString) override {
    LOG(INFO) << __func__;

    std::shared_lock<std::shared_timed_mutex> lock(callbacks_mutex);
    CallbackEnv sCallbackEnv(__func__);
    if (!sCallbackEnv.valid() || mCallbacksObj == nullptr) return "";

    jstring j_prefixString = sCallbackEnv->NewStringUTF(prefixString.c_str());

    jstring j_decrypt_str = (jstring)sCallbackEnv->CallObjectMethod(
        mCallbacksObj, method_getKeyCallback, j_prefixString);

    if (j_decrypt_str == nullptr) {
      ALOGE("%s: Got a null decrypt_str", __func__);
      return "";
    }

    const char* value = sCallbackEnv->GetStringUTFChars(j_decrypt_str, nullptr);
    std::string ret(value);
    sCallbackEnv->ReleaseStringUTFChars(j_decrypt_str, value);

    return ret;
  }
};

static BluetoothKeystoreCallbacksImpl sBluetoothKeystoreCallbacks;

static void classInitNative(JNIEnv* env, jclass clazz) {
  method_setEncryptKeyOrRemoveKeyCallback =
      env->GetMethodID(clazz, "setEncryptKeyOrRemoveKeyCallback",
                       "(Ljava/lang/String;Ljava/lang/String;)V");

  method_getKeyCallback = env->GetMethodID(
      clazz, "getKeyCallback", "(Ljava/lang/String;)Ljava/lang/String;");

  LOG(INFO) << __func__ << ": succeeds";
}

static void initNative(JNIEnv* env, jobject object) {
  std::unique_lock<std::shared_timed_mutex> interface_lock(interface_mutex);
  std::unique_lock<std::shared_timed_mutex> callbacks_lock(callbacks_mutex);

  const bt_interface_t* btInf = getBluetoothInterface();
  if (btInf == nullptr) {
    LOG(ERROR) << "Bluetooth module is not loaded";
    return;
  }

  if (sBluetoothKeystoreInterface != nullptr) {
    LOG(INFO)
        << "Cleaning up BluetoothKeystore Interface before initializing...";
    sBluetoothKeystoreInterface = nullptr;
  }

  if (mCallbacksObj != nullptr) {
    LOG(INFO) << "Cleaning up BluetoothKeystore callback object";
    env->DeleteGlobalRef(mCallbacksObj);
    mCallbacksObj = nullptr;
  }

  if ((mCallbacksObj = env->NewGlobalRef(object)) == nullptr) {
    LOG(ERROR)
        << "Failed to allocate Global Ref for BluetoothKeystore Callbacks";
    return;
  }

  sBluetoothKeystoreInterface =
      (BluetoothKeystoreInterface*)btInf->get_profile_interface(BT_KEYSTORE_ID);
  if (sBluetoothKeystoreInterface == nullptr) {
    LOG(ERROR) << "Failed to get BluetoothKeystore Interface";
    return;
  }

  sBluetoothKeystoreInterface->init(&sBluetoothKeystoreCallbacks);
}

static void cleanupNative(JNIEnv* env, jobject object) {
  std::unique_lock<std::shared_timed_mutex> interface_lock(interface_mutex);
  std::unique_lock<std::shared_timed_mutex> callbacks_lock(callbacks_mutex);

  const bt_interface_t* btInf = getBluetoothInterface();
  if (btInf == nullptr) {
    LOG(ERROR) << "Bluetooth module is not loaded";
    return;
  }

  if (sBluetoothKeystoreInterface != nullptr) {
    sBluetoothKeystoreInterface = nullptr;
  }

  if (mCallbacksObj != nullptr) {
    env->DeleteGlobalRef(mCallbacksObj);
    mCallbacksObj = nullptr;
  }
}

static JNINativeMethod sMethods[] = {
    {"classInitNative", "()V", (void*)classInitNative},
    {"initNative", "()V", (void*)initNative},
    {"cleanupNative", "()V", (void*)cleanupNative},
};

int register_com_android_bluetooth_btservice_BluetoothKeystore(JNIEnv* env) {
  return jniRegisterNativeMethods(
      env,
      "com/android/bluetooth/btservice/bluetoothkeystore/"
      "BluetoothKeystoreNativeInterface",
      sMethods, NELEM(sMethods));
}
}  // namespace android
+19 −2
Original line number Original line Diff line number Diff line
@@ -81,6 +81,7 @@ import com.android.bluetooth.Utils;
import com.android.bluetooth.a2dp.A2dpService;
import com.android.bluetooth.a2dp.A2dpService;
import com.android.bluetooth.a2dpsink.A2dpSinkService;
import com.android.bluetooth.a2dpsink.A2dpSinkService;
import com.android.bluetooth.btservice.RemoteDevices.DeviceProperties;
import com.android.bluetooth.btservice.RemoteDevices.DeviceProperties;
import com.android.bluetooth.btservice.bluetoothkeystore.BluetoothKeystoreService;
import com.android.bluetooth.btservice.storage.DatabaseManager;
import com.android.bluetooth.btservice.storage.DatabaseManager;
import com.android.bluetooth.btservice.storage.MetadataDatabase;
import com.android.bluetooth.btservice.storage.MetadataDatabase;
import com.android.bluetooth.gatt.GattService;
import com.android.bluetooth.gatt.GattService;
@@ -224,6 +225,7 @@ public class AdapterService extends Service {


    private BluetoothSocketManagerBinder mBluetoothSocketManagerBinder;
    private BluetoothSocketManagerBinder mBluetoothSocketManagerBinder;


    private BluetoothKeystoreService mBluetoothKeystoreService;
    private A2dpService mA2dpService;
    private A2dpService mA2dpService;
    private A2dpSinkService mA2dpSinkService;
    private A2dpSinkService mA2dpSinkService;
    private HeadsetService mHeadsetService;
    private HeadsetService mHeadsetService;
@@ -434,7 +436,10 @@ public class AdapterService extends Service {
        mAdapterProperties = new AdapterProperties(this);
        mAdapterProperties = new AdapterProperties(this);
        mAdapterStateMachine = AdapterState.make(this);
        mAdapterStateMachine = AdapterState.make(this);
        mJniCallbacks = new JniCallbacks(this, mAdapterProperties);
        mJniCallbacks = new JniCallbacks(this, mAdapterProperties);
        initNative(isGuest(), isNiapMode());
        mBluetoothKeystoreService = new BluetoothKeystoreService(isNiapMode());
        mBluetoothKeystoreService.start();
        int configCompareResult = mBluetoothKeystoreService.getCompareResult();
        initNative(isGuest(), isNiapMode(), configCompareResult);
        mNativeAvailable = true;
        mNativeAvailable = true;
        mCallbacks = new RemoteCallbackList<IBluetoothCallback>();
        mCallbacks = new RemoteCallbackList<IBluetoothCallback>();
        mAppOps = getSystemService(AppOpsManager.class);
        mAppOps = getSystemService(AppOpsManager.class);
@@ -448,6 +453,8 @@ public class AdapterService extends Service {
        mBatteryStats = IBatteryStats.Stub.asInterface(
        mBatteryStats = IBatteryStats.Stub.asInterface(
                ServiceManager.getService(BatteryStats.SERVICE_NAME));
                ServiceManager.getService(BatteryStats.SERVICE_NAME));


        mBluetoothKeystoreService.initJni();

        mSdpManager = SdpManager.init(this);
        mSdpManager = SdpManager.init(this);
        registerReceiver(mAlarmBroadcastReceiver, new IntentFilter(ACTION_ALARM_WAKEUP));
        registerReceiver(mAlarmBroadcastReceiver, new IntentFilter(ACTION_ALARM_WAKEUP));


@@ -737,6 +744,10 @@ public class AdapterService extends Service {
            mSdpManager = null;
            mSdpManager = null;
        }
        }


        if (mBluetoothKeystoreService != null) {
            mBluetoothKeystoreService.cleanup();
        }

        if (mNativeAvailable) {
        if (mNativeAvailable) {
            debugLog("cleanup() - Cleaning up adapter native");
            debugLog("cleanup() - Cleaning up adapter native");
            cleanupNative();
            cleanupNative();
@@ -1883,6 +1894,11 @@ public class AdapterService extends Service {
            if (service.mDatabaseManager != null) {
            if (service.mDatabaseManager != null) {
                service.mDatabaseManager.factoryReset();
                service.mDatabaseManager.factoryReset();
            }
            }

            if (service.mBluetoothKeystoreService != null) {
                service.mBluetoothKeystoreService.factoryReset();
            }

            return service.factoryResetNative();
            return service.factoryResetNative();
        }
        }


@@ -3022,7 +3038,8 @@ public class AdapterService extends Service {


    static native void classInitNative();
    static native void classInitNative();


    native boolean initNative(boolean startRestricted, boolean isNiapMode);
    native boolean initNative(boolean startRestricted, boolean isNiapMode,
            int configCompareResult);


    native void cleanupNative();
    native void cleanupNative();


+104 −0
Original line number Original line Diff line number Diff line
/*
 * Copyright 2020 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package com.android.bluetooth.btservice.bluetoothkeystore;

import android.util.Log;

import com.android.internal.annotations.GuardedBy;

import java.io.IOException;
import java.security.NoSuchAlgorithmException;

final class BluetoothKeystoreNativeInterface {

    private static final String TAG = "BluetoothKeystoreNativeInterface";

    @GuardedBy("INSTANCE_LOCK")
    private static BluetoothKeystoreNativeInterface sInstance;
    private static final Object INSTANCE_LOCK = new Object();

    static {
        classInitNative();
    }

    private BluetoothKeystoreNativeInterface() {
    }

    /**
     * Get singleton instance.
     */
    public static BluetoothKeystoreNativeInterface getInstance() {
        synchronized (INSTANCE_LOCK) {
            if (sInstance == null) {
                sInstance = new BluetoothKeystoreNativeInterface();
            }
            return sInstance;
        }
    }

    /**
     * Initializes the native interface.
     *
     * priorities to configure.
     */
    public void init() {
        initNative();
    }

    /**
     * Cleanup the native interface.
     */
    public void cleanup() {
        cleanupNative();
    }

    // Callbacks from the native stack back into the Java framework.
    // All callbacks are routed via the Service which will disambiguate which
    // state machine the message should be routed to.

    private void setEncryptKeyOrRemoveKeyCallback(String prefixString, String decryptedString) {
        BluetoothKeystoreService service = BluetoothKeystoreService.getBluetoothKeystoreService();
        if (service != null) {
            try {
                service.setEncryptKeyOrRemoveKey(prefixString, decryptedString);
            } catch (InterruptedException e) {
                Log.e(TAG, "Interrupted while operating.");
            } catch (IOException e) {
                Log.e(TAG, "IO error while file operating.");
            } catch (NoSuchAlgorithmException e) {
                Log.e(TAG, "encrypt could not find the algorithm: SHA256");
            }
        } else {
            Log.e(TAG, "Event ignored, service not available: " + prefixString);
        }
    }

    private String getKeyCallback(String prefixString) {
        BluetoothKeystoreService service = BluetoothKeystoreService.getBluetoothKeystoreService();
        if (service != null) {
            return service.getKey(prefixString);
        } else {
            Log.e(TAG, "Event ignored, service not available: " + prefixString);
            return null;
        }
    }

    // Native methods that call into the JNI interface
    private static native void classInitNative();
    private native void initNative();
    private native void cleanupNative();
}
Loading