File Coverage

blib/lib/Crypt/OpenPGP/Signature/SubPacket.pm
Criterion Covered Total %
statement 36 36 100.0
branch 7 10 70.0
condition 2 6 33.3
subroutine 7 7 100.0
pod 0 3 0.0
total 52 62 83.8


line stmt bran cond sub pod time code
1             package Crypt::OpenPGP::Signature::SubPacket;
2 9     9   234 use strict;
  9         18  
  9         363  
3 9     9   44 use warnings;
  9         32  
  9         688  
4              
5             our $VERSION = '1.19'; # VERSION
6              
7 9     9   232 use Crypt::OpenPGP::ErrorHandler;
  9         24  
  9         294  
8 9     9   46 use base qw( Crypt::OpenPGP::ErrorHandler );
  9         16  
  9         19006  
9              
10             our %SUBPACKET_TYPES = (
11             2 => { name => 'Signature creation time',
12             r => sub { $_[0]->get_int32 },
13             w => sub { $_[0]->put_int32($_[1]) } },
14              
15             3 => { name => 'Signature expiration time',
16             r => sub { $_[0]->get_int32 },
17             w => sub { $_[0]->put_int32($_[1]) } },
18              
19             4 => { name => 'Exportable certification',
20             r => sub { $_[0]->get_int8 },
21             w => sub { $_[0]->put_int8($_[1]) } },
22              
23             5 => { name => 'Trust signature',
24             r => sub { $_[0]->get_int8 },
25             w => sub { $_[0]->put_int8($_[1]) } },
26              
27             6 => { name => 'Regular expression',
28             r => sub { $_[0]->bytes },
29             w => sub { $_[0]->append($_[1]) } },
30              
31             7 => { name => 'Revocable',
32             r => sub { $_[0]->get_int8 },
33             w => sub { $_[0]->put_int8($_[1]) } },
34              
35             9 => { name => 'Key expiration time',
36             r => sub { $_[0]->get_int32 },
37             w => sub { $_[0]->put_int32($_[1]) } },
38              
39             10 => { name => '(Unsupported placeholder',
40             r => sub { },
41             w => sub { } },
42              
43             11 => { name => 'Preferred symmetric algorithms',
44             r => sub { [ unpack 'C*', $_[0]->bytes ] },
45             w => sub { $_[0]->append(pack 'C*', @{ $_[1] }) } },
46              
47             12 => { name => 'Revocation key',
48             r => sub {
49             { class => $_[0]->get_int8,
50             alg_id => $_[0]->get_int8,
51             fingerprint => $_[0]->get_bytes(20) } },
52             w => sub {
53             $_[0]->put_int8($_[1]->{class});
54             $_[0]->put_int8($_[1]->{alg_id});
55             $_[0]->put_bytes($_[1]->{fingerprint}, 20) } },
56              
57             16 => { name => 'Issuer key ID',
58             r => sub { $_[0]->get_bytes(8) },
59             w => sub { $_[0]->put_bytes($_[1], 8) } },
60              
61             20 => { name => 'Notation data',
62             r => sub { my $flags = $_[0]->get_int32;
63             my $namelen = $_[0]->get_int16;
64             my $valuelen = $_[0]->get_int16;
65             { flags => $flags,
66             name => $_[0]->get_bytes($namelen),
67             value => $_[0]->get_bytes($valuelen) } },
68             w => sub {
69             $_[0]->put_int32($_[1]->{flags});
70             $_[0]->put_int16(length $_[1]->{name});
71             $_[0]->put_int16(length $_[1]->{value});
72             $_[0]->put_bytes($_[1]->{name});
73             $_[0]->put_bytes($_[1]->{value}) } },
74              
75             21 => { name => 'Preferred hash algorithms',
76             r => sub { [ unpack 'C*', $_[0]->bytes ] },
77             w => sub { $_[0]->put_bytes(pack 'C*', @{ $_[1] }) } },
78              
79             22 => { name => 'Preferred compression algorithms',
80             r => sub { [ unpack 'C*', $_[0]->bytes ] },
81             w => sub { $_[0]->put_bytes(pack 'C*', @{ $_[1] }) } },
82              
83             23 => { name => 'Key server preferences',
84             r => sub { $_[0]->bytes },
85             w => sub { $_[0]->append($_[1]) } },
86              
87             24 => { name => 'Preferred key server',
88             r => sub { $_[0]->bytes },
89             w => sub { $_[0]->append($_[1]) } },
90              
91             25 => { name => 'Primary user ID',
92             r => sub { $_[0]->get_int8 },
93             w => sub { $_[0]->put_int8($_[1]) } },
94              
95             26 => { name => 'Policy URL',
96             r => sub { $_[0]->bytes },
97             w => sub { $_[0]->append($_[1]) } },
98              
99             27 => { name => 'Key flags',
100             r => sub { $_[0]->bytes },
101             w => sub { $_[0]->append($_[1]) } },
102              
103             28 => { name => 'Signer\'s user ID',
104             r => sub { $_[0]->bytes },
105             w => sub { $_[0]->append($_[1]) } },
106              
107             29 => { name => 'Reason for revocation',
108             r => sub {
109             { code => $_[0]->get_int8,
110             reason => $_[0]->get_bytes($_[0]->length -
111             $_[0]->offset) } },
112             w => sub {
113             $_[0]->put_int8($_[1]->{code});
114             $_[0]->put_bytes($_[1]->{reason}) } },
115             );
116              
117 311     311 0 745 sub new { bless { }, $_[0] }
118              
119             sub parse {
120 297     297 0 532 my $class = shift;
121 297         623 my($buf) = @_;
122 297         819 my $sp = $class->new;
123 297         788 my $tag = $buf->get_int8;
124 297         4798 $sp->{critical} = $tag & 0x80;
125 297         702 $sp->{type} = $tag & 0x7f;
126 297         884 $buf->bytes(0, 1, ''); ## Cut off tag byte
127 297         3103 $buf->{offset} = 0;
128 297         1098 my $ref = $SUBPACKET_TYPES{$sp->{type}};
129 297 100       649 if( defined $ref ) {
130 283 50 33     1936 $sp->{data} = $ref->{r}->($buf) if $ref && $ref->{r};
131             } else {
132 14         46 $sp->{data} = $buf->bytes;
133             }
134 297         4764 $sp;
135             }
136              
137             sub save {
138 41     41 0 77 my $sp = shift;
139 41         110 my $buf = Crypt::OpenPGP::Buffer->new;
140 41         314 my $tag = $sp->{type};
141 41 50       165 $tag |= 0x80 if $sp->{critical};
142 41         133 $buf->put_int8($tag);
143 41         417 my $ref = $SUBPACKET_TYPES{$sp->{type}};
144 41 100       105 if( defined $ref ) {
145 40 50 33     321 $ref->{w}->($buf, $sp->{data}) if $ref && $ref->{w};
146             } else {
147 1         5 $buf->put_bytes($sp->{data});
148             }
149 41         404 $buf->bytes;
150             }
151              
152             1;