File Coverage

File:C4/SIP/Sip/Checksum.pm
Coverage:97.1%

linestmtbrancondsubtimecode
1package Sip::Checksum;
2
3
1
1
1
4
2
39
use Exporter;
4
1
1
1
4
1
20
use strict;
5
1
1
1
4
1
419
use warnings;
6
7our @ISA = qw(Exporter);
8our @EXPORT_OK = qw(checksum verify_cksum);
9our $debug = 0;
10
11sub checksum {
12
3
1937
    my $pkt = shift;
13
3
22
    return (-unpack('%16C*', $pkt) & 0xFFFF);
14}
15
16sub verify_cksum {
17
2
13
    my $pkt = shift;
18
2
2
    my $cksum;
19
2
3
    my $shortsum;
20
21
2
8
        if ($pkt =~ /AZ(....)$/) {
22
1
3
                $debug and warn "verify_cksum: sum ($1) detected";
23        } else {
24
1
69
                warn "verify_cksum: no sum detected";
25
1
9
                return 0; # No checksum at end
26        }
27    # return 0 if (substr($pkt, -6, 2) ne "AZ");
28
29    # Convert the checksum back to hex and calculate the sum of the
30    # pack without the checksum.
31
1
29
    $cksum = hex($1);
32
1
3
    $shortsum = unpack("%16C*", substr($pkt, 0, -4));
33
34    # The checksum is valid if the hex sum, plus the checksum of the
35    # base packet short when truncated to 16 bits.
36
1
11
    return (($cksum + $shortsum) & 0xFFFF) == 0;
37}
38
39{
40
1
1
1
4
2
71
    no warnings qw(once);
41    eval join('',<main::DATA>) || die $@ unless caller();
42        # FIXME: what the heck is this?
43}
44
451;