1 package Sip::Checksum;
\r
7 our @ISA = qw(Exporter);
\r
8 our @EXPORT_OK = qw(checksum verify_cksum);
\r
15 foreach my $chr (map(ord, split(//, $pkt))) {
\r
18 $cksum = (-$cksum) & 0xFFFF;
\r
28 return 0 if (substr($pkt, -6, 2) ne "AZ"); # No checksum at end
\r
30 # Convert the checksum back to hex and calculate the sum of the
\r
31 # pack without the checksum.
\r
32 $cksum = hex(substr($pkt, -4));
\r
33 $shortsum = unpack("%16C*", substr($pkt, 0, -4));
\r
35 # The checksum is valid if the hex sum, plus the checksum of the
\r
36 # base packet short when truncated to 16 bits.
\r
37 return (($cksum + $shortsum) & 0xFFFF) == 0;
\r
41 no warnings qw(once);
\r
42 eval join('',<main::DATA>) || die $@ unless caller();
\r
47 # Some simple test data
\r
50 my $testpkt = shift;
\r
51 my $cksum = checksum($testpkt);
\r
52 my $fullpkt = sprintf("%s%4X", $testpkt, $cksum);
\r
54 print $fullpkt, "\n";
\r