Solved

TCP checksum in delphi

Posted on 2008-09-30
1
1,229 Views
Last Modified: 2012-06-27
Can anyone tell me if there is a Delphi version of this routine out there to calculate the TCP checksum

/*
**************************************************************************
Function: tcp_sum_calc()
**************************************************************************
Description:
      Calculate TCP checksum
***************************************************************************
*/

typedef unsigned short u16;
typedef unsigned long u32;

u16 tcp_sum_calc(u16 len_tcp, u16 src_addr[],u16 dest_addr[], BOOL padding, u16 buff[])
{
u16 prot_tcp=6;
u16 padd=0;
u16 word16;
u32 sum;      
      
      // Find out if the length of data is even or odd number. If odd,
      // add a padding byte = 0 at the end of packet
      if (padding&1==1){
            padd=1;
            buff[len_tcp]=0;
      }
      
      //initialize sum to zero
      sum=0;
      
      // make 16 bit words out of every two adjacent 8 bit words and
      // calculate the sum of all 16 vit words
      for (i=0;i<len_tcp+padd;i=i+2){
            word16 =((buff[i]<<8)&0xFF00)+(buff[i+1]&0xFF);
            sum = sum + (unsigned long)word16;
      }      
      // add the TCP pseudo header which contains:
      // the IP source and destinationn addresses,
      for (i=0;i<4;i=i+2){
            word16 =((src_addr[i]<<8)&0xFF00)+(src_addr[i+1]&0xFF);
            sum=sum+word16;      
      }
      for (i=0;i<4;i=i+2){
            word16 =((dest_addr[i]<<8)&0xFF00)+(dest_addr[i+1]&0xFF);
            sum=sum+word16;       
      }
      // the protocol number and the length of the TCP packet
      sum = sum + prot_tcp + len_tcp;

      // keep only the last 16 bits of the 32 bit calculated sum and add the carries
          while (sum>>16)
            sum = (sum & 0xFFFF)+(sum >> 16);
            
      // Take the one's complement of sum
      sum = ~sum;

return ((unsigned short) sum);
}

Also how do I determine the len_tcp value and how do I get the buff[].
0
Comment
Question by:rayman3411
1 Comment
 

Accepted Solution

by:
rayman3411 earned 0 total points
ID: 22619277
I have answered my own question.
// Calculate TCP checkcum

function RERFilter.RecalculateTCPChecksum(aLen: Integer;

                                          aSrcAddr, aDstAddr: Cardinal;

                                          buff: PByteArray): Word;

type

  Tbyte = array of byte;
 

var

  w16,padd: word;

  i,sum: integer;

  sIP,dIP: in_addr;
 

begin

  padd := 0;

  sum := 0;

  try

    try

      if (aLen div 2) * 2 <> aLen then begin

        padd := 1;

        buff[aLen] := 0;

      end;

      i := 0;

      while i < aLen+padd do begin

        w16 := ((buff[i] shl 8)and $FF00) + (buff[i+1]and $FF);

        sum := sum + integer(w16);

        i := i + 2;

      end;
 

      //add IP length

      sIP := in_addr(aSrcAddr);

      dIP := in_addr(aDstAddr);

      sum := sum + ntohs(sIP.S_un_w.s_w1) + ntohs(sIP.S_un_w.s_w2);

      sum := sum + ntohs(dIP.S_un_w.s_w1) + ntohs(dIP.S_un_w.s_w2);

      sum := sum + IPPROTO_TCP + word(aLen);
 

      while (sum shr 16)>0 do

        sum := (sum and $FFFF)+(sum shr 16);

      sum := not sum;

    except on E : Exception do

      MessageDlg('Error Calculating TCP Checksum.'+#10#13+

                 'Exception: '+E.Message, mtError, [mbOk], 0);

    end;

  finally

    Result := sum;

  end;

end;

Open in new window

0

Featured Post

Is Your Active Directory as Secure as You Think?

More than 75% of all records are compromised because of the loss or theft of a privileged credential. Experts have been exploring Active Directory infrastructure to identify key threats and establish best practices for keeping data safe. Attend this month’s webinar to learn more.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Suggested Solutions

How to set-up an On Demand, IPSec, Site to SIte, VPN from a Draytek Vigor Router to a Cyberoam UTM Appliance. A concise guide to the settings required on both devices
Envision that you are chipping away at another e-business site with a team of pundit developers and designers. Everything seems, by all accounts, to be going easily.
This Micro Tutorial will teach you how to censor certain areas of your screen. The example in this video will show a little boy's face being blurred. This will be demonstrated using Adobe Premiere Pro CS6.
This Micro Tutorial hows how you can integrate  Mac OSX to a Windows Active Directory Domain. Apple has made it easy to allow users to bind their macs to a windows domain with relative ease. The following video show how to bind OSX Mavericks to …

910 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question

Need Help in Real-Time?

Connect with top rated Experts

22 Experts available now in Live!

Get 1:1 Help Now