Commit 641f7806 authored by 神楽坂玲奈's avatar 神楽坂玲奈

ipv6

parent fb2be580
Pipeline #15703 passed with stages
in 1 minute
......@@ -45,24 +45,29 @@ uint16_t csum(uint16_t *packet, int packlen) {
}
class Secret {
private:
char* key;
size_t length;
public:
Secret(char* key): key(key), length(strlen(key)) {}
void encrypt(unsigned char* data, size_t length) {
for (size_t i = 0; i < length; i++) {
data[i] ^= key[i % this->length];
}
}
void decrypt(unsigned char* data, size_t length) {
encrypt(data, length);
private:
char *key;
size_t length;
public:
Secret(char *key) : key(key), length(strlen(key)) {}
void encrypt(unsigned char *data, size_t length) {
for (size_t i = 0; i < length; i++) {
data[i] ^= key[i % this->length];
}
}
void decrypt(unsigned char *data, size_t length) {
encrypt(data, length);
}
};
Secret *localSecret;
Secret *remoteSecret;
#include <linux/ipv6.h>
// internet -> tun
void inbound(int raw, int tun) {
unsigned char buffer[ETH_DATA_LEN];
......@@ -75,11 +80,20 @@ void inbound(int raw, int tun) {
auto payload = buffer + overhead;
auto meta = (Meta *) payload;
if (!(meta->src_id == remote_id && meta->dst_id == local_id && meta->reversed == 0)) continue;
auto inner = (iphdr *) (payload + sizeof(Meta));
auto inner = (payload + sizeof(Meta));
auto payload_length = packet_length - overhead - sizeof(Meta);
remoteSecret->decrypt((unsigned char *) inner, payload_length);
remoteSecret->decrypt(inner, payload_length);
switch (((ipv6hdr *) inner)->version) {
case 4:
if (csum((uint16_t *) inner, ((iphdr *) inner)->ihl * 4)) continue;
break;
case 6:
// ipv6 don't have checksum, do nothing
break;
default:
continue;
}
// if (ip_fast_csum(inner, inner->ihl)) continue;
if (csum((uint16_t *) inner, inner->ihl * 4)) continue;
// std::cout << "packet_length " << packet_length
// << " tot_len " << ntohs(packet->tot_len)
// << " inner->tot_len " << ntohs(inner->tot_len)
......@@ -116,7 +130,7 @@ void outbound(int raw, int tun) {
perror("outbound read");
}
auto get_var(const char* varname, bool required = false) {
auto get_var(const char *varname, bool required = false) {
auto value = getenv(varname);
if (value == nullptr && required) {
std::cerr << "missing required environment variable: " << varname << std::endl;
......@@ -125,7 +139,7 @@ auto get_var(const char* varname, bool required = false) {
return value;
}
auto get_var_number(const char* varname, bool required = false) {
auto get_var_number(const char *varname, bool required = false) {
auto value = get_var(varname, required);
if (value == nullptr) return 0;
return atoi(value);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment