challenge method

  1. @override
Future<Authenticate> challenge(
  1. Extra extra
)
override

Called when the router sends a challenge (CHALLENGE frame).

Implementation

@override
Future<Authenticate> challenge(Extra extra) async {
  await AbstractAuthentication.streamAddAwaited<Extra>(
    _challengeStreamController,
    extra,
  );

  if (extra.channelBinding != channelBinding) {
    return Future.error(Exception('Channel Binding does not match'));
  }
  if (extra.challenge == null || extra.challenge!.length % 2 != 0) {
    return Future.error(Exception('Wrong challenge length'));
  }
  final authenticate = Authenticate();

  authenticate.extra = HashMap<String, Object?>();
  authenticate.extra!['channel_binding'] = channelBinding;
  final binaryChallenge = hexToBin(extra.challenge);
  authenticate.signature = privateKey
      .sign(binaryChallenge)
      .encode(Base16Encoder.instance);
  return authenticate;
}