From 266ffbc3e61570d08ec0ec84394ab49eb9b44e7d Mon Sep 17 00:00:00 2001 From: Mattias Andrée Date: Sun, 10 May 2026 22:05:40 +0200 Subject: Misc MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Mattias Andrée --- librecrypt_check_settings_.c | 519 ++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 515 insertions(+), 4 deletions(-) (limited to 'librecrypt_check_settings_.c') diff --git a/librecrypt_check_settings_.c b/librecrypt_check_settings_.c index 8462b73..16fbe7f 100644 --- a/librecrypt_check_settings_.c +++ b/librecrypt_check_settings_.c @@ -55,7 +55,7 @@ check_uint(const char *settings, size_t *off, size_t len, char min_first_digit, *out = value; /* Check that the integer is within the accepted range */ - return min <= value && value >= max; + return min <= value && value <= max; } @@ -120,7 +120,7 @@ check_data(const char *settings, size_t *off, size_t len, uintmax_t min, uintmax q = i / 4u; r = i % 4u; n = q * 3u + r - (r ? 1u : 0u); - if (!strout) + if (!strout && lenout) *lenout = n; /* 1 base-64 character in excees of a multiple of 4, * this is illegal because 4 characters encode 3 bytes @@ -204,6 +204,7 @@ librecrypt_check_settings_(const char *settings, size_t len, const char *fmt, .. /* Like "%b"/"%h" except output pointer to base-64 text or decodes asterisk-notation */ strout = va_arg(args, const char **); uout = va_arg(args, uintmax_t *); + fmt++; goto plain_bh; } else outable: if (fmt[1u] == 'p' || fmt[1u] == 'u') { @@ -248,7 +249,7 @@ librecrypt_check_settings_(const char *settings, size_t len, const char *fmt, .. goto outable_done; } else { - abort(); + abort(); /* $covered$ */ outable_done: output = 0; @@ -266,16 +267,526 @@ librecrypt_check_settings_(const char *settings, size_t len, const char *fmt, .. #else +#define RANGE(A, B) (uintmax_t)(A), (uintmax_t)(B) +#define BASE64(A, B) RANGE(A, B), lut, pad, strict_pad + + +static unsigned char lut[256]; + + +static void +check_asterisk(char pad, int strict_pad) +{ + uintmax_t u, u2; + const char *s, *s2; + + EXPECT(librecrypt_check_settings_("*012", 4u, "%b", BASE64(0, 100)) == 1); + EXPECT(librecrypt_check_settings_("*200", 4u, "%b", BASE64(0, 100)) == 0); + EXPECT(librecrypt_check_settings_("*012", 4u, "%b", BASE64(100, 200)) == 0); + EXPECT(librecrypt_check_settings_("*0", 2u, "%b", BASE64(0, 100)) == 1); + EXPECT(librecrypt_check_settings_("*00", 3u, "%b", BASE64(0, 100)) == 1); + EXPECT(librecrypt_check_settings_("", 0u, "%b", BASE64(0, 100)) == 1); + EXPECT(librecrypt_check_settings_("", 0u, "%b", BASE64(5, 100)) == 0); + + EXPECT(librecrypt_check_settings_("*012.", 5u, "%b.", BASE64(0, 100)) == 1); + EXPECT(librecrypt_check_settings_("*012-", 5u, "%b.", BASE64(0, 100)) == 0); + EXPECT(librecrypt_check_settings_("*012", 4u, "%b.", BASE64(0, 100)) == 0); + + EXPECT(librecrypt_check_settings_("*2*5", 4u, "%b%b", BASE64(2, 2), BASE64(5, 5)) == 1); + EXPECT(librecrypt_check_settings_("*2*4", 4u, "%b%b", BASE64(2, 2), BASE64(5, 5)) == 0); + + EXPECT(librecrypt_check_settings_("*012", 4u, "%h", BASE64(0, 100)) == 1); + EXPECT(librecrypt_check_settings_("*200", 4u, "%h", BASE64(0, 100)) == 0); + EXPECT(librecrypt_check_settings_("*012", 4u, "%h", BASE64(100, 200)) == 0); + EXPECT(librecrypt_check_settings_("*0", 2u, "%h", BASE64(0, 100)) == 1); + EXPECT(librecrypt_check_settings_("*00", 3u, "%h", BASE64(0, 100)) == 1); + EXPECT(librecrypt_check_settings_("", 0u, "%h", BASE64(0, 100)) == 1); + EXPECT(librecrypt_check_settings_("", 0u, "%h", BASE64(5, 100)) == 1); + + EXPECT(librecrypt_check_settings_("*012.", 5u, "%h.", BASE64(0, 100)) == 1); + EXPECT(librecrypt_check_settings_("*012-", 5u, "%h.", BASE64(0, 100)) == 0); + EXPECT(librecrypt_check_settings_("*012", 4u, "%h.", BASE64(0, 100)) == 0); + + EXPECT(librecrypt_check_settings_("*2*5", 4u, "%h%h", BASE64(2, 2), BASE64(5, 5)) == 1); + EXPECT(librecrypt_check_settings_("*2*4", 4u, "%h%h", BASE64(2, 2), BASE64(5, 5)) == 0); + + u = 0u; + EXPECT(librecrypt_check_settings_("*012", 4u, "%^b", &u, BASE64(0, 100)) == 1); + EXPECT(u == 12u); + EXPECT(librecrypt_check_settings_("*200", 4u, "%^b", &u, BASE64(0, 100)) == 0); + EXPECT(librecrypt_check_settings_("*012", 4u, "%^b", &u, BASE64(100, 200)) == 0); + u = 99u; + EXPECT(librecrypt_check_settings_("*0", 2u, "%^b", &u, BASE64(0, 100)) == 1); + EXPECT(u == 0u); + u = 99u; + EXPECT(librecrypt_check_settings_("*00", 3u, "%^b", &u, BASE64(0, 100)) == 1); + EXPECT(u == 0u); + u = 99u; + EXPECT(librecrypt_check_settings_("", 0u, "%^b", &u, BASE64(0, 100)) == 1); + EXPECT(u == 0u); + EXPECT(librecrypt_check_settings_("", 0u, "%^b", &u, BASE64(5, 100)) == 0); + + EXPECT(librecrypt_check_settings_("*012.", 5u, "%^b.", &u, BASE64(0, 100)) == 1); + EXPECT(librecrypt_check_settings_("*012-", 5u, "%^b.", &u, BASE64(0, 100)) == 0); + EXPECT(librecrypt_check_settings_("*012", 4u, "%^b.", &u, BASE64(0, 100)) == 0); + + u = u2 = 99u; + EXPECT(librecrypt_check_settings_("*2*5", 4u, "%^b%^b", &u, BASE64(2, 2), &u2, BASE64(5, 5)) == 1); + EXPECT(u == 2u); + EXPECT(u2 == 5u); + EXPECT(librecrypt_check_settings_("*2*4", 4u, "%^b%^b", &u, BASE64(2, 2), &u2, BASE64(5, 5)) == 0); + + u = 0u; + EXPECT(librecrypt_check_settings_("*012", 4u, "%^h", &u, BASE64(0, 100)) == 1); + EXPECT(u == 12u); + EXPECT(librecrypt_check_settings_("*200", 4u, "%^h", &u, BASE64(0, 100)) == 0); + EXPECT(librecrypt_check_settings_("*012", 4u, "%^h", &u, BASE64(100, 200)) == 0); + u = 99u; + EXPECT(librecrypt_check_settings_("*0", 2u, "%^h", &u, BASE64(0, 100)) == 1); + EXPECT(u == 0u); + u = 99u; + EXPECT(librecrypt_check_settings_("*00", 3u, "%^h", &u, BASE64(0, 100)) == 1); + EXPECT(u == 0u); + u = 99u; + EXPECT(librecrypt_check_settings_("", 0u, "%^h", &u, BASE64(0, 100)) == 1); + EXPECT(u == 0u); + u = 99u; + EXPECT(librecrypt_check_settings_("", 0u, "%^h", &u, BASE64(5, 100)) == 1); + EXPECT(u == 0u); + + EXPECT(librecrypt_check_settings_("*012.", 5u, "%^h.", &u, BASE64(0, 100)) == 1); + EXPECT(librecrypt_check_settings_("*012-", 5u, "%^h.", &u, BASE64(0, 100)) == 0); + EXPECT(librecrypt_check_settings_("*012", 4u, "%^h.", &u, BASE64(0, 100)) == 0); + + u = u2 = 99u; + EXPECT(librecrypt_check_settings_("*2*5", 4u, "%^h%^h", &u, BASE64(2, 2), &u2, BASE64(5, 5)) == 1); + EXPECT(u == 2u); + EXPECT(u2 == 5u); + EXPECT(librecrypt_check_settings_("*2*4", 4u, "%^h%^h", &u, BASE64(2, 2), &u2, BASE64(5, 5)) == 0); + + s = ""; + u = 99u; + EXPECT(librecrypt_check_settings_("*5.", 3, "%&b.", &s, &u, BASE64(2, 100)) == 1); + EXPECT(s == NULL); + EXPECT(u == 5u); + + s = ""; + u = 99u; + EXPECT(librecrypt_check_settings_("*5", 2, "%&b", &s, &u, BASE64(2, 100)) == 1); + EXPECT(s == NULL); + EXPECT(u == 5u); + + EXPECT(librecrypt_check_settings_("*5", 2, "%&b", &s, &u, BASE64(1, 4)) == 0); + EXPECT(librecrypt_check_settings_("*5", 2, "%&b", &s, &u, BASE64(6, 9)) == 0); + + s = s2 = ""; + u = u2 = 99u; + EXPECT(librecrypt_check_settings_("*5*10", 5, "%&b%&b", &s, &u, BASE64(2, 100), &s2, &u2, BASE64(2, 100)) == 1); + EXPECT(s == NULL); + EXPECT(u == 5u); + EXPECT(s2 == NULL); + EXPECT(u2 == 10u); + + EXPECT(librecrypt_check_settings_("*", 1u, "%b", BASE64(0, 10)) == 0); + EXPECT(librecrypt_check_settings_("*", 1u, "%h", BASE64(0, 10)) == 0); + EXPECT(librecrypt_check_settings_("*", 1u, "%^b", &u, BASE64(0, 10)) == 0); + EXPECT(librecrypt_check_settings_("*", 1u, "%^h", &u, BASE64(0, 10)) == 0); + EXPECT(librecrypt_check_settings_("*", 1u, "%&b", &s, &u, BASE64(0, 10)) == 0); + EXPECT(librecrypt_check_settings_("*", 1u, "%&h", &s, &u, BASE64(0, 10)) == 0); + EXPECT(librecrypt_check_settings_("*x", 2u, "%b", BASE64(0, 10)) == 0); + EXPECT(librecrypt_check_settings_("*x", 2u, "%h", BASE64(0, 10)) == 0); + EXPECT(librecrypt_check_settings_("*x", 2u, "%^b", &u, BASE64(0, 10)) == 0); + EXPECT(librecrypt_check_settings_("*x", 2u, "%^h", &u, BASE64(0, 10)) == 0); + EXPECT(librecrypt_check_settings_("*x", 2u, "%&b", &s, &u, BASE64(0, 10)) == 0); + EXPECT(librecrypt_check_settings_("*x", 2u, "%&h", &s, &u, BASE64(0, 10)) == 0); +} + + +static void +check_base64(char pad, int strict_pad) +{ + uintmax_t u; + const char *s; + + EXPECT(librecrypt_check_settings_("", 0u, "%b", BASE64(0, 100)) == 1); + EXPECT(librecrypt_check_settings_("", 0u, "%b", BASE64(1, 100)) == 0); + EXPECT(librecrypt_check_settings_("abcd", 4u, "%b", BASE64(3, 3)) == 1); + EXPECT(librecrypt_check_settings_("abcd", 4u, "%b", BASE64(4, 4)) == 0); + + EXPECT(librecrypt_check_settings_("", 0u, "%h", BASE64(0, 100)) == 1); + EXPECT(librecrypt_check_settings_("", 0u, "%h", BASE64(1, 100)) == 1); + EXPECT(librecrypt_check_settings_("abcd", 4u, "%h", BASE64(3, 3)) == 1); + EXPECT(librecrypt_check_settings_("abcd", 4u, "%h", BASE64(4, 4)) == 0); + EXPECT(librecrypt_check_settings_("abcd", 4u, "%h", BASE64(2, 2)) == 0); + + u = 99u; + EXPECT(librecrypt_check_settings_("", 0u, "%^b", &u, BASE64(0, 100)) == 1); + EXPECT(u == 0u); + EXPECT(librecrypt_check_settings_("", 0u, "%^b", &u, BASE64(1, 100)) == 0); + u = 99u; + EXPECT(librecrypt_check_settings_("abcd", 4u, "%^b", &u, BASE64(3, 3)) == 1); + EXPECT(u == 3u); + EXPECT(librecrypt_check_settings_("abcd", 4u, "%^b", &u, BASE64(4, 4)) == 0); + EXPECT(librecrypt_check_settings_("abcd", 4u, "%^b", &u, BASE64(2, 2)) == 0); + + u = 99u; + EXPECT(librecrypt_check_settings_("", 0u, "%^h", &u, BASE64(0, 100)) == 1); + EXPECT(u == 0u); + u = 99u; + EXPECT(librecrypt_check_settings_("", 0u, "%^h", &u, BASE64(1, 100)) == 1); + EXPECT(u == 0u); + u = 99u; + EXPECT(librecrypt_check_settings_("abcd", 4u, "%^h", &u, BASE64(3, 3)) == 1); + EXPECT(u == 3u); + EXPECT(librecrypt_check_settings_("abcd", 4u, "%^h", &u, BASE64(4, 4)) == 0); + EXPECT(librecrypt_check_settings_("abcd", 4u, "%^h", &u, BASE64(2, 2)) == 0); + + s = NULL; + u = 99u; + EXPECT(librecrypt_check_settings_("_", 1u, "_%&b", &s, &u, BASE64(0, 100)) == 1); + EXPECT(u == 0u); + EXPECT(s && !strcmp(s, "")); + EXPECT(librecrypt_check_settings_("_", 1u, "_%&b", &s, &u, BASE64(1, 100)) == 0); + s = NULL; + u = 99u; + EXPECT(librecrypt_check_settings_("_abcd", 5u, "_%&b", &s, &u, BASE64(3, 3)) == 1); + EXPECT(u == 4u); + EXPECT(s && !strcmp(s, "abcd")); + EXPECT(librecrypt_check_settings_("_abcd", 5u, "_%&b", &s, &u, BASE64(4, 4)) == 0); + EXPECT(librecrypt_check_settings_("_abcd", 5u, "_%&b", &s, &u, BASE64(2, 2)) == 0); + + s = NULL; + u = 99u; + EXPECT(librecrypt_check_settings_("_", 1u, "_%&h", &s, &u, BASE64(0, 100)) == 1); + EXPECT(u == 0u); + EXPECT(s && !strcmp(s, "")); + s = NULL; + u = 99u; + EXPECT(librecrypt_check_settings_("_", 1u, "_%&h", &s, &u, BASE64(1, 100)) == 1); + EXPECT(u == 0u); + EXPECT(s && !strcmp(s, "")); + s = NULL; + u = 99u; + EXPECT(librecrypt_check_settings_("_abcd", 5u, "_%&h", &s, &u, BASE64(3, 3)) == 1); + EXPECT(u == 4u); + EXPECT(s && !strcmp(s, "abcd")); + EXPECT(librecrypt_check_settings_("_abcd", 5u, "_%&h", &s, &u, BASE64(4, 4)) == 0); + EXPECT(librecrypt_check_settings_("_abcd", 5u, "_%&h", &s, &u, BASE64(2, 2)) == 0); + + u = 99u; + EXPECT(librecrypt_check_settings_("_abcd_", 6u, "_%&b_", &s, &u, BASE64(3, 3)) == 1); + EXPECT(u == 4u); + EXPECT(s && !strcmp(s, "abcd_")); + u = 99u; + EXPECT(librecrypt_check_settings_("_abcd_", 6u, "_%&h_", &s, &u, BASE64(3, 3)) == 1); + EXPECT(u == 4u); + EXPECT(s && !strcmp(s, "abcd_")); + + u = 99u; + EXPECT(librecrypt_check_settings_("abcdabcd", 8u, "%&b", &s, &u, BASE64(6, 6)) == 1); + EXPECT(u == 8u); + EXPECT(s && strlen(s) == u); + + u = 99u; + EXPECT(librecrypt_check_settings_("abcdabcd", 8u, "%&h", &s, &u, BASE64(6, 6)) == 1); + EXPECT(u == 8u); + EXPECT(s && strlen(s) == u); + + EXPECT(librecrypt_check_settings_("abcda", 5u, "%&b", &s, &u, BASE64(1, 10)) == 0); + EXPECT(librecrypt_check_settings_("abcda---", 8u, "%&b", &s, &u, BASE64(1, 10)) == 0); + EXPECT(librecrypt_check_settings_("abcda---", 8u, "%&b---", &s, &u, BASE64(1, 10)) == 0); + EXPECT(librecrypt_check_settings_("abcda", 5u, "%&h", &s, &u, BASE64(1, 10)) == 0); + EXPECT(librecrypt_check_settings_("abcda---", 8u, "%&h", &s, &u, BASE64(1, 10)) == 0); + EXPECT(librecrypt_check_settings_("abcda---", 8u, "%&h---", &s, &u, BASE64(1, 10)) == 0); + + if (pad && strict_pad) { + EXPECT(librecrypt_check_settings_("abcdab", 6u, "%&b", &s, &u, BASE64(4, 4)) == 0); + EXPECT(librecrypt_check_settings_("abcdab", 6u, "%&h", &s, &u, BASE64(4, 4)) == 0); + EXPECT(librecrypt_check_settings_("abcdabc", 7u, "%&b", &s, &u, BASE64(5, 5)) == 0); + EXPECT(librecrypt_check_settings_("abcdabc", 7u, "%&h", &s, &u, BASE64(5, 5)) == 0); + EXPECT(librecrypt_check_settings_("abcdab--", 8u, "%&b", &s, &u, BASE64(4, 4)) == 1); + EXPECT(librecrypt_check_settings_("abcdab--", 8u, "%&h", &s, &u, BASE64(4, 4)) == 1); + EXPECT(librecrypt_check_settings_("abcdabc-", 8u, "%&b", &s, &u, BASE64(5, 5)) == 1); + EXPECT(librecrypt_check_settings_("abcdabc-", 8u, "%&h", &s, &u, BASE64(5, 5)) == 1); + EXPECT(librecrypt_check_settings_("abcdab--", 8u, "%&b--", &s, &u, BASE64(4, 4)) == 0); + EXPECT(librecrypt_check_settings_("abcdab--", 8u, "%&h--", &s, &u, BASE64(4, 4)) == 0); + EXPECT(librecrypt_check_settings_("abcdabc-", 8u, "%&b-", &s, &u, BASE64(5, 5)) == 0); + EXPECT(librecrypt_check_settings_("abcdabc-", 8u, "%&h-", &s, &u, BASE64(5, 5)) == 0); + } else if (pad) { + EXPECT(librecrypt_check_settings_("abcdab", 6u, "%&b", &s, &u, BASE64(4, 4)) == 1); + EXPECT(librecrypt_check_settings_("abcdab", 6u, "%&h", &s, &u, BASE64(4, 4)) == 1); + EXPECT(librecrypt_check_settings_("abcdabc", 7u, "%&b", &s, &u, BASE64(5, 5)) == 1); + EXPECT(librecrypt_check_settings_("abcdabc", 7u, "%&h", &s, &u, BASE64(5, 5)) == 1); + EXPECT(librecrypt_check_settings_("abcdab--", 8u, "%&b", &s, &u, BASE64(4, 4)) == 1); + EXPECT(librecrypt_check_settings_("abcdab--", 8u, "%&h", &s, &u, BASE64(4, 4)) == 1); + EXPECT(librecrypt_check_settings_("abcdabc-", 8u, "%&b", &s, &u, BASE64(5, 5)) == 1); + EXPECT(librecrypt_check_settings_("abcdabc-", 8u, "%&h", &s, &u, BASE64(5, 5)) == 1); + EXPECT(librecrypt_check_settings_("abcdab--", 8u, "%&b--", &s, &u, BASE64(4, 4)) == 0); + EXPECT(librecrypt_check_settings_("abcdab--", 8u, "%&h--", &s, &u, BASE64(4, 4)) == 0); + EXPECT(librecrypt_check_settings_("abcdabc-", 8u, "%&b-", &s, &u, BASE64(5, 5)) == 0); + EXPECT(librecrypt_check_settings_("abcdabc-", 8u, "%&h-", &s, &u, BASE64(5, 5)) == 0); + } else { + EXPECT(librecrypt_check_settings_("abcdab", 6u, "%&b", &s, &u, BASE64(4, 4)) == 1); + EXPECT(librecrypt_check_settings_("abcdab", 6u, "%&h", &s, &u, BASE64(4, 4)) == 1); + EXPECT(librecrypt_check_settings_("abcdabc", 7u, "%&b", &s, &u, BASE64(5, 5)) == 1); + EXPECT(librecrypt_check_settings_("abcdabc", 7u, "%&h", &s, &u, BASE64(5, 5)) == 1); + EXPECT(librecrypt_check_settings_("abcdab--", 8u, "%&b", &s, &u, BASE64(4, 4)) == 0); + EXPECT(librecrypt_check_settings_("abcdab--", 8u, "%&h", &s, &u, BASE64(4, 4)) == 0); + EXPECT(librecrypt_check_settings_("abcdabc-", 8u, "%&b", &s, &u, BASE64(5, 5)) == 0); + EXPECT(librecrypt_check_settings_("abcdabc-", 8u, "%&h", &s, &u, BASE64(5, 5)) == 0); + EXPECT(librecrypt_check_settings_("abcdab--", 8u, "%&b--", &s, &u, BASE64(4, 4)) == 1); + EXPECT(librecrypt_check_settings_("abcdab--", 8u, "%&h--", &s, &u, BASE64(4, 4)) == 1); + EXPECT(librecrypt_check_settings_("abcdabc-", 8u, "%&b-", &s, &u, BASE64(5, 5)) == 1); + EXPECT(librecrypt_check_settings_("abcdabc-", 8u, "%&h-", &s, &u, BASE64(5, 5)) == 1); + } + + if (pad && strict_pad) { + EXPECT(librecrypt_check_settings_("abcdab", 6u, "%^b", &u, BASE64(4, 4)) == 0); + EXPECT(librecrypt_check_settings_("abcdab", 6u, "%^h", &u, BASE64(4, 4)) == 0); + EXPECT(librecrypt_check_settings_("abcdabc", 7u, "%^b", &u, BASE64(5, 5)) == 0); + EXPECT(librecrypt_check_settings_("abcdabc", 7u, "%^h", &u, BASE64(5, 5)) == 0); + EXPECT(librecrypt_check_settings_("abcdab--", 8u, "%^b", &u, BASE64(4, 4)) == 1); + EXPECT(librecrypt_check_settings_("abcdab--", 8u, "%^h", &u, BASE64(4, 4)) == 1); + EXPECT(librecrypt_check_settings_("abcdabc-", 8u, "%^b", &u, BASE64(5, 5)) == 1); + EXPECT(librecrypt_check_settings_("abcdabc-", 8u, "%^h", &u, BASE64(5, 5)) == 1); + EXPECT(librecrypt_check_settings_("abcdab--", 8u, "%^b--", &u, BASE64(4, 4)) == 0); + EXPECT(librecrypt_check_settings_("abcdab--", 8u, "%^h--", &u, BASE64(4, 4)) == 0); + EXPECT(librecrypt_check_settings_("abcdabc-", 8u, "%^b-", &u, BASE64(5, 5)) == 0); + EXPECT(librecrypt_check_settings_("abcdabc-", 8u, "%^h-", &u, BASE64(5, 5)) == 0); + } else if (pad) { + EXPECT(librecrypt_check_settings_("abcdab", 6u, "%^b", &u, BASE64(4, 4)) == 1); + EXPECT(librecrypt_check_settings_("abcdab", 6u, "%^h", &u, BASE64(4, 4)) == 1); + EXPECT(librecrypt_check_settings_("abcdabc", 7u, "%^b", &u, BASE64(5, 5)) == 1); + EXPECT(librecrypt_check_settings_("abcdabc", 7u, "%^h", &u, BASE64(5, 5)) == 1); + EXPECT(librecrypt_check_settings_("abcdab--", 8u, "%^b", &u, BASE64(4, 4)) == 1); + EXPECT(librecrypt_check_settings_("abcdab--", 8u, "%^h", &u, BASE64(4, 4)) == 1); + EXPECT(librecrypt_check_settings_("abcdabc-", 8u, "%^b", &u, BASE64(5, 5)) == 1); + EXPECT(librecrypt_check_settings_("abcdabc-", 8u, "%^h", &u, BASE64(5, 5)) == 1); + EXPECT(librecrypt_check_settings_("abcdab--", 8u, "%^b--", &u, BASE64(4, 4)) == 0); + EXPECT(librecrypt_check_settings_("abcdab--", 8u, "%^h--", &u, BASE64(4, 4)) == 0); + EXPECT(librecrypt_check_settings_("abcdabc-", 8u, "%^b-", &u, BASE64(5, 5)) == 0); + EXPECT(librecrypt_check_settings_("abcdabc-", 8u, "%^h-", &u, BASE64(5, 5)) == 0); + } else { + EXPECT(librecrypt_check_settings_("abcdab", 6u, "%^b", &u, BASE64(4, 4)) == 1); + EXPECT(librecrypt_check_settings_("abcdab", 6u, "%^h", &u, BASE64(4, 4)) == 1); + EXPECT(librecrypt_check_settings_("abcdabc", 7u, "%^b", &u, BASE64(5, 5)) == 1); + EXPECT(librecrypt_check_settings_("abcdabc", 7u, "%^h", &u, BASE64(5, 5)) == 1); + EXPECT(librecrypt_check_settings_("abcdab--", 8u, "%^b", &u, BASE64(4, 4)) == 0); + EXPECT(librecrypt_check_settings_("abcdab--", 8u, "%^h", &u, BASE64(4, 4)) == 0); + EXPECT(librecrypt_check_settings_("abcdabc-", 8u, "%^b", &u, BASE64(5, 5)) == 0); + EXPECT(librecrypt_check_settings_("abcdabc-", 8u, "%^h", &u, BASE64(5, 5)) == 0); + EXPECT(librecrypt_check_settings_("abcdab--", 8u, "%^b--", &u, BASE64(4, 4)) == 1); + EXPECT(librecrypt_check_settings_("abcdab--", 8u, "%^h--", &u, BASE64(4, 4)) == 1); + EXPECT(librecrypt_check_settings_("abcdabc-", 8u, "%^b-", &u, BASE64(5, 5)) == 1); + EXPECT(librecrypt_check_settings_("abcdabc-", 8u, "%^h-", &u, BASE64(5, 5)) == 1); + } + + if (pad && strict_pad) { + EXPECT(librecrypt_check_settings_("abcdab", 6u, "%b", BASE64(4, 4)) == 0); + EXPECT(librecrypt_check_settings_("abcdab", 6u, "%h", BASE64(4, 4)) == 0); + EXPECT(librecrypt_check_settings_("abcdabc", 7u, "%b", BASE64(5, 5)) == 0); + EXPECT(librecrypt_check_settings_("abcdabc", 7u, "%h", BASE64(5, 5)) == 0); + EXPECT(librecrypt_check_settings_("abcdab--", 8u, "%b", BASE64(4, 4)) == 1); + EXPECT(librecrypt_check_settings_("abcdab--", 8u, "%h", BASE64(4, 4)) == 1); + EXPECT(librecrypt_check_settings_("abcdabc-", 8u, "%b", BASE64(5, 5)) == 1); + EXPECT(librecrypt_check_settings_("abcdabc-", 8u, "%h", BASE64(5, 5)) == 1); + EXPECT(librecrypt_check_settings_("abcdab--", 8u, "%b--", BASE64(4, 4)) == 0); + EXPECT(librecrypt_check_settings_("abcdab--", 8u, "%h--", BASE64(4, 4)) == 0); + EXPECT(librecrypt_check_settings_("abcdabc-", 8u, "%b-", BASE64(5, 5)) == 0); + EXPECT(librecrypt_check_settings_("abcdabc-", 8u, "%h-", BASE64(5, 5)) == 0); + } else if (pad) { + EXPECT(librecrypt_check_settings_("abcdab", 6u, "%b", BASE64(4, 4)) == 1); + EXPECT(librecrypt_check_settings_("abcdab", 6u, "%h", BASE64(4, 4)) == 1); + EXPECT(librecrypt_check_settings_("abcdabc", 7u, "%b", BASE64(5, 5)) == 1); + EXPECT(librecrypt_check_settings_("abcdabc", 7u, "%h", BASE64(5, 5)) == 1); + EXPECT(librecrypt_check_settings_("abcdab--", 8u, "%b", BASE64(4, 4)) == 1); + EXPECT(librecrypt_check_settings_("abcdab--", 8u, "%h", BASE64(4, 4)) == 1); + EXPECT(librecrypt_check_settings_("abcdabc-", 8u, "%b", BASE64(5, 5)) == 1); + EXPECT(librecrypt_check_settings_("abcdabc-", 8u, "%h", BASE64(5, 5)) == 1); + EXPECT(librecrypt_check_settings_("abcdab--", 8u, "%b--", BASE64(4, 4)) == 0); + EXPECT(librecrypt_check_settings_("abcdab--", 8u, "%h--", BASE64(4, 4)) == 0); + EXPECT(librecrypt_check_settings_("abcdabc-", 8u, "%b-", BASE64(5, 5)) == 0); + EXPECT(librecrypt_check_settings_("abcdabc-", 8u, "%h-", BASE64(5, 5)) == 0); + } else { + EXPECT(librecrypt_check_settings_("abcdab", 6u, "%b", BASE64(4, 4)) == 1); + EXPECT(librecrypt_check_settings_("abcdab", 6u, "%h", BASE64(4, 4)) == 1); + EXPECT(librecrypt_check_settings_("abcdabc", 7u, "%b", BASE64(5, 5)) == 1); + EXPECT(librecrypt_check_settings_("abcdabc", 7u, "%h", BASE64(5, 5)) == 1); + EXPECT(librecrypt_check_settings_("abcdab--", 8u, "%b", BASE64(4, 4)) == 0); + EXPECT(librecrypt_check_settings_("abcdab--", 8u, "%h", BASE64(4, 4)) == 0); + EXPECT(librecrypt_check_settings_("abcdabc-", 8u, "%b", BASE64(5, 5)) == 0); + EXPECT(librecrypt_check_settings_("abcdabc-", 8u, "%h", BASE64(5, 5)) == 0); + EXPECT(librecrypt_check_settings_("abcdab--", 8u, "%b--", BASE64(4, 4)) == 1); + EXPECT(librecrypt_check_settings_("abcdab--", 8u, "%h--", BASE64(4, 4)) == 1); + EXPECT(librecrypt_check_settings_("abcdabc-", 8u, "%b-", BASE64(5, 5)) == 1); + EXPECT(librecrypt_check_settings_("abcdabc-", 8u, "%h-", BASE64(5, 5)) == 1); + } +} + + +static int discarded_int; + int main(void) { + const char *s, *s2; + uintmax_t u, u2; + SET_UP_ALARM(); + INIT_TEST_ABORT(); INIT_RESOURCE_TEST(); + memset(lut, 255, sizeof(lut)); + lut['a'] = lut['b'] = lut['c'] = lut['d'] = 0; + + EXPECT(librecrypt_check_settings_("", 0u, "") == 1); + EXPECT(librecrypt_check_settings_("hej", 3u, "hej") == 1); + EXPECT(librecrypt_check_settings_("hej", 2u, "hej") == 0); + EXPECT(librecrypt_check_settings_("hej", 4u, "hej") == 0); + EXPECT(librecrypt_check_settings_("tja", 3u, "hej") == 0); + + EXPECT(librecrypt_check_settings_("%", 1u, "%%") == 1); + EXPECT(librecrypt_check_settings_("%", 0u, "%%") == 0); + + EXPECT(librecrypt_check_settings_("hello", 5u, "%*") == 1); + EXPECT(librecrypt_check_settings_("hello$world", 11u, "%*$world") == 1); + EXPECT(librecrypt_check_settings_("hello$world", 11u, "%*$WORLD") == 0); + + EXPECT(librecrypt_check_settings_("hej.", 4u, "%s.", "hej", "tja", NULL) == 1); + EXPECT(librecrypt_check_settings_("tja.", 4u, "%s.", "hej", "tja", NULL) == 1); + EXPECT(librecrypt_check_settings_("bye.", 4u, "%s.", "hej", "tja", NULL) == 0); + EXPECT(librecrypt_check_settings_("hej-", 4u, "%s.", "hej", "tja", NULL) == 0); + EXPECT(librecrypt_check_settings_("tja-", 4u, "%s.", "hej", "tja", NULL) == 0); + EXPECT(librecrypt_check_settings_("bye-", 4u, "%s.", "hej", "tja", NULL) == 0); + EXPECT(librecrypt_check_settings_("hej.", 3u, "%s.", "hej", "tja", NULL) == 0); + EXPECT(librecrypt_check_settings_("tja.", 3u, "%s.", "hej", "tja", NULL) == 0); + EXPECT(librecrypt_check_settings_("bye.", 3u, "%s.", "hej", "tja", NULL) == 0); + EXPECT(librecrypt_check_settings_("hej.", 3u, "%s", "hej", "tja", NULL) == 1); + EXPECT(librecrypt_check_settings_("tja.", 3u, "%s", "hej", "tja", NULL) == 1); + EXPECT(librecrypt_check_settings_("bye.", 3u, "%s", "hej", "tja", NULL) == 0); + EXPECT(librecrypt_check_settings_("hej.", 4u, "%s", "hej", "tja", NULL) == 0); + EXPECT(librecrypt_check_settings_("tja.", 4u, "%s", "hej", "tja", NULL) == 0); + EXPECT(librecrypt_check_settings_("bye.", 4u, "%s", "hej", "tja", NULL) == 0); + EXPECT(librecrypt_check_settings_(".", 1u, "%s.", "hej", "tja", "", NULL) == 1); + EXPECT(librecrypt_check_settings_("tja.", 4u, "%s.", "hej", "tja", "", NULL) == 1); + EXPECT(librecrypt_check_settings_("tja.", 4u, "%s.", "", "hej", "tja", NULL) == 0); + EXPECT(librecrypt_check_settings_("tja.", 4u, "%s.", NULL) == 0); + + EXPECT(librecrypt_check_settings_("hejsan", 1u, "%s", "hej", NULL) == 0); + EXPECT(librecrypt_check_settings_("hejsan", 3u, "%s", "hej", NULL) == 1); + EXPECT(librecrypt_check_settings_("hejsan", 6u, "%s", "hej", NULL) == 0); + + s = NULL; + EXPECT(librecrypt_check_settings_("hej.", 4u, "%^s.", &s, "hej", "tja", "", NULL) == 1); + EXPECT(s && !strcmp(s, "hej")); + s = NULL; + EXPECT(librecrypt_check_settings_("tja.", 4u, "%^s.", &s, "hej", "tja", "", NULL) == 1); + EXPECT(s && !strcmp(s, "tja")); + s = NULL; + EXPECT(librecrypt_check_settings_(".", 1u, "%^s.", &s, "hej", "tja", "", NULL) == 1); + EXPECT(s && !strcmp(s, "")); + + EXPECT(librecrypt_check_settings_("10.", 3u, "%p.", RANGE(1, 10)) == 1); + EXPECT(librecrypt_check_settings_("10.", 3u, "%p.", RANGE(10, 20)) == 1); + EXPECT(librecrypt_check_settings_("10.", 3u, "%p.", RANGE(1, 20)) == 1); + EXPECT(librecrypt_check_settings_("10.", 3u, "%p.", RANGE(1, 9)) == 0); + EXPECT(librecrypt_check_settings_("10.", 3u, "%p.", RANGE(11, 20)) == 0); + EXPECT(librecrypt_check_settings_("0.", 2u, "%p.", RANGE(1, 10)) == 0); + EXPECT(librecrypt_check_settings_("0.", 2u, "%p.", RANGE(0, 10)) == 1); + EXPECT(librecrypt_check_settings_("00.", 3u, "%p.", RANGE(0, 10)) == 0); + EXPECT(librecrypt_check_settings_("010.", 4u, "%p.", RANGE(1, 10)) == 0); + + EXPECT(librecrypt_check_settings_("10.", 3u, "%u.", RANGE(1, 10)) == 1); + EXPECT(librecrypt_check_settings_("10.", 3u, "%u.", RANGE(10, 20)) == 1); + EXPECT(librecrypt_check_settings_("10.", 3u, "%u.", RANGE(1, 20)) == 1); + EXPECT(librecrypt_check_settings_("10.", 3u, "%u.", RANGE(1, 9)) == 0); + EXPECT(librecrypt_check_settings_("10.", 3u, "%u.", RANGE(11, 20)) == 0); + EXPECT(librecrypt_check_settings_("0.", 2u, "%u.", RANGE(1, 10)) == 0); + EXPECT(librecrypt_check_settings_("0.", 2u, "%u.", RANGE(0, 10)) == 1); + EXPECT(librecrypt_check_settings_("00.", 3u, "%u.", RANGE(0, 10)) == 1); + EXPECT(librecrypt_check_settings_("010.", 4u, "%u.", RANGE(1, 10)) == 1); + + u = 99u; + EXPECT(librecrypt_check_settings_("10.", 3u, "%^p.", &u, RANGE(0, 100)) == 1); + EXPECT(u == 10u); + EXPECT(librecrypt_check_settings_("15.", 3u, "%^p.", &u, RANGE(0, 100)) == 1); + EXPECT(u == 15u); + EXPECT(librecrypt_check_settings_("0.", 2u, "%^p.", &u, RANGE(0, 100)) == 1); + EXPECT(u == 0u); + + u = 99u; + EXPECT(librecrypt_check_settings_("10.", 3u, "%^u.", &u, RANGE(0, 100)) == 1); + EXPECT(u == 10u); + EXPECT(librecrypt_check_settings_("15.", 3u, "%^u.", &u, RANGE(0, 100)) == 1); + EXPECT(u == 15u); + EXPECT(librecrypt_check_settings_("0.", 2u, "%^u.", &u, RANGE(0, 100)) == 1); + EXPECT(u == 0u); + EXPECT(librecrypt_check_settings_("010.", 4u, "%^u.", &u, RANGE(0, 100)) == 1); + EXPECT(u == 10u); + EXPECT(librecrypt_check_settings_("015.", 4u, "%^u.", &u, RANGE(0, 100)) == 1); + EXPECT(u == 15u); + EXPECT(librecrypt_check_settings_("00.", 3u, "%^u.", &u, RANGE(0, 100)) == 1); + EXPECT(u == 0u); + + EXPECT(librecrypt_check_settings_("10.15.", 6u, "%u.%u.", RANGE(1, 10), RANGE(11, 20)) == 1); + EXPECT(librecrypt_check_settings_("10.10.", 6u, "%u.%u.", RANGE(1, 10), RANGE(11, 20)) == 0); + EXPECT(librecrypt_check_settings_("15.10.", 6u, "%u.%u.", RANGE(1, 10), RANGE(11, 20)) == 0); + + u = 99u; + u2 = 99u; + EXPECT(librecrypt_check_settings_("10.15.", 6u, "%^u.%^u.", &u, RANGE(1, 10), &u2, RANGE(11, 20)) == 1); + EXPECT(u == 10u); + EXPECT(u2 == 15u); + + EXPECT(librecrypt_check_settings_("", 0u, "%p", RANGE(0, 10)) == 0); + EXPECT(librecrypt_check_settings_("a", 1u, "%p", RANGE(0, 10)) == 0); + EXPECT(librecrypt_check_settings_("", 0u, "%u", RANGE(0, 10)) == 0); + EXPECT(librecrypt_check_settings_("a", 1u, "%u", RANGE(0, 10)) == 0); + EXPECT(librecrypt_check_settings_("", 0u, "%^p", &u, RANGE(0, 10)) == 0); + EXPECT(librecrypt_check_settings_("a", 1u, "%^p", &u, RANGE(0, 10)) == 0); + EXPECT(librecrypt_check_settings_("", 0u, "%^u", &u, RANGE(0, 10)) == 0); + EXPECT(librecrypt_check_settings_("a", 1u, "%^u", &u, RANGE(0, 10)) == 0); + + EXPECT(librecrypt_check_settings_("hej.hello.", 10u, "%s.%s.", "hej", NULL, "hello", NULL) == 1); + EXPECT(librecrypt_check_settings_("hello.hej.", 10u, "%s.%s.", "hej", NULL, "hello", NULL) == 0); + + EXPECT(librecrypt_check_settings_("hejsan", 1u, "%^s", &s, "hej", NULL) == 0); + s = NULL; + EXPECT(librecrypt_check_settings_("hejsan", 3u, "%^s", &s, "hej", NULL) == 1); + EXPECT(s && !strcmp(s, "hej")); + EXPECT(librecrypt_check_settings_("hejsan", 6u, "%^s", &s, "hej", NULL) == 0); + + s = NULL; + s2 = NULL; + EXPECT(librecrypt_check_settings_("hej.hello.", 10u, "%^s.%^s.", &s, "x", "hej", NULL, &s2, "y", "hello", NULL) == 1); + EXPECT(s && !strcmp(s, "hej")); + EXPECT(s2 && !strcmp(s2, "hello")); + + s = NULL; + s2 = NULL; + EXPECT(librecrypt_check_settings_("x.y.", 4u, "%^s.%^s.", &s, "x", "hej", NULL, &s2, "y", "hello", NULL) == 1); + EXPECT(s && !strcmp(s, "x")); + EXPECT(s2 && !strcmp(s2, "y")); + + check_asterisk('-', 0); + check_asterisk('-', 1); + check_asterisk('\0', 0); + check_asterisk('\0', 1); + + check_base64('-', 0); + check_base64('-', 1); + check_base64('\0', 0); + check_base64('\0', 1); + +#define S(STR) (STR), (sizeof(STR) - 1u) +#define LARGE "999999999999999999999999999999999999999" + EXPECT(librecrypt_check_settings_(S(LARGE LARGE LARGE LARGE), "%p", RANGE(0, UINTMAX_MAX)) == 0); + + EXPECT_ABORT(discarded_int = librecrypt_check_settings_("", 0u, "%\xFF", 0, 0, 0, 0, 0, 0, 0)); + STOP_RESOURCE_TEST(); return 0; } #endif -/* TODO test */ -- cgit v1.2.3-70-g09d2