fromUserCredsBytesAndChallenge static method
As part of initial user authentication handshake, create a User from a
challenge provided by the server.
WARNING: If the server provides the core SRP parameters (safe prime, generator, hash algorithm) it is highly recommended for the client to verify they are cryptographically secure. This could include checking the hash algorithm is one of those expected, and that the safe prime and generator and secure (see verifySafePrime and verifyGenerator).
Enable useUserIdInPrivateKey if the user ID was used for key generation
during user registration. See createSaltedVerificationKey for details.
If useUserIdInPrivateKey is false, the user ID is only used to generate
the user-side verifier.
If kdf is not provided, Argon2id is used since it is slow and
hence relatively secure. Be sure this KDF matches the one used during
registration. Alternatively, provide customKdf to use a custom KDF
implementation (cannot provide both kdf and customKdf).
If a ephemeralUserPrivateKey is not provided, one is generated.
This method is preferred over fromUserCredsAndChallenge for security reasons, as it avoids storing passwords as Strings in memory.
userIdBytes and passwordBytes should be UTF-8 encoded credentials.
Implementation
static Future<User> fromUserCredsBytesAndChallenge({
required Uint8List userIdBytes,
required Uint8List passwordBytes,
required Challenge challenge,
final bool useUserIdInPrivateKey = true,
HashFunction? customHashFunction,
KdfChoice? kdf,
Kdf? customKdf,
final Uint8List? ephemeralUserPrivateKey,
}) async {
final resolvedKdf = _resolveKdf(kdf, customKdf);
final resolvedHashFunction = _resolveHashFunction(
challenge, customHashFunction);
final user = User._(
userIdBytes: userIdBytes,
passwordBytes: passwordBytes,
generator: challenge.generator,
safePrime: challenge.safePrime,
verifierKeySalt: challenge.verifierKeySalt,
useUserIdInPrivateKey: useUserIdInPrivateKey,
hashFunction: resolvedHashFunction,
kdf: resolvedKdf,
);
user._generateEphemeralUserAsymmetricKeys(
ephemeralUserPrivateKeyBytes: ephemeralUserPrivateKey);
// Derives session key and its user-side verifier M1.
await user._processChallenge(challenge);
return user;
}