29#define IMPLEMENT(x) (x) > 0
31#define INCREASE_SECURITY 0
32#define AVOID_FUNCTION_CALL 0
41static const char sbox[256] =
42 "c|w{\362ko\3050\01g+\376\327\253v\312\202\311}\372YG\360\255\324\242\257"""
43 "\234\244r\300\267\375\223&6\?\367\3144\245\345\361q\3301\25\04\307#\303\30"
44 "\226\05\232\a\22\200\342\353\'\262u\t\203,\32\33nZ\240R;\326\263)\343/\204"
45 "S\321\0\355 \374\261[j\313\2769JLX\317\320\357\252\373CM3\205E\371\02\177P"
46 "<\237\250Q\243@\217\222\2358\365\274\266\332!\20\377\363\322\315\f\23\354_"
47 "\227D\27\304\247~=d]\31s`\201O\334\"*\220\210F\356\270\24\336^\v\333\3402:"
48 "\nI\06$\\\302\323\254b\221\225\344y\347\3107m\215\325N\251lV\364\352ez\256"
49 "\b\272x%.\34\246\264\306\350\335t\37K\275\213\212p>\265fH\03\366\16a5W\271"
50 "\206\301\035\236\341\370\230\021i\331\216\224\233\36\207\351\316U(\337\214"
51 "\241\211\r\277\346BhA\231-\17\260T\273\26";
55 "R\tj\32506\2458\277@\243\236\201\363\327\373|\3439\202\233/\377\2074\216CD"
56 "\304\336\351\313T{\2242\246\302#=\356L\225\vB\372\303N\b.\241f(\331$\262v["
57 "\242Im\213\321%r\370\366d\206h\230\026\324\244\\\314]e\266\222lpHP\375\355"
58 "\271\332^\25FW\247\215\235\204\220\330\253\0\214\274\323\n\367\344X\05\270"
59 "\263E\06\320,\036\217\312?\17\02\301\257\275\03\01\23\212k:\221\021AOg\334"
60 "\352\227\362\317\316\360\264\346s\226\254t\"\347\2555\205\342\3717\350\34u"
61 "\337nG\361\32q\35)\305\211o\267b\16\252\30\276\33\374V>K\306\322y \232\333"
62 "\300\376x\315Z\364\037\335\2503\210\a\3071\261\22\20Y\'\200\354_`Q\177\251"
63 "\31\265J\r-\345z\237\223\311\234\357\240\340;M\256*\365\260\310\353\273<"""
64 "\203S\231a\27+\4~\272w\326&\341i\24cU!\f}";
83#define SBoxValue(x) *(sbox + x)
84#define InvSBoxValue(x) (rsbox[x])
86#define COPYDWORD(x, y) *(int32_t*) &y = *(int32_t*) &x
87#define XOR32BITS(x, y) *(int32_t*) &y ^= *(int32_t*) &x
90#define XOR64BITS(x, y) *(int64_t*) &y ^= *(int64_t*) &x
92#define XOR64BITS(x, y) XOR32BITS(x, y); XOR32BITS(*(&x + 4), *(&y + 4))
95#if AVOID_FUNCTION_CALL
96#define xorBlock(x, y) XOR64BITS(*(x), *(y)); XOR64BITS((x)[8], (y)[8])
98#define xtime(x) ((x) & 0x80 ? (x) * 2 ^ 0x11b : (x) << 1)
100#define mixG8(a, b, c, d) b ^ c ^ d ^ \
101 xtime(a ^ b ^ xtime(a ^ c ^ xtime(a ^ b ^ c ^ d )))
107 return (x > 0x7f) * 0x1b ^ (x << 1);
116 n -=
sizeof (size_t);
117 *(
size_t*) &dest[n] ^= *(
size_t const*) &src[n];
124static uint8_t
mixG8( uint8_t a, uint8_t b, uint8_t c, uint8_t d )
201 uint8_t tmp = state[0][1];
202 state[0][1] = state[1][1];
203 state[1][1] = state[2][1];
204 state[2][1] = state[3][1];
208 state[0][2] = state[2][2];
211 state[1][2] = state[3][2];
215 state[3][3] = state[2][3];
216 state[2][3] = state[1][3];
217 state[1][3] = state[0][3];
225 for (i = 0; i <
Nb; ++i)
231 C[2] =
xtime( C[0] );
232 C[0] ^=
xtime( C[1] );
233 C[1] =
xtime( C[3] );
235 state[i][0] ^= C[0] ^= C[3];
236 state[i][1] ^= C[0] ^= C[2];
237 state[i][2] ^= C[0] ^= C[1];
238 state[i][3] ^= C[0] ^= C[2];
249 if (input != output) memcpy( mat, input,
BLOCKSIZE );
253 for (r = 0; r !=
ROUNDS; )
266#if IMPLEMENT(DECRYPTION)
281 uint8_t tmp = state[3][1];
282 state[3][1] = state[2][1];
283 state[2][1] = state[1][1];
284 state[1][1] = state[0][1];
288 state[0][2] = state[2][2];
291 state[1][2] = state[3][2];
295 state[0][3] = state[1][3];
296 state[1][3] = state[2][3];
297 state[2][3] = state[3][3];
305 for (i = 0; i <
Nb; ++i)
308 state[i][0] =
mixG8( C[0], C[1], C[2], C[3] );
309 state[i][1] =
mixG8( C[1], C[2], C[3], C[0] );
310 state[i][2] =
mixG8( C[2], C[3], C[0], C[1] );
311 state[i][3] =
mixG8( C[3], C[0], C[1], C[2] );
322 if (input != output) memcpy( mat, input,
BLOCKSIZE );
326 for (r =
ROUNDS; r != 0; )
344void SPP_EXTERNAL_ENCRYPTION_cipher(
const uint8_t* key,
const char mode,
const block_t x,
block_t y )
359typedef void (*fdouble_t)(
block_t );
361#define AES_setkey(key) KeyExpansion( key )
363#if !INCREASE_SECURITY
364#define BURN(key) (void) key
365#define SABOTAGE(buf, len) (void) buf
366#define memcmp_s memcmp
369#define BURN(key) memset( key, 0, sizeof key )
370#define SABOTAGE(buf, len) memset( buf, 0, len )
374static uint8_t
memcmp_s(
const void* src,
const void* dest,
const char len )
376 const volatile char *p1 = src, *p2 = (
const volatile char*) dest;
377 volatile uint8_t result = 0;
379 for (i = 0; i != len; i++)
381 result |= p1[i] ^ p2[i];
389typedef uint8_t count_t;
391#define incBlock(block, index) ++block[index]
392#define xorBEint(buf, num, pos) buf[pos - 1] ^= (num) >> 8; buf[pos] ^= num
393#define copyLint(buf, num, pos) buf[pos + 1] = (num) >> 8; buf[pos] = num
396typedef size_t count_t;
401static void copyLint(
block_t block,
size_t num, uint8_t pos )
404 block[pos++] = (uint8_t) num;
412static void xorBEint( uint8_t* buff,
size_t num, uint8_t pos )
415 buff[pos--] ^= (uint8_t) num;
428 while (index >
HB ? --index : ++index < 4);
433#if EAX * !EAXP | SIV | OCB | CMAC
441 c |= array[--i] << 1;
442 array[i] = (uint8_t) c;
444 array[
LAST] ^= c * 0x87;
454 for (i = 0; i < BLOCKSIZE; c >>= 8)
457 array[i++] = (uint8_t) c;
459 array[0] ^= c * 0x87;
471 c = c << 8 | array[i];
474 if (c & 1) array[0] ^= 0xe1;
485 for (b = 0x80; b; b >>= 1)
494 memcpy( y, result,
sizeof result );
506 c = c << 8 | array[i];
509 if (c & 1) array[
LAST] ^= 0xe1;
520 for (b = 0x80; b; b >>= 1)
529 memcpy( y, result,
sizeof result );
533#if CTR | CFB | OFB | CTS | OCB
537 const uint8_t* X, uint8_t n, uint8_t* Y )
554static void xMac(
const void* data,
const size_t dataSize,
576#if CMAC | SIV | EAX | OCB
580 const void* data,
const size_t dataSize,
block_t mac )
582 const uint8_t s = dataSize ? (dataSize - 1) %
BLOCKSIZE + 1 : 0;
583 const uint8_t *lastcut = s ? (uint8_t*) data + dataSize - s : &s, *k = K1;
615 uint8_t n =
BLOCKSIZE - len, *p = &block[len];
640 const void* pntxt,
const size_t ptextLen,
void* crtxt )
644 memcpy( crtxt, pntxt, ptextLen );
667 const void* crtxt,
const size_t crtxtLen,
void* pntxt )
671 memcpy( pntxt, crtxt, crtxtLen );
701 const void* pntxt,
const size_t ptextLen,
void* crtxt )
703 uint8_t
const* iv = iVec;
712 memcpy( crtxt, pntxt, ptextLen );
750 const void* crtxt,
const size_t crtxtLen,
void* pntxt )
752 uint8_t
const *x = crtxt, *iv = iVec;
803 const void* input,
const size_t dataSize,
void* output )
805 uint8_t
const *iv = iVec, *x = input;
831 const void* pntxt,
const size_t ptextLen,
void* crtxt )
833 CFB_cipher( key, iVec, 1, pntxt, ptextLen, crtxt );
845 const void* crtxt,
const size_t crtxtLen,
void* pntxt )
847 CFB_cipher( key, iVec, 0, crtxt, crtxtLen, pntxt );
865 const void* pntxt,
const size_t ptextLen,
void* crtxt )
871 memcpy( iv, iVec,
sizeof iv );
872 memcpy( crtxt, pntxt, ptextLen );
893 const void* crtxt,
const size_t crtxtLen,
void* pntxt )
923 const void* input,
const size_t dataSize,
void* output )
927 uint8_t index =
LAST, *y;
929 memcpy( output, input, dataSize );
930 memcpy( cnt, iCtr,
sizeof cnt );
966 const void* pntxt,
const size_t ptextLen,
void* crtxt )
969 uint8_t
const* ctr = iv;
990 const void* crtxt,
const size_t crtxtLen,
void* pntxt )
1013 const block_t tweak,
const size_t sectid,
1014 const size_t dataSize,
void* storage )
1025 memset( T, 0,
sizeof T );
1026 copyLint( T, sectid, 0 );
1030 memcpy( T, tweak,
sizeof T );
1046 memcpy( L, T,
sizeof L );
1052 memcpy( L, y,
sizeof L );
1074 const void* pntxt,
const size_t ptextLen,
void* crtxt )
1076 memcpy( crtxt, pntxt, ptextLen );
1077 return XTS_cipher( keys, 1, tweak, ~0, ptextLen, crtxt );
1090 const void* crtxt,
const size_t crtxtLen,
void* pntxt )
1092 memcpy( pntxt, crtxt, crtxtLen );
1093 return XTS_cipher( keys, 0, tweak, ~0, crtxtLen, pntxt );
1110 const void* data,
const size_t dataSize,
block_t mac )
1113 memcpy( mac, K1,
sizeof K1 );
1116 cMac( K1, K2, data, dataSize, mac );
1129 const size_t aDataLen,
const size_t crtxtLen,
block_t gh )
1151 memcpy( iv, nonce, 12 );
1166 const void* aData,
const size_t aDataLen,
1167 const void* pntxt,
const size_t ptextLen,
void* crtxt )
1169 char* tag = (
char*) crtxt + ptextLen;
1170 block_t H = { 0 }, iv = { 0 }, G = { 0 };
1177 gHash( H, aData, crtxt, aDataLen, ptextLen, G );
1194 const void* aData,
const size_t aDataLen,
1195 const void* crtxt,
const size_t crtxtLen,
void* pntxt )
1197 const char* tag = (
char*) crtxt + crtxtLen;
1198 block_t H = { 0 }, iv = { 0 }, G = { 0 };
1201 gHash( H, aData, crtxt, aDataLen, crtxtLen, G );
1224 const size_t aDataLen,
const size_t ptextLen,
block_t M )
1227 uint8_t p = 1, s = 0;
1237 if (aDataLen > 0xFEFFL)
1240 A[0] = 0xFF, A[1] = 0xFE;
1243 s =
sizeof A - (++p);
1244 memcpy( A + p, aData, aDataLen < s ? aDataLen : s );
1270 const void* aData,
const size_t aDataLen,
1271 const void* pntxt,
const size_t ptextLen,
void* crtxt )
1273 char* tag = (
char*) crtxt + ptextLen;
1278 CCMtag( iv, aData, pntxt, aDataLen, ptextLen, C );
1297 const void* aData,
const size_t aDataLen,
1298 const void* crtxt,
const size_t crtxtLen,
void* pntxt )
1300 const char* tag = (
char*) crtxt + crtxtLen;
1306 CCMtag( iv, aData, pntxt, aDataLen, crtxtLen, C );
1325static void S2V(
const uint8_t* key,
const void* aData,
const void* pntxt,
1326 const size_t aDataLen,
const size_t ptextLen,
block_t IV )
1329 uint8_t r, *Q = K[1];
1341 cMac( *K, Q, aData, aDataLen, IV );
1346 if (ptextLen <
sizeof Y)
1351 else if ((r = ptextLen %
sizeof Y) > 0)
1356 cMac( *K, *K, pntxt, ptextLen - r, IV );
1360 cMac( NULL, Q, (
char*) pntxt + ptextLen - r, r, IV );
1374 const void* aData,
const size_t aDataLen,
1375 const void* pntxt,
const size_t ptextLen,
1378 S2V( keys, aData, pntxt, aDataLen, ptextLen, iv );
1396 const void* aData,
const size_t aDataLen,
1397 const void* crtxt,
const size_t crtxtLen,
void* pntxt )
1402 S2V( keys, aData, pntxt, aDataLen, crtxtLen, IV );
1419#if IMPLEMENT(GCM_SIV)
1423 const size_t aDataLen,
const size_t ptextLen,
block_t pv )
1426 copyLint( len, aDataLen * 8, 0 );
1427 copyLint( len, ptextLen * 8,
HB );
1442 for (*(int32_t*) iv = 0; *iv < 2 +
Nk / 2; ++*iv)
1471 const void* aData,
const size_t aDataLen,
1472 const void* pntxt,
const size_t ptextLen,
void* crtxt )
1475 uint8_t *H, *tag = (uint8_t*) crtxt + ptextLen;
1479 polyval( H, aData, pntxt, aDataLen, ptextLen, P );
1497 const void* aData,
const size_t aDataLen,
1498 const void* crtxt,
const size_t crtxtLen,
void* pntxt )
1501 uint8_t
const* tag = (uint8_t*) crtxt + crtxtLen;
1505 polyval( H, aData, pntxt, aDataLen, crtxtLen, P );
1526 const void* data,
const size_t dataSize,
block_t mac )
1529 if (!dataSize && indx)
1541 if (!dataSize)
return;
1543 cMac( D, Q, data, dataSize, mac );
1559 const size_t nonceLen,
1561 const void* aData,
const size_t aDataLen,
1563 const void* pntxt,
const size_t ptextLen,
void* crtxt )
1565 char* tag = (
char*) crtxt + ptextLen;
1570 oMac( 0, D, Q, nonce, nonceLen, siv );
1576 oMac( 2, D, Q, crtxt, ptextLen, siv );
1580 block_t D = { 0 }, Q, siv, mac;
1584 oMac( 1, D, Q, aData, aDataLen, mac );
1588 oMac( 2, D, Q, crtxt, ptextLen, siv );
1609 const size_t nonceLen,
1611 const void* aData,
const size_t aDataLen,
1613 const void* crtxt,
const size_t crtxtLen,
void* pntxt )
1615 const char* tag = (
char*) crtxt + crtxtLen;
1616 block_t D = { 0 }, Q, siv, mac;
1620 oMac( 2, D, Q, crtxt, crtxtLen, mac );
1621 oMac( 0, D, Q, nonce, nonceLen, siv );
1627 if (*(int32_t*) &mac[12] != 0)
1631 oMac( 2, D, Q, crtxt, crtxtLen, mac );
1632 oMac( 1, D, Q, aData, aDataLen, siv );
1664 count_t mask, bit = 1;
1667 memcpy( L, Ld,
sizeof L );
1670 while ((mask = index - bit) < index)
1693 const size_t ptextLen,
const size_t aDataLen,
1694 const size_t dataSize,
const void* aData,
1699 block_t offset[4] = { { 0 } };
1701 uint8_t *Ld = offset[0], *Ls = offset[1], *kt = offset[2], *del = offset[3];
1703 uint8_t
const s = 8 - n % 8, *x = kt + n / 8;
1712 memcpy( del, kt + 1,
HB );
1716 kt[i] = (x[i] << 8 | x[i + 1]) >> s;
1719 xMac( data, ptextLen, NULL, &
nop, tag );
1741 xMac( data, dataSize - ptextLen, NULL, &
nop, tag );
1757 cMac( NULL, Ls, x, i, del );
1774 const void* aData,
const size_t aDataLen,
1775 const void* pntxt,
const size_t ptextLen,
void* crtxt )
1778 char* tag = (
char*) crtxt + ptextLen;
1780 memcpy( crtxt, pntxt, ptextLen );
1781 OCB_cipher( key, nonce, ptextLen, aDataLen, ptextLen, aData, crtxt, mac );
1797 const void* aData,
const size_t aDataLen,
1798 const void* crtxt,
const size_t crtxtLen,
void* pntxt )
1801 const char* tag = (
char*) crtxt + crtxtLen;
1803 memcpy( pntxt, crtxt, crtxtLen );
1804 OCB_cipher( key, nonce, 0, aDataLen, crtxtLen, aData, pntxt, mac );
1820#define IV_KWA "\xA6\xA6\xA6\xA6\xA6\xA6\xA6\xA6"
1830 const void* secret,
const size_t secretLen,
void* wrapped )
1832 char *output = wrapped;
1833 char *r = output +
HB, *end = output + secretLen;
1835 count_t i, n = secretLen /
HB;
1840 memcpy( r, secret, secretLen );
1843 for (i = 0, n *= 6; i++ < n; )
1845 memcpy( A +
HB, r,
HB );
1847 memcpy( r, A +
HB,
HB );
1849 r = (r == end ? output : r) +
HB;
1853 memcpy( output, A,
HB );
1866 const void* wrapped,
const size_t wrapLen,
void* secret )
1868 char const* input = wrapped;
1869 char *r = secret, *end = (
char*) secret + wrapLen -
HB;
1871 count_t i, n = wrapLen /
HB;
1875 memcpy( A, input,
HB );
1876 memcpy( r, input +
HB, wrapLen -
HB );
1879 for (i = n * 6; i > 0; --i)
1881 r = (r == secret ? end : r) -
HB;
1883 memcpy( A +
HB, r,
HB );
1885 memcpy( r, A +
HB,
HB );
1902#if IMPLEMENT(POLY1305)
1905static void addLblocks(
const uint8_t* x,
const uint8_t len, uint8_t* y )
1908 for (i = a = 0; i < len; a >>= 8)
1911 y[i++] = (uint8_t) a;
1922 for (q = (q >> 2) * 5; q; q >>= 8)
1925 *block++ = (uint8_t) q;
1932 uint8_t n =
PL, result[
PL] = { 0 };
1935 uint8_t s = 8 * (n != 0), i;
1936 int32_t m = 0, y_n = y[n];
1938 for (i = 0; i <
sizeof result; ++i)
1941 m += (y_n * x[i] + result[i]) << s;
1942 result[i] = (uint8_t) m;
1946 memcpy( y, result,
sizeof result );
1958 const void* data,
const size_t dataSize,
block_t mac )
1960 uint8_t r[
PL], rk[
PL] = { 1 }, c[
PL] = { 0 }, poly[
PL] = { 0 }, s =
PL - 1;
1962 const char* pos = (
const char*) data + dataSize;
1968 if (!dataSize)
return;
1970 memcpy( r, keys +
KEYSIZE, s );
1971 for (r[s] = 0; s > 3; s -= 3)
1979 memcpy( c, pos -= s, s );
1990 if (poly[0] > 0xFA && q == 12)
1992 for (q = 1; poly[q] == 0xFF; ++q);
2007#include "micro_fpe.h"
2009#define ALPHABET "0123456789"
2011#define LOGRDX 3.32192809488736
2016#if ALPHABET_IS_NON_ASCII
2022#if RADIX - 1 <= UCHAR_MAX
2029#define TWEAK_PARAMS uint8_t* tweak
2030#define TWEAK_AGRS tweak
2031#define FPE_PERMUTE FF3_cipher
2033#define FPE_PERMUTE FF1_cipher
2034#define TWEAK_PARAMS uint8_t* tweak, const size_t tweakLen
2035#define TWEAK_AGRS tweak, tweakLen
2042 memset( num, 0, bytes );
2045 size_t k = bytes, y;
2046 for (y = *s++; k--; y >>= 8)
2048 y += num[k] *
RADIX;
2049 num[k] = (uint8_t) y;
2057 memset( s, 0,
sizeof (
radix_t) * len );
2061 for (x = *num++; k--; x /=
RADIX)
2073 for (a = 0; k--; a /=
RADIX)
2084 for (s = 1; k--; s /=
RADIX)
2086 s +=
RADIX - 1 + y[k] - x[k];
2093 const size_t u,
const size_t v,
radix_t* C )
2096 uint8_t* num = (uint8_t*) &C[u];
2097 size_t k =
b1 %
sizeof R, ext = (i & 1) * u;
2101 memcpy( R +
LAST - k, num - 1, k + 1 );
2106 memcpy( num, R,
sizeof R );
2107 k = (
b1 + 3L) /
sizeof R;
2109 for (ext = 0; k; ext = k--)
2121 size_t u = (len + !mode) / 2, t = tweakLen, v =
b1 %
BLOCKSIZE;
2136 P[--i] ^= tweak[--t];
2138 for (t = 10 * mode; i < t; ++i, u = v)
2140 FF1round( i, P, u, v = len - u, xC );
2141 addRadix( xC, u, X + (i & 1) * v );
2143 for (i ^= 10 + (
size_t) 0; i--; u = v)
2145 FF1round( i, P, u, v = len - u, xC );
2146 subRadix( xC, u, X + (i & 1) * v );
2154static void numRadix(
const radix_t* s, uint8_t len, uint8_t* num,
char bytes )
2156 memset( num, 0, bytes );
2159 size_t y = s[len], i;
2160 for (i = 0; i < bytes; y >>= 8)
2162 y += num[i] *
RADIX;
2163 num[i++] = (uint8_t) y;
2169static void strRadix(
const uint8_t* num,
char bytes,
radix_t* s, uint8_t len )
2171 memset( s, 0,
sizeof (
radix_t) * len );
2174 size_t x = num[bytes], i;
2175 for (i = 0; i < len; x /=
RADIX)
2187 for (i = 0; i < len; a /=
RADIX)
2198 for (i = 0; i < len; s /=
RADIX)
2200 s +=
RADIX - 1 + y[i] - x[i];
2206static void FF3round(
const uint8_t i,
const uint8_t* T,
2207 const uint8_t u,
const uint8_t v,
radix_t* C )
2209 uint8_t w = (i & 1) * 4, ext = (i & 1) * u;
2220static void FF3_cipher(
const uint8_t* key,
const char mode,
2224 uint8_t T[8], u = (len + mode) / 2, v, i, *tmp = (
void*) xC;
2226 memcpy( tmp, tweak, FF3_TWEAK_LEN );
2227 tmp[FF3_TWEAK_LEN] = tmp[3];
2228 if (FF3_TWEAK_LEN == 7)
2234 for (i = 7 + 1; i--; ) T[7 - i] = tmp[i];
2235 for (i =
KEYSIZE; i; ) tmp[--i] = *key++;
2240 for (; i < 8 * mode; ++i, u = v)
2242 FF3round( i, T, u, v = len - u, xC );
2243 addRadix( xC, u, X + (i & 1) * v );
2245 for (i ^= (
char) 8U; i--; u = v)
2247 FF3round( i, T, u, v = len - u, xC );
2248 subRadix( xC, u, X + (i & 1) * v );
2270 const void* input,
const size_t dataSize,
void* output )
2272 size_t v = (dataSize + 1) / 2;
2273 size_t n = (dataSize + v) *
sizeof (
radix_t);
2285 b1 = (size_t) (
LOGRDX * v + 8 - 1e-14) / 8;
2289 if ((index = malloc( n )) == NULL)
2293 for (n = 0; n < dataSize; ++n)
2296 for (v = 0x0; *ch != alpha[v]; )
2310 for (y[n] = 0; n--; )
2312 y[n] = alpha[index[n]];
2329 const void* pntxt,
const size_t ptextLen,
void* crtxt )
2345 const void* crtxt,
const size_t crtxtLen,
void* pntxt )
void SPP_EXTERNAL_ENCRYPTION_ctrDecrypt(const uint8_t *key, const uint8_t *iv, const void *crtxt, const size_t crtxtLen, void *pntxt)
decrypt the input ciphertext using CTR-AES block-cipher method
uint8_t block_t[BLOCKSIZE]
static char padBlock(const uint8_t len, block_t block)
static void cMac(const block_t K1, const block_t K2, const void *data, const size_t dataSize, block_t mac)
void SPP_EXTERNAL_ENCRYPTION_ecbEncrypt(const uint8_t *key, const void *pntxt, const size_t ptextLen, void *crtxt)
encrypt the input plaintext using ECB-AES block-cipher method
static void GCM_SIVsetup(const uint8_t *key, const uint8_t *nonce, block_t AK)
static void rijndaelDecrypt(const block_t input, block_t output)
char SPP_EXTERNAL_ENCRYPTION_cbcEncrypt(const uint8_t *key, const block_t iVec, const void *pntxt, const size_t ptextLen, void *crtxt)
encrypt the input plaintext using CBC-AES block-cipher method
void SPP_EXTERNAL_ENCRYPTION_ctrEncrypt(const uint8_t *key, const uint8_t *iv, const void *pntxt, const size_t ptextLen, void *crtxt)
encrypt the input plaintext using CTR-AES block-cipher method
void SPP_EXTERNAL_ENCRYPTION_poly1305(const uint8_t *keys, const block_t nonce, const void *data, const size_t dataSize, block_t mac)
derive the Poly1305-AES mac of message using a nonce and key pair.
static void divideLblock(block_t array)
static char FPE_cipher(const uint8_t *key, const char mode, const TWEAK_PARAMS, const void *input, const size_t dataSize, void *output)
encrypt or decrypt the input string with FPE method
static void doubleLblock(block_t array)
static void dotGF128(const block_t x, block_t y)
void SPP_EXTERNAL_ENCRYPTION_ofbDecrypt(const uint8_t *key, const block_t iVec, const void *crtxt, const size_t crtxtLen, void *pntxt)
decrypt the input ciphertext using OFB-AES block-cipher method
char SPP_EXTERNAL_ENCRYPTION_gcmSivDecrypt(const uint8_t *key, const uint8_t *nonce, const void *aData, const size_t aDataLen, const void *crtxt, const size_t crtxtLen, void *pntxt)
decrypt the input ciphertext using SIV-GCM-AES block-cipher method
static void addRadix(const radix_t *x, const size_t len, radix_t *y)
void SPP_EXTERNAL_ENCRYPTION_cfbEncrypt(const uint8_t *key, const block_t iVec, const void *pntxt, const size_t ptextLen, void *crtxt)
encrypt the input plaintext using CFB-AES block-cipher method
static uint8_t mixG8(uint8_t a, uint8_t b, uint8_t c, uint8_t d)
static void InvSubBytes(block_t state)
char SPP_EXTERNAL_ENCRYPTION_keyWrap(const uint8_t *kek, const void *secret, const size_t secretLen, void *wrapped)
encrypt the input secret with key-wrapping method
void SPP_EXTERNAL_ENCRYPTION_ofbEncrypt(const uint8_t *key, const block_t iVec, const void *pntxt, const size_t ptextLen, void *crtxt)
encrypt the input plaintext using OFB-AES block-cipher method
static void doubleBblock(block_t array)
static void GCMsetup(const uint8_t *key, const uint8_t *nonce, block_t auKey, block_t iv)
static void rijndaelEncrypt(const block_t input, block_t output)
static void subRadix(const radix_t *x, const size_t len, radix_t *y)
#define SABOTAGE(buf, len)
char SPP_EXTERNAL_ENCRYPTION_keyUnwrap(const uint8_t *kek, const void *wrapped, const size_t wrapLen, void *secret)
unwrap/decrypt a wrapped secret according to RFC-3394
void SPP_EXTERNAL_ENCRYPTION_gcmEncrypt(const uint8_t *key, const uint8_t *nonce, const void *aData, const size_t aDataLen, const void *pntxt, const size_t ptextLen, void *crtxt)
encrypt the input plaintext using GCM-AES block-cipher method
void SPP_EXTERNAL_ENCRYPTION_ocbEncrypt(const uint8_t *key, const uint8_t *nonce, const void *aData, const size_t aDataLen, const void *pntxt, const size_t ptextLen, void *crtxt)
encrypt the input stream using OCB-AES block-cipher method
static uint8_t xtime(uint8_t x)
void SPP_EXTERNAL_ENCRYPTION_sivEncrypt(const uint8_t *keys, const void *aData, const size_t aDataLen, const void *pntxt, const size_t ptextLen, block_t iv, void *crtxt)
encrypt the input plaintext using SIV-AES block-cipher method
static uint8_t RoundKey[BLOCKSIZE *ROUNDS+KEYSIZE]
char SPP_EXTERNAL_ENCRYPTION_cbcDecrypt(const uint8_t *key, const block_t iVec, const void *crtxt, const size_t crtxtLen, void *pntxt)
decrypt the input ciphertext using CBC-AES block-cipher method
static void MixColumns(state_t state)
static void CCMtag(const block_t iv, const void *aData, const void *pntxt, const size_t aDataLen, const size_t ptextLen, block_t M)
char SPP_EXTERNAL_ENCRYPTION_eaxDecrypt(const uint8_t *key, const uint8_t *nonce, const void *aData, const size_t aDataLen, const void *crtxt, const size_t crtxtLen, void *pntxt)
decrypt the input ciphertext using EAX-AES block-cipher method
static void getSubkeys(fdouble_t gfdouble, const char quad, const uint8_t *key, block_t D, block_t Q)
static void gHash(const block_t H, const void *aData, const void *crtxt, const size_t aDataLen, const size_t crtxtLen, block_t gh)
void SPP_EXTERNAL_ENCRYPTION_cfbDecrypt(const uint8_t *key, const block_t iVec, const void *crtxt, const size_t crtxtLen, void *pntxt)
decrypt the input ciphertext using CFB-AES block-cipher method
static void InvShiftRows(state_t state)
static void strRadix(const uint8_t *num, size_t bytes, radix_t *s, size_t len)
static void oMac(const uint8_t indx, const block_t D, const block_t Q, const void *data, const size_t dataSize, block_t mac)
static void getDelta(const count_t index, const block_t Ld, const block_t delta0, block_t delta)
char SPP_EXTERNAL_ENCRYPTION_sivDecrypt(const uint8_t *keys, const block_t iv, const void *aData, const size_t aDataLen, const void *crtxt, const size_t crtxtLen, void *pntxt)
decrypt the input ciphertext using SIV-AES block-cipher method
static void xMac(const void *data, const size_t dataSize, const block_t seed, fmix_t mix, block_t result)
static void FF1round(const uint8_t i, const block_t P, const size_t u, const size_t v, radix_t *C)
static void S2V(const uint8_t *key, const void *aData, const void *pntxt, const size_t aDataLen, const size_t ptextLen, block_t IV)
static void GCM_SIVtag(const uint8_t *nonce, block_t pv, block_t tag)
static void numRadix(const radix_t *s, size_t len, uint8_t *num, size_t bytes)
static void addLblocks(const uint8_t *x, const uint8_t len, uint8_t *y)
static void FF1_cipher(const uint8_t *key, const char mode, const TWEAK_PARAMS, const size_t len, radix_t *X)
static const char sbox[256]
void SPP_EXTERNAL_ENCRYPTION_gcmSivEncrypt(const uint8_t *key, const uint8_t *nonce, const void *aData, const size_t aDataLen, const void *pntxt, const size_t ptextLen, void *crtxt)
encrypt the input plaintext using SIV-GCM-AES block-cipher method
static void polyval(const block_t H, const void *aData, const void *pntxt, const size_t aDataLen, const size_t ptextLen, block_t pv)
void SPP_EXTERNAL_ENCRYPTION_ccmEncrypt(const uint8_t *key, const uint8_t *nonce, const void *aData, const size_t aDataLen, const void *pntxt, const size_t ptextLen, void *crtxt)
encrypt the input plaintext using CCM-AES block-cipher method
static void xorBlock(const block_t src, block_t dest)
char SPP_EXTERNAL_ENCRYPTION_gcmDecrypt(const uint8_t *key, const uint8_t *nonce, const void *aData, const size_t aDataLen, const void *crtxt, const size_t crtxtLen, void *pntxt)
decrypt the input ciphertext using GCM-AES block-cipher method
static void mixThenXor(fmix_t mix, const block_t B, block_t f, const uint8_t *X, uint8_t n, uint8_t *Y)
static void divideBblock(block_t array)
char SPP_EXTERNAL_ENCRYPTION_xtsEncrypt(const uint8_t *keys, const uint8_t *tweak, const void *pntxt, const size_t ptextLen, void *crtxt)
encrypt the input plaintext using XTS-AES block-cipher method
char SPP_EXTERNAL_ENCRYPTION_fpeDecrypt(const uint8_t *key, const TWEAK_PARAMS, const void *crtxt, const size_t crtxtLen, void *pntxt)
decrypt a ciphertext string using FPE-AES block-cipher method
static void SubBytes(block_t state)
static void CFB_cipher(const uint8_t *key, const block_t iVec, const char mode, const void *input, const size_t dataSize, void *output)
the general scheme of CFB-AES block-ciphering algorithm
char SPP_EXTERNAL_ENCRYPTION_ocbDecrypt(const uint8_t *key, const uint8_t *nonce, const void *aData, const size_t aDataLen, const void *crtxt, const size_t crtxtLen, void *pntxt)
decrypt the input stream using OCB-AES block-cipher method
static void nop(const block_t x, block_t y)
static void incBlock(block_t block, uint8_t index)
static void xorBEint(uint8_t *buff, size_t num, uint8_t pos)
static void InvMixColumns(state_t state)
char SPP_EXTERNAL_ENCRYPTION_xtsDecrypt(const uint8_t *keys, const uint8_t *tweak, const void *crtxt, const size_t crtxtLen, void *pntxt)
encrypt the input ciphertext using XTS-AES block-cipher method
static void AddRoundKey(const uint8_t round, block_t state)
static void mulGF128(const block_t x, block_t y)
static void KeyExpansion(const uint8_t *key)
static void OCB_cipher(const uint8_t *key, const uint8_t *nonce, const size_t ptextLen, const size_t aDataLen, const size_t dataSize, const void *aData, void *data, block_t tag)
encrypt or decrypt the data using OCB method
char SPP_EXTERNAL_ENCRYPTION_ecbDecrypt(const uint8_t *key, const void *crtxt, const size_t crtxtLen, void *pntxt)
decrypt the input ciphertext using ECB-AES block-cipher method
void(*) fmix_t(const block_t, block_t)
static void modP1305(uint8_t *block, int32_t q)
static void mulLblocks(const uint8_t *x, uint8_t *y)
static const char rsbox[256]
static char XTS_cipher(const uint8_t *keypair, const char mode, const block_t tweak, const size_t sectid, const size_t dataSize, void *storage)
encrypt or decrypt a data unit with XTS method
void SPP_EXTERNAL_ENCRYPTION_eaxEncrypt(const uint8_t *key, const uint8_t *nonce, const void *aData, const size_t aDataLen, const void *pntxt, const size_t ptextLen, void *crtxt)
encrypt the input plaintext using EAX-AES block-cipher method
void SPP_EXTERNAL_ENCRYPTION_cmac(const uint8_t *key, const void *data, const size_t dataSize, block_t mac)
derive the AES-CMAC of input data using an encryption key
char SPP_EXTERNAL_ENCRYPTION_ccmDecrypt(const uint8_t *key, const uint8_t *nonce, const void *aData, const size_t aDataLen, const void *crtxt, const size_t crtxtLen, void *pntxt)
decrypt the input ciphertext using CCM-AES block-cipher method
static void CTR_cipher(const block_t iCtr, const char mode, const void *input, const size_t dataSize, void *output)
the general scheme of operation in block-counter mode
char SPP_EXTERNAL_ENCRYPTION_fpeEncrypt(const uint8_t *key, const TWEAK_PARAMS, const void *pntxt, const size_t ptextLen, void *crtxt)
encrypt the input string using FPE-AES block-cipher method
static void ShiftRows(state_t state)