Beispiel #1
0
int random_vector(unsigned int seed, int code, DVEC(r)) {
    struct random_data buffer;
    char   random_state[128];
    memset(&buffer, 0, sizeof(struct random_data));
    memset(random_state, 0, sizeof(random_state));

    initstate_r(seed,random_state,sizeof(random_state),&buffer);
    // setstate_r(random_state,&buffer);
    // srandom_r(seed,&buffer);

    int phase = 0;
    double V1,V2,S;

    int k;
    switch (code) {
      case 0: { // uniform
        for (k=0; k<rn; k++) {
            rp[k] = urandom(&buffer);
        }
        OK
      }
      case 1: { // gaussian
        for (k=0; k<rn; k++) {
            rp[k] = gaussrand(&buffer,&phase,&V1,&V2,&S);
        }
        OK
      }

      default: ERROR(BAD_CODE);
    }
}
Beispiel #2
0
int sd_ipv4ll_set_address_seed(sd_ipv4ll *ll, unsigned seed) {
        _cleanup_free_ struct random_data *random_data = NULL;
        _cleanup_free_ char *random_data_state = NULL;
        int r;

        assert_return(ll, -EINVAL);

        random_data = new0(struct random_data, 1);
        if (!random_data)
                return -ENOMEM;

        random_data_state = new0(char, 128);
        if (!random_data_state)
                return -ENOMEM;

        r = initstate_r(seed, random_data_state, 128, random_data);
        if (r < 0)
                return r;

        free(ll->random_data);
        ll->random_data = random_data;
        random_data = NULL;

        free(ll->random_data_state);
        ll->random_data_state = random_data_state;
        random_data_state = NULL;

        return 0;
}
Beispiel #3
0
int sd_ipv4ll_set_address_seed (sd_ipv4ll *ll, uint8_t seed[8]) {
    unsigned int entropy;
    int r;

    assert_return(ll, -EINVAL);
    assert_return(seed, -EINVAL);

    entropy = *seed;

    free(ll->random_data);
    free(ll->random_data_state);

    ll->random_data = new0(struct random_data, 1);
    ll->random_data_state = new0(char, 128);

    if (!ll->random_data || !ll->random_data_state) {
        r = -ENOMEM;
        goto error;
    }

    r = initstate_r((unsigned int)entropy, ll->random_data_state, 128, ll->random_data);
    if (r < 0)
        goto error;

error:
    if (r < 0) {
        free(ll->random_data);
        free(ll->random_data_state);
        ll->random_data = NULL;
        ll->random_data_state = NULL;
    }
    return r;
}
Beispiel #4
0
MojErr MojInitRandom(MojUInt32 seed, MojChar* stateBuf, MojSize stateBufLen, MojRandomDataT* buf)
{
	if (initstate_r(seed, stateBuf, stateBufLen, buf) < 0)
		MojErrThrowErrno(_T("initstate_r"));

	return MojErrNone;
}
Beispiel #5
0
char *
initstate (unsigned int seed, char *buf, size_t buf_size)
{
  char *old_state = (char *) ((int32_t *) generator.state - 1);
  if (initstate_r (seed, buf, buf_size, &generator) < 0)
    return NULL; /* failed */
  return old_state;
}
Beispiel #6
0
/**
 * \param[in] seed Value to seed the random generator
 *
 * This functions wraps around srandom_r() to make a thread-safe seeding for wget_random().
 */
void wget_srandom(unsigned int seed)
{
	wget_thread_mutex_lock(&mutex);

	initstate_r(seed, statebuf, sizeof(statebuf), &state);
	seeded = 1;

	wget_thread_mutex_unlock(&mutex);
}
Beispiel #7
0
/* Initialize the state information in the given array of N bytes for
   future random number generation.  Based on the number of bytes we
   are given, and the break values for the different R.N.G.'s, we choose
   the best (largest) one we can and set things up for it.  srandom is
   then called to initialize the state information.  Note that on return
   from srandom, we set state[-1] to be the type multiplexed with the current
   value of the rear pointer; this is so successive calls to initstate won't
   lose this information and will be able to restart with setstate.
   Note: The first thing we do is save the current state, if any, just like
   setstate so that it doesn't matter when initstate is called.
   Returns a pointer to the old state.  */
char * initstate (unsigned int seed, char *arg_state, size_t n)
{
    int32_t *ostate;

    __UCLIBC_MUTEX_LOCK(mylock);
    ostate = &unsafe_state.state[-1];
    initstate_r (seed, arg_state, n, &unsafe_state);
    __UCLIBC_MUTEX_UNLOCK(mylock);
    return (char *) ostate;
}
static int32_t
FcRandom(void)
{
    int32_t result;

#if HAVE_RANDOM_R
    static struct random_data fcrandbuf;
    static char statebuf[256];
    static FcBool initialized = FcFalse;

    if (initialized != FcTrue)
    {
	initstate_r(time(NULL), statebuf, 256, &fcrandbuf);
	initialized = FcTrue;
    }

    random_r(&fcrandbuf, &result);
#elif HAVE_RANDOM
    static char statebuf[256];
    char *state;
    static FcBool initialized = FcFalse;

    if (initialized != FcTrue)
    {
	state = initstate(time(NULL), statebuf, 256);
	initialized = FcTrue;
    }
    else
	state = setstate(statebuf);

    result = random();

    setstate(state);
#elif HAVE_LRAND48
    result = lrand48();
#elif HAVE_RAND_R
    static unsigned int seed = time(NULL);

    result = rand_r(&seed);
#elif HAVE_RAND
    static FcBool initialized = FcFalse;

    if (initialized != FcTrue)
    {
	srand(time(NULL));
	initialized = FcTrue;
    }
    result = rand();
#else
# error no random number generator function available.
#endif

    return result;
}
Beispiel #9
0
static void *thread_worker(void *ctx)
{
	struct array_s allocations;

	if (0 == array_init(&allocations, sizeof(void *), 0)) {
		fprintf(stderr, "no mem\n");
		exit(1);
	}

	struct random_data rnd;
	memset(&rnd, 0, sizeof(rnd));
	char rnd_state[8];
	initstate_r(1, rnd_state, 8, &rnd);

	for (;;) {
		int32_t r;
		random_r(&rnd, &r);
		long alloc_size = 10 + r % 1024*20;

		while (memory_used_fn() + alloc_size >= limit && allocations.used) {

			/* delete half of our allocations */

			unsigned to_delete = allocations.used / 2;

			for (unsigned i = 0; i < to_delete; i++) {

				void **allocation_p = array_item_last(&allocations);
				if (!allocation_p) {
					break;
				}

				allocations.used--;
				zfree(*allocation_p);
			}
		}

		void *buf = zmalloc(alloc_size);
		if (!buf) {
			fprintf(stderr, "no mem\n");
			exit(1);
		}

		for (int i = 0; i < alloc_size; i++) {
			*((char *)buf + i) = 'a';
		}

		//memset(buf, 0x01, sizeof(alloc_size));

		*(void **)array_push(&allocations) = buf;

	}
}
Beispiel #10
0
static void randinit(uint32_t seed) {
#ifdef __APPLE__
  s_rand_is_seeded = true;
  srandom(seed);
#else
  if (s_state.state == RandomBuf::Uninit) {
    initstate_r(seed, s_state.buf, sizeof s_state.buf, &s_state.data);
  } else {
    srandom_r(seed, &s_state.data);
  }
  s_state.state = RandomBuf::RequestInit;
#endif
}
Beispiel #11
0
int main()
{
    int i, v;
    char state[8];
    struct random_data rnd;
    rnd.state = 0;
    initstate_r(0, state, sizeof(state), &rnd);
    for (i = 0; i < N; i++) {
        random_r(&rnd, &v);
        printf("%d\n", v%8);
    }
    return 0;
}
Beispiel #12
0
void random_generator::set_seed(int seed)
{
    seed++; //http://stackoverflow.com/questions/27386470/srand0-and-srand1-give-the-same-results
#ifdef HAVE_RANDOM_R
    memset(&m_data_blob, 0, sizeof(m_data_blob));
    memset(m_state_array, 0, sizeof(m_state_array));
    
    int ret = initstate_r(seed, m_state_array, sizeof(m_state_array), &m_data_blob);
    assert(ret == 0);
#elif (defined HAVE_DRAND48)
    memset(&m_data_blob, 0, sizeof(m_data_blob));
    memcpy(&m_data_blob, &seed, MIN(sizeof(seed), sizeof(m_data_blob)));
#endif
}
Beispiel #13
0
static void randinit(uint32_t seed) {
#ifdef __APPLE__
  s_rand_is_seeded = true;
  srandom(seed);
#elif defined(_MSC_VER)
  s_rand_is_seeded = true;
  srand(seed);
#else
  if (rl_state->state == RandomBuf::Uninit) {
    initstate_r(seed, rl_state->buf, sizeof rl_state->buf, &rl_state->data);
  } else {
    srandom_r(seed, &rl_state->data);
  }
  rl_state->state = RandomBuf::RequestInit;
#endif
}
void thename()
{
  int c = 0;
  int return_value;

  struct random_data* qq = static_cast<struct random_data*>(calloc(1,sizeof(struct random_data)));

  char* buf = static_cast<char *>(calloc(STATE_SIZE,sizeof(char)));
  initstate_r(69L,buf,STATE_SIZE,qq);

  for(int i = 0 ; i < (1<<28); i++)
  {
    random_r(qq,&return_value);
    c+= return_value;
  }
  printf("Thread returns c = %d\n",c);
}
Beispiel #15
0
/**
 * \return Random value between 0 and RAND_MAX
 *
 * This functions wraps around gnulib's random_r(). It performs a thread-safe seeding on the first use,
 * if not done before by wget_srandom();
 */
int wget_random(void)
{
	int32_t r;

	wget_thread_mutex_lock(&mutex);

	if (!seeded) {
		// seed random generator, used e.g. by Digest Authentication and --random-wait
		initstate_r((unsigned)(time(NULL) ^ getpid()), statebuf, sizeof(statebuf), &state);
		seeded = 1;
	}

	if (random_r(&state, &r))
		r = 0; // return 0 on failure

	wget_thread_mutex_unlock(&mutex);

	return (int)r;
}
Beispiel #16
0
void* random_printer(void *ptr)
{
    //get the seed that was passed into the thread
    int seed = (size_t)ptr;
    //create our random_data buff on the stack
    struct random_data buff = {};
    //create a place to store the result from random_r on the stack
    int32_t result =0;
    //create our statebuff for initState_r. Note: that statebuff must not be less than 8 bytes
    char statebuf[STATE_LEN];
    //init our state for random_r
    initstate_r(seed,statebuf,STATE_LEN,&buff);
    printf("%p\n",&buff);
    int i;
    for(i=0;i<10000;i++ ){
        //get our random numbers.
        random_r(&buff,&result);
        printf("%d\n",result);
    }
    pthread_exit(NULL);
}
int main()
{
  int c = 0;
  int return_value;

  struct random_data* qq = static_cast<struct random_data*>(calloc(1,sizeof(struct random_data)));

  char* buf = static_cast<char *>(calloc(STATE_SIZE,sizeof(char)));
  initstate_r(69L,buf,STATE_SIZE,qq);

  std::thread first(thename);

  for(int i = 0 ; i < (1<<28); i++)
  {
    random_r(qq,&return_value);
    c+= return_value;
  }
  printf("c is %d\n",c);

  first.join();

  return 0;
}
Beispiel #18
0
static int
virRandomOnceInit(void)
{
    unsigned int seed = time(NULL) ^ getpid();

#if 0
    /* Normally we want a decent seed.  But if reproducible debugging
     * of a fixed pseudo-random sequence is ever required, uncomment
     * this block to let an environment variable force the seed.  */
    const char *debug = virGetEnvBlockSUID("VIR_DEBUG_RANDOM_SEED");

    if (debug && virStrToLong_ui(debug, NULL, 0, &seed) < 0)
        return -1;
#endif

    if (initstate_r(seed,
                    randomState,
                    sizeof(randomState),
                    &randomData) < 0)
        return -1;

    return 0;
}
Beispiel #19
0
void rng_init() {
	initstate_r((unsigned int) time(NULL), (char *) rng_state_buffer,
			sizeof(rng_state_buffer), &rng_state);
}
Beispiel #20
0
static void *client(void *arg){
  tid_array[threadNumber-1] = (unsigned int)pthread_self();
  printf("Thread #%d in squatter stress!\n",threadNumber++);
  
  struct random_data rd;
  char rand_state[256];
  int32_t salt = time(0);

  rd.state = (int32_t*)rand_state;

  // Initialize the prng.  For testing, it may be helpful to reduce noise by 
  // temporarily setting this to a fixed value.
  initstate_r(salt, rand_state, sizeof(rand_state), &rd);

  while (!finished) {

    /* Pick a random operation, string, and ip */
    int32_t code;
    int rv = random_r(&rd, &code);
    int length = (code >> 2) & (64-1);
    char buf[64];
    int j;
    int32_t ip4_addr;
    
    if (rv) {
      printf("Failed to get random number - %d\n", rv);
      return NULL;
    }

    DEBUG_PRINT("Length is %d\n", length);
    memset(buf, 0, 64);

    /* Generate a random string in lowercase */
    for (j = 0; j < length; j+= 6) {
      int i;
      int32_t chars;

      rv = random_r(&rd, &chars);
      if (rv) {
        printf("Failed to get random number - %d\n", rv);
        return NULL;
      }

      for (i = 0; i < 6 && (i+j) < length; i++) {
        char val = ( (chars >> (5 * i)) & 31);
        if (val > 25)
          val = 25;
        buf[j+i] = 'a' + val;
      }
    }

    DEBUG_PRINT ("Random string is %s\n", buf);

    switch (code % 3) {
    case 0: // Search
      DEBUG_PRINT ("Search\n");
      search (buf, length, NULL);
      break;
    case 1: // insert
      DEBUG_PRINT ("insert\n");
      rv = random_r(&rd, &ip4_addr);
      if (rv) {
        printf("Failed to get random number - %d\n", rv);
        return NULL;
      }
      insert (buf, length, ip4_addr);
      break;
    case 2: // delete
      DEBUG_PRINT ("delete\n");
      delete (buf, length);
      break;
    default:
      assert(0);
    }
  }

  return NULL;
}
int main(int argc, char **argv){
	
	if(argc != 9){
		printf("Usage ./p4 N b c F B P S T %d\n", argc);
		exit(0);
	}
	
	N = atoi(argv[1]);
	b = atoi(argv[2]);
	c = atoi(argv[3]);
	F = atoi(argv[4]);
	B = atoi(argv[5]);
	P = atoi(argv[6]);
	S = atoi(argv[7]);
	T = atoi(argv[8]);
	
	node_list = (gossip_node*)malloc(sizeof(gossip_node)*N);
	neighbour_list = (gossip_node*)malloc(sizeof(gossip_node)*b);
		
	struct sockaddr_in remaddr;	
	socklen_t addrlen = sizeof(remaddr);		
	int recvlen;		
	unsigned char buf[BUFSIZE];	

	pthread_mutex_init(&mutex, NULL);
	
	/*Creating a socket*/
	if ((fd = socket(AF_INET, SOCK_DGRAM, 0)) < 0) {
		perror("socket failed\n");
		return 0;
	}

	memset((char *)&myaddr, 0, sizeof(myaddr));
	myaddr.sin_family = AF_INET;
	myaddr.sin_addr.s_addr = htonl(INADDR_ANY);
	myaddr.sin_port = htons(0);
	
	/*Binding to a socket*/
	if (bind(fd, (struct sockaddr *)&myaddr, sizeof(myaddr)) < 0) {
		perror("bind failed");
		return 0;
	}
	
	socklen_t len = sizeof(myaddr);
	if (getsockname(fd, (struct sockaddr *)&myaddr, &len) == -1)
		perror("getsockname");
	
	char hostname[1024];
	char ip[100];
	hostname[1023] = '\0';
	gethostname(hostname, 1023);
	printf("Hostname: %s\n", hostname);
	struct hostent* h;
	h = gethostbyname(hostname);
	hostname_to_ip(h->h_name,ip);
	printf("IP Address: %s\n", ip);
	printf("Port number %d\n", ntohs(myaddr.sin_port));	
	
	
	/*Reading lines in endpoints.txt file */
	FILE *fp1= fopen("endpoints.txt", "ab+");
	int lines = 0;
	char ch;
	while(!feof(fp1)){
		ch = fgetc(fp1);
		if(ch == '\n'){
			lines++;
		}
	}
	
	my_line_number = lines;
	
	/* Creating 2 random buffers based on 2 different seeds [S, S+I] */
	char *rand_buf1 = (char*)calloc(64, sizeof(char));
	char *rand_buf2 = (char*)calloc(64, sizeof(char));
	si_buf = (struct random_data*)calloc(1,sizeof(struct random_data));
	s_buf = (struct random_data*)calloc(1,sizeof(struct random_data));
	initstate_r(S+my_line_number,rand_buf1, 64, si_buf);
	initstate_r(S,rand_buf2, 64, s_buf);
	srandom_r(S+my_line_number, si_buf);
	srandom_r(S, s_buf);
	
	fclose(fp1);
	FILE *fp = fopen("endpoints.txt", "ab+");
	int i;
	size_t buffsize = 150;
	char *line = malloc(sizeof(char)*buffsize);
	
	/*Last node check */
	if(lines == N-1){
		/*Send OK to all the other nodes*/
		fprintf(fp, "%s:%d\n", ip, ntohs(myaddr.sin_port));
		rewind(fp);
		for (i=0; i < N-1; i++) {
			int num = getline(&line, &buffsize, fp);
			printf("Line: %s\n",line);
			char ip[100];
			char port[50];
			int ipdone = 0;
			int j;
			int w;
			for(w=0; w<num; w++){
				if(line[w] != ':' && !ipdone)
					ip[w] = line[w];
				else{
					ipdone = 1;
					ip[w] = '\0';
					j = ++w;
					break;
				}
			}
			int k;
			for(w=0, k=j; k<num; w++, k++){
				port[w] = line[k];
			}
			port[w] = '\0';
			
			memset((char *) &remaddr, 0, sizeof(remaddr));
			remaddr.sin_family = AF_INET;
			remaddr.sin_port = htons(atoi(port));
			remaddr.sin_addr.s_addr = inet_addr(ip);
			sprintf(buf, "OK");
			sendto(fd, buf, strlen(buf), 0, (struct sockaddr *)&remaddr, addrlen);
		}
		fclose(fp);
	} else {
		/*Not the last node - add to endpoints file and wait for OK */
		fprintf(fp, "%s:%d\n", ip, ntohs(myaddr.sin_port));
		fclose(fp);
		recvlen = recvfrom(fd, buf, BUFSIZE, 0, (struct sockaddr *)&remaddr, &addrlen);
		printf("Receiver IP : %s\n", inet_ntoa(remaddr.sin_addr));
		printf("received %d bytes\n", recvlen);
		if (recvlen > 0) {
			buf[recvlen] = 0;
			printf("received message: \"%s\"\n", buf);
		}
	}
	
	/*OK received - creating node_list from endpoints file */
	FILE *fp2 = fopen("endpoints.txt", "ab+");
	for (i=0; i < N; i++) {
		int num = getline(&line, &buffsize, fp);
		char ip[100];
		char port[50];
		int ipdone = 0;
		int j;
		int w;
		for(w=0; w<num; w++){
			if(line[w] != ':' && !ipdone)
				ip[w] = line[w];
			else{
				ipdone = 1;
				ip[w] = '\0';
				j = ++w;
				break;
			}
		}
		int k;
		for(w=0, k=j; k<num; w++, k++){
			port[w] = line[k];
		}
		port[w] = '\0';
		gossip_node new_node;
		new_node.port = atoi(port);
		new_node.status = 1;
		new_node.heartbeat = 0;
		strcpy(new_node.ip, ip);
		node_list[i] = new_node;
	}
	
	for(i=0; i<N; i++){
		printf("Node %d: %s %d %d %d\n",i, node_list[i].ip, node_list[i].port, node_list[i].status, node_list[i].heartbeat);
	}
	printf("\n\n");
	
	pthread_t serverthread;
	
	/* Starting server thread */
	pthread_create(&serverthread,NULL, server_handler, &myaddr);
	i=0;
	int send_msges = 1;
	
	/* Sending messages for c iterations */
	while(1){
		
		if(send_msges){
			pthread_mutex_lock(&mutex);
			int j;
			int neighbour_count = 0;
			/*Randomly find b neighbours to send a message*/
			while(neighbour_count < b){
				int32_t send_index;
				random_r(si_buf, &send_index);
				send_index = send_index%N;
				//printf("Random Index : %d\n", send_index);
				if(!contains_neighbour(send_index, neighbour_list, neighbour_count)){
					gossip_node new_node;
					new_node.port = node_list[send_index].port;
					new_node.status = node_list[send_index].status;
					new_node.heartbeat = node_list[send_index].heartbeat;
					strcpy(new_node.ip, node_list[send_index].ip);
					neighbour_list[neighbour_count] = new_node;
					neighbour_count++;
				}
			}
			for(j=0; j<b; j++){
				memset((char *) &remaddr, 0, sizeof(remaddr));
				remaddr.sin_family = AF_INET;
				remaddr.sin_port = htons(neighbour_list[j].port);
				remaddr.sin_addr.s_addr = inet_addr(neighbour_list[j].ip);
				//printf("Sending packet %d to %s port %d\n", j, neighbour_list[j].ip, neighbour_list[j].port );
				//sprintf(buf, "Sending list");
				char buffer[50*N];
				node_list_to_char_arr(node_list, buffer, N);
				sendto(fd, buffer, strlen(buffer), 0, (struct sockaddr *)&remaddr, addrlen);
			}
			pthread_mutex_unlock(&mutex);	
		}
		/*Check localClock for failing myself */
		if(send_msges &&  localClock !=0 && localClock%P == 0){
			if(get_fail_count() < B && fail_myself()){
				printf("FAILING MYSELF %d\n",localClock);
				send_msges = 0;
				node_list[my_line_number].status = 0;
			}
		}
		i++;
		sleep(1);
		localClock++;
		printf("Localclock : %d\n", localClock);
		node_list[my_line_number].heartbeat = localClock;
		
		/*If c iterations completed or Time T is reached exit the send loop */
		if(i==c || localClock >= T)
			break;
	}
	
	/*If c iterations completed before T, wait till localClock reaches T seconds */
	while(localClock < T){
		sleep(1);
		localClock++;
	}
	
	/*Write the final output to listX file */
	char fileName[10];
	sprintf(fileName, "list%d.txt", my_line_number);
	FILE *fp_new = fopen(fileName, "ab+");
	fprintf(fp_new, "%s\n", node_list[my_line_number].status == 0 ? "FAIL" : "OK");
	int index;
	for(i=0; i<N; i++){
		fprintf(fp_new, "%d %d\n", i, node_list[i].heartbeat);
	}
	fclose(fp_new);
	
	for(i=0; i<N; i++){
		printf("FINAL NODE LIST\n");
		printf("Node %d: IP-%s Port-%d Status-%d Heartbeat-%d\n",i, node_list[i].ip, node_list[i].port, node_list[i].status, node_list[i].heartbeat);
	}
}
Beispiel #22
0
int main(int argc, char **argv) {

	struct global *wps;
	if ((wps = calloc(1, sizeof(struct global)))) {
		wps->pke     = 0;
		wps->pkr     = 0;
		wps->e_hash1 = 0;
		wps->e_hash2 = 0;
		wps->authkey = 0;
		wps->e_nonce = 0;
		wps->r_nonce = 0;
		wps->e_bssid = 0;
		wps->psk1    = 0;
		wps->psk2    = 0;
		wps->dhkey   = 0;
		wps->kdk     = 0;
		wps->wrapkey = 0;
		wps->emsk    = 0;
		wps->e_s1    = 0;
		wps->e_s2    = 0;
		wps->bruteforce = false;
		wps->verbosity = 2;
		wps->error = calloc(256, 1); if (!wps->error) goto memory_err;
		wps->error[0] = '\n';
	} else {
		memory_err:
			fprintf(stderr, "\n [X] Memory allocation error!\n");
			return MEM_ERROR;
	}

	int opt = 0;
	int long_index = 0;
	opt = getopt_long(argc, argv, option_string, long_options, &long_index);

	while (opt != -1) {
		switch (opt) {
			case 'e':
				wps->pke = malloc(WPS_PUBKEY_LEN);
				if (!wps->pke)
					goto memory_err;
				if (hex_string_to_byte_array(optarg, wps->pke, WPS_PUBKEY_LEN)) {
					snprintf(wps->error, 256, "\n [!] Bad enrollee public key -- %s\n\n", optarg);
					goto usage_err;
				}
				break;
			case 'r':
				wps->pkr = malloc(WPS_PUBKEY_LEN);
				if (!wps->pkr)
					goto memory_err;
				if (hex_string_to_byte_array(optarg, wps->pkr, WPS_PUBKEY_LEN)) {
					snprintf(wps->error, 256, "\n [!] Bad registrar public key -- %s\n\n", optarg);
					goto usage_err;
				}
				break;
			case 's':
				wps->e_hash1 = malloc(WPS_HASH_LEN);
				if (!wps->e_hash1)
					goto memory_err;
				if (hex_string_to_byte_array(optarg, wps->e_hash1, WPS_HASH_LEN)) {
					snprintf(wps->error, 256, "\n [!] Bad hash -- %s\n\n", optarg);
					goto usage_err;
				}
				break;
			case 'z':
				wps->e_hash2 = malloc(WPS_HASH_LEN);
				if (!wps->e_hash2)
					goto memory_err;
				if (hex_string_to_byte_array(optarg, wps->e_hash2, WPS_HASH_LEN)) {
					snprintf(wps->error, 256, "\n [!] Bad hash -- %s\n\n", optarg);
					goto usage_err;
				}
				break;
			case 'a':
				wps->authkey = malloc(WPS_AUTHKEY_LEN);
				if (!wps->authkey)
					goto memory_err;
				if (hex_string_to_byte_array(optarg, wps->authkey, WPS_HASH_LEN)) {
					snprintf(wps->error, 256, "\n [!] Bad authentication session key -- %s\n\n", optarg);
					goto usage_err;
				}
				break;
			case 'n':
				wps->e_nonce = malloc(WPS_NONCE_LEN);
				if (!wps->e_nonce)
					goto memory_err;
				if (hex_string_to_byte_array(optarg, wps->e_nonce, WPS_NONCE_LEN)) {
					snprintf(wps->error, 256, "\n [!] Bad enrollee nonce -- %s\n\n", optarg);
					goto usage_err;
				}
				break;
			case 'm':
				wps->r_nonce = malloc(WPS_NONCE_LEN);
				if (!wps->r_nonce)
					goto memory_err;
				if (hex_string_to_byte_array(optarg, wps->r_nonce, WPS_NONCE_LEN)) {
					snprintf(wps->error, 256, "\n [!] Bad registrar nonce -- %s\n\n", optarg);
					goto usage_err;
				}
				break;
			case 'b':
				wps->e_bssid = malloc(WPS_BSSID_LEN);
				if (!wps->e_bssid)
					goto memory_err;
				if (hex_string_to_byte_array(optarg, wps->e_bssid, WPS_BSSID_LEN)) {
					snprintf(wps->error, 256, "\n [!] Bad enrollee MAC address -- %s\n\n", optarg);
					goto usage_err;
				}
				break;
			case 'S':
				wps->small_dh_keys = true;
				break;
			case 'f':
				wps->bruteforce = true;
				break;
			case 'v':
				if (get_int(optarg, &wps->verbosity) != 0 || wps->verbosity < 1 || 3 < wps->verbosity) {
					snprintf(wps->error, 256, "\n [!] Bad verbosity level -- %s\n\n", optarg);
					goto usage_err;
				};
				break;
			case 'h':
				goto usage_err;
			case '?':
			default:
				fprintf(stderr, "%s -h for help\n", argv[0]);
				return ARG_ERROR;
		}
		opt = getopt_long(argc, argv, option_string, long_options, &long_index);
	}

	/* Not all required arguments have been supplied */
	if (wps->pke == 0 || wps->e_hash1 == 0 || wps->e_hash2 == 0) {
		wps->error = "\n [!] Not all required arguments have been supplied!\n\n";

		usage_err:
			fprintf(stderr, usage, VERSION, argv[0], wps->error);
			return ARG_ERROR;
	}

	/* If --dh-small is selected then no --pkr should be supplied */
	if (wps->pkr && wps->small_dh_keys) {
		wps->error = "\n [!] Options --dh-small and --pkr are mutually exclusive!\n\n";
		goto usage_err;
	}

	/* Either --pkr or --dh-small must be specified */
	if (!wps->pkr && !wps->small_dh_keys) {
		wps->error = "\n [!] Either --pkr or --dh-small must be specified!\n\n";
		goto usage_err;
	}

	if (wps->small_dh_keys) { /* Small DH keys selected */
		wps->pkr = malloc(WPS_PUBKEY_LEN);
		if (!wps->pkr)
			goto memory_err;

		/* g^A mod p = 2 (g = 2, A = 1, p > 2) */
		memset(wps->pkr, 0, WPS_PUBKEY_LEN - 1);
		wps->pkr[WPS_PUBKEY_LEN - 1] = 0x02;

		if (!wps->authkey) {
			if (wps->e_nonce) {
				if (wps->r_nonce) {
					if (wps->e_bssid) { /* Computing AuthKey */
						wps->dhkey = malloc(WPS_HASH_LEN);
						if (!wps->dhkey)
							goto memory_err;
						wps->kdk = malloc(WPS_HASH_LEN);
						if (!wps->kdk)
							goto memory_err;

						unsigned char *buffer = malloc(WPS_NONCE_LEN * 2 + WPS_BSSID_LEN);
						if (!buffer)
							goto memory_err;

						/* DHKey = SHA-256(g^(AB) mod p) = SHA-256(PKe^A mod p) = SHA-256(PKe) (g = 2, A = 1, p > 2) */
						sha256(wps->pke, WPS_PUBKEY_LEN, wps->dhkey);

						memcpy(buffer, wps->e_nonce, WPS_NONCE_LEN);
						memcpy(buffer + WPS_NONCE_LEN, wps->e_bssid, WPS_BSSID_LEN);
						memcpy(buffer + WPS_NONCE_LEN + WPS_BSSID_LEN, wps->r_nonce, WPS_NONCE_LEN);

						/* KDK = HMAC-SHA-256{DHKey}(Enrollee nonce || Enrollee MAC || Registrar nonce) */
						hmac_sha256(wps->dhkey, WPS_HASH_LEN, buffer, WPS_NONCE_LEN * 2 + WPS_BSSID_LEN, wps->kdk);

						buffer = realloc(buffer, WPS_HASH_LEN * 3);
						if (!buffer)
							goto memory_err;

						/* Key derivation function */
						kdf(wps->kdk, WPS_AUTHKEY_LEN + WPS_KEYWRAPKEY_LEN + WPS_EMSK_LEN, buffer);

						wps->authkey = malloc(WPS_AUTHKEY_LEN);
						if (!wps->authkey)
							goto memory_err;

						memcpy(wps->authkey, buffer, WPS_AUTHKEY_LEN);
						
						if (wps->verbosity > 2) {
							wps->wrapkey = malloc(WPS_KEYWRAPKEY_LEN);
							if (!wps->wrapkey)
								goto memory_err;
							wps->emsk = malloc(WPS_EMSK_LEN);
							if (!wps->emsk)
								goto memory_err;

							memcpy(wps->wrapkey, buffer + WPS_AUTHKEY_LEN, WPS_KEYWRAPKEY_LEN);
							memcpy(wps->emsk, buffer + WPS_AUTHKEY_LEN + WPS_KEYWRAPKEY_LEN, WPS_EMSK_LEN);
						}
						if (wps->verbosity < 3) {
							free(wps->dhkey);
							free(wps->kdk);
						}
						free(buffer);
					} else {
						wps->error = "\n [!] Neither --authkey and --e-bssid have been supplied!\n\n";
						goto usage_err;
					}
				} else {
					wps->error = "\n [!] Neither --authkey and --r-nonce have been supplied!\n\n";
					goto usage_err;
				}
			} else {
				wps->error = "\n [!] Neither --authkey and --e-nonce have been supplied!\n\n";
				goto usage_err;
			}
		}
	}

	/* E-S1 = E-S2 = 0 */
	wps->e_s1 = calloc(WPS_SECRET_NONCE_LEN, 1); if (!wps->e_s1) goto memory_err;
	wps->e_s2 = calloc(WPS_SECRET_NONCE_LEN, 1); if (!wps->e_s2) goto memory_err;

	/* Allocating memory for digests */
	wps->psk1 = malloc(WPS_HASH_LEN); if (!wps->psk1) goto memory_err;
	wps->psk2 = malloc(WPS_HASH_LEN); if (!wps->psk2) goto memory_err;

	unsigned char *result = (unsigned char *) malloc(WPS_HASH_LEN);
	if (!result)
		goto memory_err;
	unsigned char *buffer = (unsigned char *) malloc(WPS_SECRET_NONCE_LEN + WPS_PSK_LEN + WPS_PUBKEY_LEN * 2);
	if (!buffer)
		goto memory_err;

	uint32_t seed;
	uint32_t print_seed; /* Seed to display at the end */
	unsigned int first_half;
	unsigned int second_half;
	unsigned char s_pin[4] = {0};
	bool valid = false;

	int mode = 1; bool found = false;
	struct timeval t0, t1;

	gettimeofday(&t0, 0);

	while (mode <= MAX_MODE && !found) {

		seed = 0; print_seed = 0;

		/* ES-1 = ES-2 = E-Nonce */
		if (mode == 2 && wps->e_nonce) {
			memcpy(wps->e_s1, wps->e_nonce, WPS_SECRET_NONCE_LEN);
			memcpy(wps->e_s2, wps->e_nonce, WPS_SECRET_NONCE_LEN);
		}

		/* PRNG bruteforce (rand_r) */
		if (mode == 3 && wps->e_nonce) {

			/* Reducing entropy from 32 to 25 bits */
			uint32_t index = wps->e_nonce[0] << 25;
			uint32_t limit = index | 0x01ffffff;

			while (1) {
				seed = index;

				int i;
				for (i = 1; i < WPS_NONCE_LEN; i++) {
					if (wps->e_nonce[i] != (unsigned char) rand_r(&seed)) break;
				}

				if (i == WPS_NONCE_LEN) { /* Seed found */
					print_seed = seed;

					/* Advance to get ES-1 */
					for (i = 0; i < WPS_SECRET_NONCE_LEN; i++)
						wps->e_s1[i] = (unsigned char) rand_r(&seed);

					/* Advance to get ES-2 */
					for (i = 0; i < WPS_SECRET_NONCE_LEN; i++)
						wps->e_s2[i] = (unsigned char) rand_r(&seed);

					break;
				}

				if (index == limit) break; /* Complete bruteforce exausted */

				index++;
			}
		}

		/* PRNG bruteforce (random_r) */
		if (mode == 4 && wps->e_nonce) {

			/* Checks if the sequence may actually be generated by current random function */
			if (wps->e_nonce[0] < 0x80 && wps->e_nonce[4] < 0x80 && wps->e_nonce[8] < 0x80  && wps->e_nonce[12] < 0x80) {

				valid = true;

				/* Converting enrollee nonce to the sequence may be generated by current random function */
				uint32_t randr_enonce[4] = {0};
				int j = 0;
				for (int i = 0; i < 4; i++) {
					randr_enonce[i] |= wps->e_nonce[j++];
					randr_enonce[i] <<= 8;
					randr_enonce[i] |= wps->e_nonce[j++];
					randr_enonce[i] <<= 8;
					randr_enonce[i] |= wps->e_nonce[j++];
					randr_enonce[i] <<= 8;
					randr_enonce[i] |= wps->e_nonce[j++];
				}

				uint32_t limit;
				struct timeval curr_time;
				gettimeofday(&curr_time, 0);

				if (wps->bruteforce) {
					seed = curr_time.tv_sec + SEC_PER_DAY * MODE4_DAYS - SEC_PER_HOUR * 2;
					limit = 0;
				} else {
					seed = curr_time.tv_sec + SEC_PER_HOUR * 2;
					limit = curr_time.tv_sec - SEC_PER_DAY * MODE4_DAYS - SEC_PER_HOUR * 2;
				}

				struct random_data *buf = (struct random_data *) calloc(1, sizeof(struct random_data));
				char *rand_statebuf = (char *) calloc(1, 128);
				initstate_r(seed, rand_statebuf, 128, buf);
				int32_t res = 0;

				while (1) {
					srandom_r(seed, buf);

					int i;
					for (i = 0; i < 4; i++) {
						random_r(buf, &res);
						if (res != randr_enonce[i]) break;
					}

					if (i == 4) {
						print_seed = seed;
						srandom_r(print_seed + 1, buf);
						for (int i = 0; i < 4; i++) {
							random_r(buf, &res);
							uint32_t be = __be32_to_cpu(res);
							memcpy(&(wps->e_s1[4 * i]), &be, 4);
							memcpy(wps->e_s2, wps->e_s1, WPS_SECRET_NONCE_LEN); /* ES-1 = ES-2 != E-Nonce */
						}
					}

					if (print_seed || seed == limit) {
						free(buf);
						free(rand_statebuf);
						break;
					}

					seed--;
				}
			}
		}

		/* WPS pin cracking */
		if (mode == 1 || (mode == 2 && wps->e_nonce) || (mode == 3 && print_seed) || (mode == 4 && print_seed)) {
crack:
			first_half = 0; second_half = 0;

			while (first_half < 10000) {
				uint_to_char_array(first_half, 4, s_pin);
				hmac_sha256(wps->authkey, WPS_AUTHKEY_LEN, (unsigned char *) s_pin, 4, wps->psk1);
				memcpy(buffer, wps->e_s1, WPS_SECRET_NONCE_LEN);
				memcpy(buffer + WPS_SECRET_NONCE_LEN, wps->psk1, WPS_PSK_LEN);
				memcpy(buffer + WPS_SECRET_NONCE_LEN + WPS_PSK_LEN, wps->pke, WPS_PUBKEY_LEN);
				memcpy(buffer + WPS_SECRET_NONCE_LEN + WPS_PSK_LEN + WPS_PUBKEY_LEN, wps->pkr, WPS_PUBKEY_LEN);
				hmac_sha256(wps->authkey, WPS_AUTHKEY_LEN, buffer, WPS_SECRET_NONCE_LEN + WPS_PSK_LEN + WPS_PUBKEY_LEN * 2, result);

				if (memcmp(result, wps->e_hash1, WPS_HASH_LEN)) {
					first_half++;
				} else {
					break;
				}
			}

			if (first_half < 10000) { /* First half found */
				unsigned char checksum_digit;
				unsigned int c_second_half;

				/* Testing with checksum digit */
				while (second_half < 1000) {
					checksum_digit = wps_pin_checksum(first_half * 1000 + second_half);
					c_second_half = second_half * 10 + checksum_digit;
					uint_to_char_array(c_second_half, 4, s_pin);
					hmac_sha256(wps->authkey, WPS_AUTHKEY_LEN, (unsigned char *) s_pin, 4, wps->psk2);
					memcpy(buffer, wps->e_s2, WPS_SECRET_NONCE_LEN);
					memcpy(buffer + WPS_SECRET_NONCE_LEN, wps->psk2, WPS_PSK_LEN);
					memcpy(buffer + WPS_SECRET_NONCE_LEN + WPS_PSK_LEN, wps->pke, WPS_PUBKEY_LEN);
					memcpy(buffer + WPS_SECRET_NONCE_LEN + WPS_PSK_LEN + WPS_PUBKEY_LEN, wps->pkr, WPS_PUBKEY_LEN);
					hmac_sha256(wps->authkey, WPS_AUTHKEY_LEN, buffer, WPS_SECRET_NONCE_LEN + WPS_PSK_LEN + WPS_PUBKEY_LEN * 2, result);

					if (memcmp(result, wps->e_hash2, WPS_HASH_LEN)) {
						second_half++;
					} else {
						second_half = c_second_half;
						found = true;
						break;
					}
				}

				/* Testing without checksum digit */
				if (!found) {
					second_half = 0;

					while (second_half < 10000) {

						/* If already tested skip */
						if (wps_pin_valid(first_half * 10000 + second_half)) {
							second_half++;
							continue;
						}

						uint_to_char_array(second_half, 4, s_pin);
						hmac_sha256(wps->authkey, WPS_AUTHKEY_LEN, (unsigned char *) s_pin, 4, wps->psk2);
						memcpy(buffer, wps->e_s2, WPS_SECRET_NONCE_LEN);
						memcpy(buffer + WPS_SECRET_NONCE_LEN, wps->psk2, WPS_PSK_LEN);
						memcpy(buffer + WPS_SECRET_NONCE_LEN + WPS_PSK_LEN, wps->pke, WPS_PUBKEY_LEN);
						memcpy(buffer + WPS_SECRET_NONCE_LEN + WPS_PSK_LEN + WPS_PUBKEY_LEN, wps->pkr, WPS_PUBKEY_LEN);
						hmac_sha256(wps->authkey, WPS_AUTHKEY_LEN, buffer, WPS_SECRET_NONCE_LEN + WPS_PSK_LEN + WPS_PUBKEY_LEN * 2, result);

						if (memcmp(result, wps->e_hash2, WPS_HASH_LEN)) {
							second_half++;
						} else {
							found = true;
							break;
						}
					}
				}
			}
		}

		/* E-S1 = E-Nonce != E-S2 */
		if (mode == 4 && print_seed && !found) {
			memcpy(wps->e_s1, wps->e_nonce, WPS_SECRET_NONCE_LEN);
			mode++;
			goto crack;
		}

		mode++;
	}

	gettimeofday(&t1, 0);
	long elapsed_s = t1.tv_sec - t0.tv_sec;
	mode--;

	printf("\n Pixiewps %s\n", VERSION);

	if (found) {
		if (wps->e_nonce) {
			if ((mode == 3 || mode == 4) && wps->verbosity > 2) {
				printf("\n [*] PRNG Seed:  %u", print_seed);
			}
			if (mode == 4 && wps->verbosity > 2) {
				time_t seed_time;
				struct tm ts;
				char buffer[30];

				seed_time = print_seed;
				ts = *localtime(&seed_time);
				strftime(buffer, 30, "%c", &ts);
				printf(" (%s)", buffer);
			}
		}
		if (wps->verbosity > 2) {
			if (wps->dhkey) { /* To see if AuthKey was supplied or not */
				printf("\n [*] DHKey:      "); byte_array_print(wps->dhkey, WPS_HASH_LEN);
				printf("\n [*] KDK:        "); byte_array_print(wps->kdk, WPS_HASH_LEN);
				printf("\n [*] AuthKey:    "); byte_array_print(wps->authkey, WPS_AUTHKEY_LEN);
				printf("\n [*] EMSK:       "); byte_array_print(wps->emsk, WPS_EMSK_LEN);
				printf("\n [*] KeyWrapKey: "); byte_array_print(wps->wrapkey, WPS_KEYWRAPKEY_LEN);
			}
			printf("\n [*] PSK1:       "); byte_array_print(wps->psk1, WPS_PSK_LEN);
			printf("\n [*] PSK2:       "); byte_array_print(wps->psk2, WPS_PSK_LEN);
		}
		if (wps->verbosity > 1) {
			printf("\n [*] E-S1:       "); byte_array_print(wps->e_s1, WPS_SECRET_NONCE_LEN);
			printf("\n [*] E-S2:       "); byte_array_print(wps->e_s2, WPS_SECRET_NONCE_LEN);
		}
		printf("\n [+] WPS pin:    %04u%04u", first_half, second_half);
	} else {
		printf("\n [-] WPS pin not found!");
	}
	printf("\n\n [*] Time taken: %lu s\n\n", elapsed_s);

	if (!found && mode == 4 && valid && !wps->bruteforce) {
		printf(" [!] The AP /might be/ vulnerable to mode 4. Try again with --force or with another (newer) set of data.\n\n");
	}

	free(result);
	free(buffer);

	free(wps->pke);
	free(wps->pkr);
	free(wps->e_hash1);
	free(wps->e_hash2);
	free(wps->authkey);
	free(wps->e_nonce);
	free(wps->r_nonce);
	free(wps->e_bssid);
	free(wps->psk1);
	free(wps->psk2);
	free(wps->e_s1);
	free(wps->e_s2);
	free(wps->error);

	if (wps->verbosity > 2) {
		free(wps->dhkey);
		free(wps->kdk);
		free(wps->wrapkey);
		free(wps->emsk);
	}

	free(wps);

	return (!found); /* 0 success, 1 failure */
}
Beispiel #23
0
void *index_file (void *arg)
{
int line = 0, found = 0, cnt = 0, cachecnt, idx;
int ch, len = 0, slot, type = 0;
unsigned char key[ARTmaxkey];
struct random_data buf[1];
ThreadArg *args = arg;
ARTthread *thread;
uint counts[8][2];
uchar state[64];
uint next[1];
ulong offset;
int vallen;
ARTval *val;
uint size;
FILE *in;

	if( args->idx < strlen (args->type) )
		ch = args->type[args->idx];
	else
		ch = args->type[strlen(args->type) - 1];

	thread = ARTnewthread(args->trie, ARTdepth);

	switch(ch | 0x20)
	{
	case '4':	// 4 byte random keys
		size = atoi(args->infile);
		memset (buf, 0, sizeof(buf));
		initstate_r(args->idx * 100 + 100, state, 64, buf);
		for( line = 0; line < size; line++ ) {
		random_r(buf, next);

			key[0] = next[0];
			next[0] >>= 8;
			key[1] = next[0];
			next[0] >>= 8;
			key[2] = next[0];
			next[0] >>= 8;
			key[3] = next[0];
			ARTinsert (thread, key, 4, 4);
		}
		break;

	case '8':	// 8 byte random keys of random length
		size = atoi(args->infile);
		memset (buf, 0, sizeof(buf));
		initstate_r(args->idx * 100 + 100, state, 64, buf);
		for( line = 0; line < size; line++ ) {
		random_r(buf, next);

			key[0] = next[0];
			next[0] >>= 8;
			key[1] = next[0];
			next[0] >>= 8;
			key[2] = next[0];
			next[0] >>= 8;
			key[3] = next[0];

		random_r(buf, next);

			key[4] = next[0];
			next[0] >>= 8;
			key[5] = next[0];
			next[0] >>= 8;
			key[6] = next[0];
			next[0] >>= 8;
			key[7] = next[0];

			if( ARTinsert (thread, key, (line % 8) + 1, 8) )
				found++;
		}
		fprintf(stderr, "finished %s for %d keys, duplicates %d\n", args->infile, line, found);
		break;

	case 'y':	// 8 byte random keys of random length
		size = atoi(args->infile);
		memset (buf, 0, sizeof(buf));
		initstate_r(args->idx * 100 + 100, state, 64, buf);
		for( line = 0; line < size; line++ ) {
		random_r(buf, next);

			key[0] = next[0];
			next[0] >>= 8;
			key[1] = next[0];
			next[0] >>= 8;
			key[2] = next[0];
			next[0] >>= 8;
			key[3] = next[0];

		random_r(buf, next);

			key[4] = next[0];
			next[0] >>= 8;
			key[5] = next[0];
			next[0] >>= 8;
			key[6] = next[0];
			next[0] >>= 8;
			key[7] = next[0];

			if( ARTfindkey (thread, key, line % 8 + 1) )
				found++;
		}
		fprintf(stderr, "finished %s for %d keys, found %d\n", args->infile, line, found);
		break;

	case 'x':	// find 4 byte random keys
		size = atoi(args->infile);
		memset (buf, 0, sizeof(buf));
		initstate_r(args->idx * 100 + 100, state, 64, buf);
		for( line = 0; line < size; line++ ) {
		random_r(buf, next);

			key[0] = next[0];
			next[0] >>= 8;
			key[1] = next[0];
			next[0] >>= 8;
			key[2] = next[0];
			next[0] >>= 8;
			key[3] = next[0];
			if( ARTfindkey (thread, key, 4) )
				found++;
		}
		fprintf(stderr, "finished %s for %d keys, found %d\n", args->infile, line, found);
		break;

	case 'd':
//		type = Delete;

	case 'p':
//		if( !type )
//			type = Unique;

//		 if( type == Delete )
//		  fprintf(stderr, "started pennysort delete for %s\n", args->infile);
//		 else
		  fprintf(stderr, "started pennysort insert for %s\n", args->infile);

		if( in = fopen (args->infile, "rb") )
		  while( ch = getc(in), ch != EOF )
			if( ch == '\n' )
			{
			  line++;

			  if( len > 10 ) {
			    offset = art_space (thread, len - 10 + sizeof(ARTval));
			    val = (ARTval *)(Arena + offset);
			    memcpy (val->value, key + 10, len - 10);
			    val->len = len - 10;
			  } else
				offset = 1;

			  if( ARTinsert (thread, key, 10, offset) )
				  fprintf(stderr, "Duplicate key source: %d\n", line), exit(0);
			  len = 0;
			  continue;
			}

		    else if( len < ARTmaxkey )
			  key[len++] = ch;
		fprintf(stderr, "finished %s for %d keys\n", args->infile, line);
		break;

	case 'w':
		fprintf(stderr, "started indexing for %s\n", args->infile);
		if( in = fopen (args->infile, "r") )
		  while( ch = getc(in), ch != EOF )
			if( ch == '\n' )
			{
			  line++;

			  ARTinsert (thread, key, len, 1);
			  len = 0;
			}
			else if( len < ARTmaxkey )
				key[len++] = ch;

		fprintf(stderr, "finished %s for %d keys\n", args->infile, line);
		break;

	case 'f':
		fprintf(stderr, "started finding keys for %s\n", args->infile);
		if( in = fopen (args->infile, "rb") )
		  while( ch = getc(in), ch != EOF )
			if( ch == '\n' )
			{
			  line++;
			  if( ARTfindkey (thread, key, len) )
				found++;
			  len = 0;
			}
			else if( len < ARTmaxkey )
				key[len++] = ch;
		fprintf(stderr, "finished %s for %d keys, found %d\n", args->infile, line, found);
		break;

	case 's':
		fprintf(stderr, "started forward scan\n");
		ARTstartkey (thread, NULL, 0);

		while( len = ARTnextkey (thread, key, ARTmaxkey) ) {
		  fwrite (key, len, 1, stdout);
		  val = thread->cursor->value;
		  if( val->len )
			fwrite (val->value, val->len, 1, stdout);
		  fputc ('\n', stdout);
		  cnt++;
	    }

		fprintf(stderr, " Total keys read %d\n", cnt);
		break;

	case 'r':
		fprintf(stderr, "started reverse scan\n");
		ARTlastkey (thread, NULL, 0);

		while( len = ARTprevkey (thread, key, ARTmaxkey) ) {
		  fwrite (key, len, 1, stdout);
		  val = thread->cursor->value;
		  if( val->len )
			fwrite (val->value, val->len, 1, stdout);
		  fputc ('\n', stdout);
		  cnt++;
	    }

		fprintf(stderr, " Total keys read %d\n", cnt);
		break;
	}

	return NULL;
}
Beispiel #24
0
static
void* update_thread(void* data)
{
	struct timespec ts;
	int ret;
	unsigned int diff, ntot, seed;
	struct gtec_device* gtdev = data;
	pthread_mutex_t* lock = &(gtdev->updatelock);
	struct random_data rdata = {.rand_type = 0};
	int32_t randnum = 0;
	char state[128] = {0};

	// Initialize random generator
	clock_gettime(CLOCK_REALTIME, &ts);
	seed = ts.tv_nsec;
	initstate_r(seed, state, sizeof(state), &rdata);

	// Wait for acquisition start
	pthread_mutex_lock(&acqlock);
	while (!acquiring) {
		pthread_cond_wait(&acqcond, &acqlock);	
	}
	pthread_mutex_unlock(&acqlock);
	
	memcpy(&ts, &org, sizeof(ts));
	random_r(&rdata, &randnum);
	addtime(&ts, 0, 7000000 + randnum/2500);

	pthread_mutex_lock(lock);
	while (gtdev->running) {
		ret = pthread_cond_timedwait(&gtdev->cond, lock, &ts);
		if (ret == ETIMEDOUT) {
			diff = difftime_ms(&ts, &org);
			ntot = (diff*gtdev->conf.sample_rate)/1000;
			gtdev->nsample = ntot;

			pthread_mutex_unlock(lock);
			gtdev->callback(gtdev->callback_data);
			random_r(&rdata, &randnum);
			addtime(&ts, 0, 7000000 + randnum/2500);
			pthread_mutex_lock(lock);
		}
	}
	pthread_mutex_unlock(lock);

	return NULL;	
}


API_EXPORTED
void GT_ShowDebugInformation( gt_bool show )
{
	(void)show;	
}


API_EXPORTED
gt_bool   GT_UpdateDevices()
{
	static int isinit = 0;
	int i;

	if (isinit)
		return GT_TRUE;

	for (i=0; i<NUMDEV; i++)
		initialize_device(&gtdevices[i]);

	isinit = 1;

	return GT_TRUE;
}


API_EXPORTED
gt_size GT_GetDeviceListSize()
{
	return NUMDEV;
}


API_EXPORTED
char** GT_GetDeviceList()
{
	int i;
	char** devlist;
	
	devlist = malloc(NUMDEV*sizeof(devlist[0]));
	for (i=0; i<NUMDEV; i++) {
		devlist[i] = malloc(strlen(devname[i])+1);
		strcpy(devlist[i], devname[i]);
	}
	
	return devlist;
}
Beispiel #25
0
/*
 * run_threads -- starts threads execution
 */
int
run_threads(struct prog_args *args, thread_f task, void *arg, double *exec_time)
{
	int ret_val = 0;
	int ops_per_thread;
	pthread_t threads[args->threads_count];
	struct thread_info thread_info[args->threads_count];
	char *rand_statebuf;
	struct timeval task_start;
	struct timeval task_stop;

	rand_statebuf = (char *)calloc(args->threads_count, STATE_BUF_LEN);
	if (rand_statebuf == NULL) {
		return EXIT_FAILURE;
	}

	ops_per_thread = args->ops_count / args->threads_count;

	for (int i = 0; i < args->threads_count; ++i) {
		thread_info[i].hndl = arg;
		thread_info[i].func = task;
		thread_info[i].vec_size = args->vec_size;
		thread_info[i].el_size = args->el_size;
		thread_info[i].start = i * ops_per_thread;
		thread_info[i].end = ops_per_thread + i * ops_per_thread;
		thread_info[i].rand_state = NULL;

		if (args->rand) {
			thread_info[i].rand_state =
				calloc(1, sizeof (*thread_info[i].rand_state));
			if (thread_info[i].rand_state == NULL) {
				return EXIT_FAILURE;
			}

			initstate_r(args->seed, &rand_statebuf[i],
				STATE_BUF_LEN, thread_info[i].rand_state);
		};

		if ((thread_info[i].buf = (char *)
				calloc(args->el_size *
					args->vec_size * args->ops_count,
					sizeof (char))) == NULL) {
			return EXIT_FAILURE;
		}

		thread_info[i].buf_size = args->el_size * args->vec_size
				* args->ops_count;

		if ((thread_info[i].iov = (struct iovec *)calloc(args->vec_size,
				sizeof (struct iovec))) == NULL) {
			return EXIT_FAILURE;
		}
	}

	/* start to measure threads execution time */
	gettimeofday(&task_start, NULL);

	for (int i = 0; i < args->threads_count; ++i) {
		if (pthread_create(&threads[i], NULL,
				do_thread, &thread_info[i]) < 0) {
			return EXIT_FAILURE;
		}
	}

	/* wait until all the threads are finished */
	for (int i = 0; i < args->threads_count; ++i) {
		pthread_join(threads[i], NULL);
		if (thread_info[i].result == EXIT_FAILURE) {
			ret_val++;
		}
	}

	/* stop measuring threads execution time */
	gettimeofday(&task_stop, NULL);

	for (int i = 0; i < args->threads_count; ++i) {
		free(thread_info[i].rand_state);
		free(thread_info[i].iov);
		free(thread_info[i].buf);
	}

	free(rand_statebuf);

	/* calculate the actual threads execution time */
	if (exec_time != NULL) {
		*exec_time = (task_stop.tv_sec - task_start.tv_sec) +
			((task_stop.tv_usec - task_start.tv_usec) /
			1000000.0);
	}

	return ret_val;
}
Beispiel #26
0
/*
 * run_threads -- performs runs number of tasks on threads
 */
int
run_threads(arguments_t *arguments, task_f task, int per_thread_arg, void **arg,
	double *elapsed)
{
	int i, n, ret = 0;
	pthread_t threads[arguments->thread_count];
	struct task_def t_def[arguments->thread_count];
	char *random_statebuf;
	struct timeval task_start, task_stop;

	allocation_type = arguments->allocation_type;
	allocation_min = arguments->allocation_size;
	allocation_max = arguments->allocation_size_max;

	random_statebuf = (char *)calloc(arguments->thread_count, 32);

	n = arguments->ops_count / arguments->thread_count;
	gettimeofday(&task_start, NULL);

	for (i = 0; i < arguments->thread_count; ++i) {
		t_def[i].start = i * n;
		t_def[i].end = n + i * n;
		t_def[i].task = task;
		t_def[i].rand_state =
			(struct random_data *)
			calloc(1, sizeof (struct random_data));

		initstate_r(arguments->seed,
			&random_statebuf[i], 32, t_def[i].rand_state);

		if (per_thread_arg) {
			t_def[i].arg = arg == NULL ? NULL : arg[i];
		} else {
			t_def[i].arg = arg == NULL ? NULL : arg[0];
		}
		if (pthread_create(&threads[i], NULL, do_task, &t_def[i]) < 0) {
			return FAILURE;
		}
	}

	for (i = 0; i < arguments->thread_count; ++i) {
		pthread_join(threads[i], NULL);
		if (t_def[i].result == FAILURE) {
			ret++;
		}
	}

	gettimeofday(&task_stop, NULL);

	free(random_statebuf);
	for (i = 0; i < arguments->thread_count; ++i) {
		free(t_def[i].rand_state);
	}

	if (elapsed != NULL) {
		*elapsed = (task_stop.tv_sec - task_start.tv_sec) +
				((task_stop.tv_usec - task_start.tv_usec) /
				USEC_IN_SEC);
	}

	return ret;
}
Beispiel #27
0
	void init_random_r_version (uint_t seed) {
		memset(& m_rdata, 0, sizeof(struct random_data));
		CWT_VERIFY(initstate_r(seed, m_stateBuf, StateSize, & m_rdata) == 0);
		CWT_VERIFY(setstate_r(m_stateBuf, & m_rdata) == 0);
	}