/* Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #include #include #include "apr_encode.h" #include "apr_strings.h" #include "abts.h" #include "testutil.h" static const unsigned char ufoobar[] = { 'f', 'o', 'o', 'b', 'a', 'r' }; static void test_encode_base64(abts_case * tc, void *data) { apr_pool_t *pool; const char *src, *target; const char *dest; apr_size_t len; apr_pool_create(&pool, NULL); /* * Test vectors from https://tools.ietf.org/html/rfc4648#section-10 */ src = ""; target = ""; dest = apr_pencode_base64(pool, src, APR_ENCODE_STRING, APR_ENCODE_NONE, &len); ABTS_STR_EQUAL(tc, target, dest); src = "f"; target = "Zg=="; dest = apr_pencode_base64(pool, src, APR_ENCODE_STRING, APR_ENCODE_NONE, &len); ABTS_STR_EQUAL(tc, target, dest); src = "f"; target = "Zg"; dest = apr_pencode_base64(pool, src, APR_ENCODE_STRING, APR_ENCODE_NOPADDING, &len); ABTS_STR_EQUAL(tc, target, dest); src = "fo"; target = "Zm8="; dest = apr_pencode_base64(pool, src, APR_ENCODE_STRING, APR_ENCODE_NONE, &len); ABTS_STR_EQUAL(tc, target, dest); src = "fo"; target = "Zm8"; dest = apr_pencode_base64(pool, src, APR_ENCODE_STRING, APR_ENCODE_NOPADDING, &len); ABTS_STR_EQUAL(tc, target, dest); src = "foo"; target = "Zm9v"; dest = apr_pencode_base64(pool, src, APR_ENCODE_STRING, APR_ENCODE_NONE, &len); ABTS_STR_EQUAL(tc, target, dest); src = "foo"; target = "Zm9v"; dest = apr_pencode_base64(pool, src, APR_ENCODE_STRING, APR_ENCODE_NOPADDING, &len); ABTS_STR_EQUAL(tc, target, dest); apr_pool_destroy(pool); } static void test_encode_base64_binary(abts_case * tc, void *data) { apr_pool_t *pool; const char *target; const char *dest; apr_size_t len; apr_pool_create(&pool, NULL); /* * Test vectors from https://tools.ietf.org/html/rfc4648#section-10 */ target = ""; dest = apr_pencode_base64_binary(pool, ufoobar, 0, APR_ENCODE_NONE, &len); ABTS_STR_EQUAL(tc, target, dest); target = "Zg=="; dest = apr_pencode_base64_binary(pool, ufoobar, 1, APR_ENCODE_NONE, &len); ABTS_STR_EQUAL(tc, target, dest); target = "Zg"; dest = apr_pencode_base64_binary(pool, ufoobar, 1, APR_ENCODE_NOPADDING, &len); ABTS_STR_EQUAL(tc, target, dest); target = "Zm8="; dest = apr_pencode_base64_binary(pool, ufoobar, 2, APR_ENCODE_NONE, &len); ABTS_STR_EQUAL(tc, target, dest); target = "Zm8"; dest = apr_pencode_base64_binary(pool, ufoobar, 2, APR_ENCODE_NOPADDING, &len); ABTS_STR_EQUAL(tc, target, dest); target = "Zm9v"; dest = apr_pencode_base64_binary(pool, ufoobar, 3, APR_ENCODE_NONE, &len); ABTS_STR_EQUAL(tc, target, dest); target = "Zm9v"; dest = apr_pencode_base64_binary(pool, ufoobar, 3, APR_ENCODE_NOPADDING, &len); ABTS_STR_EQUAL(tc, target, dest); apr_pool_destroy(pool); } static void test_decode_base64(abts_case * tc, void *data) { apr_pool_t *pool; const char *target, *src; const char *dest; apr_size_t len; apr_pool_create(&pool, NULL); /* * Test vectors from https://tools.ietf.org/html/rfc4648#section-10 */ src = ""; target = ""; dest = apr_pdecode_base64(pool, src, APR_ENCODE_STRING, APR_ENCODE_NONE, &len); ABTS_STR_EQUAL(tc, dest, target); src = "Zg=="; target = "f"; dest = apr_pdecode_base64(pool, src, APR_ENCODE_STRING, APR_ENCODE_NONE, &len); ABTS_STR_EQUAL(tc, dest, target); src = "Zg"; target = "f"; dest = apr_pdecode_base64(pool, src, APR_ENCODE_STRING, APR_ENCODE_NONE, &len); ABTS_STR_EQUAL(tc, dest, target); src = "Zm8="; target = "fo"; dest = apr_pdecode_base64(pool, src, APR_ENCODE_STRING, APR_ENCODE_NONE, &len); ABTS_STR_EQUAL(tc, dest, target); src = "Zm8"; target = "fo"; dest = apr_pdecode_base64(pool, src, APR_ENCODE_STRING, APR_ENCODE_NONE, &len); ABTS_STR_EQUAL(tc, dest, target); src = "Zm9v"; target = "foo"; dest = apr_pdecode_base64(pool, src, APR_ENCODE_STRING, APR_ENCODE_NONE, &len); ABTS_STR_EQUAL(tc, dest, target); src = "Zm9v"; target = "foo"; dest = apr_pdecode_base64(pool, src, APR_ENCODE_STRING, APR_ENCODE_NONE, &len); ABTS_STR_EQUAL(tc, dest, target); apr_pool_destroy(pool); } static void test_decode_base64_binary(abts_case * tc, void *data) { apr_pool_t *pool; const char *src; const unsigned char *udest; apr_size_t len; apr_pool_create(&pool, NULL); /* * Test vectors from https://tools.ietf.org/html/rfc4648#section-10 */ src = ""; udest = apr_pdecode_base64_binary(pool, src, APR_ENCODE_STRING, APR_ENCODE_NONE, &len); ABTS_ASSERT(tc, "apr_pdecode_base64_binary target!=dest", memcmp(ufoobar, udest, 0) == 0); ABTS_INT_EQUAL(tc, len, 0); src = "Zg=="; udest = apr_pdecode_base64_binary(pool, src, APR_ENCODE_STRING, APR_ENCODE_NONE, &len); ABTS_ASSERT(tc, "apr_pdecode_base64_binary target!=dest", memcmp(ufoobar, udest, 1) == 0); ABTS_INT_EQUAL(tc, len, 1); src = "Zg"; udest = apr_pdecode_base64_binary(pool, src, APR_ENCODE_STRING, APR_ENCODE_NONE, &len); ABTS_ASSERT(tc, "apr_pdecode_base64_binary target!=dest", memcmp(ufoobar, udest, 1) == 0); ABTS_INT_EQUAL(tc, len, 1); src = "Zm8="; udest = apr_pdecode_base64_binary(pool, src, APR_ENCODE_STRING, APR_ENCODE_NONE, &len); ABTS_ASSERT(tc, "apr_pdecode_base64_binary target!=dest", memcmp(ufoobar, udest, 2) == 0); ABTS_INT_EQUAL(tc, len, 2); src = "Zm8"; udest = apr_pdecode_base64_binary(pool, src, APR_ENCODE_STRING, APR_ENCODE_NONE, &len); ABTS_ASSERT(tc, "apr_pdecode_base64_binary target!=dest", memcmp(ufoobar, udest, 2) == 0); ABTS_INT_EQUAL(tc, len, 2); src = "Zm9v"; udest = apr_pdecode_base64_binary(pool, src, APR_ENCODE_STRING, APR_ENCODE_NONE, &len); ABTS_ASSERT(tc, "apr_pdecode_base64_binary target!=dest", memcmp(ufoobar, udest, 3) == 0); ABTS_INT_EQUAL(tc, len, 3); src = "Zm9v"; udest = apr_pdecode_base64_binary(pool, src, APR_ENCODE_STRING, APR_ENCODE_NONE, &len); ABTS_ASSERT(tc, "apr_pdecode_base64_binary target!=dest", memcmp(ufoobar, udest, 3) == 0); ABTS_INT_EQUAL(tc, len, 3); apr_pool_destroy(pool); } static void test_encode_base32(abts_case * tc, void *data) { apr_pool_t *pool; const char *src, *target; const char *dest; apr_size_t len; apr_pool_create(&pool, NULL); /* * Test vectors from https://tools.ietf.org/html/rfc4648#section-10 */ src = ""; target = ""; dest = apr_pencode_base32(pool, src, APR_ENCODE_STRING, APR_ENCODE_NONE, &len); ABTS_STR_EQUAL(tc, target, dest); src = "f"; target = "MY======"; dest = apr_pencode_base32(pool, src, APR_ENCODE_STRING, APR_ENCODE_NONE, &len); ABTS_STR_EQUAL(tc, target, dest); src = "f"; target = "MY"; dest = apr_pencode_base32(pool, src, APR_ENCODE_STRING, APR_ENCODE_NOPADDING, &len); ABTS_STR_EQUAL(tc, target, dest); src = "f"; target = "CO======"; dest = apr_pencode_base32(pool, src, APR_ENCODE_STRING, APR_ENCODE_BASE32HEX, &len); ABTS_STR_EQUAL(tc, target, dest); src = "f"; target = "CO"; dest = apr_pencode_base32(pool, src, APR_ENCODE_STRING, APR_ENCODE_BASE32HEX | APR_ENCODE_NOPADDING, &len); ABTS_STR_EQUAL(tc, target, dest); src = "fo"; target = "MZXQ===="; dest = apr_pencode_base32(pool, src, APR_ENCODE_STRING, APR_ENCODE_NONE, &len); ABTS_STR_EQUAL(tc, target, dest); src = "fo"; target = "MZXQ"; dest = apr_pencode_base32(pool, src, APR_ENCODE_STRING, APR_ENCODE_NOPADDING, &len); ABTS_STR_EQUAL(tc, target, dest); src = "fo"; target = "CPNG===="; dest = apr_pencode_base32(pool, src, APR_ENCODE_STRING, APR_ENCODE_BASE32HEX, &len); ABTS_STR_EQUAL(tc, target, dest); src = "fo"; target = "CPNG"; dest = apr_pencode_base32(pool, src, APR_ENCODE_STRING, APR_ENCODE_BASE32HEX | APR_ENCODE_NOPADDING, &len); ABTS_STR_EQUAL(tc, target, dest); src = "foo"; target = "MZXW6==="; dest = apr_pencode_base32(pool, src, APR_ENCODE_STRING, APR_ENCODE_NONE, &len); ABTS_STR_EQUAL(tc, target, dest); src = "foo"; target = "MZXW6"; dest = apr_pencode_base32(pool, src, APR_ENCODE_STRING, APR_ENCODE_NOPADDING, &len); ABTS_STR_EQUAL(tc, target, dest); src = "foo"; target = "CPNMU==="; dest = apr_pencode_base32(pool, src, APR_ENCODE_STRING, APR_ENCODE_BASE32HEX, &len); ABTS_STR_EQUAL(tc, target, dest); src = "foo"; target = "CPNMU"; dest = apr_pencode_base32(pool, src, APR_ENCODE_STRING, APR_ENCODE_BASE32HEX | APR_ENCODE_NOPADDING, &len); ABTS_STR_EQUAL(tc, target, dest); src = "foob"; target = "MZXW6YQ="; dest = apr_pencode_base32(pool, src, APR_ENCODE_STRING, APR_ENCODE_NONE, &len); ABTS_STR_EQUAL(tc, target, dest); src = "foob"; target = "MZXW6YQ"; dest = apr_pencode_base32(pool, src, APR_ENCODE_STRING, APR_ENCODE_NOPADDING, &len); ABTS_STR_EQUAL(tc, target, dest); src = "foob"; target = "CPNMUOG="; dest = apr_pencode_base32(pool, src, APR_ENCODE_STRING, APR_ENCODE_BASE32HEX, &len); ABTS_STR_EQUAL(tc, target, dest); src = "foob"; target = "CPNMUOG"; dest = apr_pencode_base32(pool, src, APR_ENCODE_STRING, APR_ENCODE_BASE32HEX | APR_ENCODE_NOPADDING, &len); ABTS_STR_EQUAL(tc, target, dest); src = "fooba"; target = "MZXW6YTB"; dest = apr_pencode_base32(pool, src, APR_ENCODE_STRING, APR_ENCODE_NONE, &len); ABTS_STR_EQUAL(tc, target, dest); src = "fooba"; target = "MZXW6YTB"; dest = apr_pencode_base32(pool, src, APR_ENCODE_STRING, APR_ENCODE_NOPADDING, &len); ABTS_STR_EQUAL(tc, target, dest); src = "fooba"; target = "CPNMUOJ1"; dest = apr_pencode_base32(pool, src, APR_ENCODE_STRING, APR_ENCODE_BASE32HEX, &len); ABTS_STR_EQUAL(tc, target, dest); src = "fooba"; target = "CPNMUOJ1"; dest = apr_pencode_base32(pool, src, APR_ENCODE_STRING, APR_ENCODE_BASE32HEX | APR_ENCODE_NOPADDING, &len); ABTS_STR_EQUAL(tc, target, dest); src = "foobar"; target = "MZXW6YTBOI======"; dest = apr_pencode_base32(pool, src, APR_ENCODE_STRING, APR_ENCODE_NONE, &len); ABTS_STR_EQUAL(tc, target, dest); src = "foobar"; target = "MZXW6YTBOI"; dest = apr_pencode_base32(pool, src, APR_ENCODE_STRING, APR_ENCODE_NOPADDING, &len); ABTS_STR_EQUAL(tc, target, dest); src = "foobar"; target = "CPNMUOJ1E8======"; dest = apr_pencode_base32(pool, src, APR_ENCODE_STRING, APR_ENCODE_BASE32HEX, &len); ABTS_STR_EQUAL(tc, target, dest); src = "foobar"; target = "CPNMUOJ1E8"; dest = apr_pencode_base32(pool, src, APR_ENCODE_STRING, APR_ENCODE_BASE32HEX | APR_ENCODE_NOPADDING, &len); ABTS_STR_EQUAL(tc, target, dest); apr_pool_destroy(pool); } static void test_encode_base32_binary(abts_case * tc, void *data) { apr_pool_t *pool; const char *target; const char *dest; apr_size_t len; apr_pool_create(&pool, NULL); /* * Test vectors from https://tools.ietf.org/html/rfc4648#section-10 */ target = ""; dest = apr_pencode_base32_binary(pool, ufoobar, 0, APR_ENCODE_NONE, &len); ABTS_STR_EQUAL(tc, target, dest); target = "MY======"; dest = apr_pencode_base32_binary(pool, ufoobar, 1, APR_ENCODE_NONE, &len); ABTS_STR_EQUAL(tc, target, dest); target = "MY"; dest = apr_pencode_base32_binary(pool, ufoobar, 1, APR_ENCODE_NOPADDING, &len); ABTS_STR_EQUAL(tc, target, dest); target = "CO======"; dest = apr_pencode_base32_binary(pool, ufoobar, 1, APR_ENCODE_BASE32HEX, &len); ABTS_STR_EQUAL(tc, target, dest); target = "CO"; dest = apr_pencode_base32_binary(pool, ufoobar, 1, APR_ENCODE_BASE32HEX | APR_ENCODE_NOPADDING, &len); ABTS_STR_EQUAL(tc, target, dest); target = "MZXQ===="; dest = apr_pencode_base32_binary(pool, ufoobar, 2, APR_ENCODE_NONE, &len); ABTS_STR_EQUAL(tc, target, dest); target = "MZXQ"; dest = apr_pencode_base32_binary(pool, ufoobar, 2, APR_ENCODE_NOPADDING, &len); ABTS_STR_EQUAL(tc, target, dest); target = "CPNG===="; dest = apr_pencode_base32_binary(pool, ufoobar, 2, APR_ENCODE_BASE32HEX, &len); ABTS_STR_EQUAL(tc, target, dest); target = "CPNG"; dest = apr_pencode_base32_binary(pool, ufoobar, 2, APR_ENCODE_BASE32HEX | APR_ENCODE_NOPADDING, &len); ABTS_STR_EQUAL(tc, target, dest); target = "MZXW6==="; dest = apr_pencode_base32_binary(pool, ufoobar, 3, APR_ENCODE_NONE, &len); ABTS_STR_EQUAL(tc, target, dest); target = "MZXW6"; dest = apr_pencode_base32_binary(pool, ufoobar, 3, APR_ENCODE_NOPADDING, &len); ABTS_STR_EQUAL(tc, target, dest); target = "CPNMU==="; dest = apr_pencode_base32_binary(pool, ufoobar, 3, APR_ENCODE_BASE32HEX, &len); ABTS_STR_EQUAL(tc, target, dest); target = "CPNMU"; dest = apr_pencode_base32_binary(pool, ufoobar, 3, APR_ENCODE_BASE32HEX | APR_ENCODE_NOPADDING, &len); ABTS_STR_EQUAL(tc, target, dest); target = "MZXW6YQ="; dest = apr_pencode_base32_binary(pool, ufoobar, 4, APR_ENCODE_NONE, &len); ABTS_STR_EQUAL(tc, target, dest); target = "MZXW6YQ"; dest = apr_pencode_base32_binary(pool, ufoobar, 4, APR_ENCODE_NOPADDING, &len); ABTS_STR_EQUAL(tc, target, dest); target = "CPNMUOG="; dest = apr_pencode_base32_binary(pool, ufoobar, 4, APR_ENCODE_BASE32HEX, &len); ABTS_STR_EQUAL(tc, target, dest); target = "CPNMUOG"; dest = apr_pencode_base32_binary(pool, ufoobar, 4, APR_ENCODE_BASE32HEX | APR_ENCODE_NOPADDING, &len); ABTS_STR_EQUAL(tc, target, dest); target = "MZXW6YTB"; dest = apr_pencode_base32_binary(pool, ufoobar, 5, APR_ENCODE_NONE, &len); ABTS_STR_EQUAL(tc, target, dest); target = "MZXW6YTB"; dest = apr_pencode_base32_binary(pool, ufoobar, 5, APR_ENCODE_NOPADDING, &len); ABTS_STR_EQUAL(tc, target, dest); target = "CPNMUOJ1"; dest = apr_pencode_base32_binary(pool, ufoobar, 5, APR_ENCODE_BASE32HEX, &len); ABTS_STR_EQUAL(tc, target, dest); target = "CPNMUOJ1"; dest = apr_pencode_base32_binary(pool, ufoobar, 5, APR_ENCODE_BASE32HEX | APR_ENCODE_NOPADDING, &len); ABTS_STR_EQUAL(tc, target, dest); target = "MZXW6YTBOI======"; dest = apr_pencode_base32_binary(pool, ufoobar, 6, APR_ENCODE_NONE, &len); ABTS_STR_EQUAL(tc, target, dest); target = "MZXW6YTBOI"; dest = apr_pencode_base32_binary(pool, ufoobar, 6, APR_ENCODE_NOPADDING, &len); ABTS_STR_EQUAL(tc, target, dest); target = "CPNMUOJ1E8======"; dest = apr_pencode_base32_binary(pool, ufoobar, 6, APR_ENCODE_BASE32HEX, &len); ABTS_STR_EQUAL(tc, target, dest); target = "CPNMUOJ1E8"; dest = apr_pencode_base32_binary(pool, ufoobar, 6, APR_ENCODE_BASE32HEX | APR_ENCODE_NOPADDING, &len); ABTS_STR_EQUAL(tc, target, dest); apr_pool_destroy(pool); } static void test_decode_base32(abts_case * tc, void *data) { apr_pool_t *pool; const char *target, *src; const char *dest; apr_size_t len; apr_pool_create(&pool, NULL); /* * Test vectors from https://tools.ietf.org/html/rfc4648#section-10 */ src = ""; target = ""; dest = apr_pdecode_base32(pool, src, APR_ENCODE_STRING, APR_ENCODE_NONE, &len); ABTS_STR_EQUAL(tc, target, dest); src = "MY======"; target = "f"; dest = apr_pdecode_base32(pool, src, APR_ENCODE_STRING, APR_ENCODE_NONE, &len); ABTS_STR_EQUAL(tc, target, dest); src = "MY"; target = "f"; dest = apr_pdecode_base32(pool, src, APR_ENCODE_STRING, APR_ENCODE_NONE, &len); ABTS_STR_EQUAL(tc, target, dest); src = "CO======"; target = "f"; dest = apr_pdecode_base32(pool, src, APR_ENCODE_STRING, APR_ENCODE_BASE32HEX, &len); ABTS_STR_EQUAL(tc, target, dest); src = "CO"; target = "f"; dest = apr_pdecode_base32(pool, src, APR_ENCODE_STRING, APR_ENCODE_BASE32HEX, &len); ABTS_STR_EQUAL(tc, target, dest); src = "MZXQ===="; target = "fo"; dest = apr_pdecode_base32(pool, src, APR_ENCODE_STRING, APR_ENCODE_NONE, &len); ABTS_STR_EQUAL(tc, target, dest); src = "MZXQ"; target = "fo"; dest = apr_pdecode_base32(pool, src, APR_ENCODE_STRING, APR_ENCODE_NONE, &len); ABTS_STR_EQUAL(tc, target, dest); src = "CPNG===="; target = "fo"; dest = apr_pdecode_base32(pool, src, APR_ENCODE_STRING, APR_ENCODE_BASE32HEX, &len); ABTS_STR_EQUAL(tc, target, dest); src = "CPNG"; target = "fo"; dest = apr_pdecode_base32(pool, src, APR_ENCODE_STRING, APR_ENCODE_BASE32HEX, &len); ABTS_STR_EQUAL(tc, target, dest); src = "MZXW6==="; target = "foo"; dest = apr_pdecode_base32(pool, src, APR_ENCODE_STRING, APR_ENCODE_NONE, &len); ABTS_STR_EQUAL(tc, target, dest); src = "MZXW6"; target = "foo"; dest = apr_pdecode_base32(pool, src, APR_ENCODE_STRING, APR_ENCODE_NONE, &len); ABTS_STR_EQUAL(tc, target, dest); src = "CPNMU==="; target = "foo"; dest = apr_pdecode_base32(pool, src, APR_ENCODE_STRING, APR_ENCODE_BASE32HEX, &len); ABTS_STR_EQUAL(tc, target, dest); src = "CPNMU"; target = "foo"; dest = apr_pdecode_base32(pool, src, APR_ENCODE_STRING, APR_ENCODE_BASE32HEX, &len); ABTS_STR_EQUAL(tc, target, dest); src = "MZXW6YQ="; target = "foob"; dest = apr_pdecode_base32(pool, src, APR_ENCODE_STRING, APR_ENCODE_NONE, &len); ABTS_STR_EQUAL(tc, target, dest); src = "MZXW6YQ="; target = "foob"; dest = apr_pdecode_base32(pool, src, APR_ENCODE_STRING, APR_ENCODE_NONE, &len); ABTS_STR_EQUAL(tc, target, dest); src = "CPNMUOG="; target = "foob"; dest = apr_pdecode_base32(pool, src, APR_ENCODE_STRING, APR_ENCODE_BASE32HEX, &len); ABTS_STR_EQUAL(tc, target, dest); src = "CPNMUOG"; target = "foob"; dest = apr_pdecode_base32(pool, src, APR_ENCODE_STRING, APR_ENCODE_BASE32HEX, &len); ABTS_STR_EQUAL(tc, target, dest); src = "MZXW6YTB"; target = "fooba"; dest = apr_pdecode_base32(pool, src, APR_ENCODE_STRING, APR_ENCODE_NONE, &len); ABTS_STR_EQUAL(tc, target, dest); src = "MZXW6YTB"; target = "fooba"; dest = apr_pdecode_base32(pool, src, APR_ENCODE_STRING, APR_ENCODE_NONE, &len); ABTS_STR_EQUAL(tc, target, dest); src = "CPNMUOJ1"; target = "fooba"; dest = apr_pdecode_base32(pool, src, APR_ENCODE_STRING, APR_ENCODE_BASE32HEX, &len); ABTS_STR_EQUAL(tc, target, dest); src = "CPNMUOJ1"; target = "fooba"; dest = apr_pdecode_base32(pool, src, APR_ENCODE_STRING, APR_ENCODE_BASE32HEX, &len); ABTS_STR_EQUAL(tc, target, dest); src = "MZXW6YTBOI======"; target = "foobar"; dest = apr_pdecode_base32(pool, src, APR_ENCODE_STRING, APR_ENCODE_NONE, &len); ABTS_STR_EQUAL(tc, target, dest); src = "MZXW6YTBOI"; target = "foobar"; dest = apr_pdecode_base32(pool, src, APR_ENCODE_STRING, APR_ENCODE_NONE, &len); ABTS_STR_EQUAL(tc, target, dest); src = "CPNMUOJ1E8======"; target = "foobar"; dest = apr_pdecode_base32(pool, src, APR_ENCODE_STRING, APR_ENCODE_BASE32HEX, &len); ABTS_STR_EQUAL(tc, target, dest); src = "CPNMUOJ1E8"; target = "foobar"; dest = apr_pdecode_base32(pool, src, APR_ENCODE_STRING, APR_ENCODE_BASE32HEX, &len); ABTS_STR_EQUAL(tc, target, dest); apr_pool_destroy(pool); } static void test_decode_base32_binary(abts_case * tc, void *data) { apr_pool_t *pool; const char *src; const unsigned char *udest; apr_size_t len; apr_pool_create(&pool, NULL); /* * Test vectors from https://tools.ietf.org/html/rfc4648#section-10 */ src = ""; udest = apr_pdecode_base32_binary(pool, src, APR_ENCODE_STRING, APR_ENCODE_NONE, &len); ABTS_ASSERT(tc, "apr_pdecode_base32_binary target!=dest", memcmp(ufoobar, udest, 0) == 0); ABTS_INT_EQUAL(tc, 0, len); src = "MY======"; udest = apr_pdecode_base32_binary(pool, src, APR_ENCODE_STRING, APR_ENCODE_NONE, &len); ABTS_ASSERT(tc, "apr_pdecode_base32_binary target!=dest", memcmp(ufoobar, udest, 1) == 0); ABTS_INT_EQUAL(tc, 1, len); src = "MY"; udest = apr_pdecode_base32_binary(pool, src, APR_ENCODE_STRING, APR_ENCODE_NONE, &len); ABTS_ASSERT(tc, "apr_pdecode_base32_binary target!=dest", memcmp(ufoobar, udest, 1) == 0); ABTS_INT_EQUAL(tc, 1, len); src = "CO======"; udest = apr_pdecode_base32_binary(pool, src, APR_ENCODE_STRING, APR_ENCODE_BASE32HEX, &len); ABTS_ASSERT(tc, "apr_pdecode_base32_binary target!=dest", memcmp(ufoobar, udest, 1) == 0); ABTS_INT_EQUAL(tc, 1, len); src = "CO"; udest = apr_pdecode_base32_binary(pool, src, APR_ENCODE_STRING, APR_ENCODE_BASE32HEX, &len); ABTS_ASSERT(tc, "apr_pdecode_base32_binary target!=dest", memcmp(ufoobar, udest, 1) == 0); ABTS_INT_EQUAL(tc, 1, len); src = "MZXQ===="; udest = apr_pdecode_base32_binary(pool, src, APR_ENCODE_STRING, APR_ENCODE_NONE, &len); ABTS_ASSERT(tc, "apr_pdecode_base32_binary target!=dest", memcmp(ufoobar, udest, 2) == 0); ABTS_INT_EQUAL(tc, 2, len); src = "MZXQ"; udest = apr_pdecode_base32_binary(pool, src, APR_ENCODE_STRING, APR_ENCODE_NONE, &len); ABTS_ASSERT(tc, "apr_pdecode_base32_binary target!=dest", memcmp(ufoobar, udest, 2) == 0); ABTS_INT_EQUAL(tc, 2, len); src = "CPNG===="; udest = apr_pdecode_base32_binary(pool, src, APR_ENCODE_STRING, APR_ENCODE_BASE32HEX, &len); ABTS_ASSERT(tc, "apr_pdecode_base32_binary target!=dest", memcmp(ufoobar, udest, 2) == 0); ABTS_INT_EQUAL(tc, 2, len); src = "CPNG"; udest = apr_pdecode_base32_binary(pool, src, APR_ENCODE_STRING, APR_ENCODE_BASE32HEX, &len); ABTS_ASSERT(tc, "apr_pdecode_base32_binary target!=dest", memcmp(ufoobar, udest, 2) == 0); ABTS_INT_EQUAL(tc, 2, len); src = "MZXW6==="; udest = apr_pdecode_base32_binary(pool, src, APR_ENCODE_STRING, APR_ENCODE_NONE, &len); ABTS_ASSERT(tc, "apr_pdecode_base32_binary target!=dest", memcmp(ufoobar, udest, 3) == 0); ABTS_INT_EQUAL(tc, 3, len); src = "MZXW6"; udest = apr_pdecode_base32_binary(pool, src, APR_ENCODE_STRING, APR_ENCODE_NONE, &len); ABTS_ASSERT(tc, "apr_pdecode_base32_binary target!=dest", memcmp(ufoobar, udest, 3) == 0); ABTS_INT_EQUAL(tc, 3, len); src = "CPNMU==="; udest = apr_pdecode_base32_binary(pool, src, APR_ENCODE_STRING, APR_ENCODE_BASE32HEX, &len); ABTS_ASSERT(tc, "apr_pdecode_base32_binary target!=dest", memcmp(ufoobar, udest, 3) == 0); ABTS_INT_EQUAL(tc, 3, len); src = "CPNMU"; udest = apr_pdecode_base32_binary(pool, src, APR_ENCODE_STRING, APR_ENCODE_BASE32HEX, &len); ABTS_ASSERT(tc, "apr_pdecode_base32_binary target!=dest", memcmp(ufoobar, udest, 3) == 0); ABTS_INT_EQUAL(tc, 3, len); src = "MZXW6YQ="; udest = apr_pdecode_base32_binary(pool, src, APR_ENCODE_STRING, APR_ENCODE_NONE, &len); ABTS_ASSERT(tc, "apr_pdecode_base32_binary target!=dest", memcmp(ufoobar, udest, 4) == 0); ABTS_INT_EQUAL(tc, 4, len); src = "MZXW6YQ="; udest = apr_pdecode_base32_binary(pool, src, APR_ENCODE_STRING, APR_ENCODE_NONE, &len); ABTS_ASSERT(tc, "apr_pdecode_base32_binary target!=dest", memcmp(ufoobar, udest, 4) == 0); ABTS_INT_EQUAL(tc, 4, len); src = "CPNMUOG="; udest = apr_pdecode_base32_binary(pool, src, APR_ENCODE_STRING, APR_ENCODE_BASE32HEX, &len); ABTS_ASSERT(tc, "apr_pdecode_base32_binary target!=dest", memcmp(ufoobar, udest, 4) == 0); ABTS_INT_EQUAL(tc, 4, len); src = "CPNMUOG"; udest = apr_pdecode_base32_binary(pool, src, APR_ENCODE_STRING, APR_ENCODE_BASE32HEX, &len); ABTS_ASSERT(tc, "apr_pdecode_base32_binary target!=dest", memcmp(ufoobar, udest, 4) == 0); ABTS_INT_EQUAL(tc, 4, len); src = "MZXW6YTB"; udest = apr_pdecode_base32_binary(pool, src, APR_ENCODE_STRING, APR_ENCODE_NONE, &len); ABTS_ASSERT(tc, "apr_pdecode_base32_binary target!=dest", memcmp(ufoobar, udest, 5) == 0); ABTS_INT_EQUAL(tc, 5, len); src = "MZXW6YTB"; udest = apr_pdecode_base32_binary(pool, src, APR_ENCODE_STRING, APR_ENCODE_NONE, &len); ABTS_ASSERT(tc, "apr_pdecode_base32_binary target!=dest", memcmp(ufoobar, udest, 5) == 0); ABTS_INT_EQUAL(tc, 5, len); src = "CPNMUOJ1"; udest = apr_pdecode_base32_binary(pool, src, APR_ENCODE_STRING, APR_ENCODE_BASE32HEX, &len); ABTS_ASSERT(tc, "apr_pdecode_base32_binary target!=dest", memcmp(ufoobar, udest, 5) == 0); ABTS_INT_EQUAL(tc, 5, len); src = "CPNMUOJ1"; udest = apr_pdecode_base32_binary(pool, src, APR_ENCODE_STRING, APR_ENCODE_BASE32HEX, &len); ABTS_ASSERT(tc, "apr_pdecode_base32_binary target!=dest", memcmp(ufoobar, udest, 5) == 0); ABTS_INT_EQUAL(tc, 5, len); src = "MZXW6YTBOI======"; udest = apr_pdecode_base32_binary(pool, src, APR_ENCODE_STRING, APR_ENCODE_NONE, &len); ABTS_ASSERT(tc, "apr_pdecode_base32_binary target!=dest", memcmp(ufoobar, udest, 6) == 0); ABTS_INT_EQUAL(tc, 6, len); src = "MZXW6YTBOI"; udest = apr_pdecode_base32_binary(pool, src, APR_ENCODE_STRING, APR_ENCODE_NONE, &len); ABTS_ASSERT(tc, "apr_pdecode_base32_binary target!=dest", memcmp(ufoobar, udest, 6) == 0); ABTS_INT_EQUAL(tc, 6, len); src = "CPNMUOJ1E8======"; udest = apr_pdecode_base32_binary(pool, src, APR_ENCODE_STRING, APR_ENCODE_BASE32HEX, &len); ABTS_ASSERT(tc, "apr_pdecode_base32_binary target!=dest", memcmp(ufoobar, udest, 6) == 0); ABTS_INT_EQUAL(tc, 6, len); src = "CPNMUOJ1E8"; udest = apr_pdecode_base32_binary(pool, src, APR_ENCODE_STRING, APR_ENCODE_BASE32HEX, &len); ABTS_ASSERT(tc, "apr_pdecode_base32_binary target!=dest", memcmp(ufoobar, udest, 6) == 0); ABTS_INT_EQUAL(tc, 6, len); apr_pool_destroy(pool); } static void test_encode_base16(abts_case * tc, void *data) { apr_pool_t *pool; const char *src, *target; const char *dest; apr_size_t len; apr_pool_create(&pool, NULL); src = "foobar"; target = "666f6f626172"; dest = apr_pencode_base16(pool, src, APR_ENCODE_STRING, APR_ENCODE_LOWER, &len); ABTS_STR_EQUAL(tc, target, dest); apr_encode_base16(NULL, src, APR_ENCODE_STRING, APR_ENCODE_NONE, &len); ABTS_ASSERT(tc, apr_psprintf(pool, "size mismatch (%" APR_SIZE_T_FMT "!=%" APR_SIZE_T_FMT ")", len, strlen(dest) + 1), (len == strlen(dest) + 1)); src = "foobar"; target = "666F6F626172"; dest = apr_pencode_base16(pool, src, APR_ENCODE_STRING, APR_ENCODE_NONE, &len); ABTS_STR_EQUAL(tc, target, dest); apr_encode_base16(NULL, src, APR_ENCODE_STRING, APR_ENCODE_NONE, &len); ABTS_ASSERT(tc, apr_psprintf(pool, "size mismatch (%" APR_SIZE_T_FMT "!=%" APR_SIZE_T_FMT ")", len, strlen(dest) + 1), (len == strlen(dest) + 1)); src = "foobar"; target = "66:6f:6f:62:61:72"; dest = apr_pencode_base16(pool, src, APR_ENCODE_STRING, APR_ENCODE_COLON | APR_ENCODE_LOWER, &len); ABTS_STR_EQUAL(tc, target, dest); apr_encode_base16(NULL, src, APR_ENCODE_STRING, APR_ENCODE_COLON, &len); ABTS_ASSERT(tc, apr_psprintf(pool, "size mismatch (%" APR_SIZE_T_FMT "!=%" APR_SIZE_T_FMT ")", len, strlen(dest) + 1), (len == strlen(dest) + 1)); src = "foobar"; target = "66:6F:6F:62:61:72"; dest = apr_pencode_base16(pool, src, APR_ENCODE_STRING, APR_ENCODE_COLON, &len); ABTS_STR_EQUAL(tc, target, dest); apr_encode_base16(NULL, src, APR_ENCODE_STRING, APR_ENCODE_COLON, &len); ABTS_ASSERT(tc, apr_psprintf(pool, "size mismatch (%" APR_SIZE_T_FMT "!=%" APR_SIZE_T_FMT ")", len, strlen(dest) + 1), (len == strlen(dest) + 1)); apr_pool_destroy(pool); } static void test_encode_base16_binary(abts_case * tc, void *data) { apr_pool_t *pool; const char *target; const unsigned char usrc[] = { 0xFF, 0x00, 0xFF, 0x00 }; const char *dest; apr_size_t len; apr_pool_create(&pool, NULL); target = "ff00ff00"; dest = apr_pencode_base16_binary(pool, usrc, 4, APR_ENCODE_LOWER, &len); ABTS_STR_EQUAL(tc, target, dest); apr_encode_base16_binary(NULL, usrc, 4, APR_ENCODE_NONE, &len); ABTS_ASSERT(tc, apr_psprintf(pool, "size mismatch (%" APR_SIZE_T_FMT "!=%" APR_SIZE_T_FMT ")", len, strlen(dest) + 1), (len == strlen(dest) + 1)); target = "FF00FF00"; dest = apr_pencode_base16_binary(pool, usrc, 4, APR_ENCODE_NONE, &len); ABTS_STR_EQUAL(tc, target, dest); apr_encode_base16_binary(NULL, usrc, 4, APR_ENCODE_NONE, &len); ABTS_ASSERT(tc, apr_psprintf(pool, "size mismatch (%" APR_SIZE_T_FMT "!=%" APR_SIZE_T_FMT ")", len, strlen(dest) + 1), (len == strlen(dest) + 1)); target = "ff:00:ff:00"; dest = apr_pencode_base16_binary(pool, usrc, 4, APR_ENCODE_COLON | APR_ENCODE_LOWER, &len); ABTS_STR_EQUAL(tc, target, dest); apr_encode_base16_binary(NULL, usrc, 4, APR_ENCODE_COLON, &len); ABTS_ASSERT(tc, apr_psprintf(pool, "size mismatch (%" APR_SIZE_T_FMT "!=%" APR_SIZE_T_FMT ")", len, strlen(dest) + 1), (len == strlen(dest) + 1)); target = "FF:00:FF:00"; dest = apr_pencode_base16_binary(pool, usrc, 4, APR_ENCODE_COLON, &len); ABTS_STR_EQUAL(tc, target, dest); apr_encode_base16_binary(NULL, usrc, 4, APR_ENCODE_COLON, &len); ABTS_ASSERT(tc, apr_psprintf(pool, "size mismatch (%" APR_SIZE_T_FMT "!=%" APR_SIZE_T_FMT ")", len, strlen(dest) + 1), (len == strlen(dest) + 1)); apr_pool_destroy(pool); } static void test_decode_base16(abts_case * tc, void *data) { apr_pool_t *pool; const char *src, *target; const char *dest; apr_size_t len; apr_pool_create(&pool, NULL); src = "3A:3B:3C:3D"; target = ":;<="; dest = apr_pdecode_base16(pool, src, APR_ENCODE_STRING, APR_ENCODE_COLON, &len); ABTS_STR_EQUAL(tc, target, dest); ABTS_INT_EQUAL(tc, 4, (int)len); apr_decode_base16(NULL, src, APR_ENCODE_STRING, APR_ENCODE_COLON, &len); ABTS_ASSERT(tc, apr_psprintf(pool, "size mismatch (%" APR_SIZE_T_FMT "!=%" APR_SIZE_T_FMT ")", len, (apr_size_t) 5), (len == 5)); apr_pool_destroy(pool); } static void test_decode_base16_binary(abts_case * tc, void *data) { apr_pool_t *pool; const char *src; const unsigned char utarget[] = { 0xFF, 0x00, 0xFF, 0x00 }; const unsigned char *udest; apr_size_t len, vlen; apr_pool_create(&pool, NULL); src = "ff:00:ff:00"; udest = apr_pdecode_base16_binary(pool, src, APR_ENCODE_STRING, APR_ENCODE_COLON, &vlen); ABTS_ASSERT(tc, "apr_pdecode_base16_binary target!=dest", memcmp(utarget, udest, 4) == 0); ABTS_INT_EQUAL(tc, (int)vlen, 4); apr_decode_base16_binary(NULL, src, APR_ENCODE_STRING, APR_ENCODE_COLON, &len); ABTS_ASSERT(tc, apr_psprintf(pool, "size mismatch (%" APR_SIZE_T_FMT "!=%" APR_SIZE_T_FMT ")", len, (apr_size_t) 4), (len == 4)); apr_pool_destroy(pool); } abts_suite *testencode(abts_suite * suite) { suite = ADD_SUITE(suite); abts_run_test(suite, test_encode_base64, NULL); abts_run_test(suite, test_encode_base64_binary, NULL); abts_run_test(suite, test_decode_base64, NULL); abts_run_test(suite, test_decode_base64_binary, NULL); abts_run_test(suite, test_encode_base32, NULL); abts_run_test(suite, test_encode_base32_binary, NULL); abts_run_test(suite, test_decode_base32, NULL); abts_run_test(suite, test_decode_base32_binary, NULL); abts_run_test(suite, test_encode_base16, NULL); abts_run_test(suite, test_encode_base16_binary, NULL); abts_run_test(suite, test_decode_base16, NULL); abts_run_test(suite, test_decode_base16_binary, NULL); return suite; }