Example #1
0
static void
verify(int testNo, T_t *ti) {
	asn_enc_rval_t er;
	asn_dec_rval_t rv;
	unsigned char buf[16];
	T_t *to = 0;

	fprintf(stderr, "%d IN: { %ld, %ld, %lu, %lu }\n", testNo,
		ti->small32range, ti->full32range,
		ti->unsigned32, ti->unsplit32);

	er = uper_encode_to_buffer(&asn_DEF_T, ti, buf, sizeof buf);
	assert(er.encoded == 8 * sizeof(buf));

	rv = uper_decode(0, &asn_DEF_T, (void *)&to, buf, sizeof buf, 0, 0);
	assert(rv.code == RC_OK);

	fprintf(stderr, "%d ENC: %2x%2x%2x%2x %2x%2x%2x%2x\n", testNo,
		buf[0], buf[1], buf[2], buf[3],
		buf[4], buf[5], buf[6], buf[7]);
	fprintf(stderr, "%d OUT: { %ld, %ld, %lu, %lu } vs { %ld, %ld, %lu, %lu }\n",
		testNo,
		ti->small32range, ti->full32range,
			ti->unsigned32, ti->unsplit32,
		to->small32range, to->full32range,
			to->unsigned32, to->unsplit32);
	assert(ti->small32range == to->small32range);
	assert(ti->full32range == to->full32range);
	assert(ti->unsigned32 == to->unsigned32);
	assert(ti->unsplit32 == to->unsplit32);

	xer_fprint(stderr, &asn_DEF_T, ti);
	xer_fprint(stderr, &asn_DEF_T, to);
}
Example #2
0
static void
verify(int testNo, T_t *ti) {
    asn_enc_rval_t er;
    asn_dec_rval_t rv;
    unsigned char buf[2];
    T_t *to = 0;

    er = uper_encode_to_buffer(&asn_DEF_T, ti, buf, sizeof buf);
    fprintf(stderr, "%d IN: %d => %zd\n", testNo, ti->present, er.encoded);
    assert(er.encoded >= 1 && er.encoded <= (ssize_t)(8 * sizeof(buf)));

    rv = uper_decode(0, &asn_DEF_T, (void *)&to, buf, sizeof buf, 0, 0);
    assert(rv.code == RC_OK);

    fprintf(stderr, "%d ENC: %2x%2x\n", testNo,
            buf[0], buf[1]);
    fprintf(stderr, "%d OUT: %d\n", testNo, ti->present);
    assert(ti->present == to->present);
    if(ti->present == T_PR_second) {
        assert(ti->choice.second == to->choice.second);
    } else {
        assert(ti->choice.first.present == to->choice.first.present);
        assert(ti->choice.first.choice.nothing == to->choice.first.choice.nothing);
    }

    xer_fprint(stderr, &asn_DEF_T, ti);
    xer_fprint(stderr, &asn_DEF_T, to);
}
/*
 **************************************************************************
 * Function: RRLP_DecodeMessage
 *
 * Parameters:
 *   [In] uint32_t,
 *        uint8_t*
 *   [Out] RRLP_ASN1_pdu_t**
 *
 * Return value: boolean
 *
 * Description: Decode the SUPL message from ASN.1
 **************************************************************************
*/
boolean RRLP_DecodeMessage(const uint32_t encoded_length, const uint8_t * const encoded_buffer, RRLP_ASN1_pdu_t * *rrlp_message)
{
    RRLP_ASN1_pdu_t *decoded_message = NULL;

    boolean decoded = FALSE;

    asn_codec_ctx_t *opt_codec_ctx = 0;
    char *encoded_message;
    size_t encoded_message_len;
    asn_dec_rval_t rval;
    int ecbits = 0;        // Extra consumed bits in case of PER

    // ASN.1 input messsage
    encoded_message = (char *) encoded_buffer;
    encoded_message_len = encoded_length;

    // Pretend immediate EOF
    rval.code = RC_WMORE;
    rval.consumed = 0;

    rval = uper_decode(opt_codec_ctx, &RRLP_ASN1_PDU, (void **) &decoded_message, encoded_message, encoded_message_len, 0, 0);

    ecbits = rval.consumed % 8;    // Extra bits
    rval.consumed /= 8;        // Convert to value in bytes!

    if (rval.code == RC_OK) {
    *rrlp_message = (RRLP_ASN1_pdu_t *) decoded_message;

    decoded = TRUE;
    } else {
//    RRLP_ERR_("RRLP ASN1 Decoding Error -> %d!\n", rval.code);
    }

    return (decoded);
}
Example #4
0
static void
verify(int testNo, T_t *ti) {
	asn_enc_rval_t er;
	asn_dec_rval_t rv;
	unsigned char buf[20];
	T_t *to = 0;

	fprintf(stderr, "%d IN: { %lu, %lu, %ld, %ld }\n", testNo,
		i2ul(&ti->unsigned33), i2ul(&ti->unsigned42),
		i2l(&ti->signed33), i2l(&ti->signed33ext)
    );

	er = uper_encode_to_buffer(&asn_DEF_T, ti, buf, sizeof buf);
	assert(er.encoded >= 33 + 42 + 33 + 1 + 33);

	rv = uper_decode(0, &asn_DEF_T, (void *)&to, buf, sizeof buf, 0, 0);
	assert(rv.code == RC_OK);

	fprintf(stderr, "%d ENC: %2x%2x%2x%2x %2x%2x%2x%2x\n", testNo,
		buf[0], buf[1], buf[2], buf[3],
		buf[4], buf[5], buf[6], buf[7]);
	fprintf(stderr, "%d OUT: { %lu, %lu, %ld, %ld } vs { %lu, %lu, %ld, %ld }\n",
		testNo,
		i2ul(&ti->unsigned33), i2ul(&ti->unsigned42),
		i2l(&ti->signed33), i2l(&ti->signed33ext),
		i2ul(&to->unsigned33), i2ul(&to->unsigned42),
		i2l(&to->signed33), i2l(&to->signed33ext));
	assert(i2ul(&ti->unsigned33) == i2ul(&to->unsigned33));
	assert(i2ul(&ti->unsigned42) == i2ul(&to->unsigned42));
	assert(i2l(&ti->signed33) == i2l(&to->signed33));
	assert(i2l(&ti->signed33ext) == i2l(&to->signed33ext));

	xer_fprint(stderr, &asn_DEF_T, ti);
	xer_fprint(stderr, &asn_DEF_T, to);
}
/*
 **************************************************************************
 * Function: SUPL_decode_header
 *
 * Parameters:
 *   [In] uint32_t,
 *        uint8_t*
 *   [Out] SUPL_ASN1_ulp_hdr_t**
 *
 * Return value: boolean
 *
 * Description: Decode the SUPL header from ASN.1
 **************************************************************************
*/
boolean SUPL_decode_header(
  const uint32_t encoded_length,
  const uint8_t * const encoded_buffer,
  SUPL_ASN1_ulp_hdr_t * * supl_header)
{
  SUPL_ASN1_ulp_hdr_t *decoded_message = NULL;

  boolean decoded = FALSE;

    asn_codec_ctx_t *opt_codec_ctx = 0;
  char *encoded_message;
  size_t encoded_message_len;
    asn_dec_rval_t rval;

  // ASN.1 input messsage
    encoded_message = (char*)encoded_buffer;
    encoded_message_len = encoded_length;

    rval = uper_decode(opt_codec_ctx, &SUPL_ASN1_HDR_ULP_PDU, (void **)&decoded_message, encoded_message, encoded_message_len, 0,    0);

  if (rval.code == RC_OK)
  {
    *supl_header = (SUPL_ASN1_ulp_hdr_t *)decoded_message;

    decoded = TRUE;
  }
  else
  {
//    SUPL_ERR_("SUPL ASN1 Decoding Error -> %d !\n", rval.code);
  }

  return (decoded);
}
Example #6
0
/*
 * Decode a "Production of a complete encoding", X.691#10.1.
 * The complete encoding contains at least one byte, and is an integral
 * multiple of 8 bytes.
 */
asn_dec_rval_t
uper_decode_complete(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, void **sptr, const void *buffer, size_t size) {
    asn_dec_rval_t rval;

    rval = uper_decode(opt_codec_ctx, td, sptr, buffer, size, 0, 0);
    if(rval.consumed) {
        /*
         * We've always given 8-aligned data,
         * so convert bits to integral bytes.
         */
        rval.consumed += 7;
        rval.consumed >>= 3;
    } else if(rval.code == RC_OK) {
static PDU_t *
load_object_from(const char *fname, char *fbuf, int size, enum enctype how, int mustfail) {
	asn_dec_rval_t rval;
	PDU_t *st = 0;
	int csize = 1;

	if(getenv("INITIAL_CHUNK_SIZE"))
		csize = atoi(getenv("INITIAL_CHUNK_SIZE"));

	/* Perform multiple iterations with multiple chunks sizes */
	for(; csize < 20; csize += 1) {
		int fbuf_offset = 0;
		int fbuf_left = size;
		int fbuf_chunk = csize;

		fprintf(stderr, "LOADING OBJECT OF SIZE %d FROM [%s] as %s,"
			" chunks %d\n",
			size, fname, how==AS_PER?"PER":"XER", csize);

		if(st) asn_DEF_PDU.free_struct(&asn_DEF_PDU, st, 0);
		st = 0;

		do {
			fprintf(stderr, "\nDecoding bytes %d..%d (left %d) [%s]\n",
				fbuf_offset,
					fbuf_chunk < fbuf_left
						? fbuf_chunk : fbuf_left,
					fbuf_left,
				fname);
			if(st) {
				fprintf(stderr, "=== currently ===\n");
				asn_fprint(stderr, &asn_DEF_PDU, st);
				fprintf(stderr, "=== end ===\n");
			}
			switch(how) {
			case AS_XER:
				rval = xer_decode(0, &asn_DEF_PDU, (void **)&st,
					fbuf + fbuf_offset,
					fbuf_chunk < fbuf_left 
					? fbuf_chunk : fbuf_left);
				break;
			case AS_DER:
				assert(0);
				break;
			case AS_PER:
				rval = uper_decode(0, &asn_DEF_PDU,
					(void **)&st, fbuf + fbuf_offset,
					fbuf_chunk < fbuf_left 
					? fbuf_chunk : fbuf_left, 0, 0);
				if(rval.code == RC_WMORE) {
					if(fbuf_chunk == fbuf_left) {
						fprintf(stderr, "-> PER decode error (%d bits of %d bytes (c=%d,l=%d)) \n", rval.consumed, size, fbuf_chunk, fbuf_left);
						rval.code = RC_FAIL;
						rval.consumed += 7;
						rval.consumed /= 8;
						if(mustfail) {
							fprintf(stderr, "-> (this was expected failure)\n");
							return 0;
						}
					} else {
						rval.consumed = 0; /* Not restartable */
						ASN_STRUCT_FREE(asn_DEF_PDU, st);
						st = 0;
						fprintf(stderr, "-> PER wants more\n");
					}
				} else {
					fprintf(stderr, "-> PER ret %d/%d mf=%d\n",
						rval.code, rval.consumed, mustfail);
					/* uper_decode() returns _bits_ */
					rval.consumed += 7;
					rval.consumed /= 8;
					if((mustfail?1:0) == (rval.code == RC_FAIL)) {
						if(mustfail) {
							fprintf(stderr, "-> (this was expected failure)\n");
							return 0;
						}
					} else {
						fprintf(stderr, "-> (unexpected %s)\n", mustfail ? "success" : "failure");
						rval.code = RC_FAIL;
					}
				}
				break;
			}
			fbuf_offset += rval.consumed;
			fbuf_left -= rval.consumed;
			if(rval.code == RC_WMORE)
				fbuf_chunk += 1;	/* Give little more */
			else
				fbuf_chunk = csize;	/* Back off */
		} while(fbuf_left && rval.code == RC_WMORE);

		assert(rval.code == RC_OK);
		if(how == AS_PER) {
			fprintf(stderr, "[left %d, off %d, size %d]\n",
				fbuf_left, fbuf_offset, size);
			assert(fbuf_offset == size);
		} else {
			assert(fbuf_offset - size < 2
			|| (fbuf_offset + 1 /* "\n" */  == size
				&& fbuf[size - 1] == '\n')
			|| (fbuf_offset + 2 /* "\r\n" */  == size
				&& fbuf[size - 2] == '\r'
				&& fbuf[size - 1] == '\n')
			);
		}
	}

	if(st) asn_fprint(stderr, &asn_DEF_PDU, st);
	return st;
}
static PDU_t *
load_object_from(const char *fname, enum expectation expectation, char *fbuf, size_t size, enum enctype how) {
	asn_dec_rval_t rval;
	PDU_t *st = 0;
	size_t csize = 1;

	if(getenv("INITIAL_CHUNK_SIZE"))
		csize = atoi(getenv("INITIAL_CHUNK_SIZE"));

	/* Perform multiple iterations with multiple chunks sizes */
	for(; csize < 20; csize += 1) {
		int fbuf_offset = 0;
		int fbuf_left = size;
		int fbuf_chunk = csize;

		fprintf(stderr, "LOADING OBJECT OF SIZE %zd FROM [%s] as %s,"
			" chunks %zd\n",
			size, fname, how==AS_PER?"PER":"XER", csize);

		if(st) asn_DEF_PDU.free_struct(&asn_DEF_PDU, st, 0);
		st = 0;

		do {
			fprintf(stderr, "Decoding bytes %d..%d (left %d)\n",
				fbuf_offset,
					fbuf_chunk < fbuf_left
						? fbuf_chunk : fbuf_left,
					fbuf_left);
			if(st) {
				fprintf(stderr, "=== currently ===\n");
				asn_fprint(stderr, &asn_DEF_PDU, st);
				fprintf(stderr, "=== end ===\n");
			}
			switch(how) {
			case AS_XER:
				rval = xer_decode(0, &asn_DEF_PDU, (void **)&st,
					fbuf + fbuf_offset,
					fbuf_chunk < fbuf_left 
					? fbuf_chunk : fbuf_left);
				break;
			case AS_PER:
				rval = uper_decode(0, &asn_DEF_PDU,
					(void **)&st, fbuf + fbuf_offset,
					fbuf_chunk < fbuf_left 
					? fbuf_chunk : fbuf_left, 0, 0);
				if(rval.code == RC_WMORE) {
					rval.consumed = 0; /* Not restartable */
					ASN_STRUCT_FREE(asn_DEF_PDU, st);
					st = 0;
					fprintf(stderr, "-> PER wants more\n");
				} else {
					fprintf(stderr, "-> PER ret %d/%ld\n",
						rval.code, rval.consumed);
					/* uper_decode() returns _bits_ */
					rval.consumed += 7;
					rval.consumed /= 8;
				}
				break;
			}
			fbuf_offset += rval.consumed;
			fbuf_left -= rval.consumed;
			if(rval.code == RC_WMORE)
				fbuf_chunk += 1;	/* Give little more */
			else
				fbuf_chunk = csize;	/* Back off */
		} while(fbuf_left && rval.code == RC_WMORE);

		if(expectation != EXP_BROKEN) {
			assert(rval.code == RC_OK);
			if(how == AS_PER) {
				fprintf(stderr, "[left %d, off %d, size %zd]\n",
					fbuf_left, fbuf_offset, size);
				assert(fbuf_offset == size);
			} else {
				assert(fbuf_offset - size < 2
				|| (fbuf_offset + 1 /* "\n" */  == size
					&& fbuf[size - 1] == '\n')
				|| (fbuf_offset + 2 /* "\r\n" */  == size
					&& fbuf[size - 2] == '\r'
					&& fbuf[size - 1] == '\n')
				);
			}
		} else {
			assert(rval.code != RC_OK);
			fprintf(stderr, "Failed, but this was expected\n");
			asn_DEF_PDU.free_struct(&asn_DEF_PDU, st, 0);
			st = 0;	/* ignore leak for now */
		}
	}

	if(st) asn_fprint(stderr, &asn_DEF_PDU, st);
	return st;
}