verifyClientProof static method

bool verifyClientProof(
  1. List<int> clientProof,
  2. Uint8List storedKey,
  3. String authMessage, {
  4. AuthenticationStringEncoding stringEncoding = AuthenticationStringEncoding.utf8,
})

Implementation

static bool verifyClientProof(
  List<int> clientProof,
  Uint8List storedKey,
  String authMessage, {
  AuthenticationStringEncoding stringEncoding =
      AuthenticationStringEncoding.utf8,
}) {
  if (clientProof.length != defaultKeyLength ||
      storedKey.length != defaultKeyLength) {
    return false;
  }
  final authMessageBytes = Uint8List.fromList(
    CraAuthentication.encodeString(
      authMessage,
      stringEncoding: stringEncoding,
    ),
  );
  try {
    final clientSignature = CraAuthentication.encodeByteHmac(
      storedKey,
      defaultKeyLength,
      authMessageBytes,
    );
    final recoveredClientKey = Uint8List(defaultKeyLength);
    Uint8List? recoveredStoredKey;
    try {
      for (var i = 0; i < defaultKeyLength; i++) {
        recoveredClientKey[i] = clientProof[i] ^ clientSignature[i];
      }
      recoveredStoredKey = SHA256Digest().process(recoveredClientKey);
      return _constantTimeEquals(recoveredStoredKey, storedKey);
    } finally {
      _clear(clientSignature);
      _clear(recoveredClientKey);
      if (recoveredStoredKey != null) _clear(recoveredStoredKey);
    }
  } finally {
    _clear(authMessageBytes);
  }
}