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.
3 Réponses :
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éclarationun 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'index8.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)
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?
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); }
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?
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 );
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