Compare commits

..

No commits in common. "chat_struct_crypto" and "master" have entirely different histories.

11 changed files with 16 additions and 474 deletions

5
.gitignore vendored
View File

@ -52,8 +52,3 @@ Module.symvers
Mkfile.old
dkms.conf
CMakeFiles
cmake_install.cmake
CMakeCache.txt
Makefile

View File

@ -13,5 +13,4 @@ project(romulus
)
set(CMAKE_POSITION_INDEPENDENT_CODE on)
add_subdirectory(ISAAC/)
add_subdirectory(Romulus-M/)

View File

@ -1,6 +0,0 @@
set(SRC
rand.c
)
add_library(isaac STATIC ${SRC})

View File

@ -1,137 +0,0 @@
/*
------------------------------------------------------------------------------
rand.c: By Bob Jenkins. My random number generator, ISAAC. Public Domain.
MODIFIED:
960327: Creation (addition of randinit, really)
970719: use context, not global variables, for internal state
980324: added main (ifdef'ed out), also rearranged randinit()
010626: Note that this is public domain
------------------------------------------------------------------------------
*/
#ifndef STANDARD
#include "standard.h"
#endif
#ifndef RAND
#include "rand.h"
#endif
#define ind(mm,x) (*(ub4 *)((ub1 *)(mm) + ((x) & ((RANDSIZ-1)<<2))))
#define rngstep(mix,a,b,mm,m,m2,r,x) \
{ \
x = *m; \
a = (a^(mix)) + *(m2++); \
*(m++) = y = ind(mm,x) + a + b; \
*(r++) = b = ind(mm,y>>RANDSIZL) + x; \
}
void isaac(ctx)
randctx *ctx;
{
register ub4 a,b,x,y,*m,*mm,*m2,*r,*mend;
mm=ctx->randmem; r=ctx->randrsl;
a = ctx->randa; b = ctx->randb + (++ctx->randc);
for (m = mm, mend = m2 = m+(RANDSIZ/2); m<mend; )
{
rngstep( a<<13, a, b, mm, m, m2, r, x);
rngstep( a>>6 , a, b, mm, m, m2, r, x);
rngstep( a<<2 , a, b, mm, m, m2, r, x);
rngstep( a>>16, a, b, mm, m, m2, r, x);
}
for (m2 = mm; m2<mend; )
{
rngstep( a<<13, a, b, mm, m, m2, r, x);
rngstep( a>>6 , a, b, mm, m, m2, r, x);
rngstep( a<<2 , a, b, mm, m, m2, r, x);
rngstep( a>>16, a, b, mm, m, m2, r, x);
}
ctx->randb = b; ctx->randa = a;
}
#define mix(a,b,c,d,e,f,g,h) \
{ \
a^=b<<11; d+=a; b+=c; \
b^=c>>2; e+=b; c+=d; \
c^=d<<8; f+=c; d+=e; \
d^=e>>16; g+=d; e+=f; \
e^=f<<10; h+=e; f+=g; \
f^=g>>4; a+=f; g+=h; \
g^=h<<8; b+=g; h+=a; \
h^=a>>9; c+=h; a+=b; \
}
/* if (flag==TRUE), then use the contents of randrsl[] to initialize mm[]. */
void randinit(ctx, flag)
randctx *ctx;
word flag;
{
word i;
ub4 a,b,c,d,e,f,g,h;
ub4 *m,*r;
ctx->randa = ctx->randb = ctx->randc = 0;
m=ctx->randmem;
r=ctx->randrsl;
a=b=c=d=e=f=g=h=0x9e3779b9; /* the golden ratio */
for (i=0; i<4; ++i) /* scramble it */
{
mix(a,b,c,d,e,f,g,h);
}
if (flag)
{
/* initialize using the contents of r[] as the seed */
for (i=0; i<RANDSIZ; i+=8)
{
a+=r[i ]; b+=r[i+1]; c+=r[i+2]; d+=r[i+3];
e+=r[i+4]; f+=r[i+5]; g+=r[i+6]; h+=r[i+7];
mix(a,b,c,d,e,f,g,h);
m[i ]=a; m[i+1]=b; m[i+2]=c; m[i+3]=d;
m[i+4]=e; m[i+5]=f; m[i+6]=g; m[i+7]=h;
}
/* do a second pass to make all of the seed affect all of m */
for (i=0; i<RANDSIZ; i+=8)
{
a+=m[i ]; b+=m[i+1]; c+=m[i+2]; d+=m[i+3];
e+=m[i+4]; f+=m[i+5]; g+=m[i+6]; h+=m[i+7];
mix(a,b,c,d,e,f,g,h);
m[i ]=a; m[i+1]=b; m[i+2]=c; m[i+3]=d;
m[i+4]=e; m[i+5]=f; m[i+6]=g; m[i+7]=h;
}
}
else
{
/* fill in m[] with messy stuff */
for (i=0; i<RANDSIZ; i+=8)
{
mix(a,b,c,d,e,f,g,h);
m[i ]=a; m[i+1]=b; m[i+2]=c; m[i+3]=d;
m[i+4]=e; m[i+5]=f; m[i+6]=g; m[i+7]=h;
}
}
isaac(ctx); /* fill in the first set of results */
ctx->randcnt=RANDSIZ; /* prepare to use the first set of results */
}
#ifdef NEVER
int main()
{
ub4 i,j;
randctx ctx;
ctx.randa=ctx.randb=ctx.randc=(ub4)0;
for (i=0; i<256; ++i) ctx.randrsl[i]=(ub4)0;
randinit(&ctx, TRUE);
for (i=0; i<2; ++i)
{
isaac(&ctx);
for (j=0; j<256; ++j)
{
printf("%.8lx",ctx.randrsl[j]);
if ((j&7)==7) printf("\n");
}
}
}
#endif

View File

@ -1,56 +0,0 @@
/*
------------------------------------------------------------------------------
rand.h: definitions for a random number generator
By Bob Jenkins, 1996, Public Domain
MODIFIED:
960327: Creation (addition of randinit, really)
970719: use context, not global variables, for internal state
980324: renamed seed to flag
980605: recommend RANDSIZL=4 for noncryptography.
010626: note this is public domain
------------------------------------------------------------------------------
*/
#ifndef STANDARD
#include "standard.h"
#endif
#ifndef RAND
#define RAND
#define RANDSIZL (8)
#define RANDSIZ (1<<RANDSIZL)
/* context of random number generator */
struct randctx
{
ub4 randcnt;
ub4 randrsl[RANDSIZ];
ub4 randmem[RANDSIZ];
ub4 randa;
ub4 randb;
ub4 randc;
};
typedef struct randctx randctx;
/*
------------------------------------------------------------------------------
If (flag==TRUE), then use the contents of randrsl[0..RANDSIZ-1] as the seed.
------------------------------------------------------------------------------
*/
void randinit(/*_ randctx *r, word flag _*/);
void isaac(/*_ randctx *r _*/);
/*
------------------------------------------------------------------------------
Call rand(/o_ randctx *r _o/) to retrieve a single 32-bit random value
------------------------------------------------------------------------------
*/
#define rand(r) \
(!(r)->randcnt-- ? \
(isaac(r), (r)->randcnt=RANDSIZ-1, (r)->randrsl[(r)->randcnt]) : \
(r)->randrsl[(r)->randcnt])
#endif /* RAND */

View File

@ -1,57 +0,0 @@
/*
------------------------------------------------------------------------------
Standard definitions and types, Bob Jenkins
------------------------------------------------------------------------------
*/
#ifndef STANDARD
# define STANDARD
# ifndef STDIO
# include <stdio.h>
# define STDIO
# endif
# ifndef STDDEF
# include <stddef.h>
# define STDDEF
# endif
typedef unsigned long long ub8;
#define UB8MAXVAL 0xffffffffffffffffLL
#define UB8BITS 64
typedef signed long long sb8;
#define SB8MAXVAL 0x7fffffffffffffffLL
typedef unsigned long int ub4; /* unsigned 4-byte quantities */
#define UB4MAXVAL 0xffffffff
typedef signed long int sb4;
#define UB4BITS 32
#define SB4MAXVAL 0x7fffffff
typedef unsigned short int ub2;
#define UB2MAXVAL 0xffff
#define UB2BITS 16
typedef signed short int sb2;
#define SB2MAXVAL 0x7fff
typedef unsigned char ub1;
#define UB1MAXVAL 0xff
#define UB1BITS 8
typedef signed char sb1; /* signed 1-byte quantities */
#define SB1MAXVAL 0x7f
typedef int word; /* fastest type available */
#define bis(target,mask) ((target) |= (mask))
#define bic(target,mask) ((target) &= ~(mask))
#define bit(target,mask) ((target) & (mask))
#ifndef min
# define min(a,b) (((a)<(b)) ? (a) : (b))
#endif /* min */
#ifndef max
# define max(a,b) (((a)<(b)) ? (b) : (a))
#endif /* max */
#ifndef align
# define align(a) (((ub4)a+(sizeof(void *)-1))&(~(sizeof(void *)-1)))
#endif /* align */
#ifndef abs
# define abs(a) (((a)>0) ? (a) : -(a))
#endif
#define TRUE 1
#define FALSE 0
#define SUCCESS 0 /* 1 on VAX */
#endif /* STANDARD */

View File

@ -3,9 +3,16 @@ set(SRC
encrypt.c
romulus_m_reference.c
skinny_reference.c
encrypt_wrapper.c
)
include_directories(../ISAAC)
link_libraries(isaac)
if(EMSCRIPTEN)
# WASM requires an executable, so we use a dummy target that doesn't do anything
# and link our library into it.
add_library(romulus-m STATIC ${SRC})
add_executable(romulus-m-wasm "main.c")
target_link_libraries(romulus-m-wasm PRIVATE romulus-m)
target_link_options(romulus-m-wasm PRIVATE -s EXPORTED_FUNCTIONS=['_main', '_crypto_aead_encrypt', '_crypto_aead_decrypt'])
else()
add_library(romulus-m SHARED ${SRC})
install(TARGETS romulus-m)
endif()

View File

@ -1,176 +0,0 @@
#include "encrypt_wrapper.h"
#include <stdio.h>
#include <string.h>
#ifdef _MSC_VER
#define __bswap_16 _byteswap_ushort
#define __bswap_32 _byteswap_ulong
#elif __APPLE__
#include <libkern/OSByteOrder.h>
#define __bswap_16 OSSwapInt16
#define __bswap_32 OSSwapInt32
#define __bswap_64 OSSwapInt64
#else
#include <byteswap.h>
#endif
#include <stdlib.h>
#include "romulus_m.h"
#include "api.h"
#include <rand.h>
#ifdef _DEBUG
#define DEBUG_PRINT printf
#else
#define DEBUG_PRINT
#endif
#define MIN(a,b) ((a) < (b) ? (a) : (b))
randctx rCtx = {0};
int encrypt(packet *packet, unsigned char *outBuf, UINT16 *len, unsigned char *key)
{
DEBUG_PRINT("line %d\n", __LINE__);
if (sizeof(UINT16) + sizeof(UINT16) + packet->Size > *len)
{
return 1;
}
int packetSize = packet->Size;
// enc
// ciphertext - out, MAX 16 bytes larger than plaintext - defined as CRYPTO_ABYTES
unsigned long long clen = packetSize + CRYPTO_ABYTES;
unsigned char *c = (unsigned char *)calloc(clen, 1);
// plaintext - in
int mlen = packetSize;
unsigned char *m = packet->Data;
// additional text
packet->DataType = __bswap_16(packet->DataType);
int adlen = sizeof(packet->DataType);
unsigned char *ad = (unsigned char *)&packet->DataType;
// n = nonce, CRYPTO_NPUBBYTES size 16
unsigned char npub[CRYPTO_NPUBBYTES];
DEBUG_PRINT("line %d\n", __LINE__);
fill_random(npub, CRYPTO_NPUBBYTES);
DEBUG_PRINT("line %d\n", __LINE__);
int ret = romulus_m_encrypt(c, &clen, m, mlen, ad, adlen, 0, &npub[0], key);
if (clen > *len + CRYPTO_NPUBBYTES || ret != 0)
{
free(c);
return 1;
}
// type 0 1
int loc = 0;
memcpy(&outBuf[loc], &packet->DataType, sizeof(UINT16));
loc += sizeof(UINT16);
DEBUG_PRINT("line %d\n", __LINE__);
// data size 2 3
UINT16 clen16 = (UINT16)clen;
// we copy data and nonce
clen16 += CRYPTO_NPUBBYTES;
clen16 = __bswap_16(clen16);
memcpy(&outBuf[loc], &clen16, sizeof(UINT16));
loc += sizeof(UINT16);
memcpy(&outBuf[loc], npub, CRYPTO_NPUBBYTES);
loc += CRYPTO_NPUBBYTES;
memcpy(&outBuf[loc], c, clen);
loc += clen;
*len = loc;
DEBUG_PRINT("line %d\n", __LINE__);
free(c);
return 0;
}
int decrypt(packetEx *packet, unsigned char *inBuf, UINT16 len, unsigned char *key)
{
int loc = 0;
if (inBuf == 0)
{
return 1;
}
DEBUG_PRINT("line %d\n", __LINE__);
memcpy(&packet->DataType, &inBuf[loc], sizeof(UINT16));
loc += sizeof(UINT16);
memcpy(&packet->Id, &inBuf[loc], sizeof(UINT32));
loc += sizeof(UINT32);
memcpy(&packet->Size, &inBuf[loc], sizeof(UINT16));
loc += sizeof(UINT16);
packet->Size = __bswap_16(packet->Size);
packet->Id = __bswap_32(packet->Id);
if ((len - loc) < 0 || packet->Size < CRYPTO_NPUBBYTES || packet->Size > 1000)
{
return 1;
}
DEBUG_PRINT("line %d\n", __LINE__);
// Data
// Nonce|Data
// dec
// n = nonce, CRYPTO_NPUBBYTES size 16
unsigned char *npub = &inBuf[loc];
loc += CRYPTO_NPUBBYTES;
if ((len - loc) < 0 )
{
return 1;
}
// ciphertext - in, MAX 16 bytes larger than plaintext - defined as CRYPTO_ABYTES
int clen = len - loc;
unsigned char *c = &inBuf[loc];
DEBUG_PRINT("line %d len:%d loc:%d\n", __LINE__, len, loc);
// plaintext - out
unsigned long long mlen = clen;
unsigned char *m = (unsigned char *)calloc(clen, 1);
// additional text
int adlen = sizeof(packet->DataType);
unsigned char *ad = (unsigned char *)&packet->DataType;
DEBUG_PRINT("line %d mlen:%d clen:%d\n", __LINE__, mlen, clen);
int ret = romulus_m_decrypt(m, &mlen, 0, c, clen, ad, adlen, npub, key);
DEBUG_PRINT("line %d packet:%d, mlen %d\n", __LINE__, packet->Size, mlen);
// swap after decrypt, we sign the big endian bytes
packet->DataType = __bswap_16(packet->DataType);
if (ret == 0)
{
DEBUG_PRINT("line %d\n", __LINE__);
memcpy(packet->Data, m, mlen);
packet->Size = (UINT16)mlen;
}
free(m);
DEBUG_PRINT("line %d\n", __LINE__);
return ret;
}
void fill_random(unsigned char* buffer, int length){
DEBUG_PRINT("line %d\n", __LINE__);
if(rCtx.randcnt == 0){
randinit(&rCtx, RANDSIZL);
}
UINT32 secRandom;
for (size_t i = 0; i < length; i += sizeof(UINT32))
{
secRandom = rand(&rCtx);
memcpy(&buffer[i], &secRandom, MIN(sizeof(UINT32), length-i));
}
}

View File

@ -1,31 +0,0 @@
#include <stdio.h>
#include "export.h"
#ifdef _MSC_VER
#include <stdint.h>
#define UINT16 uint16_t
#define UINT32 uint32_t
#else
#define UINT16 __uint16_t
#define UINT32 __uint32_t
#endif
typedef struct {
UINT16 DataType;
UINT16 Size;
unsigned char* Data;
}packet;
typedef struct {
UINT16 DataType;
UINT32 Id;
UINT16 Size;
unsigned char* Data;
}packetEx;
EXPORT int encrypt(packet *packet, unsigned char* outBuf, UINT16 *len, unsigned char* key);
EXPORT int decrypt(packetEx *packet, unsigned char* inBuf, UINT16 len, unsigned char* key);
void fill_random(unsigned char* buffer, int length);

View File

@ -8,6 +8,9 @@
#ifdef _WIN32
#define EXPORT __declspec(dllexport)
#else
#elif __linux__
#define EXPORT __attribute__((visibility("default")))
#elif __EMSCRIPTEN__
#include <emscripten.h>
#define EXPORT EMSCRIPTEN_KEEPALIVE
#endif

View File

@ -29,6 +29,7 @@ void pad (const unsigned char* m, unsigned char* mp, int l, int len8) {
mp[i] = 0x00;
}
}
}
// G(S): generates the key stream from the internal state by multiplying the state S by the constant matrix G