Esempio n. 1
0
File: request.c Progetto: jes/serve
/* url decodes the contents of buf, and places the decoded version back in buf
   Returns buf, or NULL on error */
char *url_decode(char *buf) {
  char *ptr = buf;
  int i;
  int c = 0, c2;
  int state = TEXT;

  for(i = 0; *ptr; ptr++) {
    switch(state) {
    case TEXT:
      if(*ptr == '%')	state = HEX1;
      else buf[i++] = *ptr;
      break;
    case HEX1:
      /* convert to a value and put in c */
      if((c = hex_to_digit(*ptr)) < 0) return NULL;
      state = HEX2;
      break;
    case HEX2:
      /* convert to a value, put in c2, and add the character */
      if((c2 = hex_to_digit(*ptr)) < 0) return NULL;
      buf[i++] = (c << 4) | c2;
      state = TEXT;
      break;
    }
  }

  buf[i] = '\0';

  return buf;
}
char * do_hash( char * sec_ws_key )
{
#if 0
  strcpy( sec_ws_key, "wTfhMBsUmc9/v6RWgzmLiw==" ); 
  /* expected: TyRLRl5fE8awKtbv4EQl5GSWfcE= */
#endif

  SHA1Context sha;
  SHA1Reset( &sha );

  char * combined = (char *)calloc( 1 + strlen( sec_ws_key ) + strlen( GUID ), sizeof( char ) );
  sprintf( combined, "%s%s", sec_ws_key, GUID );
  printf( "HASHING: [%s]\n", combined );

  SHA1Input( &sha, (const unsigned char *)combined, strlen( combined ) );

  if ( SHA1Result( &sha ) )
  {
    char * result = (char *)calloc( 128, sizeof( char ) );
    result[0] = '\0';

    int i, j;
    for ( i = 0, j = 0 ; i < 5 ; i++ )
    {
      int k;
      char mini[16];
      sprintf( mini, "%08X", sha.Message_Digest[i] );  /* e.g. 99AABBCC */
      for ( k = 0 ; k < 8 ; k += 2 )
      {
        result[j++] = hex_to_digit( mini[k] ) * 16 + hex_to_digit( mini[k+1] );
      }
    }

    int output_length = 28;
    char * x = encode_base64( 20, (unsigned char *)result );
    strncpy( result, x, output_length );
    result[ output_length ] = '\0';
    return result;
  }
  else
  {
    printf( "Error performing do_hash() function\n" );
    return (char *)NULL;
  }
}
Esempio n. 3
0
// Probably a void function, but sometimes returns a useful-ish value.
int sceNetEtherStrton(u32 bufferPtr, u32 macPtr) {
	DEBUG_LOG(SCENET, "sceNetEtherStrton(%08x, %08x)", bufferPtr, macPtr);

	if (Memory::IsValidAddress(bufferPtr) && Memory::IsValidAddress(macPtr)) {
		const char *buffer = (char *)Memory::GetPointer(bufferPtr);
		u8 *mac = Memory::GetPointer(macPtr);

		// MAC address is always 6 pairs of hex digits.
		// TODO: Funny stuff happens if it's too short.
		u8 value = 0;
		for (int i = 0; i < 6 && *buffer != 0; ++i) {
			value = 0;

			int c = hex_to_digit(*buffer++);
			if (c != -1) {
				value |= c << 4;
			}
			c = hex_to_digit(*buffer++);
			if (c != -1) {
				value |= c;
			}

			*mac++ = value;

			// Skip a single character in between.
			// TODO: Strange behavior on the PSP, let's just null check.
			if (*buffer++ == 0) {
				break;
			}
		}

		// Seems to maybe kinda return the last value.  Probably returns void.
		return value;
	} else {
		// Possibly a void function, seems to return this on bad args (or crash.)
		return 0;
	}
}
Esempio n. 4
0
void uart_rx_worker(void *parg)
  {
  uart_config_t *uart = (uart_config_t *) parg;

  while(true)
    {
    pop_front(&uart->rx_queue, uart->rx_worker_buffer, INDEFINITE_WAIT);
    
    if((uart->flags & NMEA_DECODER_ENABLE) != 0)
      {
      char *start = (char *) uart->rx_worker_buffer;
      char *end = start;
      uint8_t sentence = 0;
      uint8_t word = 0;
      uint8_t checksum = 0;
      bool checksum_marker = false;
      
      // calculate the checksum of the string
      while(*start != 0 && *start != '*')
        checksum ^= *start++;

      start = end;
      
      while(*start != 0)
        {
        if(checksum_marker)         // checksum marker
          {
                    // compare the checksum
          uint8_t chk = 0;
          if(is_alphanum(start[0]) &&
             is_alphanum(start[1]) &&
             start[2] == 0)
            {
            chk = hex_to_digit(start[0]) << 4;
            chk += hex_to_digit(start[1]);
            }

          (uart->callback.nmea_callback)(uart, 
            checksum != chk ? 0 : (char *) 1,
            sentence, word);

          start++;
          break;                  // and done, wait for next
          }
        
        for(end = start; *end != 0 && *end != ',' && *end != '*' ; end++);
        
        if(*end == '*')
          checksum_marker = true;
        
        *end = 0;
        
        sentence = (uart->callback.nmea_callback)(uart, start, sentence, word);
        word++;
        
        // skip token
        start = end;
        // and increment to next word
        start++;
        }
      }
    else
      (uart->callback.uart_callback)(uart, uart->rx_worker_buffer, strlen((const char *)uart->rx_worker_buffer));
    }
  }