Solved

TCP checksum in delphi

Posted on 2008-09-30
1
1,235 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

Netscaler Common Configuration How To guides

If you use NetScaler you will want to see these guides. The NetScaler How To Guides show administrators how to get NetScaler up and configured by providing instructions for common scenarios and some not so common ones.

Question has a verified solution.

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

Suggested Solutions

Title # Comments Views Activity
Openswan - Check IKE Version 3 340
Create VPN Tunnel from Windows 2008 using IPSEC 5 60
fake ip vps when using curl php(vpn)? 6 174
VPN Configuration 5 123
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 demonstrates using Microsoft Excel pivot tables, how to reverse engineer competitors' marketing strategies through backlinks.
The Email Laundry PDF encryption service allows companies to send confidential encrypted  emails to anybody. The PDF document can also contain attachments that are embedded in the encrypted PDF. The password is randomly generated by The Email Laundr…

770 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