int unhexify(unsigned char *obuf, const char *ibuf) { unsigned char c, c2; int len = strlen(ibuf) / 2; assert(!(strlen(ibuf) %1)); // must be even number of bytes while (*ibuf != 0) { c = *ibuf++; if( c >= '0' && c <= '9' ) c -= '0'; else if( c >= 'a' && c <= 'f' ) c -= 'a' - 10; else if( c >= 'A' && c <= 'F' ) c -= 'A' - 10; else assert( 0 ); c2 = *ibuf++; if( c2 >= '0' && c2 <= '9' ) c2 -= '0'; else if( c2 >= 'a' && c2 <= 'f' ) c2 -= 'a' - 10; else if( c2 >= 'A' && c2 <= 'F' ) c2 -= 'A' - 10; else assert( 0 ); *obuf++ = ( c << 4 ) | c2; } return len; } void hexify(unsigned char *obuf, const unsigned char *ibuf, int len) { unsigned char l, h; while (len != 0) { h = (*ibuf) / 16; l = (*ibuf) % 16; if( h < 10 ) *obuf++ = '0' + h; else *obuf++ = 'a' + h - 10; if( l < 10 ) *obuf++ = '0' + l; else *obuf++ = 'a' + l - 10; ++ibuf; len--; } } /** * This function just returns data from rand(). * * rng_state shall be NULL. */ static int rnd_std_rand( void *rng_state ) { if( rng_state != NULL ) rng_state = NULL; return( rand() ); } /** * This function only returns zeros * * rng_state shall be NULL. */ static int rnd_zero_rand( void *rng_state ) { if( rng_state != NULL ) rng_state = NULL; return( 0 ); } typedef struct { unsigned char *buf; int length; int per_call; } rnd_info; /** * This function returns random based on a buffer it receives. * * rng_state shall be a pointer to a rnd_buf structure. * * After the buffer is empty it will return rand(); */ static int rnd_buffer_rand( void *rng_state ) { rnd_info *info = (rnd_info *) rng_state; int res; if( rng_state == NULL ) return( rand() ); res = rand(); if( info->length >= info->per_call ) { memcpy( &res, info->buf, info->per_call ); info->buf += info->per_call; info->length -= info->per_call; } else if( info->length > 0 ) { memcpy( &res, info->buf, info->length ); info->length = 0; } return( res ); }