示例#1
0
static int
encode_NegTokenResp(unsigned char *p, size_t len, const NegTokenResp * data, size_t * size)
{
	size_t ret = 0;
	size_t l;
	int e;

	if ((data)->mechListMIC) {
		size_t oldret = ret;
		ret = 0;
		e = encode_octet_string(p, len, (data)->mechListMIC, &l);
		BACK;
		e = der_put_length_and_tag(p, len, ret, ASN1_C_CONTEXT, CONS, 3, &l);
		BACK;
		ret += oldret;
	}
	if ((data)->responseToken) {
		size_t oldret = ret;
		ret = 0;
		e = encode_octet_string(p, len, (data)->responseToken, &l);
		BACK;
		e = der_put_length_and_tag(p, len, ret, ASN1_C_CONTEXT, CONS, 2, &l);
		BACK;
		ret += oldret;
	}
	if ((data)->supportedMech) {
		size_t oldret = ret;
		ret = 0;
		e = encode_MechType(p, len, (data)->supportedMech, &l);
		BACK;
		e = der_put_length_and_tag(p, len, ret, ASN1_C_CONTEXT, CONS, 1, &l);
		BACK;
		ret += oldret;
	}
	if ((data)->negState) {
		size_t oldret = ret;
		ret = 0;
		e = encode_enumerated(p, len, (data)->negState, &l);
		BACK;
		e = der_put_length_and_tag(p, len, ret, ASN1_C_CONTEXT, CONS, 0, &l);
		BACK;
		ret += oldret;
	}
	e = der_put_length_and_tag(p, len, ret, ASN1_C_UNIV, CONS, UT_Sequence, &l);
	BACK;
	*size = ret;
	return 0;
}
int encode_lcs_client_identity(LcsClientIdentity *lcsclientidentity, uint8_t iei, uint8_t *buffer, uint32_t len)
{
  uint8_t *lenPtr;
  uint32_t encoded = 0;
  int encode_result;
  /* Checking IEI and pointer */
  CHECK_PDU_POINTER_AND_LENGTH_ENCODER(buffer, LCS_CLIENT_IDENTITY_MINIMUM_LENGTH, len);
#if defined (NAS_DEBUG)
  dump_lcs_client_identity_xml(lcsclientidentity, iei);
#endif

  if (iei > 0) {
    *buffer = iei;
    encoded++;
  }

  lenPtr  = (buffer + encoded);
  encoded ++;

  if ((encode_result = encode_octet_string(&lcsclientidentity->lcsclientidentityvalue, buffer + encoded, len - encoded)) < 0)
    return encode_result;
  else
    encoded += encode_result;

  *lenPtr = encoded - 1 - ((iei > 0) ? 1 : 0);
  return encoded;
}
int
encode_ms_network_capability (
  MsNetworkCapability * msnetworkcapability,
  uint8_t iei,
  uint8_t * buffer,
  uint32_t len)
{
  uint8_t                                *lenPtr;
  uint32_t                                encoded = 0;
  int                                     encode_result;

  /*
   * Checking IEI and pointer
   */
  CHECK_PDU_POINTER_AND_LENGTH_ENCODER (buffer, MS_NETWORK_CAPABILITY_MINIMUM_LENGTH, len);
#if NAS_DEBUG
  dump_ms_network_capability_xml (msnetworkcapability, iei);
#endif

  if (iei > 0) {
    *buffer = iei;
    encoded++;
  }

  lenPtr = (buffer + encoded);
  encoded++;

  if ((encode_result = encode_octet_string (&msnetworkcapability->msnetworkcapabilityvalue, buffer + encoded, len - encoded)) < 0)
    return encode_result;
  else
    encoded += encode_result;

  *lenPtr = encoded - 1 - ((iei > 0) ? 1 : 0);
  return encoded;
}
int encode_esm_message_container(EsmMessageContainer *esmmessagecontainer, uint8_t iei, uint8_t *buffer, uint32_t len)
{
    uint8_t *lenPtr;
    uint32_t encoded = 0;
    int32_t encode_result;
    /* Checking IEI and pointer */
    CHECK_PDU_POINTER_AND_LENGTH_ENCODER(buffer, ESM_MESSAGE_CONTAINER_MINIMUM_LENGTH, len);
#if defined (NAS_DEBUG)
    dump_esm_message_container_xml(esmmessagecontainer, iei);
#endif

    if (iei > 0) {
        *buffer = iei;
        encoded++;
    }

    lenPtr  = (buffer + encoded);

    //encoded += 2;
    //if ((encode_result = encode_octet_string(&esmmessagecontainer->esmmessagecontainercontents, buffer + sizeof(uint16_t), len - sizeof(uint16_t))) < 0)
    if ((encode_result = encode_octet_string(&esmmessagecontainer->esmmessagecontainercontents, lenPtr + sizeof(uint16_t), len - sizeof(uint16_t))) < 0)
        return encode_result;
    else
        encoded += encode_result;

    ENCODE_U16(lenPtr, encode_result, encoded);
#if 0
    lenPtr[1] = (((encoded - 2 - ((iei > 0) ? 1: 0))) & 0x0000ff00) >> 8;
    lenPtr[0] =  ((encoded - 2 - ((iei > 0) ? 1: 0))) & 0x000000ff;
#endif
    return encoded;
}
int
encode_p_tmsi_signature (
  PTmsiSignature * ptmsisignature,
  uint8_t iei,
  uint8_t * buffer,
  uint32_t len)
{
  uint32_t                                encode_result;
  uint32_t                                encoded = 0;

  /*
   * Checking IEI and pointer
   */
  CHECK_PDU_POINTER_AND_LENGTH_ENCODER (buffer, P_TMSI_SIGNATURE_MINIMUM_LENGTH, len);
#if NAS_DEBUG
  dump_p_tmsi_signature_xml (ptmsisignature, iei);
#endif

  if (iei > 0) {
    *buffer = iei;
    encoded++;
  }

  if ((encode_result = encode_octet_string (&ptmsisignature->ptmsisignaturevalue, buffer + encoded, len - encoded)) < 0)
    return encode_result;
  else
    encoded += encode_result;

  return encoded;
}
int
encode_TransitedEncoding(unsigned char *p, size_t len, const TransitedEncoding *data, size_t *size)
{
size_t ret = 0;
size_t l;
int i, e;

i = 0;
{
int oldret = ret;
ret = 0;
e = encode_octet_string(p, len, &(data)->contents, &l);
BACK;
e = der_put_length_and_tag (p, len, ret, ASN1_C_CONTEXT, CONS, 1, &l);
BACK;
ret += oldret;
}
{
int oldret = ret;
ret = 0;
e = encode_integer(p, len, &(data)->tr_type, &l);
BACK;
e = der_put_length_and_tag (p, len, ret, ASN1_C_CONTEXT, CONS, 0, &l);
BACK;
ret += oldret;
}
e = der_put_length_and_tag (p, len, ret, ASN1_C_UNIV, CONS, UT_Sequence, &l);
BACK;
*size = ret;
return 0;
}
int encode_nas_message_container(NasMessageContainer *nasmessagecontainer, uint8_t iei, uint8_t *buffer, uint32_t len)
{
  uint8_t *lenPtr;
  uint32_t encoded = 0;
  int encode_result;
  /* Checking IEI and pointer */
  CHECK_PDU_POINTER_AND_LENGTH_ENCODER(buffer, NAS_MESSAGE_CONTAINER_MINIMUM_LENGTH, len);
#if defined (NAS_DEBUG)
  dump_nas_message_container_xml(nasmessagecontainer, iei);
#endif

  if (iei > 0) {
    *buffer = iei;
    encoded++;
  }

  lenPtr  = (buffer + encoded);
  encoded ++;

  if ((encode_result = encode_octet_string(&nasmessagecontainer->nasmessagecontainercontents, buffer + encoded, len - encoded)) < 0)
    return encode_result;
  else
    encoded += encode_result;

  *lenPtr = encoded - 1 - ((iei > 0) ? 1 : 0);
  return encoded;
}
int encode_authentication_failure_parameter(AuthenticationFailureParameter *authenticationfailureparameter, uint8_t iei, uint8_t *buffer, uint32_t len)
{
  uint8_t *lenPtr;
  uint32_t encoded = 0;
  int encode_result;
  /* Checking IEI and pointer */
  CHECK_PDU_POINTER_AND_LENGTH_ENCODER(buffer, AUTHENTICATION_FAILURE_PARAMETER_MINIMUM_LENGTH, len);
#if defined (NAS_DEBUG)
  dump_authentication_failure_parameter_xml(authenticationfailureparameter, iei);
#endif

  if (iei > 0) {
    *buffer = iei;
    encoded++;
  }

  lenPtr  = (buffer + encoded);
  encoded ++;

  if ((encode_result = encode_octet_string(&authenticationfailureparameter->auts, buffer + encoded, len - encoded)) < 0)
    return encode_result;
  else
    encoded += encode_result;

  *lenPtr = encoded - 1 - ((iei > 0) ? 1 : 0);
  return encoded;
}
int encode_pdn_address(PdnAddress *pdnaddress, uint8_t iei, uint8_t *buffer, uint32_t len)
{
  uint8_t *lenPtr;
  uint32_t encoded = 0;
  int encode_result;
  /* Checking IEI and pointer */
  CHECK_PDU_POINTER_AND_LENGTH_ENCODER(buffer, PDN_ADDRESS_MINIMUM_LENGTH, len);
#if defined (NAS_DEBUG)
  dump_pdn_address_xml(pdnaddress, iei);
#endif

  if (iei > 0) {
    *buffer = iei;
    encoded++;
  }

  lenPtr  = (buffer + encoded);
  encoded ++;
  *(buffer + encoded) = 0x00 |
                        (pdnaddress->pdntypevalue & 0x7);
  encoded++;

  if ((encode_result = encode_octet_string(&pdnaddress->pdnaddressinformation, buffer + encoded, len - encoded)) < 0)
    return encode_result;
  else
    encoded += encode_result;

  *lenPtr = encoded - 1 - ((iei > 0) ? 1 : 0);
  return encoded;
}
示例#10
0
int
encode_PA_DATA(unsigned char *p, size_t len, const PA_DATA *data, size_t *size)
{
size_t ret = 0;
size_t l;
int i, e;

i = 0;
{
int oldret = ret;
ret = 0;
e = encode_octet_string(p, len, &(data)->padata_value, &l);
BACK;
e = der_put_length_and_tag (p, len, ret, ASN1_C_CONTEXT, CONS, 2, &l);
BACK;
ret += oldret;
}
{
int oldret = ret;
ret = 0;
e = encode_PADATA_TYPE(p, len, &(data)->padata_type, &l);
BACK;
e = der_put_length_and_tag (p, len, ret, ASN1_C_CONTEXT, CONS, 1, &l);
BACK;
ret += oldret;
}
e = der_put_length_and_tag (p, len, ret, ASN1_C_UNIV, CONS, UT_Sequence, &l);
BACK;
*size = ret;
return 0;
}
int
encode_authentication_parameter_autn (
  AuthenticationParameterAutn * authenticationparameterautn,
  uint8_t iei,
  uint8_t * buffer,
  uint32_t len)
{
  uint8_t                                *lenPtr;
  int                                     encode_result;
  uint32_t                                encoded = 0;

  /*
   * Checking IEI and pointer
   */
  CHECK_PDU_POINTER_AND_LENGTH_ENCODER (buffer, AUTHENTICATION_PARAMETER_AUTN_MINIMUM_LENGTH, len);
#if NAS_DEBUG
  dump_authentication_parameter_autn_xml (authenticationparameterautn, iei);
#endif

  if (iei > 0) {
    *buffer = iei;
    encoded++;
  }

  lenPtr = (buffer + encoded);
  encoded++;

  if ((encode_result = encode_octet_string (&authenticationparameterautn->autn, buffer + encoded, len - encoded)) < 0)
    return encode_result;
  else
    encoded += encode_result;

  *lenPtr = encoded - 1 - ((iei > 0) ? 1 : 0);
  return encoded;
}
示例#12
0
static int
encode_NegTokenInit(unsigned char *p, size_t len, const NegTokenInit * data, size_t * size)
{
	size_t ret = 0;
	size_t l;
	int e;

	if ((data)->mechListMIC) {
		size_t oldret = ret;
		ret = 0;
		e = encode_octet_string(p, len, (data)->mechListMIC, &l);
		BACK;
		e = der_put_length_and_tag(p, len, ret, ASN1_C_CONTEXT, CONS, 3, &l);
		BACK;
		ret += oldret;
	}
	if ((data)->mechToken) {
		size_t oldret = ret;
		ret = 0;
		e = encode_octet_string(p, len, (data)->mechToken, &l);
		BACK;
		e = der_put_length_and_tag(p, len, ret, ASN1_C_CONTEXT, CONS, 2, &l);
		BACK;
		ret += oldret;
	}
	if ((data)->reqFlags) {
		size_t oldret = ret;
		ret = 0;
		e = encode_ContextFlags(p, len, (data)->reqFlags, &l);
		BACK;
		e = der_put_length_and_tag(p, len, ret, ASN1_C_CONTEXT, CONS, 1, &l);
		BACK;
		ret += oldret;
	} {
		size_t oldret = ret;
		ret = 0;
		e = encode_MechTypeList(p, len, &(data)->mechTypes, &l);
		BACK;
		e = der_put_length_and_tag(p, len, ret, ASN1_C_CONTEXT, CONS, 0, &l);
		BACK;
		ret += oldret;
	}
	e = der_put_length_and_tag(p, len, ret, ASN1_C_UNIV, CONS, UT_Sequence, &l);
	BACK;
	*size = ret;
	return 0;
}
int encode_authentication_parameter_rand(AuthenticationParameterRand *authenticationparameterrand, uint8_t iei, uint8_t *buffer, uint32_t len)
{
    uint32_t encode_result;
    uint32_t encoded = 0;
    /* Checking IEI and pointer */
    CHECK_PDU_POINTER_AND_LENGTH_ENCODER(buffer, AUTHENTICATION_PARAMETER_RAND_MINIMUM_LENGTH, len);
#if defined (NAS_DEBUG)
    dump_authentication_parameter_rand_xml(authenticationparameterrand, iei);
#endif
    if (iei > 0)
    {
        *buffer = iei;
        encoded++;
    }
    if ((encode_result = encode_octet_string(&authenticationparameterrand->rand, buffer + encoded, len - encoded)) < 0)
        return encode_result;
    else
        encoded += encode_result;
    return encoded;
}
示例#14
0
int
encode_EncryptedData(unsigned char *p, size_t len, const EncryptedData *data, size_t *size)
{
size_t ret = 0;
size_t l;
int i, e;

i = 0;
{
int oldret = ret;
ret = 0;
e = encode_octet_string(p, len, &(data)->cipher, &l);
BACK;
e = der_put_length_and_tag (p, len, ret, ASN1_C_CONTEXT, CONS, 2, &l);
BACK;
ret += oldret;
}
if((data)->kvno)
{
int oldret = ret;
ret = 0;
e = encode_integer(p, len, (data)->kvno, &l);
BACK;
e = der_put_length_and_tag (p, len, ret, ASN1_C_CONTEXT, CONS, 1, &l);
BACK;
ret += oldret;
}
{
int oldret = ret;
ret = 0;
e = encode_ENCTYPE(p, len, &(data)->etype, &l);
BACK;
e = der_put_length_and_tag (p, len, ret, ASN1_C_CONTEXT, CONS, 0, &l);
BACK;
ret += oldret;
}
e = der_put_length_and_tag (p, len, ret, ASN1_C_UNIV, CONS, UT_Sequence, &l);
BACK;
*size = ret;
return 0;
}
示例#15
0
int encode_cli(Cli *cli, uint8_t iei, uint8_t *buffer, uint32_t len)
{
    uint8_t *lenPtr;
    uint32_t encoded = 0;
    int encode_result;
    /* Checking IEI and pointer */
    CHECK_PDU_POINTER_AND_LENGTH_ENCODER(buffer, CLI_MINIMUM_LENGTH, len);
#if defined (NAS_DEBUG)
    dump_cli_xml(cli, iei);
#endif
    if (iei > 0)
    {
        *buffer = iei;
        encoded++;
    }
    lenPtr  = (buffer + encoded);
    encoded ++;
    if ((encode_result = encode_octet_string(&cli->clivalue, buffer + encoded, len - encoded)) < 0)
        return encode_result;
    else
        encoded += encode_result;
    *lenPtr = encoded - 1 - ((iei > 0) ? 1 : 0);
    return encoded;
}
示例#16
0
/**
 * Gets all attributes of MDS Instance as an array of AVA_Type's
 *
 * \param mds the mds.
 * \param count The number of attributes
 * \param tot_length The total length of the MDS
 * \return Array of AVA_Type with attributes
 */
AVA_Type* mds_get_attributes(MDS *mds, intu16* count, intu16 *tot_length)
{
	int i;
	*count = 17;
	AVA_Type *ava = calloc(*count, sizeof(AVA_Type));
	intu16 length;
	ByteStreamWriter *stream;

	*tot_length += 17 * sizeof(ava[0].attribute_id);
	*tot_length += 17 * sizeof(ava[0].attribute_value.length);

	length = 4;
	ava[0].attribute_id = MDC_ATTR_SYS_TYPE;
	stream = byte_stream_writer_instance(length);
	encode_type(stream, &mds->system_type);
	ava[0].attribute_value.value = stream->buffer;
	ava[0].attribute_value.length = length;
	// stream buffer lives beyond stream
	free(stream);
	*tot_length += length;

	length = sizeof(intu16) * 2 + mds->system_model.manufacturer.length +
					mds->system_model.model_number.length;
	ava[1].attribute_id = MDC_ATTR_ID_MODEL;
	stream = byte_stream_writer_instance(length);
	encode_systemmodel(stream, &mds->system_model);
	ava[1].attribute_value.value = stream->buffer;
	ava[1].attribute_value.length = length;
	free(stream);
	*tot_length += length;

	// length includes intu16 because it is variable-size
	length = sizeof(intu16) + mds->system_id.length;
	ava[2].attribute_id = MDC_ATTR_SYS_ID;
	stream = byte_stream_writer_instance(length);
	encode_octet_string(stream, &mds->system_id);
	ava[2].attribute_value.value = stream->buffer;
	ava[2].attribute_value.length = length;
	free(stream);
	*tot_length += length;

	length = 2;
	ava[3].attribute_id = MDC_ATTR_DEV_CONFIG_ID;
	stream = byte_stream_writer_instance(length);
	encode_configid(stream, &mds->dev_configuration_id);
	ava[3].attribute_value.value = stream->buffer;
	ava[3].attribute_value.length = length;
	free(stream);
	*tot_length += length;

	length = 2 + 2 + mds->attribute_value_map.count * (2 + 2);
	ava[4].attribute_id = MDC_ATTR_ATTRIBUTE_VAL_MAP;
	stream = byte_stream_writer_instance(length);
	encode_attrvalmap(stream, &mds->attribute_value_map);
	ava[4].attribute_value.value = stream->buffer;
	ava[4].attribute_value.length = length;
	free(stream);
	*tot_length += length;

	length = 2 + 2 + mds->production_specification.count * (2 + 2 + 2);

        for (i = 0; i < mds->production_specification.count; i++) {
		ProdSpecEntry *entry = &mds->production_specification.value[i];
		length += entry->prod_spec.length;
        }

	ava[5].attribute_id = MDC_ATTR_ID_PROD_SPECN;
	stream = byte_stream_writer_instance(length);
	encode_productionspec(stream, &mds->production_specification);
	ava[5].attribute_value.value = stream->buffer;
	ava[5].attribute_value.length = length;
	free(stream);
	*tot_length += length;

	length = 2 + 2 + 4 + 2 + 2 + 4;
	ava[6].attribute_id = MDC_ATTR_MDS_TIME_INFO;
	stream = byte_stream_writer_instance(length);
	encode_mdstimeinfo(stream, &mds->mds_time_info);
	ava[6].attribute_value.value = stream->buffer;
	ava[6].attribute_value.length = length;
	free(stream);
	*tot_length += length;

	length = 8;
	ava[7].attribute_id = MDC_ATTR_TIME_ABS;
	stream = byte_stream_writer_instance(length);
	encode_absolutetime(stream, &mds->date_and_time);
	ava[7].attribute_value.value = stream->buffer;
	ava[7].attribute_value.length = length;
	free(stream);
	*tot_length += length;

	length = 4;
	ava[8].attribute_id = MDC_ATTR_TIME_REL;
	stream = byte_stream_writer_instance(length);
	write_intu32(stream, mds->relative_time);
	ava[8].attribute_value.value = stream->buffer;
	ava[8].attribute_value.length = length;
	free(stream);
	*tot_length += length;

	length = 8;
	ava[9].attribute_id = MDC_ATTR_TIME_REL_HI_RES;
	stream = byte_stream_writer_instance(length);
	encode_highresrelativetime(stream, &mds->hires_relative_time);
	ava[9].attribute_value.value = stream->buffer;
	ava[9].attribute_value.length = length;
	free(stream);
	*tot_length += length;

	length = 6;
	ava[10].attribute_id = MDC_ATTR_TIME_ABS_ADJUST;
	stream = byte_stream_writer_instance(length);
	encode_absolutetimeadjust(stream, &mds->date_and_time_adjustment);
	ava[10].attribute_value.value = stream->buffer;
	ava[10].attribute_value.length = length;
	free(stream);
	*tot_length += length;

	length = 2;
	ava[11].attribute_id = MDC_ATTR_POWER_STAT;
	stream = byte_stream_writer_instance(length);
	write_intu16(stream, mds->power_status);
	ava[11].attribute_value.value = stream->buffer;
	ava[11].attribute_value.length = length;
	free(stream);
	*tot_length += length;

	length = 2;
	ava[12].attribute_id = MDC_ATTR_VAL_BATT_CHARGE;
	stream = byte_stream_writer_instance(length);
	write_intu16(stream, mds->battery_level);
	ava[12].attribute_value.value = stream->buffer;
	ava[12].attribute_value.length = length;
	free(stream);
	*tot_length += length;

	length = 4 + 2;
	ava[13].attribute_id = MDC_ATTR_TIME_BATT_REMAIN;
	stream = byte_stream_writer_instance(length);
	encode_batmeasure(stream, &mds->remaining_battery_time);
	ava[13].attribute_value.value = stream->buffer;
	ava[13].attribute_value.length = length;
	free(stream);
	*tot_length += length;

	length = 2 + 2 + mds->reg_cert_data_list.count * ((1 + 1) + 2);

        for (i = 0; i < mds->reg_cert_data_list.count; i++) {
		RegCertData *entry = &mds->reg_cert_data_list.value[i];
		length += entry->auth_body_data.length;
        }

	ava[14].attribute_id = MDC_ATTR_REG_CERT_DATA_LIST;
	stream = byte_stream_writer_instance(length);
	encode_regcertdatalist(stream, &mds->reg_cert_data_list);
	ava[14].attribute_value.value = stream->buffer;
	ava[14].attribute_value.length = length;
	free(stream);
	*tot_length += length;

	length = 2 + 2 + mds->system_type_spec_list.count * (2 + 2);
	ava[15].attribute_id = MDC_ATTR_SYS_TYPE_SPEC_LIST;
	stream = byte_stream_writer_instance(length);
	encode_typeverlist(stream, &mds->system_type_spec_list);
	ava[15].attribute_value.value = stream->buffer;
	ava[15].attribute_value.length = length;
	free(stream);
	*tot_length += length;

	length = 4;
	ava[16].attribute_id = MDC_ATTR_CONFIRM_TIMEOUT;
	stream = byte_stream_writer_instance(length);
	write_intu32(stream, mds->confirm_timeout);
	ava[16].attribute_value.value = stream->buffer;
	ava[16].attribute_value.length = length;
	free(stream);
	*tot_length += length;

	return ava;
}