1
0
Fork 0
knot/tests/modules/test_onlinesign.c
Daniel Baumann 70063ca008
Adding upstream version 3.4.6.
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
2025-06-21 13:47:52 +02:00

203 lines
5.5 KiB
C

/* Copyright (C) 2018 CZ.NIC, z.s.p.o. <knot-dns@labs.nic.cz>
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
#include <tap/basic.h>
#include <assert.h>
#include "knot/modules/onlinesign/nsec_next.h"
#include "libknot/consts.h"
#include "libknot/dname.h"
#include "libknot/errcode.h"
/*!
* \brief Assert that a domain name in a static buffer is valid.
*/
#define _assert_dname(name) \
assert(knot_dname_wire_check(name, name + KNOT_DNAME_MAXLEN, NULL) > 0)
static void _test_nsec_next(const char *msg,
const knot_dname_t *input,
const knot_dname_t *apex,
const knot_dname_t *expected)
{
knot_dname_t *next = online_nsec_next(input, apex);
ok(next != NULL && knot_dname_is_equal(next, expected),
"nsec_next, %s", msg);
knot_dname_free(next, NULL);
}
/*!
* \brief Check \a online_nsec_next.
*
* Intentionally implemented as a macro. The input domain names are copied
* into static buffers and validated.
*/
#define test_nsec_next(msg, _input, _apex, _expected) \
{ \
uint8_t input[KNOT_DNAME_MAXLEN] = _input; \
uint8_t apex[KNOT_DNAME_MAXLEN] = _apex; \
uint8_t expected[KNOT_DNAME_MAXLEN] = _expected; \
\
_assert_dname(input); \
_assert_dname(apex); \
_assert_dname(expected); \
\
_test_nsec_next(msg, input, apex, expected); \
}
int main(int argc, char *argv[])
{
plan_lazy();
// adding a single zero-byte label
test_nsec_next(
"zero-byte label, apex",
"\x7""example""\x3""com",
"\x7""example""\x3""com",
"\x01\x00""\x07""example""\x03""com"
);
test_nsec_next(
"zero-byte label, subdomain",
"\x02""nx""\x7""example""\x3""com",
"\x7""example""\x3""com",
"\x01\x00""\x02""nx""\x07""example""\x03""com"
);
test_nsec_next(
"zero-byte label, binary",
"\x02\xff\xff""\x7""example""\x3""com",
"\x07""example""\x3""com",
"\x01\x00""\x02\xff\xff""\x7""example""\x3""com"
);
// zero byte label won't fit, increment
#define APEX \
"\x05""bacon""\x05""salad"
#define LONG_SUFFIX \
"\x2e""xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" \
"\x2e""iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii" \
"\x2e""mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm" \
"\x2e""qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq" \
"\x2c""zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz" \
APEX
assert(sizeof(LONG_SUFFIX) == 245 + 1);
test_nsec_next(
"increment first label (simple)",
"\x08""icecream" LONG_SUFFIX,
APEX,
"\x08""icecrean" LONG_SUFFIX
);
test_nsec_next(
"increment first label (binary)",
"\x08""walrus\xff\xff" LONG_SUFFIX,
APEX,
"\x08""walrut\x00\x00" LONG_SUFFIX
);
test_nsec_next(
"increment first label (in place)",
"\x07""lobster" LONG_SUFFIX,
APEX,
"\x07""lobstes" LONG_SUFFIX
);
test_nsec_next(
"increment first label (extend)",
"\x07""\xff\xff\xff\xff\xff\xff\xff" LONG_SUFFIX,
APEX,
"\x08""\xff\xff\xff\xff\xff\xff\xff\x00" LONG_SUFFIX
);
// name too long
test_nsec_next(
"name to long, strip label and increase next (simple)",
"\x03""\xff\xff\xff""\x04""newt" LONG_SUFFIX,
APEX,
"\x04""newu" LONG_SUFFIX
);
test_nsec_next(
"name to long, strip label and increase next (binary)",
"\x03""\xff\xff\xff""\x04""cc\xff\xff" LONG_SUFFIX,
APEX,
"\x04""cd\x00\x00" LONG_SUFFIX
);
test_nsec_next(
"name to long, strip label and increase next (extend)",
"\x04""\xff\xff\xff\xff""\x03""\xff\xff\xff" LONG_SUFFIX,
APEX,
"\x04""\xff\xff\xff\x00" LONG_SUFFIX
);
// label too long
#define MAX_LABEL "\x3f" /* 63 */ \
"\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff" \
"\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff" \
"\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff" \
"\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff" \
"\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff" \
"\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff" \
"\xff\xff\xff"
assert(sizeof(MAX_LABEL) == 64 + 1);
#define PAD_LABEL "\x28" /* 40 */ \
"iiiiiiiiiioooooooooottttttttttssssssssss"
assert(sizeof(PAD_LABEL) == 41 + 1);
test_nsec_next(
"label too long, strip and increase next (simple)",
MAX_LABEL "\x08""mandrill" MAX_LABEL MAX_LABEL PAD_LABEL APEX,
APEX,
"\x08""mandrilm" MAX_LABEL MAX_LABEL PAD_LABEL APEX
);
test_nsec_next(
"label too long, strip and increase next (extend)",
MAX_LABEL "\x07""\xff\xff\xff\xff\xff\xff\xff" MAX_LABEL MAX_LABEL PAD_LABEL APEX,
APEX,
"\x08""\xff\xff\xff\xff\xff\xff\xff\x00" MAX_LABEL MAX_LABEL PAD_LABEL APEX
);
test_nsec_next(
"label too long, strip multiple",
MAX_LABEL MAX_LABEL "\x08""flamingo" MAX_LABEL PAD_LABEL APEX,
APEX,
"\x08""flamingp" MAX_LABEL PAD_LABEL APEX
);
test_nsec_next(
"label too long, wrap around to apex",
"\x31" /* 49 */
"\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff"
"\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff"
"\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff"
"\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff"
"\xff\xff\xff\xff\xff\xff\xff\xff\xff"
MAX_LABEL MAX_LABEL MAX_LABEL APEX,
APEX,
APEX
);
return 0;
}