line |
stmt |
bran |
cond |
sub |
pod |
time |
code |
1
|
|
|
|
|
|
|
package Crypt::Perl::PKCS8; |
2
|
|
|
|
|
|
|
|
3
|
|
|
|
|
|
|
#TODO: Rename this, and split up the public/private as appropriate. |
4
|
|
|
|
|
|
|
|
5
|
11
|
|
|
11
|
|
63
|
use strict; |
|
11
|
|
|
|
|
59
|
|
|
11
|
|
|
|
|
313
|
|
6
|
11
|
|
|
11
|
|
54
|
use warnings; |
|
11
|
|
|
|
|
18
|
|
|
11
|
|
|
|
|
227
|
|
7
|
|
|
|
|
|
|
|
8
|
11
|
|
|
11
|
|
366
|
use Crypt::Perl::ASN1 (); |
|
11
|
|
|
|
|
20
|
|
|
11
|
|
|
|
|
365
|
|
9
|
|
|
|
|
|
|
|
10
|
11
|
|
|
11
|
|
59
|
use constant ASN1 => <
|
|
11
|
|
|
|
|
18
|
|
|
11
|
|
|
|
|
2176
|
|
11
|
|
|
|
|
|
|
-- FG: simplified from RFC for Convert::ASN1 |
12
|
|
|
|
|
|
|
Version ::= INTEGER |
13
|
|
|
|
|
|
|
|
14
|
|
|
|
|
|
|
-- cf. RFC 3280 4.1.1.2 |
15
|
|
|
|
|
|
|
AlgorithmIdentifier ::= SEQUENCE { |
16
|
|
|
|
|
|
|
algorithm OBJECT IDENTIFIER, |
17
|
|
|
|
|
|
|
parameters ANY DEFINED BY algorithm OPTIONAL |
18
|
|
|
|
|
|
|
} |
19
|
|
|
|
|
|
|
|
20
|
|
|
|
|
|
|
-- cf. RFC 5208 appendix A |
21
|
|
|
|
|
|
|
PrivateKeyInfo ::= SEQUENCE { |
22
|
|
|
|
|
|
|
version Version, |
23
|
|
|
|
|
|
|
privateKeyAlgorithm AlgorithmIdentifier, |
24
|
|
|
|
|
|
|
privateKey PrivateKey |
25
|
|
|
|
|
|
|
} |
26
|
|
|
|
|
|
|
|
27
|
|
|
|
|
|
|
PrivateKey ::= OCTET STRING |
28
|
|
|
|
|
|
|
|
29
|
|
|
|
|
|
|
-- cf. RFC 3280 4.1 |
30
|
|
|
|
|
|
|
SubjectPublicKeyInfo ::= SEQUENCE { |
31
|
|
|
|
|
|
|
algorithm AlgorithmIdentifier, |
32
|
|
|
|
|
|
|
subjectPublicKey BIT STRING |
33
|
|
|
|
|
|
|
} |
34
|
|
|
|
|
|
|
END |
35
|
|
|
|
|
|
|
|
36
|
|
|
|
|
|
|
sub parse_private { |
37
|
11
|
|
|
11
|
0
|
58
|
my ($pem_or_der) = @_; |
38
|
|
|
|
|
|
|
|
39
|
11
|
|
|
|
|
38
|
return _asn1()->find('PrivateKeyInfo')->decode($pem_or_der); |
40
|
|
|
|
|
|
|
} |
41
|
|
|
|
|
|
|
|
42
|
|
|
|
|
|
|
sub parse_public { |
43
|
10
|
|
|
10
|
0
|
33
|
my ($pem_or_der) = @_; |
44
|
|
|
|
|
|
|
|
45
|
10
|
|
|
|
|
33
|
return _asn1()->find('SubjectPublicKeyInfo')->decode($pem_or_der); |
46
|
|
|
|
|
|
|
} |
47
|
|
|
|
|
|
|
|
48
|
|
|
|
|
|
|
sub _asn1 { |
49
|
21
|
|
|
21
|
|
94
|
return Crypt::Perl::ASN1->new()->prepare( Crypt::Perl::PKCS8::ASN1() ); |
50
|
|
|
|
|
|
|
} |
51
|
|
|
|
|
|
|
|
52
|
|
|
|
|
|
|
1; |