aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTobias Brunner <tobias@strongswan.org>2017-09-20 15:00:42 +0200
committerTobias Brunner <tobias@strongswan.org>2017-11-08 16:48:10 +0100
commitffd0eeecf05d84a25f3df96850312adc1896d6f0 (patch)
tree7db8b31202e9aef7e6af37d088492422736b1510
parentbfe1cb3a94c048581b7e6f81f9c936ce1e14d5c0 (diff)
downloadstrongswan-ffd0eeecf05d84a25f3df96850312adc1896d6f0.tar.bz2
strongswan-ffd0eeecf05d84a25f3df96850312adc1896d6f0.tar.xz
asn1: Add function to generate an ASN.1 integer from an uint64_t
-rw-r--r--src/libstrongswan/asn1/asn1.c20
-rw-r--r--src/libstrongswan/asn1/asn1.h8
-rw-r--r--src/libstrongswan/tests/suites/test_asn1.c41
3 files changed, 63 insertions, 6 deletions
diff --git a/src/libstrongswan/asn1/asn1.c b/src/libstrongswan/asn1/asn1.c
index 8b9dc1c48..1e999dedc 100644
--- a/src/libstrongswan/asn1/asn1.c
+++ b/src/libstrongswan/asn1/asn1.c
@@ -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
*/
diff --git a/src/libstrongswan/asn1/asn1.h b/src/libstrongswan/asn1/asn1.h
index f0b3e17e8..1a598e344 100644
--- a/src/libstrongswan/asn1/asn1.h
+++ b/src/libstrongswan/asn1/asn1.h
@@ -181,6 +181,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
*
* @param object ASN.1 object to be printed
diff --git a/src/libstrongswan/tests/suites/test_asn1.c b/src/libstrongswan/tests/suites/test_asn1.c
index fa02df9ca..d7fb7c2a9 100644
--- a/src/libstrongswan/tests/suites/test_asn1.c
+++ b/src/libstrongswan/tests/suites/test_asn1.c
@@ -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;