Add ChaCha library
This commit is contained in:
parent
444772113a
commit
952471c8f8
@ -204,6 +204,7 @@ find_package(GMP REQUIRED)
|
|||||||
find_package(Json REQUIRED)
|
find_package(Json REQUIRED)
|
||||||
find_package(Lua REQUIRED)
|
find_package(Lua REQUIRED)
|
||||||
add_subdirectory(lib/luautf8)
|
add_subdirectory(lib/luautf8)
|
||||||
|
add_subdirectory(lib/luachacha)
|
||||||
|
|
||||||
# JsonCPP doesn't compile well on GCC 4.8
|
# JsonCPP doesn't compile well on GCC 4.8
|
||||||
if(NOT ENABLE_SYSTEM_JSONCPP)
|
if(NOT ENABLE_SYSTEM_JSONCPP)
|
||||||
|
22
LICENSE.txt
22
LICENSE.txt
@ -180,6 +180,28 @@ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|||||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||||
SOFTWARE.
|
SOFTWARE.
|
||||||
|
|
||||||
|
luachacha
|
||||||
|
=======
|
||||||
|
Copyright (C) 2015 - 2016 by Pierre Chapuis
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
of this software and associated documentation files (the "Software"), to deal
|
||||||
|
in the Software without restriction, including without limitation the rights
|
||||||
|
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
copies of the Software, and to permit persons to whom the Software is
|
||||||
|
furnished to do so, subject to the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be included in
|
||||||
|
all copies or substantial portions of the Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||||
|
THE SOFTWARE.
|
||||||
|
|
||||||
Fonts
|
Fonts
|
||||||
---------------
|
---------------
|
||||||
|
|
||||||
|
@ -234,6 +234,9 @@ LOCAL_SRC_FILES += ../../../lib/jsoncpp/jsoncpp.cpp
|
|||||||
# Lua UTF-8 Lib
|
# Lua UTF-8 Lib
|
||||||
LOCAL_SRC_FILES += ../../../lib/luautf8/lutf8lib.c
|
LOCAL_SRC_FILES += ../../../lib/luautf8/lutf8lib.c
|
||||||
|
|
||||||
|
# Lua ChaCha Lib
|
||||||
|
LOCAL_SRC_FILES += $(wildcard ../../../lib/luachacha/*.c)
|
||||||
|
|
||||||
LOCAL_STATIC_LIBRARIES += Curl Gettext Freetype Irrlicht LevelDB OpenAL mbedTLS mbedx509 mbedcrypto Vorbis LuaJIT android_native_app_glue $(PROFILER_LIBS)
|
LOCAL_STATIC_LIBRARIES += Curl Gettext Freetype Irrlicht LevelDB OpenAL mbedTLS mbedx509 mbedcrypto Vorbis LuaJIT android_native_app_glue $(PROFILER_LIBS)
|
||||||
|
|
||||||
LOCAL_LDLIBS := -lEGL -lGLESv1_CM -lGLESv2 -landroid -lOpenSLES
|
LOCAL_LDLIBS := -lEGL -lGLESv1_CM -lGLESv2 -landroid -lOpenSLES
|
||||||
|
2
lib/luachacha/CMakeLists.txt
Normal file
2
lib/luachacha/CMakeLists.txt
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
add_library(luachacha STATIC chacha.c lchacha.c)
|
||||||
|
target_include_directories(luachacha PUBLIC ${LUA_INCLUDE_DIR})
|
210
lib/luachacha/chacha.c
Normal file
210
lib/luachacha/chacha.c
Normal file
@ -0,0 +1,210 @@
|
|||||||
|
/*
|
||||||
|
chacha-merged.c version 20080118
|
||||||
|
D. J. Bernstein
|
||||||
|
Public domain.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "ecrypt-sync.h"
|
||||||
|
#include <stddef.h>
|
||||||
|
|
||||||
|
#define ROTATE(v,c) (ROTL32(v,c))
|
||||||
|
#define XOR(v,w) ((v) ^ (w))
|
||||||
|
#define PLUS(v,w) (U32V((v) + (w)))
|
||||||
|
#define PLUSONE(v) (PLUS((v),1))
|
||||||
|
|
||||||
|
#define QUARTERROUND(a,b,c,d) \
|
||||||
|
a = PLUS(a,b); d = ROTATE(XOR(d,a),16); \
|
||||||
|
c = PLUS(c,d); b = ROTATE(XOR(b,c),12); \
|
||||||
|
a = PLUS(a,b); d = ROTATE(XOR(d,a), 8); \
|
||||||
|
c = PLUS(c,d); b = ROTATE(XOR(b,c), 7);
|
||||||
|
|
||||||
|
void ECRYPT_init(void)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
static const char sigma[16] = "expand 32-byte k";
|
||||||
|
static const char tau[16] = "expand 16-byte k";
|
||||||
|
|
||||||
|
void ECRYPT_keysetup(ECRYPT_ctx *x,const u8 *k,u32 kbits,u32 ivbits)
|
||||||
|
{
|
||||||
|
const char *constants;
|
||||||
|
|
||||||
|
x->input[4] = U8TO32_LITTLE(k + 0);
|
||||||
|
x->input[5] = U8TO32_LITTLE(k + 4);
|
||||||
|
x->input[6] = U8TO32_LITTLE(k + 8);
|
||||||
|
x->input[7] = U8TO32_LITTLE(k + 12);
|
||||||
|
if (kbits == 256) { /* recommended */
|
||||||
|
k += 16;
|
||||||
|
constants = sigma;
|
||||||
|
} else { /* kbits == 128 */
|
||||||
|
constants = tau;
|
||||||
|
}
|
||||||
|
x->input[8] = U8TO32_LITTLE(k + 0);
|
||||||
|
x->input[9] = U8TO32_LITTLE(k + 4);
|
||||||
|
x->input[10] = U8TO32_LITTLE(k + 8);
|
||||||
|
x->input[11] = U8TO32_LITTLE(k + 12);
|
||||||
|
x->input[0] = U8TO32_LITTLE(constants + 0);
|
||||||
|
x->input[1] = U8TO32_LITTLE(constants + 4);
|
||||||
|
x->input[2] = U8TO32_LITTLE(constants + 8);
|
||||||
|
x->input[3] = U8TO32_LITTLE(constants + 12);
|
||||||
|
}
|
||||||
|
|
||||||
|
void ECRYPT_ivsetup(ECRYPT_ctx *x,const u8 *iv,const u8* counter)
|
||||||
|
{
|
||||||
|
x->input[12] = (counter == NULL) ? 0 : U8TO32_LITTLE(counter + 0);
|
||||||
|
x->input[13] = (counter == NULL) ? 0 : U8TO32_LITTLE(counter + 4);
|
||||||
|
x->input[14] = U8TO32_LITTLE(iv + 0);
|
||||||
|
x->input[15] = U8TO32_LITTLE(iv + 4);
|
||||||
|
}
|
||||||
|
|
||||||
|
void ECRYPT_IETF_ivsetup(ECRYPT_ctx *x,const u8 *iv,const u8* counter)
|
||||||
|
{
|
||||||
|
x->input[12] = (counter == NULL) ? 0 : U8TO32_LITTLE(counter);
|
||||||
|
x->input[13] = U8TO32_LITTLE(iv + 0);
|
||||||
|
x->input[14] = U8TO32_LITTLE(iv + 4);
|
||||||
|
x->input[15] = U8TO32_LITTLE(iv + 8);
|
||||||
|
}
|
||||||
|
|
||||||
|
void ECRYPT_encrypt_bytes(ECRYPT_ctx *x,const u8 *m,u8 *c,u32 bytes,int rounds)
|
||||||
|
{
|
||||||
|
u32 x0, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15;
|
||||||
|
u32 j0, j1, j2, j3, j4, j5, j6, j7, j8, j9, j10, j11, j12, j13, j14, j15;
|
||||||
|
u8 *ctarget;
|
||||||
|
u8 tmp[64];
|
||||||
|
int i;
|
||||||
|
|
||||||
|
if (!bytes) return;
|
||||||
|
|
||||||
|
j0 = x->input[0];
|
||||||
|
j1 = x->input[1];
|
||||||
|
j2 = x->input[2];
|
||||||
|
j3 = x->input[3];
|
||||||
|
j4 = x->input[4];
|
||||||
|
j5 = x->input[5];
|
||||||
|
j6 = x->input[6];
|
||||||
|
j7 = x->input[7];
|
||||||
|
j8 = x->input[8];
|
||||||
|
j9 = x->input[9];
|
||||||
|
j10 = x->input[10];
|
||||||
|
j11 = x->input[11];
|
||||||
|
j12 = x->input[12];
|
||||||
|
j13 = x->input[13];
|
||||||
|
j14 = x->input[14];
|
||||||
|
j15 = x->input[15];
|
||||||
|
|
||||||
|
for (;;) {
|
||||||
|
if (bytes < 64) {
|
||||||
|
for (i = 0;i < bytes;++i) tmp[i] = m[i];
|
||||||
|
m = tmp;
|
||||||
|
ctarget = c;
|
||||||
|
c = tmp;
|
||||||
|
}
|
||||||
|
x0 = j0;
|
||||||
|
x1 = j1;
|
||||||
|
x2 = j2;
|
||||||
|
x3 = j3;
|
||||||
|
x4 = j4;
|
||||||
|
x5 = j5;
|
||||||
|
x6 = j6;
|
||||||
|
x7 = j7;
|
||||||
|
x8 = j8;
|
||||||
|
x9 = j9;
|
||||||
|
x10 = j10;
|
||||||
|
x11 = j11;
|
||||||
|
x12 = j12;
|
||||||
|
x13 = j13;
|
||||||
|
x14 = j14;
|
||||||
|
x15 = j15;
|
||||||
|
for (i = rounds;i > 0;i -= 2) {
|
||||||
|
QUARTERROUND( x0, x4, x8,x12)
|
||||||
|
QUARTERROUND( x1, x5, x9,x13)
|
||||||
|
QUARTERROUND( x2, x6,x10,x14)
|
||||||
|
QUARTERROUND( x3, x7,x11,x15)
|
||||||
|
QUARTERROUND( x0, x5,x10,x15)
|
||||||
|
QUARTERROUND( x1, x6,x11,x12)
|
||||||
|
QUARTERROUND( x2, x7, x8,x13)
|
||||||
|
QUARTERROUND( x3, x4, x9,x14)
|
||||||
|
}
|
||||||
|
x0 = PLUS(x0,j0);
|
||||||
|
x1 = PLUS(x1,j1);
|
||||||
|
x2 = PLUS(x2,j2);
|
||||||
|
x3 = PLUS(x3,j3);
|
||||||
|
x4 = PLUS(x4,j4);
|
||||||
|
x5 = PLUS(x5,j5);
|
||||||
|
x6 = PLUS(x6,j6);
|
||||||
|
x7 = PLUS(x7,j7);
|
||||||
|
x8 = PLUS(x8,j8);
|
||||||
|
x9 = PLUS(x9,j9);
|
||||||
|
x10 = PLUS(x10,j10);
|
||||||
|
x11 = PLUS(x11,j11);
|
||||||
|
x12 = PLUS(x12,j12);
|
||||||
|
x13 = PLUS(x13,j13);
|
||||||
|
x14 = PLUS(x14,j14);
|
||||||
|
x15 = PLUS(x15,j15);
|
||||||
|
|
||||||
|
x0 = XOR(x0,U8TO32_LITTLE(m + 0));
|
||||||
|
x1 = XOR(x1,U8TO32_LITTLE(m + 4));
|
||||||
|
x2 = XOR(x2,U8TO32_LITTLE(m + 8));
|
||||||
|
x3 = XOR(x3,U8TO32_LITTLE(m + 12));
|
||||||
|
x4 = XOR(x4,U8TO32_LITTLE(m + 16));
|
||||||
|
x5 = XOR(x5,U8TO32_LITTLE(m + 20));
|
||||||
|
x6 = XOR(x6,U8TO32_LITTLE(m + 24));
|
||||||
|
x7 = XOR(x7,U8TO32_LITTLE(m + 28));
|
||||||
|
x8 = XOR(x8,U8TO32_LITTLE(m + 32));
|
||||||
|
x9 = XOR(x9,U8TO32_LITTLE(m + 36));
|
||||||
|
x10 = XOR(x10,U8TO32_LITTLE(m + 40));
|
||||||
|
x11 = XOR(x11,U8TO32_LITTLE(m + 44));
|
||||||
|
x12 = XOR(x12,U8TO32_LITTLE(m + 48));
|
||||||
|
x13 = XOR(x13,U8TO32_LITTLE(m + 52));
|
||||||
|
x14 = XOR(x14,U8TO32_LITTLE(m + 56));
|
||||||
|
x15 = XOR(x15,U8TO32_LITTLE(m + 60));
|
||||||
|
|
||||||
|
j12 = PLUSONE(j12);
|
||||||
|
if (!j12) {
|
||||||
|
j13 = PLUSONE(j13);
|
||||||
|
/* stopping at 2^70 bytes per nonce is user's responsibility */
|
||||||
|
}
|
||||||
|
|
||||||
|
U32TO8_LITTLE(c + 0,x0);
|
||||||
|
U32TO8_LITTLE(c + 4,x1);
|
||||||
|
U32TO8_LITTLE(c + 8,x2);
|
||||||
|
U32TO8_LITTLE(c + 12,x3);
|
||||||
|
U32TO8_LITTLE(c + 16,x4);
|
||||||
|
U32TO8_LITTLE(c + 20,x5);
|
||||||
|
U32TO8_LITTLE(c + 24,x6);
|
||||||
|
U32TO8_LITTLE(c + 28,x7);
|
||||||
|
U32TO8_LITTLE(c + 32,x8);
|
||||||
|
U32TO8_LITTLE(c + 36,x9);
|
||||||
|
U32TO8_LITTLE(c + 40,x10);
|
||||||
|
U32TO8_LITTLE(c + 44,x11);
|
||||||
|
U32TO8_LITTLE(c + 48,x12);
|
||||||
|
U32TO8_LITTLE(c + 52,x13);
|
||||||
|
U32TO8_LITTLE(c + 56,x14);
|
||||||
|
U32TO8_LITTLE(c + 60,x15);
|
||||||
|
|
||||||
|
if (bytes <= 64) {
|
||||||
|
if (bytes < 64) {
|
||||||
|
for (i = 0;i < bytes;++i) ctarget[i] = c[i];
|
||||||
|
}
|
||||||
|
x->input[12] = j12;
|
||||||
|
x->input[13] = j13;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
bytes -= 64;
|
||||||
|
c += 64;
|
||||||
|
m += 64;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void ECRYPT_decrypt_bytes(ECRYPT_ctx *x,const u8 *c,u8 *m,u32 bytes)
|
||||||
|
{
|
||||||
|
ECRYPT_encrypt_bytes(x,c,m,bytes,8);
|
||||||
|
}
|
||||||
|
|
||||||
|
void ECRYPT_keystream_bytes(ECRYPT_ctx *x,u8 *stream,u32 bytes)
|
||||||
|
{
|
||||||
|
u32 i;
|
||||||
|
for (i = 0;i < bytes;++i) stream[i] = 0;
|
||||||
|
ECRYPT_encrypt_bytes(x,stream,stream,bytes,8);
|
||||||
|
}
|
272
lib/luachacha/ecrypt-config.h
Normal file
272
lib/luachacha/ecrypt-config.h
Normal file
@ -0,0 +1,272 @@
|
|||||||
|
/* ecrypt-config.h */
|
||||||
|
|
||||||
|
/* *** Normally, it should not be necessary to edit this file. *** */
|
||||||
|
|
||||||
|
#ifndef ECRYPT_CONFIG
|
||||||
|
#define ECRYPT_CONFIG
|
||||||
|
|
||||||
|
/* ------------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
/* Guess the endianness of the target architecture. */
|
||||||
|
|
||||||
|
/*
|
||||||
|
* The LITTLE endian machines:
|
||||||
|
*/
|
||||||
|
#if defined(__ultrix) /* Older MIPS */
|
||||||
|
#define ECRYPT_LITTLE_ENDIAN
|
||||||
|
#elif defined(__alpha) /* Alpha */
|
||||||
|
#define ECRYPT_LITTLE_ENDIAN
|
||||||
|
#elif defined(i386) /* x86 (gcc) */
|
||||||
|
#define ECRYPT_LITTLE_ENDIAN
|
||||||
|
#elif defined(__i386) /* x86 (gcc) */
|
||||||
|
#define ECRYPT_LITTLE_ENDIAN
|
||||||
|
#elif defined(_M_IX86) /* x86 (MSC, Borland) */
|
||||||
|
#define ECRYPT_LITTLE_ENDIAN
|
||||||
|
#elif defined(_MSC_VER) /* x86 (surely MSC) */
|
||||||
|
#define ECRYPT_LITTLE_ENDIAN
|
||||||
|
#elif defined(__INTEL_COMPILER) /* x86 (surely Intel compiler icl.exe) */
|
||||||
|
#define ECRYPT_LITTLE_ENDIAN
|
||||||
|
|
||||||
|
/*
|
||||||
|
* The BIG endian machines:
|
||||||
|
*/
|
||||||
|
#elif defined(sun) /* Newer Sparc's */
|
||||||
|
#define ECRYPT_BIG_ENDIAN
|
||||||
|
#elif defined(__ppc__) /* PowerPC */
|
||||||
|
#define ECRYPT_BIG_ENDIAN
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Finally machines with UNKNOWN endianness:
|
||||||
|
*/
|
||||||
|
#elif defined (_AIX) /* RS6000 */
|
||||||
|
#define ECRYPT_UNKNOWN
|
||||||
|
#elif defined(__hpux) /* HP-PA */
|
||||||
|
#define ECRYPT_UNKNOWN
|
||||||
|
#elif defined(__aux) /* 68K */
|
||||||
|
#define ECRYPT_UNKNOWN
|
||||||
|
#elif defined(__dgux) /* 88K (but P6 in latest boxes) */
|
||||||
|
#define ECRYPT_UNKNOWN
|
||||||
|
#elif defined(__sgi) /* Newer MIPS */
|
||||||
|
#define ECRYPT_UNKNOWN
|
||||||
|
#else /* Any other processor */
|
||||||
|
#define ECRYPT_UNKNOWN
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* ------------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Find minimal-width types to store 8-bit, 16-bit, 32-bit, and 64-bit
|
||||||
|
* integers.
|
||||||
|
*
|
||||||
|
* Note: to enable 64-bit types on 32-bit compilers, it might be
|
||||||
|
* necessary to switch from ISO C90 mode to ISO C99 mode (e.g., gcc
|
||||||
|
* -std=c99).
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <limits.h>
|
||||||
|
|
||||||
|
/* --- check char --- */
|
||||||
|
|
||||||
|
#if (UCHAR_MAX / 0xFU > 0xFU)
|
||||||
|
#ifndef I8T
|
||||||
|
#define I8T char
|
||||||
|
#define U8C(v) (v##U)
|
||||||
|
|
||||||
|
#if (UCHAR_MAX == 0xFFU)
|
||||||
|
#define ECRYPT_I8T_IS_BYTE
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if (UCHAR_MAX / 0xFFU > 0xFFU)
|
||||||
|
#ifndef I16T
|
||||||
|
#define I16T char
|
||||||
|
#define U16C(v) (v##U)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if (UCHAR_MAX / 0xFFFFU > 0xFFFFU)
|
||||||
|
#ifndef I32T
|
||||||
|
#define I32T char
|
||||||
|
#define U32C(v) (v##U)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if (UCHAR_MAX / 0xFFFFFFFFU > 0xFFFFFFFFU)
|
||||||
|
#ifndef I64T
|
||||||
|
#define I64T char
|
||||||
|
#define U64C(v) (v##U)
|
||||||
|
#define ECRYPT_NATIVE64
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* --- check short --- */
|
||||||
|
|
||||||
|
#if (USHRT_MAX / 0xFU > 0xFU)
|
||||||
|
#ifndef I8T
|
||||||
|
#define I8T short
|
||||||
|
#define U8C(v) (v##U)
|
||||||
|
|
||||||
|
#if (USHRT_MAX == 0xFFU)
|
||||||
|
#define ECRYPT_I8T_IS_BYTE
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if (USHRT_MAX / 0xFFU > 0xFFU)
|
||||||
|
#ifndef I16T
|
||||||
|
#define I16T short
|
||||||
|
#define U16C(v) (v##U)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if (USHRT_MAX / 0xFFFFU > 0xFFFFU)
|
||||||
|
#ifndef I32T
|
||||||
|
#define I32T short
|
||||||
|
#define U32C(v) (v##U)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if (USHRT_MAX / 0xFFFFFFFFU > 0xFFFFFFFFU)
|
||||||
|
#ifndef I64T
|
||||||
|
#define I64T short
|
||||||
|
#define U64C(v) (v##U)
|
||||||
|
#define ECRYPT_NATIVE64
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* --- check int --- */
|
||||||
|
|
||||||
|
#if (UINT_MAX / 0xFU > 0xFU)
|
||||||
|
#ifndef I8T
|
||||||
|
#define I8T int
|
||||||
|
#define U8C(v) (v##U)
|
||||||
|
|
||||||
|
#if (ULONG_MAX == 0xFFU)
|
||||||
|
#define ECRYPT_I8T_IS_BYTE
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if (UINT_MAX / 0xFFU > 0xFFU)
|
||||||
|
#ifndef I16T
|
||||||
|
#define I16T int
|
||||||
|
#define U16C(v) (v##U)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if (UINT_MAX / 0xFFFFU > 0xFFFFU)
|
||||||
|
#ifndef I32T
|
||||||
|
#define I32T int
|
||||||
|
#define U32C(v) (v##U)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if (UINT_MAX / 0xFFFFFFFFU > 0xFFFFFFFFU)
|
||||||
|
#ifndef I64T
|
||||||
|
#define I64T int
|
||||||
|
#define U64C(v) (v##U)
|
||||||
|
#define ECRYPT_NATIVE64
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* --- check long --- */
|
||||||
|
|
||||||
|
#if (ULONG_MAX / 0xFUL > 0xFUL)
|
||||||
|
#ifndef I8T
|
||||||
|
#define I8T long
|
||||||
|
#define U8C(v) (v##UL)
|
||||||
|
|
||||||
|
#if (ULONG_MAX == 0xFFUL)
|
||||||
|
#define ECRYPT_I8T_IS_BYTE
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if (ULONG_MAX / 0xFFUL > 0xFFUL)
|
||||||
|
#ifndef I16T
|
||||||
|
#define I16T long
|
||||||
|
#define U16C(v) (v##UL)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if (ULONG_MAX / 0xFFFFUL > 0xFFFFUL)
|
||||||
|
#ifndef I32T
|
||||||
|
#define I32T long
|
||||||
|
#define U32C(v) (v##UL)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if (ULONG_MAX / 0xFFFFFFFFUL > 0xFFFFFFFFUL)
|
||||||
|
#ifndef I64T
|
||||||
|
#define I64T long
|
||||||
|
#define U64C(v) (v##UL)
|
||||||
|
#define ECRYPT_NATIVE64
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* --- check long long --- */
|
||||||
|
|
||||||
|
#ifdef ULLONG_MAX
|
||||||
|
|
||||||
|
#if (ULLONG_MAX / 0xFULL > 0xFULL)
|
||||||
|
#ifndef I8T
|
||||||
|
#define I8T long long
|
||||||
|
#define U8C(v) (v##ULL)
|
||||||
|
|
||||||
|
#if (ULLONG_MAX == 0xFFULL)
|
||||||
|
#define ECRYPT_I8T_IS_BYTE
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if (ULLONG_MAX / 0xFFULL > 0xFFULL)
|
||||||
|
#ifndef I16T
|
||||||
|
#define I16T long long
|
||||||
|
#define U16C(v) (v##ULL)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if (ULLONG_MAX / 0xFFFFULL > 0xFFFFULL)
|
||||||
|
#ifndef I32T
|
||||||
|
#define I32T long long
|
||||||
|
#define U32C(v) (v##ULL)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if (ULLONG_MAX / 0xFFFFFFFFULL > 0xFFFFFFFFULL)
|
||||||
|
#ifndef I64T
|
||||||
|
#define I64T long long
|
||||||
|
#define U64C(v) (v##ULL)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* --- check __int64 --- */
|
||||||
|
|
||||||
|
#ifdef _UI64_MAX
|
||||||
|
|
||||||
|
#ifndef I64T
|
||||||
|
#if (_UI64_MAX / 0xFFFFFFFFui64 > 0xFFFFFFFFui64)
|
||||||
|
#define I64T __int64
|
||||||
|
#define U64C(v) (v##ui64)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* ------------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
#endif
|
46
lib/luachacha/ecrypt-machine.h
Normal file
46
lib/luachacha/ecrypt-machine.h
Normal file
@ -0,0 +1,46 @@
|
|||||||
|
/* ecrypt-machine.h */
|
||||||
|
|
||||||
|
/*
|
||||||
|
* This file is included by 'ecrypt-portable.h'. It allows to override
|
||||||
|
* the default macros for specific platforms. Please carefully check
|
||||||
|
* the machine code generated by your compiler (with optimisations
|
||||||
|
* turned on) before deciding to edit this file.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* ------------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
#if (defined(ECRYPT_DEFAULT_ROT) && !defined(ECRYPT_MACHINE_ROT))
|
||||||
|
|
||||||
|
#define ECRYPT_MACHINE_ROT
|
||||||
|
|
||||||
|
#if (defined(WIN32) && defined(_MSC_VER))
|
||||||
|
|
||||||
|
#undef ROTL32
|
||||||
|
#undef ROTR32
|
||||||
|
#undef ROTL64
|
||||||
|
#undef ROTR64
|
||||||
|
|
||||||
|
#include <stdlib.h>
|
||||||
|
|
||||||
|
#define ROTL32(v, n) _lrotl(v, n)
|
||||||
|
#define ROTR32(v, n) _lrotr(v, n)
|
||||||
|
#define ROTL64(v, n) _rotl64(v, n)
|
||||||
|
#define ROTR64(v, n) _rotr64(v, n)
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* ------------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
#if (defined(ECRYPT_DEFAULT_SWAP) && !defined(ECRYPT_MACHINE_SWAP))
|
||||||
|
|
||||||
|
#define ECRYPT_MACHINE_SWAP
|
||||||
|
|
||||||
|
/*
|
||||||
|
* If you want to overwrite the default swap macros, put it here. And so on.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* ------------------------------------------------------------------------- */
|
303
lib/luachacha/ecrypt-portable.h
Normal file
303
lib/luachacha/ecrypt-portable.h
Normal file
@ -0,0 +1,303 @@
|
|||||||
|
/* ecrypt-portable.h */
|
||||||
|
|
||||||
|
/*
|
||||||
|
* WARNING: the conversions defined below are implemented as macros,
|
||||||
|
* and should be used carefully. They should NOT be used with
|
||||||
|
* parameters which perform some action. E.g., the following two lines
|
||||||
|
* are not equivalent:
|
||||||
|
*
|
||||||
|
* 1) ++x; y = ROTL32(x, n);
|
||||||
|
* 2) y = ROTL32(++x, n);
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* *** Please do not edit this file. ***
|
||||||
|
*
|
||||||
|
* The default macros can be overridden for specific architectures by
|
||||||
|
* editing 'ecrypt-machine.h'.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef ECRYPT_PORTABLE
|
||||||
|
#define ECRYPT_PORTABLE
|
||||||
|
|
||||||
|
#include "ecrypt-config.h"
|
||||||
|
|
||||||
|
/* ------------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
/*
|
||||||
|
* The following types are defined (if available):
|
||||||
|
*
|
||||||
|
* u8: unsigned integer type, at least 8 bits
|
||||||
|
* u16: unsigned integer type, at least 16 bits
|
||||||
|
* u32: unsigned integer type, at least 32 bits
|
||||||
|
* u64: unsigned integer type, at least 64 bits
|
||||||
|
*
|
||||||
|
* s8, s16, s32, s64 -> signed counterparts of u8, u16, u32, u64
|
||||||
|
*
|
||||||
|
* The selection of minimum-width integer types is taken care of by
|
||||||
|
* 'ecrypt-config.h'. Note: to enable 64-bit types on 32-bit
|
||||||
|
* compilers, it might be necessary to switch from ISO C90 mode to ISO
|
||||||
|
* C99 mode (e.g., gcc -std=c99).
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifdef I8T
|
||||||
|
typedef signed I8T s8;
|
||||||
|
typedef unsigned I8T u8;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef I16T
|
||||||
|
typedef signed I16T s16;
|
||||||
|
typedef unsigned I16T u16;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef I32T
|
||||||
|
typedef signed I32T s32;
|
||||||
|
typedef unsigned I32T u32;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef I64T
|
||||||
|
typedef signed I64T s64;
|
||||||
|
typedef unsigned I64T u64;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/*
|
||||||
|
* The following macros are used to obtain exact-width results.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#define U8V(v) ((u8)(v) & U8C(0xFF))
|
||||||
|
#define U16V(v) ((u16)(v) & U16C(0xFFFF))
|
||||||
|
#define U32V(v) ((u32)(v) & U32C(0xFFFFFFFF))
|
||||||
|
#define U64V(v) ((u64)(v) & U64C(0xFFFFFFFFFFFFFFFF))
|
||||||
|
|
||||||
|
/* ------------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
/*
|
||||||
|
* The following macros return words with their bits rotated over n
|
||||||
|
* positions to the left/right.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#define ECRYPT_DEFAULT_ROT
|
||||||
|
|
||||||
|
#define ROTL8(v, n) \
|
||||||
|
(U8V((v) << (n)) | ((v) >> (8 - (n))))
|
||||||
|
|
||||||
|
#define ROTL16(v, n) \
|
||||||
|
(U16V((v) << (n)) | ((v) >> (16 - (n))))
|
||||||
|
|
||||||
|
#define ROTL32(v, n) \
|
||||||
|
(U32V((v) << (n)) | ((v) >> (32 - (n))))
|
||||||
|
|
||||||
|
#define ROTL64(v, n) \
|
||||||
|
(U64V((v) << (n)) | ((v) >> (64 - (n))))
|
||||||
|
|
||||||
|
#define ROTR8(v, n) ROTL8(v, 8 - (n))
|
||||||
|
#define ROTR16(v, n) ROTL16(v, 16 - (n))
|
||||||
|
#define ROTR32(v, n) ROTL32(v, 32 - (n))
|
||||||
|
#define ROTR64(v, n) ROTL64(v, 64 - (n))
|
||||||
|
|
||||||
|
#include "ecrypt-machine.h"
|
||||||
|
|
||||||
|
/* ------------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
/*
|
||||||
|
* The following macros return a word with bytes in reverse order.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#define ECRYPT_DEFAULT_SWAP
|
||||||
|
|
||||||
|
#define SWAP16(v) \
|
||||||
|
ROTL16(v, 8)
|
||||||
|
|
||||||
|
#define SWAP32(v) \
|
||||||
|
((ROTL32(v, 8) & U32C(0x00FF00FF)) | \
|
||||||
|
(ROTL32(v, 24) & U32C(0xFF00FF00)))
|
||||||
|
|
||||||
|
#ifdef ECRYPT_NATIVE64
|
||||||
|
#define SWAP64(v) \
|
||||||
|
((ROTL64(v, 8) & U64C(0x000000FF000000FF)) | \
|
||||||
|
(ROTL64(v, 24) & U64C(0x0000FF000000FF00)) | \
|
||||||
|
(ROTL64(v, 40) & U64C(0x00FF000000FF0000)) | \
|
||||||
|
(ROTL64(v, 56) & U64C(0xFF000000FF000000)))
|
||||||
|
#else
|
||||||
|
#define SWAP64(v) \
|
||||||
|
(((u64)SWAP32(U32V(v)) << 32) | (u64)SWAP32(U32V(v >> 32)))
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include "ecrypt-machine.h"
|
||||||
|
|
||||||
|
#define ECRYPT_DEFAULT_WTOW
|
||||||
|
|
||||||
|
#ifdef ECRYPT_LITTLE_ENDIAN
|
||||||
|
#define U16TO16_LITTLE(v) (v)
|
||||||
|
#define U32TO32_LITTLE(v) (v)
|
||||||
|
#define U64TO64_LITTLE(v) (v)
|
||||||
|
|
||||||
|
#define U16TO16_BIG(v) SWAP16(v)
|
||||||
|
#define U32TO32_BIG(v) SWAP32(v)
|
||||||
|
#define U64TO64_BIG(v) SWAP64(v)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef ECRYPT_BIG_ENDIAN
|
||||||
|
#define U16TO16_LITTLE(v) SWAP16(v)
|
||||||
|
#define U32TO32_LITTLE(v) SWAP32(v)
|
||||||
|
#define U64TO64_LITTLE(v) SWAP64(v)
|
||||||
|
|
||||||
|
#define U16TO16_BIG(v) (v)
|
||||||
|
#define U32TO32_BIG(v) (v)
|
||||||
|
#define U64TO64_BIG(v) (v)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include "ecrypt-machine.h"
|
||||||
|
|
||||||
|
/*
|
||||||
|
* The following macros load words from an array of bytes with
|
||||||
|
* different types of endianness, and vice versa.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#define ECRYPT_DEFAULT_BTOW
|
||||||
|
|
||||||
|
#if (!defined(ECRYPT_UNKNOWN) && defined(ECRYPT_I8T_IS_BYTE))
|
||||||
|
|
||||||
|
#define U8TO16_LITTLE(p) U16TO16_LITTLE(((u16*)(p))[0])
|
||||||
|
#define U8TO32_LITTLE(p) U32TO32_LITTLE(((u32*)(p))[0])
|
||||||
|
#define U8TO64_LITTLE(p) U64TO64_LITTLE(((u64*)(p))[0])
|
||||||
|
|
||||||
|
#define U8TO16_BIG(p) U16TO16_BIG(((u16*)(p))[0])
|
||||||
|
#define U8TO32_BIG(p) U32TO32_BIG(((u32*)(p))[0])
|
||||||
|
#define U8TO64_BIG(p) U64TO64_BIG(((u64*)(p))[0])
|
||||||
|
|
||||||
|
#define U16TO8_LITTLE(p, v) (((u16*)(p))[0] = U16TO16_LITTLE(v))
|
||||||
|
#define U32TO8_LITTLE(p, v) (((u32*)(p))[0] = U32TO32_LITTLE(v))
|
||||||
|
#define U64TO8_LITTLE(p, v) (((u64*)(p))[0] = U64TO64_LITTLE(v))
|
||||||
|
|
||||||
|
#define U16TO8_BIG(p, v) (((u16*)(p))[0] = U16TO16_BIG(v))
|
||||||
|
#define U32TO8_BIG(p, v) (((u32*)(p))[0] = U32TO32_BIG(v))
|
||||||
|
#define U64TO8_BIG(p, v) (((u64*)(p))[0] = U64TO64_BIG(v))
|
||||||
|
|
||||||
|
#else
|
||||||
|
|
||||||
|
#define U8TO16_LITTLE(p) \
|
||||||
|
(((u16)((p)[0]) ) | \
|
||||||
|
((u16)((p)[1]) << 8))
|
||||||
|
|
||||||
|
#define U8TO32_LITTLE(p) \
|
||||||
|
(((u32)((p)[0]) ) | \
|
||||||
|
((u32)((p)[1]) << 8) | \
|
||||||
|
((u32)((p)[2]) << 16) | \
|
||||||
|
((u32)((p)[3]) << 24))
|
||||||
|
|
||||||
|
#ifdef ECRYPT_NATIVE64
|
||||||
|
#define U8TO64_LITTLE(p) \
|
||||||
|
(((u64)((p)[0]) ) | \
|
||||||
|
((u64)((p)[1]) << 8) | \
|
||||||
|
((u64)((p)[2]) << 16) | \
|
||||||
|
((u64)((p)[3]) << 24) | \
|
||||||
|
((u64)((p)[4]) << 32) | \
|
||||||
|
((u64)((p)[5]) << 40) | \
|
||||||
|
((u64)((p)[6]) << 48) | \
|
||||||
|
((u64)((p)[7]) << 56))
|
||||||
|
#else
|
||||||
|
#define U8TO64_LITTLE(p) \
|
||||||
|
((u64)U8TO32_LITTLE(p) | ((u64)U8TO32_LITTLE((p) + 4) << 32))
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define U8TO16_BIG(p) \
|
||||||
|
(((u16)((p)[0]) << 8) | \
|
||||||
|
((u16)((p)[1]) ))
|
||||||
|
|
||||||
|
#define U8TO32_BIG(p) \
|
||||||
|
(((u32)((p)[0]) << 24) | \
|
||||||
|
((u32)((p)[1]) << 16) | \
|
||||||
|
((u32)((p)[2]) << 8) | \
|
||||||
|
((u32)((p)[3]) ))
|
||||||
|
|
||||||
|
#ifdef ECRYPT_NATIVE64
|
||||||
|
#define U8TO64_BIG(p) \
|
||||||
|
(((u64)((p)[0]) << 56) | \
|
||||||
|
((u64)((p)[1]) << 48) | \
|
||||||
|
((u64)((p)[2]) << 40) | \
|
||||||
|
((u64)((p)[3]) << 32) | \
|
||||||
|
((u64)((p)[4]) << 24) | \
|
||||||
|
((u64)((p)[5]) << 16) | \
|
||||||
|
((u64)((p)[6]) << 8) | \
|
||||||
|
((u64)((p)[7]) ))
|
||||||
|
#else
|
||||||
|
#define U8TO64_BIG(p) \
|
||||||
|
(((u64)U8TO32_BIG(p) << 32) | (u64)U8TO32_BIG((p) + 4))
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define U16TO8_LITTLE(p, v) \
|
||||||
|
do { \
|
||||||
|
(p)[0] = U8V((v) ); \
|
||||||
|
(p)[1] = U8V((v) >> 8); \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
#define U32TO8_LITTLE(p, v) \
|
||||||
|
do { \
|
||||||
|
(p)[0] = U8V((v) ); \
|
||||||
|
(p)[1] = U8V((v) >> 8); \
|
||||||
|
(p)[2] = U8V((v) >> 16); \
|
||||||
|
(p)[3] = U8V((v) >> 24); \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
#ifdef ECRYPT_NATIVE64
|
||||||
|
#define U64TO8_LITTLE(p, v) \
|
||||||
|
do { \
|
||||||
|
(p)[0] = U8V((v) ); \
|
||||||
|
(p)[1] = U8V((v) >> 8); \
|
||||||
|
(p)[2] = U8V((v) >> 16); \
|
||||||
|
(p)[3] = U8V((v) >> 24); \
|
||||||
|
(p)[4] = U8V((v) >> 32); \
|
||||||
|
(p)[5] = U8V((v) >> 40); \
|
||||||
|
(p)[6] = U8V((v) >> 48); \
|
||||||
|
(p)[7] = U8V((v) >> 56); \
|
||||||
|
} while (0)
|
||||||
|
#else
|
||||||
|
#define U64TO8_LITTLE(p, v) \
|
||||||
|
do { \
|
||||||
|
U32TO8_LITTLE((p), U32V((v) )); \
|
||||||
|
U32TO8_LITTLE((p) + 4, U32V((v) >> 32)); \
|
||||||
|
} while (0)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define U16TO8_BIG(p, v) \
|
||||||
|
do { \
|
||||||
|
(p)[0] = U8V((v) ); \
|
||||||
|
(p)[1] = U8V((v) >> 8); \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
#define U32TO8_BIG(p, v) \
|
||||||
|
do { \
|
||||||
|
(p)[0] = U8V((v) >> 24); \
|
||||||
|
(p)[1] = U8V((v) >> 16); \
|
||||||
|
(p)[2] = U8V((v) >> 8); \
|
||||||
|
(p)[3] = U8V((v) ); \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
#ifdef ECRYPT_NATIVE64
|
||||||
|
#define U64TO8_BIG(p, v) \
|
||||||
|
do { \
|
||||||
|
(p)[0] = U8V((v) >> 56); \
|
||||||
|
(p)[1] = U8V((v) >> 48); \
|
||||||
|
(p)[2] = U8V((v) >> 40); \
|
||||||
|
(p)[3] = U8V((v) >> 32); \
|
||||||
|
(p)[4] = U8V((v) >> 24); \
|
||||||
|
(p)[5] = U8V((v) >> 16); \
|
||||||
|
(p)[6] = U8V((v) >> 8); \
|
||||||
|
(p)[7] = U8V((v) ); \
|
||||||
|
} while (0)
|
||||||
|
#else
|
||||||
|
#define U64TO8_BIG(p, v) \
|
||||||
|
do { \
|
||||||
|
U32TO8_BIG((p), U32V((v) >> 32)); \
|
||||||
|
U32TO8_BIG((p) + 4, U32V((v) )); \
|
||||||
|
} while (0)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include "ecrypt-machine.h"
|
||||||
|
|
||||||
|
/* ------------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
#endif
|
290
lib/luachacha/ecrypt-sync.h
Normal file
290
lib/luachacha/ecrypt-sync.h
Normal file
@ -0,0 +1,290 @@
|
|||||||
|
/* ecrypt-sync.h */
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Header file for synchronous stream ciphers without authentication
|
||||||
|
* mechanism.
|
||||||
|
*
|
||||||
|
* *** Please only edit parts marked with "[edit]". ***
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef ECRYPT_SYNC
|
||||||
|
#define ECRYPT_SYNC
|
||||||
|
|
||||||
|
#include "ecrypt-portable.h"
|
||||||
|
|
||||||
|
/* ------------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
/* Cipher parameters */
|
||||||
|
|
||||||
|
/*
|
||||||
|
* The name of your cipher.
|
||||||
|
*/
|
||||||
|
#define ECRYPT_NAME "ChaCha8"
|
||||||
|
#define ECRYPT_PROFILE "_____"
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Specify which key and IV sizes are supported by your cipher. A user
|
||||||
|
* should be able to enumerate the supported sizes by running the
|
||||||
|
* following code:
|
||||||
|
*
|
||||||
|
* for (i = 0; ECRYPT_KEYSIZE(i) <= ECRYPT_MAXKEYSIZE; ++i)
|
||||||
|
* {
|
||||||
|
* keysize = ECRYPT_KEYSIZE(i);
|
||||||
|
*
|
||||||
|
* ...
|
||||||
|
* }
|
||||||
|
*
|
||||||
|
* All sizes are in bits.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#define ECRYPT_MAXKEYSIZE 256 /* [edit] */
|
||||||
|
#define ECRYPT_KEYSIZE(i) (128 + (i)*128) /* [edit] */
|
||||||
|
|
||||||
|
#define ECRYPT_MAXIVSIZE 64 /* [edit] */
|
||||||
|
#define ECRYPT_IVSIZE(i) (64 + (i)*64) /* [edit] */
|
||||||
|
|
||||||
|
/* ------------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
/* Data structures */
|
||||||
|
|
||||||
|
/*
|
||||||
|
* ECRYPT_ctx is the structure containing the representation of the
|
||||||
|
* internal state of your cipher.
|
||||||
|
*/
|
||||||
|
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
u32 input[16]; /* could be compressed */
|
||||||
|
/*
|
||||||
|
* [edit]
|
||||||
|
*
|
||||||
|
* Put here all state variable needed during the encryption process.
|
||||||
|
*/
|
||||||
|
} ECRYPT_ctx;
|
||||||
|
|
||||||
|
/* ------------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
/* Mandatory functions */
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Key and message independent initialization. This function will be
|
||||||
|
* called once when the program starts (e.g., to build expanded S-box
|
||||||
|
* tables).
|
||||||
|
*/
|
||||||
|
void ECRYPT_init();
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Key setup. It is the user's responsibility to select the values of
|
||||||
|
* keysize and ivsize from the set of supported values specified
|
||||||
|
* above.
|
||||||
|
*/
|
||||||
|
void ECRYPT_keysetup(
|
||||||
|
ECRYPT_ctx* ctx,
|
||||||
|
const u8* key,
|
||||||
|
u32 keysize, /* Key size in bits. */
|
||||||
|
u32 ivsize); /* IV size in bits. */
|
||||||
|
|
||||||
|
/*
|
||||||
|
* IV setup. After having called ECRYPT_keysetup(), the user is
|
||||||
|
* allowed to call ECRYPT_ivsetup() different times in order to
|
||||||
|
* encrypt/decrypt different messages with the same key but different
|
||||||
|
* IV's.
|
||||||
|
*/
|
||||||
|
void ECRYPT_ivsetup(
|
||||||
|
ECRYPT_ctx* ctx,
|
||||||
|
const u8* iv,
|
||||||
|
const u8* counter);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* IV setup for the IETF version of ChaCha (RFC 7539)
|
||||||
|
*/
|
||||||
|
void ECRYPT_IETF_ivsetup(
|
||||||
|
ECRYPT_ctx* ctx,
|
||||||
|
const u8* iv,
|
||||||
|
const u8* counter);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Encryption/decryption of arbitrary length messages.
|
||||||
|
*
|
||||||
|
* For efficiency reasons, the API provides two types of
|
||||||
|
* encrypt/decrypt functions. The ECRYPT_encrypt_bytes() function
|
||||||
|
* (declared here) encrypts byte strings of arbitrary length, while
|
||||||
|
* the ECRYPT_encrypt_blocks() function (defined later) only accepts
|
||||||
|
* lengths which are multiples of ECRYPT_BLOCKLENGTH.
|
||||||
|
*
|
||||||
|
* The user is allowed to make multiple calls to
|
||||||
|
* ECRYPT_encrypt_blocks() to incrementally encrypt a long message,
|
||||||
|
* but he is NOT allowed to make additional encryption calls once he
|
||||||
|
* has called ECRYPT_encrypt_bytes() (unless he starts a new message
|
||||||
|
* of course). For example, this sequence of calls is acceptable:
|
||||||
|
*
|
||||||
|
* ECRYPT_keysetup();
|
||||||
|
*
|
||||||
|
* ECRYPT_ivsetup();
|
||||||
|
* ECRYPT_encrypt_blocks();
|
||||||
|
* ECRYPT_encrypt_blocks();
|
||||||
|
* ECRYPT_encrypt_bytes();
|
||||||
|
*
|
||||||
|
* ECRYPT_ivsetup();
|
||||||
|
* ECRYPT_encrypt_blocks();
|
||||||
|
* ECRYPT_encrypt_blocks();
|
||||||
|
*
|
||||||
|
* ECRYPT_ivsetup();
|
||||||
|
* ECRYPT_encrypt_bytes();
|
||||||
|
*
|
||||||
|
* The following sequence is not:
|
||||||
|
*
|
||||||
|
* ECRYPT_keysetup();
|
||||||
|
* ECRYPT_ivsetup();
|
||||||
|
* ECRYPT_encrypt_blocks();
|
||||||
|
* ECRYPT_encrypt_bytes();
|
||||||
|
* ECRYPT_encrypt_blocks();
|
||||||
|
*/
|
||||||
|
|
||||||
|
void ECRYPT_encrypt_bytes(
|
||||||
|
ECRYPT_ctx* ctx,
|
||||||
|
const u8* plaintext,
|
||||||
|
u8* ciphertext,
|
||||||
|
u32 msglen, /* Message length in bytes. */
|
||||||
|
int rounds
|
||||||
|
);
|
||||||
|
|
||||||
|
void ECRYPT_decrypt_bytes(
|
||||||
|
ECRYPT_ctx* ctx,
|
||||||
|
const u8* ciphertext,
|
||||||
|
u8* plaintext,
|
||||||
|
u32 msglen); /* Message length in bytes. */
|
||||||
|
|
||||||
|
/* ------------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
/* Optional features */
|
||||||
|
|
||||||
|
/*
|
||||||
|
* For testing purposes it can sometimes be useful to have a function
|
||||||
|
* which immediately generates keystream without having to provide it
|
||||||
|
* with a zero plaintext. If your cipher cannot provide this function
|
||||||
|
* (e.g., because it is not strictly a synchronous cipher), please
|
||||||
|
* reset the ECRYPT_GENERATES_KEYSTREAM flag.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#define ECRYPT_GENERATES_KEYSTREAM
|
||||||
|
#ifdef ECRYPT_GENERATES_KEYSTREAM
|
||||||
|
|
||||||
|
void ECRYPT_keystream_bytes(
|
||||||
|
ECRYPT_ctx* ctx,
|
||||||
|
u8* keystream,
|
||||||
|
u32 length); /* Length of keystream in bytes. */
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* ------------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
/* Optional optimizations */
|
||||||
|
|
||||||
|
/*
|
||||||
|
* By default, the functions in this section are implemented using
|
||||||
|
* calls to functions declared above. However, you might want to
|
||||||
|
* implement them differently for performance reasons.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* All-in-one encryption/decryption of (short) packets.
|
||||||
|
*
|
||||||
|
* The default definitions of these functions can be found in
|
||||||
|
* "ecrypt-sync.c". If you want to implement them differently, please
|
||||||
|
* undef the ECRYPT_USES_DEFAULT_ALL_IN_ONE flag.
|
||||||
|
*/
|
||||||
|
#define ECRYPT_USES_DEFAULT_ALL_IN_ONE /* [edit] */
|
||||||
|
|
||||||
|
void ECRYPT_encrypt_packet(
|
||||||
|
ECRYPT_ctx* ctx,
|
||||||
|
const u8* iv,
|
||||||
|
const u8* plaintext,
|
||||||
|
u8* ciphertext,
|
||||||
|
u32 msglen);
|
||||||
|
|
||||||
|
void ECRYPT_decrypt_packet(
|
||||||
|
ECRYPT_ctx* ctx,
|
||||||
|
const u8* iv,
|
||||||
|
const u8* ciphertext,
|
||||||
|
u8* plaintext,
|
||||||
|
u32 msglen);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Encryption/decryption of blocks.
|
||||||
|
*
|
||||||
|
* By default, these functions are defined as macros. If you want to
|
||||||
|
* provide a different implementation, please undef the
|
||||||
|
* ECRYPT_USES_DEFAULT_BLOCK_MACROS flag and implement the functions
|
||||||
|
* declared below.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#define ECRYPT_BLOCKLENGTH 64 /* [edit] */
|
||||||
|
|
||||||
|
#define ECRYPT_USES_DEFAULT_BLOCK_MACROS /* [edit] */
|
||||||
|
#ifdef ECRYPT_USES_DEFAULT_BLOCK_MACROS
|
||||||
|
|
||||||
|
#define ECRYPT_encrypt_blocks(ctx, plaintext, ciphertext, blocks) \
|
||||||
|
ECRYPT_encrypt_bytes(ctx, plaintext, ciphertext, \
|
||||||
|
(blocks) * ECRYPT_BLOCKLENGTH)
|
||||||
|
|
||||||
|
#define ECRYPT_decrypt_blocks(ctx, ciphertext, plaintext, blocks) \
|
||||||
|
ECRYPT_decrypt_bytes(ctx, ciphertext, plaintext, \
|
||||||
|
(blocks) * ECRYPT_BLOCKLENGTH)
|
||||||
|
|
||||||
|
#ifdef ECRYPT_GENERATES_KEYSTREAM
|
||||||
|
|
||||||
|
#define ECRYPT_keystream_blocks(ctx, keystream, blocks) \
|
||||||
|
ECRYPT_keystream_bytes(ctx, keystream, \
|
||||||
|
(blocks) * ECRYPT_BLOCKLENGTH)
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#else
|
||||||
|
|
||||||
|
void ECRYPT_encrypt_blocks(
|
||||||
|
ECRYPT_ctx* ctx,
|
||||||
|
const u8* plaintext,
|
||||||
|
u8* ciphertext,
|
||||||
|
u32 blocks); /* Message length in blocks. */
|
||||||
|
|
||||||
|
void ECRYPT_decrypt_blocks(
|
||||||
|
ECRYPT_ctx* ctx,
|
||||||
|
const u8* ciphertext,
|
||||||
|
u8* plaintext,
|
||||||
|
u32 blocks); /* Message length in blocks. */
|
||||||
|
|
||||||
|
#ifdef ECRYPT_GENERATES_KEYSTREAM
|
||||||
|
|
||||||
|
void ECRYPT_keystream_blocks(
|
||||||
|
ECRYPT_ctx* ctx,
|
||||||
|
const u8* keystream,
|
||||||
|
u32 blocks); /* Keystream length in blocks. */
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/*
|
||||||
|
* If your cipher can be implemented in different ways, you can use
|
||||||
|
* the ECRYPT_VARIANT parameter to allow the user to choose between
|
||||||
|
* them at compile time (e.g., gcc -DECRYPT_VARIANT=3 ...). Please
|
||||||
|
* only use this possibility if you really think it could make a
|
||||||
|
* significant difference and keep the number of variants
|
||||||
|
* (ECRYPT_MAXVARIANT) as small as possible (definitely not more than
|
||||||
|
* 10). Note also that all variants should have exactly the same
|
||||||
|
* external interface (i.e., the same ECRYPT_BLOCKLENGTH, etc.).
|
||||||
|
*/
|
||||||
|
#define ECRYPT_MAXVARIANT 1 /* [edit] */
|
||||||
|
|
||||||
|
#ifndef ECRYPT_VARIANT
|
||||||
|
#define ECRYPT_VARIANT 1
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if (ECRYPT_VARIANT > ECRYPT_MAXVARIANT)
|
||||||
|
#error this variant does not exist
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* ------------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
#endif
|
79
lib/luachacha/lchacha.c
Normal file
79
lib/luachacha/lchacha.c
Normal file
@ -0,0 +1,79 @@
|
|||||||
|
#include <stdlib.h>
|
||||||
|
#include <stdbool.h>
|
||||||
|
|
||||||
|
#include <lua.h>
|
||||||
|
#include <lauxlib.h>
|
||||||
|
#include <lualib.h>
|
||||||
|
|
||||||
|
#include "ecrypt-sync.h"
|
||||||
|
|
||||||
|
#if LUA_VERSION_NUM == 501
|
||||||
|
#define l_setfuncs(L, funcs) luaL_register(L, NULL, funcs)
|
||||||
|
#else
|
||||||
|
#define l_setfuncs(L, funcs) luaL_setfuncs(L, funcs, 0)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
static int chacha_generic_crypt(lua_State *L, bool is_ietf)
|
||||||
|
{
|
||||||
|
ECRYPT_ctx ctx;
|
||||||
|
const char *key, *iv, *plaintext, *counter;
|
||||||
|
char *ciphertext;
|
||||||
|
size_t keysize, ivsize, msglen, countersize;
|
||||||
|
|
||||||
|
int rounds = luaL_checkinteger(L, 1);
|
||||||
|
|
||||||
|
/* IETF only normalizes ChaCha 20. */
|
||||||
|
if (rounds != 20 && (is_ietf || (rounds % 2 != 0)))
|
||||||
|
return luaL_error(L, "invalid number of rounds: %d", rounds);
|
||||||
|
|
||||||
|
luaL_checktype(L, 2, LUA_TSTRING);
|
||||||
|
luaL_checktype(L, 3, LUA_TSTRING);
|
||||||
|
luaL_checktype(L, 4, LUA_TSTRING);
|
||||||
|
|
||||||
|
key = lua_tolstring(L, 2, &keysize);
|
||||||
|
iv = lua_tolstring(L, 3, &ivsize);
|
||||||
|
plaintext = lua_tolstring(L, 4, &msglen);
|
||||||
|
counter = luaL_optlstring(L, 5, NULL, &countersize);
|
||||||
|
|
||||||
|
if (ivsize != (is_ietf ? 12 : 8))
|
||||||
|
return luaL_error(L, "invalid IV size: %dB", (int)ivsize);
|
||||||
|
|
||||||
|
if (keysize != 32 && (is_ietf || keysize != 16))
|
||||||
|
return luaL_error(L, "invalid key size: %dB", (int)keysize);
|
||||||
|
|
||||||
|
if (counter && countersize != (is_ietf ? 4 : 8))
|
||||||
|
return luaL_error(L, "invalid counter size: %dB", (int)countersize);
|
||||||
|
|
||||||
|
if (msglen == 0) { lua_pushlstring(L, "", 0); return 1; }
|
||||||
|
|
||||||
|
ciphertext = malloc(msglen);
|
||||||
|
if (!ciphertext) return luaL_error(L, "OOM");
|
||||||
|
|
||||||
|
/* keysize and ivsize are in bits */
|
||||||
|
ECRYPT_keysetup(&ctx, (u8*)key, 8 * keysize, 8 * ivsize);
|
||||||
|
if (is_ietf) ECRYPT_IETF_ivsetup(&ctx, (u8*)iv, (u8*)counter);
|
||||||
|
else ECRYPT_ivsetup(&ctx, (u8*)iv, (u8*)counter);
|
||||||
|
ECRYPT_encrypt_bytes(&ctx, (u8*)plaintext, (u8*)ciphertext, msglen, rounds);
|
||||||
|
|
||||||
|
lua_pushlstring(L, ciphertext, msglen);
|
||||||
|
free(ciphertext);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int chacha_ref_crypt(lua_State *L)
|
||||||
|
{ return chacha_generic_crypt(L, false); }
|
||||||
|
|
||||||
|
static int chacha_ietf_crypt(lua_State *L)
|
||||||
|
{ return chacha_generic_crypt(L, true); }
|
||||||
|
|
||||||
|
int luaopen_chacha(lua_State *L)
|
||||||
|
{
|
||||||
|
struct luaL_Reg l[] = {
|
||||||
|
{ "ref_crypt", chacha_ref_crypt },
|
||||||
|
{ "ietf_crypt", chacha_ietf_crypt },
|
||||||
|
{ NULL, NULL }
|
||||||
|
};
|
||||||
|
lua_newtable(L);
|
||||||
|
l_setfuncs(L, l);
|
||||||
|
return 1;
|
||||||
|
}
|
@ -550,6 +550,7 @@ if(BUILD_CLIENT)
|
|||||||
${PLATFORM_LIBS}
|
${PLATFORM_LIBS}
|
||||||
${CLIENT_PLATFORM_LIBS}
|
${CLIENT_PLATFORM_LIBS}
|
||||||
luautf8
|
luautf8
|
||||||
|
luachacha
|
||||||
)
|
)
|
||||||
if(NOT USE_LUAJIT)
|
if(NOT USE_LUAJIT)
|
||||||
set_target_properties(${PROJECT_NAME} PROPERTIES
|
set_target_properties(${PROJECT_NAME} PROPERTIES
|
||||||
@ -628,6 +629,7 @@ if(BUILD_SERVER)
|
|||||||
${GMP_LIBRARY}
|
${GMP_LIBRARY}
|
||||||
${PLATFORM_LIBS}
|
${PLATFORM_LIBS}
|
||||||
luautf8
|
luautf8
|
||||||
|
luachacha
|
||||||
)
|
)
|
||||||
set_target_properties(${PROJECT_NAME}server PROPERTIES
|
set_target_properties(${PROJECT_NAME}server PROPERTIES
|
||||||
COMPILE_DEFINITIONS "SERVER")
|
COMPILE_DEFINITIONS "SERVER")
|
||||||
|
@ -39,6 +39,7 @@ extern "C" {
|
|||||||
#include "luajit.h"
|
#include "luajit.h"
|
||||||
#endif
|
#endif
|
||||||
LUALIB_API int luaopen_utf8(lua_State *L);
|
LUALIB_API int luaopen_utf8(lua_State *L);
|
||||||
|
LUALIB_API int luaopen_chacha(lua_State *L);
|
||||||
}
|
}
|
||||||
|
|
||||||
#include <cstdio>
|
#include <cstdio>
|
||||||
@ -92,6 +93,10 @@ ScriptApiBase::ScriptApiBase(ScriptingType type):
|
|||||||
lua_pushcfunction(m_luastack, luaopen_utf8);
|
lua_pushcfunction(m_luastack, luaopen_utf8);
|
||||||
lua_call(m_luastack, 0, 0);
|
lua_call(m_luastack, 0, 0);
|
||||||
|
|
||||||
|
lua_pushcfunction(m_luastack, luaopen_chacha);
|
||||||
|
lua_call(m_luastack, 0, 1);
|
||||||
|
lua_setglobal(m_luastack, "chacha");
|
||||||
|
|
||||||
// Make the ScriptApiBase* accessible to ModApiBase
|
// Make the ScriptApiBase* accessible to ModApiBase
|
||||||
#if INDIRECT_SCRIPTAPI_RIDX
|
#if INDIRECT_SCRIPTAPI_RIDX
|
||||||
*(void **)(lua_newuserdata(m_luastack, sizeof(void *))) = this;
|
*(void **)(lua_newuserdata(m_luastack, sizeof(void *))) = this;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user