File Coverage

blib/lib/Crypt/Perl/Ed25519/Parse.pm
Criterion Covered Total %
statement 38 40 95.0
branch 5 8 62.5
condition 1 3 33.3
subroutine 8 8 100.0
pod 0 3 0.0
total 52 62 83.8


line stmt bran cond sub pod time code
1             package Crypt::Perl::Ed25519::Parse;
2              
3 1     1   52731 use strict;
  1         10  
  1         20  
4 1     1   4 use warnings;
  1         2  
  1         18  
5              
6             =encoding utf-8
7              
8             =head1 NAME
9              
10             Crypt::Perl::Ed25519::Parse
11              
12             =head1 SYNOPSIS
13              
14             # These accept either DER or PEM.
15             my $prkey = Crypt::Perl::Ed25519::Parse::private($buffer);
16             my $pbkey = Crypt::Perl::Ed25519::Parse::public($buffer);
17              
18             # This accepts a structure, not raw JSON.
19             my $key = Crypt::Perl::Ed25519::Parse::jwk($jwk_hr);
20              
21             =head1 DESCRIPTION
22              
23             See L and L
24             for descriptions of the interfaces that this module returns.
25              
26             =cut
27              
28 1     1   304 use Crypt::Perl::PKCS8 ();
  1         5  
  1         26  
29 1     1   421 use Crypt::Perl::ToDER ();
  1         2  
  1         294  
30              
31             # DER or PEM
32              
33             sub private {
34 1     1 0 62 my $pem_or_der = shift;
35              
36 1         5 Crypt::Perl::ToDER::ensure_der($pem_or_der);
37              
38 1         4 my $struct = Crypt::Perl::PKCS8::parse_private($pem_or_der);
39              
40 1         683 require Crypt::Perl::Ed25519::PrivateKey;
41              
42 1         7 _check_oid($struct->{'privateKeyAlgorithm'}, 'Crypt::Perl::Ed25519::PrivateKey');
43              
44 1         3 substr( $struct->{'privateKey'}, 0, 2 ) = q<>;
45              
46 1         4 return Crypt::Perl::Ed25519::PrivateKey->new( $struct->{'privateKey'} );
47             }
48              
49             sub public {
50 1     1 0 714 my $pem_or_der = shift;
51              
52 1         5 Crypt::Perl::ToDER::ensure_der($pem_or_der);
53              
54 1         4 my $struct = Crypt::Perl::PKCS8::parse_public($pem_or_der);
55              
56 1         745 require Crypt::Perl::Ed25519::PublicKey;
57              
58 1         5 _check_oid($struct->{'algorithm'}, 'Crypt::Perl::Ed25519::PublicKey');
59              
60 1         4 return Crypt::Perl::Ed25519::PublicKey->new( $struct->{'subjectPublicKey'}[0] );
61             }
62              
63             # https://tools.ietf.org/html/rfc8037
64             sub jwk {
65 2     2 0 672 my ($struct_hr) = @_;
66              
67 2         12 require MIME::Base64;
68              
69 2   33     15 my $x = $struct_hr->{'x'} && MIME::Base64::decode_base64url($struct_hr->{'x'});
70              
71 2 100       31 if ($struct_hr->{'d'}) {
72 1 50       4 my $d = MIME::Base64::decode_base64url($struct_hr->{'d'}) or do {
73 0         0 die "Neither “x” nor “d”!";
74             };
75              
76 1         16 require Crypt::Perl::Ed25519::PrivateKey;
77 1         21 return Crypt::Perl::Ed25519::PrivateKey->new( $d, $x );
78             }
79              
80 1 50       5 die "Neither “x” nor “d”!" if !$x;
81              
82 1         4 require Crypt::Perl::Ed25519::PublicKey;
83 1         4 return Crypt::Perl::Ed25519::PublicKey->new( $x );
84             }
85              
86             sub _check_oid {
87 2     2   8 my ($substruct, $class) = @_;
88              
89 2 50       21 if ( $substruct->{'algorithm'} ne $class->OID_Ed25519() ) {
90 0         0 die "OID ($substruct->{'algorithm'}) is not Ed25519!\n";
91             }
92              
93 2         4 return;
94             }
95              
96             1;