Невозможно прочитать / написать символы FIDO2 - PullRequest
1 голос
/ 11 июня 2019

Я создаю аутентификатор Android для FIDO2. Я застрял с характеристиками чтения / записи. Я работаю на Mac - Chrome 75. Chrome может обнаружить мой аутентификатор BLE Android. После обнаружения моего BLE Authenticator, onCharacteristicReadRequest() вызывается со стороны аутентификатора. Внутри onCharacteristicReadRequest() я использую код, написанный ниже, но после этого ответа от клиента нет.

Я пробовал U2F с версией 0b01000000. Работает нормально. Когда я переместил FIDO2 версии 0b100000, я столкнулся с этой проблемой. Я рекламирую фидо-сервис и сервис информации об устройстве от аутентификатора. Обе службы были добавлены с интервалом Thread.sleep (1000). Я не мог добавить обе услуги последовательно. Когда я добавляю обе услуги последовательно, я получаю ArrayIndexOutofBoundException.

Я не знаю, связаны ли обе проблемы. Пожалуйста, поправьте меня, если я делаю что-то не так.

{
...
}else if (characteristic.getUuid().equals(FidoUUIDConstants.FIDO_SERVICE_REVISION_BITFIELD)) {
    status = BluetoothGatt.GATT_SUCCESS;
    ByteBuffer bb = ByteBuffer.allocate(1);
    bb.order(ByteOrder.BIG_ENDIAN);
    bb.put((byte) (1 << 5));
    bytes = bb.array();
}
mGattServer.sendResponse(device, requestId, status, 0, bytes);

Клиент должен читать / записывать характеристики после того, как ожидается fidoServiceBitFieldversion.

Ответы [ 3 ]

2 голосов
/ 12 июня 2019

Вы должны переопределить все методы BluetoothGattServerCallback

Я думаю, что вам не хватает onDescriptorReadRequest, onDescriptorWriteRequest реализует.

@Override
public void onDescriptorReadRequest(BluetoothDevice device, int requestId, int offset, BluetoothGattDescriptor descriptor) {
    if (descriptor.getCharacteristic().getUuid().equals(FIDO2GattService.CONTROL_POINT_UUID) &&
            descriptor.getUuid().equals(FIDO2GattService.CONTROL_POINT_DESCRIPTOR_UUID)) {
        gattServer.sendResponse(device, requestId, BluetoothGatt.GATT_SUCCESS, offset, new byte[] {0x31, 0x2e, 0x32});
    } else {
        gattServer.sendResponse(device, requestId, BluetoothGatt.GATT_SUCCESS, offset, new byte[] {0x00, 0x00});
    }
}
@Override
public void onDescriptorWriteRequest(BluetoothDevice device, int requestId, BluetoothGattDescriptor descriptor, boolean preparedWrite, boolean responseNeeded, int offset, byte[] value) {
    gattServer.sendResponse(device, requestId, BluetoothGatt.GATT_SUCCESS, offset, value);
}
2 голосов
/ 15 июня 2019

Я согласился с озабоченностью @ Бао.В соответствии со спецификацией CTAP, вы должны определить дескриптор, соответствующий каждой характеристике с разрешением READ / WRITE.Обратите внимание, что для каждого дескриптора UUID необходим правильный 128-битный формат UUID.Все дескрипторы имеют разрешения READ и WRITE.Например:

UUID CONTROL_POINT_DESCRIPTOR_UUID = UUID.fromString("00002901-0000-1000-8000-00805f9b34fb");
BluetoothGattDescriptor controlPointDescriptor = new BluetoothGattDescriptor(
    CONTROL_POINT_DESCRIPTOR_UUID,
    BluetoothGattDescriptor.PERMISSION_READ | BluetoothGattDescriptor.PERMISSION_WRITE
);
2 голосов
/ 11 июня 2019

Я не могу добавить обе службы последовательно

Я думаю, вы можете добавить device info service, как показано ниже:

gattServer = bleManager.openGattServer(this, new BluetoothGattServerCallback() {
    @Override
    public void onServiceAdded(int status, BluetoothGattService service) {
        if (service.getUuid().equals(FidoUUIDConstants.FIDO2_GATT_SERVICE)) {
            gattServer.addService(deviceInfoService);
        }
    }
});
gattServer.addService(fido2GattService)

Для характеристики fidoServiceRevisionBitfield Я просто следовал этому заявлению a device that only supports FIDO2 Rev 1 will only have a fidoServiceRevisionBitfield characteristic of length 1 with value 0x20. по индексу 8.3.5.1. FIDO Service из документа CTAP .Следовательно, моя реализация была:

if(characteristic.getUuid().equals(FIDO2GattService.SERVICE_REVISION_BITFIELD)) {
    status = BluetoothGatt.GATT_SUCCESS;
    bytes = new byte[] {0x20}
}
gattServer.sendResponse(device, requestId, status, 0, bytes);
...