go test: dynamically calculate ip checksum
Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
This commit is contained in:
		
							parent
							
								
									35a61c32fa
								
							
						
					
					
						commit
						554d77fbd7
					
				
					 1 changed files with 20 additions and 2 deletions
				
			
		| 
						 | 
					@ -16,6 +16,24 @@ import (
 | 
				
			||||||
	"golang.org/x/net/ipv4"
 | 
						"golang.org/x/net/ipv4"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func ipChecksum(buf []byte) uint16 {
 | 
				
			||||||
 | 
						sum := uint32(0)
 | 
				
			||||||
 | 
						for ; len(buf) >= 2; buf = buf[2:] {
 | 
				
			||||||
 | 
							sum += uint32(buf[0])<<8 | uint32(buf[1])
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						if len(buf) > 0 {
 | 
				
			||||||
 | 
							sum += uint32(buf[0]) << 8
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						for sum > 0xffff {
 | 
				
			||||||
 | 
							sum = (sum >> 16) + (sum & 0xffff)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						csum := ^uint16(sum)
 | 
				
			||||||
 | 
						if csum == 0 {
 | 
				
			||||||
 | 
							csum = 0xffff
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return csum
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func main() {
 | 
					func main() {
 | 
				
			||||||
	ourPrivate, _ := base64.StdEncoding.DecodeString("WAmgVYXkbT2bCtdcDwolI88/iVi/aV3/PHcUBTQSYmo=")
 | 
						ourPrivate, _ := base64.StdEncoding.DecodeString("WAmgVYXkbT2bCtdcDwolI88/iVi/aV3/PHcUBTQSYmo=")
 | 
				
			||||||
	ourPublic, _ := base64.StdEncoding.DecodeString("K5sF9yESrSBsOXPd6TcpKNgqoy1Ik3ZFKl4FolzrRyI=")
 | 
						ourPublic, _ := base64.StdEncoding.DecodeString("K5sF9yESrSBsOXPd6TcpKNgqoy1Ik3ZFKl4FolzrRyI=")
 | 
				
			||||||
| 
						 | 
					@ -95,12 +113,12 @@ func main() {
 | 
				
			||||||
		Len:      ipv4.HeaderLen,
 | 
							Len:      ipv4.HeaderLen,
 | 
				
			||||||
		TotalLen: ipv4.HeaderLen + len(pingMessage),
 | 
							TotalLen: ipv4.HeaderLen + len(pingMessage),
 | 
				
			||||||
		Protocol: 1, // ICMP
 | 
							Protocol: 1, // ICMP
 | 
				
			||||||
		TTL:      2,
 | 
							TTL:      20,
 | 
				
			||||||
		Checksum: 0xa15b, // the packet is always the same, hard-code checksum
 | 
					 | 
				
			||||||
		Src:      net.IPv4(10, 189, 129, 2),
 | 
							Src:      net.IPv4(10, 189, 129, 2),
 | 
				
			||||||
		Dst:      net.IPv4(10, 189, 129, 1),
 | 
							Dst:      net.IPv4(10, 189, 129, 1),
 | 
				
			||||||
	}).Marshal()
 | 
						}).Marshal()
 | 
				
			||||||
	binary.BigEndian.PutUint16(pingHeader[2:], uint16(ipv4.HeaderLen+len(pingMessage))) // fix the length endianness on BSDs
 | 
						binary.BigEndian.PutUint16(pingHeader[2:], uint16(ipv4.HeaderLen+len(pingMessage))) // fix the length endianness on BSDs
 | 
				
			||||||
 | 
						binary.BigEndian.PutUint16(pingHeader[10:], ipChecksum(append(pingHeader, pingMessage...)))
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		panic(err)
 | 
							panic(err)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in a new issue