mirror of
https://github.com/CPunch/Laika.git
synced 2024-11-24 13:31:05 +00:00
Box: implemented laikaB_unlock() & laikaB_lock()
This commit is contained in:
parent
4333d03a51
commit
36c3c8a65f
@ -18,7 +18,7 @@
|
|||||||
# define LAIKA_DEBUG(...) ((void)0) /* no op */
|
# define LAIKA_DEBUG(...) ((void)0) /* no op */
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifndef _WIN32
|
#ifndef _MSC_VER
|
||||||
# define LAIKA_FORCEINLINE __attribute__((always_inline)) inline
|
# define LAIKA_FORCEINLINE __attribute__((always_inline)) inline
|
||||||
#else
|
#else
|
||||||
# define LAIKA_FORCEINLINE __forceinline
|
# define LAIKA_FORCEINLINE __forceinline
|
||||||
|
@ -4,7 +4,11 @@
|
|||||||
#include <inttypes.h>
|
#include <inttypes.h>
|
||||||
|
|
||||||
#include "laika.h"
|
#include "laika.h"
|
||||||
|
#include "lmem.h"
|
||||||
#include "lvm.h"
|
#include "lvm.h"
|
||||||
|
#include "lsodium.h"
|
||||||
|
|
||||||
|
#define LAIKA_BOX_HEAPSIZE 256
|
||||||
|
|
||||||
/* Laika Box:
|
/* Laika Box:
|
||||||
Laika Boxes are obfuscated storage mediums where data is only in memory for a very short amount of time.
|
Laika Boxes are obfuscated storage mediums where data is only in memory for a very short amount of time.
|
||||||
@ -18,18 +22,25 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
struct sLaikaB_box {
|
struct sLaikaB_box {
|
||||||
uint8_t *data;
|
uint8_t unlockedData[LAIKA_BOX_HEAPSIZE];
|
||||||
uint8_t *unlockedData;
|
uint8_t code[LAIKA_VM_CODESIZE];
|
||||||
struct sLaikaV_vm vm;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
LAIKA_FORCEINLINE void laikaB_unlock(struct sLaikaB_box *box) {
|
LAIKA_FORCEINLINE void* laikaB_unlock(struct sLaikaB_box *box, void *data) {
|
||||||
|
struct sLaikaV_vm vm = {.pc = 0};
|
||||||
|
memcpy(vm.code, box->code, LAIKA_VM_CODESIZE);
|
||||||
|
|
||||||
|
/* boxes have 2 reserved constants, 0 for the output, 1 for the input */
|
||||||
|
vm.constList[0].ptr = box->unlockedData;
|
||||||
|
vm.constList[1].ptr = data;
|
||||||
|
|
||||||
|
laikaV_execute(&vm);
|
||||||
|
return (void*)box->unlockedData;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* safely free's allocated buffer using libsodium's api for clearing sensitive data from memory */
|
/* safely zeros the unlockedData using libsodium's api for clearing sensitive data from memory */
|
||||||
LAIKA_FORCEINLINE void laikaB_lock(struct sLaikaB_box *box) {
|
LAIKA_FORCEINLINE void* laikaB_lock(struct sLaikaB_box *box) {
|
||||||
|
sodium_memzero(box->unlockedData, LAIKA_BOX_HEAPSIZE);
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
@ -30,11 +30,11 @@ struct sLaikaV_vm {
|
|||||||
int pc;
|
int pc;
|
||||||
};
|
};
|
||||||
|
|
||||||
#define LAIKA_MAKE_VM(consts, code) (struct sLaikaV_vm)({.constList = consts, .code = code, .pc = 0, .stack = {}})
|
#define LAIKA_MAKE_VM(_consts, _code) (struct sLaikaV_vm)({.constList = _consts, .code = _code, .pc = 0, .stack = {}})
|
||||||
|
|
||||||
/* constants */
|
/* constants */
|
||||||
#define LAIKA_MAKE_VM_INT(i) (struct sLaikaV_vm_val)({.i = i})
|
#define LAIKA_MAKE_VM_INT(_i) (struct sLaikaV_vm_val)({.i = _i})
|
||||||
#define LAIKA_MAKE_VM_PTR(ptr) (struct sLaikaV_vm_val)({.ptr = ptr})
|
#define LAIKA_MAKE_VM_PTR(_ptr) (struct sLaikaV_vm_val)({.ptr = _ptr})
|
||||||
/* instructions */
|
/* instructions */
|
||||||
#define LAIKA_MAKE_VM_IA(opcode, a) opcode, a
|
#define LAIKA_MAKE_VM_IA(opcode, a) opcode, a
|
||||||
#define LAIKA_MAKE_VM_IAB(opcode, a, b) opcode, a, b
|
#define LAIKA_MAKE_VM_IAB(opcode, a, b) opcode, a, b
|
||||||
@ -43,6 +43,7 @@ struct sLaikaV_vm {
|
|||||||
enum {
|
enum {
|
||||||
OP_EXIT,
|
OP_EXIT,
|
||||||
OP_LOADCONST, /* stk_indx[uint8_t] = const_indx[uint8_t] */
|
OP_LOADCONST, /* stk_indx[uint8_t] = const_indx[uint8_t] */
|
||||||
|
OP_PUSHLIT, /* stk_indx[uint8_t].i = uint8_t */
|
||||||
OP_READ, /* stk_indx[uint8_t] = *(int8_t*)stk_indx[uint8_t] */
|
OP_READ, /* stk_indx[uint8_t] = *(int8_t*)stk_indx[uint8_t] */
|
||||||
OP_WRITE, /* *(uint8_t*)stk_indx[uint8_t] = stk_indx[uint8_t] */
|
OP_WRITE, /* *(uint8_t*)stk_indx[uint8_t] = stk_indx[uint8_t] */
|
||||||
|
|
||||||
@ -83,6 +84,12 @@ LAIKA_FORCEINLINE void laikaV_execute(struct sLaikaV_vm *vm) {
|
|||||||
vm->stack[indx] = vm->constList[constIndx];
|
vm->stack[indx] = vm->constList[constIndx];
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
case OP_PUSHLIT: {
|
||||||
|
uint8_t indx = READBYTE;
|
||||||
|
uint8_t lit = READBYTE;
|
||||||
|
vm->stack[indx].i = lit;
|
||||||
|
break;
|
||||||
|
}
|
||||||
case OP_READ: {
|
case OP_READ: {
|
||||||
uint8_t indx = READBYTE;
|
uint8_t indx = READBYTE;
|
||||||
uint8_t ptr = READBYTE;
|
uint8_t ptr = READBYTE;
|
||||||
|
Loading…
Reference in New Issue
Block a user