crypto_aead.c 1.3 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68
#include "api.h"
#include "isap.h"
#include "crypto_aead.h"

int crypto_aead_encrypt(
	unsigned char *c, unsigned long long *clen,
	const unsigned char *m, unsigned long long mlen,
	const unsigned char *ad, unsigned long long adlen,
	const unsigned char *nsec,
	const unsigned char *npub,
	const unsigned char *k)
{
	(void)nsec;

	// Ciphertext length is mlen + tag length
	*clen = mlen + ISAP_TAG_SZ;

	// Encrypt plaintext
	if (mlen > 0)
	{
		isap_enc(k, npub, m, mlen, c);
	}

	// Generate tag
	unsigned char *tag = c + mlen;
	isap_mac(k, npub, ad, adlen, c, mlen, tag);
	return 0;
}

int crypto_aead_decrypt(
	unsigned char *m, unsigned long long *mlen,
	unsigned char *nsec,
	const unsigned char *c, unsigned long long clen,
	const unsigned char *ad, unsigned long long adlen,
	const unsigned char *npub,
	const unsigned char *k)
{
	(void)nsec;

	// Plaintext length is clen - tag length
	*mlen = clen - ISAP_TAG_SZ;

	// Generate tag
	unsigned char T[16];
	isap_mac(k, npub, ad, adlen, c, *mlen, T);

	// Compare tag
	unsigned char T_star[16];
	for (int i = 0; i < 16; i++)
    {
        T_star[i] = *(c + *mlen + i);
    }
	int eq_cnt = pvp(T, T_star);

	// Perform decryption if tag is correct
	if (eq_cnt == ISAP_TAG_SZ)
	{
		if (*mlen > 0)
		{
			isap_enc(k, npub, c, *mlen, m);
		}
		return 0;
	}
	else
	{
		return -1;
	}
}