Пример #1
0
int
decode_pdn_address (
  PdnAddress * pdnaddress,
  uint8_t iei,
  uint8_t * buffer,
  uint32_t len)
{
  int                                     decoded = 0;
  uint8_t                                 ielen = 0;
  int                                     decode_result;

  if (iei > 0) {
    CHECK_IEI_DECODER (iei, *buffer);
    decoded++;
  }

  ielen = *(buffer + decoded);
  decoded++;
  CHECK_LENGTH_DECODER (len - decoded, ielen);
  pdnaddress->pdntypevalue = *(buffer + decoded) & 0x7;
  decoded++;

  if ((decode_result = decode_octet_string (&pdnaddress->pdnaddressinformation, ielen - 1, buffer + decoded, len - decoded)) < 0)
    return decode_result;
  else
    decoded += decode_result;

#if NAS_DEBUG
  dump_pdn_address_xml (pdnaddress, iei);
#endif
  return decoded;
}
Пример #2
0
int decode_lcs_client_identity(LcsClientIdentity *lcsclientidentity, uint8_t iei, uint8_t *buffer, uint32_t len)
{
  int decoded = 0;
  uint8_t ielen = 0;
  int decode_result;

  if (iei > 0) {
    CHECK_IEI_DECODER(iei, *buffer);
    decoded++;
  }

  ielen = *(buffer + decoded);
  decoded++;
  CHECK_LENGTH_DECODER(len - decoded, ielen);

  if ((decode_result = decode_octet_string(&lcsclientidentity->lcsclientidentityvalue, ielen, buffer + decoded, len - decoded)) < 0)
    return decode_result;
  else
    decoded += decode_result;

#if defined (NAS_DEBUG)
  dump_lcs_client_identity_xml(lcsclientidentity, iei);
#endif
  return decoded;
}
int
decode_authentication_parameter_autn (
  AuthenticationParameterAutn * authenticationparameterautn,
  uint8_t iei,
  uint8_t * buffer,
  uint32_t len)
{
  int                                     decoded = 0;
  uint8_t                                 ielen = 0;
  int                                     decode_result;

  if (iei > 0) {
    CHECK_IEI_DECODER (iei, *buffer);
    decoded++;
  }

  ielen = *(buffer + decoded);
  decoded++;
  CHECK_LENGTH_DECODER (len - decoded, ielen);

  if ((decode_result = decode_octet_string (&authenticationparameterautn->autn, ielen, buffer + decoded, len - decoded)) < 0)
    return decode_result;
  else
    decoded += decode_result;

#if NAS_DEBUG
  dump_authentication_parameter_autn_xml (authenticationparameterautn, iei);
#endif
  return decoded;
}
int
decode_ms_network_capability (
  MsNetworkCapability * msnetworkcapability,
  uint8_t iei,
  uint8_t * buffer,
  uint32_t len)
{
  int                                     decoded = 0;
  uint8_t                                 ielen = 0;
  int                                     decode_result;

  if (iei > 0) {
    CHECK_IEI_DECODER (iei, *buffer);
    decoded++;
  }

  ielen = *(buffer + decoded);
  decoded++;
  CHECK_LENGTH_DECODER (len - decoded, ielen);

  if ((decode_result = decode_octet_string (&msnetworkcapability->msnetworkcapabilityvalue, ielen, buffer + decoded, len - decoded)) < 0)
    return decode_result;
  else
    decoded += decode_result;

#if NAS_DEBUG
  dump_ms_network_capability_xml (msnetworkcapability, iei);
#endif
  return decoded;
}
int decode_esm_message_container(EsmMessageContainer *esmmessagecontainer, uint8_t iei, uint8_t *buffer, uint32_t len)
{
    int decoded = 0;
    int decode_result;
    uint16_t ielen;

    LOG_FUNC_IN;

    if (iei > 0) {
        CHECK_IEI_DECODER(iei, *buffer);
        decoded++;
    }

    DECODE_LENGTH_U16(buffer + decoded, ielen, decoded);

    CHECK_LENGTH_DECODER(len - decoded, ielen);


    if ((decode_result = decode_octet_string(&esmmessagecontainer->esmmessagecontainercontents, ielen, buffer + decoded, len - decoded)) < 0) {
        LOG_FUNC_RETURN(decode_result);
    } else {
        decoded += decode_result;
    }

#if defined (NAS_DEBUG)
    dump_esm_message_container_xml(esmmessagecontainer, iei);
#endif
    LOG_FUNC_RETURN(decoded);
}
int decode_authentication_failure_parameter(AuthenticationFailureParameter *authenticationfailureparameter, uint8_t iei, uint8_t *buffer, uint32_t len)
{
  int decoded = 0;
  uint8_t ielen = 0;
  int decode_result;

  if (iei > 0) {
    CHECK_IEI_DECODER(iei, *buffer);
    decoded++;
  }

  ielen = *(buffer + decoded);
  decoded++;
  CHECK_LENGTH_DECODER(len - decoded, ielen);

  if ((decode_result = decode_octet_string(&authenticationfailureparameter->auts, ielen, buffer + decoded, len - decoded)) < 0)
    return decode_result;
  else
    decoded += decode_result;

#if defined (NAS_DEBUG)
  dump_authentication_failure_parameter_xml(authenticationfailureparameter, iei);
#endif
  return decoded;
}
int
decode_p_tmsi_signature (
  PTmsiSignature * ptmsisignature,
  uint8_t iei,
  uint8_t * buffer,
  uint32_t len)
{
  int                                     decoded = 0;
  int                                     decode_result;
  uint8_t                                 ielen = 3;

  if (iei > 0) {
    CHECK_IEI_DECODER (iei, *buffer);
    decoded++;
  }

  if ((decode_result = decode_octet_string (&ptmsisignature->ptmsisignaturevalue, ielen, buffer + decoded, len - decoded)) < 0)
    return decode_result;
  else
    decoded += decode_result;

#if NAS_DEBUG
  dump_p_tmsi_signature_xml (ptmsisignature, iei);
#endif
  return decoded;
}
int decode_nas_message_container(NasMessageContainer *nasmessagecontainer, uint8_t iei, uint8_t *buffer, uint32_t len)
{
  int decoded = 0;
  uint8_t ielen = 0;
  int decode_result;

  if (iei > 0) {
    CHECK_IEI_DECODER(iei, *buffer);
    decoded++;
  }

  ielen = *(buffer + decoded);
  decoded++;
  CHECK_LENGTH_DECODER(len - decoded, ielen);

  if ((decode_result = decode_octet_string(&nasmessagecontainer->nasmessagecontainercontents, ielen, buffer + decoded, len - decoded)) < 0)
    return decode_result;
  else
    decoded += decode_result;

#if defined (NAS_DEBUG)
  dump_nas_message_container_xml(nasmessagecontainer, iei);
#endif
  return decoded;
}
int decode_authentication_parameter_rand(AuthenticationParameterRand *authenticationparameterrand, uint8_t iei, uint8_t *buffer, uint32_t len)
{
    int decoded = 0;
    uint8_t ielen = 16;
    int decode_result;
    if (iei > 0)
    {
        CHECK_IEI_DECODER(iei, *buffer);
        decoded++;
    }
    if ((decode_result = decode_octet_string(&authenticationparameterrand->rand, ielen, buffer + decoded, len - decoded)) < 0)
        return decode_result;
    else
        decoded += decode_result;
#if defined (NAS_DEBUG)
    dump_authentication_parameter_rand_xml(authenticationparameterrand, iei);
#endif
    return decoded;
}
Пример #10
0
int decode_cli(Cli *cli, uint8_t iei, uint8_t *buffer, uint32_t len)
{
    int decoded = 0;
    uint8_t ielen = 0;
    int decode_result;
    if (iei > 0)
    {
        CHECK_IEI_DECODER(iei, *buffer);
        decoded++;
    }
    ielen = *(buffer + decoded);
    decoded++;
    CHECK_LENGTH_DECODER(len - decoded, ielen);
    if ((decode_result = decode_octet_string(&cli->clivalue, ielen, buffer + decoded, len - decoded)) < 0)
        return decode_result;
    else
        decoded += decode_result;
#if defined (NAS_DEBUG)
    dump_cli_xml(cli, iei);
#endif
    return decoded;
}
Пример #11
0
/**
 * Initializes a given METRIC_RTSA attribute from stream content.
 *
 * \param rtsa the METRIC_RTSA.
 * \param attr_id the METRIC_RTSA's attribute ID.
 * \param stream the value of METRIC_RTSA's attribute.
 * \param data_entry output parameter to describe data value
 *
 * \return \b 1, if the METRIC_RTSA's attribute is properly modified; \b 0 otherwise.
 *
 */
int dimutil_fill_rtsa_attr(struct RTSA *rtsa, OID_Type attr_id,
			   ByteStreamReader *stream, DataEntry *data_entry)
{

	int result = 1;
	int error = 0;

	switch (attr_id) {
	case MDC_ATTR_TIME_PD_SAMP:
		rtsa->sample_period = read_intu32(stream, &error);
		if (error) {
			result = 0;
			break;
		}
		data_set_sample_period(data_entry,
				       "Sample-Period",
				       rtsa->sample_period);
		break;
	case MDC_ATTR_SIMP_SA_OBS_VAL:
		del_octet_string(&rtsa->simple_sa_observed_value);
		decode_octet_string(stream, &(rtsa->simple_sa_observed_value), &error);
		if (error) {
			result = 0;
			break;
		}
		data_set_simple_sa_observed_value(data_entry,
						  "Simple-Sa-Observed-Value",
						  &(rtsa->simple_sa_observed_value));
		break;
	case MDC_ATTR_SCALE_SPECN_I8:
		del_scalerangespec8(&rtsa->scale_and_range_specification_8);
		decode_scalerangespec8(stream,
				       &(rtsa->scale_and_range_specification_8),
					&error);
		if (error) {
			result = 0;
			break;
		}
		data_set_scale_and_range_specification_8(data_entry,
				"Scale-and-Range-Specification",
				&(rtsa->scale_and_range_specification_8));
		break;
	case MDC_ATTR_SCALE_SPECN_I16:
		del_scalerangespec16(&rtsa->scale_and_range_specification_16);
		decode_scalerangespec16(stream,
					&(rtsa->scale_and_range_specification_16),
					&error);
		if (error) {
			result = 0;
			break;
		}
		data_set_scale_and_range_specification_16(data_entry,
				"Scale-and-Range-Specification",
				&(rtsa->scale_and_range_specification_16));
		break;
	case MDC_ATTR_SCALE_SPECN_I32:
		del_scalerangespec32(&rtsa->scale_and_range_specification_32);
		decode_scalerangespec32(stream,
					&(rtsa->scale_and_range_specification_32),
					&error);
		if (error) {
			result = 0;
			break;
		}
		data_set_scale_and_range_specification_32(data_entry,
				"Scale-and-Range-Specification",
				&(rtsa->scale_and_range_specification_32));
		break;
	case MDC_ATTR_SA_SPECN:
		del_saspec(&rtsa->sa_specification);
		decode_saspec(stream, &rtsa->sa_specification, &error);
		if (error) {
			result = 0;
			break;
		}
		data_set_sa_specification(data_entry,
					  "Sa-Specification",
					  &(rtsa->sa_specification));
		break;
	default:
		result = dimutil_fill_metric_attr(&rtsa->metric, attr_id, stream, data_entry);
		break;
	}

	return result;
}
Пример #12
0
/**
 * Initializes a given PMStore attribute with a stream content.
 *
 * \param pmstore the PMStore.
 * \param attr_id the PMStore's attribute ID.
 * \param stream the value of PMStore's attribute.
 *
 * \return \b 1, if the PMStore's attribute is properly modified; \b 0 otherwise.
 *
 */
int pmstore_set_attribute(struct PMStore *pmstore, OID_Type attr_id, ByteStreamReader *stream)
{
	int result = 1;
	int error = 0;

	switch (attr_id) {
	case MDC_ATTR_ID_HANDLE: {
		intu16 s = read_intu16(stream, &error);
		if (error) {
			result = 0;
			break;
		}
		pmstore->handle = s;
		break;
	}
	case MDC_ATTR_PM_STORE_CAPAB: {
		intu16 s = read_intu16(stream, &error);
		if (error) {
			result = 0;
			break;
		}
		pmstore->pm_store_capab = s;
		break;
	}
	case MDC_ATTR_METRIC_STORE_SAMPLE_ALG: {
		intu16 s = read_intu16(stream, &error);
		if (error) {
			result = 0;
			break;
		}
		pmstore->store_sample_algorithm = s;
		break;
	}
	case MDC_ATTR_METRIC_STORE_CAPAC_CNT: {
		intu32 s = read_intu32(stream, &error);
		if (error) {
			result = 0;
			break;
		}
		pmstore->store_capacity_count = s;
		break;
	}
	case MDC_ATTR_METRIC_STORE_USAGE_CNT: {
		intu32 s = read_intu32(stream, &error);
		if (error) {
			result = 0;
			break;
		}
		pmstore->store_usage_count = s;
		break;
	}
	case MDC_ATTR_OP_STAT: {
		intu16 s = read_intu16(stream, &error);
		if (error) {
			result = 0;
			break;
		}
		pmstore->operational_state = s;
		break;
	}
	case MDC_ATTR_PM_STORE_LABEL_STRING: {
		octet_string s;
		decode_octet_string(stream, &s, &error);
		if (error) {
			result = 0;
			break;
		}
		del_octet_string(&pmstore->pm_store_label);
		pmstore->pm_store_label = s;
		break;
	}
	case MDC_ATTR_TIME_PD_SAMP: {
		intu32 s = read_intu32(stream, &error);
		if (error) {
			result = 0;
			break;
		}
		pmstore->sample_period = s;
		break;
	}
	case MDC_ATTR_NUM_SEG: {
		intu16 s = read_intu16(stream, &error);
		if (error) {
			result = 0;
			break;
		}
		pmstore->number_of_segments = s;
		break;
	}
	case MDC_ATTR_CLEAR_TIMEOUT: {
		intu32 s = read_intu32(stream, &error);
		if (error) {
			result = 0;
			break;
		}
		pmstore->clear_timeout = s;
		break;
	}
	default:
		// unknown attr, ignore
		DEBUG("pmstore attr %d ignored", attr_id);
		break;
	}

	return result;
}
Пример #13
0
/**
 * Initializes a given PMSegment attribute with a stream content.
 *
 * \param pm_segment the PMSegment.
 * \param attr_id the PMSegment's attribute ID.
 * \param stream the value of PMSegment's attribute.
 *
 * \return \b 1, if the PMSegment's attribute is properly modified; \b 0 otherwise.
 *
 */
static int pmstore_fill_segment_attr(struct PMSegment *pm_segment, OID_Type attr_id,
				     ByteStreamReader *stream)
{
	int result = 1;
	int error = 0;

	switch (attr_id) {
	case MDC_ATTR_PM_SEG_MAP: {
		PmSegmentEntryMap s;
		decode_pmsegmententrymap(stream, &s, &error);
		if (error) {
			result = 0;
			break;
		}
		pm_segment->pm_segment_entry_map = s;
		break;
	}
	case MDC_ATTR_PM_SEG_PERSON_ID: {
		intu16 s = read_intu16(stream, &error);
		if (error) {
			result = 0;
			break;
		}
		pm_segment->pm_seg_person_id = s;
		break;
	}
	case MDC_ATTR_OP_STAT: {
		intu16 s = read_intu16(stream, &error);
		if (error) {
			result = 0;
			break;
		}
		pm_segment->operational_state = s;
		break;
	}
	case MDC_ATTR_TIME_PD_SAMP: {
		intu32 s = read_intu32(stream, &error);
		if (error) {
			result = 0;
			break;
		}
		pm_segment->sample_period = s;
		break;
	}
	case MDC_ATTR_PM_SEG_LABEL_STRING: {
		octet_string s;
		decode_octet_string(stream, &s, &error);
		if (error) {
			result = 0;
			break;
		}
		pm_segment->segment_label = s;
		break;
	}
	case MDC_ATTR_TIME_START_SEG: {
		AbsoluteTime s;
		decode_absolutetime(stream, &s, &error);
		if (error) {
			result = 0;
			break;
		}
		pm_segment->segment_start_abs_time = s;
		break;
	}
	case MDC_ATTR_TIME_END_SEG: {
		AbsoluteTime s;
		decode_absolutetime(stream, &s, &error);
		if (error) {
			result = 0;
			break;
		}
		pm_segment->segment_end_abs_time = s;
		break;
	}
	case MDC_ATTR_TIME_ABS_ADJUST: {
		AbsoluteTimeAdjust s;
		decode_absolutetimeadjust(stream, &s, &error);
		if (error) {
			result = 0;
			break;
		}
		pm_segment->date_and_time_adjustment = s;
		break;
	}
	case MDC_ATTR_SEG_USAGE_CNT: {
		intu32 s = read_intu32(stream, &error);
		if (error) {
			result = 0;
			break;
		}
		pm_segment->segment_usage_count = s;
		break;
	}
	case MDC_ATTR_SEG_STATS: {
		SegmentStatistics s;
		decode_segmentstatistics(stream, &s, &error);
		if (error) {
			result = 0;
			break;
		}
		pm_segment->segment_statistics = s;
		break;
	}
	case MDC_ATTR_CONFIRM_TIMEOUT: {
		intu32 s = read_intu32(stream, &error);
		if (error) {
			result = 0;
			break;
		}
		pm_segment->confirm_timeout = s;
		break;
	}
	case MDC_ATTR_TRANSFER_TIMEOUT: {
		intu32 s = read_intu32(stream, &error);
		if (error) {
			result = 0;
			break;
		}
		pm_segment->transfer_timeout = s;
		break;
	}
	case MDC_ATTR_ID_INSTNO: {
		intu16 s = read_intu16(stream, &error);
		if (error) {
			result = 0;
			break;
		}
		if (pm_segment->instance_number != s) {
			DEBUG("instance number mismatch %d x %d",
				pm_segment->instance_number, s);
		}
		break;
	}
	default:
		// unknown attr, ignore
		DEBUG("segment info attr %d unknown", attr_id);
		break;
	}

	return result;

}
Пример #14
0
int
decode_TransitedEncoding(const unsigned char *p, size_t len, TransitedEncoding *data, size_t *size)
{
size_t ret = 0, reallen;
size_t l;
int e;

memset(data, 0, sizeof(*data));
reallen = 0;
e = der_match_tag_and_length (p, len, ASN1_C_UNIV, CONS, UT_Sequence,&reallen, &l);
FORW;
{
int dce_fix;
if((dce_fix = fix_dce(reallen, &len)) < 0)
return ASN1_BAD_FORMAT;
{
size_t newlen, oldlen;

e = der_match_tag (p, len, ASN1_C_CONTEXT, CONS, 0, &l);
if (e)
return e;
else {
p += l;
len -= l;
ret += l;
e = der_get_length (p, len, &newlen, &l);
FORW;
{
int dce_fix;
oldlen = len;
if((dce_fix = fix_dce(newlen, &len)) < 0)return ASN1_BAD_FORMAT;
e = decode_integer(p, len, &(data)->tr_type, &l);
FORW;
if(dce_fix){
e = der_match_tag_and_length (p, len, (Der_class)0, (Der_type)0, 0, &reallen, &l);
FORW;
}else 
len = oldlen - newlen;
}
}
}
{
size_t newlen, oldlen;

e = der_match_tag (p, len, ASN1_C_CONTEXT, CONS, 1, &l);
if (e)
return e;
else {
p += l;
len -= l;
ret += l;
e = der_get_length (p, len, &newlen, &l);
FORW;
{
int dce_fix;
oldlen = len;
if((dce_fix = fix_dce(newlen, &len)) < 0)return ASN1_BAD_FORMAT;
e = decode_octet_string(p, len, &(data)->contents, &l);
FORW;
if(dce_fix){
e = der_match_tag_and_length (p, len, (Der_class)0, (Der_type)0, 0, &reallen, &l);
FORW;
}else 
len = oldlen - newlen;
}
}
}
if(dce_fix){
e = der_match_tag_and_length (p, len, (Der_class)0, (Der_type)0, 0, &reallen, &l);
FORW;
}
}
if(size) *size = ret;
return 0;
fail:
free_TransitedEncoding(data);
return e;
}
Пример #15
0
/**
 * Initializes a given PMStore attribute from stream content.
 *
 * \param pmstore the PMStore.
 * \param attr_id the PMStore's attribute ID.
 * \param stream the value of PMStore's attribute.
 * \param data_entry output parameter to describe data value
 *
 * \return \b 1, if the PMStore's attribute is properly modified; \b 0 otherwise.
 *
 */
int dimutil_fill_pmstore_attr(struct PMStore *pmstore, OID_Type attr_id,
			      ByteStreamReader *stream,
				DataEntry *data_entry)
{
	int result = 1;
	int error = 0;

	switch (attr_id) {
	case MDC_ATTR_ID_HANDLE:
		pmstore->handle = read_intu16(stream, &error);
		if (error) {
			result = 0;
			break;
		}
		data_set_handle(data_entry, "Handle", &pmstore->handle);
		break;
	case MDC_ATTR_PM_STORE_CAPAB:
		pmstore->pm_store_capab = read_intu16(stream, &error);
		if (error) {
			result = 0;
			break;
		}
		data_set_intu16(data_entry, "Capabilities", &pmstore->pm_store_capab);
		break;
	case MDC_ATTR_METRIC_STORE_SAMPLE_ALG:
		pmstore->store_sample_algorithm = read_intu16(stream, &error);
		if (error) {
			result = 0;
			break;
		}
		data_set_intu16(data_entry, "Store-Sample-Algorithm",
				&pmstore->store_sample_algorithm);
		break;
	case MDC_ATTR_METRIC_STORE_CAPAC_CNT:
		pmstore->store_capacity_count = read_intu32(stream, &error);
		if (error) {
			result = 0;
			break;
		}
		data_set_intu32(data_entry, "Store-Capacity-Count",
				&pmstore->store_capacity_count);
		break;
	case MDC_ATTR_METRIC_STORE_USAGE_CNT:
		pmstore->store_usage_count = read_intu32(stream, &error);
		if (error) {
			result = 0;
			break;
		}
		data_set_intu32(data_entry, "Store-Usage-Count",
				&pmstore->store_usage_count);
		break;
	case MDC_ATTR_OP_STAT:
		pmstore->operational_state = read_intu16(stream, &error);
		if (error) {
			result = 0;
			break;
		}
		data_set_intu16(data_entry, "Operational-State",
				&pmstore->operational_state);
		break;
	case MDC_ATTR_PM_STORE_LABEL_STRING:
		del_octet_string(&pmstore->pm_store_label);
		decode_octet_string(stream, &pmstore->pm_store_label, &error);
		if (error) {
			result = 0;
			break;
		}
		data_set_label_string(data_entry, "PM-Store-Label",
				&pmstore->pm_store_label);
		break;
	case MDC_ATTR_TIME_PD_SAMP:
		pmstore->sample_period = read_intu32(stream, &error);
		if (error) {
			result = 0;
			break;
		}
		data_set_intu32(data_entry, "Sample-Period",
				&pmstore->sample_period);
		break;
	case MDC_ATTR_NUM_SEG:
		pmstore->number_of_segments = read_intu16(stream, &error);
		if (error) {
			result = 0;
			break;
		}
		data_set_intu16(data_entry, "Number-Of-Segments",
				&pmstore->number_of_segments);
		break;
	case MDC_ATTR_CLEAR_TIMEOUT:
		pmstore->clear_timeout = read_intu32(stream, &error);
		if (error) {
			result = 0;
			break;
		}
		data_set_intu32(data_entry, "Clear-Timeout",
				&pmstore->clear_timeout);
		break;
	default:
		DEBUG("Can't fill pmstore attribute attribute id is %d", attr_id);
		break;
	}

	return result;
}
Пример #16
0
/* decode the service request only */
int arf_ack_decode_service_request(
    uint8_t * apdu,
    unsigned apdu_len,
    BACNET_ATOMIC_READ_FILE_DATA * data)
{
    int len = 0;
    int tag_len = 0;
    uint8_t tag_number = 0;
    uint32_t len_value_type = 0;

    /* check for value pointers */
    if (apdu_len && data) {
        len =
            decode_tag_number_and_value(&apdu[0], &tag_number,
            &len_value_type);
        if (tag_number != BACNET_APPLICATION_TAG_BOOLEAN)
            return -1;
        data->endOfFile = decode_boolean(len_value_type);
        if (decode_is_opening_tag_number(&apdu[len], 0)) {
            data->access = FILE_STREAM_ACCESS;
            /* a tag number is not extended so only one octet */
            len++;
            /* fileStartPosition */
            tag_len =
                decode_tag_number_and_value(&apdu[len], &tag_number,
                &len_value_type);
            len += tag_len;
            if (tag_number != BACNET_APPLICATION_TAG_SIGNED_INT)
                return -1;
            len +=
                decode_signed(&apdu[len], len_value_type,
                &data->type.stream.fileStartPosition);
            /* fileData */
            tag_len =
                decode_tag_number_and_value(&apdu[len], &tag_number,
                &len_value_type);
            len += tag_len;
            if (tag_number != BACNET_APPLICATION_TAG_OCTET_STRING)
                return -1;
            len +=
                decode_octet_string(&apdu[len], len_value_type,
                &data->fileData);
            if (!decode_is_closing_tag_number(&apdu[len], 0))
                return -1;
            /* a tag number is not extended so only one octet */
            len++;
        } else if (decode_is_opening_tag_number(&apdu[len], 1)) {
            data->access = FILE_RECORD_ACCESS;
            /* a tag number is not extended so only one octet */
            len++;
            /* fileStartRecord */
            tag_len =
                decode_tag_number_and_value(&apdu[len], &tag_number,
                &len_value_type);
            len += tag_len;
            if (tag_number != BACNET_APPLICATION_TAG_SIGNED_INT)
                return -1;
            len +=
                decode_signed(&apdu[len], len_value_type,
                &data->type.record.fileStartRecord);
            /* returnedRecordCount */
            tag_len =
                decode_tag_number_and_value(&apdu[len], &tag_number,
                &len_value_type);
            len += tag_len;
            if (tag_number != BACNET_APPLICATION_TAG_UNSIGNED_INT)
                return -1;
            len +=
                decode_unsigned(&apdu[len], len_value_type,
                &data->type.record.RecordCount);
            /* fileData */
            tag_len =
                decode_tag_number_and_value(&apdu[len], &tag_number,
                &len_value_type);
            len += tag_len;
            if (tag_number != BACNET_APPLICATION_TAG_OCTET_STRING)
                return -1;
            len +=
                decode_octet_string(&apdu[len], len_value_type,
                &data->fileData);
            if (!decode_is_closing_tag_number(&apdu[len], 1))
                return -1;
            /* a tag number is not extended so only one octet */
            len++;
        } else
            return -1;
    }

    return len;
}
Пример #17
0
/* decode the service request only */
int awf_decode_service_request(
    uint8_t * apdu,
    unsigned apdu_len,
    BACNET_ATOMIC_WRITE_FILE_DATA * data)
{
    int len = 0;
    int tag_len = 0;
    uint8_t tag_number = 0;
    uint32_t len_value_type = 0;
    int32_t signed_value = 0;
    uint32_t unsigned_value = 0;
    uint16_t type = 0;  /* for decoding */

    /* check for value pointers */
    if (apdu_len && data) {
        len =
            decode_tag_number_and_value(&apdu[0], &tag_number,
                                        &len_value_type);
        if (tag_number != BACNET_APPLICATION_TAG_OBJECT_ID)
            return -1;
        len += decode_object_id(&apdu[len], &type, &data->object_instance);
        data->object_type = (BACNET_OBJECT_TYPE) type;
        if (decode_is_opening_tag_number(&apdu[len], 0)) {
            data->access = FILE_STREAM_ACCESS;
            /* a tag number of 2 is not extended so only one octet */
            len++;
            /* fileStartPosition */
            tag_len =
                decode_tag_number_and_value(&apdu[len], &tag_number,
                                            &len_value_type);
            len += tag_len;
            if (tag_number != BACNET_APPLICATION_TAG_SIGNED_INT)
                return -1;
            len += decode_signed(&apdu[len], len_value_type, &signed_value);
            data->type.stream.fileStartPosition = signed_value;
            /* fileData */
            tag_len =
                decode_tag_number_and_value(&apdu[len], &tag_number,
                                            &len_value_type);
            len += tag_len;
            if (tag_number != BACNET_APPLICATION_TAG_OCTET_STRING)
                return -1;
            len +=
                decode_octet_string(&apdu[len], len_value_type,
                                    &data->fileData);
            if (!decode_is_closing_tag_number(&apdu[len], 0))
                return -1;
            /* a tag number is not extended so only one octet */
            len++;
        } else if (decode_is_opening_tag_number(&apdu[len], 1)) {
            data->access = FILE_RECORD_ACCESS;
            /* a tag number is not extended so only one octet */
            len++;
            /* fileStartRecord */
            tag_len =
                decode_tag_number_and_value(&apdu[len], &tag_number,
                                            &len_value_type);
            len += tag_len;
            if (tag_number != BACNET_APPLICATION_TAG_SIGNED_INT)
                return -1;
            len += decode_signed(&apdu[len], len_value_type, &signed_value);
            data->type.record.fileStartRecord = signed_value;
            /* returnedRecordCount */
            tag_len =
                decode_tag_number_and_value(&apdu[len], &tag_number,
                                            &len_value_type);
            len += tag_len;
            if (tag_number != BACNET_APPLICATION_TAG_UNSIGNED_INT)
                return -1;
            len +=
                decode_unsigned(&apdu[len], len_value_type, &unsigned_value);
            data->type.record.returnedRecordCount = unsigned_value;
            /* fileData */
            tag_len =
                decode_tag_number_and_value(&apdu[len], &tag_number,
                                            &len_value_type);
            len += tag_len;
            if (tag_number != BACNET_APPLICATION_TAG_OCTET_STRING)
                return -1;
            len +=
                decode_octet_string(&apdu[len], len_value_type,
                                    &data->fileData);
            if (!decode_is_closing_tag_number(&apdu[len], 1))
                return -1;
            /* a tag number is not extended so only one octet */
            len++;
        } else
            return -1;
    }

    return len;
}
Пример #18
0
/**
 * Sets the specified attribute of an MDS instance.
 *
 * \param mds the mds.
 * \param attribute a pointer to an attribute of an MDS instance.
 */
void mds_set_attribute(MDS *mds, AVA_Type *attribute)
{
	int error = 0;
	intu8 *value = attribute->attribute_value.value;
	intu16 length = attribute->attribute_value.length;

	switch (attribute->attribute_id) {
	case MDC_ATTR_ID_HANDLE:
		break;
	case MDC_ATTR_SYS_TYPE: {
		TYPE s;
		ByteStreamReader *stream = byte_stream_reader_instance(value, length);
		decode_type(stream, &s, &error);
		if (!error) {
			del_type(&mds->system_type);
			mds->system_type = s;
		}
		free(stream);
	}
	break;
	case MDC_ATTR_ID_MODEL: {
		SystemModel s;
		ByteStreamReader *stream = byte_stream_reader_instance(value, length);
		decode_systemmodel(stream, &s, &error);
		if (!error) {
			del_systemmodel(&mds->system_model);
			mds->system_model = s;
		}
		free(stream);
	}
	break;
	case MDC_ATTR_SYS_ID: {
		octet_string s;
		ByteStreamReader *stream = byte_stream_reader_instance(value, length);
		decode_octet_string(stream, &s, &error);
		if (! error) {
			del_octet_string(&mds->system_id);
			mds->system_id = s;
		}
		free(stream);
	}
	break;
	case MDC_ATTR_DEV_CONFIG_ID: {
		ConfigId s;
		ByteStreamReader *stream = byte_stream_reader_instance(value, length);
		decode_configid(stream, &s, &error);
		if (! error) {
			del_configid(&mds->dev_configuration_id);
			mds->dev_configuration_id = s;
		}
		free(stream);
	}
	break;
	case MDC_ATTR_ATTRIBUTE_VAL_MAP: {
		AttrValMap s;
		ByteStreamReader *stream = byte_stream_reader_instance(value, length);
		decode_attrvalmap(stream, &s, &error);
		if (! error) {
			del_attrvalmap(&mds->attribute_value_map);
			mds->attribute_value_map = s;
		}
		free(stream);
	}
	break;
	case MDC_ATTR_ID_PROD_SPECN: {
		ProductionSpec s;
		ByteStreamReader *stream = byte_stream_reader_instance(value, length);
		decode_productionspec(stream, &s, &error);
		if (! error) {
			del_productionspec(&mds->production_specification);
			mds->production_specification = s;
		}
		free(stream);
	}
	break;
	case MDC_ATTR_MDS_TIME_INFO: {
		MdsTimeInfo s;
		ByteStreamReader *stream = byte_stream_reader_instance(value, length);
		decode_mdstimeinfo(stream, &s, &error);
		if (! error) {
			del_mdstimeinfo(&mds->mds_time_info);
			mds->mds_time_info = s;
		}
		free(stream);
	}
	break;
	case MDC_ATTR_TIME_ABS: {
		AbsoluteTime s;
		ByteStreamReader *stream = byte_stream_reader_instance(value, length);
		decode_absolutetime(stream, &s, &error);
		if (! error) {
			del_absolutetime(&mds->date_and_time);
			mds->date_and_time = s;
		}
		free(stream);
	}
	break;
	case MDC_ATTR_TIME_REL: {
		RelativeTime s;
		ByteStreamReader *stream = byte_stream_reader_instance(value, length);
		s = read_intu32(stream, &error);
		if (! error) {
			// del_relative_time not needed
			mds->relative_time = s;
		}
		free(stream);
	}
	break;
	case MDC_ATTR_TIME_REL_HI_RES: {
		HighResRelativeTime s;
		ByteStreamReader *stream = byte_stream_reader_instance(value, length);
		decode_highresrelativetime(stream, &s, &error);
		if (! error) {
			del_highresrelativetime(&mds->hires_relative_time);
			mds->hires_relative_time = s;
		}
		free(stream);
	}
	break;
	case MDC_ATTR_TIME_ABS_ADJUST: {
		AbsoluteTimeAdjust s;
		ByteStreamReader *stream = byte_stream_reader_instance(value, length);
		decode_absolutetimeadjust(stream, &s, &error);
		if (! error) {
			del_absolutetimeadjust(&mds->date_and_time_adjustment);
			mds->date_and_time_adjustment = s;
		}
		free(stream);
	}
	break;
	case MDC_ATTR_POWER_STAT: {
		PowerStatus s;
		// del not needed
		ByteStreamReader *stream = byte_stream_reader_instance(value, length);
		s = read_intu16(stream, &error);
		if (! error) {
			mds->power_status = s;
		}
		free(stream);
	}
	break;
	case MDC_ATTR_VAL_BATT_CHARGE: {
		intu16 s;
		// del not needed
		ByteStreamReader *stream = byte_stream_reader_instance(value, length);
		s = read_intu16(stream, &error);
		if (! error) {
			mds->battery_level = s;
		}
		free(stream);
	}
	break;
	case MDC_ATTR_TIME_BATT_REMAIN: {
		BatMeasure s;
		ByteStreamReader *stream = byte_stream_reader_instance(value, length);
		decode_batmeasure(stream, &s, &error);
		if (! error) {
			del_batmeasure(&mds->remaining_battery_time);
			mds->remaining_battery_time = s;
		}
		free(stream);
	}
	break;
	case MDC_ATTR_REG_CERT_DATA_LIST: {
		RegCertDataList s;
		ByteStreamReader *stream = byte_stream_reader_instance(value, length);
		decode_regcertdatalist(stream, &s, &error);
		if (! error) {
			del_regcertdatalist(&mds->reg_cert_data_list);
			mds->reg_cert_data_list = s;
		}
		free(stream);
	}
	break;
	case MDC_ATTR_SYS_TYPE_SPEC_LIST: {
		TypeVerList s;
		ByteStreamReader *stream = byte_stream_reader_instance(value, length);
		decode_typeverlist(stream, &s, &error);
		if (! error) {
			del_typeverlist(&mds->system_type_spec_list);
			mds->system_type_spec_list = s;
		}
		free(stream);
	}
	break;
	case MDC_ATTR_CONFIRM_TIMEOUT: {
		RelativeTime s;
		// del not needed
		ByteStreamReader *stream = byte_stream_reader_instance(value, length);
		s = read_intu32(stream, &error);
		if (! error)
			mds->confirm_timeout = s;
		free(stream);
	}
	break;
	default:
		DEBUG("MDS attribute unknown: %d", attribute->attribute_id);
	}
}
Пример #19
0
static int
decode_NegTokenInit(const unsigned char *p, size_t len, NegTokenInit * data, size_t * size)
{
	size_t ret = 0, reallen;
	size_t l;
	int e;

	memset(data, 0, sizeof(*data));
	reallen = 0;
	e = der_match_tag_and_length(p, len, ASN1_C_UNIV, CONS, UT_Sequence, &reallen, &l);
	FORW;
	{
		int dce_fix;
		if ((dce_fix = fix_dce(reallen, &len)) < 0)
			return ASN1_BAD_FORMAT;
		{
			size_t newlen, oldlen;

			e = der_match_tag(p, len, ASN1_C_CONTEXT, CONS, 0, &l);
			if (e)
				return e;
			else {
				p += l;
				len -= l;
				ret += l;
				e = der_get_length(p, len, &newlen, &l);
				FORW;
				{
					int dce_fix;
					oldlen = len;
					if ((dce_fix = fix_dce(newlen, &len)) < 0)
						return ASN1_BAD_FORMAT;
					e = decode_MechTypeList(p, len, &(data)->mechTypes, &l);
					FORW;
					if (dce_fix) {
						e = der_match_tag_and_length(p, len, (Der_class) 0, (Der_type) 0, 0, &reallen, &l);
						FORW;
					} else
						len = oldlen - newlen;
				}
			}
		}
		{
			size_t newlen, oldlen;

			e = der_match_tag(p, len, ASN1_C_CONTEXT, CONS, 1, &l);
			if (e)
				(data)->reqFlags = NULL;
			else {
				p += l;
				len -= l;
				ret += l;
				e = der_get_length(p, len, &newlen, &l);
				FORW;
				{
					int dce_fix;
					oldlen = len;
					if ((dce_fix = fix_dce(newlen, &len)) < 0)
						return ASN1_BAD_FORMAT;
					(data)->reqFlags = malloc(sizeof(*(data)->reqFlags));
					if ((data)->reqFlags == NULL)
						return ENOMEM;
					e = decode_ContextFlags(p, len, (data)->reqFlags, &l);
					FORW;
					if (dce_fix) {
						e = der_match_tag_and_length(p, len, (Der_class) 0, (Der_type) 0, 0, &reallen, &l);
						FORW;
					} else
						len = oldlen - newlen;
				}
			}
		}
		{
			size_t newlen, oldlen;

			e = der_match_tag(p, len, ASN1_C_CONTEXT, CONS, 2, &l);
			if (e)
				(data)->mechToken = NULL;
			else {
				p += l;
				len -= l;
				ret += l;
				e = der_get_length(p, len, &newlen, &l);
				FORW;
				{
					int dce_fix;
					oldlen = len;
					if ((dce_fix = fix_dce(newlen, &len)) < 0)
						return ASN1_BAD_FORMAT;
					(data)->mechToken = malloc(sizeof(*(data)->mechToken));
					if ((data)->mechToken == NULL)
						return ENOMEM;
					e = decode_octet_string(p, len, (data)->mechToken, &l);
					FORW;
					if (dce_fix) {
						e = der_match_tag_and_length(p, len, (Der_class) 0, (Der_type) 0, 0, &reallen, &l);
						FORW;
					} else
						len = oldlen - newlen;
				}
			}
		}
		{
			size_t newlen, oldlen;

			e = der_match_tag(p, len, ASN1_C_CONTEXT, CONS, 3, &l);
			if (e)
				(data)->mechListMIC = NULL;
			else {
				p += l;
				len -= l;
				ret += l;
				e = der_get_length(p, len, &newlen, &l);
				FORW;
				{
					int dce_fix;
					oldlen = len;
					if ((dce_fix = fix_dce(newlen, &len)) < 0)
						return ASN1_BAD_FORMAT;
					(data)->mechListMIC = malloc(sizeof(*(data)->mechListMIC));
					if ((data)->mechListMIC == NULL)
						return ENOMEM;
					e = decode_octet_string(p, len, (data)->mechListMIC, &l);
					FORW;
					if (dce_fix) {
						e = der_match_tag_and_length(p, len, (Der_class) 0, (Der_type) 0, 0, &reallen, &l);
						FORW;
					} else
						len = oldlen - newlen;
				}
			}
		}
		if (dce_fix) {
			e = der_match_tag_and_length(p, len, (Der_class) 0, (Der_type) 0, 0, &reallen, &l);
			FORW;
		}
	}
	if (size)
		*size = ret;
	return 0;
fail:
	free_NegTokenInit(data);
	return e;
}
Пример #20
0
int
decode_EncryptedData(const unsigned char *p, size_t len, EncryptedData *data, size_t *size)
{
size_t ret = 0, reallen;
size_t l;
int e;

memset(data, 0, sizeof(*data));
reallen = 0;
e = der_match_tag_and_length (p, len, ASN1_C_UNIV, CONS, UT_Sequence,&reallen, &l);
FORW;
{
int dce_fix;
if((dce_fix = fix_dce(reallen, &len)) < 0)
return ASN1_BAD_FORMAT;
{
size_t newlen, oldlen;

e = der_match_tag (p, len, ASN1_C_CONTEXT, CONS, 0, &l);
if (e)
return e;
else {
p += l;
len -= l;
ret += l;
e = der_get_length (p, len, &newlen, &l);
FORW;
{
int dce_fix;
oldlen = len;
if((dce_fix = fix_dce(newlen, &len)) < 0)return ASN1_BAD_FORMAT;
e = decode_ENCTYPE(p, len, &(data)->etype, &l);
FORW;
if(dce_fix){
e = der_match_tag_and_length (p, len, (Der_class)0, (Der_type)0, 0, &reallen, &l);
FORW;
}else 
len = oldlen - newlen;
}
}
}
{
size_t newlen, oldlen;

e = der_match_tag (p, len, ASN1_C_CONTEXT, CONS, 1, &l);
if (e)
(data)->kvno = NULL;
else {
p += l;
len -= l;
ret += l;
e = der_get_length (p, len, &newlen, &l);
FORW;
{
int dce_fix;
oldlen = len;
if((dce_fix = fix_dce(newlen, &len)) < 0)return ASN1_BAD_FORMAT;
(data)->kvno = malloc(sizeof(*(data)->kvno));
if((data)->kvno == NULL) return ENOMEM;
e = decode_integer(p, len, (data)->kvno, &l);
FORW;
if(dce_fix){
e = der_match_tag_and_length (p, len, (Der_class)0, (Der_type)0, 0, &reallen, &l);
FORW;
}else 
len = oldlen - newlen;
}
}
}
{
size_t newlen, oldlen;

e = der_match_tag (p, len, ASN1_C_CONTEXT, CONS, 2, &l);
if (e)
return e;
else {
p += l;
len -= l;
ret += l;
e = der_get_length (p, len, &newlen, &l);
FORW;
{
int dce_fix;
oldlen = len;
if((dce_fix = fix_dce(newlen, &len)) < 0)return ASN1_BAD_FORMAT;
e = decode_octet_string(p, len, &(data)->cipher, &l);
FORW;
if(dce_fix){
e = der_match_tag_and_length (p, len, (Der_class)0, (Der_type)0, 0, &reallen, &l);
FORW;
}else 
len = oldlen - newlen;
}
}
}
if(dce_fix){
e = der_match_tag_and_length (p, len, (Der_class)0, (Der_type)0, 0, &reallen, &l);
FORW;
}
}
if(size) *size = ret;
return 0;
fail:
free_EncryptedData(data);
return e;
}
Пример #21
0
/**
 * Initializes a given Enumeration attribute from stream content.
 *
 * \param enumeration the Enumeration.
 * \param attr_id the Enumeration attribute ID.
 * \param stream the value of Enumeration's attribute.
 * \param data_entry output parameter to describe data value
 *
 * \return \b 1, if the Enumeration's attribute is properly modified; \b 0 otherwise.
 *
 */
int dimutil_fill_enumeration_attr(struct Enumeration *enumeration,
				  OID_Type attr_id, ByteStreamReader *stream, DataEntry *data_entry)
{

	int result = 1;
	int error = 0;

	switch (attr_id) {
	case MDC_ATTR_ENUM_OBS_VAL_SIMP_OID:
		enumeration->enum_observed_value_simple_OID = read_intu16(stream, &error);
		if (error) {
			result = 0;
			break;
		}
		data_set_observed_value_simple_OID(data_entry,
						   "Enum-Observed-Value-Simple-OID",
						   enumeration->enum_observed_value_simple_OID);

		dimutil_fill_data_entry_partition_ids(data_entry, enumeration);

		DEBUG("ENUM ATTR: [type:%s, value:%d]" ,
		      "Enum-Observed-Value-Simple-OID",
		      enumeration->enum_observed_value_simple_OID);

		DEBUG("ENUM ATTR: [type:%s, value:%d]", "Enum-Observed-Value-Simple-OID", enumeration->enum_observed_value_simple_OID);
		break;
	case MDC_ATTR_ENUM_OBS_VAL_SIMP_BIT_STR:
		enumeration->enum_observed_value_simple_bit_str = read_intu32(stream, &error);
		if (error) {
			result = 0;
			break;
		}
		data_set_observed_value_simple_bit_str(data_entry,
						       "Enum-Observed-Value-Simple-Bit-Str",
						       enumeration->enum_observed_value_simple_bit_str);

		dimutil_fill_data_entry_partition_ids(data_entry, enumeration);

		DEBUG("ENUM ATTR: [type:%s, value:%d]", "Enum-Observed-Value-Simple-Bit-Str", enumeration->enum_observed_value_simple_bit_str);
		break;
	case MDC_ATTR_ENUM_OBS_VAL_BASIC_BIT_STR:
		enumeration->enum_observed_value_basic_bit_str = read_intu16(stream, &error);
		if (error) {
			result = 0;
			break;
		}
		data_set_observed_value_basic_bit_str(data_entry,
						      "Enum-Observed-Value-Basic-Bit-Str",
						      enumeration->enum_observed_value_basic_bit_str);

		dimutil_fill_data_entry_partition_ids(data_entry, enumeration);

		DEBUG("ENUM ATTR: [type:%s, value:%d]", "Enum-Observed-Value-Basic-Bit-Str", enumeration->enum_observed_value_basic_bit_str);
		break;
	case MDC_ATTR_ENUM_OBS_VAL_SIMP_STR:
		del_octet_string(&enumeration->enum_observed_value_simple_str);
		decode_octet_string(stream,
				    &(enumeration->enum_observed_value_simple_str),
					&error);
		if (error) {
			result = 0;
			break;
		}
		data_set_observed_value_simple_str(data_entry,
						   "Enum-Observed-Value-Simple-Str",
						   &(enumeration->enum_observed_value_simple_str));

		dimutil_fill_data_entry_partition_ids(data_entry, enumeration);

		DEBUG("ENUM ATTR: [type:%s, value:octect_string]", "Enum-Observed-Value-Simple-Str");
		break;
	case MDC_ATTR_VAL_ENUM_OBS:
		del_enumobsvalue(&enumeration->enum_observed_value);
		decode_enumobsvalue(stream, &(enumeration->enum_observed_value),
					&error);
		if (error) {
			result = 0;
			break;
		}
		data_set_enum_observed_value(data_entry,
					     "Enum-Observed-Value",
					     &(enumeration->enum_observed_value));

		dimutil_fill_data_entry_partition_ids(data_entry, enumeration);

		DEBUG("ENUM ATTR: [type:%s, value:Enum-Observed-Value]", "Enum-Observed-Value");
		break;
	case MDC_ATTR_ENUM_OBS_VAL_PART:

		enumeration->enum_observed_value_partition = read_intu16(
					stream, NULL);
		enumeration->use_nom_partition = 1;

		data_set_value_partition(data_entry,
					 "Enum-Observed-Value-Partition",
					 enumeration->enum_observed_value_partition);

		DEBUG("ENUM ATTR: [type:%s, value:%d]", "Enum-Observed-Value-Partition", enumeration->enum_observed_value_partition);
		break;
	default:
		result = dimutil_fill_metric_attr(&enumeration->metric, attr_id, stream, data_entry);
		break;

	}

	return result;
}
Пример #22
0
static int
decode_NegTokenResp(const unsigned char *p, size_t len, NegTokenResp * data, size_t * size)
{
	size_t ret = 0, reallen;
	size_t l;
	int e;

	memset(data, 0, sizeof(*data));
	reallen = 0;
	e = der_match_tag_and_length(p, len, ASN1_C_UNIV, CONS, UT_Sequence, &reallen, &l);
	FORW;
	{
		int dce_fix;
		if ((dce_fix = fix_dce(reallen, &len)) < 0)
			return ASN1_BAD_FORMAT;
		{
			size_t newlen, oldlen;

			e = der_match_tag(p, len, ASN1_C_CONTEXT, CONS, 0, &l);
			if (e)
				(data)->negState = NULL;
			else {
				p += l;
				len -= l;
				ret += l;
				e = der_get_length(p, len, &newlen, &l);
				FORW;
				{
					int mydce_fix;
					oldlen = len;
					if ((mydce_fix = fix_dce(newlen, &len)) < 0)
						return ASN1_BAD_FORMAT;
					(data)->negState = malloc(sizeof(*(data)->negState));
					if ((data)->negState == NULL)
						return ENOMEM;
					e = decode_enumerated(p, len, (data)->negState, &l);
					FORW;
					if (mydce_fix) {
						e = der_match_tag_and_length(p, len, (Der_class) 0, (Der_type) 0, 0, &reallen, &l);
						FORW;
					} else
						len = oldlen - newlen;
				}
			}
		}
		{
			size_t newlen, oldlen;

			e = der_match_tag(p, len, ASN1_C_CONTEXT, CONS, 1, &l);
			if (e)
				(data)->supportedMech = NULL;
			else {
				p += l;
				len -= l;
				ret += l;
				e = der_get_length(p, len, &newlen, &l);
				FORW;
				{
					int mydce_fix;
					oldlen = len;
					if ((mydce_fix = fix_dce(newlen, &len)) < 0)
						return ASN1_BAD_FORMAT;
					(data)->supportedMech = malloc(sizeof(*(data)->supportedMech));
					if ((data)->supportedMech == NULL)
						return ENOMEM;
					e = decode_MechType(p, len, (data)->supportedMech, &l);
					FORW;
					if (mydce_fix) {
						e = der_match_tag_and_length(p, len, (Der_class) 0, (Der_type) 0, 0, &reallen, &l);
						FORW;
					} else
						len = oldlen - newlen;
				}
			}
		}
		{
			size_t newlen, oldlen;

			e = der_match_tag(p, len, ASN1_C_CONTEXT, CONS, 2, &l);
			if (e)
				(data)->responseToken = NULL;
			else {
				p += l;
				len -= l;
				ret += l;
				e = der_get_length(p, len, &newlen, &l);
				FORW;
				{
					int mydce_fix;
					oldlen = len;
					if ((mydce_fix = fix_dce(newlen, &len)) < 0)
						return ASN1_BAD_FORMAT;
					(data)->responseToken = malloc(sizeof(*(data)->responseToken));
					if ((data)->responseToken == NULL)
						return ENOMEM;
					e = decode_octet_string(p, len, (data)->responseToken, &l);
					FORW;
					if (mydce_fix) {
						e = der_match_tag_and_length(p, len, (Der_class) 0, (Der_type) 0, 0, &reallen, &l);
						FORW;
					} else
						len = oldlen - newlen;
				}
			}
		}
		{
			size_t newlen, oldlen;

			e = der_match_tag(p, len, ASN1_C_CONTEXT, CONS, 3, &l);
			if (e)
				(data)->mechListMIC = NULL;
			else {
				p += l;
				len -= l;
				ret += l;
				e = der_get_length(p, len, &newlen, &l);
				FORW;
				{
					int mydce_fix;
					oldlen = len;
					if ((mydce_fix = fix_dce(newlen, &len)) < 0)
						return ASN1_BAD_FORMAT;
					(data)->mechListMIC = malloc(sizeof(*(data)->mechListMIC));
					if ((data)->mechListMIC == NULL)
						return ENOMEM;
					e = decode_octet_string(p, len, (data)->mechListMIC, &l);
					FORW;
					if (mydce_fix) {
						e = der_match_tag_and_length(p, len, (Der_class) 0, (Der_type) 0, 0, &reallen, &l);
						FORW;
					} else
						len = oldlen - newlen;
				}
			}
		}
		if (dce_fix) {
			e = der_match_tag_and_length(p, len, (Der_class) 0, (Der_type) 0, 0, &reallen, &l);
			FORW;
		}
	}
	if (size)
		*size = ret;
	return 0;
fail:
	free_NegTokenResp(data);
	return e;
}
Пример #23
0
/**
 * Initializes a given Metric attribute from stream content.
 *
 * \param metric the Metric.
 * \param attr_id the Metric's attribute ID.
 * \param stream the value of Metric's attribute.
 * \param data_entry output parameter to describe data value.
 *
 * \return \b 1, if the Metric's attribute is properly modified; \b 0 otherwise.
 *
 */
int dimutil_fill_metric_attr(struct Metric *metric, OID_Type attr_id,
			     ByteStreamReader *stream, DataEntry *data_entry)
{

	int result = 1;
	int error = 0;

	switch (attr_id) {
	case MDC_ATTR_ID_HANDLE:
		metric->handle = read_intu16(stream, &error);
		if (error) {
			result = 0;
			break;
		}
		data_set_handle(data_entry, "Handle", &metric->handle);
		break;
	case MDC_ATTR_ID_TYPE:
		del_type(&(metric->type));
		decode_type(stream, &(metric->type), &error);
		if (error) {
			result = 0;
			break;
		}
		data_set_type(data_entry, "Type", &metric->type);
		break;
	case MDC_ATTR_SUPPLEMENTAL_TYPES:
		del_supplementaltypelist(&metric->supplemental_types);
		decode_supplementaltypelist(stream,
					    &(metric->supplemental_types),
						&error);
		if (error) {
			result = 0;
			break;
		}
		data_set_attribute_supplemental_types(data_entry,
						"Supplemental-Types",
						&metric->supplemental_types);
		break;
	case MDC_ATTR_METRIC_SPEC_SMALL:
		del_metricspecsmall(&metric->metric_spec_small);
		decode_metricspecsmall(stream,
				       &(metric->metric_spec_small),
					&error);
		if (error) {
			result = 0;
			break;
		}
		data_set_attribute_metric_spec_small(data_entry, "Metric-Spec-Small",
					&metric->metric_spec_small);
		break;
	case MDC_ATTR_METRIC_STRUCT_SMALL:
		del_metricstructuresmall(&(metric->metric_structure_small));
		decode_metricstructuresmall(stream,
					    &(metric->metric_structure_small),
						&error);
		if (error) {
			result = 0;
			break;
		}
		data_set_attribute_metric_structure_small(data_entry, "Metric-Structure-Small",
					&metric->metric_structure_small);
		break;
	case MDC_ATTR_MSMT_STAT:
		metric->measurement_status = read_intu16(stream, &error);
		if (error) {
			result = 0;
			break;
		}
		data_set_intu16(data_entry, "Measurement-Status", &metric->measurement_status);
		break;
	case MDC_ATTR_ID_PHYSIO:
		metric->metric_id = read_intu16(stream, &error);
		if (error) {
			result = 0;
			break;
		}
		metric->use_metric_id_field = 1; // TRUE
		data_set_oid_type(data_entry, "Metric-Id", &metric->metric_id);
		break;
	case MDC_ATTR_ID_PHYSIO_LIST:
		del_metricidlist(&metric->metric_id_list);
		decode_metricidlist(stream, &metric->metric_id_list, &error);
		if (error) {
			result = 0;
			break;
		}
		data_set_metric_id_list(data_entry, "Metric-Id-List", &metric->metric_id_list);
		break;
	case MDC_ATTR_METRIC_ID_PART:
		metric->metric_id_partition = read_intu16(stream, &error);
		if (error) {
			result = 0;
			break;
		}
		metric->use_metric_id_partition_field = 1; // TRUE
		data_set_intu16(data_entry, "Metric-Id-Partition", &metric->metric_id_partition);
		break;
	case MDC_ATTR_UNIT_CODE:
		metric->unit_code = read_intu16(stream, &error);
		if (error) {
			result = 0;
			break;
		}
		data_set_oid_type(data_entry, "Unit-Code", &metric->unit_code);
		break;
	case MDC_ATTR_ATTRIBUTE_VAL_MAP:
		del_attrvalmap(&metric->attribute_value_map);
		decode_attrvalmap(stream, &(metric->attribute_value_map), &error);
		if (error) {
			result = 0;
			break;
		}
		data_set_attribute_value_map(data_entry, "Attribute-Value-Map",
						&metric->attribute_value_map);
		break;
	case MDC_ATTR_SOURCE_HANDLE_REF:
		metric->source_handle_reference = read_intu16(stream, &error);
		if (error) {
			result = 0;
			break;
		}
		data_set_handle(data_entry, "Source-Handle-Reference", &metric->source_handle_reference);
		break;
	case MDC_ATTR_ID_LABEL_STRING:
		del_octet_string(&metric->label_string);
		decode_octet_string(stream, &(metric->label_string), &error);
		if (error) {
			result = 0;
			break;
		}
		data_set_label_string(data_entry, "Label-String", &metric->label_string);
		break;
	case MDC_ATTR_UNIT_LABEL_STRING:
		del_octet_string(&metric->unit_label_string);
		decode_octet_string(stream, &(metric->unit_label_string), &error);
		if (error) {
			result = 0;
			break;
		}
		data_set_label_string(data_entry, "Unit-LabelString", &metric->unit_label_string);
		break;
	case MDC_ATTR_TIME_STAMP_ABS:
		del_absolutetime(&metric->absolute_time_stamp);
		decode_absolutetime(stream, &(metric->absolute_time_stamp), &error);
		if (error) {
			result = 0;
			break;
		}
		data_set_absolute_time(data_entry, "Absolute-Time-Stamp",
				       &metric->absolute_time_stamp);
		break;
	case MDC_ATTR_TIME_STAMP_REL:
		metric->relative_time_stamp = read_intu32(stream, &error);
		if (error) {
			result = 0;
			break;
		}
		data_set_intu32(data_entry, "Relative-Time-Stamp", &metric->relative_time_stamp);
		break;
	case MDC_ATTR_TIME_STAMP_REL_HI_RES:
		del_highresrelativetime(&metric->hi_res_time_stamp);
		decode_highresrelativetime(stream,
					   &(metric->hi_res_time_stamp),
						&error);
		if (error) {
			result = 0;
			break;
		}
		data_set_high_res_relative_time(data_entry, "HiRes-Time-Stamp", &metric->hi_res_time_stamp);
		break;
	case MDC_ATTR_TIME_PD_MSMT_ACTIVE:
		metric->measure_active_period = read_float(stream, &error);
		if (error) {
			result = 0;
			break;
		}
		data_set_float(data_entry, "Measure-Active-Period", &metric->measure_active_period);
		break;
	default:
		DEBUG("Unrecognized metric attribute-id %d", attr_id);
		break;
	}

	return result;
}