]> Dogcows Code - chaz/p5-File-KDBX/blob - lib/File/KDBX/Cipher/CBC.pm
8336af4b4a31e79688833d3b6bc14f0d1da59ba2
[chaz/p5-File-KDBX] / lib / File / KDBX / Cipher / CBC.pm
1 package File::KDBX::Cipher::CBC;
2 # ABSTRACT: A CBC block cipher mode encrypter/decrypter
3
4 use warnings;
5 use strict;
6
7 use Crypt::Mode::CBC;
8 use File::KDBX::Error;
9 use namespace::clean;
10
11 use parent 'File::KDBX::Cipher';
12
13 our $VERSION = '999.999'; # VERSION
14
15 sub encrypt {
16 my $self = shift;
17
18 my $mode = $self->{mode} ||= do {
19 my $m = Crypt::Mode::CBC->new($self->algorithm);
20 $m->start_encrypt($self->key, $self->iv);
21 $m;
22 };
23
24 return join('', map { $mode->add(ref $_ ? $$_ : $_) } grep { defined } @_);
25 }
26
27 sub decrypt {
28 my $self = shift;
29
30 my $mode = $self->{mode} ||= do {
31 my $m = Crypt::Mode::CBC->new($self->algorithm);
32 $m->start_decrypt($self->key, $self->iv);
33 $m;
34 };
35
36 return join('', map { $mode->add(ref $_ ? $$_ : $_) } grep { defined } @_);
37 }
38
39 sub finish {
40 my $self = shift;
41 return '' if !$self->{mode};
42 my $out = $self->{mode}->finish;
43 delete $self->{mode};
44 return $out;
45 }
46
47 =attr algorithm
48
49 Get the symmetric cipher algorithm.
50
51 =cut
52
53 sub algorithm { $_[0]->{algorithm} or throw 'Block cipher algorithm is not set' }
54 sub key_size { $_[0]->{key_size} // 32 }
55 sub iv_size { 16 }
56 sub block_size { 16 }
57
58 1;
59 __END__
60
61 =head1 SYNOPSIS
62
63 use File::KDBX::Cipher::CBC;
64
65 my $cipher = File::KDBX::Cipher::CBC->new(algorithm => $algo, key => $key, iv => $iv);
66
67 =head1 DESCRIPTION
68
69 A subclass of L<File::KDBX::Cipher> for encrypting and decrypting data using the CBC block cipher mode.
70
71 =cut
This page took 0.032678 seconds and 3 git commands to generate.