assertionCredential method

Map<String, dynamic> assertionCredential({
  1. required String challenge,
  2. required int counter,
  3. String? userHandle,
})

Builds a browser-shaped assertion with an ASN.1 DER ES256 signature.

Implementation

Map<String, dynamic> assertionCredential({
  required String challenge,
  required int counter,
  String? userHandle,
}) {
  final authenticatorData = <int>[
    ...crypto.sha256.convert(utf8.encode(relyingPartyId)).bytes,
    0x05,
    (counter >> 24) & 0xff,
    (counter >> 16) & 0xff,
    (counter >> 8) & 0xff,
    counter & 0xff,
  ];
  final clientDataJson = _clientData(
    type: 'webauthn.get',
    challenge: challenge,
  );
  final signature = _keyPair.sign(<int>[
    ...authenticatorData,
    ...crypto.sha256.convert(clientDataJson).bytes,
  ]);
  return <String, dynamic>{
    'id': credentialId,
    'rawId': credentialId,
    'type': 'public-key',
    'authenticatorAttachment': 'platform',
    'clientExtensionResults': <String, Object?>{},
    'response': <String, dynamic>{
      'clientDataJSON': _base64Url(clientDataJson),
      'authenticatorData': _base64Url(authenticatorData),
      'signature': _base64Url(signature),
      'userHandle': userHandle,
    },
  };
}