david/ipxe
david
/
ipxe
Archived
1
0
Fork 0
This repository has been archived on 2020-12-06. You can view files and clone it, but cannot push or open issues or pull requests.
ipxe/src/tests
Michael Brown 8baefad659 [tcpip] Avoid generating positive zero for transmitted UDP checksums
TCP/IP checksum fields are one's complement values and therefore have
two possible representations of zero: positive zero (0x0000) and
negative zero (0xffff).

In RFC768, UDP over IPv4 exploits this redundancy to repurpose the
positive representation of zero (0x0000) to mean "no checksum
calculated"; checksums are optional for UDP over IPv4.

In RFC2460, checksums are made mandatory for UDP over IPv4.  The
wording of the RFC is such that the UDP header is mandated to use only
the negative representation of zero (0xffff), rather than simply
requiring the checksum to be correct but allowing for either
representation of zero to be used.

In RFC1071, an example algorithm is given for calculating the TCP/IP
checksum.  This algorithm happens to produce only the positive
representation of zero (0x0000); this is an artifact of the way that
unsigned arithmetic is used to calculate a signed one's complement
sum (and its final negation).

A common misconception has developed (exemplified in RFC1624) that
this artifact is part of the specification.  Many people have assumed
that the checksum field should never contain the negative
representation of zero (0xffff).

A sensible receiver will calculate the checksum over the whole packet
and verify that the result is zero (in whichever representation of
zero happens to be generated by the receiver's algorithm).  Such a
receiver will not care which representation of zero happens to be used
in the checksum field.

However, there are receivers in existence which will verify the
received checksum the hard way: by calculating the checksum over the
remainder of the packet and comparing the result against the checksum
field.  If the representation of zero used by the receiver's algorithm
does not match the representation of zero used by the transmitter (and
so placed in the checksum field), and if the receiver does not
explicitly allow for both representations to compare as equal, then
the receiver may reject packets with a valid checksum.

For UDP, the combined RFCs effectively mandate that we should generate
only the negative representation of zero in the checksum field.

For IP, TCP and ICMP, the RFCs do not mandate which representation of
zero should be used, but the misconceptions which have grown up around
RFC1071 and RFC1624 suggest that it would be least surprising to
generate only the positive representation of zero in the checksum
field.

Fix by ensuring that all of our checksum algorithms generate only the
positive representation of zero, and explicitly inverting this in the
case of transmitted UDP packets.

Reported-by: Wissam Shoukair <wissams@mellanox.com>
Tested-by: Wissam Shoukair <wissams@mellanox.com>
Signed-off-by: Michael Brown <mcb30@ipxe.org>
2015-09-10 14:46:54 +01:00
..
comboot [comboot] Add COMBOOT and COM32 support 2008-08-28 23:52:19 +01:00
aes_test.c [test] Add NIST self-tests for AES192 in ECB and CBC modes 2015-07-27 17:25:37 +01:00
base16_test.c [base16] Add buffer size parameter to base16_encode() and base16_decode() 2015-04-24 14:41:32 +01:00
base64_test.c [base64] Add buffer size parameter to base64_encode() and base64_decode() 2015-04-24 15:32:04 +01:00
bigint_test.c [legal] Relicense files under GPL2_OR_LATER_OR_UBDL 2015-03-02 14:17:31 +00:00
bofm_test.c [legal] Relicense files under GPL2_OR_LATER_OR_UBDL 2015-03-02 14:17:31 +00:00
byteswap_test.c [legal] Relicense files under GPL2_OR_LATER_OR_UBDL 2015-03-02 14:17:31 +00:00
cipher_test.c [test] Generalise cipher tests and use okx() 2015-07-27 16:04:38 +01:00
cipher_test.h [test] Generalise cipher tests and use okx() 2015-07-27 16:04:38 +01:00
cms_test.c [build] Fix the REQUIRE_SYMBOL mechanism 2015-03-05 00:59:38 +00:00
crc32_test.c [legal] Relicense files under GPL2_OR_LATER_OR_UBDL 2015-03-02 14:17:31 +00:00
deflate_test.c [legal] Relicense files under GPL2_OR_LATER_OR_UBDL 2015-03-02 14:17:31 +00:00
digest_test.c [test] Simplify digest algorithm self-tests 2015-04-12 17:01:10 +01:00
digest_test.h [test] Simplify digest algorithm self-tests 2015-04-12 17:01:10 +01:00
dns_test.c [legal] Relicense files under GPL2_OR_LATER_OR_UBDL 2015-03-02 14:17:31 +00:00
entropy_sample.c [legal] Relicense files under GPL2_OR_LATER_OR_UBDL 2015-03-02 14:17:31 +00:00
gdbstub_test.S [i386] Add explicit flags and type on all .section declarations 2009-02-15 10:59:53 +00:00
gdbstub_test.gdb [build] Rename gPXE to iPXE 2010-04-19 23:43:39 +01:00
hash_df_test.c [legal] Relicense files under GPL2_OR_LATER_OR_UBDL 2015-03-02 14:17:31 +00:00
hmac_drbg_test.c [legal] Relicense files under GPL2_OR_LATER_OR_UBDL 2015-03-02 14:17:31 +00:00
ipv4_test.c [ipv4] Redefine IP address constants to avoid unnecessary byte swapping 2015-07-28 13:48:29 +01:00
ipv6_test.c [legal] Relicense files under GPL2_OR_LATER_OR_UBDL 2015-03-02 14:17:31 +00:00
linebuf_test.c [linebuf] Support buffering of multiple lines 2015-07-28 16:59:11 +01:00
list_test.c [legal] Relicense files under GPL2_OR_LATER_OR_UBDL 2015-03-02 14:17:31 +00:00
math_test.c [libc] Add ffs(), ffsl(), and ffsll() 2015-03-16 15:40:53 +00:00
md5_test.c [test] Simplify digest algorithm self-tests 2015-04-12 17:01:10 +01:00
memcpy_test.c [legal] Relicense files under GPL2_OR_LATER_OR_UBDL 2015-03-02 14:17:31 +00:00
memset_test.c [legal] Relicense files under GPL2_OR_LATER_OR_UBDL 2015-03-02 14:17:31 +00:00
ocsp_test.c [build] Fix the REQUIRE_SYMBOL mechanism 2015-03-05 00:59:38 +00:00
pccrc_test.c [peerdist] Include trimmed range within content information block 2015-07-28 15:22:26 +01:00
pixbuf_test.c [image] Detect image type when image is first registered 2015-08-21 16:25:11 +01:00
pixbuf_test.h [legal] Relicense files under GPL2_OR_LATER_OR_UBDL 2015-03-02 14:17:31 +00:00
png_test.c [legal] Relicense files under GPL2_OR_LATER_OR_UBDL 2015-03-02 14:17:31 +00:00
pnm_test.c [legal] Relicense files under GPL2_OR_LATER_OR_UBDL 2015-03-02 14:17:31 +00:00
profile_test.c [legal] Relicense files under GPL2_OR_LATER_OR_UBDL 2015-03-02 14:17:31 +00:00
pubkey_test.h [legal] Relicense files under GPL2_OR_LATER_OR_UBDL 2015-03-02 14:17:31 +00:00
rsa_test.c [legal] Relicense files under GPL2_OR_LATER_OR_UBDL 2015-03-02 14:17:31 +00:00
setjmp_test.c [test] Add setjmp()/longjmp() self-tests 2015-04-07 06:40:46 +01:00
settings_test.c [settings] Re-add "uristring" setting type 2015-08-25 13:31:46 +01:00
sha1_test.c [test] Simplify digest algorithm self-tests 2015-04-12 17:01:10 +01:00
sha256_test.c [crypto] Add SHA-224 algorithm 2015-04-12 17:01:10 +01:00
sha512_test.c [crypto] Add SHA-512/224 algorithm 2015-04-12 17:02:11 +01:00
string_test.c [legal] Relicense files under GPL2_OR_LATER_OR_UBDL 2015-03-02 14:17:31 +00:00
tcpip_test.c [tcpip] Avoid generating positive zero for transmitted UDP checksums 2015-09-10 14:46:54 +01:00
test.c [legal] Relicense files under GPL2_OR_LATER_OR_UBDL 2015-03-02 14:17:31 +00:00
tests.c [linebuf] Support buffering of multiple lines 2015-07-28 16:59:11 +01:00
time_test.c [legal] Relicense files under GPL2_OR_LATER_OR_UBDL 2015-03-02 14:17:31 +00:00
umalloc_test.c [ioapi] Move get_memmap() to the I/O API group 2010-08-16 16:54:03 +01:00
uri_test.c [uri] Generalise tftp_uri() to pxe_uri() 2015-09-02 13:38:53 +01:00
vsprintf_test.c [legal] Relicense files under GPL2_OR_LATER_OR_UBDL 2015-03-02 14:17:31 +00:00
x509_test.c [build] Fix the REQUIRE_SYMBOL mechanism 2015-03-05 00:59:38 +00:00