Re: FW: [Q] cksum of UDP packet

From: crawford charles (biv0uac17at_private)
Date: Wed Jul 30 2003 - 08:22:32 PDT

  • Next message: Calderon, Juan C (EM, DDEMESIS): "RE: Password Hiding"

    One infers from the sample below that you did not include the "UDP 
    Pseudo-header" (IP src/dst address etc.) in the calculation.
    See Comer/Stevens, RFC 768, or a host of other references for the UDP 
    checksum computation.
    
    I hope that this helps.
    
    From: Qin An [mailto:anqinat_private]
    Sent: Tuesday, July 29, 2003 11:41 PM
    To: secprogat_private
    Subject: [Q] cksum of UDP packet
    
    
    Hi, Glad to meet you all!
    
    I got a problem in cksum computation for UDP packet. At the end of this
    mail, there is
    a function copied from a textbook. I believe it is a universal cksum
    calculation function.
    I captured a UDP packet on the net:
    
    0x07, 0x2c, 0x00, 0x35, 0x00, 0x0c, 0x98, 0x8e, 0x64, 0x69, 0x72, 0x0a
    
    The 6th and 7th element is the cksum computed by the sender's kernel. My
    question is that
    when I use in_cksum to compute the cksum, it returns 0x1f22, different from
    0x98, 0x8e.
    What's wrong here? Is there any other algorithm to compute cksum?
    
    Thank you in advance!
    
    
    Qin An
    
    ==========================================
    
    unsigned short in_cksum (unsigned short *ptr, int nbytes)
    {
       unsigned long sum;  /* assumes long == 32 bits */
       unsigned short oddbyte, answer; /* assumes short == 16 bits */
    
       sum = 0;
       while (nbytes > 1){
      sum += *ptr++;
      nbytes -= 2;
      }
    
       /* mop up an odd byte, if necessary */
       if (nbytes == 1){
       /* make sure top half is zero */
      oddbyte = 0;
       /* one byte only */
      * ((unsigned char *) &oddbyte) = *(unsigned char *) ptr;
      sum += oddbyte;
      }
    
      /* add back carry outs from top 16 bits to low 16 bits */
       /* add high-16 to low-16 */
       sum = (sum >> 16) + (sum & 0xffff);
       /* add carry */
       sum += (sum >> 16);
       /* ones-compliment, then truncate to 16 bits */
       answer = (unsigned short)(~sum);
       return answer;
    }
    
    unsigned char s[] = {
    0x07, 0x2c, 0x00, 0x35, 0x00, 0x0c, 0x98,
    0x8e, 0x64, 0x69, 0x72, 0x0a};
    
    
    int main (int argc, char *argv[])
    {
       int i;
    
       s[6] = s[7] = 0;
    
       i = in_cksum ((unsigned short *) &s[0], 12);
    }
    
    _________________________________________________________________
    Add photos to your messages with MSN 8. Get 2 months FREE*.  
    http://join.msn.com/?page=features/featuredemail
    



    This archive was generated by hypermail 2b30 : Wed Jul 30 2003 - 13:34:49 PDT