Authen-Passphrase-Scrypt

 view release on metacpan or  search on metacpan

lib/Authen/Passphrase/Scrypt.pm  view on Meta::CPAN

	my $sha = sha256 shift;
	substr $sha, 0, 16
}

sub truncate_hash {
	substr shift, 32
}

sub new {
	my ($class, @args) = @_;
	my $self = $class->SUPER::new(@args);

	$self->logN(14) unless defined $self->logN;
	$self->r(16) unless defined $self->r;
	$self->p(1) unless defined $self->p;
	croak "passphrase not set" unless defined $self->passphrase;
	$self->salt(rand_bits 256) unless $self->salt;

	my $data = "scrypt\x00" . pack 'CNNa32',
	  $self->logN, $self->r, $self->p, $self->salt;
	$data .= truncated_sha256 $data;

lib/Authen/Passphrase/Scrypt.pm  view on Meta::CPAN

}

sub from_rfc2307 {
	my ($class, $rfc2307) = @_;
	croak "Invalid Scrypt RFC2307" unless $rfc2307 =~ m,^{SCRYPT}([A-Za-z0-9+/]{128})$,;
	my $data = decode_base64 $1;
	my ($scrypt, $logN, $r, $p, $salt, $cksum, $hmac) =
	  unpack 'Z7CNNa32a16a32', $data;
	croak 'Invalid Scrypt hash: should start with "scrypt"' unless $scrypt eq 'scrypt';
	croak 'Invalid Scrypt hash: bad checksum', unless $cksum eq truncated_sha256 (substr $data, 0, 48);
	$class->SUPER::new({data => (substr $data, 0, 64), logN => $logN, r => $r, p => $p, salt => $salt, hmac => $hmac});
}

sub match {
	my ($self, $passphrase) = @_;
	my $correct_hmac = hmac_sha256 $self->data, truncate_hash $self->compute_hash($passphrase);
	$self->hmac eq $correct_hmac
}

sub as_rfc2307 {
	my ($self) = @_;



( run in 0.222 second using v1.01-cache-2.11-cpan-eab888a1d7d )