asn1: Add function to generate an ASN.1 integer from an uint64_t
authorTobias Brunner <tobias@strongswan.org>
Wed, 20 Sep 2017 13:00:42 +0000 (15:00 +0200)
committerTobias Brunner <tobias@strongswan.org>
Wed, 8 Nov 2017 15:48:10 +0000 (16:48 +0100)
src/libstrongswan/asn1/asn1.c
src/libstrongswan/asn1/asn1.h
src/libstrongswan/tests/suites/test_asn1.c

index 8b9dc1c..1e999de 100644 (file)
@@ -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
  */
index f0b3e17..1a598e3 100644 (file)
@@ -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
index fa02df9..d7fb7c2 100644 (file)
@@ -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;