Re: FW: [Q] cksum of UDP packet
From: crawford charles (biv0uac17_at_hotmail.com)
Date: 07/30/03
- Previous message: Larry Reedy: "RE: Password Hiding"
- Maybe in reply to: Qin An: "[Q] cksum of UDP packet"
- Messages sorted by: [ date ] [ thread ] [ subject ] [ author ] [ attachment ]
To: anqin@anqin.com Date: Wed, 30 Jul 2003 15:22:32 +0000
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:anqin@anqin.com]
Sent: Tuesday, July 29, 2003 11:41 PM
To: secprog@securityfocus.com
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
- Previous message: Larry Reedy: "RE: Password Hiding"
- Maybe in reply to: Qin An: "[Q] cksum of UDP packet"
- Messages sorted by: [ date ] [ thread ] [ subject ] [ author ] [ attachment ]
Relevant Pages
|