File Coverage

blib/lib/Crypt/Keyczar/Key.pm
Criterion Covered Total %
statement 432 432 100.0
branch 9 14 64.2
condition n/a
subroutine 144 144 100.0
pod 0 13 0.0
total 585 603 97.0


line stmt bran cond sub pod time code
1             package Crypt::Keyczar::Key;
2 28     28   15220 use strict;
  28         55  
  28         533  
3 24     24   518 use warnings;
  24         62  
  24         1050  
4 23     23   457 use Carp;
  23         63  
  23         766  
5              
6 16     16   350 use Crypt::Keyczar::Util;
  16         30  
  16         7608  
7              
8              
9              
10             my %POLICY = (
11             'AES' => {
12             object => 'Crypt::Keyczar::AesKey',
13             keysize => [128, 192, 256],
14             outsize => 0
15             },
16             'HMAC_SHA1' => {
17             object => 'Crypt::Keyczar::HmacKey',
18             keysize => [256],
19             outsize => 20
20             },
21             'DSA_PRIV' => {
22             object => 'Crypt::Keyczar::DsaPrivateKey',
23             keysize => [1024],
24             outsize => 48
25             },
26             'DSA_PUB' => {
27             object => 'Crypt::Keyczar::DsaPublicKey',
28             keysize => [1024],
29             outsize => 48
30             },
31             'RSA_PRIV' => {
32             object => 'Crypt::Keyczar::RsaPrivateKey',
33             keysize => [4096, 2048, 1024, 768, 512],
34             outsize => 256
35             },
36             'RSA_PUB' => {
37             object => 'Crypt::Keyczar::RsaPublicKey',
38             keysize => [4096, 2048, 1024, 768, 512],
39             outsize => 256
40             },
41              
42             'HMAC_SHA224' => {
43             object => 'Crypt::Keyczar::HmacSHA224Key',
44             keysize => [256],
45             outsize => 28
46             },
47             'HMAC_SHA256' => {
48             object => 'Crypt::Keyczar::HmacSHA256Key',
49             keysize => [256],
50             outsize => 32
51             },
52             'HMAC_SHA384' => {
53             object => 'Crypt::Keyczar::HmacSHA384Key',
54             keysize => [256],
55             outsize => 48
56             },
57             'HMAC_SHA512' => {
58             object => 'Crypt::Keyczar::HmacSHA512Key',
59             keysize => [256],
60             outsize => 64
61             },
62             );
63              
64              
65             sub set_policy {
66 1     1 0 6 my $class = shift;
67 1         3 %POLICY = @_;
68             }
69              
70              
71             sub new {
72 13     13 0 34 my $class = shift;
73 13         44 return bless {}, $class;
74             }
75              
76              
77       94 0   sub init {}
78              
79              
80             sub get_header {
81 22     22 0 39 my $self = shift;
82 22         78 return pack 'C1 a*', Crypt::Keyczar::FORMAT_VERSION(), $self->hash();
83             }
84              
85             sub expose {
86 1     1 0 7 my $self = shift;
87 1         2 my $expose = {};
88 1         13 $expose->{size} = $self->{size};
89 1         6 return $expose;
90             }
91              
92              
93             sub hash {
94 442     442 0 747 my $self = shift;
95 442 100       1391 $self->{__hash} = shift if @_;
96 442         1616 return $self->{__hash};
97             }
98              
99              
100       1 0   sub get_size {}
101       1 0   sub get_type {}
102       1 0   sub get_engine {}
103 2     2 0 14 sub get_sign_engine { return Crypt::Keyczar::_NullSignEngine->new(); }
104              
105              
106              
107             sub generate_key {
108 19     19 0 73 my $class = shift;
109 19         52 my ($type, $size) = @_;
110              
111 19 50       63 if (!exists $POLICY{uc $type}) {
112 1         13 croak "unsupported key type: $type";
113             }
114              
115 19         61 my $key = $POLICY{uc $type}->{object};
116 19     1   1091 eval "use $key";
  1     1   13  
  1     1   6  
  1     1   2  
  1     1   19  
  1     1   7  
  1     1   2  
  1     1   14  
  1     1   7  
  1     1   2  
  1     1   13  
  1     1   459  
  1     1   3  
  1     1   14  
  1     1   6  
  1         3  
  1         13  
  1         6  
  1         3  
  1         14  
  1         462  
  1         3  
  1         22  
  1         7  
  1         3  
  1         13  
  1         8  
  1         2  
  1         15  
  1         7  
  1         2  
  1         17  
  1         6  
  1         2  
  1         18  
  1         7  
  1         2  
  1         14  
  1         9  
  1         3  
  1         13  
  1         7  
  1         2  
  1         13  
  1         7  
  1         2  
117 19 50       97 if ($@) {
118 1         7 croak "$type: $@";
119             }
120 19 100       57 if ($size) {
121 6 50       27 if (scalar(grep {$_ == $size} @{$POLICY{uc $type}->{keysize}}) == 0) {
  22         58  
  6         25  
122 1         13 croak "unacceptable key size: $size\@$type";
123             }
124             }
125             else {
126 14         51 $size = $POLICY{uc $type}->{keysize}->[0]; # set default key size
127             }
128 19         82 return $key->generate($size);
129             }
130              
131              
132             sub read_key {
133 166     166 0 1157 my $class = shift;
134 166         411 my ($type, $json_string_key) = @_;
135              
136 166 50       515 if (!exists $POLICY{uc $type}) {
137 1         14 croak "unsupported key type: $type";
138             }
139 166         443 my $key = $POLICY{uc $type}->{object};
140 11     11   2616 eval "use $key";
  11     3   28  
  11     1   152  
  166     1   9764  
  3     1   645  
  3     1   13  
  3     1   31  
  1     1   14  
  1     1   7  
  1     1   2  
  1     1   14  
  1     1   7  
  1     1   2  
  1     1   12  
  1     1   11  
  1     1   3  
  1     1   17  
  1     1   6  
  1     1   2  
  1     1   13  
  1     1   6  
  1     1   3  
  1     1   13  
  1     1   7  
  1     1   2  
  1     1   15  
  1     1   7  
  1     1   3  
  1     1   12  
  1     1   6  
  1     1   2  
  1     1   13  
  1     1   8  
  1     1   2  
  1     1   13  
  1     1   7  
  1     1   2  
  1     1   13  
  1     1   6  
  1     1   2  
  1     1   12  
  1     1   7  
  1     1   3  
  1     1   14  
  1     1   6  
  1     1   3  
  1     1   27  
  1     1   7  
  1     1   2  
  1     1   13  
  1     1   8  
  1     1   2  
  1     1   13  
  1     1   7  
  1     1   2  
  1     1   12  
  1     1   7  
  1     1   2  
  1     1   13  
  1     1   7  
  1     1   2  
  1     1   13  
  1     1   19  
  1     1   3  
  1     1   13  
  1     1   7  
  1     1   3  
  1     1   14  
  1     1   7  
  1     1   1  
  1     1   15  
  1     1   9  
  1     1   2  
  1     1   13  
  1     1   10  
  1     1   2  
  1     1   16  
  1     1   8  
  1     1   3  
  1     1   12  
  1     1   10  
  1     1   2  
  1     1   18  
  1     1   7  
  1     1   2  
  1     1   14  
  1     1   6  
  1     1   3  
  1     1   13  
  1     1   7  
  1     1   2  
  1     1   14  
  1     1   7  
  1     1   2  
  1     1   14  
  1     1   7  
  1     1   2  
  1     1   13  
  1     1   7  
  1     1   3  
  1     1   13  
  1     1   7  
  1     1   2  
  1     1   13  
  1         7  
  1         2  
  1         13  
  1         7  
  1         4  
  1         14  
  1         6  
  1         3  
  1         12  
  1         6  
  1         3  
  1         12  
  1         8  
  1         2  
  1         14  
  1         6  
  1         3  
  1         12  
  1         7  
  1         2  
  1         12  
  1         7  
  1         3  
  1         52  
  1         7  
  1         2  
  1         13  
  1         7  
  1         2  
  1         13  
  1         7  
  1         3  
  1         14  
  1         7  
  1         2  
  1         12  
  1         7  
  1         3  
  1         13  
  1         6  
  1         3  
  1         12  
  1         8  
  1         2  
  1         18  
  1         9  
  1         3  
  1         18  
  1         6  
  1         2  
  1         12  
  1         7  
  1         3  
  1         20  
  1         7  
  1         3  
  1         13  
  1         6  
  1         2  
  1         12  
  1         7  
  1         2  
  1         14  
  1         6  
  1         2  
  1         13  
  1         7  
  1         2  
  1         13  
  1         8  
  1         2  
  1         14  
  1         9  
  1         4  
  1         19  
  1         6  
  1         3  
  1         12  
  1         7  
  1         3  
  1         13  
  1         7  
  1         2  
  1         17  
  1         6  
  1         2  
  1         13  
  1         7  
  1         2  
  1         53  
  1         6  
  1         3  
  1         13  
  1         6  
  1         2  
  1         13  
  1         7  
  1         3  
  1         15  
  1         7  
  1         3  
  1         13  
  1         6  
  1         3  
  1         13  
  1         7  
  1         2  
  1         14  
  1         6  
  1         2  
  1         14  
  1         7  
  1         2  
  1         34  
  1         10  
  1         2  
  1         13  
  1         10  
  1         2  
  1         14  
  1         7  
  1         2  
  1         12  
  1         9  
  1         3  
  1         13  
  1         7  
  1         2  
  1         13  
  1         8  
  1         2  
  1         15  
  1         7  
  1         2  
  1         13  
  1         6  
  1         3  
  1         12  
  1         7  
  1         2  
  1         14  
  1         6  
  1         2  
  1         12  
  1         7  
  1         2  
  1         14  
  1         7  
  1         4  
  1         13  
  1         7  
  1         2  
  1         12  
  1         7  
  1         2  
  1         12  
  1         7  
  1         2  
  1         13  
  1         7  
  1         3  
  1         13  
  1         6  
  1         2  
  1         13  
  1         7  
  1         3  
  1         14  
  1         7  
  1         3  
  1         13  
  1         7  
  1         2  
  1         13  
  1         9  
  1         3  
  1         16  
  1         6  
  1         3  
  1         13  
  1         7  
  1         3  
  1         14  
  1         6  
  1         2  
  1         18  
  1         7  
  1         2  
  1         12  
  1         7  
  1         2  
  1         13  
  1         7  
  1         2  
  1         14  
  1         7  
  1         2  
  1         13  
  1         6  
  1         2  
  1         15  
  1         7  
  1         2  
  1         13  
  1         7  
  1         2  
  1         14  
  1         7  
  1         3  
  1         14  
  1         6  
  1         3  
  1         14  
  1         6  
  1         2  
  1         14  
  1         8  
  1         3  
  1         14  
  1         7  
  1         2  
  1         13  
141 166 50       595 if ($@) {
142 1         490 croak "$type: $@";
143             }
144 166         582 return $key->read($json_string_key);
145             }
146              
147              
148             sub to_string {
149 27     27 0 128 return Crypt::Keyczar::Util::encode_json($_[0]->expose);
150             }
151              
152             1;
153              
154              
155             package Crypt::Keyczar::_NullSignEngine;
156 16     16   105 use strict;
  16         32  
  16         282  
157 16     16   81 use warnings;
  16         29  
  16         1368  
158              
159 2     2   16 sub new { return bless {}, $_[0]; }
160 4     4   17 sub digest_size { return 0 }
161 1     1   15 sub init { return '' }
162       2     sub update {}
163 1     1   7 sub sign { return '' }
164 2     2   8 sub verify { return 1 }
165              
166              
167              
168             __END__