encrypt.c 5.9 KB
Newer Older
KNOT team committed
1 2 3 4 5 6
#include"auxFormat.h"

#define aead_RATE (128 / 8)
#define PR0_ROUNDS 100
#define PR_ROUNDS 52
#define PRF_ROUNDS 56
Wentao Zhang committed
7 8 9 10 11
/*

 #define PR0_ROUNDS 100
 #define PR_ROUNDS 76
 #define PRF_ROUNDS 80
KNOT team committed
12

Wentao Zhang committed
13 14 15 16 17 18 19 20 21 22 23 24 25
 #define PR0_ROUNDS 100
 #define PR_ROUNDS 52
 #define PRF_ROUNDS 56
 * */
unsigned char constant7Format_aead[100] = { 0x01, 0x04, 0x10, 0x40, 0x02, 0x08,
		0x21, 0x05, 0x14, 0x50, 0x42, 0x0a, 0x29, 0x24, 0x11, 0x44, 0x12, 0x48,
		0x23, 0x0d, 0x35, 0x55, 0x56, 0x5a, 0x6b, 0x2e, 0x38, 0x60, 0x03, 0x0c,
		0x31, 0x45, 0x16, 0x58, 0x63, 0x0f, 0x3d, 0x74, 0x53, 0x4e, 0x3b, 0x6c,
		0x32, 0x49, 0x27, 0x1d, 0x75, 0x57, 0x5e, 0x7b, 0x6e, 0x3a, 0x68, 0x22,
		0x09, 0x25, 0x15, 0x54, 0x52, 0x4a, 0x2b, 0x2c, 0x30, 0x41, 0x06, 0x18,
		0x61, 0x07, 0x1c, 0x71, 0x47, 0x1e, 0x79, 0x66, 0x1b, 0x6d, 0x36, 0x59,
		0x67, 0x1f, 0x7d, 0x76, 0x5b, 0x6f, 0x3e, 0x78, 0x62, 0x0b, 0x2d, 0x34,
		0x51, 0x46, 0x1a, 0x69, 0x26, 0x19, 0x65, 0x17, 0x5c, 0x73, };
KNOT team committed
26

Wentao Zhang committed
27 28 29 30 31 32 33 34
#define Processing_Data(data) \
do { \
	packU128FormatToFourPacket(dataFormat, data);   \
	s[0] ^= dataFormat[0];   \
	s[1] ^= dataFormat[1];   \
	s[2] ^= dataFormat[2];   \
	s[3] ^= dataFormat[3];   \
} while (0)
KNOT team committed
35

Wentao Zhang committed
36 37 38 39 40 41 42
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) {
	u32 i;
	u32 t[4] = { 0 };
KNOT team committed
43 44 45 46
	u32 s_temp[16] = { 0 };
	u32 t1, t2, t3, t5, t6, t8, t9, t11;
	u32 s[16] = { 0 };
	u32 dataFormat[4] = { 0 };
Wentao Zhang committed
47 48
	u8 tempData[16] = { 0 };
	u8 tempU8[32] = { 0 };
KNOT team committed
49 50 51 52 53 54 55
	*clen = mlen + CRYPTO_ABYTES;
	//initialization
	packU128FormatToFourPacket(s, npub);
	packU128FormatToFourPacket((s + 4), (npub + 16));
	packU128FormatToFourPacket((s + 8), k);
	packU128FormatToFourPacket((s + 12), (k + 16));
	for (i = 0; i < PR0_ROUNDS; i++) {
Wentao Zhang committed
56
		ROUND512(i);
KNOT team committed
57 58
	}
	// process associated data
Wentao Zhang committed
59
	//PAD(adlen, ad);
KNOT team committed
60 61
	if (adlen) {
		while (adlen >= aead_RATE) {
Wentao Zhang committed
62
			Processing_Data(ad);
KNOT team committed
63
			for (i = 0; i < PR_ROUNDS; i++) {
Wentao Zhang committed
64
				ROUND512(i);
KNOT team committed
65 66 67 68 69 70 71
			}
			adlen -= aead_RATE;
			ad += aead_RATE;
		}
		memset(tempData, 0, sizeof(tempData));
		memcpy(tempData, ad, adlen * sizeof(unsigned char));
		tempData[adlen] = 0x01;
Wentao Zhang committed
72
		Processing_Data(tempData);
KNOT team committed
73
		for (i = 0; i < PR_ROUNDS; i++) {
Wentao Zhang committed
74
			ROUND512(i);
KNOT team committed
75 76 77
		}
	}
	s[15] ^= 0x80000000;
Wentao Zhang committed
78
	// process p data
KNOT team committed
79 80
	if (mlen) {
		while (mlen >= aead_RATE) {
Wentao Zhang committed
81
			Processing_Data(m);
KNOT team committed
82 83
			unpackU128FormatToFourPacket(c, s);
			for (i = 0; i < PR_ROUNDS; i++) {
Wentao Zhang committed
84
				ROUND512(i);
KNOT team committed
85 86 87 88 89 90 91
			}
			mlen -= aead_RATE;
			m += aead_RATE;
			c += aead_RATE;
		}
		memset(tempData, 0, sizeof(tempData));
		memcpy(tempData, m, mlen * sizeof(unsigned char));
Wentao Zhang committed
92 93
		tempData[mlen] = 0x01;
		Processing_Data(tempData);
KNOT team committed
94 95 96 97 98 99
		unpackU128FormatToFourPacket(tempData, s);
		memcpy(c, tempData, mlen * sizeof(unsigned char));
		c += mlen;
	}
	// finalization
	for (i = 0; i < PRF_ROUNDS; i++) {
Wentao Zhang committed
100
		ROUND512(i);
KNOT team committed
101
	}
Wentao Zhang committed
102 103 104
	unpackU128FormatToFourPacket(tempU8, s);
	unpackU128FormatToFourPacket((tempU8 + 16), (s + 4));
	memcpy(c, tempU8, CRYPTO_ABYTES * sizeof(unsigned char));
KNOT team committed
105 106 107
	return 0;
}

Wentao Zhang committed
108 109 110 111
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) {
KNOT team committed
112
	u32 s_temp[16] = { 0 };
Wentao Zhang committed
113
	u32 t[4] = { 0 };
KNOT team committed
114
	u32 t1, t2, t3, t5, t6, t8, t9, t11;
Wentao Zhang committed
115
	u8 i;
KNOT team committed
116 117 118
	// initialization
	u32 s[16] = { 0 };
	u32 dataFormat_1[4] = { 0 };
Wentao Zhang committed
119
	u32 dataFormat[4] = { 0 };
KNOT team committed
120 121
	u8 tempData[16] = { 0 };
	u8 tempU8[64] = { 0 };
Wentao Zhang committed
122

KNOT team committed
123 124 125 126 127 128 129 130 131
	if (clen < CRYPTO_ABYTES)
		return -1;
	*mlen = clen - CRYPTO_ABYTES;
	//initialization
	packU128FormatToFourPacket(s, npub);
	packU128FormatToFourPacket((s + 4), (npub + 16));
	packU128FormatToFourPacket((s + 8), k);
	packU128FormatToFourPacket((s + 12), (k + 16));
	for (i = 0; i < PR0_ROUNDS; i++) {
Wentao Zhang committed
132
		ROUND512(i);
KNOT team committed
133 134 135 136
	}
	// process associated data
	if (adlen) {
		while (adlen >= aead_RATE) {
Wentao Zhang committed
137
			Processing_Data(ad);
KNOT team committed
138
			for (i = 0; i < PR_ROUNDS; i++) {
Wentao Zhang committed
139
				ROUND512(i);
KNOT team committed
140 141 142 143 144 145 146
			}
			adlen -= aead_RATE;
			ad += aead_RATE;
		}
		memset(tempData, 0, sizeof(tempData));
		memcpy(tempData, ad, adlen * sizeof(unsigned char));
		tempData[adlen] = 0x01;
Wentao Zhang committed
147
		Processing_Data(tempData);
KNOT team committed
148
		for (i = 0; i < PR_ROUNDS; i++) {
Wentao Zhang committed
149
			ROUND512(i);
KNOT team committed
150 151 152
		}
	}
	s[15] ^= 0x80000000;
Wentao Zhang committed
153
	// process c data
KNOT team committed
154 155 156
	clen = clen - CRYPTO_KEYBYTES;
	if (clen) {
		while (clen >= aead_RATE) {
Wentao Zhang committed
157 158 159 160 161
			packU128FormatToFourPacket(dataFormat, c);
			dataFormat_1[0] = s[0] ^ dataFormat[0];
			dataFormat_1[1] = s[1] ^ dataFormat[1];
			dataFormat_1[2] = s[2] ^ dataFormat[2];
			dataFormat_1[3] = s[3] ^ dataFormat[3];
KNOT team committed
162
			unpackU128FormatToFourPacket(m, dataFormat_1);
Wentao Zhang committed
163 164 165 166
			s[0] = dataFormat[0];
			s[1] = dataFormat[1];
			s[2] = dataFormat[2];
			s[3] = dataFormat[3];
KNOT team committed
167
			for (i = 0; i < PR_ROUNDS; i++) {
Wentao Zhang committed
168
				ROUND512(i);
KNOT team committed
169 170 171 172 173 174
			}
			clen -= aead_RATE;
			m += aead_RATE;
			c += aead_RATE;
		}
		unpackU128FormatToFourPacket(tempU8, s);
Wentao Zhang committed
175 176 177 178 179 180 181 182 183 184 185 186 187 188
		memset(tempData, 0, sizeof(tempData));
		memcpy(tempData, c, clen * sizeof(unsigned char));
		tempData[clen] = 0x01;
		U32BIG(((u32*)tempU8)[0]) ^= U32BIG(
				((u32* )tempData)[0]);
		U32BIG(((u32*)tempU8)[1]) ^= U32BIG(
				((u32* )tempData)[1]);
		U32BIG(((u32*)tempU8)[2]) ^= U32BIG(
				((u32* )tempData)[2]);
		U32BIG(((u32*)tempU8)[3]) ^= U32BIG(
				((u32* )tempData)[3]);
		memcpy(m, tempU8, clen * sizeof(unsigned char));
		memcpy(tempU8, tempData, clen * sizeof(unsigned char));
		c += clen;
KNOT team committed
189 190 191 192 193
		tempU8[i] ^= 0x01;
		packU128FormatToFourPacket(s, tempU8);
	}
	// finalization
	for (i = 0; i < PRF_ROUNDS; i++) {
Wentao Zhang committed
194 195
		ROUND512(i);

KNOT team committed
196
	}
KNOT team committed
197 198
	unpackU128FormatToFourPacket(tempU8, s);
	unpackU128FormatToFourPacket((tempU8 + 16), (s + 4));
Wentao Zhang committed
199 200
	if (memcmp((void*) tempU8, (void*) c, CRYPTO_ABYTES)) {
		memset(m, 0, sizeof(unsigned char) * (*mlen));
KNOT team committed
201
		*mlen = 0;
KNOT team committed
202 203 204
		return -1;
	}
	return 0;
Wentao Zhang committed
205
}