Annotation of embedaddon/strongswan/src/libstrongswan/tests/suites/test_mgf1.c, revision 1.1

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 <utils/test.h>
        !            19: #include <crypto/xofs/xof.h>
        !            20: #include <crypto/xofs/xof_bitspender.h>
        !            21: #include <crypto/xofs/mgf1.h>
        !            22: 
        !            23: typedef struct {
        !            24:        ext_out_function_t alg;
        !            25:        size_t hash_size;
        !            26:        size_t ml1, ml2, ml3, seed_len;
        !            27:        chunk_t seed;
        !            28:        chunk_t hashed_seed;
        !            29:        chunk_t mask;
        !            30:        uint32_t bits[22];
        !            31: } mgf1_test_t;
        !            32: 
        !            33: /**
        !            34:  * MGF1 Mask Generation Function Test Vectors
        !            35:  */
        !            36: mgf1_test_t mgf1_tests[] = {
        !            37:        {       XOF_MGF1_SHA1, 20, 60, 20, 15, 24,
        !            38:                chunk_from_chars(
        !            39:                                                0xED, 0xA5, 0xC3, 0xBC, 0xAF, 0xB3, 0x20, 0x7D,
        !            40:                                                0x14, 0xA1, 0x54, 0xF7, 0x8B, 0x37, 0xF2, 0x8D,
        !            41:                                                0x8C, 0x9B, 0xD5, 0x63, 0x57, 0x38, 0x11, 0xC2,
        !            42:                                                0xB5, 0xCA, 0xBF, 0x06, 0x43, 0x45, 0x19, 0xD5,
        !            43:                                                0xE7, 0x36, 0xD0, 0x29, 0x21, 0xDA, 0x02, 0x20,
        !            44:                                                0x45, 0xF6, 0x5F, 0x0F, 0x10, 0x04, 0x2A, 0xE3,
        !            45:                                                0x6A, 0x1D, 0xD5, 0x9F, 0x1D, 0x66, 0x44, 0x8F,
        !            46:                                                0xFA, 0xC6, 0xCA, 0xA4, 0x6E, 0x3B, 0x00, 0x66,
        !            47:                                                0xA6, 0xC9, 0x80, 0x5C, 0xF5, 0x2D, 0xD7, 0x72,
        !            48:                                                0xC6, 0xD4, 0x4F, 0x30, 0x72, 0xA2, 0xAD, 0xE0,
        !            49:                                                0x33, 0xE8, 0x55, 0xD5, 0xE6, 0xD6, 0x00, 0x1D,
        !            50:                                                0xA8, 0x68, 0xFF, 0x97, 0x36, 0x8A, 0xF4, 0xD6,
        !            51:                                                0xF1, 0xB6, 0x7E, 0x1F, 0x06, 0xCB, 0x57, 0xCB,
        !            52:                                                0x35, 0x38, 0xF2, 0x2D, 0xF6, 0x20),
        !            53:                chunk_from_chars(
        !            54:                                                0xF3, 0x9B, 0x0B, 0xB4, 0x97, 0x50, 0xB5, 0xA7,
        !            55:                                                0xE6, 0xBD, 0xDA, 0xD0, 0x9A, 0x52, 0xBE, 0xA0,
        !            56:                                                0x21, 0xC4, 0x90, 0xB6),
        !            57:                chunk_from_chars(
        !            58:                                                0x10, 0x43, 0x76, 0x72, 0x6C, 0xDE, 0xA0, 0x0E,
        !            59:                                                0x77, 0x51, 0xFB, 0x58, 0x39, 0x8A, 0x36, 0xE1,
        !            60:                                                0x63, 0x2B, 0xC9, 0x17, 0x56, 0x0C, 0x4B, 0x46,
        !            61:                                                0xA4, 0x07, 0xA4, 0x3B, 0x8E, 0x33, 0x4D, 0xD1,
        !            62:                                                0x65, 0xF1, 0xAC, 0xC8, 0x59, 0x21, 0x32, 0x16,
        !            63:                                                0x44, 0x2B, 0x7F, 0xB2, 0xA8, 0xA7, 0x26, 0x5D,
        !            64:                                                0xE8, 0x02, 0xBE, 0x8E, 0xDC, 0x34, 0xEB, 0x10,
        !            65:                                                0x76, 0x16, 0x8C, 0xDD, 0x90, 0x92, 0x3D, 0x29,
        !            66:                                                0x90, 0x98, 0x46, 0x11, 0x73, 0x53, 0x47, 0xB1,
        !            67:                                                0x2C, 0xD4, 0x83, 0x78, 0x9B, 0x93, 0x2F, 0x5B,
        !            68:                                                0xFC, 0x26, 0xFF, 0x42, 0x08, 0x1F, 0x70, 0x66,
        !            69:                                                0x40, 0x4B, 0xE7, 0x22, 0x3A, 0x56, 0x10, 0x6D,
        !            70:                                                0x4D, 0x29, 0x0B, 0xCE, 0xA6, 0x21, 0xB5, 0x5C,
        !            71:                                                0x71, 0x66, 0x2F, 0x70, 0x35, 0xD8, 0x8A, 0x92,
        !            72:                                                0x33, 0xF0, 0x16, 0xD4, 0x0E, 0x43, 0x8A, 0x14),
        !            73:                { 0, 0, 0, 4, 1, 1, 46, 103, 38, 411, 848, 57, 3540, 4058, 12403,
        !            74:                  0x63, 0x2B, 0xC9, 0x17, 0x56, 669409, 0xA407A43B },
        !            75:        },
        !            76:        {       XOF_MGF1_SHA256, 32, 64, 32, 33, 40,
        !            77:                chunk_from_chars(
        !            78:                                                0x52, 0xC5, 0xDD, 0x1E, 0xEF, 0x76, 0x1B, 0x53,
        !            79:                                                0x08, 0xE4, 0x86, 0x3F, 0x91, 0x12, 0x98, 0x69,
        !            80:                                                0xC5, 0x9D, 0xDE, 0xF6, 0xFC, 0xFA, 0x93, 0xCE,
        !            81:                                                0x32, 0x52, 0x66, 0xF9, 0xC9, 0x97, 0xF6, 0x42,
        !            82:                                                0x00, 0x2C, 0x64, 0xED, 0x1A, 0x6B, 0x14, 0x0A,
        !            83:                                                0x4B, 0x04, 0xCF, 0x6D, 0x2D, 0x82, 0x0A, 0x07,
        !            84:                                                0xA2, 0x3B, 0xDE, 0xCE, 0x19, 0x8A, 0x39, 0x43,
        !            85:                                                0x16, 0x61, 0x29, 0x98, 0x68, 0xEA, 0xE5, 0xCC,
        !            86:                                                0x0A, 0xF8, 0xE9, 0x71, 0x26, 0xF1, 0x07, 0x36,
        !            87:                                                0x2C, 0x07, 0x1E, 0xEB, 0xE4, 0x28, 0xA2, 0xF4,
        !            88:                                                0xA8, 0x12, 0xC0, 0xC8, 0x20, 0x37, 0xF8, 0xF2,
        !            89:                                                0x6C, 0xAF, 0xDC, 0x6F, 0x2E, 0xD0, 0x62, 0x58,
        !            90:                                                0xD2, 0x37, 0x03, 0x6D, 0xFA, 0x6E, 0x1A, 0xAC,
        !            91:                                                0x9F, 0xCA, 0x56, 0xC6, 0xA4, 0x52, 0x41, 0xE8,
        !            92:                                                0x0F, 0x1B, 0x0C, 0xB9, 0xE6, 0xBA, 0xDE, 0xE1,
        !            93:                                                0x03, 0x5E, 0xC2, 0xE5, 0xF8, 0xF4, 0xF3, 0x46,
        !            94:                                                0x3A, 0x12, 0xC0, 0x1F, 0x3A, 0x00, 0xD0, 0x91,
        !            95:                                                0x18, 0xDD, 0x53, 0xE4, 0x22, 0xF5, 0x26, 0xA4,
        !            96:                                                0x54, 0xEE, 0x20, 0xF0, 0x80),
        !            97:                chunk_from_chars(
        !            98:                                                0x76, 0x89, 0x8B, 0x1B, 0x60, 0xEC, 0x10, 0x9D,
        !            99:                                                0x8F, 0x13, 0xF2, 0xFE, 0xD9, 0x85, 0xC1, 0xAB,
        !           100:                                                0x7E, 0xEE, 0xB1, 0x31, 0xDD, 0xF7, 0x7F, 0x0C,
        !           101:                                                0x7D, 0xF9, 0x6B, 0x7B, 0x19, 0x80, 0xBD, 0x28),
        !           102:                chunk_from_chars(
        !           103:                                                0xF1, 0x19, 0x02, 0x4F, 0xDA, 0x58, 0x05, 0x9A,
        !           104:                                                0x07, 0xDF, 0x61, 0x81, 0x22, 0x0E, 0x15, 0x46,
        !           105:                                                0xCB, 0x35, 0x3C, 0xDC, 0xAD, 0x20, 0xD9, 0x3F,
        !           106:                                                0x0D, 0xD1, 0xAA, 0x64, 0x66, 0x5C, 0xFA, 0x4A,
        !           107:                                                0xFE, 0xD6, 0x8F, 0x55, 0x57, 0x15, 0xB2, 0xA6,
        !           108:                                                0xA0, 0xE6, 0xA8, 0xC6, 0xBD, 0x28, 0xB4, 0xD5,
        !           109:                                                0x6E, 0x5B, 0x4B, 0xB0, 0x97, 0x09, 0xF5, 0xAC,
        !           110:                                                0x57, 0x65, 0x13, 0x97, 0x71, 0x2C, 0x45, 0x13,
        !           111:                                                0x3D, 0xEE, 0xFB, 0xBF, 0xFE, 0xAF, 0xBB, 0x4B,
        !           112:                                                0x0D, 0x5C, 0x45, 0xD4, 0x2F, 0x17, 0x92, 0x07,
        !           113:                                                0x66, 0x11, 0xF5, 0x46, 0xF8, 0x0C, 0x03, 0x92,
        !           114:                                                0xF5, 0xF5, 0xFF, 0xA4, 0xF3, 0x52, 0xF4, 0x08,
        !           115:                                                0x2C, 0x49, 0x32, 0x1A, 0x93, 0x51, 0x98, 0xB6,
        !           116:                                                0x94, 0x83, 0x39, 0xCF, 0x6B, 0x1F, 0x2F, 0xFC,
        !           117:                                                0x2B, 0xFF, 0x10, 0x71, 0x7D, 0x35, 0x6C, 0xEA,
        !           118:                                                0xC5, 0x66, 0xC7, 0x26, 0x7D, 0x9E, 0xAC, 0xDD,
        !           119:                                                0x35, 0xD7, 0x06, 0x3F, 0x40, 0x82, 0xDA, 0xC3,
        !           120:                                                0x2B, 0x3C, 0x91, 0x3A, 0x32, 0xF8, 0xB2, 0xC6,
        !           121:                                                0x44, 0x4D, 0xCD, 0xB6, 0x54, 0x5F, 0x81, 0x95,
        !           122:                                                0x59, 0xA1, 0xE5, 0x4E, 0xA5, 0x0A, 0x4A, 0x42),
        !           123:                 { 0, 1, 3, 4, 4, 12, 32, 36, 253, 331, 2, 1640, 503, 6924, 580,
        !           124:                   0xCB, 0x35, 0x3C, 0xDC, 0xAD, 922950, 0x0DD1AA64 }
        !           125:        }
        !           126: };
        !           127: 
        !           128: START_TEST(mgf1_test_mgf1)
        !           129: {
        !           130:        xof_t *xof;
        !           131:        mgf1_t *mgf1;
        !           132:        chunk_t mask, mask1, mask2, mask3;
        !           133: 
        !           134:        mask1 = mgf1_tests[_i].mask;
        !           135:        mask2 = chunk_skip(mask1, mgf1_tests[_i].ml1);
        !           136:        mask3 = chunk_skip(mask2, mgf1_tests[_i].ml2);
        !           137:        mask1.len = mgf1_tests[_i].ml1;
        !           138:        mask2.len = mgf1_tests[_i].ml2;
        !           139:        mask3.len = mgf1_tests[_i].ml3;
        !           140: 
        !           141:        /* unknown XOF */
        !           142:        xof = lib->crypto->create_xof(lib->crypto, XOF_UNDEFINED);
        !           143:        ck_assert(xof == NULL);
        !           144: 
        !           145:        /* create MGF1 XOF */
        !           146:        xof = lib->crypto->create_xof(lib->crypto, mgf1_tests[_i].alg);
        !           147:        ck_assert(xof);
        !           148: 
        !           149:        /* hash the seed */
        !           150:        mgf1 = (mgf1_t*)xof;
        !           151:        mgf1->set_hash_seed(mgf1, TRUE);
        !           152: 
        !           153:        /* check MGF1 type */
        !           154:        ck_assert(xof->get_type(xof) == mgf1_tests[_i].alg);
        !           155: 
        !           156:        /* check seed size */
        !           157:        ck_assert(xof->get_seed_size(xof) == mgf1_tests[_i].hash_size);
        !           158: 
        !           159:        /* check block size */
        !           160:        ck_assert(xof->get_block_size(xof) == mgf1_tests[_i].hash_size);
        !           161: 
        !           162:        /* empty seed */
        !           163:        ck_assert(!xof->set_seed(xof, chunk_empty));
        !           164: 
        !           165:        /* initialize MGF1 with non-empty seed */
        !           166:        ck_assert(xof->set_seed(xof, mgf1_tests[_i].seed));
        !           167: 
        !           168:        /* allocate zero number of octets */
        !           169:        ck_assert(xof->allocate_bytes(xof, 0, &mask));
        !           170:        ck_assert(mask.len == 0 && mask.ptr == NULL);
        !           171: 
        !           172:        /* allocate non-zero number of octets */
        !           173:        ck_assert(xof->allocate_bytes(xof, mgf1_tests[_i].mask.len, &mask));
        !           174:        ck_assert(chunk_equals(mask, mgf1_tests[_i].mask));
        !           175: 
        !           176:        /* re-initialize MGF1 with non-empty seed */
        !           177:        ck_assert(xof->set_seed(xof, mgf1_tests[_i].seed));
        !           178: 
        !           179:        /* copy mask to pre-allocated buffer */
        !           180:        ck_assert(xof->get_bytes(xof, mgf1_tests[_i].mask.len, mask.ptr));
        !           181:        ck_assert(chunk_equals(mask, mgf1_tests[_i].mask));
        !           182: 
        !           183:        /* do not hash the seed */
        !           184:        mgf1->set_hash_seed(mgf1, FALSE);
        !           185: 
        !           186:        /* re-initialize MGF1 with non-empty seed */
        !           187:        ck_assert(xof->set_seed(xof, mgf1_tests[_i].hashed_seed));
        !           188: 
        !           189:        /* first batch */
        !           190:        ck_assert(xof->get_bytes(xof, mask1.len, mask.ptr));
        !           191:        mask.len = mask1.len;
        !           192:        ck_assert(chunk_equals(mask, mask1));
        !           193: 
        !           194:        /* second batch */
        !           195:        ck_assert(xof->get_bytes(xof, mask2.len, mask.ptr));
        !           196:        mask.len = mask2.len;
        !           197:        ck_assert(chunk_equals(mask, mask2));
        !           198: 
        !           199:        /* third batch */
        !           200:        ck_assert(xof->get_bytes(xof, mask3.len, mask.ptr));
        !           201:        mask.len = mask3.len;
        !           202:        ck_assert(chunk_equals(mask, mask3));
        !           203: 
        !           204:        /* clean up */
        !           205:        xof->destroy(xof);
        !           206:        chunk_free(&mask);
        !           207: }
        !           208: END_TEST
        !           209: 
        !           210: START_TEST(mgf1_test_bitspender)
        !           211: {
        !           212:        xof_bitspender_t *bitspender;
        !           213:        uint32_t bits;
        !           214:        uint8_t byte;
        !           215:        int j;
        !           216: 
        !           217:        bitspender = xof_bitspender_create(XOF_UNDEFINED,
        !           218:                                                                           mgf1_tests[_i].hashed_seed, FALSE);
        !           219:        ck_assert(bitspender == NULL);
        !           220: 
        !           221:        bitspender = xof_bitspender_create(mgf1_tests[_i].alg,
        !           222:                                                                           mgf1_tests[_i].hashed_seed, FALSE);
        !           223:        ck_assert(bitspender);
        !           224: 
        !           225:        for (j = 0; j < 15; j++)
        !           226:        {
        !           227:                ck_assert(bitspender->get_bits(bitspender, j, &bits));
        !           228:                DBG1(DBG_LIB, "bits[%d] = %u, bits = %u", j, mgf1_tests[_i].bits[j],
        !           229:                                           bits);
        !           230:                ck_assert(bits == mgf1_tests[_i].bits[j]);
        !           231:        }
        !           232:        ck_assert(!bitspender->get_bits(bitspender, 33, &bits));
        !           233: 
        !           234:        for (j = 15; j < 20; j++)
        !           235:        {
        !           236:                ck_assert(bitspender->get_byte(bitspender, &byte));
        !           237:                DBG1(DBG_LIB, "bits[%d] = 0x%02x, byte = 0x%02x", j,
        !           238:                                   mgf1_tests[_i].bits[j], byte);
        !           239:                ck_assert(byte == mgf1_tests[_i].bits[j]);
        !           240:        }
        !           241: 
        !           242:        j = 20; /* 23 remaining bits */
        !           243:        ck_assert(bitspender->get_bits(bitspender, 23, &bits));
        !           244:        DBG1(DBG_LIB, "bits[%d] = %u, bits = %u", j,
        !           245:                                   mgf1_tests[_i].bits[j], bits);
        !           246:        ck_assert(bits == mgf1_tests[_i].bits[j]);
        !           247: 
        !           248:        j = 21; /* 32 aligned bits */
        !           249:        ck_assert(bitspender->get_bits(bitspender, 32, &bits));
        !           250:        DBG1(DBG_LIB, "bits[%d] = 0x%08x, bits = 0x%08x", j,
        !           251:                                   mgf1_tests[_i].bits[j], bits);
        !           252:        ck_assert(bits == mgf1_tests[_i].bits[j]);
        !           253: 
        !           254:        bitspender->destroy(bitspender);
        !           255: }
        !           256: END_TEST
        !           257: 
        !           258: 
        !           259: Suite *mgf1_suite_create(char *name, int n)
        !           260: {
        !           261:        Suite *s;
        !           262:        TCase *tc;
        !           263: 
        !           264:        s = suite_create(name);
        !           265: 
        !           266:        tc = tcase_create("mgf1");
        !           267:        tcase_add_loop_test(tc, mgf1_test_mgf1, n, n + 1);
        !           268:        suite_add_tcase(s, tc);
        !           269: 
        !           270:        tc = tcase_create("bitspender");
        !           271:        tcase_add_loop_test(tc, mgf1_test_bitspender, n, n + 1);
        !           272:        suite_add_tcase(s, tc);
        !           273: 
        !           274:        return s;
        !           275: }
        !           276: 
        !           277: Suite *mgf1_sha1_suite_create()
        !           278: {
        !           279:        return mgf1_suite_create("mgf1-sha1", 0);
        !           280: }
        !           281: 
        !           282: Suite *mgf1_sha256_suite_create()
        !           283: {
        !           284:        return mgf1_suite_create("mgf1-sha256", 1);
        !           285: }

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