Loading src/secureid.c +70 −6 Original line number Diff line number Diff line Loading @@ -25,6 +25,7 @@ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. *******************************************************************************/ #include "string.h" #include "assert.h" #include "stdio.h" Loading @@ -41,6 +42,18 @@ Authority NT ={0,0,0,0,0,5}; Authority ResourceManager ={0,0,0,0,0,6}; Authority MandatoryLevel ={0,0,0,0,1,6}; #define MAX_PIECES (1u << 2u) struct poor_slab { struct slab_piece { unsigned char *ptr; uint32_t sz; uint32_t occupied; } pieces[MAX_PIECES]; }; __attribute__((aligned(64))) struct poor_slab slabs; __attribute__((visibility("hidden"))) uint32_t string2uint32_t(const char* str,int size){ uint32_t res = 0; for (int i = 0; i < size; ++i) Loading @@ -48,14 +61,65 @@ __attribute__((visibility("hidden"))) uint32_t string2uint32_t(const char* str,i return res; }; __attribute__((visibility("hidden"))) uint32_t map32(uint32_t size){ #ifdef X86_64 return mmap(0,size,PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS|MAP_32BIT, -1, 0); #endif __attribute__((visibility("hidden"))) static uint64_t xorshifto_seed[2] = {0xdeadbabe, 0xdeadbeef}; #if defined(__LP64__) && !defined(__x86_64__) return mmap(0,(size/2), PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS|MAP_FIXED,-1, 0); __attribute__((visibility("hidden"))) static inline uint64_t xoroshiro_rotl (const uint64_t x, int k) { return (x << k) | (x >> (64 - k)); } __attribute__((visibility("hidden"))) uint32_t map32(uint32_t sz){ unsigned char *cp; unsigned flags = MAP_PRIVATE | MAP_ANON; void *base_addr = NULL; /* Check slabs */ for (unsigned i = 0; i < MAX_PIECES; i ++) { if (!slabs.pieces[i].occupied && slabs.pieces[i].sz == sz) { /* Reuse, short path */ slabs.pieces[i].occupied = 1; return slabs.pieces[i].ptr + sizeof (size_t); } } #ifdef MAP_32BIT flags |= MAP_32BIT; #else const uint64_t s0 = xorshifto_seed[0]; uint64_t s1 = xorshifto_seed[1]; s1 ^= s0; xorshifto_seed[0] = xoroshiro_rotl (s0, 55) ^ s1 ^ (s1 << 14); xorshifto_seed[1] = xoroshiro_rotl (s1, 36); flags |= MAP_FIXED; /* Get 46 bits */ base_addr = (void *)((xorshifto_seed[0] + xorshifto_seed[1]) & 0x7FFFFFFFF000ULL); #endif cp = mmap (base_addr, sz + sizeof (sz), PROT_WRITE | PROT_READ, flags, -1, 0); assert (cp != MAP_FAILED); memcpy (cp, &sz, sizeof (sz)); for (unsigned i = 0; i < MAX_PIECES; i ++) { if (slabs.pieces[i].occupied == 0) { /* Store piece */ slabs.pieces[i].sz = sz; slabs.pieces[i].ptr = cp; slabs.pieces[i].occupied = 1; return cp + sizeof (sz); } } /* Not enough free pieces, pop some */ unsigned sel = ((uintptr_t)cp) & ((MAX_PIECES * 2) - 1); /* Here we free memory in fact */ munmap (slabs.pieces[sel].ptr, slabs.pieces[sel].sz + sizeof (sz)); slabs.pieces[sel].sz = sz; slabs.pieces[sel].ptr = cp; slabs.pieces[sel].occupied = 1; return cp + sizeof (sz); }; __attribute__((visibility("hidden"))) uint32_t munmap32(void *ptr,uint32_t size){ Loading Loading
src/secureid.c +70 −6 Original line number Diff line number Diff line Loading @@ -25,6 +25,7 @@ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. *******************************************************************************/ #include "string.h" #include "assert.h" #include "stdio.h" Loading @@ -41,6 +42,18 @@ Authority NT ={0,0,0,0,0,5}; Authority ResourceManager ={0,0,0,0,0,6}; Authority MandatoryLevel ={0,0,0,0,1,6}; #define MAX_PIECES (1u << 2u) struct poor_slab { struct slab_piece { unsigned char *ptr; uint32_t sz; uint32_t occupied; } pieces[MAX_PIECES]; }; __attribute__((aligned(64))) struct poor_slab slabs; __attribute__((visibility("hidden"))) uint32_t string2uint32_t(const char* str,int size){ uint32_t res = 0; for (int i = 0; i < size; ++i) Loading @@ -48,14 +61,65 @@ __attribute__((visibility("hidden"))) uint32_t string2uint32_t(const char* str,i return res; }; __attribute__((visibility("hidden"))) uint32_t map32(uint32_t size){ #ifdef X86_64 return mmap(0,size,PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS|MAP_32BIT, -1, 0); #endif __attribute__((visibility("hidden"))) static uint64_t xorshifto_seed[2] = {0xdeadbabe, 0xdeadbeef}; #if defined(__LP64__) && !defined(__x86_64__) return mmap(0,(size/2), PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS|MAP_FIXED,-1, 0); __attribute__((visibility("hidden"))) static inline uint64_t xoroshiro_rotl (const uint64_t x, int k) { return (x << k) | (x >> (64 - k)); } __attribute__((visibility("hidden"))) uint32_t map32(uint32_t sz){ unsigned char *cp; unsigned flags = MAP_PRIVATE | MAP_ANON; void *base_addr = NULL; /* Check slabs */ for (unsigned i = 0; i < MAX_PIECES; i ++) { if (!slabs.pieces[i].occupied && slabs.pieces[i].sz == sz) { /* Reuse, short path */ slabs.pieces[i].occupied = 1; return slabs.pieces[i].ptr + sizeof (size_t); } } #ifdef MAP_32BIT flags |= MAP_32BIT; #else const uint64_t s0 = xorshifto_seed[0]; uint64_t s1 = xorshifto_seed[1]; s1 ^= s0; xorshifto_seed[0] = xoroshiro_rotl (s0, 55) ^ s1 ^ (s1 << 14); xorshifto_seed[1] = xoroshiro_rotl (s1, 36); flags |= MAP_FIXED; /* Get 46 bits */ base_addr = (void *)((xorshifto_seed[0] + xorshifto_seed[1]) & 0x7FFFFFFFF000ULL); #endif cp = mmap (base_addr, sz + sizeof (sz), PROT_WRITE | PROT_READ, flags, -1, 0); assert (cp != MAP_FAILED); memcpy (cp, &sz, sizeof (sz)); for (unsigned i = 0; i < MAX_PIECES; i ++) { if (slabs.pieces[i].occupied == 0) { /* Store piece */ slabs.pieces[i].sz = sz; slabs.pieces[i].ptr = cp; slabs.pieces[i].occupied = 1; return cp + sizeof (sz); } } /* Not enough free pieces, pop some */ unsigned sel = ((uintptr_t)cp) & ((MAX_PIECES * 2) - 1); /* Here we free memory in fact */ munmap (slabs.pieces[sel].ptr, slabs.pieces[sel].sz + sizeof (sz)); slabs.pieces[sel].sz = sz; slabs.pieces[sel].ptr = cp; slabs.pieces[sel].occupied = 1; return cp + sizeof (sz); }; __attribute__((visibility("hidden"))) uint32_t munmap32(void *ptr,uint32_t size){ Loading