#include "curve25519.h" #include #include #include void init() { if(sodium_init() == -1) { exit(-1); } } void curve25519_keypair_deleter(struct KeyPair p) { sodium_free(p.sec); free(p.pub); p.sec = NULL; p.pub = NULL; } struct KeyPair curve25519_create_keypair() { init(); unsigned char* sec = (unsigned char*) sodium_malloc(crypto_box_SECRETKEYBYTES); unsigned char* pub = (unsigned char*) malloc(crypto_box_PUBLICKEYBYTES); randombytes_buf(sec, crypto_box_SECRETKEYBYTES); crypto_scalarmult_base(pub, sec); return (struct KeyPair){ sec, pub, crypto_box_SECRETKEYBYTES, crypto_box_PUBLICKEYBYTES }; } void curve25519_shared_key_deleter(struct SharedKey s) { sodium_free(s.shared); s.shared = NULL; } struct SharedKey curve25519_derive_shared_key(struct KeyPair pair, unsigned char const* pub_key, bool swap_pub_order) { init(); unsigned char* shared = (unsigned char*) sodium_malloc(crypto_generichash_BYTES); crypto_generichash_state h; unsigned char* scalarmult_q = (unsigned char*) sodium_malloc(crypto_scalarmult_BYTES); if (crypto_scalarmult(scalarmult_q, pair.sec, pub_key) != 0) { exit(-1); } crypto_generichash_init(&h, NULL, 0U, crypto_generichash_BYTES); crypto_generichash_update(&h, scalarmult_q, crypto_scalarmult_BYTES); if(swap_pub_order) { crypto_generichash_update(&h, pub_key, crypto_box_PUBLICKEYBYTES); crypto_generichash_update(&h, pair.pub, crypto_box_PUBLICKEYBYTES); } else { crypto_generichash_update(&h, pair.pub, crypto_box_PUBLICKEYBYTES); crypto_generichash_update(&h, pub_key, crypto_box_PUBLICKEYBYTES); } crypto_generichash_final(&h, shared, crypto_generichash_BYTES); sodium_free(scalarmult_q); return (struct SharedKey){ shared, crypto_generichash_BYTES }; }