NAME
Auth::SCRAM::Async - Salted Challenge Response Authentication Mechanism
SYNOPSIS
use Auth::SCRAM::Async;
my $client = Auth::SCRAM::Async::Client.new(:$username, :$password, :type(Auth::SCRAM::Async::SHA256));
my $client-first = $client.first-message;
send-message($client-first);
my $server-first = read-response();
with $client.final-message($server-first) -> $client-final {
send-message($client-final);
my $server-final = read-response();
say "success" if $client.validate($server-final);
}
Description
This implements the Salted Challenge Response Authentication Mechanism.
Client
A client can be found as Auth::SCRAM::Async::Client
. It has the following methods:
new
This creates a new Auth::SCRAM::Async::Client object. Every handshake should use a fresh object.
* Str :$username
Authentication identity. This will be normalized with the SASLprep algorithm before being transmitted to the server. This argument is mandatory.
* Str :$password
Authentication password. This will be normalized with the SASLprep algorithm before being transmitted to the server. This argument is mandatory.
* Str :$authorization-id
If the authentication identity (username) will act as a different, authorization identity, this attribute provides the authorization identity. It is optional. If not provided, the authentication identity is considered by the server to be the same as the authorization identity.
* Auth::SCRAM::Async::Digest :$digest
Identifier of a digest function. Valid values are `Auth::SCRAM::Async::SHA1`, `Auth::SCRAM::Async::SHA256`, `Auth::SCRAM::Async::SHA384`, or `Auth::SCRAM::Async::SHA512`. This argument is mandatory.
* Int :$minimum_iteration_count
If the server requests an iteration count less than this value, the client will reject it. This protects against downgrade attacks. The default is 4096, consistent with recommendations in the RFC.
* Int :$nonce-bits
Size of the client-generated nonce, in bits. Defaults to `192`. The server-nonce will be appended, so the final nonce size will be substantially larger.
first-message(--> Str)
This will return the opening message of a SCRAM handshake
final-message(Str $server-first --> Str)
This will process the first response from the server, and will generate the second message from the client.
validate(Str $server-final --> Bool)
This will validate the final response from the server, validating that they too know the shared secret.
Todo
See also
RFC5802 - Salted Challenge Response Authentication Mechanism (SCRAM) SASL and GSS-API Mechanisms
RFC7677 - SCRAM-SHA-256 and SCRAM-SHA-256-PLUS Simple Authentication and Security Layer (SASL) Mechanisms
Author
Leon Timmermans fawaka@gmail.com
Copyright and License
Copyright 2022 Leon Timmermans
This library is free software; you can redistribute it and/or modify it under the Artistic License 2.0.