diff --git a/dnssec/lib/binary.c b/dnssec/lib/binary.c index 43e21c045..7bbc66b9b 100644 --- a/dnssec/lib/binary.c +++ b/dnssec/lib/binary.c @@ -197,3 +197,22 @@ int dnssec_binary_from_base64(const dnssec_binary_t *base64, return DNSSEC_EOK; } + +_public_ +int dnssec_binary_to_base64(const dnssec_binary_t *binary, + dnssec_binary_t *base64) +{ + if (!binary || !base64) { + return DNSSEC_EINVAL; + } + + size_t base64_size = BASE64_ENCODE_RAW_LENGTH(binary->size); + int r = dnssec_binary_resize(base64, base64_size); + if (r != DNSSEC_EOK) { + return r; + } + + base64_encode_raw(base64->data, binary->size, binary->data); + + return DNSSEC_EOK; +} diff --git a/dnssec/lib/dnssec/binary.h b/dnssec/lib/dnssec/binary.h index e86a831ef..18c5a9aea 100644 --- a/dnssec/lib/dnssec/binary.h +++ b/dnssec/lib/dnssec/binary.h @@ -134,4 +134,14 @@ void dnssec_binary_ltrim(dnssec_binary_t *binary); int dnssec_binary_from_base64(const dnssec_binary_t *base64, dnssec_binary_t *binary); +/*! + * Create Base64 encoded string from binary data. + * + * \param[in] binary Binary data. + * \param[out] base64 Base64 encode data. + * + * \return Error code, DNSSEC_EOK if successful. + */ +int dnssec_binary_to_base64(const dnssec_binary_t *binary, + dnssec_binary_t *base64); /*! @} */ diff --git a/dnssec/tests/binary.c b/dnssec/tests/binary.c index 1dadcfbbd..96be0bc28 100644 --- a/dnssec/tests/binary.c +++ b/dnssec/tests/binary.c @@ -31,6 +31,7 @@ typedef struct test_string { static void test_base64(void) { test_string_t data[] = { + { "", 0, "", 0 }, { "YQ==", 4, "a", 1 }, { "YWI=", 4, "ab", 2 }, { "YWJj", 4, "abc", 3 }, @@ -56,7 +57,15 @@ static void test_base64(void) memcmp(binary.data, ts->decoded, binary.size) == 0, "dnssec_binary_from_base64() for '%s'", ts->encoded); + dnssec_binary_t encoded = { 0 }; + r = dnssec_binary_to_base64(&binary, &encoded); + ok(r == DNSSEC_EOK && + encoded.size == ts->encoded_size && + memcmp(encoded.data, ts->encoded, encoded.size) == 0, + "dnssec_binary_to_base64() for '%s'", ts->encoded); + dnssec_binary_free(&binary); + dnssec_binary_free(&encoded); } }