Annotation of embedaddon/strongswan/src/libstrongswan/tests/suites/test_utils.c, revision 1.1.1.1

1.1       misho       1: /*
                      2:  * Copyright (C) 2013-2015 Tobias Brunner
                      3:  * HSR Hochschule fuer Technik Rapperswil
                      4:  *
                      5:  * This program is free software; you can redistribute it and/or modify it
                      6:  * under the terms of the GNU General Public License as published by the
                      7:  * Free Software Foundation; either version 2 of the License, or (at your
                      8:  * option) any later version.  See <http://www.fsf.org/copyleft/gpl.txt>.
                      9:  *
                     10:  * This program is distributed in the hope that it will be useful, but
                     11:  * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
                     12:  * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
                     13:  * for more details.
                     14:  */
                     15: 
                     16: #include "test_suite.h"
                     17: 
                     18: #include <library.h>
                     19: #include <utils/utils.h>
                     20: #include <ipsec/ipsec_types.h>
                     21: #include <credentials/keys/public_key.h>
                     22: 
                     23: #include <time.h>
                     24: 
                     25: /*******************************************************************************
                     26:  * object storage on lib
                     27:  */
                     28: 
                     29: START_TEST(test_objects)
                     30: {
                     31:        char *k1 = "key1", *k2 = "key2";
                     32:        char *v1 = "val1", *val;
                     33: 
                     34:        ck_assert(lib->get(lib, k1) == NULL);
                     35: 
                     36:        ck_assert(lib->set(lib, k1, v1));
                     37:        ck_assert(!lib->set(lib, k1, v1));
                     38: 
                     39:        val = lib->get(lib, k1);
                     40:        ck_assert(val != NULL);
                     41:        ck_assert(streq(val, v1));
                     42: 
                     43:        ck_assert(lib->set(lib, k1, NULL));
                     44:        ck_assert(!lib->set(lib, k2, NULL));
                     45: 
                     46:        ck_assert(lib->get(lib, k1) == NULL);
                     47: }
                     48: END_TEST
                     49: 
                     50: /*******************************************************************************
                     51:  * test return_... functions
                     52:  */
                     53: 
                     54: START_TEST(test_return_functions)
                     55: {
                     56:        ck_assert(return_null() == NULL);
                     57:        ck_assert(return_null("asdf", 5, NULL, 1, "qwer") == NULL);
                     58: 
                     59:        ck_assert(return_true() == TRUE);
                     60:        ck_assert(return_true("asdf", 5, NULL, 1, "qwer") == TRUE);
                     61: 
                     62:        ck_assert(return_false() == FALSE);
                     63:        ck_assert(return_false("asdf", 5, NULL, 1, "qwer") == FALSE);
                     64: 
                     65:        ck_assert(return_failed() == FAILED);
                     66:        ck_assert(return_failed("asdf", 5, NULL, 1, "qwer") == FAILED);
                     67: 
                     68:        ck_assert(return_success() == SUCCESS);
                     69:        ck_assert(return_success("asdf", 5, NULL, 1, "qwer") == SUCCESS);
                     70: 
                     71:        /* just make sure this works */
                     72:        nop();
                     73:        nop("asdf", 5, NULL, 1, "qwer");
                     74: }
                     75: END_TEST
                     76: 
                     77: /*******************************************************************************
                     78:  * timeval_add_ms
                     79:  */
                     80: 
                     81: START_TEST(test_timeval_add_ms)
                     82: {
                     83:        timeval_t tv;
                     84: 
                     85:        tv.tv_sec = 0;
                     86:        tv.tv_usec = 0;
                     87:        timeval_add_ms(&tv, 0);
                     88:        ck_assert_int_eq(tv.tv_sec, 0);
                     89:        ck_assert_int_eq(tv.tv_usec, 0);
                     90: 
                     91:        timeval_add_ms(&tv, 1);
                     92:        ck_assert_int_eq(tv.tv_sec, 0);
                     93:        ck_assert_int_eq(tv.tv_usec, 1000);
                     94: 
                     95:        timeval_add_ms(&tv, 0);
                     96:        ck_assert_int_eq(tv.tv_sec, 0);
                     97:        ck_assert_int_eq(tv.tv_usec, 1000);
                     98: 
                     99:        timeval_add_ms(&tv, 999);
                    100:        ck_assert_int_eq(tv.tv_sec, 1);
                    101:        ck_assert_int_eq(tv.tv_usec, 0);
                    102: 
                    103:        timeval_add_ms(&tv, 0);
                    104:        ck_assert_int_eq(tv.tv_sec, 1);
                    105:        ck_assert_int_eq(tv.tv_usec, 0);
                    106: 
                    107:        timeval_add_ms(&tv, 1000);
                    108:        ck_assert_int_eq(tv.tv_sec, 2);
                    109:        ck_assert_int_eq(tv.tv_usec, 0);
                    110: 
                    111:        timeval_add_ms(&tv, 1500);
                    112:        ck_assert_int_eq(tv.tv_sec, 3);
                    113:        ck_assert_int_eq(tv.tv_usec, 500000);
                    114: }
                    115: END_TEST
                    116: 
                    117: /*******************************************************************************
                    118:  * timespan_from_string
                    119:  */
                    120: 
                    121: static struct {
                    122:        char *s;
                    123:        char *u;
                    124:        bool v;
                    125:        time_t t;
                    126: } ts_data[] = {
                    127:        {NULL,  NULL,   FALSE,  0},
                    128:        {"",    NULL,   FALSE,  0},
                    129:        {"a",   NULL,   FALSE,  0},
                    130:        {"0",   NULL,   TRUE,   0},
                    131:        {"5",   NULL,   TRUE,   5},
                    132:        {"5s",  NULL,   TRUE,   5},
                    133:        {"5m",  NULL,   TRUE,   300},
                    134:        {"5ms", NULL,   TRUE,   300},
                    135:        {"5h",  NULL,   TRUE,   18000},
                    136:        {"5d",  NULL,   TRUE,   432000},
                    137:        {"5x",  NULL,   FALSE,  0},
                    138:        {"5",   "",             TRUE,   5},
                    139:        {"5",   "m",    TRUE,   300},
                    140:        {"5",   "ms",   TRUE,   300},
                    141:        {"5",   "x",    FALSE,  0},
                    142:        {"5x",  "m",    FALSE,  0},
                    143:        {"18446744073709551616",        NULL,   FALSE,  0},
                    144: };
                    145: 
                    146: START_TEST(test_timespan_from_string)
                    147: {
                    148:        time_t val = 42;
                    149: 
                    150:        ck_assert(timespan_from_string(ts_data[_i].s, ts_data[_i].u,
                    151:                                                                   NULL) == ts_data[_i].v);
                    152:        ck_assert(timespan_from_string(ts_data[_i].s, ts_data[_i].u,
                    153:                                                                   &val) == ts_data[_i].v);
                    154:        if (ts_data[_i].v)
                    155:        {
                    156:                ck_assert_int_eq(val, ts_data[_i].t);
                    157:        }
                    158:        else
                    159:        {
                    160:                ck_assert_int_eq(val, 42);
                    161:        }
                    162: }
                    163: END_TEST
                    164: 
                    165: /*******************************************************************************
                    166:  * htoun/untoh
                    167:  */
                    168: 
                    169: START_TEST(test_htoun)
                    170: {
                    171:        chunk_t net64, expected;
                    172:        uint16_t host16 = 513;
                    173:        uint32_t net16 = 0, host32 = 67305985;
                    174:        uint64_t net32 = 0, host64 = 578437695752307201ULL;
                    175: 
                    176:        net64 = chunk_alloca(16);
                    177:        memset(net64.ptr, 0, net64.len);
                    178: 
                    179:        expected = chunk_from_chars(0x00, 0x02, 0x01, 0x00);
                    180:        htoun16((char*)&net16 + 1, host16);
                    181:        ck_assert(chunk_equals(expected, chunk_from_thing(net16)));
                    182: 
                    183:        expected = chunk_from_chars(0x00, 0x00, 0x04, 0x03, 0x02, 0x01, 0x00, 0x00);
                    184:        htoun32((uint16_t*)&net32 + 1, host32);
                    185:        ck_assert(chunk_equals(expected, chunk_from_thing(net32)));
                    186: 
                    187:        expected = chunk_from_chars(0x00, 0x00, 0x00, 0x00,
                    188:                                                                0x08, 0x07, 0x06, 0x05,
                    189:                                                                0x04, 0x03, 0x02, 0x01,
                    190:                                                                0x00, 0x00, 0x00, 0x00);
                    191:        htoun64((uint32_t*)net64.ptr + 1, host64);
                    192:        ck_assert(chunk_equals(expected, net64));
                    193: }
                    194: END_TEST
                    195: 
                    196: START_TEST(test_untoh)
                    197: {
                    198:        chunk_t net;
                    199:        uint16_t host16;
                    200:        uint32_t host32;
                    201:        uint64_t host64;
                    202: 
                    203:        net = chunk_from_chars(0x00, 0x02, 0x01, 0x00);
                    204:        host16 = untoh16(net.ptr + 1);
                    205:        ck_assert(host16 == 513);
                    206: 
                    207:        net = chunk_from_chars(0x00, 0x00, 0x04, 0x03, 0x02, 0x01, 0x00, 0x00);
                    208:        host32 = untoh32(net.ptr + 2);
                    209:        ck_assert(host32 == 67305985);
                    210: 
                    211:        net = chunk_from_chars(0x00, 0x00, 0x00, 0x00, 0x08, 0x07, 0x06, 0x05,
                    212:                                                   0x04, 0x03, 0x02, 0x01, 0x00, 0x00, 0x00, 0x00);
                    213:        host64 = untoh64(net.ptr + 4);
                    214:        ck_assert(host64 == 578437695752307201ULL);
                    215: }
                    216: END_TEST
                    217: 
                    218: /*******************************************************************************
                    219:  * pad_len/round_up/down
                    220:  */
                    221: 
                    222: START_TEST(test_round)
                    223: {
                    224:        ck_assert_int_eq(pad_len(0, 4), 0);
                    225:        ck_assert_int_eq(pad_len(1, 4), 3);
                    226:        ck_assert_int_eq(pad_len(2, 4), 2);
                    227:        ck_assert_int_eq(pad_len(3, 4), 1);
                    228:        ck_assert_int_eq(pad_len(4, 4), 0);
                    229:        ck_assert_int_eq(pad_len(5, 4), 3);
                    230: 
                    231:        ck_assert_int_eq(round_up(0, 4), 0);
                    232:        ck_assert_int_eq(round_up(1, 4), 4);
                    233:        ck_assert_int_eq(round_up(2, 4), 4);
                    234:        ck_assert_int_eq(round_up(3, 4), 4);
                    235:        ck_assert_int_eq(round_up(4, 4), 4);
                    236:        ck_assert_int_eq(round_up(5, 4), 8);
                    237: 
                    238:        ck_assert_int_eq(round_down(0, 4), 0);
                    239:        ck_assert_int_eq(round_down(1, 4), 0);
                    240:        ck_assert_int_eq(round_down(2, 4), 0);
                    241:        ck_assert_int_eq(round_down(3, 4), 0);
                    242:        ck_assert_int_eq(round_down(4, 4), 4);
                    243:        ck_assert_int_eq(round_down(5, 4), 4);
                    244: }
                    245: END_TEST
                    246: 
                    247: /*******************************************************************************
                    248:  * streq
                    249:  */
                    250: 
                    251: static struct {
                    252:        char *a;
                    253:        char *b;
                    254:        bool eq;
                    255:        bool case_eq;
                    256: } streq_data[] = {
                    257:        {NULL, NULL, TRUE, TRUE},
                    258:        {NULL, "", FALSE, FALSE},
                    259:        {"", NULL, FALSE, FALSE},
                    260:        {"abc", "", FALSE, FALSE},
                    261:        {"abc", "abc", TRUE, TRUE},
                    262:        {"abc", "ABC", FALSE, TRUE},
                    263: };
                    264: 
                    265: START_TEST(test_streq)
                    266: {
                    267:        bool eq;
                    268: 
                    269:        ck_assert(streq(streq_data[_i].a, streq_data[_i].a));
                    270:        ck_assert(streq(streq_data[_i].b, streq_data[_i].b));
                    271:        eq = streq(streq_data[_i].a, streq_data[_i].b);
                    272:        ck_assert(eq == streq_data[_i].eq);
                    273: 
                    274:        ck_assert(strcaseeq(streq_data[_i].a, streq_data[_i].a));
                    275:        ck_assert(strcaseeq(streq_data[_i].b, streq_data[_i].b));
                    276:        eq = strcaseeq(streq_data[_i].a, streq_data[_i].b);
                    277:        ck_assert(eq == streq_data[_i].case_eq);
                    278: }
                    279: END_TEST
                    280: 
                    281: /*******************************************************************************
                    282:  * strneq
                    283:  */
                    284: 
                    285: static struct {
                    286:        char *a;
                    287:        char *b;
                    288:        size_t n;
                    289:        bool eq;
                    290:        bool case_eq;
                    291: } strneq_data[] = {
                    292:        {NULL, NULL, 0, TRUE, TRUE},
                    293:        {NULL, NULL, 10, TRUE, TRUE},
                    294:        {NULL, "", 0, FALSE, FALSE},
                    295:        {"", NULL, 0, FALSE, FALSE},
                    296:        {"abc", "", 0, TRUE, TRUE},
                    297:        {"abc", "", 1, FALSE, FALSE},
                    298:        {"abc", "ab", 1, TRUE, TRUE},
                    299:        {"abc", "ab", 2, TRUE, TRUE},
                    300:        {"abc", "ab", 3, FALSE, FALSE},
                    301:        {"abc", "abc", 3, TRUE, TRUE},
                    302:        {"abc", "abc", 4, TRUE, TRUE},
                    303:        {"abc", "abC", 2, TRUE, TRUE},
                    304:        {"abc", "abC", 3, FALSE, TRUE},
                    305: };
                    306: 
                    307: START_TEST(test_strneq)
                    308: {
                    309:        bool eq;
                    310: 
                    311:        ck_assert(strneq(strneq_data[_i].a, strneq_data[_i].a, strneq_data[_i].n));
                    312:        ck_assert(strneq(strneq_data[_i].b, strneq_data[_i].b, strneq_data[_i].n));
                    313:        eq = strneq(strneq_data[_i].a, strneq_data[_i].b, strneq_data[_i].n);
                    314:        ck_assert(eq == strneq_data[_i].eq);
                    315: 
                    316:        ck_assert(strncaseeq(strneq_data[_i].a, strneq_data[_i].a,  strneq_data[_i].n));
                    317:        ck_assert(strncaseeq(strneq_data[_i].b, strneq_data[_i].b,  strneq_data[_i].n));
                    318:        eq = strncaseeq(strneq_data[_i].a, strneq_data[_i].b,  strneq_data[_i].n);
                    319:        ck_assert(eq == strneq_data[_i].case_eq);
                    320: }
                    321: END_TEST
                    322: 
                    323: /*******************************************************************************
                    324:  * strpfx
                    325:  */
                    326: 
                    327: static struct {
                    328:        char *str;
                    329:        char *pfx;
                    330:        bool prefix;
                    331:        bool case_prefix;
                    332: } strpfx_data[] = {
                    333:        {"", "", TRUE, TRUE},
                    334:        {"abc", "", TRUE, TRUE},
                    335:        {"abc", "a", TRUE, TRUE},
                    336:        {"abc", "ab", TRUE, TRUE},
                    337:        {"abc", "abc", TRUE, TRUE},
                    338:        {"abc", "abcd", FALSE, FALSE},
                    339:        {"abc", "AB", FALSE, TRUE},
                    340:        {"ABC", "ab", FALSE, TRUE},
                    341:        {" abc", "abc", FALSE, FALSE},
                    342: };
                    343: 
                    344: START_TEST(test_strpfx)
                    345: {
                    346:        bool prefix;
                    347: 
                    348:        prefix = strpfx(strpfx_data[_i].str, strpfx_data[_i].pfx);
                    349:        ck_assert(prefix == strpfx_data[_i].prefix);
                    350:        prefix = strcasepfx(strpfx_data[_i].str, strpfx_data[_i].pfx);
                    351:        ck_assert(prefix == strpfx_data[_i].case_prefix);
                    352: }
                    353: END_TEST
                    354: 
                    355: /*******************************************************************************
                    356:  * malloc_align/free_align
                    357:  */
                    358: 
                    359: START_TEST(test_malloc_align)
                    360: {
                    361:        void *ptr[128][256];
                    362:        int size, align;
                    363: 
                    364:        for (size = 0; size < countof(ptr); size++)
                    365:        {
                    366:                for (align = 0; align < countof(ptr[0]); align++)
                    367:                {
                    368:                        ptr[size][align] = malloc_align(size, align);
                    369:                        if (align)
                    370:                        {
                    371:                                ck_assert((uintptr_t)ptr[size][align] % align == 0);
                    372:                        }
                    373:                        if (size)
                    374:                        {
                    375:                                ck_assert(ptr[size][align]);
                    376:                                memset(ptr[size][align], 0xEF, size);
                    377:                        }
                    378:                }
                    379:        }
                    380:        for (size = 0; size < countof(ptr); size++)
                    381:        {
                    382:                for (align = 0; align < countof(ptr[0]); align++)
                    383:                {
                    384:                        free_align(ptr[size][align]);
                    385:                }
                    386:        }
                    387: }
                    388: END_TEST
                    389: 
                    390: /*******************************************************************************
                    391:  * memxor
                    392:  */
                    393: 
                    394: static void do_memxor(chunk_t a, chunk_t b, chunk_t exp)
                    395: {
                    396:        chunk_t dst;
                    397: 
                    398:        dst = chunk_clonea(a);
                    399:        dst.len = b.len;
                    400:        memxor(dst.ptr, b.ptr, b.len);
                    401:        ck_assert(chunk_equals(dst, exp));
                    402: }
                    403: 
                    404: START_TEST(test_memxor)
                    405: {
                    406:        chunk_t a, b, dst;
                    407:        int i;
                    408: 
                    409:        a = chunk_alloca(64);
                    410:        memset(a.ptr, 0, a.len);
                    411:        b = chunk_alloca(64);
                    412:        for (i = 0; i < 64; i++)
                    413:        {
                    414:                b.ptr[i] = i;
                    415:                b.len = i;
                    416:                do_memxor(a, b, b);
                    417:        }
                    418:        b.len = 64;
                    419:        do_memxor(a, b, b);
                    420: 
                    421:        dst = chunk_clonea(a);
                    422:        memxor(dst.ptr, b.ptr, b.len);
                    423:        ck_assert(chunk_equals(dst, b));
                    424: 
                    425:        memxor(dst.ptr, b.ptr, 0);
                    426:        memxor(dst.ptr, b.ptr, 1);
                    427:        memxor(dst.ptr + 1, b.ptr + 1, 1);
                    428:        memxor(dst.ptr + 2, b.ptr + 2, b.len - 2);
                    429:        ck_assert(chunk_equals(dst, a));
                    430: }
                    431: END_TEST
                    432: 
                    433: START_TEST(test_memxor_aligned)
                    434: {
                    435:        uint64_t a = 0, b = 0;
                    436:        chunk_t ca, cb;
                    437:        int i;
                    438: 
                    439:        ca = chunk_from_thing(a);
                    440:        cb = chunk_from_thing(b);
                    441: 
                    442:        for (i = 0; i < 8; i++)
                    443:        {
                    444:                cb.ptr[i] = i + 1;
                    445:        }
                    446: 
                    447:        /* 64-bit aligned */
                    448:        memxor(ca.ptr, cb.ptr, 8);
                    449:        ck_assert(a == b);
                    450:        /* 32-bit aligned source */
                    451:        a = 0;
                    452:        memxor(ca.ptr, cb.ptr + 4, 4);
                    453:        ck_assert(chunk_equals(ca, chunk_from_chars(0x05, 0x06, 0x07, 0x08,
                    454:                                                                                                0x00, 0x00, 0x00, 0x00)));
                    455:        /* 16-bit aligned source */
                    456:        a = 0;
                    457:        memxor(ca.ptr, cb.ptr + 2, 6);
                    458:        ck_assert(chunk_equals(ca, chunk_from_chars(0x03, 0x04, 0x05, 0x06,
                    459:                                                                                                0x07, 0x08, 0x00, 0x00)));
                    460:        /* 8-bit aligned source */
                    461:        a = 0;
                    462:        memxor(ca.ptr, cb.ptr + 1, 7);
                    463:        ck_assert(chunk_equals(ca, chunk_from_chars(0x02, 0x03, 0x04, 0x05,
                    464:                                                                                                0x06, 0x07, 0x08, 0x00)));
                    465: }
                    466: END_TEST
                    467: 
                    468: /*******************************************************************************
                    469:  * memeq/const
                    470:  */
                    471: 
                    472: static struct {
                    473:        char *a;
                    474:        char *b;
                    475:        size_t n;
                    476:        bool res;
                    477: } memeq_data[] = {
                    478:        {NULL, NULL, 0, TRUE},
                    479:        {"a", "b", 0, TRUE},
                    480:        {"", "", 1, TRUE},
                    481:        {"abcdefgh", "abcdefgh", 8, TRUE},
                    482:        {"a", "b", 1, FALSE},
                    483:        {"A", "a", 1, FALSE},
                    484:        {"\0a", "\0b", 2, FALSE},
                    485:        {"abc", "abd", 3, FALSE},
                    486:        {"abc", "dbd", 3, FALSE},
                    487:        {"abcdefgh", "abcdffgh", 8, FALSE},
                    488:        {"abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz",
                    489:         "abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz", 52, TRUE},
                    490:        {"abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz",
                    491:         "abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyy", 52, FALSE},
                    492:        {"bbcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz",
                    493:         "abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz", 52, FALSE},
                    494: };
                    495: 
                    496: START_TEST(test_memeq)
                    497: {
                    498:        ck_assert(memeq(memeq_data[_i].a, memeq_data[_i].b,
                    499:                                        memeq_data[_i].n) == memeq_data[_i].res);
                    500: }
                    501: END_TEST
                    502: 
                    503: START_TEST(test_memeq_const)
                    504: {
                    505:        ck_assert(memeq_const(memeq_data[_i].a, memeq_data[_i].b,
                    506:                                                  memeq_data[_i].n) == memeq_data[_i].res);
                    507: }
                    508: END_TEST
                    509: 
                    510: /*******************************************************************************
                    511:  * memstr
                    512:  */
                    513: 
                    514: static struct {
                    515:        char *haystack;
                    516:        char *needle;
                    517:        size_t n;
                    518:        int offset;
                    519: } memstr_data[] = {
                    520:        {NULL, NULL, 0, -1},
                    521:        {NULL, NULL, 3, -1},
                    522:        {NULL, "abc", 0, -1},
                    523:        {NULL, "abc", 3, -1},
                    524:        {"", "", 0, -1},
                    525:        {"abc", NULL, 3, -1},
                    526:        {"abc", "", 3, -1},
                    527:        {"abc", "abc", 3, 0},
                    528:        {" abc", "abc", 4, 1},
                    529:        {" abc", "abc", 3, -1},
                    530:        {"abcabc", "abc", 6, 0},
                    531:        {" abc ", "abc", 5, 1},
                    532: };
                    533: 
                    534: START_TEST(test_memstr)
                    535: {
                    536:        char *ret;
                    537: 
                    538:        ret = memstr(memstr_data[_i].haystack, memstr_data[_i].needle, memstr_data[_i].n);
                    539:        if (memstr_data[_i].offset >= 0)
                    540:        {
                    541:                ck_assert(ret == memstr_data[_i].haystack + memstr_data[_i].offset);
                    542:        }
                    543:        else
                    544:        {
                    545:                ck_assert(ret == NULL);
                    546:        }
                    547: }
                    548: END_TEST
                    549: 
                    550: /*******************************************************************************
                    551:  * memwipe
                    552:  */
                    553: 
                    554: START_TEST(test_memwipe_null)
                    555: {
                    556:        memwipe(NULL, 16);
                    557: }
                    558: END_TEST
                    559: 
                    560: static inline bool test_wiped_memory(char *buf, size_t len)
                    561: {
                    562:        int i;
                    563: 
                    564:        /* comparing two bytes at once reduces the chances of conflicts if memory
                    565:         * got overwritten already */
                    566:        for (i = 0; i < len; i += 2)
                    567:        {
                    568:                if (buf[i] != 0 && buf[i] == i &&
                    569:                        buf[i+1] != 0 && buf[i+1] == i+1)
                    570:                {
                    571:                        return FALSE;
                    572:                }
                    573:        }
                    574:        return TRUE;
                    575: }
                    576: 
                    577: START_TEST(test_memwipe_stack)
                    578: {
                    579:        char buf[64];
                    580:        int i;
                    581: 
                    582:        for (i = 0; i < sizeof(buf); i++)
                    583:        {
                    584:                buf[i] = i;
                    585:        }
                    586:        memwipe(buf, sizeof(buf));
                    587:        ck_assert(test_wiped_memory(buf, sizeof(buf)));
                    588: }
                    589: END_TEST
                    590: 
                    591: START_TEST(test_memwipe_heap)
                    592: {
                    593:        size_t len = 64;
                    594:        char *buf = malloc(len);
                    595:        int i;
                    596: 
                    597:        for (i = 0; i < len; i++)
                    598:        {
                    599:                buf[i] = i;
                    600:        }
                    601:        memwipe(buf, len);
                    602:        ck_assert(test_wiped_memory(buf, len));
                    603:        free(buf);
                    604: }
                    605: END_TEST
                    606: 
                    607: /*******************************************************************************
                    608:  * utils_memrchr
                    609:  */
                    610: 
                    611: static struct {
                    612:        char *s;
                    613:        int c;
                    614:        size_t n;
                    615:        int offset;
                    616: } memrchr_data[] = {
                    617:        {NULL, 'f', 0, -1},
                    618:        {NULL, 'f', 3, -1},
                    619:        {"", 'f', 0, -1},
                    620:        {"", '\0', 1, 0},
                    621:        {"foo", '\0', 3, -1},
                    622:        {"foo", '\0', 4, 3},
                    623:        {"foo", 'f', 3, 0},
                    624:        {"foo", 'o', 3, 2},
                    625:        {"foo", 'o', 2, 1},
                    626:        {"foo", 'o', 1, -1},
                    627:        {"foo", 'o', 0, -1},
                    628:        {"foo", 'x', 3, -1},
                    629: };
                    630: 
                    631: START_TEST(test_utils_memrchr)
                    632: {
                    633:        void *ret;
                    634: 
                    635:        ret = utils_memrchr(memrchr_data[_i].s, memrchr_data[_i].c, memrchr_data[_i].n);
                    636:        if (memrchr_data[_i].offset >= 0)
                    637:        {
                    638:                ck_assert(ret == memrchr_data[_i].s + memrchr_data[_i].offset);
                    639:        }
                    640:        else
                    641:        {
                    642:                ck_assert(ret == NULL);
                    643:        }
                    644: }
                    645: END_TEST
                    646: 
                    647: /*******************************************************************************
                    648:  * translate
                    649:  */
                    650: 
                    651: static struct {
                    652:        char *in;
                    653:        char *from;
                    654:        char *to;
                    655:        char *out;
                    656: } translate_data[] = {
                    657:        {NULL, "", "", NULL},
                    658:        {"abc", "", "", "abc"},
                    659:        {"abc", "", "x", "abc"},
                    660:        {"abc", "x", "", "abc"},
                    661:        {"abc", "abc", "xyz", "xyz"},
                    662:        {"aabbcc", "abc", "xyz", "xxyyzz"},
                    663:        {"abbaccb", "abc", "xyz", "xyyxzzy"},
                    664:        {"abxyzc", "abc", "xyz", "xyxyzz"},
                    665:        {"abcdef", "abc", "xyz", "xyzdef"},
                    666:        {"aaa", "abc", "xyz", "xxx"},
                    667:        {"abc", "aaa", "xyz", "xbc"},
                    668:        {"abc", "abc", "xxx", "xxx"},
                    669: };
                    670: 
                    671: START_TEST(test_translate)
                    672: {
                    673:        char *str, *ret;
                    674: 
                    675:        str = strdupnull(translate_data[_i].in);
                    676:        ret = translate(str, translate_data[_i].from, translate_data[_i].to);
                    677:        ck_assert(ret == str);
                    678:        if (ret != translate_data[_i].out)
                    679:        {
                    680:                ck_assert_str_eq(str, translate_data[_i].out);
                    681:        }
                    682:        free(str);
                    683: }
                    684: END_TEST
                    685: 
                    686: /*******************************************************************************
                    687:  * strreplace
                    688:  */
                    689: 
                    690: static struct {
                    691:        char *in;
                    692:        char *out;
                    693:        char *search;
                    694:        char *replace;
                    695:        bool allocated;
                    696: } strreplace_data[] = {
                    697:        /* invalid arguments */
                    698:        {NULL, NULL, NULL, NULL, FALSE},
                    699:        {"", "", NULL, NULL, FALSE},
                    700:        {"", "", "", NULL, FALSE},
                    701:        {"", "", NULL, "", FALSE},
                    702:        {"", "", "", "", FALSE},
                    703:        {"", "", "", "asdf", FALSE},
                    704:        {"", "", "asdf", "", FALSE},
                    705:        {"asdf", "asdf", NULL, NULL, FALSE},
                    706:        {"asdf", "asdf", "", NULL, FALSE},
                    707:        {"asdf", "asdf", NULL, "", FALSE},
                    708:        {"asdf", "asdf", "", "", FALSE},
                    709:        {"asdf", "asdf", "", "asdf", FALSE},
                    710:        {"asdf", "asdf", "asdf", NULL, FALSE},
                    711:        {"qwer", "qwer", "", "asdf", FALSE},
                    712:        /* replacement shorter */
                    713:        {"asdf", "", "asdf", "", TRUE},
                    714:        {"asdfasdf", "", "asdf", "", TRUE},
                    715:        {"asasdfdf", "asdf", "asdf", "", TRUE},
                    716:        {"asdf", "df", "as", "", TRUE},
                    717:        {"asdf", "as", "df", "", TRUE},
                    718:        {"qwer", "qwer", "asdf", "", FALSE},
                    719:        /* replacement same length */
                    720:        {"a", "b", "a", "b", TRUE},
                    721:        {"aaa", "bbb", "a", "b", TRUE},
                    722:        {"aaa", "bbb", "aaa", "bbb", TRUE},
                    723:        {"asdf", "asdf", "asdf", "asdf", TRUE},
                    724:        {"qwer", "qwer", "asdf", "asdf", FALSE},
                    725:        /* replacement longer */
                    726:        {"asdf", "asdf", "", "asdf", FALSE},
                    727:        {"asdf", "asdfasdf", "asdf", "asdfasdf", TRUE},
                    728:        {"asdf", "asdfsdf", "a", "asdf", TRUE},
                    729:        {"asdf", "asdasdf", "f", "asdf", TRUE},
                    730:        {"aaa", "asdfasdfasdf", "a", "asdf", TRUE},
                    731:        {"qwer", "qwer", "asdf", "asdfasdf", FALSE},
                    732:        /* real examples */
                    733:        {"http://x.org/no/spaces", "http://x.org/no/spaces", " ", "%20", FALSE},
                    734:        {"http://x.org/end ", "http://x.org/end%20", " ", "%20", TRUE},
                    735:        {" http://x.org/start", "%20http://x.org/start", " ", "%20", TRUE},
                    736:        {" http://x.org/both ", "%20http://x.org/both%20", " ", "%20", TRUE},
                    737:        {"http://x.org/ /slash", "http://x.org/%20/slash", " ", "%20", TRUE},
                    738:        {"http://x.org/   /three", "http://x.org/%20%20%20/three", " ", "%20", TRUE},
                    739:        {"http://x.org/      ", "http://x.org/%20%20%20%20%20%20", " ", "%20", TRUE},
                    740:        {"http://x.org/%20/encoded", "http://x.org/%20/encoded", " ", "%20", FALSE},
                    741: };
                    742: 
                    743: START_TEST(test_strreplace)
                    744: {
                    745:        char *ret;
                    746: 
                    747:        ret = strreplace(strreplace_data[_i].in, strreplace_data[_i].search,
                    748:                                         strreplace_data[_i].replace);
                    749:        if (ret && strreplace_data[_i].out)
                    750:        {
                    751:                ck_assert_str_eq(ret, strreplace_data[_i].out);
                    752:        }
                    753:        else
                    754:        {
                    755:                ck_assert(ret == strreplace_data[_i].out);
                    756:        }
                    757:        if (strreplace_data[_i].allocated)
                    758:        {
                    759:                ck_assert(ret != strreplace_data[_i].in);
                    760:                free(ret);
                    761:        }
                    762:        else
                    763:        {
                    764:                ck_assert(ret == strreplace_data[_i].in);
                    765:        }
                    766: }
                    767: END_TEST
                    768: 
                    769: /*******************************************************************************
                    770:  * path_dirname/basename/absolute
                    771:  */
                    772: 
                    773: static struct {
                    774:        char *path;
                    775:        char *dir;
                    776:        char *base;
                    777:        bool absolute;
                    778: } path_data[] = {
                    779:        {NULL, ".", ".", FALSE},
                    780:        {"", ".", ".", FALSE},
                    781:        {".", ".", ".", FALSE},
                    782:        {"..", ".", "..", FALSE},
                    783: #ifdef WIN32
                    784:        {"C:\\", "C:", "C:", TRUE},
                    785:        {"X:\\\\", "X:", "X:", TRUE},
                    786:        {"foo", ".", "foo", FALSE},
                    787:        {"f\\", ".", "f", FALSE},
                    788:        {"foo\\", ".", "foo", FALSE},
                    789:        {"foo\\\\", ".", "foo", FALSE},
                    790:        {"d:\\f", "d:", "f", TRUE},
                    791:        {"C:\\f\\", "C:", "f", TRUE},
                    792:        {"C:\\foo", "C:", "foo", TRUE},
                    793:        {"C:\\foo\\", "C:", "foo", TRUE},
                    794:        {"foo\\bar", "foo", "bar", FALSE},
                    795:        {"foo\\\\bar", "foo", "bar", FALSE},
                    796:        {"C:\\foo\\bar", "C:\\foo", "bar", TRUE},
                    797:        {"C:\\foo\\bar\\", "C:\\foo", "bar", TRUE},
                    798:        {"C:\\foo\\bar\\baz", "C:\\foo\\bar", "baz", TRUE},
                    799:        {"\\foo\\bar", "\\foo", "bar", FALSE},
                    800:        {"\\\\foo\\bar", "\\\\foo", "bar", TRUE},
                    801: #else /* !WIN32 */
                    802:        {"/", "/", "/", TRUE},
                    803:        {"//", "/", "/", TRUE},
                    804:        {"foo", ".", "foo", FALSE},
                    805:        {"f/", ".", "f", FALSE},
                    806:        {"foo/", ".", "foo", FALSE},
                    807:        {"foo//", ".", "foo", FALSE},
                    808:        {"/f", "/", "f", TRUE},
                    809:        {"/f/", "/", "f", TRUE},
                    810:        {"/foo", "/", "foo", TRUE},
                    811:        {"/foo/", "/", "foo", TRUE},
                    812:        {"//foo/", "/", "foo", TRUE},
                    813:        {"foo/bar", "foo", "bar", FALSE},
                    814:        {"foo//bar", "foo", "bar", FALSE},
                    815:        {"/foo/bar", "/foo", "bar", TRUE},
                    816:        {"/foo/bar/", "/foo", "bar", TRUE},
                    817:        {"/foo/bar/baz", "/foo/bar", "baz", TRUE},
                    818: #endif
                    819: };
                    820: 
                    821: START_TEST(test_path_dirname)
                    822: {
                    823:        char *dir;
                    824: 
                    825:        dir = path_dirname(path_data[_i].path);
                    826:        ck_assert_str_eq(path_data[_i].dir, dir);
                    827:        free(dir);
                    828: }
                    829: END_TEST
                    830: 
                    831: START_TEST(test_path_basename)
                    832: {
                    833:        char *base;
                    834: 
                    835:        base = path_basename(path_data[_i].path);
                    836:        ck_assert_str_eq(path_data[_i].base, base);
                    837:        free(base);
                    838: }
                    839: END_TEST
                    840: 
                    841: START_TEST(test_path_absolute)
                    842: {
                    843:        ck_assert(path_data[_i].absolute == path_absolute(path_data[_i].path));
                    844: }
                    845: END_TEST
                    846: 
                    847: /*******************************************************************************
                    848:  * time_printf_hook
                    849:  */
                    850: 
                    851: static struct {
                    852:        time_t in;
                    853:        bool utc;
                    854:        char *out;
                    855: } time_data[] = {
                    856:        {UNDEFINED_TIME, FALSE, "--- -- --:--:-- ----"},
                    857:        {UNDEFINED_TIME, TRUE , "--- -- --:--:-- UTC ----"},
                    858:        {1, FALSE, "Jan 01 01:00:01 1970"},
                    859:        {1, TRUE , "Jan 01 00:00:01 UTC 1970"},
                    860:        {1341150196, FALSE, "Jul 01 15:43:16 2012"},
                    861:        {1341150196, TRUE , "Jul 01 13:43:16 UTC 2012"},
                    862: };
                    863: 
                    864: START_TEST(test_time_printf_hook)
                    865: {
                    866:        char buf[32];
                    867:        int len;
                    868: 
                    869:        len = snprintf(buf, sizeof(buf), "%T", &time_data[_i].in, time_data[_i].utc);
                    870:        ck_assert(len >= 0 && len < sizeof(buf));
                    871:        ck_assert_str_eq(buf, time_data[_i].out);
                    872: }
                    873: END_TEST
                    874: 
                    875: /*******************************************************************************
                    876:  * time_delta_printf_hook
                    877:  */
                    878: 
                    879: static struct {
                    880:        time_t a;
                    881:        time_t b;
                    882:        char *out;
                    883: } time_delta_data[] = {
                    884:        {0, 0, "0 seconds"},
                    885:        {0, 1, "1 second"},
                    886:        {0, -1, "1 second"},
                    887:        {1, 0, "1 second"},
                    888:        {0, 2, "2 seconds"},
                    889:        {2, 0, "2 seconds"},
                    890:        {0, 60, "60 seconds"},
                    891:        {0, 120, "120 seconds"},
                    892:        {0, 121, "2 minutes"},
                    893:        {0, 3600, "60 minutes"},
                    894:        {0, 7200, "120 minutes"},
                    895:        {0, 7201, "2 hours"},
                    896:        {0, 86400, "24 hours"},
                    897:        {0, 172800, "48 hours"},
                    898:        {0, 172801, "2 days"},
                    899:        {172801, 86400, "24 hours"},
                    900: };
                    901: 
                    902: START_TEST(test_time_delta_printf_hook)
                    903: {
                    904:        char buf[16];
                    905:        int len;
                    906: 
                    907:        len = snprintf(buf, sizeof(buf), "%V", &time_delta_data[_i].a, &time_delta_data[_i].b);
                    908:        ck_assert(len >= 0 && len < sizeof(buf));
                    909:        ck_assert_str_eq(buf, time_delta_data[_i].out);
                    910: }
                    911: END_TEST
                    912: 
                    913: /*******************************************************************************
                    914:  * mark_from_string
                    915:  */
                    916: 
                    917: static struct {
                    918:        char *s;
                    919:        bool ok;
                    920:        mark_op_t ops;
                    921:        mark_t m;
                    922: } mark_data[] = {
                    923:        {NULL,                  FALSE,  MARK_OP_NONE, { 0 }},
                    924:        {"",                    TRUE,   MARK_OP_NONE, { 0, 0xffffffff }},
                    925:        {"/",                   TRUE,   MARK_OP_NONE, { 0, 0 }},
                    926:        {"42",                  TRUE,   MARK_OP_NONE, { 42, 0xffffffff }},
                    927:        {"0x42",                TRUE,   MARK_OP_NONE, { 0x42, 0xffffffff }},
                    928:        {"x",                   FALSE,  MARK_OP_NONE, { 0 }},
                    929:        {"42/",                 TRUE,   MARK_OP_NONE, { 0, 0 }},
                    930:        {"42/0",                TRUE,   MARK_OP_NONE, { 0, 0 }},
                    931:        {"42/x",                FALSE,  MARK_OP_NONE, { 0 }},
                    932:        {"42/42",               TRUE,   MARK_OP_NONE, { 42, 42 }},
                    933:        {"42/0xff",             TRUE,   MARK_OP_NONE, { 42, 0xff }},
                    934:        {"0x42/0xff",   TRUE,   MARK_OP_NONE, { 0x42, 0xff }},
                    935:        {"/0xff",               TRUE,   MARK_OP_NONE, { 0, 0xff }},
                    936:        {"/x",                  FALSE,  MARK_OP_NONE, { 0 }},
                    937:        {"x/x",                 FALSE,  MARK_OP_NONE, { 0 }},
                    938:        {"0xfffffff0/0x0000ffff",       TRUE,   MARK_OP_UNIQUE,
                    939:                { 0x0000fff0, 0x0000ffff }},
                    940:        {"%unique",                                     TRUE,   MARK_OP_UNIQUE,
                    941:                { MARK_UNIQUE, 0xffffffff }},
                    942:        {"%unique/",                            TRUE,   MARK_OP_UNIQUE,
                    943:                { MARK_UNIQUE, 0 }},
                    944:        {"%unique",                                     FALSE,  MARK_OP_NONE,
                    945:                { 0, 0 }},
                    946:        {"%unique/0x0000ffff",          TRUE,   MARK_OP_UNIQUE,
                    947:                { MARK_UNIQUE, 0x0000ffff }},
                    948:        {"%unique/0xffffffff",          TRUE,   MARK_OP_UNIQUE,
                    949:                { MARK_UNIQUE, 0xffffffff }},
                    950:        {"%unique0xffffffffff",         FALSE,  MARK_OP_UNIQUE,
                    951:                { 0, 0 }},
                    952:        {"0xffffffff/0x0000ffff",       TRUE,   MARK_OP_UNIQUE,
                    953:                { MARK_UNIQUE, 0x0000ffff }},
                    954:        {"0xffffffff/0xffffffff",       TRUE,   MARK_OP_UNIQUE,
                    955:                { MARK_UNIQUE, 0xffffffff }},
                    956:        {"%unique-dir",                         TRUE,   MARK_OP_UNIQUE,
                    957:                { MARK_UNIQUE_DIR, 0xffffffff }},
                    958:        {"%unique-dir/",                        TRUE,   MARK_OP_UNIQUE,
                    959:                { MARK_UNIQUE_DIR, 0 }},
                    960:        {"%unique-dir",                         FALSE,  MARK_OP_NONE,
                    961:                { 0, 0 }},
                    962:        {"%unique-dir/0x0000ffff",      TRUE,   MARK_OP_UNIQUE,
                    963:                { MARK_UNIQUE_DIR, 0x0000ffff }},
                    964:        {"%unique-dir/0xffffffff",      TRUE,   MARK_OP_UNIQUE,
                    965:                { MARK_UNIQUE_DIR, 0xffffffff }},
                    966:        {"%unique-dir0xffffffff",       FALSE,  MARK_OP_UNIQUE,
                    967:                { 0, 0 }},
                    968:        {"0xfffffffe/0x0000ffff",       TRUE,   MARK_OP_UNIQUE,
                    969:                { MARK_UNIQUE_DIR, 0x0000ffff }},
                    970:        {"0xfffffffe/0xffffffff",       TRUE,   MARK_OP_UNIQUE,
                    971:                { MARK_UNIQUE_DIR, 0xffffffff }},
                    972:        {"%unique-/0xffffffff",         FALSE,  MARK_OP_UNIQUE,
                    973:                { 0, 0 }},
                    974:        {"%unique-foo/0xffffffff",      FALSE,  MARK_OP_UNIQUE,
                    975:                { 0, 0 }},
                    976:        {"%same",                                       TRUE,   MARK_OP_SAME,
                    977:                { MARK_SAME, 0xffffffff }},
                    978:        {"%same/0x0000ffff",            TRUE,   MARK_OP_SAME,
                    979:                { MARK_SAME, 0x0000ffff }},
                    980:        {"%%same",                                      FALSE,  MARK_OP_NONE,
                    981:                { 0, 0 }},
                    982: };
                    983: 
                    984: START_TEST(test_mark_from_string)
                    985: {
                    986:        mark_t mark;
                    987: 
                    988:        if (mark_from_string(mark_data[_i].s, mark_data[_i].ops, &mark))
                    989:        {
                    990:                ck_assert_int_eq(mark.value, mark_data[_i].m.value);
                    991:                ck_assert_int_eq(mark.mask, mark_data[_i].m.mask);
                    992:        }
                    993:        else
                    994:        {
                    995:                ck_assert(!mark_data[_i].ok);
                    996:        }
                    997: }
                    998: END_TEST
                    999: 
                   1000: /*******************************************************************************
                   1001:  * if_id_from_string
                   1002:  */
                   1003: 
                   1004: static struct {
                   1005:        char *s;
                   1006:        bool ok;
                   1007:        uint32_t i;
                   1008: } if_id_data[] = {
                   1009:        {NULL,                  FALSE,  0 },
                   1010:        {"",                    TRUE,   0 },
                   1011:        {"/",                   FALSE,  0 },
                   1012:        {"42",                  TRUE,   42 },
                   1013:        {"0x42",                TRUE,   0x42 },
                   1014:        {"x",                   FALSE,  0 },
                   1015:        {"42/",                 FALSE,  0 },
                   1016:        {"42/0",                FALSE,  0 },
                   1017:        {"%unique",             TRUE,   IF_ID_UNIQUE },
                   1018:        {"%unique/",    FALSE,  0},
                   1019:        {"%unique0xffffffffff", FALSE,  0},
                   1020:        {"0xffffffff",  TRUE,   IF_ID_UNIQUE},
                   1021:        {"%unique-dir", TRUE,   IF_ID_UNIQUE_DIR},
                   1022:        {"%unique-dir/",FALSE,  0},
                   1023:        {"0xfffffffe",  TRUE,   IF_ID_UNIQUE_DIR},
                   1024:        {"%unique-",    FALSE,  0},
                   1025:        {"%unique-foo", FALSE,  0},
                   1026: };
                   1027: 
                   1028: START_TEST(test_if_id_from_string)
                   1029: {
                   1030:        uint32_t if_id;
                   1031: 
                   1032:        if (if_id_from_string(if_id_data[_i].s, &if_id))
                   1033:        {
                   1034:                ck_assert_int_eq(if_id, if_id_data[_i].i);
                   1035:        }
                   1036:        else
                   1037:        {
                   1038:                ck_assert(!if_id_data[_i].ok);
                   1039:        }
                   1040: }
                   1041: END_TEST
                   1042: 
                   1043: /*******************************************************************************
                   1044:  * allocate_unique_if_ids
                   1045:  */
                   1046: 
                   1047: static struct {
                   1048:        uint32_t in;
                   1049:        uint32_t out;
                   1050:        uint32_t exp_in;
                   1051:        uint32_t exp_out;
                   1052: } unique_if_id_data[] = {
                   1053:        {0,     0, 0, 0 },
                   1054:        {42, 42, 42, 42 },
                   1055:        {42, 1337, 42, 1337 },
                   1056:        /* each call increases the internal counter by 1 or 2*/
                   1057:        {IF_ID_UNIQUE, 42, 1, 42 },
                   1058:        {42, IF_ID_UNIQUE, 42, 2 },
                   1059:        {IF_ID_UNIQUE_DIR, 42, 3, 42 },
                   1060:        {42, IF_ID_UNIQUE_DIR, 42, 4 },
                   1061:        {IF_ID_UNIQUE, IF_ID_UNIQUE, 5, 5 },
                   1062:        {IF_ID_UNIQUE_DIR, IF_ID_UNIQUE, 6, 7 },
                   1063:        {IF_ID_UNIQUE, IF_ID_UNIQUE_DIR, 8, 9 },
                   1064:        {IF_ID_UNIQUE_DIR, IF_ID_UNIQUE_DIR, 10, 11 },
                   1065: };
                   1066: 
                   1067: START_TEST(test_allocate_unique_if_ids)
                   1068: {
                   1069:        uint32_t if_id_in = unique_if_id_data[_i].in,
                   1070:                         if_id_out = unique_if_id_data[_i].out;
                   1071: 
                   1072:        allocate_unique_if_ids(&if_id_in, &if_id_out);
                   1073:        ck_assert_int_eq(if_id_in, unique_if_id_data[_i].exp_in);
                   1074:        ck_assert_int_eq(if_id_out, unique_if_id_data[_i].exp_out);
                   1075: }
                   1076: END_TEST
                   1077: 
                   1078: /*******************************************************************************
                   1079:  * signature_schemes_for_key
                   1080:  */
                   1081: 
                   1082: static struct {
                   1083:        key_type_t type;
                   1084:        int size;
                   1085:        signature_scheme_t expected[7];
                   1086: } scheme_data[] = {
                   1087:        {KEY_RSA,   1024, { SIGN_RSA_EMSA_PSS, SIGN_RSA_EMSA_PSS,
                   1088:                                                SIGN_RSA_EMSA_PSS, SIGN_RSA_EMSA_PKCS1_SHA2_256,
                   1089:                                                SIGN_RSA_EMSA_PKCS1_SHA2_384, SIGN_RSA_EMSA_PKCS1_SHA2_512,
                   1090:                                                SIGN_UNKNOWN }},
                   1091:        {KEY_RSA,   2048, { SIGN_RSA_EMSA_PSS, SIGN_RSA_EMSA_PSS,
                   1092:                                                SIGN_RSA_EMSA_PSS, SIGN_RSA_EMSA_PKCS1_SHA2_256,
                   1093:                                                SIGN_RSA_EMSA_PKCS1_SHA2_384, SIGN_RSA_EMSA_PKCS1_SHA2_512,
                   1094:                                                SIGN_UNKNOWN }},
                   1095:        {KEY_RSA,   4096, { SIGN_RSA_EMSA_PSS, SIGN_RSA_EMSA_PSS,
                   1096:                                                SIGN_RSA_EMSA_PKCS1_SHA2_384, SIGN_RSA_EMSA_PKCS1_SHA2_512,
                   1097:                                                SIGN_UNKNOWN }},
                   1098:        {KEY_RSA,   8192, { SIGN_RSA_EMSA_PSS, SIGN_RSA_EMSA_PKCS1_SHA2_512, SIGN_UNKNOWN }},
                   1099:        {KEY_ECDSA,  256, { SIGN_ECDSA_WITH_SHA256_DER, SIGN_ECDSA_WITH_SHA384_DER,
                   1100:                                                SIGN_ECDSA_WITH_SHA512_DER, SIGN_UNKNOWN }},
                   1101:        {KEY_ECDSA,  384, { SIGN_ECDSA_WITH_SHA384_DER, SIGN_ECDSA_WITH_SHA512_DER,
                   1102:                                                SIGN_UNKNOWN }},
                   1103:        {KEY_ECDSA,  512, { SIGN_ECDSA_WITH_SHA512_DER, SIGN_UNKNOWN }},
                   1104:        {KEY_BLISS,  128, { SIGN_BLISS_WITH_SHA2_256, SIGN_BLISS_WITH_SHA2_384,
                   1105:                                                SIGN_BLISS_WITH_SHA2_512, SIGN_UNKNOWN }},
                   1106:        {KEY_BLISS,  192, { SIGN_BLISS_WITH_SHA2_384, SIGN_BLISS_WITH_SHA2_512,
                   1107:                                                SIGN_UNKNOWN }},
                   1108:        {KEY_BLISS,  256, { SIGN_BLISS_WITH_SHA2_512, SIGN_UNKNOWN }},
                   1109: };
                   1110: 
                   1111: START_TEST(test_signature_schemes_for_key)
                   1112: {
                   1113:        enumerator_t  *enumerator;
                   1114:        signature_params_t *params;
                   1115:        int i;
                   1116: 
                   1117:        enumerator = signature_schemes_for_key(scheme_data[_i].type, scheme_data[_i].size);
                   1118:        for (i = 0; scheme_data[_i].expected[i] != SIGN_UNKNOWN; i++)
                   1119:        {
                   1120:                ck_assert(enumerator->enumerate(enumerator, &params));
                   1121:                ck_assert_int_eq(scheme_data[_i].expected[i], params->scheme);
                   1122:        }
                   1123:        ck_assert(!enumerator->enumerate(enumerator, &params));
                   1124:        enumerator->destroy(enumerator);
                   1125: }
                   1126: END_TEST
                   1127: 
                   1128: Suite *utils_suite_create()
                   1129: {
                   1130:        Suite *s;
                   1131:        TCase *tc;
                   1132: 
                   1133:        /* force a timezone to match non-UTC conversions */
                   1134: #ifdef WIN32
                   1135:        _putenv("TZ=GST-1GDT");
                   1136: #else
                   1137:        setenv("TZ", "Europe/Zurich", 1);
                   1138: #endif
                   1139:        tzset();
                   1140: 
                   1141:        s = suite_create("utils");
                   1142: 
                   1143:        tc = tcase_create("objects");
                   1144:        tcase_add_test(tc, test_objects);
                   1145:        suite_add_tcase(s, tc);
                   1146: 
                   1147:        tc = tcase_create("return functions");
                   1148:        tcase_add_test(tc, test_return_functions);
                   1149:        suite_add_tcase(s, tc);
                   1150: 
                   1151:        tc = tcase_create("timeval_add_ms");
                   1152:        tcase_add_test(tc, test_timeval_add_ms);
                   1153:        suite_add_tcase(s, tc);
                   1154: 
                   1155:        tc = tcase_create("timespan_from_string");
                   1156:        tcase_add_loop_test(tc, test_timespan_from_string, 0, countof(ts_data));
                   1157:        suite_add_tcase(s, tc);
                   1158: 
                   1159:        tc = tcase_create("htoun,untoh");
                   1160:        tcase_add_test(tc, test_htoun);
                   1161:        tcase_add_test(tc, test_untoh);
                   1162:        suite_add_tcase(s, tc);
                   1163: 
                   1164:        tc = tcase_create("round");
                   1165:        tcase_add_test(tc, test_round);
                   1166:        suite_add_tcase(s, tc);
                   1167: 
                   1168:        tc = tcase_create("string helper");
                   1169:        tcase_add_loop_test(tc, test_streq, 0, countof(streq_data));
                   1170:        tcase_add_loop_test(tc, test_strneq, 0, countof(strneq_data));
                   1171:        tcase_add_loop_test(tc, test_strpfx, 0, countof(strpfx_data));
                   1172:        suite_add_tcase(s, tc);
                   1173: 
                   1174:        tc = tcase_create("malloc_align");
                   1175:        tcase_add_test(tc, test_malloc_align);
                   1176:        suite_add_tcase(s, tc);
                   1177: 
                   1178:        tc = tcase_create("memxor");
                   1179:        tcase_add_test(tc, test_memxor);
                   1180:        tcase_add_test(tc, test_memxor_aligned);
                   1181:        suite_add_tcase(s, tc);
                   1182: 
                   1183:        tc = tcase_create("memeq");
                   1184:        tcase_add_loop_test(tc, test_memeq, 0, countof(memeq_data));
                   1185:        tcase_add_loop_test(tc, test_memeq_const, 0, countof(memeq_data));
                   1186:        suite_add_tcase(s, tc);
                   1187: 
                   1188:        tc = tcase_create("memstr");
                   1189:        tcase_add_loop_test(tc, test_memstr, 0, countof(memstr_data));
                   1190:        suite_add_tcase(s, tc);
                   1191: 
                   1192:        tc = tcase_create("memwipe");
                   1193:        tcase_add_test(tc, test_memwipe_null);
                   1194:        tcase_add_test(tc, test_memwipe_stack);
                   1195:        tcase_add_test(tc, test_memwipe_heap);
                   1196:        suite_add_tcase(s, tc);
                   1197: 
                   1198:        tc = tcase_create("utils_memrchr");
                   1199:        tcase_add_loop_test(tc, test_utils_memrchr, 0, countof(memrchr_data));
                   1200:        suite_add_tcase(s, tc);
                   1201: 
                   1202:        tc = tcase_create("translate");
                   1203:        tcase_add_loop_test(tc, test_translate, 0, countof(translate_data));
                   1204:        suite_add_tcase(s, tc);
                   1205: 
                   1206:        tc = tcase_create("strreplace");
                   1207:        tcase_add_loop_test(tc, test_strreplace, 0, countof(strreplace_data));
                   1208:        suite_add_tcase(s, tc);
                   1209: 
                   1210:        tc = tcase_create("path_dirname");
                   1211:        tcase_add_loop_test(tc, test_path_dirname, 0, countof(path_data));
                   1212:        suite_add_tcase(s, tc);
                   1213: 
                   1214:        tc = tcase_create("path_basename");
                   1215:        tcase_add_loop_test(tc, test_path_basename, 0, countof(path_data));
                   1216:        suite_add_tcase(s, tc);
                   1217: 
                   1218:        tc = tcase_create("path_absolute");
                   1219:        tcase_add_loop_test(tc, test_path_absolute, 0, countof(path_data));
                   1220:        suite_add_tcase(s, tc);
                   1221: 
                   1222:        tc = tcase_create("printf_hooks");
                   1223:        tcase_add_loop_test(tc, test_time_printf_hook, 0, countof(time_data));
                   1224:        tcase_add_loop_test(tc, test_time_delta_printf_hook, 0, countof(time_delta_data));
                   1225:        suite_add_tcase(s, tc);
                   1226: 
                   1227:        tc = tcase_create("mark_from_string");
                   1228:        tcase_add_loop_test(tc, test_mark_from_string, 0, countof(mark_data));
                   1229:        suite_add_tcase(s, tc);
                   1230: 
                   1231:        tc = tcase_create("if_id_from_string");
                   1232:        tcase_add_loop_test(tc, test_if_id_from_string, 0, countof(if_id_data));
                   1233:        suite_add_tcase(s, tc);
                   1234: 
                   1235:        tc = tcase_create("allocate_unique_if_ids");
                   1236:        tcase_add_loop_test(tc, test_allocate_unique_if_ids, 0, countof(unique_if_id_data));
                   1237:        suite_add_tcase(s, tc);
                   1238: 
                   1239:        tc = tcase_create("signature_schemes_for_key");
                   1240:        tcase_add_loop_test(tc, test_signature_schemes_for_key, 0, countof(scheme_data));
                   1241:        suite_add_tcase(s, tc);
                   1242: 
                   1243:        return s;
                   1244: }

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>