/* common (not config, need code patch after change) */ #include #include #include #include #include #include #include #include #include #include #include #include #include #ifdef __linux__ #include #elif __OpenBSD__ #include #else #error "unsupported system" #endif #include "shorttypes.h" #include "sponge-bob.h" #define ERRDIE(a, b) if ((a) == -1) perror((b)), exit(1) #define NONCE_SZ 16 #define HMAC_SZ 16 u8 key[32]; u32 prng_state[14]; static void send_pkt (s32 skt, void *buf, u16 sz, struct sockaddr_storage *addr){ ssize_t res; u8 *nonce, *tag; /* nonce, tag */ nonce = (u8*)buf + sz; tag = nonce + NONCE_SZ; duplex257_prng_rand16(prng_state, nonce); /* encrypt */ duplex257_ae_encrypt(key, nonce, tag, buf, sz); sz += NONCE_SZ + HMAC_SZ; /* send */ res = sendto(skt, buf, sz, 0,(struct sockaddr*)addr, sizeof(*addr)); ERRDIE(res, "sendto"); return; } static s32 recv_pkt (s32 skt, void *buf, u16 sz, struct sockaddr_storage *addr){ socklen_t skl; s32 res; u8 *nonce, *rtag; u8 tag[HMAC_SZ]; /* recv */ skl = sizeof(*addr); res = recvfrom(skt, buf, sz, 0, (struct sockaddr*)addr, &skl); ERRDIE(res, "recvfrom"); /* nonce, recieved tag */ rtag = buf + res - HMAC_SZ; nonce = rtag - NONCE_SZ; /* decrypt */ res -= NONCE_SZ + HMAC_SZ; duplex257_ae_decrypt(key, nonce, tag, buf, res); if (0 != memcmp(tag, rtag, HMAC_SZ)) return -1; return res; }