challenge method
This method is called by the session if the router returns the challenge or
the challenges extra respectively. This method proceeds the cra
authentication process and creates an authentication message according to
the wamp specification
Implementation
@override
Future<Authenticate> challenge(Extra extra) async {
await AbstractAuthentication.streamAddAwaited<Extra>(
_challengeStreamController, extra);
var authenticate = Authenticate();
if (extra.challenge == null) {
final error = Error(MessageTypes.codeChallenge, -1,
HashMap<String, Object>(), Error.authorizationFailed);
error.details['reason'] =
'No challenge or secret given, wrong router response';
return Future.error(error);
}
Uint8List key;
if (extra.salt == null) {
key = Uint8List.fromList(secret.codeUnits);
} else {
key = deriveKey(secret, extra.salt!.codeUnits,
iterations: extra.iterations == null || extra.iterations! <= 0
? defaultIterations
: extra.iterations!,
keylen: extra.keyLen == null || extra.keyLen! <= 0
? defaultKeyLength
: extra.keyLen!);
}
authenticate.signature = encodeHmac(
Uint8List.fromList(base64.encode(key).codeUnits),
extra.keyLen == null || extra.keyLen! <= 0
? defaultKeyLength
: extra.keyLen!,
Uint8List.fromList(extra.challenge!.codeUnits));
return authenticate;
}