File-KDBX
view release on metacpan or search on metacpan
lib/File/KDBX/Cipher.pm view on Meta::CPAN
sub DESTROY { !in_global_destruction and erase \$_[0]->{key} }
sub encrypt { die 'Not implemented' }
sub decrypt { die 'Not implemented' }
sub finish { '' }
sub encrypt_finish {
my $self = shift;
my $out = $self->encrypt(@_);
$out .= $self->finish;
return $out;
}
sub decrypt_finish {
my $self = shift;
my $out = $self->decrypt(@_);
$out .= $self->finish;
return $out;
}
sub register {
my $class = shift;
my $id = shift;
my $package = shift;
my @args = @_;
my $formatted_id = looks_like_number($id) ? $id : format_uuid($id);
$package = "${class}::${package}" if $package !~ s/^\+// && $package !~ /^\Q${class}::\E/;
my %blacklist = map { (looks_like_number($_) ? $_ : File::KDBX::Util::uuid($_)) => 1 }
split(/,/, $ENV{FILE_KDBX_CIPHER_BLACKLIST} // '');
if ($blacklist{$id} || $blacklist{$package}) {
alert "Ignoring blacklisted cipher ($formatted_id)", id => $id, package => $package;
return;
}
if (defined $CIPHERS{$id}) {
alert "Overriding already-registered cipher ($formatted_id) with package $package",
id => $id,
package => $package;
}
$CIPHERS{$id} = [$package, @args];
}
sub unregister {
delete $CIPHERS{$_} for @_;
}
BEGIN {
__PACKAGE__->register(CIPHER_UUID_AES128, 'CBC', algorithm => 'AES', key_size => 16);
__PACKAGE__->register(CIPHER_UUID_AES256, 'CBC', algorithm => 'AES', key_size => 32);
__PACKAGE__->register(CIPHER_UUID_SERPENT, 'CBC', algorithm => 'Serpent', key_size => 32);
__PACKAGE__->register(CIPHER_UUID_TWOFISH, 'CBC', algorithm => 'Twofish', key_size => 32);
__PACKAGE__->register(CIPHER_UUID_CHACHA20, 'Stream', algorithm => 'ChaCha');
__PACKAGE__->register(CIPHER_UUID_SALSA20, 'Stream', algorithm => 'Salsa20');
__PACKAGE__->register(STREAM_ID_CHACHA20, 'Stream', algorithm => 'ChaCha');
__PACKAGE__->register(STREAM_ID_SALSA20, 'Stream', algorithm => 'Salsa20');
}
1;
__END__
=pod
=encoding UTF-8
=head1 NAME
File::KDBX::Cipher - A block cipher mode or cipher stream
=head1 VERSION
version 0.906
=head1 SYNOPSIS
use File::KDBX::Cipher;
my $cipher = File::KDBX::Cipher->new(uuid => $uuid, key => $key, iv => $iv);
my $ciphertext = $cipher->encrypt('plaintext');
$ciphertext .= $cipher->encrypt('more plaintext');
$ciphertext .= $cipher->finish;
my $plaintext = $cipher->decrypt('ciphertext');
$plaintext .= $cipher->decrypt('more ciphertext');
$plaintext .= $cipher->finish;
=head1 DESCRIPTION
A cipher is used to encrypt and decrypt KDBX files. The L<File::KDBX> distribution comes with several
pre-registered ciphers ready to go:
=over 4
=item *
C<61AB05A1-9464-41C3-8D74-3A563DF8DD35> - AES128 (legacy)
=item *
C<31C1F2E6-BF71-4350-BE58-05216AFC5AFF> - AES256
=item *
C<D6038A2B-8B6F-4CB5-A524-339A31DBB59A> - ChaCha20
=item *
C<716E1C8A-EE17-4BDC-93AE-A977B882833A> - Salsa20
=item *
( run in 0.450 second using v1.01-cache-2.11-cpan-e1769b4cff6 )