2
votes

Impossible de lire / écrire les caractéristiques FIDO2

Je suis en train de créer un authentificateur Android pour FIDO2. Je suis resté coincé avec les caractéristiques de lecture / écriture. Je travaille sur Mac - Chrome 75. Chrome peut détecter mon authentificateur Android BLE. Après avoir détecté mon authentificateur BLE, onCharacteristicReadRequest () est appelé du côté de l'authentificateur. Dans le onCharacteristicReadRequest () , j'utilise le code écrit ci-dessous mais il n'y a pas de réponse du client après cela.

J'ai essayé U2F avec la version 0b01000000. Cela fonctionne bien. Lorsque j'ai déplacé FIDO2 version 0b100000, je suis confronté à ce problème. Je fais de la publicité pour le service fido et le service d'informations sur les appareils de l'authentificateur. Les deux services ont été ajoutés avec l'intervalle Thread.sleep (1000). Je ne pouvais pas ajouter les deux services de manière séquentielle. Lorsque j'ajoute les deux services de manière séquentielle, j'obtiens ArrayIndexOutofBoundException .

Je ne sais pas si les deux problèmes sont liés. Veuillez me corriger si je fais quelque chose de mal.

{
...
}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);

Le client doit lire / écrire les caractéristiques une fois que fidoServiceBitFieldversion est attendu.


5 commentaires

Donc quelle est la question?


Je reçois un rappel onMtuChanged () avec mtu = 104 et onCharacteristicReadRequest (). Après cela, je ne reçois aucun rappel des caractéristiques de lecture / écriture. Y a-t-il un problème avec ma mise en œuvre?


les demandes de lecture / écriture surviennent lorsqu'un périphérique central Bluetooth communique avec votre application d'authentification.


onCharacteristicReadRequest () est appelé là où j'écris "bytes = new byte [] {0x20}; gattServer.sendResponse (device, requestId, status, 0, bytes);" pour les caractéristiques fidoServiceRevisionBitfield. Après cela, je ne reçois aucun rappel. webauthn.io peut identifier mon périphérique.


Assurez-vous de ne plus fournir la caractéristique obsolète fidoServiceRevision


3 Réponses :


2
votes

Je n'ai pas pu ajouter les deux services de manière séquentielle

Je pense que vous pourriez ajouter le service d'informations sur l'appareil comme suit:

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

Pour la caractéristique fidoServiceRevisionBitfield , J'ai simplement suivi cette déclaration un appareil qui ne prend en charge que FIDO2 Rev 1 n'aura qu'une caractéristique fidoServiceRevisionBitfield de longueur 1 avec la valeur 0x20. à l'index 8.3.5.1. Service FIDO de Document CTAP . Par conséquent, ma mise en œuvre était:

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)

1 commentaires

J'ai déjà fait la même chose "bytes = new byte [] {0x20}". Ça ne fonctionne pas. Je reçois onMtuChanged () avec mtu 104 et onCharacteristicReadRequest (). Après cela, je ne reçois aucun rappel. Y a-t-il une chance pour un autre problème?



2
votes

Vous devriez remplacer toutes les méthodes de BluetoothGattServerCallback

Je pense qu'il vous manque les implémentations 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);
}


1 commentaires

Merci pour la réponse Boa. Je reçois un rappel sur onDescriptorReadRequest (). Mais pas dans onDescriptorReadRequest (). J'ai les détails du descripteur de statut Fido. Je ne connais pas le descripteur de point de contrôle. Y a-t-il un lien?



2
votes

Je suis d'accord avec la préoccupation de @ Bao. Selon la spécification CTAP, vous devez définir le descripteur correspondant à chaque caractéristique avec l'autorisation READ / WRITE. Notez que les UUID de chaque descripteur doivent avoir un format UUID 128 bits valide. Tous les descripteurs ont à la fois les autorisations READ et WRITE. Par exemple:

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
);


0 commentaires