1 package Sip::Checksum;
\r
7 our @ISA = qw(Exporter);
\r
8 our @EXPORT_OK = qw(checksum verify_cksum);
\r
13 return (-unpack('%16U*', $pkt) & 0xFFFF);
\r
21 return 0 if (substr($pkt, -6, 2) ne "AZ"); # No checksum at end
\r
23 # Convert the checksum back to hex and calculate the sum of the
\r
24 # pack without the checksum.
\r
25 $cksum = hex(substr($pkt, -4));
\r
26 $shortsum = unpack("%16U*", substr($pkt, 0, -4));
\r
28 # The checksum is valid if the hex sum, plus the checksum of the
\r
29 # base packet short when truncated to 16 bits.
\r
30 return (($cksum + $shortsum) & 0xFFFF) == 0;
\r
34 no warnings qw(once);
\r
35 eval join('',<main::DATA>) || die $@ unless caller();
\r
40 # Some simple test data
\r
43 my $testpkt = shift;
\r
44 my $cksum = checksum($testpkt);
\r
45 my $fullpkt = sprintf("%s%4X", $testpkt, $cksum);
\r
47 print $fullpkt, "\n";
\r