#ifndef KInum #define KInum #ifdef __cplusplus extern "C" { #endif #include typedef enum kncond { kncond_ok = kncond_id, kncond_saturate, kncond_wrap, /* error states */ kncond_fail, kncond_fail_io, kncond_overflow, kncond_underflow, kncond_bad_domain, kncond_bad_base, } kncond; /* this "hard" random number generator * returns a block of random data that * can be used safely in cryptographic * pseudorandom number algorithms such * as e.g. knrands() */ enum kncond knrandh(u8* mem, sz count); /* we define the largest available native * type as `knword` for convenience; this * is the type that the pseudorandom func * will use for state and return; */ typedef unsigned long long knword; /* to encapsulate the state of the pseudo * random number generator, we define an * array as an opaque seed reference type */ typedef knword knseed [8]; /* this function implements a "soft" RNG * that can be safely used as a cryptographic * primitive, keeping its state in a value of * type of knseed (which needs to be seeded * initially by knrandh() or another reliable * source of entropy. */ knword knrands(knseed state); /* addition and subtraction in C can be * complex due to the need to check for * underflow and overflow, so we offer * a suite of functions which implement * reliable arithmetic over integers of * arbitrary bit lengths. functions for * fixed point & floating point numbers * should also be added eventually. * note that these functions use either * two's complement or one's complement * for signed */ typedef enum knmode { /* knmode operations may be or'd with a base; * base will be inferred by prefix otherwise */ knmode_saturate = 0x0001 << 7, /* 0b001 */ knmode_wrap = 0x0002 << 7, /* 0b010 */ knmode_fail = 0x0003 << 7, /* 0b011 */ knmode_signed = 1 << 6, /* 0b100*/ knmode_unsigned = 0 /* default */ } knmode; /* it is legal for src and dest to be the * same location in memory. this will not * produce incorrect output. although the * functions formally take pointers to * ubyte, they are converted appropriately * with regard to sign and size within * the fn */ kncond kniadd(knmode, sz, ubyte* dest, ubyte* src, ubyte* delta); kncond knisub(knmode, sz, ubyte* dest, ubyte* src, ubyte* delta); kncond knimul(knmode, sz, ubyte* dest, ubyte* src, ubyte* delta); kncond knidiv(knmode, sz, /* output */ ubyte* ratio, ubyte* remainder, /* input */ ubyte* src, ubyte delta); /* we should probably also offer a bignum * type eventually, tho this will need to * be integrated with kmem for allocation. */ kncond knstr(knmode, sz, char* dest_begin, char* dest_end, ubyte* src); kncond knparse(knmode, sz, ubyte* dest, ksraw src); #ifdef __cplusplus } #endif #endif