Eine aufbereitete Darstellung der Quelle

 
     
 
 
Anforderungen  |   Konzepte  |   Entwurf  |   Entwicklung  |   Qualitätssicherung  |   Lebenszyklus  |   Steuerung
 
 
 
 

Benutzer

Quelle  test_base64.c

  Sprache: C
 


#if defined(HAVE_CONFIG_H)
#include "config_ac.h"
#endif

#include "os_calls.h"
#include "string_calls.h"
#include "base64.h"

#include "test_common.h"
/*
* These are the example test strings in RFC4648(10)
*/

static const char *rfc4648_ex1_text = "";
static const char *rfc4648_ex1_b64 = "";
static const char *rfc4648_ex2_text = "f";
static const char *rfc4648_ex2_b64 = "Zg==";
static const char *rfc4648_ex3_text = "fo";
static const char *rfc4648_ex3_b64 = "Zm8=";
static const char *rfc4648_ex4_text = "foo";
static const char *rfc4648_ex4_b64 = "Zm9v";
static const char *rfc4648_ex5_text = "foob";
static const char *rfc4648_ex5_b64 = "Zm9vYg==";
static const char *rfc4648_ex6_text = "fooba";
static const char *rfc4648_ex6_b64 = "Zm9vYmE=";
static const char *rfc4648_ex7_text = "foobar";
static const char *rfc4648_ex7_b64 = "Zm9vYmFy";

/* Every single valid base64 character, except padding */
static const char *all_b64 =
    "ABCDEFGHIJKL"
    "MNOPQRSTUVWX"
    "YZabcdefghij"
    "klmnopqrstuv"
    "wxyz01234567"
    "89+/";

/* What we should get as binary if we decode this */
static const char all_b64_decoded[] =
{
    '\x00''\x10''\x83''\x10''\x51''\x87''\x20''\x92''\x8b',
    '\x30''\xd3''\x8f''\x41''\x14''\x93''\x51''\x55''\x97',
    '\x61''\x96''\x9b''\x71''\xd7''\x9f''\x82''\x18''\xa3',
    '\x92''\x59''\xa7''\xa2''\x9a''\xab''\xb2''\xdb''\xaf',
    '\xc3''\x1c''\xb3''\xd3''\x5d''\xb7''\xe3''\x9e''\xbb',
    '\xf3''\xdf''\xbf'
};

static void
test_rfc4648_to_b64(const char *plaintext, size_t len, const char *b64)
{
    char buff[256];
    size_t result;

    result = base64_encode(plaintext, len, buff, sizeof(buff));
    ck_assert_int_eq(result, len);
    ck_assert_str_eq(buff, b64);

}

/* Text-only encoder wrapper */
static void
test_rfc4648_to_b64_text(const char *plaintext, const char *b64)
{
    test_rfc4648_to_b64(plaintext, g_strlen(plaintext), b64);
}

/* Text-only decoder wrapper for valid base64 */
static void
test_rfc4648_from_b64_text(const char *b64, const char *text)
{
    char buff[256];
    size_t actual_len;
    int result;

    result = base64_decode(b64, buff, sizeof(buff), &actual_len);
    ck_assert_int_eq(result, 0);
    ck_assert_int_lt(actual_len, sizeof(buff));
    buff[actual_len] = '\0';
    ck_assert_str_eq(buff, text);
}

/******************************************************************************/
START_TEST(test_b64_rfc4648_ex1_to)
{
    test_rfc4648_to_b64_text(rfc4648_ex1_text, rfc4648_ex1_b64);
}
END_TEST

/******************************************************************************/
START_TEST(test_b64_rfc4648_ex1_from)
{
    test_rfc4648_from_b64_text(rfc4648_ex1_b64, rfc4648_ex1_text);
}
END_TEST

/******************************************************************************/
START_TEST(test_b64_rfc4648_ex2_to)
{
    test_rfc4648_to_b64_text(rfc4648_ex2_text, rfc4648_ex2_b64);
}
END_TEST

/******************************************************************************/
START_TEST(test_b64_rfc4648_ex2_from)
{
    test_rfc4648_from_b64_text(rfc4648_ex2_b64, rfc4648_ex2_text);
}
END_TEST

/******************************************************************************/
START_TEST(test_b64_rfc4648_ex3_to)
{
    test_rfc4648_to_b64_text(rfc4648_ex3_text, rfc4648_ex3_b64);
}
END_TEST

/******************************************************************************/
START_TEST(test_b64_rfc4648_ex3_from)
{
    test_rfc4648_from_b64_text(rfc4648_ex3_b64, rfc4648_ex3_text);
}
END_TEST

/******************************************************************************/
START_TEST(test_b64_rfc4648_ex4_to)
{
    test_rfc4648_to_b64_text(rfc4648_ex4_text, rfc4648_ex4_b64);
}
END_TEST

/******************************************************************************/
START_TEST(test_b64_rfc4648_ex4_from)
{
    test_rfc4648_from_b64_text(rfc4648_ex4_b64, rfc4648_ex4_text);
}
END_TEST

/******************************************************************************/
START_TEST(test_b64_rfc4648_ex5_to)
{
    test_rfc4648_to_b64_text(rfc4648_ex5_text, rfc4648_ex5_b64);
}
END_TEST

/******************************************************************************/
START_TEST(test_b64_rfc4648_ex5_from)
{
    test_rfc4648_from_b64_text(rfc4648_ex5_b64, rfc4648_ex5_text);
}
END_TEST

/******************************************************************************/
START_TEST(test_b64_rfc4648_ex6_to)
{
    test_rfc4648_to_b64_text(rfc4648_ex6_text, rfc4648_ex6_b64);
}
END_TEST

/******************************************************************************/
START_TEST(test_b64_rfc4648_ex6_from)
{
    test_rfc4648_from_b64_text(rfc4648_ex6_b64, rfc4648_ex6_text);
}
END_TEST

/******************************************************************************/
START_TEST(test_b64_rfc4648_ex7_to)
{
    test_rfc4648_to_b64_text(rfc4648_ex7_text, rfc4648_ex7_b64);
}
END_TEST

/******************************************************************************/
START_TEST(test_b64_rfc4648_ex7_from)
{
    test_rfc4648_from_b64_text(rfc4648_ex7_b64, rfc4648_ex7_text);
}
END_TEST

/******************************************************************************/
START_TEST(test_b64_all_valid_from)
{
    char buff[256];
    size_t actual_len;
    int result;
    char *str_result;
    char *str_expected;

    result = base64_decode(all_b64, buff, sizeof(buff), &actual_len);
    ck_assert_int_eq(result, 0);
    ck_assert_int_eq(actual_len, sizeof(all_b64_decoded));
    str_result = bin_to_hex(buff, actual_len);
    str_expected = bin_to_hex(all_b64_decoded, sizeof(all_b64_decoded));
    ck_assert_str_eq(str_result, str_expected);
    free(str_result);
    free(str_expected);
}
END_TEST

/******************************************************************************/
START_TEST(test_b64_all_valid_to)
{
    char buff[256];
    size_t result;

    result = base64_encode(all_b64_decoded, sizeof(all_b64_decoded),
                           buff, sizeof(buff));
    ck_assert_int_eq(result, sizeof(all_b64_decoded));
    ck_assert_str_eq(buff, all_b64);
}
END_TEST

/******************************************************************************/
START_TEST(test_b64_all_invalid)
{
    char buff[256];
    size_t actual_len;
    char valid[256] = {0};
    char encoded[5] = { "T0sh" }; /* Decodes to 'OK!' */
    int result;

    /* Make a note of all the valid b64 characters */
    unsigned int i = 0;
    unsigned char c;
    while ((c = all_b64[i]) != '\0')
    {
        valid[c] = 1;
        ++i;
    }

    /* Check the decoder's working on a simple string...*/
    result = base64_decode(encoded, buff, sizeof(buff), &actual_len);
    ck_assert_int_eq(result, 0);
    ck_assert_int_eq(actual_len, 3);
    buff[actual_len] = '\0';
    ck_assert_str_eq(buff, "OK!");

    /* Now replace the 1st character with all invalid characters in turn,
     * and check they're rejected */

    for (i = 0 ; i < 256; ++i)
    {
        if (i != '\0' && !valid[i]) /* Don't try the string terminator char! */
        {
            encoded[0] = i;
            result = base64_decode(encoded, buff, sizeof(buff), &actual_len);
            if (result == 0)
            {
                ck_abort_msg("Character 0x%02x was not rejected", i);
            }
        }
    }
}
END_TEST

/******************************************************************************/
START_TEST(test_b64_small_buffer_encode)
{
    char buff[10 * 4 + 1]; /* Enough space for 10 quanta */

    size_t result;

    result = base64_encode(all_b64_decoded, sizeof(all_b64_decoded),
                           buff, sizeof(buff));
    /* Should have read 10 lots of 24 bits from the input */
    ck_assert_int_eq(result, 10 * 3);
    ck_assert_str_eq(buff, "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmn");
}
END_TEST

/******************************************************************************/
START_TEST(test_b64_small_buffer_decode)
{
    char buff[10]; /* Enough space for 10 chars */

    size_t actual_len;
    int result;
    char *str_result;
    char *str_expected;

    result = base64_decode(all_b64, buff, sizeof(buff), &actual_len);
    ck_assert_int_eq(result, 0);
    ck_assert_int_eq(actual_len, sizeof(all_b64_decoded));
    str_result = bin_to_hex(buff, sizeof(buff));
    str_expected = bin_to_hex(all_b64_decoded, sizeof(buff));
    ck_assert_str_eq(str_result, str_expected);
    free(str_result);
    free(str_expected);
}
END_TEST

/******************************************************************************/
START_TEST(test_b64_add_pad_one)
{
    /* Check that a missing trailing '=' is added when decoding */
    test_rfc4648_from_b64_text("Zm8""fo"); /* RFC4648 example 3 */
}
END_TEST

/******************************************************************************/
START_TEST(test_b64_add_pad_two)
{
    /* Check that two missing trailing '=' chars are added when decoding */
    test_rfc4648_from_b64_text("Zg""f"); /* RFC4648 example 2 */
}
END_TEST

/******************************************************************************/
START_TEST(test_b64_bad_pad)
{
    char buff[16];
    size_t actual_len;

    /* Check all bad quanta with padding chars */
    static const char *bad_pad[] =
    {
        "=AAA",
        "A=AA",
        "AA=A",
        "==AA",
        "=A=A",
        "=AA=",
        "A==A",
        "A=A=",
        "===A",
        "A===",
        NULL
    };
    const char **p;

    for (p = bad_pad ; *p != NULL ; ++p)
    {
        int result = base64_decode(*p, buff, sizeof(buff), &actual_len);
        if (result == 0)
        {
            ck_abort_msg("Padding '%s' was not rejected", *p);
        }
    }
}
END_TEST

/******************************************************************************/
START_TEST(test_b64_concat_pad)
{
    const char *src =
        "VGVzdA=="  /* Test */
        "IA=="      /* <space> */
        "Y29uY2F0ZW5hdGVk" /* concatenated */
        "IA=="      /* <space> */
        "cGFkZGluZw=="/*padding */
    const char *expected = "Test concatenated padding";
    char buff[64];
    size_t actual_len;
    int result;

    result = base64_decode(src, buff, sizeof(buff), &actual_len);
    ck_assert_int_eq(result, 0);
    ck_assert_int_eq(actual_len, g_strlen(expected));
    buff[actual_len] = '\0';
    ck_assert_str_eq(buff, expected);
}
END_TEST

/******************************************************************************/
Suite *
make_suite_test_base64(void)
{
    Suite *s;
    TCase *tc_b64;

    s = suite_create("base64");

    tc_b64 = tcase_create("base64");
    suite_add_tcase(s, tc_b64);
    tcase_add_test(tc_b64, test_b64_rfc4648_ex1_to);
    tcase_add_test(tc_b64, test_b64_rfc4648_ex1_from);
    tcase_add_test(tc_b64, test_b64_rfc4648_ex2_to);
    tcase_add_test(tc_b64, test_b64_rfc4648_ex2_from);
    tcase_add_test(tc_b64, test_b64_rfc4648_ex3_to);
    tcase_add_test(tc_b64, test_b64_rfc4648_ex3_from);
    tcase_add_test(tc_b64, test_b64_rfc4648_ex4_to);
    tcase_add_test(tc_b64, test_b64_rfc4648_ex4_from);
    tcase_add_test(tc_b64, test_b64_rfc4648_ex5_to);
    tcase_add_test(tc_b64, test_b64_rfc4648_ex5_from);
    tcase_add_test(tc_b64, test_b64_rfc4648_ex6_to);
    tcase_add_test(tc_b64, test_b64_rfc4648_ex6_from);
    tcase_add_test(tc_b64, test_b64_rfc4648_ex7_to);
    tcase_add_test(tc_b64, test_b64_rfc4648_ex7_from);
    tcase_add_test(tc_b64, test_b64_all_valid_from);
    tcase_add_test(tc_b64, test_b64_all_valid_to);
    tcase_add_test(tc_b64, test_b64_all_invalid);
    tcase_add_test(tc_b64, test_b64_small_buffer_encode);
    tcase_add_test(tc_b64, test_b64_small_buffer_decode);
    tcase_add_test(tc_b64, test_b64_add_pad_one);
    tcase_add_test(tc_b64, test_b64_add_pad_two);
    tcase_add_test(tc_b64, test_b64_bad_pad);
    tcase_add_test(tc_b64, test_b64_concat_pad);

    return s;
}

Messung V0.5 in Prozent
C=86 H=84 G=84

¤ Dauer der Verarbeitung: 0.14 Sekunden  (vorverarbeitet am  2026-07-10) ¤

*© Formatika GbR, Deutschland






Wurzel

Suchen

PVS Prover

Isabelle Prover

NIST Cobol Testsuite

Cephes Mathematical Library

Vienna Development Method

Haftungshinweis

Die Informationen auf dieser Webseite wurden nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit, noch Qualität der bereit gestellten Informationen zugesichert.

Bemerkung:

Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.






                                                                                                                                                                                                                                                                                                                                                                                                     


Neuigkeiten

     Aktuelles
     Motto des Tages

Software

     Quellcodebibliothek
     Eigene Quellcodes
     Fremde Quellcodes
     Suchen

Aktivitäten

     Artikel über Sicherheit
     Anleitung zur Aktivierung von SSL

Muße

     Gedichte
     Musik
     Bilder

Jenseits des Üblichen ....
    

Besucherstatistik

Besucherstatistik