asn1: Add function to generate an ASN.1 integer from an uint64_t
This commit is contained in:
@@ -609,6 +609,26 @@ uint64_t asn1_parse_integer_uint64(chunk_t blob)
|
||||
return val;
|
||||
}
|
||||
|
||||
/*
|
||||
* Described in header
|
||||
*/
|
||||
chunk_t asn1_integer_from_uint64(uint64_t val)
|
||||
{
|
||||
u_char buf[sizeof(val)];
|
||||
chunk_t enc = chunk_empty;
|
||||
|
||||
if (val < 0x100)
|
||||
{
|
||||
buf[0] = (u_char)val;
|
||||
return chunk_clone(chunk_create(buf, 1));
|
||||
}
|
||||
for (enc.ptr = buf + sizeof(val); val; enc.len++, val >>= 8)
|
||||
{ /* fill the buffer from the end */
|
||||
*(--enc.ptr) = val & 0xff;
|
||||
}
|
||||
return chunk_clone(enc);
|
||||
}
|
||||
|
||||
/**
|
||||
* ASN.1 definition of an algorithmIdentifier
|
||||
*/
|
||||
|
||||
@@ -180,6 +180,14 @@ bool asn1_parse_simple_object(chunk_t *object, asn1_t type, u_int level0,
|
||||
*/
|
||||
uint64_t asn1_parse_integer_uint64(chunk_t blob);
|
||||
|
||||
/**
|
||||
* Converts an uint64_t to an ASN.1 INTEGER object.
|
||||
*
|
||||
* @param val integer to convert
|
||||
* @return body of an ASN.1 coded integer object
|
||||
*/
|
||||
chunk_t asn1_integer_from_uint64(uint64_t val);
|
||||
|
||||
/**
|
||||
* Print the value of an ASN.1 simple object
|
||||
*
|
||||
|
||||
@@ -758,13 +758,10 @@ END_TEST
|
||||
|
||||
START_TEST(test_asn1_parse_integer_uint64)
|
||||
{
|
||||
typedef struct {
|
||||
struct {
|
||||
uint64_t n;
|
||||
chunk_t chunk;
|
||||
} testdata_t;
|
||||
|
||||
|
||||
testdata_t test[] = {
|
||||
} test[] = {
|
||||
{ 67305985ULL, chunk_from_chars(
|
||||
0x04, 0x03, 0x02, 0x01) },
|
||||
{ 578437695752307201ULL, chunk_from_chars(
|
||||
@@ -782,6 +779,37 @@ START_TEST(test_asn1_parse_integer_uint64)
|
||||
}
|
||||
END_TEST
|
||||
|
||||
/*******************************************************************************
|
||||
* integer_from_uint64
|
||||
*/
|
||||
|
||||
START_TEST(test_asn1_integer_from_uint64)
|
||||
{
|
||||
struct {
|
||||
uint64_t n;
|
||||
chunk_t chunk;
|
||||
} test[] = {
|
||||
{ 0ULL, chunk_from_chars(0x00) },
|
||||
{ 255ULL, chunk_from_chars(0xff) },
|
||||
{ 256ULL, chunk_from_chars(0x01, 0x00) },
|
||||
{ 67305985ULL, chunk_from_chars(0x04, 0x03, 0x02, 0x01) },
|
||||
{ 578437695752307201ULL, chunk_from_chars(
|
||||
0x08, 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01) },
|
||||
{ 18446744073709551615ULL, chunk_from_chars(
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff) },
|
||||
};
|
||||
chunk_t asn;
|
||||
int i;
|
||||
|
||||
for (i = 0; i < countof(test); i++)
|
||||
{
|
||||
asn = asn1_integer_from_uint64(test[i].n);
|
||||
ck_assert_chunk_eq(test[i].chunk, asn);
|
||||
chunk_free(&asn);
|
||||
}
|
||||
}
|
||||
END_TEST
|
||||
|
||||
Suite *asn1_suite_create()
|
||||
{
|
||||
Suite *s;
|
||||
@@ -861,8 +889,9 @@ Suite *asn1_suite_create()
|
||||
tcase_add_test(tc, test_asn1_integer);
|
||||
suite_add_tcase(s, tc);
|
||||
|
||||
tc = tcase_create("parse_integer_uint64");
|
||||
tc = tcase_create("integer_uint64");
|
||||
tcase_add_test(tc, test_asn1_parse_integer_uint64);
|
||||
tcase_add_test(tc, test_asn1_integer_from_uint64);
|
||||
suite_add_tcase(s, tc);
|
||||
|
||||
return s;
|
||||
|
||||
Reference in New Issue
Block a user