eap_status_e asn1_der_type_c::debug_object_identifier(eap_variable_data_c * const debug_buffer)
{
	if (debug_buffer == 0)
	{
		EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT);
		return EAP_STATUS_RETURN(m_am_tools, eap_status_illegal_parameter);
	}

	eap_status_e status(eap_status_process_general_error);

	// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

	status = debug_buffer->set_data_length(debug_buffer->get_buffer_length());
	if (status != eap_status_ok)
	{
		EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT);
		return EAP_STATUS_RETURN(m_am_tools, status);
	}

	const u32_t recursion(m_recursion + 1u);
	const u32_t max_prefix_length(recursion * SIZE_OF_ONE_OCTET_STRING + 1ul);

	if (debug_buffer->get_buffer_length() < (max_prefix_length + 2ul))
	{
		EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT);
		return EAP_STATUS_RETURN(m_am_tools, eap_status_allocation_error);
	}

	const u32_t max_data_output_length((debug_buffer->get_buffer_length() - (max_prefix_length + 2ul))/2ul);
	const u32_t max_plain_output_length(max_data_output_length);

	u32_t prefix_length(0ul);

	u8_t * const prefix = debug_buffer->get_data();
	if (prefix == 0)
	{
		EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT);
		return EAP_STATUS_RETURN(m_am_tools, eap_status_illegal_parameter);
	}

	status = debug_create_prefix(recursion, prefix, max_prefix_length, &prefix_length);
	if (status != eap_status_ok)
	{
		EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT);
		return EAP_STATUS_RETURN(m_am_tools, status);
	}

	u8_t * const data_output = debug_buffer->get_data_offset(max_prefix_length, max_data_output_length);
	if (data_output == 0)
	{
		EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT);
		return EAP_STATUS_RETURN(m_am_tools, eap_status_allocation_error);
	}
	data_output[max_data_output_length-1ul] = 0;

	u8_t * const plain_output = debug_buffer->get_data_offset(max_prefix_length + max_data_output_length, max_plain_output_length);
	if (plain_output == 0)
	{
		EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT);
		return EAP_STATUS_RETURN(m_am_tools, eap_status_allocation_error);
	}
	plain_output[max_plain_output_length - 1ul] = 0;

	// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

	const u32_t length = get_content_length();
	
	if (length == 0)
	{
		EAP_TRACE_DEBUG(
			m_am_tools,
			TRACE_FLAGS_DEFAULT,
			(EAPL("# ERROR: invalid %s, length=%d\n"),
				get_tag_string(),
				length));

		EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT);
		return EAP_STATUS_RETURN(m_am_tools, eap_status_buffer_too_short);
	}

	const u8_t * const oid_data = get_content();

	if (oid_data == 0)
	{
		EAP_TRACE_DEBUG(
			m_am_tools,
			TRACE_FLAGS_DEFAULT,
			(EAPL("# ERROR: invalid %s, length=%d\n"),
				get_tag_string(),
				length));

		EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT);
		return EAP_STATUS_RETURN(m_am_tools, eap_status_buffer_too_short);
	}

	u32_t offset(0ul);
	u8_t oid_octet = oid_data[offset];
	u32_t oid1 = oid_octet / 40;
	u32_t oid2 = (oid_octet - oid1*40);

	EAP_TRACE_DEBUG(
		m_am_tools,
		TRACE_FLAGS_DEFAULT,
		(EAPL("%s%02x # = %d = 40 * %d + %d => %d.%d\n"),
		prefix,
		oid_octet,
		oid_octet,
		oid1,
		oid2,
		oid1,
		oid2));

	++offset;

	while(offset < length)
	{
		u32_t oid_length(0ul);
		u32_t data_output_offset(0ul);
		u32_t plain_output_offset(0ul);
		u32_t ind(0ul);

		for (ind = offset; ind < length; ++ind)
		{
			u8_t oid_octet = oid_data[ind];
			++oid_length;
			if ((oid_octet & OID_HIGH_BIT) == 0)
			{
				break;
			}
		} // for()

		u32_t power = oid_length - 1ul;
		u32_t oid_value(0ul);

		for (ind = offset; ind < (offset+oid_length); ++ind)
		{
			u8_t oid_octet = oid_data[ind];

			data_output_offset += m_am_tools->snprintf(
				&data_output[data_output_offset],
				max_data_output_length - data_output_offset,
				"%02x \0",
				oid_octet);

			u8_t oid = static_cast<u8_t>(oid_octet & (~OID_HIGH_BIT));

			if (ind > offset)
			{
				plain_output_offset += m_am_tools->snprintf(
					&plain_output[plain_output_offset],
					max_data_output_length - plain_output_offset,
					" + \0");
			}

			if (power > 1ul)
			{
				plain_output_offset += m_am_tools->snprintf(
					&plain_output[plain_output_offset],
					max_data_output_length - plain_output_offset,
					"0x%02x * 128 ^ %d\0",
					oid,
					power);
			}
			else if (power > 0ul)
			{
				plain_output_offset += m_am_tools->snprintf(
					&plain_output[plain_output_offset],
					max_data_output_length - plain_output_offset,
					"0x%02x * 128\0",
					oid);
			}
			else
			{
				plain_output_offset += m_am_tools->snprintf(
					&plain_output[plain_output_offset],
					max_data_output_length - plain_output_offset,
					"0x%02x\0",
					oid);
			}

			oid_value = (oid_value << 7) + oid;

			--power;
		} // for()

		EAP_TRACE_DEBUG(
			m_am_tools,
			TRACE_FLAGS_DEFAULT,
			(EAPL("%s%s # %s = %d\n"),
			prefix,
			data_output,
			plain_output,
			oid_value));

		offset += oid_length;
	}

	EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT);
	return EAP_STATUS_RETURN(m_am_tools, status);
}
Example #2
0
int
ask_tag (char *fn)
{
  ID3_tag fntag; 
  char track[20],genre[20],*t,*w,*p,*f,*pfntmp,*ptagtmp;
  char tagtmp[256],fntmp[256];
  int length;

  /* If tag from file name, we grab the fields */
  memset(&fntag,0,sizeof(ID3_tag));
  if (flags.tag_ffn == TRUE)
  {
    strcpy(tagtmp,tag_template);p=ptagtmp=tagtmp;
    strcpy(fntmp,fn);pfntmp=fntmp;
    w=NULL;

    while(p!=NULL)
    {
      p=strchr(ptagtmp,IDENT_CHAR);    

      /* if it's the last char */
      if(p!=NULL)
      {
        *p=0;
        if(*(p+1)==0)break;
      }

      f=strstr(pfntmp,ptagtmp);
      if(f==NULL)break;

      if(w!=NULL)
      {
        switch(*w)
        {
          case 'a' : /* artist */
            length=MIN(f-pfntmp,sizeof(fntag.artist));
            strncpy(fntag.artist,pfntmp,length);
            break;
          case 'c' : /* comment */
            if(fntag.version==0)
             {length=MIN(f-pfntmp,sizeof(fntag.u.v10.comment));
              strncpy(fntag.u.v10.comment,pfntmp,length);
             }
            else
             {length=MIN(f-pfntmp,sizeof(fntag.u.v11.comment));
              strncpy(fntag.u.v11.comment,pfntmp,length);
             }
            break;
          case 's' : /* song */
            length=MIN(f-pfntmp,sizeof(fntag.songname));
            strncpy(fntag.songname,pfntmp,length);
            break;
          case 't' : /* title */
            length=MIN(f-pfntmp,sizeof(fntag.album));
            strncpy(fntag.album,pfntmp,length);
            break;
          case 'y' : /* year */
            length=MIN(f-pfntmp,sizeof(fntag.year));
            strncpy(fntag.year,pfntmp,length);
            break;
          case 'd' : /* dummy */
            break;
          case 'g' : /* Genre */
            memset(genre,0,sizeof(genre));
            length=MIN(f-pfntmp,sizeof(genre)-1);
            strncpy(genre,pfntmp,length);
            search_genre (2, &fntag.genre, genre);
            break;
          case 'n' : /* Track */
            memset(track,0,sizeof(track));
            length=MIN(f-pfntmp,sizeof(track)-1);
            strncpy(track,pfntmp,length);
            fntag.version=1;
            fntag.u.v11.track=0;
            t=track;
            while(*t!=0)
             {fntag.u.v11.track*=10;
              fntag.u.v11.track+=*t-'0';
              t++;
             }
            break;
        }
        w=NULL;
      }

      f+=strlen(ptagtmp);

      if(p!=NULL)
      {
        w=p+1;
        p+=2;

        ptagtmp=p;
        pfntmp=f;
      }
    }
  }  
   
  if (strcmp(fntag.songname,"")==0)
    get_tag_string(sizeof(ptrtag->songname), def_song, ptrtag->songname, "Song Name");
  else
    get_tag_string(sizeof(ptrtag->songname), fntag.songname, ptrtag->songname, "Song Name");
 
  if (strcmp(fntag.artist,"")==0)
    get_tag_string(sizeof(ptrtag->artist), def_artist, ptrtag->artist, "Artist Name");
  else
    get_tag_string(sizeof(ptrtag->artist), fntag.artist, ptrtag->artist, "Artist Name");

  if (flags.no_album == FALSE)
  {
    if (strcmp(fntag.album,"")==0)
      get_tag_string(sizeof(ptrtag->album), def_album, ptrtag->album, "Album Name");
    else
      get_tag_string(sizeof(ptrtag->album), fntag.album, ptrtag->album, "Album Name");
  }

  if (flags.no_year == FALSE)
  {
    if (strcmp(fntag.year,"")==0)
      get_tag_string(sizeof(ptrtag->year), def_year, ptrtag->year, "Year");
    else
      get_tag_string(sizeof(ptrtag->year), fntag.year, ptrtag->year, "Year");
  }
 
  if (flags.no_track == FALSE)
  {
    if (fntag.version==1&&fntag.u.v11.track!=0)
      get_tag_track(&ptrtag->u.v11.track, fntag.u.v11.track,&ptrtag->version);
    else
      get_tag_track(&ptrtag->u.v11.track, def_track,&ptrtag->version);
  }

  if (flags.no_comment == FALSE)
  {
   if (ptrtag->version==0)
    {
     if (strcmp(fntag.u.v10.comment,"")==0)
       get_tag_string(sizeof(ptrtag->u.v10.comment), def_comment, ptrtag->u.v10.comment, "Comment");
     else
       get_tag_string(sizeof(ptrtag->u.v10.comment), fntag.u.v10.comment, ptrtag->u.v10.comment, "Comment");
    }
   else
    {
     if (strcmp(fntag.u.v11.comment,"")==0)
       get_tag_string(sizeof(ptrtag->u.v11.comment), def_comment, ptrtag->u.v11.comment, "Comment");
     else
       get_tag_string(sizeof(ptrtag->u.v11.comment), fntag.u.v11.comment, ptrtag->u.v11.comment, "Comment");
    }
  }

  if (flags.no_genre == FALSE)
  {
    if (fntag.genre==0)
      get_tag_genre(&ptrtag->genre, def_genre);
    else
      get_tag_genre(&ptrtag->genre, fntag.genre);
  }

  if (strlen(ptrtag->songname) < 1 ) /*|| strlen(ptrtag->artist) < 1)*/
/*      || ptrtag->genre < 0 || ptrtag->genre >= genre_count) */
  {
    user_message(FALSE, "Not enough info entered to tag %s\n", fn);
    return FALSE;
  }

  return TRUE;
}
eap_status_e asn1_der_type_c::debug_header(eap_variable_data_c * const debug_buffer)
{
	if (debug_buffer == 0)
	{
		EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT);
		return EAP_STATUS_RETURN(m_am_tools, eap_status_illegal_parameter);
	}

	const u32_t max_data_length(m_recursion * SIZE_OF_ONE_OCTET_STRING + m_offset_of_contents_field * SIZE_OF_ONE_OCTET_STRING);

	if (max_data_length > debug_buffer->get_buffer_length())
	{
		EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT);
		return EAP_STATUS_RETURN(m_am_tools, eap_status_allocation_error);
	}

	eap_status_e status = debug_buffer->set_data_length(max_data_length);
	if (status != eap_status_ok)
	{
		EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT);
		return EAP_STATUS_RETURN(m_am_tools, status);
	}

	u32_t ind(0ul);
	u32_t offset(0ul);

	u8_t * const prefix = reinterpret_cast<u8_t *>(debug_buffer->get_data(max_data_length));

	if (prefix == 0)
	{
		EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT);
		return EAP_STATUS_RETURN(m_am_tools, eap_status_allocation_error);
	}

	status = debug_create_prefix(m_recursion, prefix, max_data_length, &offset);
	if (status != eap_status_ok)
	{
		EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT);
		return EAP_STATUS_RETURN(m_am_tools, status);
	}

	for (ind = 0ul; ind < m_offset_of_length_field && ind < m_input_data_length; ++ind)
	{
		offset += m_am_tools->snprintf(
			debug_buffer->get_data_offset(offset, debug_buffer->get_data_length() - offset),
			debug_buffer->get_data_length() - offset,
			"%02x \0",
			m_input_data[ind]);
	}

	for (ind = m_offset_of_length_field; ind < m_offset_of_contents_field && ind < m_input_data_length; ++ind)
	{
		offset += m_am_tools->snprintf(
			debug_buffer->get_data_offset(offset, debug_buffer->get_data_length() - offset),
			debug_buffer->get_data_length() - offset,
			"%02x \0",
			m_input_data[ind]);
	}

	status = debug_buffer->add_end_null();
	if (status != eap_status_ok)
	{
		EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT);
		return EAP_STATUS_RETURN(m_am_tools, status);
	}

	eap_const_string tag_string = 0;
	eap_char buffer[MAX_STACK_BUFFER];

	if (get_class() == asn1_class_application)
	{
		m_am_tools->snprintf(
			reinterpret_cast<u8_t *>(buffer),
			MAX_STACK_BUFFER,
			"Application[%d]\0",
			get_tag());

		tag_string = buffer;
	}
	else if (get_class() == asn1_class_context_specific)
	{
		m_am_tools->snprintf(
			reinterpret_cast<u8_t *>(buffer),
			MAX_STACK_BUFFER,
			"[%d]\0",
			get_tag());

		tag_string = buffer;
	}
	else
	{
		tag_string = get_tag_string();
	}

	EAP_TRACE_DEBUG(
		m_am_tools,
		TRACE_FLAGS_DEFAULT,
		(EAPL("%s # %s, %s, %s, length=0x%x=%d, this=0x%08x, index=%d\n"),
			debug_buffer->get_data(max_data_length),
			get_class_string(),
			get_pc_string(),
			tag_string,
			get_content_length(),
			get_content_length(),
			this,
			m_index));

	EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT);
	return EAP_STATUS_RETURN(m_am_tools, status);
}