#include "jasmin_syscall.h" #if defined(__linux__) #include #include #include #include #include #include #include #include #include #include #include uint8_t* __jasmin_syscall_randombytes__(uint8_t* _x, uint64_t xlen) { int i; uint8_t* x = _x; printf("%lx:\n", x); for (i = 0; i < xlen; i++) { printf("%02X", _x[i]); } printf("\n"); return _x; } // uint64_t __jasmin_syscall_open__(uint8_t* x, uint64_t xlen) // { // uint8_t filename[xlen + 1]; // memcpy(filename, x, xlen); // filename[xlen] = 0; // // return (uint64_t)open(filename, O_RDWR|O_CREAT, S_IRUSR|S_IWUSR); // } // // uint8_t __jasmin_syscall_close__(uint64_t fd) // { // int success = close(fd); // // if (success == 0) { // return 1; // } else { // return 0; // } // } uint64_t __jasmin_syscall_open__(uint8_t* x, uint64_t xlen) { uint8_t* mem = (uint8_t*)mmap(NULL, 1024, PROT_READ|PROT_WRITE, MAP_SHARED, 3, 0); if (mem == NULL) { puts("mem error"); exit(1); } uintptr_t addr = (uintptr_t)(mem - 4096); void* futex_mem = mmap((void*)addr, 1024, PROT_READ|PROT_WRITE, MAP_SHARED, 4, 0); if ((uintptr_t)futex_mem != addr) { puts("mem error 2"); exit(1); } return (uint64_t)mem; } // uint8_t* __jasmin_syscall_write__(uint8_t* _x, uint64_t xlen, uint64_t fd) // { // size_t i; // uint8_t* x = _x; // // while (xlen > 0) { // i = write(fd, x, xlen); // if (i < 1) { // continue; // } // x += i; // xlen -= i; // } // // return _x; // } uint8_t* __jasmin_syscall_read__(uint8_t* _x, uint64_t xlen, uint64_t fd) { uint32_t* addr = (uint32_t*)(uintptr_t)fd; long ret = syscall(SYS_futex, addr, FUTEX_WAIT, 0x1, NULL, NULL, 0); if (ret == -1) { printf("%d\n", errno); perror("futex"); } return _x; } uint8_t* __jasmin_syscall_write__(uint8_t* _x, uint64_t xlen, uint64_t fd) { uint32_t* addr = (uint32_t*)(uintptr_t)fd; *addr = 1; syscall(SYS_futex, addr, FUTEX_WAKE, 1, NULL, NULL, 0); return _x; } // uint8_t* __jasmin_syscall_read__(uint8_t* _x, uint64_t xlen, uint64_t fd) // { // size_t i; // uint8_t* x = _x; // // i = read(fd, x, xlen); // if (i < 1) { // // Do something // perror("Something went wrong while reading the file"); // } // x += i; // xlen -= i; // // memset(x, 0, xlen); // // return _x; // } #endif #if defined(__APPLE__) #include #if !(defined(__MAC_OS_X_VERSION_MIN_REQUIRED) && __MAC_OS_X_VERSION_MIN_REQUIRED >= 101200) #error "macOS version not supported (>= 10.12)" #endif uint8_t* __jasmin_syscall_randombytes__(uint8_t* x, uint64_t xlen){ arc4random_buf(x, xlen); return x; } #endif