Annotation of embedaddon/strongswan/src/libimcv/suites/test_imcv_seg.c, revision 1.1.1.2

1.1       misho       1: /*
                      2:  * Copyright (C) 2014 Andreas Steffen
                      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 <imcv.h>
                     19: #include <pa_tnc/pa_tnc_attr.h>
                     20: #include <seg/seg_env.h>
                     21: #include <seg/seg_contract.h>
                     22: #include <seg/seg_contract_manager.h>
                     23: #include <ietf/ietf_attr_pa_tnc_error.h>
                     24: #include <ita/ita_attr.h>
                     25: #include <ita/ita_attr_command.h>
                     26: #include <ita/ita_attr_dummy.h>
                     27: #include <tcg/seg/tcg_seg_attr_seg_env.h>
                     28: 
                     29: #include <tncif_pa_subtypes.h>
                     30: 
                     31: static struct {
                     32:        uint32_t max_seg_size, next_segs, last_seg_size;
                     33: } seg_env_tests[] = {
                     34:        {  0, 0,  0 },
                     35:        { 11, 0,  0 },
                     36:        { 12, 3, 12 },
                     37:        { 13, 3,  9 },
                     38:        { 15, 3,  3 },
                     39:        { 16, 2, 16 },
                     40:        { 17, 2, 14 },
                     41:        { 23, 2,  2 },
                     42:        { 24, 1, 24 },
                     43:        { 25, 1, 23 },
                     44:        { 47, 1,  1 },
                     45:        { 48, 0,  0 },
                     46: };
                     47: 
                     48: static char command[] = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
                     49: static uint32_t id = 0x123456;
                     50: 
                     51: START_TEST(test_imcv_seg_env)
                     52: {
                     53:        pa_tnc_attr_t *attr, *attr1, *base_attr, *base_attr1, *error;
                     54:        tcg_seg_attr_seg_env_t *seg_env_attr;
                     55:        ita_attr_command_t *ita_attr;
1.1.1.2 ! misho      56:        seg_env_t *seg_env, *seg_env1 = NULL;
1.1       misho      57:        pen_type_t type;
                     58:        uint32_t base_attr_id, max_seg_size, last_seg_size, seg_size, offset;
                     59:        uint8_t flags;
                     60:        bool last, last_seg;
                     61:        chunk_t value, segment, seg;
                     62:        int n;
                     63: 
                     64:        libimcv_init(FALSE);
                     65:        max_seg_size  = seg_env_tests[_i].max_seg_size;
                     66:        last_seg_size = seg_env_tests[_i].last_seg_size;
                     67: 
                     68:        base_attr = ita_attr_command_create(command);
                     69:        base_attr->build(base_attr);
                     70:        seg_env = seg_env_create(id, base_attr, max_seg_size);
                     71: 
                     72:        if (seg_env_tests[_i].next_segs == 0)
                     73:        {
                     74:                ck_assert(seg_env == NULL);
                     75:        }
                     76:        else
                     77:        {
                     78:                ck_assert(seg_env->get_base_attr_id(seg_env) == id);
                     79:                base_attr1 = seg_env->get_base_attr(seg_env);
                     80:                ck_assert(base_attr == base_attr1);
                     81:                base_attr1->destroy(base_attr1);
                     82: 
                     83:                for (n = 0; n <= seg_env_tests[_i].next_segs; n++)
                     84:                {
                     85:                        last_seg = (n == seg_env_tests[_i].next_segs);
                     86:                        seg_size = (last_seg) ? last_seg_size : max_seg_size;
                     87:                        if (n == 0)
                     88:                        {
                     89:                                /* create first segment */
                     90:                                attr = seg_env->first_segment(seg_env, 0);
                     91: 
                     92:                                seg_env_attr = (tcg_seg_attr_seg_env_t*)attr;
                     93:                                segment = seg_env_attr->get_segment(seg_env_attr, &flags);
                     94:                                if (max_seg_size > 12)
                     95:                                {
                     96:                                        seg = chunk_create(command, seg_size - 12);
                     97:                                        ck_assert(chunk_equals(seg, chunk_skip(segment, 12)));
                     98:                                }
                     99:                                ck_assert(flags == (SEG_ENV_FLAG_MORE | SEG_ENV_FLAG_START));
                    100:                        }
                    101:                        else
                    102:                        {
                    103:                                /* create next segments */
                    104:                                attr = seg_env->next_segment(seg_env, &last);
                    105:                                ck_assert(last == last_seg);
                    106: 
                    107:                                seg_env_attr = (tcg_seg_attr_seg_env_t*)attr;
                    108:                                segment = seg_env_attr->get_segment(seg_env_attr, &flags);
                    109:                                seg = chunk_create(command + n * max_seg_size - 12, seg_size);
                    110:                                ck_assert(chunk_equals(seg, segment));
                    111:                                ck_assert(flags == (last_seg ? SEG_ENV_FLAG_NONE :
                    112:                                                                                           SEG_ENV_FLAG_MORE));
                    113:                        }
                    114: 
                    115:                        /* check built segment envelope attribute */
                    116:                        value = attr->get_value(attr);
                    117:                        ck_assert(value.len == 4 + seg_size);
                    118:                        ck_assert(segment.len == seg_size);
                    119:                        ck_assert(seg_env_attr->get_base_attr_id(seg_env_attr) == id);
                    120: 
                    121:                        /* create parse segment envelope attribute from data */
                    122:                        attr1 = tcg_seg_attr_seg_env_create_from_data(value.len, value);
                    123:                        ck_assert(attr1->process(attr1, &offset) == SUCCESS);
                    124:                        attr->destroy(attr);
                    125: 
                    126:                        seg_env_attr = (tcg_seg_attr_seg_env_t*)attr1;
                    127:                        segment = seg_env_attr->get_segment(seg_env_attr, &flags);
                    128:                        base_attr_id = seg_env_attr->get_base_attr_id(seg_env_attr);
                    129:                        ck_assert(base_attr_id == id);
                    130: 
                    131:                        /* create and update seg_env object on the receiving side */
                    132:                        if (n == 0)
                    133:                        {
                    134:                                ck_assert(flags == (SEG_ENV_FLAG_MORE | SEG_ENV_FLAG_START));
                    135:                                seg_env1 = seg_env_create_from_data(base_attr_id, segment,
                    136:                                                                                                        max_seg_size, &error);
                    137:                        }
                    138:                        else
                    139:                        {
                    140:                                ck_assert(flags == (last_seg ? SEG_ENV_FLAG_NONE :
                    141:                                                                                           SEG_ENV_FLAG_MORE));
                    142:                                seg_env1->add_segment(seg_env1, segment, &error);
                    143:                        }
                    144:                        attr1->destroy(attr1);
                    145:                }
                    146: 
                    147:                /* check reconstructed base attribute */
1.1.1.2 ! misho     148:                ck_assert(seg_env1);
1.1       misho     149:                base_attr1 = seg_env1->get_base_attr(seg_env1);
                    150:                ck_assert(base_attr1);
                    151:                type = base_attr1->get_type(base_attr1);
                    152:                ck_assert(type.vendor_id == PEN_ITA);
                    153:                ck_assert(type.type == ITA_ATTR_COMMAND);
                    154:                ita_attr = (ita_attr_command_t*)base_attr1;
                    155:                ck_assert(streq(ita_attr->get_command(ita_attr), command));
                    156: 
                    157:                seg_env->destroy(seg_env);
                    158:                seg_env1->destroy(seg_env1);
                    159:                base_attr1->destroy(base_attr1);
                    160:        }
                    161:        libimcv_deinit();
                    162: }
                    163: END_TEST
                    164: 
                    165: START_TEST(test_imcv_seg_env_special)
                    166: {
                    167:        pa_tnc_attr_t *attr, *attr1, *base_attr;
                    168:        tcg_seg_attr_seg_env_t *seg_env_attr;
                    169:        pen_type_t type;
                    170:        seg_env_t *seg_env;
                    171:        chunk_t segment, value;
                    172:        uint32_t max_attr_len = 60;
                    173:        uint32_t max_seg_size = 47;
                    174:        uint32_t last_seg_size = 4;
                    175:        uint32_t offset = 12;
                    176: 
                    177:        base_attr = ita_attr_command_create(command);
                    178:        base_attr->build(base_attr);
                    179: 
                    180:        /* set noskip flag in base attribute */
                    181:        base_attr->set_noskip_flag(base_attr, TRUE);
                    182: 
                    183:        seg_env = seg_env_create(id, base_attr, max_seg_size);
                    184:        attr = seg_env->first_segment(seg_env, max_attr_len);
                    185:        attr->destroy(attr);
                    186: 
                    187:        /* don't return last segment indicator */
                    188:        attr = seg_env->next_segment(seg_env, NULL);
                    189: 
                    190:        /* build attribute */
                    191:        attr->build(attr);
                    192: 
                    193:        /* don't return flags */
                    194:        seg_env_attr = (tcg_seg_attr_seg_env_t*)attr;
                    195:        segment = seg_env_attr->get_segment(seg_env_attr, NULL);
                    196:        ck_assert(segment.len == last_seg_size);
                    197: 
                    198:        /* get segment envelope attribute reference and destroy it */
                    199:        attr1 = attr->get_ref(attr);
                    200:        attr1->destroy(attr1);
                    201: 
                    202:        /* check some standard methods */
                    203:        type = attr->get_type(attr);
                    204:        ck_assert(type.vendor_id == PEN_TCG);
                    205:        ck_assert(type.type == TCG_SEG_ATTR_SEG_ENV);
                    206:        ck_assert(attr->get_noskip_flag(attr) == FALSE);
                    207:        attr->set_noskip_flag(attr, TRUE);
                    208:        ck_assert(attr->get_noskip_flag(attr) == TRUE);
                    209: 
                    210:        /* request next segment which does not exist */
                    211:        ck_assert(seg_env->next_segment(seg_env, NULL) == NULL);
                    212: 
                    213:        /* create and parse a too short segment envelope attribute */
                    214:        attr1 = tcg_seg_attr_seg_env_create_from_data(0, chunk_empty);
                    215:        ck_assert(attr1->process(attr1, &offset) == FAILED);
                    216:        ck_assert(offset == 0);
                    217:        attr1->destroy(attr1);
                    218: 
                    219:        /* create and parse correct segment envelope attribute */
                    220:        value = attr->get_value(attr);
                    221:        attr1 = tcg_seg_attr_seg_env_create_from_data(value.len, value);
                    222:        ck_assert(attr1->process(attr1, &offset) == SUCCESS);
                    223:        type = attr1->get_type(attr1);
                    224:        ck_assert(type.vendor_id == PEN_TCG);
                    225:        ck_assert(type.type == TCG_SEG_ATTR_SEG_ENV);
                    226:        attr1->destroy(attr1);
                    227: 
                    228:        /* cleanup */
                    229:        attr->destroy(attr);
                    230:        seg_env->destroy(seg_env);
                    231: }
                    232: END_TEST
                    233: 
                    234: static struct {
                    235:        pa_tnc_error_code_t error_code;
                    236:        chunk_t segment;
                    237: } env_invalid_tests[] = {
                    238:        { PA_ERROR_INVALID_PARAMETER, { NULL, 0 } },
                    239:        { PA_ERROR_INVALID_PARAMETER, chunk_from_chars(
                    240:                0x00, 0xff, 0xff, 0xf0, 0x01, 0x02, 0x03, 0x04, 0x00, 0x00, 0x00, 0x0a)
                    241:        },
                    242:        { PA_ERROR_INVALID_PARAMETER, chunk_from_chars(
                    243:                0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x0c)
                    244:        },
                    245:        { PA_ERROR_INVALID_PARAMETER, chunk_from_chars(
                    246:                0x00, 0x00, 0x90, 0x2a, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x0c)
                    247:        },
                    248:        { PA_ERROR_ATTR_TYPE_NOT_SUPPORTED, chunk_from_chars(
                    249:                0x80, 0x00, 0x90, 0x2a, 0xff, 0xff, 0xff, 0xfe, 0x00, 0x00, 0x00, 0x0c)
                    250:        },
                    251:        { PA_ERROR_RESERVED, chunk_from_chars(
                    252:                0x00, 0x00, 0x90, 0x2a, 0xff, 0xff, 0xff, 0xfe, 0x00, 0x00, 0x00, 0x0c)
                    253:        },
                    254:        { PA_ERROR_RESERVED, chunk_from_chars(
                    255:                0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x0c)
                    256:        },
                    257:        { PA_ERROR_INVALID_PARAMETER, chunk_from_chars(
                    258:                0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x0c)
                    259:        }
                    260: };
                    261: 
                    262: START_TEST(test_imcv_seg_env_invalid)
                    263: {
                    264:        seg_env_t *seg_env;
                    265:        pen_type_t error_code;
                    266:        pa_tnc_attr_t*error;
                    267:        ietf_attr_pa_tnc_error_t *error_attr;
                    268: 
                    269:        libimcv_init(FALSE);
                    270:        seg_env = seg_env_create_from_data(id, env_invalid_tests[_i].segment, 20,
                    271:                                                                           &error);
                    272:        ck_assert(seg_env == NULL);
                    273:        if (env_invalid_tests[_i].error_code == PA_ERROR_RESERVED)
                    274:        {
                    275:                ck_assert(error == NULL);
                    276:        }
                    277:        else
                    278:        {
                    279:                ck_assert(error);
                    280:                error->build(error);
                    281:                error_attr = (ietf_attr_pa_tnc_error_t*)error;
                    282:                error_code = error_attr->get_error_code(error_attr);
                    283:                ck_assert(error_code.vendor_id == PEN_IETF);
                    284:                ck_assert(error_code.type == env_invalid_tests[_i].error_code);
                    285:                error->destroy(error);
                    286:        }
                    287:        libimcv_deinit();
                    288: }
                    289: END_TEST
                    290: 
                    291: START_TEST(test_imcv_seg_contract)
                    292: {
                    293:        seg_contract_t *contract_i, *contract_r;
                    294:        tcg_seg_attr_seg_env_t *seg_env_attr;
                    295:        ita_attr_command_t *ita_attr;
                    296:        pa_tnc_attr_t *attr, *base_attr_i, *base_attr_r, *error;
                    297:        pen_type_t type, msg_type = { PEN_ITA, PA_SUBTYPE_ITA_TEST };
                    298:        uint32_t max_seg_size, max_attr_size = 1000, issuer_id = 1;
                    299:        uint32_t base_attr_id;
                    300:        bool more;
                    301: 
                    302:        libimcv_init(FALSE);
                    303:        max_seg_size  = seg_env_tests[_i].max_seg_size;
                    304:        base_attr_r = ita_attr_command_create(command);
                    305:        base_attr_r->build(base_attr_r);
                    306:        contract_i = seg_contract_create(msg_type, max_attr_size, max_seg_size,
                    307:                                                                         TRUE, issuer_id, FALSE);
                    308:        contract_r = seg_contract_create(msg_type, max_attr_size, max_seg_size,
                    309:                                                                         FALSE, issuer_id, TRUE);
                    310:        attr = contract_r->first_segment(contract_r,
                    311:                                                                         base_attr_r->get_ref(base_attr_r), 0);
                    312: 
                    313:        if (seg_env_tests[_i].next_segs == 0)
                    314:        {
                    315:                ck_assert(attr == NULL);
                    316:        }
                    317:        else
                    318:        {
                    319:                ck_assert(attr);
                    320:                seg_env_attr = (tcg_seg_attr_seg_env_t*)attr;
                    321:                base_attr_id = seg_env_attr->get_base_attr_id(seg_env_attr);
                    322:                ck_assert(base_attr_id == 1);
                    323:                base_attr_i = contract_i->add_segment(contract_i, attr, &error, &more);
                    324:                ck_assert(base_attr_i == NULL);
                    325:                attr->destroy(attr);
                    326:                ck_assert(more);
                    327:                while (more)
                    328:                {
                    329:                        attr = contract_r->next_segment(contract_r, base_attr_id);
                    330:                        ck_assert(attr);
                    331:                        seg_env_attr = (tcg_seg_attr_seg_env_t*)attr;
                    332:                        base_attr_id = seg_env_attr->get_base_attr_id(seg_env_attr);
                    333:                        ck_assert(base_attr_id == 1);
                    334:                        base_attr_i = contract_i->add_segment(contract_i, attr, &error,
                    335:                                                                                                  &more);
                    336:                        attr->destroy(attr);
                    337:                }
                    338:                ck_assert(base_attr_i);
                    339:                ck_assert(error == NULL);
                    340:                type = base_attr_i->get_type(base_attr_i);
                    341:                ck_assert(pen_type_equals(type, base_attr_r->get_type(base_attr_r)));
                    342:                ita_attr = (ita_attr_command_t*)base_attr_i;
                    343:                ck_assert(streq(ita_attr->get_command(ita_attr), command));
                    344:                base_attr_i->destroy(base_attr_i);
                    345:        }
                    346:        contract_i->destroy(contract_i);
                    347:        contract_r->destroy(contract_r);
                    348:        base_attr_r->destroy(base_attr_r);
                    349:        libimcv_deinit();
                    350: }
                    351: END_TEST
                    352: 
                    353: START_TEST(test_imcv_seg_contract_special)
                    354: {
                    355:        seg_contract_t *contract_i, *contract_r;
                    356:        tcg_seg_attr_seg_env_t *seg_env_attr1, *seg_env_attr2;
                    357:        ita_attr_command_t *ita_attr;
                    358:        pa_tnc_attr_t *base_attr1_i, *base_attr2_i, *base_attr1_r, *base_attr2_r;
                    359:        pa_tnc_attr_t *attr1_f, *attr2_f, *attr1_n, *attr2_n, *attr3, *error;
                    360:        pen_type_t type, msg_type = { PEN_ITA, PA_SUBTYPE_ITA_TEST };
                    361:        uint32_t max_seg_size, max_attr_size, issuer_id = 1;
                    362:        uint32_t base_attr1_id, base_attr2_id;
                    363:        char info[512];
                    364:        bool oversize, more;
                    365: 
                    366:        libimcv_init(FALSE);
                    367: 
                    368:        /* create two base attributes to be segmented */
                    369:        base_attr1_r = ita_attr_command_create(command);
                    370:        base_attr2_r = ita_attr_dummy_create(129);
                    371:        base_attr1_r->build(base_attr1_r);
                    372:        base_attr2_r->build(base_attr2_r);
                    373: 
                    374:        /* create an issuer contract*/
                    375:        contract_i = seg_contract_create(msg_type, 1000, 47,
                    376:                                                                                           TRUE, issuer_id, FALSE);
                    377:        ck_assert(pen_type_equals(contract_i->get_msg_type(contract_i), msg_type));
                    378:        ck_assert(contract_i->is_issuer(contract_i));
                    379:        ck_assert(!contract_i->is_null(contract_i));
                    380: 
                    381:        /* set null contract */
                    382:        contract_i->set_max_size(contract_i, SEG_CONTRACT_MAX_SIZE_VALUE,
                    383:                                                                                 SEG_CONTRACT_MAX_SIZE_VALUE);
                    384:        ck_assert(contract_i->is_null(contract_i));
                    385: 
                    386:        /* set and get maximum attribute and segment sizes */
                    387:        contract_i->set_max_size(contract_i, 1000, 47);
                    388:        contract_i->get_max_size(contract_i, NULL, NULL);
                    389:        contract_i->get_max_size(contract_i, &max_attr_size, &max_seg_size);
                    390:        contract_i->get_info_string(contract_i, info, sizeof(info), TRUE);
                    391:        ck_assert(max_attr_size == 1000 && max_seg_size == 47);
                    392:        ck_assert(!contract_i->is_null(contract_i));
                    393: 
                    394:        /* create a null responder contract*/
                    395:        contract_r = seg_contract_create(msg_type, SEG_CONTRACT_MAX_SIZE_VALUE,
                    396:                                                                                           SEG_CONTRACT_MAX_SIZE_VALUE,
                    397:                                                                                           FALSE, issuer_id, TRUE);
                    398:        ck_assert(!contract_r->is_issuer(contract_r));
                    399:        ck_assert(!contract_r->check_size(contract_r, base_attr2_r, &oversize));
                    400:        ck_assert(!oversize);
                    401: 
                    402:        /* allow no fragmentation */
                    403:        contract_r->set_max_size(contract_r, 1000, SEG_CONTRACT_MAX_SIZE_VALUE);
                    404:        ck_assert(!contract_r->is_null(contract_r));
                    405:        ck_assert(!contract_r->check_size(contract_r, base_attr2_r, &oversize));
                    406:        ck_assert(!oversize);
                    407: 
                    408:        /* no maximum size limit and no fragmentation needed */
                    409:        contract_r->set_max_size(contract_r, SEG_CONTRACT_MAX_SIZE_VALUE, 141);
                    410:        ck_assert(!contract_r->is_null(contract_r));
                    411:        ck_assert(!contract_r->check_size(contract_r, base_attr2_r, &oversize));
                    412:        ck_assert(!oversize);
                    413: 
                    414:        /* oversize base attribute */
                    415:        contract_r->set_max_size(contract_r, 140, 47);
                    416:        ck_assert(!contract_r->is_null(contract_r));
                    417:        ck_assert(!contract_r->check_size(contract_r, base_attr2_r, &oversize));
                    418:        ck_assert(oversize);
                    419: 
                    420:        /* set final maximum attribute and segment sizes */
                    421:        contract_r->set_max_size(contract_r, 141, 47);
                    422:        contract_r->get_info_string(contract_r, info, sizeof(info), TRUE);
                    423:        ck_assert(contract_r->check_size(contract_r, base_attr2_r, &oversize));
                    424:        ck_assert(!oversize);
                    425: 
                    426:        /* get first segment of each base attribute */
                    427:        attr1_f = contract_r->first_segment(contract_r, base_attr1_r->get_ref(base_attr1_r), 0);
                    428:        attr2_f = contract_r->first_segment(contract_r, base_attr2_r->get_ref(base_attr2_r), 0);
                    429:        ck_assert(attr1_f);
                    430:        ck_assert(attr2_f);
                    431:        seg_env_attr1 = (tcg_seg_attr_seg_env_t*)attr1_f;
                    432:        seg_env_attr2 = (tcg_seg_attr_seg_env_t*)attr2_f;
                    433:        base_attr1_id = seg_env_attr1->get_base_attr_id(seg_env_attr1);
                    434:        base_attr2_id = seg_env_attr2->get_base_attr_id(seg_env_attr2);
                    435:        ck_assert(base_attr1_id == 1);
                    436:        ck_assert(base_attr2_id == 2);
                    437: 
                    438:        /* get second segment of each base attribute */
                    439:        attr1_n = contract_r->next_segment(contract_r, 1);
                    440:        attr2_n = contract_r->next_segment(contract_r, 2);
                    441:        ck_assert(attr1_n);
                    442:        ck_assert(attr2_n);
                    443: 
                    444:        /* process first segment of first base attribute */
                    445:        base_attr1_i = contract_i->add_segment(contract_i, attr1_f, &error, &more);
                    446:        ck_assert(base_attr1_i == NULL);
                    447:        ck_assert(error == NULL);
                    448:        ck_assert(more);
                    449: 
                    450:        /* reapply first segment of first base attribute */
                    451:        base_attr1_i = contract_i->add_segment(contract_i, attr1_f, &error, &more);
                    452:        ck_assert(base_attr1_i == NULL);
                    453:        ck_assert(error == NULL);
                    454:        ck_assert(more);
                    455: 
                    456:        /* process stray second segment of second attribute */
                    457:        base_attr2_i = contract_i->add_segment(contract_i, attr2_n, &error, &more);
                    458:        ck_assert(base_attr2_i == NULL);
                    459:        ck_assert(error == NULL);
                    460:        ck_assert(more);
                    461: 
                    462:        /* process first segment of second base attribute */
                    463:        base_attr2_i = contract_i->add_segment(contract_i, attr2_f, &error, &more);
                    464:        ck_assert(base_attr2_i == NULL);
                    465:        ck_assert(error == NULL);
                    466:        ck_assert(more);
                    467: 
                    468:        /* try to get a segment of a non-existing base-attribute */
                    469:        attr3 = contract_r->next_segment(contract_r, 3);
                    470:        ck_assert(attr3 == NULL);
                    471: 
                    472:        /* process second segment of first base attribute */
                    473:        base_attr1_i = contract_i->add_segment(contract_i, attr1_n, &error, &more);
                    474:        ck_assert(base_attr1_i);
                    475:        ck_assert(error == NULL);
                    476:        ck_assert(!more);
                    477: 
                    478:        /* process second segment of second base attribute */
                    479:        base_attr2_i = contract_i->add_segment(contract_i, attr2_n, &error, &more);
                    480:        ck_assert(base_attr2_i == NULL);
                    481:        ck_assert(error == NULL);
                    482:        ck_assert(more);
                    483: 
                    484:        /* destroy first and second segments */
                    485:        attr1_f->destroy(attr1_f);
                    486:        attr2_f->destroy(attr2_f);
                    487:        attr1_n->destroy(attr1_n);
                    488:        attr2_n->destroy(attr2_n);
                    489: 
                    490:        /* request surplus segment of first base attribute */
                    491:        attr1_n = contract_r->next_segment(contract_r, 1);
                    492:        ck_assert(attr1_n == NULL);
                    493: 
                    494:        /* get last segment of second base attribute */
                    495:        attr2_n = contract_r->next_segment(contract_r, 2);
                    496:        ck_assert(attr2_n);
                    497: 
                    498:        /* process last segment of second base attribute */
                    499:        base_attr2_i = contract_i->add_segment(contract_i, attr2_n, &error, &more);
                    500:        attr2_n->destroy(attr2_n);
                    501:        ck_assert(base_attr2_i);
                    502:        ck_assert(error == NULL);
                    503:        ck_assert(!more);
                    504: 
                    505:        /* request surplus segment of second base attribute */
                    506:        attr2_n = contract_r->next_segment(contract_r, 2);
                    507:        ck_assert(attr2_n == NULL);
                    508: 
                    509:        /* compare original with reconstructed base attributes */
                    510:        type = base_attr1_i->get_type(base_attr1_i);
                    511:        ck_assert(pen_type_equals(type, base_attr1_r->get_type(base_attr1_r)));
                    512:        ita_attr = (ita_attr_command_t*)base_attr1_i;
                    513:        ck_assert(streq(ita_attr->get_command(ita_attr), command));
                    514: 
                    515:        type = base_attr2_i->get_type(base_attr2_i);
                    516:        ck_assert(pen_type_equals(type, base_attr2_r->get_type(base_attr2_r)));
                    517:        ck_assert(chunk_equals(base_attr2_i->get_value(base_attr2_i),
                    518:                                                   base_attr2_r->get_value(base_attr2_r)));
                    519: 
                    520:        /* cleanup */
                    521:        base_attr1_r->destroy(base_attr1_r);
                    522:        base_attr2_r->destroy(base_attr2_r);
                    523:        base_attr1_i->destroy(base_attr1_i);
                    524:        base_attr2_i->destroy(base_attr2_i);
                    525:        contract_i->destroy(contract_i);
                    526:        contract_r->destroy(contract_r);
                    527:        libimcv_deinit();
                    528: }
                    529: END_TEST
                    530: 
                    531: static struct {
                    532:        bool err_f;
                    533:        chunk_t frag_f;
                    534:        bool err_n;
                    535:        bool base_attr;
                    536:        chunk_t frag_n;
                    537: } contract_invalid_tests[] = {
                    538:        { FALSE, chunk_from_chars(
                    539:                0xc0, 0x00, 0x00, 0x01, 0x00, 0x00, 0x90, 0x2a, 0x00, 0x00, 0x00, 0x01,
                    540:                0x00, 0x00, 0x00, 0x0d),
                    541:          FALSE, TRUE, chunk_from_chars(
                    542:                0x00, 0x00, 0x00, 0x01, 0x01 )
                    543:        },
                    544:        { FALSE, chunk_from_chars(
                    545:                0xc0, 0x00, 0x00, 0x02, 0x00, 0x00, 0x90, 0x2a, 0x00, 0x00, 0x00, 0x01,
                    546:                0x00, 0x00, 0x00, 0x0e),
                    547:          TRUE, FALSE, chunk_from_chars(
                    548:                0x00, 0x00, 0x00, 0x02, 0x01 )
                    549:        },
                    550:        { TRUE, chunk_from_chars(
                    551:                0xc0, 0x00, 0x00, 0x03, 0x00, 0x00, 0x55, 0x97, 0x00, 0x00, 0x00, 0x23,
                    552:                0x00, 0x00, 0x00, 0x0d),
                    553:          FALSE, FALSE, chunk_from_chars(
                    554:                0x00, 0x00, 0x00, 0x03, 0x01 )
                    555:        },
                    556:        { FALSE, chunk_from_chars(
                    557:                0xc0, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08,
                    558:                0x00, 0x00, 0x00, 0x14),
                    559:          FALSE, FALSE, chunk_from_chars(
                    560:                0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01 )
                    561:        },
                    562:        { FALSE, chunk_from_chars(
                    563:                0xc0, 0x00, 0x00, 0x05, 0x00, 0x00, 0x90, 0x2a, 0x00, 0x00, 0x00, 0x03,
                    564:                0x00, 0x00, 0x00, 0x0f),
                    565:          TRUE, FALSE, chunk_from_chars(
                    566:                0x00, 0x00, 0x00, 0x05, 0x00, 0x02, 0x01 )
                    567:        },
                    568:        { FALSE, chunk_from_chars(
                    569:                0xc0, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02,
                    570:                0x00, 0x00, 0x00, 0x11),
                    571:          TRUE, FALSE, chunk_from_chars(
                    572:                0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0xff )
                    573:        }
                    574: };
                    575: 
                    576: START_TEST(test_imcv_seg_contract_invalid)
                    577: {
                    578:        uint32_t max_seg_size = 12, max_attr_size = 100, issuer_id = 1;
                    579:        pen_type_t msg_type = { PEN_ITA, PA_SUBTYPE_ITA_TEST };
                    580:        pa_tnc_attr_t *attr_f, *attr_n, *base_attr, *error;
                    581:        chunk_t value_f, value_n;
                    582:        seg_contract_t *contract;
                    583:        uint32_t offset;
                    584:        bool more;
                    585: 
                    586:        libimcv_init(FALSE);
                    587:        value_f = contract_invalid_tests[_i].frag_f;
                    588:        value_n = contract_invalid_tests[_i].frag_n;
                    589:        attr_f = tcg_seg_attr_seg_env_create_from_data(value_f.len, value_f);
                    590:        attr_n = tcg_seg_attr_seg_env_create_from_data(value_n.len, value_n);
                    591:        ck_assert(attr_f->process(attr_f, &offset) == SUCCESS);
                    592:        ck_assert(attr_n->process(attr_n, &offset) == SUCCESS);
                    593: 
                    594:        contract = seg_contract_create(msg_type, max_attr_size, max_seg_size,
                    595:                                                                         TRUE, issuer_id, FALSE);
                    596:        base_attr = contract->add_segment(contract, attr_f, &error, &more);
                    597:        ck_assert(base_attr == NULL);
                    598: 
                    599:        if (contract_invalid_tests[_i].err_f)
                    600:        {
                    601:                ck_assert(error);
                    602:                error->destroy(error);
                    603:        }
                    604:        else
                    605:        {
                    606:                ck_assert(error == NULL);
                    607:                ck_assert(more);
                    608:                base_attr = contract->add_segment(contract, attr_n, &error, &more);
                    609:                if (contract_invalid_tests[_i].err_n)
                    610:                {
                    611:                        ck_assert(error);
                    612:                        error->destroy(error);
                    613:                }
                    614:                else
                    615:                {
                    616:                        ck_assert(error == NULL);
                    617:                }
                    618:                if (contract_invalid_tests[_i].base_attr)
                    619:                {
                    620:                        ck_assert(base_attr);
                    621:                        base_attr->destroy(base_attr);
                    622:                }
                    623:        }
                    624: 
                    625:        /* cleanup */
                    626:        attr_f->destroy(attr_f);
                    627:        attr_n->destroy(attr_n);
                    628:        contract->destroy(contract);
                    629:        libimcv_deinit();
                    630: }
                    631: END_TEST
                    632: 
                    633: START_TEST(test_imcv_seg_contract_mgr)
                    634: {
                    635:        char buf[BUF_LEN];
                    636:        uint32_t max_seg_size = 12, max_attr_size = 100;
                    637:        pen_type_t msg_type1 = { PEN_ITA, PA_SUBTYPE_ITA_TEST };
                    638:        pen_type_t msg_type2 = { PEN_IETF, PA_SUBTYPE_IETF_OPERATING_SYSTEM };
                    639:        seg_contract_manager_t *contracts;
                    640:        seg_contract_t *cx, *c1, *c2, *c3, *c4;
                    641: 
                    642:        contracts = seg_contract_manager_create();
                    643: 
                    644:        /* add contract template as issuer */
                    645:        c1 = seg_contract_create(msg_type1, max_attr_size, max_seg_size,
                    646:                                                         TRUE, 1, FALSE);
                    647:        c1->get_info_string(c1, buf, BUF_LEN, TRUE);
                    648: 
                    649:        contracts->add_contract(contracts, c1);
                    650: 
                    651:        /* received contract request for msg_type1 as responder */
                    652:        cx = contracts->get_contract(contracts, msg_type1, FALSE, 2);
                    653:        ck_assert(cx == NULL);
                    654: 
                    655:        /* add directed contract as responder */
                    656:        c2 = seg_contract_create(msg_type1, max_attr_size, max_seg_size,
                    657:                                                         FALSE, 2, FALSE);
                    658:        c2->set_responder(c2, 1);
                    659:        c2->get_info_string(c2, buf, BUF_LEN, TRUE);
                    660:        contracts->add_contract(contracts, c2);
                    661: 
                    662:        /* retrieve this contract */
                    663:        cx = contracts->get_contract(contracts, msg_type1, FALSE, 2);
                    664:        ck_assert(cx == c2);
                    665: 
                    666:        /* received directed contract response as issuer */
                    667:        cx = contracts->get_contract(contracts, msg_type1, TRUE, 3);
                    668:        ck_assert(cx == NULL);
                    669: 
                    670:        /* get contract template */
                    671:        cx = contracts->get_contract(contracts, msg_type1, TRUE, TNC_IMCID_ANY);
                    672:        ck_assert(cx == c1);
                    673: 
                    674:        /* clone the contract template and as it as a directed contract */
                    675:        c3 = cx->clone(cx);
                    676:        c3->set_responder(c3, 3);
                    677:        c3->get_info_string(c3, buf, BUF_LEN, FALSE);
                    678:        contracts->add_contract(contracts, c3);
                    679: 
                    680:        /* retrieve this contract */
                    681:        cx = contracts->get_contract(contracts, msg_type1, TRUE, 3);
                    682:        ck_assert(cx == c3);
                    683: 
                    684:        /* received contract request for msg_type2 as responder */
                    685:        cx = contracts->get_contract(contracts, msg_type2, FALSE, 2);
                    686:        ck_assert(cx == NULL);
                    687: 
                    688:        /* add directed contract as responder */
                    689:        c4 = seg_contract_create(msg_type2, max_attr_size, max_seg_size,
                    690:                                                         FALSE, 2, FALSE);
                    691:        c4->set_responder(c4, 1);
                    692:        contracts->add_contract(contracts, c4);
                    693: 
                    694:        /* retrieve this contract */
                    695:        cx = contracts->get_contract(contracts, msg_type2, FALSE, 2);
                    696:        ck_assert(cx == c4);
                    697: 
                    698:        contracts->destroy(contracts);
                    699: }
                    700: END_TEST
                    701: 
                    702: Suite *imcv_seg_suite_create()
                    703: {
                    704:        Suite *s;
                    705:        TCase *tc;
                    706: 
                    707:        s = suite_create("imcv_seg");
                    708: 
                    709:        tc = tcase_create("env");
                    710:        tcase_add_loop_test(tc, test_imcv_seg_env, 0, countof(seg_env_tests));
                    711:        suite_add_tcase(s, tc);
                    712: 
                    713:        tc = tcase_create("env_special");
                    714:        tcase_add_test(tc, test_imcv_seg_env_special);
                    715:        suite_add_tcase(s, tc);
                    716: 
                    717:        tc = tcase_create("env_invalid");
                    718:        tcase_add_loop_test(tc, test_imcv_seg_env_invalid, 0,
                    719:                                                countof(env_invalid_tests));
                    720:        suite_add_tcase(s, tc);
                    721: 
                    722:        tc = tcase_create("contract");
                    723:        tcase_add_loop_test(tc, test_imcv_seg_contract, 0, countof(seg_env_tests));
                    724:        suite_add_tcase(s, tc);
                    725: 
                    726:        tc = tcase_create("contract_special");
                    727:        tcase_add_test(tc, test_imcv_seg_contract_special);
                    728:        suite_add_tcase(s, tc);
                    729: 
                    730:        tc = tcase_create("contract_invalid");
                    731:        tcase_add_loop_test(tc, test_imcv_seg_contract_invalid, 0,
                    732:                                                countof(contract_invalid_tests));
                    733:        suite_add_tcase(s, tc);
                    734: 
                    735:        tc = tcase_create("contract_mgr");
                    736:        tcase_add_test(tc, test_imcv_seg_contract_mgr);
                    737:        suite_add_tcase(s, tc);
                    738: 
                    739:        return s;
                    740: }

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