File Coverage

lib/Noise/Pattern.pm
Criterion Covered Total %
statement 8 8 100.0
branch n/a
condition n/a
subroutine 3 3 100.0
pod n/a
total 11 11 100.0


line stmt bran cond sub pod time code
1 3     3   39 use v5.42.0;
  3         10  
2 3     3   17 use feature 'class';
  3         4  
  3         382  
3 3     3   17 no warnings 'experimental::class';
  3         6  
  3         4009  
4             #
5             class Noise::Pattern v0.0.1 {
6              
7             # Noise handshake patterns (rundamental + deferred + one-way)
8             # https://noiseprotocol.org/noise.html#handshake-patterns
9             my %PATTERNS = (
10              
11             # Fundamental Interactive Patterns
12             NN => { pre_msg => [ [], [] ], msg_seq => [ ['e'], [ 'e', 'ee' ] ] },
13             NK => { pre_msg => [ [], ['s'] ], msg_seq => [ [ 'e', 'es' ], [ 'e', 'ee' ] ] },
14             NX => { pre_msg => [ [], [] ], msg_seq => [ ['e'], [ 'e', 'ee', 's', 'es' ] ] },
15             XN => { pre_msg => [ [], [] ], msg_seq => [ ['e'], [ 'e', 'ee' ], [ 's', 'se' ] ] },
16             XK => { pre_msg => [ [], ['s'] ], msg_seq => [ [ 'e', 'es' ], [ 'e', 'ee' ], [ 's', 'se' ] ] },
17             XX => { pre_msg => [ [], [] ], msg_seq => [ ['e'], [ 'e', 'ee', 's', 'es' ], [ 's', 'se' ] ] },
18             KN => { pre_msg => [ ['s'], [] ], msg_seq => [ ['e'], [ 'e', 'ee', 'se' ] ] },
19             KK => { pre_msg => [ ['s'], ['s'] ], msg_seq => [ [ 'e', 'es', 'ss' ], [ 'e', 'ee', 'se' ] ] },
20             KX => { pre_msg => [ ['s'], [] ], msg_seq => [ ['e'], [ 'e', 'ee', 'se', 's', 'es' ] ] },
21             IN => { pre_msg => [ [], [] ], msg_seq => [ [ 'e', 's' ], [ 'e', 'ee', 'se' ] ] },
22             IK => { pre_msg => [ [], ['s'] ], msg_seq => [ [ 'e', 'es', 's', 'ss' ], [ 'e', 'ee', 'se', 'es' ] ] },
23             IX => { pre_msg => [ [], [] ], msg_seq => [ [ 'e', 's' ], [ 'e', 'ee', 'se', 's', 'es' ] ] },
24              
25             # One-way Handshake Patterns
26             N => { pre_msg => [ [], ['s'] ], msg_seq => [ [ 'e', 'es' ] ] },
27             K => { pre_msg => [ ['s'], ['s'] ], msg_seq => [ [ 'e', 'es', 'ss' ] ] },
28             X => { pre_msg => [ [], ['s'] ], msg_seq => [ [ 'e', 'es', 's', 'ss' ] ] },
29              
30             # Deferred Interactive Patterns
31             NK1 => { pre_msg => [ [], ['s'] ], msg_seq => [ ['e'], [ 'e', 'ee', 'es' ] ] },
32             NX1 => { pre_msg => [ [], [] ], msg_seq => [ ['e'], [ 'e', 'ee', 's' ], ['es'] ] },
33             X1N => { pre_msg => [ [], [] ], msg_seq => [ ['e'], [ 'e', 'ee' ], [ 's', 'se' ] ] },
34             X1K => { pre_msg => [ [], ['s'] ], msg_seq => [ ['e'], [ 'e', 'ee' ], [ 's', 'se', 'es' ] ] },
35             XK1 => { pre_msg => [ [], ['s'] ], msg_seq => [ [ 'e', 'es' ], [ 'e', 'ee', 's' ], ['se'] ] },
36             X1K1 => { pre_msg => [ [], ['s'] ], msg_seq => [ ['e'], [ 'e', 'ee', 's' ], [ 'es', 'se' ] ] },
37             X1X => { pre_msg => [ [], [] ], msg_seq => [ ['e'], [ 'e', 'ee', 's', 'es' ], [ 's', 'se' ] ] },
38             XX1 => { pre_msg => [ [], [] ], msg_seq => [ ['e'], [ 'e', 'ee', 's' ], [ 'es', 's', 'se' ] ] },
39             X1X1 => { pre_msg => [ [], [] ], msg_seq => [ ['e'], [ 'e', 'ee', 's' ], [ 'es', 's', 'se' ] ] },
40             K1N => { pre_msg => [ ['s'], [] ], msg_seq => [ ['e'], [ 'e', 'ee' ], ['se'] ] },
41             K1K => { pre_msg => [ ['s'], ['s'] ], msg_seq => [ ['e'], [ 'e', 'ee', 'es' ], ['se'] ] },
42             KK1 => { pre_msg => [ ['s'], ['s'] ], msg_seq => [ [ 'e', 'es' ], [ 'e', 'ee', 'se', 'es' ] ] },
43             K1K1 => { pre_msg => [ ['s'], ['s'] ], msg_seq => [ ['e'], [ 'e', 'ee', 'es' ], ['se'] ] },
44             K1X => { pre_msg => [ ['s'], [] ], msg_seq => [ ['e'], [ 'e', 'ee', 'se' ], [ 's', 'es' ] ] },
45             K1X1 => { pre_msg => [ ['s'], [] ], msg_seq => [ ['e'], [ 'e', 'ee', 'se', 's' ], ['es'] ] },
46             KX1 => { pre_msg => [ ['s'], [] ], msg_seq => [ ['e'], [ 'e', 'ee', 'se', 's' ], ['es'] ] },
47              
48             # Patterns used in tests (some might be non-standard or specific variants)
49             I1N => { pre_msg => [ [], [] ], msg_seq => [ [ 'e', 's' ], [ 'e', 'ee' ], ['se'] ] },
50             I1K => { pre_msg => [ [], ['s'] ], msg_seq => [ [ 'e', 'es', 's' ], [ 'e', 'ee' ], ['se'] ] },
51             IK1 => { pre_msg => [ [], ['s'] ], msg_seq => [ [ 'e', 'es', 's' ], [ 'e', 'ee' ], [ 'se', 'ss' ] ] },
52             I1K1 => { pre_msg => [ [], ['s'] ], msg_seq => [ [ 'e', 's' ], [ 'e', 'ee' ], [ 'se', 'es' ] ] },
53             I1X => { pre_msg => [ [], [] ], msg_seq => [ [ 'e', 's' ], [ 'e', 'ee', 's', 'es' ], ['se'] ] },
54             IX1 => { pre_msg => [ [], [] ], msg_seq => [ [ 'e', 's' ], [ 'e', 'ee', 'se', 's' ], ['es'] ] },
55             I1X1 => { pre_msg => [ [], [] ], msg_seq => [ [ 'e', 's' ], [ 'e', 'ee', 's' ], [ 'se', 'es' ] ] },
56             );
57             #
58             field $name : reader : param;
59             field $pre_msg : reader;
60             field $msg_seq : reader;
61             field $has_psk : reader = 0;
62             #
63             ADJUST {
64             my $base_name = $name;
65             my @psk_modifiers;
66             unshift @psk_modifiers, $1 while $base_name =~ s/[+]?(psk\d+)$//;
67             $has_psk = scalar @psk_modifiers > 0;
68              
69             # Lookup base pattern
70             my $p = $PATTERNS{$base_name} or die 'Unknown pattern: ' . $base_name;
71              
72             # Deep copy sequences to avoid modifying shared state
73             $pre_msg = [ [ @{ $p->{pre_msg}[0] } ], [ @{ $p->{pre_msg}[1] } ] ];
74             $msg_seq = [ map { [@$_] } @{ $p->{msg_seq} } ];
75             for my $mod (@psk_modifiers) {
76             my ($idx) = $mod =~ /(\d+)/;
77             if ( $idx == 0 ) {
78             unshift $msg_seq->[0]->@*, 'psk';
79             }
80             else {
81             # psks are added after the (idx)-th message
82             # noise-c vectors often use multiple PSKs
83             push $msg_seq->[ $idx - 1 ]->@*, 'psk' if $idx <= scalar @$msg_seq;
84             }
85             }
86             }
87             };
88             #
89             1;