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

Commit f23eea17 authored by Jacky Cheung's avatar Jacky Cheung Committed by android-build-merger
Browse files

Merge "Gradually increase the level of authentication on failed GATT operations."

am: 6071abdb92

Change-Id: If06babf4a23879acdfc358838cdc094d753c362b
parents ece5251b 3b008f09
Loading
Loading
Loading
Loading
+31 −18
Original line number Diff line number Diff line
@@ -44,14 +44,18 @@ public final class BluetoothGatt implements BluetoothProfile {
    private IBluetoothGatt mService;
    private BluetoothGattCallback mCallback;
    private int mClientIf;
    private boolean mAuthRetry = false;
    private BluetoothDevice mDevice;
    private boolean mAutoConnect;
    private int mAuthRetryState;
    private int mConnState;
    private final Object mStateLock = new Object();
    private Boolean mDeviceBusy = false;
    private int mTransport;

    private static final int AUTH_RETRY_STATE_IDLE = 0;
    private static final int AUTH_RETRY_STATE_NO_MITM = 1;
    private static final int AUTH_RETRY_STATE_MITM = 2;

    private static final int CONN_STATE_IDLE = 0;
    private static final int CONN_STATE_CONNECTING = 1;
    private static final int CONN_STATE_CONNECTED = 2;
@@ -259,17 +263,19 @@ public final class BluetoothGatt implements BluetoothProfile {

                if ((status == GATT_INSUFFICIENT_AUTHENTICATION
                  || status == GATT_INSUFFICIENT_ENCRYPTION)
                  && mAuthRetry == false) {
                  && (mAuthRetryState != AUTH_RETRY_STATE_MITM)) {
                    try {
                        mAuthRetry = true;
                        mService.readCharacteristic(mClientIf, address, handle, AUTHENTICATION_MITM);
                        final int authReq = (mAuthRetryState == AUTH_RETRY_STATE_IDLE) ?
                                AUTHENTICATION_NO_MITM : AUTHENTICATION_MITM;
                        mService.readCharacteristic(mClientIf, address, handle, authReq);
                        mAuthRetryState++;
                        return;
                    } catch (RemoteException e) {
                        Log.e(TAG,"",e);
                    }
                }

                mAuthRetry = false;
                mAuthRetryState = AUTH_RETRY_STATE_IDLE;

                BluetoothGattCharacteristic characteristic = getCharacteristicById(mDevice, handle);
                if (characteristic == null) {
@@ -308,19 +314,20 @@ public final class BluetoothGatt implements BluetoothProfile {

                if ((status == GATT_INSUFFICIENT_AUTHENTICATION
                  || status == GATT_INSUFFICIENT_ENCRYPTION)
                  && mAuthRetry == false) {
                  && (mAuthRetryState != AUTH_RETRY_STATE_MITM)) {
                    try {
                        mAuthRetry = true;
                        final int authReq = (mAuthRetryState == AUTH_RETRY_STATE_IDLE) ?
                                AUTHENTICATION_NO_MITM : AUTHENTICATION_MITM;
                        mService.writeCharacteristic(mClientIf, address, handle,
                            characteristic.getWriteType(), AUTHENTICATION_MITM,
                            characteristic.getValue());
                            characteristic.getWriteType(), authReq, characteristic.getValue());
                        mAuthRetryState++;
                        return;
                    } catch (RemoteException e) {
                        Log.e(TAG,"",e);
                    }
                }

                mAuthRetry = false;
                mAuthRetryState = AUTH_RETRY_STATE_IDLE;

                try {
                    mCallback.onCharacteristicWrite(BluetoothGatt.this, characteristic, status);
@@ -375,17 +382,19 @@ public final class BluetoothGatt implements BluetoothProfile {

                if ((status == GATT_INSUFFICIENT_AUTHENTICATION
                  || status == GATT_INSUFFICIENT_ENCRYPTION)
                  && mAuthRetry == false) {
                  && (mAuthRetryState != AUTH_RETRY_STATE_MITM)) {
                    try {
                        mAuthRetry = true;
                        mService.readDescriptor(mClientIf, address, handle, AUTHENTICATION_MITM);
                        final int authReq = (mAuthRetryState == AUTH_RETRY_STATE_IDLE) ?
                                AUTHENTICATION_NO_MITM : AUTHENTICATION_MITM;
                        mService.readDescriptor(mClientIf, address, handle, authReq);
                        mAuthRetryState++;
                        return;
                    } catch (RemoteException e) {
                        Log.e(TAG,"",e);
                    }
                }

                mAuthRetry = true;
                mAuthRetryState = AUTH_RETRY_STATE_IDLE;

                try {
                    mCallback.onDescriptorRead(BluetoothGatt.this, descriptor, status);
@@ -414,18 +423,20 @@ public final class BluetoothGatt implements BluetoothProfile {

                if ((status == GATT_INSUFFICIENT_AUTHENTICATION
                  || status == GATT_INSUFFICIENT_ENCRYPTION)
                  && mAuthRetry == false) {
                  && (mAuthRetryState != AUTH_RETRY_STATE_MITM)) {
                    try {
                        mAuthRetry = true;
                        final int authReq = (mAuthRetryState == AUTH_RETRY_STATE_IDLE) ?
                                AUTHENTICATION_NO_MITM : AUTHENTICATION_MITM;
                        mService.writeDescriptor(mClientIf, address, handle,
                            AUTHENTICATION_MITM, descriptor.getValue());
                            authReq, descriptor.getValue());
                        mAuthRetryState++;
                        return;
                    } catch (RemoteException e) {
                        Log.e(TAG,"",e);
                    }
                }

                mAuthRetry = false;
                mAuthRetryState = AUTH_RETRY_STATE_IDLE;

                try {
                    mCallback.onDescriptorWrite(BluetoothGatt.this, descriptor, status);
@@ -499,6 +510,7 @@ public final class BluetoothGatt implements BluetoothProfile {
        mServices = new ArrayList<BluetoothGattService>();

        mConnState = CONN_STATE_IDLE;
        mAuthRetryState = AUTH_RETRY_STATE_IDLE;
    }

    /**
@@ -512,6 +524,7 @@ public final class BluetoothGatt implements BluetoothProfile {

        unregisterApp();
        mConnState = CONN_STATE_CLOSED;
        mAuthRetryState = AUTH_RETRY_STATE_IDLE;
    }

    /**