我正在为fido2构建一个android身份验证器。我被读/写特性困住了。我正在开发mac-chrome 75。chrome可以检测到我的android身份验证程序。在检测到我的布尔身份验证器之后,onCharacteristicReadRequest()将从身份验证器端调用。在onCharacteristicReadRequest()中,我正在使用下面编写的代码,但之后没有来自客户端的响应。
我试过0b1000000版本的u2f。很好用。当我移动fido2版本0b100000时,我面临着这个问题。我是广告fido服务和设备信息服务认证。两个服务都已添加thread.sleep(1000)interval。我无法按顺序添加这两个服务。当我按顺序添加这两个服务时,我将得到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之后读取/写入特征。

最佳答案

我无法按顺序添加两个服务
我认为您可以添加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的特性,我只是在CTAP document的索引a device that only supports FIDO2 Rev 1 will only have a fidoServiceRevisionBitfield characteristic of length 1 with value 0x20.处遵循这条语句。因此,我的实现是:
if(characteristic.getUuid().equals(FIDO2GattService.SERVICE_REVISION_BITFIELD)) {
    status = BluetoothGatt.GATT_SUCCESS;
    bytes = new byte[] {0x20}
}
gattServer.sendResponse(device, requestId, status, 0, bytes);

09-29 22:37