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

1.1     ! misho       1: /*
        !             2:  * Copyright (C) 2013-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/drbgs/drbg.h>
        !            21: #include <crypto/rngs/rng_tester.h>
        !            22: #include <plugins/ntru/ntru_trits.h>
        !            23: #include <plugins/ntru/ntru_poly.h>
        !            24: #include <plugins/ntru/ntru_param_set.h>
        !            25: #include <plugins/ntru/ntru_private_key.h>
        !            26: 
        !            27: IMPORT_FUNCTION_FOR_TESTS(ntru, ntru_trits_create, ntru_trits_t*,
        !            28:                                                  size_t len, ext_out_function_t alg, chunk_t seed)
        !            29: 
        !            30: IMPORT_FUNCTION_FOR_TESTS(ntru, ntru_poly_create_from_seed, ntru_poly_t*,
        !            31:                                                  ext_out_function_t alg, chunk_t seed, uint8_t c_bits,
        !            32:                                                  uint16_t N, uint16_t q, uint32_t indices_len_p,
        !            33:                                                  uint32_t indices_len_m, bool is_product_form)
        !            34: 
        !            35: IMPORT_FUNCTION_FOR_TESTS(ntru, ntru_poly_create_from_data, ntru_poly_t*,
        !            36:                                                  uint16_t *data, uint16_t N, uint16_t q,
        !            37:                                                  uint32_t indices_len_p, uint32_t indices_len_m,
        !            38:                                                  bool is_product_form)
        !            39: 
        !            40: IMPORT_FUNCTION_FOR_TESTS(ntru, ntru_param_set_get_by_id,  ntru_param_set_t* ,
        !            41:                                                  ntru_param_set_id_t id)
        !            42: 
        !            43: IMPORT_FUNCTION_FOR_TESTS(ntru, ntru_private_key_create, ntru_private_key_t*,
        !            44:                                                  drbg_t *drbg, ntru_param_set_t *params)
        !            45: 
        !            46: IMPORT_FUNCTION_FOR_TESTS(ntru, ntru_private_key_create_from_data, ntru_private_key_t*,
        !            47:                                                  drbg_t *drbg, chunk_t data)
        !            48: 
        !            49: IMPORT_FUNCTION_FOR_TESTS(ntru, ntru_public_key_create_from_data, ntru_public_key_t*,
        !            50:                                                  drbg_t *drbg, chunk_t data)
        !            51: 
        !            52: /**
        !            53:  * NTRU parameter sets to test
        !            54:  */
        !            55: static struct {
        !            56:        diffie_hellman_group_t group;
        !            57:        char *group_name;
        !            58: } params[] = {
        !            59:        { NTRU_112_BIT, "NTRU_112" },
        !            60:        { NTRU_128_BIT, "NTRU_128" },
        !            61:        { NTRU_192_BIT, "NTRU_192" },
        !            62:        { NTRU_256_BIT, "NTRU_256" }
        !            63: };
        !            64: 
        !            65: /**
        !            66:  * NTRU parameter set selection
        !            67:  */
        !            68: char *parameter_sets[] = {
        !            69:                "x9_98_speed", "x9_98_bandwidth", "x9_98_balance", "optimum"
        !            70: };
        !            71: 
        !            72: typedef struct {
        !            73:        uint8_t c_bits;
        !            74:        uint16_t N;
        !            75:        uint16_t q;
        !            76:        bool is_product_form;
        !            77:        uint32_t indices_len;
        !            78:        uint32_t indices_size;
        !            79:        uint16_t *indices;
        !            80: } poly_test_t;
        !            81: 
        !            82: typedef struct {
        !            83:        ext_out_function_t alg;
        !            84:        size_t hash_size;
        !            85:        size_t seed_len;
        !            86:        chunk_t seed;
        !            87:        chunk_t trits;
        !            88:        poly_test_t poly_test[2];
        !            89: } trits_test_t;
        !            90: 
        !            91: uint16_t indices_ees439ep1[] = {
        !            92:        367, 413,  16, 214, 114, 128,  42, 268, 346, 329, 119, 303, 208, 287, 150,
        !            93:          3,  45, 321, 110, 109, 272, 430,  80, 305,  51, 381, 322, 140, 207, 315,
        !            94:        206, 186,  56,   5, 273, 177,  44, 100, 205, 210,  98, 191,   8, 336
        !            95: };
        !            96: 
        !            97: uint16_t indices_ees613ep1[] = {
        !            98:        245, 391, 251, 428, 301,   2, 176, 296, 461, 224, 590, 215, 250,  91, 395,
        !            99:        363,  58, 537, 278, 291, 247,  33, 140, 447, 172, 514, 424, 412,  95,  94,
        !           100:        281, 159, 196, 302, 277,  63, 404, 150, 608, 315, 195, 334, 207, 376, 398,
        !           101:          0, 309, 486, 516,  86, 267, 139, 130,  38, 141, 258,  21, 341, 526, 388,
        !           102:        194, 116, 138, 524, 547, 383, 542, 406, 270, 438, 240, 445, 527, 168, 320,
        !           103:        186, 327, 212, 543,  82, 606, 131, 294, 392, 477, 430, 583, 142, 253, 434,
        !           104:        134, 458, 559, 414, 162, 407, 580, 577, 191, 109, 554, 523,  32,  62, 297,
        !           105:        283, 268,  54, 539,   5
        !           106: };
        !           107: 
        !           108: uint16_t indices_ees743ep1[] = {
        !           109:        285,  62, 136, 655, 460,  35, 450, 208, 340, 212,  61, 234, 454,  52, 520,
        !           110:        399, 315, 616, 496,  88, 280, 543, 508, 237, 553,  39, 214, 253, 720, 291,
        !           111:        586, 615, 635, 596,  62, 499, 301, 176, 271, 659, 372, 185, 621, 350, 683,
        !           112:        180, 717, 509, 641, 738, 666, 171, 639, 606, 353, 706, 237, 358, 410, 423,
        !           113:        197, 501, 261, 654, 658, 701, 377, 182, 548, 287, 700, 403, 248, 137
        !           114: };
        !           115: 
        !           116: uint16_t indices_ees1171ep1[] = {
        !           117:        514, 702, 760, 505, 262, 486, 695, 783, 533,  74, 403, 847, 170,1019, 568,
        !           118:        676,1057, 277,1021, 238, 203, 884, 124,  87,  65,  93, 131, 881,1102, 133,
        !           119:        459, 462,  92,  40,   5,1152,1158, 297, 599, 299,   7, 458, 347, 343, 173,
        !           120:    1044, 264, 871, 819, 679, 328, 438, 990, 982, 308,1135, 423, 470, 254, 295,
        !           121:    1029, 892, 759, 789, 123, 939, 749, 353,1062, 145, 562, 337, 550, 102, 549,
        !           122:        821,1098, 823,  96, 365, 135,1110, 334, 391, 638, 963, 962,1002,1069, 993,
        !           123:        983, 649,1056, 399, 385, 715, 582, 799, 161, 512, 629, 979, 250,  37, 213,
        !           124:        929, 413, 566, 336, 727, 160, 616,1170, 748, 282,1115, 325, 994, 189, 500,
        !           125:        913, 332,1118, 753, 946, 775,  59, 809, 782, 612, 909,1090, 223, 777, 940,
        !           126:        866,1032, 471, 298, 969, 192, 411, 721, 476, 910,1045,1027, 812, 352, 487,
        !           127:        215, 625, 808, 230, 602, 457, 900, 416, 985, 850, 908, 155, 670, 669,1054,
        !           128:        400,1126, 733, 647, 786, 195, 148, 362,1094, 389,1086,1166, 231, 436, 210,
        !           129:        333, 824, 785, 826, 658, 472, 639,1046,1028, 519, 422,  80, 924,1089, 547,
        !           130:    1157, 579,   2, 508,1040, 998, 902,1058, 600, 220, 805, 945, 140,1117, 179,
        !           131:        536, 191
        !           132: };
        !           133: 
        !           134: /**
        !           135:  * Trits and Polynomial Test Vectors
        !           136:  */
        !           137: static trits_test_t trits_tests[] = {
        !           138:        {       XOF_MGF1_SHA1, 20, 24,
        !           139:                chunk_from_chars(
        !           140:                                                0xED, 0xA5, 0xC3, 0xBC, 0xAF, 0xB3, 0x20, 0x7D,
        !           141:                                                0x14, 0xA1, 0x54, 0xF7, 0x8B, 0x37, 0xF2, 0x8D,
        !           142:                                                0x8C, 0x9B, 0xD5, 0x63, 0x57, 0x38, 0x11, 0xC2,
        !           143:                                                0xB5, 0xCA, 0xBF, 0x06, 0x43, 0x45, 0x19, 0xD5,
        !           144:                                                0xE7, 0x36, 0xD0, 0x29, 0x21, 0xDA, 0x02, 0x20,
        !           145:                                                0x45, 0xF6, 0x5F, 0x0F, 0x10, 0x04, 0x2A, 0xE3,
        !           146:                                                0x6A, 0x1D, 0xD5, 0x9F, 0x1D, 0x66, 0x44, 0x8F,
        !           147:                                                0xFA, 0xC6, 0xCA, 0xA4, 0x6E, 0x3B, 0x00, 0x66,
        !           148:                                                0xA6, 0xC9, 0x80, 0x5C, 0xF5, 0x2D, 0xD7, 0x72,
        !           149:                                                0xC6, 0xD4, 0x4F, 0x30, 0x72, 0xA2, 0xAD, 0xE0,
        !           150:                                                0x33, 0xE8, 0x55, 0xD5, 0xE6, 0xD6, 0x00, 0x1D,
        !           151:                                                0xA8, 0x68, 0xFF, 0x97, 0x36, 0x8A, 0xF4, 0xD6,
        !           152:                                                0xF1, 0xB6, 0x7E, 0x1F, 0x06, 0xCB, 0x57, 0xCB,
        !           153:                                                0x35, 0x38, 0xF2, 0x2D, 0xF6, 0x20),
        !           154:                chunk_from_chars(
        !           155:                                1, 2, 1, 0, 0,  1, 1, 1, 2, 0,  1, 0, 1, 1, 1,  0, 2, 0, 1, 1,
        !           156:                                0, 0, 0, 1, 1,  0, 2, 0, 2, 2,  1, 2, 2, 2, 1,  2, 1, 1, 0, 0,
        !           157:                                2, 0, 1, 1, 1,  0, 0, 0, 0, 1,  1, 2, 0, 0, 1,  0, 1, 0, 2, 0,
        !           158:                                0, 1, 0, 2, 1,  0, 0, 0, 2, 0,  0, 0, 1, 2, 2,  0, 0, 2, 0, 1,
        !           159:                                1, 2, 1, 1, 0,  0, 1, 1, 1, 2,  2, 1, 2, 0, 0,  2, 1, 0, 0, 1,
        !           160:                                0, 1, 1, 0, 0,  0, 1, 2, 2, 0,  1, 2, 1, 2, 0,  2, 0, 0, 0, 2,
        !           161:                                1, 2, 0, 0, 0,  2, 0, 0, 0, 2,  2, 1, 0, 2, 0,  1, 2, 0, 2, 1,
        !           162:                                0, 2, 2, 1, 0,  2, 1, 2, 2, 0,  2, 0, 2, 1, 2,  2, 0, 2, 0, 1,
        !           163:                                1, 2, 2, 2, 2,  1, 0, 1, 0, 2,  2, 0, 1, 1, 2,  2, 2, 0, 0, 1,
        !           164:                                0, 2, 0, 1, 0,  2, 1, 2, 1, 0,  1, 1, 2, 0, 0,  2, 1, 1, 2, 0,
        !           165:                                1, 2, 1, 1, 0,  1, 0, 2, 1, 1,  1, 2, 1, 0, 2,  0, 2, 0, 0, 2,
        !           166:                                2, 1, 0, 0, 2,  2, 0, 1, 1, 0,  0, 1, 1, 0, 1,  1, 2, 1, 2, 2,
        !           167:                                2, 0, 0, 0, 0,  1, 0, 0, 1, 2,  1, 2, 0, 2, 1,  1, 1, 0, 2, 2,
        !           168:                                1, 2, 2, 1, 0,  1, 0, 2, 2, 2,  1, 2, 1, 0, 0,  1, 0, 1, 1, 1,
        !           169:                                1, 1, 2, 0, 0,  2, 1, 0, 2, 1,  2, 1, 0, 2, 2,  0, 0, 1, 2, 1,
        !           170:                                2, 0, 1, 2, 1,  1, 2, 0, 2, 0,  2, 1, 1, 1, 0,  0, 0, 1, 2, 1,
        !           171:                                2, 2, 1, 2, 1,  1, 2, 1, 2, 0,  2, 2, 1, 0, 0,  1, 2, 0, 1, 1,
        !           172:                                2, 0, 0, 0, 1,  2, 2, 1, 2, 0,  0, 2, 1, 0, 2,  2, 2, 1, 1, 0,
        !           173:                                2, 1, 2, 1, 2,  2, 1, 2, 1, 1,  0, 1, 1, 1, 1,  2, 0, 2, 2, 1,
        !           174:                                0, 1, 1, 2, 1,  2, 0, 2, 1, 0,  1, 0, 1, 0, 1,  2, 0, 1, 1, 0,
        !           175:                                0, 1, 1, 2, 0,  2, 2, 0, 0, 0,  1, 1, 0, 1, 0,  1, 1, 0, 1, 1,
        !           176:                                0, 1, 2, 0, 1,  1, 0, 1, 2, 0,  0, 1, 2, 2, 0,  0, 2, 1, 2),
        !           177:                {
        !           178:                        {       9, 439, 2048, TRUE, 9 + (8 << 8) + (5 << 16),
        !           179:                                countof(indices_ees439ep1), indices_ees439ep1
        !           180:                        },
        !           181:                        {       11, 613, 2048, FALSE, 55,
        !           182:                                countof(indices_ees613ep1), indices_ees613ep1
        !           183:                        }
        !           184:                }
        !           185:        },
        !           186:        {       XOF_MGF1_SHA256, 32, 40,
        !           187:                chunk_from_chars(
        !           188:                                                0x52, 0xC5, 0xDD, 0x1E, 0xEF, 0x76, 0x1B, 0x53,
        !           189:                                                0x08, 0xE4, 0x86, 0x3F, 0x91, 0x12, 0x98, 0x69,
        !           190:                                                0xC5, 0x9D, 0xDE, 0xF6, 0xFC, 0xFA, 0x93, 0xCE,
        !           191:                                                0x32, 0x52, 0x66, 0xF9, 0xC9, 0x97, 0xF6, 0x42,
        !           192:                                                0x00, 0x2C, 0x64, 0xED, 0x1A, 0x6B, 0x14, 0x0A,
        !           193:                                                0x4B, 0x04, 0xCF, 0x6D, 0x2D, 0x82, 0x0A, 0x07,
        !           194:                                                0xA2, 0x3B, 0xDE, 0xCE, 0x19, 0x8A, 0x39, 0x43,
        !           195:                                                0x16, 0x61, 0x29, 0x98, 0x68, 0xEA, 0xE5, 0xCC,
        !           196:                                                0x0A, 0xF8, 0xE9, 0x71, 0x26, 0xF1, 0x07, 0x36,
        !           197:                                                0x2C, 0x07, 0x1E, 0xEB, 0xE4, 0x28, 0xA2, 0xF4,
        !           198:                                                0xA8, 0x12, 0xC0, 0xC8, 0x20, 0x37, 0xF8, 0xF2,
        !           199:                                                0x6C, 0xAF, 0xDC, 0x6F, 0x2E, 0xD0, 0x62, 0x58,
        !           200:                                                0xD2, 0x37, 0x03, 0x6D, 0xFA, 0x6E, 0x1A, 0xAC,
        !           201:                                                0x9F, 0xCA, 0x56, 0xC6, 0xA4, 0x52, 0x41, 0xE8,
        !           202:                                                0x0F, 0x1B, 0x0C, 0xB9, 0xE6, 0xBA, 0xDE, 0xE1,
        !           203:                                                0x03, 0x5E, 0xC2, 0xE5, 0xF8, 0xF4, 0xF3, 0x46,
        !           204:                                                0x3A, 0x12, 0xC0, 0x1F, 0x3A, 0x00, 0xD0, 0x91,
        !           205:                                                0x18, 0xDD, 0x53, 0xE4, 0x22, 0xF5, 0x26, 0xA4,
        !           206:                                                0x54, 0xEE, 0x20, 0xF0, 0x80),
        !           207:                chunk_from_chars(
        !           208:                                1, 2, 2, 2, 2,  1, 2, 2, 0, 0,  2, 0, 0, 0, 0,  1, 2, 2, 2, 0,
        !           209:                                2, 0, 0, 2, 2,  1, 2, 0, 0, 1,  2, 1, 0, 0, 0,  1, 0, 2, 2, 1,
        !           210:                                1, 2, 0, 0, 0,  1, 2, 0, 2, 2,  1, 2, 1, 0, 1,  0, 1, 2, 1, 1,
        !           211:                                1, 2, 0, 1, 0,  2, 1, 1, 0, 0,  0, 1, 2, 0, 0,  1, 2, 1, 2, 0,
        !           212:                                2, 1, 1, 1, 2,  2, 2, 2, 1, 0,  0, 2, 0, 2, 0,  1, 1, 0, 2, 2,
        !           213:                                2, 0, 1, 0, 2,  2, 1, 0, 1, 0,  1, 0, 0, 2, 2,  0, 0, 1, 2, 0,
        !           214:                                1, 1, 1, 0, 0,  2, 0, 2, 1, 2,  2, 2, 0, 0, 2,  1, 0, 2, 0, 1,
        !           215:                                0, 1, 2, 0, 1,  2, 0, 1, 0, 1,  2, 0, 2, 2, 0,  1, 2, 2, 1, 2,
        !           216:                                2, 2, 0, 2, 1,  1, 1, 0, 0, 1,  0, 2, 0, 0, 1,  0, 1, 2, 0, 0,
        !           217:                                1, 2, 1, 0, 2,  1, 1, 0, 0, 2,  1, 2, 2, 2, 1,  2, 1, 1, 2, 2,
        !           218:                                0, 2, 0, 0, 2,  0, 0, 1, 1, 2,  0, 0, 0, 1, 2,  1, 1, 1, 1, 0,
        !           219:                                0, 0, 2, 0, 2,  0, 2, 2, 1, 2,  2, 0, 0, 1, 1,  1, 0, 1, 0, 1,
        !           220:                                0, 1, 2, 2, 0,  2, 1, 1, 0, 2,  1, 2, 1, 2, 1,  0, 0, 1, 0, 0,
        !           221:                                1, 0, 1, 0, 2,  0, 2, 0, 0, 1,  2, 0, 2, 0, 1,  1, 0, 2, 0, 0,
        !           222:                                1, 2, 1, 2, 1,  2, 1, 0, 1, 1,  2, 2, 1, 1, 0,  0, 2, 1, 2, 0,
        !           223:                                1, 0, 2, 0, 0,  1, 2, 0, 2, 0,  1, 1, 2, 2, 2,  2, 0, 0, 1, 2,
        !           224:                                1, 1, 1, 0, 2,  1, 2, 2, 0, 2,  0, 1, 2, 2, 0,  1, 1, 1, 0, 0,
        !           225:                                2, 0, 1, 0, 1,  0, 2, 1, 2, 0,  2, 1, 2, 1, 2,  2, 0, 2, 1, 0,
        !           226:                                2, 1, 2, 0, 0,  2, 0, 1, 2, 1,  1, 2, 0, 0, 0,  0, 1, 2, 0, 1,
        !           227:                                2, 2, 1, 0, 0,  1, 2, 1, 2, 0,  0, 1, 1, 0, 0,  0, 1, 0, 0, 0,
        !           228:                                2, 0, 1, 2, 1,  2, 0, 0, 0, 2,  1, 0, 0, 0, 1,  2, 2, 0, 0, 0,
        !           229:                                2, 2, 1, 1, 0,  1, 0, 2, 2, 0,  2, 1, 2, 1, 0,  2, 2, 2, 0, 0,
        !           230:                                0, 1, 1, 2, 1,  0, 0, 0, 0, 1,  2, 2, 1, 2, 1,  2, 0, 2, 0, 2,
        !           231:                                1, 1, 1, 2, 1,  2, 1, 2, 1, 1,  0, 1, 0, 2, 0,  0, 0, 2, 1, 2,
        !           232:                                2, 2, 2, 0, 1,  1, 1, 0, 1, 0,  2, 0, 2, 1, 0,  1, 2, 1, 1, 0,
        !           233:                                1, 2, 1, 0, 0,  2, 1, 0, 1, 1,  2, 2, 1, 1, 1,  2, 2, 2, 1, 0,
        !           234:                                0, 0, 0, 1, 1,  0, 0, 2, 2, 2,  2, 2, 0, 1, 2,  0, 1, 2, 0, 1,
        !           235:                                1, 0, 1, 1, 2,  2, 0, 1, 1, 0,  2, 2, 1, 1, 1,  2, 1, 2, 2, 1,
        !           236:                                1, 0, 1, 0, 2,  2, 1, 0, 2, 2,  2, 2, 2, 1, 0,  2, 2, 2, 1, 2,
        !           237:                                0, 2, 0, 0, 0,  0, 0, 1, 2, 0,  1, 0, 1),
        !           238:                {
        !           239:                        {       13, 743, 2048, TRUE, 11 + (11 << 8) + (15 << 16),
        !           240:                                countof(indices_ees743ep1), indices_ees743ep1
        !           241:                        },
        !           242:                        {       12, 1171, 2048, FALSE, 106,
        !           243:                                countof(indices_ees1171ep1), indices_ees1171ep1
        !           244:                        }
        !           245:                }
        !           246:        }
        !           247: };
        !           248: 
        !           249: START_TEST(test_ntru_trits)
        !           250: {
        !           251:        ntru_trits_t *mask;
        !           252:        chunk_t trits;
        !           253: 
        !           254:        mask = TEST_FUNCTION(ntru, ntru_trits_create, trits_tests[_i].trits.len,
        !           255:                                                 XOF_UNDEFINED, trits_tests[_i].seed);
        !           256:        ck_assert(mask == NULL);
        !           257: 
        !           258:        mask = TEST_FUNCTION(ntru, ntru_trits_create, trits_tests[_i].trits.len,
        !           259:                                                 trits_tests[_i].alg, chunk_empty);
        !           260:        ck_assert(mask == NULL);
        !           261: 
        !           262:        mask = TEST_FUNCTION(ntru, ntru_trits_create, trits_tests[_i].trits.len,
        !           263:                                                 trits_tests[_i].alg, trits_tests[_i].seed);
        !           264:        ck_assert(mask);
        !           265: 
        !           266:        trits = chunk_create(mask->get_trits(mask), mask->get_size(mask));
        !           267:        ck_assert(chunk_equals(trits, trits_tests[_i].trits));
        !           268:        mask->destroy(mask);
        !           269: 
        !           270:        /* generate a multiple of 5 trits */
        !           271:        mask = TEST_FUNCTION(ntru, ntru_trits_create, 10, trits_tests[_i].alg,
        !           272:                                                 trits_tests[_i].seed);
        !           273:        ck_assert(mask);
        !           274: 
        !           275:        trits = chunk_create(mask->get_trits(mask), mask->get_size(mask));
        !           276:        ck_assert(chunk_equals(trits, chunk_create(trits_tests[_i].trits.ptr, 10)));
        !           277:        mask->destroy(mask);
        !           278: }
        !           279: END_TEST
        !           280: 
        !           281: START_TEST(test_ntru_poly)
        !           282: {
        !           283:        ntru_poly_t *poly;
        !           284:        uint16_t *indices;
        !           285:        chunk_t seed;
        !           286:        poly_test_t *p;
        !           287:        int j, n;
        !           288: 
        !           289:        seed = trits_tests[_i].seed;
        !           290:        seed.len = trits_tests[_i].seed_len;
        !           291: 
        !           292:        p = &trits_tests[_i].poly_test[0];
        !           293:        poly = TEST_FUNCTION(ntru, ntru_poly_create_from_seed, XOF_UNDEFINED, seed,
        !           294:                                                 p->c_bits, p->N, p->q, p->indices_len, p->indices_len,
        !           295:                                                 p->is_product_form);
        !           296:        ck_assert(poly == NULL);
        !           297: 
        !           298:        for (n = 0; n < 2; n++)
        !           299:        {
        !           300:                p = &trits_tests[_i].poly_test[n];
        !           301:                poly = TEST_FUNCTION(ntru, ntru_poly_create_from_seed,
        !           302:                                                        trits_tests[_i].alg, seed, p->c_bits, p->N, p->q,
        !           303:                                                        p->indices_len, p->indices_len, p->is_product_form);
        !           304:                ck_assert(poly != NULL && poly->get_size(poly) == p->indices_size);
        !           305: 
        !           306:                indices = poly->get_indices(poly);
        !           307:                for (j = 0; j < p->indices_size; j++)
        !           308:                {
        !           309:                        ck_assert(indices[j] == p->indices[j]);
        !           310:                }
        !           311:                poly->destroy(poly);
        !           312:        }
        !           313: }
        !           314: END_TEST
        !           315: 
        !           316: typedef struct {
        !           317:        uint16_t N;
        !           318:        uint16_t q;
        !           319:        bool is_product_form;
        !           320:        uint32_t indices_len_p;
        !           321:        uint32_t indices_len_m;
        !           322:        uint16_t *indices;
        !           323:        uint16_t *a;
        !           324:        uint16_t *c;
        !           325: } ring_mult_test_t;
        !           326: 
        !           327: uint16_t t1_indices[] = { 1, 6, 5, 3 };
        !           328: 
        !           329: uint16_t t1_a[] = { 1, 0, 0, 0, 0, 0, 0 };
        !           330: uint16_t t1_c[] = { 0, 1, 0, 7, 0, 7, 1 };
        !           331: 
        !           332: uint16_t t2_a[] = { 5, 0, 0, 0, 0, 0, 0 };
        !           333: uint16_t t2_c[] = { 0, 5, 0, 3, 0, 3, 5 };
        !           334: 
        !           335: uint16_t t3_a[]  = { 4, 0, 0, 0, 0, 0, 0 };
        !           336: uint16_t t3_c[]  = { 0, 4, 0, 4, 0, 4, 4 };
        !           337: 
        !           338: uint16_t t4_a[]  = { 0, 6, 0, 0, 0, 0, 0 };
        !           339: uint16_t t4_c[]  = { 6, 0, 6, 0, 2, 0, 2 };
        !           340: 
        !           341: uint16_t t5_a[]  = { 4, 6, 0, 0, 0, 0, 0 };
        !           342: uint16_t t5_c[]  = { 6, 4, 6, 4, 2, 4, 6 };
        !           343: 
        !           344: uint16_t t6_a[]  = { 0, 0, 3, 0, 0, 0, 0 };
        !           345: uint16_t t6_c[]  = { 5, 3, 0, 3, 0, 5, 0 };
        !           346: 
        !           347: uint16_t t7_a[]  = { 4, 6, 3, 0, 0, 0, 0 };
        !           348: uint16_t t7_c[]  = { 3, 7, 6, 7, 2, 1, 6 };
        !           349: 
        !           350: uint16_t t8_a[]  = { 0, 0, 0, 7, 0, 0, 0 };
        !           351: uint16_t t8_c[]  = { 0, 1, 7, 0, 7, 0, 1 };
        !           352: 
        !           353: uint16_t t9_a[]  = { 4, 6, 3, 7, 0, 0, 0 };
        !           354: uint16_t t9_c[]  = { 3, 0, 5, 7, 1, 1, 7 };
        !           355: 
        !           356: uint16_t t10_a[] = { 0, 0, 0, 0, 0, 1, 0 };
        !           357: uint16_t t10_c[] = { 0, 7, 0, 7, 1, 0, 1 };
        !           358: 
        !           359: uint16_t t11_a[] = { 4, 6, 3, 7, 0, 1, 0 };
        !           360: uint16_t t11_c[] = { 3, 7, 5, 6, 2, 1, 0 };
        !           361: 
        !           362: uint16_t t2_indices[] = { 1, 6, 5, 2, 3 };
        !           363: 
        !           364: uint16_t t12_c[] = { 0, 1, 7, 7, 0, 1, 1 };
        !           365: uint16_t t13_c[] = { 0, 1, 7, 7, 0, 7, 1 };
        !           366: uint16_t t14_c[] = { 0, 1, 0, 31, 0, 31, 1 };
        !           367: uint16_t t15_c[] = { 0, 5, 0, 2043, 0, 2043, 5 };
        !           368: uint16_t t16_c[] = { 0, 5, 0, 32763, 0, 32763, 5 };
        !           369: 
        !           370: uint16_t t3_indices[] = { 7, 2, 3, 5, 0, 2, 3, 10, 7, 0, 8, 2 };
        !           371: 
        !           372: uint16_t t17_a[] = { 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
        !           373: uint16_t t17_c[] = { 7, 1, 0, 1, 1, 7, 0, 7, 7, 7, 2 };
        !           374: 
        !           375: ring_mult_test_t ring_mult_tests[] = {
        !           376:        {  7,     8, FALSE, 2, 2, t1_indices, t1_a,  t1_c  },
        !           377:        {  7,     8, FALSE, 2, 2, t1_indices, t2_a,  t2_c  },
        !           378:        {  7,     8, FALSE, 2, 2, t1_indices, t3_a,  t3_c  },
        !           379:        {  7,     8, FALSE, 2, 2, t1_indices, t4_a,  t4_c  },
        !           380:        {  7,     8, FALSE, 2, 2, t1_indices, t5_a,  t5_c  },
        !           381:        {  7,     8, FALSE, 2, 2, t1_indices, t6_a,  t6_c  },
        !           382:        {  7,     8, FALSE, 2, 2, t1_indices, t7_a,  t7_c  },
        !           383:        {  7,     8, FALSE, 2, 2, t1_indices, t8_a,  t8_c  },
        !           384:        {  7,     8, FALSE, 2, 2, t1_indices, t9_a,  t9_c  },
        !           385:        {  7,     8, FALSE, 2, 2, t1_indices, t10_a, t10_c },
        !           386:        {  7,     8, FALSE, 2, 2, t1_indices, t11_a, t11_c },
        !           387:        {  7,     8, FALSE, 3, 2, t2_indices, t1_a,  t12_c },
        !           388:        {  7,     8, FALSE, 2, 3, t2_indices, t1_a,  t13_c },
        !           389:        {  7,    32, FALSE, 2, 2, t1_indices, t1_a,  t14_c },
        !           390:        {  7,  2048, FALSE, 2, 2, t1_indices, t2_a,  t15_c },
        !           391:        {  7, 32768, FALSE, 2, 2, t1_indices, t2_a,  t16_c },
        !           392:        { 11,     8, TRUE, 197121, 197121, t3_indices, t17_a,  t17_c },
        !           393: };
        !           394: 
        !           395: START_TEST(test_ntru_ring_mult)
        !           396: {
        !           397:        ntru_poly_t *poly;
        !           398:        ring_mult_test_t *t;
        !           399:        uint16_t *c;
        !           400:        int i;
        !           401: 
        !           402:        t = &ring_mult_tests[_i];
        !           403:        poly = TEST_FUNCTION(ntru, ntru_poly_create_from_data, t->indices, t->N,
        !           404:                                                 t->q, t->indices_len_p, t->indices_len_m,
        !           405:                                                 t->is_product_form);
        !           406:        ck_assert(poly != NULL);
        !           407: 
        !           408:        c = malloc(t->N * sizeof(uint16_t));
        !           409:        poly->ring_mult(poly, t->a, c);
        !           410: 
        !           411:        for (i = 0; i < t->N; i++)
        !           412:        {
        !           413:                ck_assert(c[i] == t->c[i]);
        !           414:        }
        !           415: 
        !           416:        free(c);
        !           417:        poly->destroy(poly);
        !           418: }
        !           419: END_TEST
        !           420: 
        !           421: int array_tests[] = { 0, 11, 12, 16 };
        !           422: 
        !           423: START_TEST(test_ntru_array)
        !           424: {
        !           425:        ntru_poly_t *poly;
        !           426:        ring_mult_test_t *t;
        !           427:        uint16_t *c;
        !           428:        int i;
        !           429: 
        !           430:        t = &ring_mult_tests[array_tests[_i]];
        !           431: 
        !           432:        poly = TEST_FUNCTION(ntru, ntru_poly_create_from_data, t->indices, t->N,
        !           433:                                                 t->q, t->indices_len_p, t->indices_len_m,
        !           434:                                                 t->is_product_form);
        !           435:        ck_assert(poly != NULL);
        !           436: 
        !           437:        c = malloc(t->N * sizeof(uint16_t));
        !           438:        poly->get_array(poly, c);
        !           439: 
        !           440:        for (i = 0; i < t->N; i++)
        !           441:        {
        !           442:                ck_assert(c[i] == t->c[i]);
        !           443:        }
        !           444: 
        !           445:        free(c);
        !           446:        poly->destroy(poly);
        !           447: }
        !           448: END_TEST
        !           449: 
        !           450: START_TEST(test_ntru_param_set)
        !           451: {
        !           452:        ck_assert(TEST_FUNCTION(ntru, ntru_param_set_get_by_id, -1) == NULL);
        !           453:        ck_assert(TEST_FUNCTION(ntru, ntru_param_set_get_by_id, 16) == NULL);
        !           454: }
        !           455: END_TEST
        !           456: 
        !           457: typedef struct {
        !           458:        ntru_param_set_id_t id;
        !           459:        chunk_t entropy;
        !           460:        chunk_t encoding;
        !           461: } privkey_test_t;
        !           462: 
        !           463: privkey_test_t privkey_tests[] = {
        !           464:        {
        !           465:                NTRU_EES401EP1,
        !           466:                chunk_from_chars(
        !           467:                                                0x0C, 0x2F, 0x24, 0xE1, 0xA4, 0x81, 0x26, 0xA2,
        !           468:                                                0x6C, 0xEA, 0xCD, 0x1A, 0xF3, 0xEB, 0x3D, 0xBF,
        !           469:                                                0xEA, 0xAE, 0xC3, 0x0D, 0xC1),
        !           470:                chunk_from_chars(
        !           471:                                                0x02, 0x03, 0x00, 0x02, 0x04, 0x3E, 0xF3, 0xCB,
        !           472:                                                0x7A, 0x58, 0x13, 0x75, 0xBB, 0x87, 0xF5, 0xBF,
        !           473:                                                0x2E, 0x18, 0xAE, 0x03, 0xAF, 0xB8, 0x33, 0x85,
        !           474:                                                0xD8, 0xBF, 0x8A, 0xB5, 0x8C, 0xA6, 0xDF, 0x03,
        !           475:                                                0x90, 0x1E, 0xE4, 0x83, 0xA4, 0x95, 0x40, 0xB5,
        !           476:                                                0x08, 0x92, 0x29, 0xD8, 0x83, 0xA8, 0x42, 0xB2,
        !           477:                                                0x69, 0xC2, 0x00, 0x8B, 0xAE, 0x80, 0x00, 0x4F,
        !           478:                                                0x3D, 0xDD, 0xFB, 0xDB, 0x9A, 0xD8, 0x0F, 0xFF,
        !           479:                                                0xBC, 0x21, 0xD5, 0xE6, 0x04, 0x9C, 0xDD, 0x3B,
        !           480:                                                0x2D, 0x16, 0x4B, 0xC7, 0x3D, 0xBE, 0xDE, 0xBB,
        !           481:                                                0x6F, 0xF4, 0x8A, 0x31, 0xCD, 0x23, 0x19, 0xC2,
        !           482:                                                0x3C, 0xE1, 0xE2, 0xEE, 0xE4, 0xE7, 0x2E, 0xFC,
        !           483:                                                0x5C, 0xDD, 0xAD, 0x0C, 0x9D, 0x98, 0xC5, 0x18,
        !           484:                                                0x2A, 0x80, 0x21, 0x93, 0x61, 0xC4, 0x9A, 0x16,
        !           485:                                                0xE8, 0x9B, 0xF7, 0x3B, 0x6D, 0x06, 0x91, 0x9E,
        !           486:                                                0x71, 0x59, 0xBE, 0x8E, 0x65, 0x61, 0xB2, 0x69,
        !           487:                                                0x9C, 0x82, 0x58, 0x0D, 0x63, 0x7A, 0x1F, 0x2A,
        !           488:                                                0x1C, 0x2C, 0x92, 0x8C, 0x8D, 0xCA, 0x2B, 0x45,
        !           489:                                                0x24, 0x79, 0xDB, 0x7F, 0x1D, 0x2F, 0xAB, 0x88,
        !           490:                                                0x8C, 0x1D, 0xE3, 0x15, 0x8F, 0xCD, 0x46, 0x8C,
        !           491:                                                0x45, 0x20, 0x88, 0x1C, 0x17, 0xE0, 0xE5, 0x89,
        !           492:                                                0xF4, 0x60, 0x56, 0x3C, 0x6B, 0x9F, 0x2A, 0xD9,
        !           493:                                                0xD0, 0xAE, 0x3B, 0xB6, 0xC2, 0xB7, 0x58, 0xC6,
        !           494:                                                0x6E, 0x09, 0x36, 0x21, 0x0B, 0xDD, 0xE9, 0x52,
        !           495:                                                0x33, 0x27, 0x39, 0xC8, 0x51, 0x59, 0x69, 0x25,
        !           496:                                                0xC6, 0x3D, 0x19, 0x5C, 0x5E, 0x74, 0xD0, 0x62,
        !           497:                                                0xD9, 0x26, 0x90, 0xC7, 0x64, 0x92, 0xA8, 0x72,
        !           498:                                                0xD1, 0x77, 0x1F, 0x78, 0xC5, 0x11, 0xBD, 0x5D,
        !           499:                                                0x3C, 0x1B, 0x1F, 0x8B, 0x5B, 0xE4, 0x5D, 0xA1,
        !           500:                                                0x27, 0x6D, 0x20, 0x24, 0x32, 0x53, 0xF3, 0xB0,
        !           501:                                                0xE6, 0x71, 0x61, 0xCC, 0xFC, 0x4A, 0x06, 0xDA,
        !           502:                                                0xBE, 0xD7, 0x9F, 0x2F, 0xEB, 0x44, 0xD0, 0x8A,
        !           503:                                                0x7D, 0x8E, 0x82, 0xF5, 0x84, 0xCF, 0x8E, 0xE5,
        !           504:                                                0x4B, 0xA4, 0x30, 0x77, 0xBD, 0x14, 0xB9, 0x75,
        !           505:                                                0x02, 0x68, 0xDF, 0x71, 0x89, 0x81, 0xF2, 0x95,
        !           506:                                                0xC3, 0x67, 0x6E, 0x37, 0xE4, 0xD0, 0xC9, 0x1E,
        !           507:                                                0x02, 0xDE, 0x2D, 0x79, 0x99, 0xE8, 0x7D, 0x5C,
        !           508:                                                0x99, 0xF2, 0x1A, 0xDE, 0x12, 0x9B, 0xD1, 0x83,
        !           509:                                                0x9B, 0x01, 0xD3, 0xEB, 0x2B, 0x8E, 0x9C, 0xA5,
        !           510:                                                0x19, 0xE8, 0x2E, 0xFE, 0x23, 0x6E, 0xAD, 0x8F,
        !           511:                                                0x3C, 0xAF, 0xB9, 0xE6, 0xDB, 0x07, 0xA4, 0x31,
        !           512:                                                0x02, 0x2B, 0x6A, 0xA0, 0xFB, 0x51, 0x6C, 0xD0,
        !           513:                                                0x26, 0xD5, 0xAD, 0x29, 0x65, 0x10, 0xCE, 0xF8,
        !           514:                                                0x84, 0x4D, 0x1E, 0x37, 0x92, 0xA2, 0xD1, 0xFA,
        !           515:                                                0xF6, 0xC0, 0x36, 0x4C, 0x23, 0x3A, 0x42, 0xAA,
        !           516:                                                0xB8, 0x0D, 0x4E, 0xD4, 0x40, 0x61, 0xD5, 0x36,
        !           517:                                                0x62, 0x23, 0x7C, 0x1C, 0x5E, 0xEA, 0x16, 0xAD,
        !           518:                                                0x4F, 0x30, 0xF9, 0x16, 0x99, 0xCE, 0xC5, 0x50,
        !           519:                                                0xAC, 0x8F, 0x6F, 0x98, 0xD7, 0xE3, 0x89, 0x6E,
        !           520:                                                0x3A, 0x12, 0xCE, 0xA7, 0xA4, 0x17, 0x74, 0xDC,
        !           521:                                                0xDB, 0xFA, 0xFF, 0xF9, 0x35, 0xD7, 0xF5, 0x77,
        !           522:                                                0x03, 0xF5, 0xBF, 0x81, 0x6C, 0x9F, 0x62, 0xA6,
        !           523:                                                0x8A, 0x5B, 0xA3, 0xEF, 0x9D, 0xC3, 0xF6, 0x3A,
        !           524:                                                0x6A, 0xC0, 0x42, 0x71, 0xAF, 0x90, 0xCA, 0x1D,
        !           525:                                                0x86, 0x78, 0xD7, 0x2C, 0xFE, 0xB6, 0x99, 0x15,
        !           526:                                                0x8C, 0x10, 0x42, 0x92, 0x2C, 0x05, 0x43, 0x92,
        !           527:                                                0x69, 0x05, 0x8D, 0x9E, 0xBC, 0xAB, 0x8F, 0x28,
        !           528:                                                0xAA, 0x4B, 0xFB, 0x25, 0xD9, 0xAD, 0x29, 0xFF,
        !           529:                                                0x33, 0x65, 0x14, 0xC3, 0x75, 0x1F, 0xCF, 0xFC,
        !           530:                                                0x20, 0x83, 0xBF, 0xB9, 0xA5, 0x4B, 0x7B, 0xD9,
        !           531:                                                0x07, 0x5C, 0xA1, 0xD1, 0x5A, 0x3E, 0x94, 0xF8,
        !           532:                                                0x03, 0xDE, 0xB8, 0x94, 0x11, 0x92, 0x80, 0x77,
        !           533:                                                0x57, 0x45, 0x1E, 0x6B, 0xA5, 0x15, 0xDB, 0x48,
        !           534:                                                0xB6, 0x9E, 0x02, 0xF1, 0x61, 0x4A, 0xAC, 0x1D,
        !           535:                                                0x49, 0xBC, 0xA9, 0x3F, 0x03, 0x50, 0xAC, 0x02,
        !           536:                                                0x8E, 0x84, 0xE0, 0x12, 0x37, 0x76, 0xBC, 0x4A,
        !           537:                                                0xF9, 0xC6, 0x74, 0x36, 0xFC, 0x92, 0x1D, 0x59,
        !           538:                                                0x0C, 0x04, 0xD2, 0x14, 0xB7, 0x11, 0xE9, 0xE2,
        !           539:                                                0xFE, 0x0C, 0xE1, 0xDA, 0x8B, 0xCA, 0x10, 0xA1,
        !           540:                                                0x60, 0xB6, 0x57, 0x51, 0x00, 0xD6, 0x5B, 0x55,
        !           541:                                                0x09, 0x60, 0xE8, 0x00, 0x40, 0x45, 0x56, 0xBA,
        !           542:                                                0x83, 0x1E, 0x36, 0x12, 0x59, 0x4B, 0x19, 0x00,
        !           543:                                                0x53, 0xAE, 0x62, 0xA6, 0x29, 0x39, 0xED, 0x87,
        !           544:                                                0x24, 0x37, 0x1E, 0x1B, 0xCF, 0x3F, 0x3A, 0x71,
        !           545:                                                0x31, 0xB5, 0x50, 0x8D, 0x4B, 0x53, 0x53, 0x75,
        !           546:                                                0x3F, 0x33, 0x39, 0x09, 0x2A, 0x78, 0xA8, 0x71,
        !           547:                                                0x3E, 0x63, 0xC5, 0x61, 0x73, 0xB6, 0xE1, 0x71,
        !           548:                                                0x16, 0xDA, 0x06, 0xBF, 0x3F, 0x22, 0x74, 0x89,
        !           549:                                                0x08, 0xD2, 0x05, 0x0B, 0x16, 0xC8, 0xF0, 0x17,
        !           550:                                                0x4E, 0xA2, 0x65, 0x67, 0x6D, 0x02)
        !           551:        },
        !           552:        {
        !           553:                NTRU_EES743EP1,
        !           554:                chunk_from_chars(
        !           555:                                                0x9B, 0xAB, 0x57, 0xDB, 0x2C, 0x60, 0x83, 0x48,
        !           556:                                                0x9F, 0xC9, 0x70, 0x8F, 0x69, 0xF7, 0xB4, 0xBB,
        !           557:                                                0x63, 0x5C, 0x9A, 0x63, 0x07, 0x80, 0x17, 0xD3,
        !           558:                                                0xCD, 0xB1, 0x57, 0x79, 0xFE, 0x8D, 0x81, 0x70,
        !           559:                                                0xEB, 0x50, 0xFA, 0x05, 0xFB, 0x97, 0xB2, 0xAB,
        !           560:                                                0x25, 0xED, 0xD8, 0x18, 0x1C, 0xFE, 0x96, 0x7D),
        !           561:                chunk_from_chars(
        !           562:                                                0x02, 0x03, 0x00, 0x06, 0x10, 0x14, 0x53, 0x73,
        !           563:                                                0x56, 0xF5, 0xA9, 0x34, 0xDE, 0xA6, 0x4D, 0x46,
        !           564:                                                0x05, 0x9E, 0x80, 0xAE, 0xB6, 0x74, 0x91, 0xFF,
        !           565:                                                0xFB, 0x48, 0xD3, 0x5C, 0x61, 0x12, 0x46, 0x02,
        !           566:                                                0x9F, 0x53, 0x45, 0x87, 0x47, 0xBD, 0x6B, 0x26,
        !           567:                                                0xF7, 0x36, 0xD3, 0x99, 0x1B, 0xD7, 0xEA, 0xA3,
        !           568:                                                0xA8, 0x94, 0xFF, 0x93, 0x46, 0x7C, 0x2C, 0x5F,
        !           569:                                                0x87, 0x8C, 0x38, 0xB3, 0x7B, 0xC6, 0x49, 0xE2,
        !           570:                                                0x88, 0xCA, 0x67, 0x89, 0xD0, 0x6D, 0x7C, 0xAE,
        !           571:                                                0x7C, 0x98, 0x84, 0xDA, 0x6B, 0x93, 0x92, 0xEF,
        !           572:                                                0x4A, 0xD1, 0x4A, 0xD2, 0x5B, 0x13, 0xF8, 0x59,
        !           573:                                                0x15, 0x2E, 0xBC, 0x70, 0x8D, 0x2D, 0xA9, 0x47,
        !           574:                                                0xA1, 0x99, 0x19, 0x3F, 0x67, 0xE8, 0x18, 0xA7,
        !           575:                                                0x17, 0x07, 0xB3, 0x14, 0xF6, 0x20, 0xA1, 0xD8,
        !           576:                                                0x33, 0xE8, 0x08, 0x6A, 0xC1, 0x39, 0x99, 0x08,
        !           577:                                                0xB4, 0x88, 0xEB, 0x48, 0x7D, 0xFB, 0xF5, 0xEF,
        !           578:                                                0x03, 0x0D, 0x25, 0xB7, 0x98, 0xF3, 0xF1, 0x15,
        !           579:                                                0x63, 0xE4, 0x0F, 0xFD, 0x54, 0x9F, 0x56, 0xE9,
        !           580:                                                0xD1, 0x44, 0xE5, 0x89, 0x66, 0x14, 0x91, 0x1C,
        !           581:                                                0xFD, 0xD6, 0xFD, 0x38, 0xAE, 0x39, 0xE3, 0xF7,
        !           582:                                                0xCD, 0x77, 0xC2, 0xEA, 0x2E, 0xE4, 0xB7, 0x2B,
        !           583:                                                0xBA, 0x7A, 0xD1, 0x75, 0xB8, 0x28, 0x65, 0x18,
        !           584:                                                0xF4, 0xC6, 0xBD, 0xD0, 0x17, 0x7E, 0xEA, 0x86,
        !           585:                                                0x7E, 0xFC, 0x95, 0xD6, 0x4C, 0x92, 0x01, 0xC3,
        !           586:                                                0xFF, 0x04, 0x9B, 0xF8, 0xD6, 0xB3, 0x8F, 0x72,
        !           587:                                                0xEF, 0x64, 0x09, 0x61, 0xF8, 0xE4, 0x48, 0xFC,
        !           588:                                                0x0D, 0xEE, 0xEF, 0xA2, 0x9F, 0x3A, 0x2B, 0x1A,
        !           589:                                                0xFB, 0x8B, 0xA0, 0x9C, 0x11, 0x0B, 0x97, 0x75,
        !           590:                                                0x30, 0x7C, 0xB8, 0x9F, 0xEE, 0x3B, 0x53, 0x85,
        !           591:                                                0x7D, 0xE9, 0xCB, 0xC4, 0x4D, 0xD7, 0x7F, 0x59,
        !           592:                                                0x10, 0x72, 0x19, 0x3A, 0xC9, 0x38, 0xFE, 0xE8,
        !           593:                                                0xB3, 0x06, 0x55, 0x8D, 0xA2, 0x5A, 0x3D, 0x79,
        !           594:                                                0x67, 0x0E, 0x90, 0xC9, 0x25, 0x6D, 0x45, 0x9C,
        !           595:                                                0x39, 0x79, 0x5F, 0x18, 0x35, 0x9F, 0xC1, 0x49,
        !           596:                                                0x08, 0x6F, 0x1C, 0x47, 0x09, 0x0D, 0x49, 0x7C,
        !           597:                                                0x3C, 0x7B, 0xB1, 0x09, 0x92, 0x1C, 0x4E, 0x5A,
        !           598:                                                0xDA, 0x74, 0x9E, 0xBB, 0x55, 0x9D, 0xBB, 0x1E,
        !           599:                                                0x43, 0x28, 0x62, 0xAF, 0x02, 0xB0, 0x1A, 0xEA,
        !           600:                                                0x13, 0x0A, 0x70, 0x0F, 0x60, 0x0F, 0x62, 0xA2,
        !           601:                                                0x4E, 0x1F, 0xB2, 0xEA, 0x06, 0xDD, 0x18, 0x02,
        !           602:                                                0x6C, 0xF3, 0x82, 0xF1, 0x80, 0x7F, 0xA7, 0x2F,
        !           603:                                                0xCC, 0xC6, 0x18, 0xEA, 0xFF, 0x1F, 0xAD, 0xC6,
        !           604:                                                0xBA, 0x0C, 0x0E, 0x04, 0xB2, 0x58, 0x1D, 0xB6,
        !           605:                                                0x01, 0xA3, 0x97, 0xDF, 0x7D, 0x9B, 0xB5, 0x0A,
        !           606:                                                0xAD, 0x30, 0x2B, 0xC5, 0x67, 0x40, 0x07, 0xF1,
        !           607:                                                0xD5, 0x6C, 0x11, 0x10, 0xE1, 0x69, 0x30, 0xAD,
        !           608:                                                0x90, 0x06, 0xDB, 0xF8, 0xEA, 0x92, 0x9B, 0x39,
        !           609:                                                0x57, 0x38, 0x7B, 0xE4, 0xB2, 0xA2, 0x89, 0xFD,
        !           610:                                                0xB1, 0x6D, 0x88, 0x41, 0x62, 0x4D, 0x18, 0xB6,
        !           611:                                                0x3F, 0x12, 0x81, 0xDE, 0xE6, 0xDC, 0x4A, 0x31,
        !           612:                                                0x61, 0x26, 0xB1, 0x4B, 0x95, 0xC1, 0x69, 0xDC,
        !           613:                                                0xDC, 0xAC, 0xD0, 0x15, 0xFC, 0x21, 0xC5, 0x20,
        !           614:                                                0x5F, 0x97, 0x76, 0x41, 0xC1, 0xF2, 0xD7, 0x95,
        !           615:                                                0x1D, 0x25, 0x23, 0x36, 0x86, 0xFA, 0x7E, 0xF4,
        !           616:                                                0x14, 0x9F, 0x9D, 0x9F, 0xB2, 0xBB, 0x25, 0x1D,
        !           617:                                                0xD5, 0x7A, 0x6F, 0x9E, 0xF7, 0xEF, 0x9D, 0x63,
        !           618:                                                0x1E, 0xD5, 0xDE, 0x6A, 0xE6, 0x46, 0x48, 0x1F,
        !           619:                                                0xE1, 0x0C, 0x4D, 0x82, 0xC9, 0x19, 0x3B, 0x65,
        !           620:                                                0xA4, 0x06, 0x13, 0xB7, 0x04, 0xB1, 0x62, 0xF7,
        !           621:                                                0x08, 0xAE, 0xED, 0x42, 0x6D, 0xCC, 0x6C, 0xA6,
        !           622:                                                0x06, 0x06, 0x41, 0x3E, 0x0C, 0x89, 0x4C, 0xBD,
        !           623:                                                0x00, 0x4F, 0x0E, 0xA9, 0x72, 0x06, 0x21, 0x82,
        !           624:                                                0xD2, 0xB6, 0x6C, 0xB0, 0xB0, 0x01, 0x5B, 0xDD,
        !           625:                                                0x05, 0xCE, 0x71, 0x6E, 0x00, 0x58, 0xC7, 0xA6,
        !           626:                                                0x5B, 0xF6, 0xFB, 0x6B, 0x62, 0xB1, 0xE8, 0x4D,
        !           627:                                                0xAC, 0xC0, 0x6B, 0xF4, 0x40, 0x69, 0xEE, 0x0D,
        !           628:                                                0xE7, 0x82, 0x61, 0x8D, 0x35, 0x01, 0x97, 0x4E,
        !           629:                                                0xF2, 0xCC, 0xF5, 0x7F, 0xBF, 0xE4, 0xEC, 0x9C,
        !           630:                                                0xC4, 0xD2, 0xD9, 0x65, 0x78, 0x98, 0xD8, 0xB0,
        !           631:                                                0xFA, 0xA8, 0xFB, 0xB0, 0xCE, 0x22, 0x5D, 0x0B,
        !           632:                                                0x27, 0xDF, 0x0E, 0x63, 0x42, 0xFE, 0x89, 0x13,
        !           633:                                                0x99, 0xB2, 0x02, 0x0B, 0xF6, 0x04, 0xB6, 0xAF,
        !           634:                                                0x9F, 0x8C, 0xA6, 0x17, 0x0D, 0xD9, 0x5B, 0x45,
        !           635:                                                0xE4, 0x08, 0x53, 0x51, 0xE0, 0xD5, 0x22, 0x72,
        !           636:                                                0xBE, 0xAD, 0x74, 0x69, 0xB9, 0xFB, 0x91, 0xF8,
        !           637:                                                0xC1, 0x89, 0x28, 0x71, 0x27, 0x62, 0xB1, 0xF0,
        !           638:                                                0xFD, 0x78, 0xBC, 0x82, 0xFE, 0x76, 0xBE, 0x7B,
        !           639:                                                0x47, 0x79, 0x32, 0x71, 0xAD, 0xD6, 0x76, 0x46,
        !           640:                                                0xFB, 0x32, 0xE8, 0x4B, 0x98, 0x9A, 0xC6, 0x85,
        !           641:                                                0xF2, 0xF1, 0x8A, 0xEC, 0xC2, 0x4E, 0x9B, 0x2F,
        !           642:                                                0x2D, 0x6F, 0xC9, 0x9B, 0xB6, 0x14, 0x35, 0x6D,
        !           643:                                                0xD6, 0x5B, 0xF3, 0x02, 0x5A, 0xE5, 0xBD, 0x00,
        !           644:                                                0xF7, 0x6E, 0x51, 0xA7, 0xDB, 0x19, 0xAE, 0x01,
        !           645:                                                0x01, 0x05, 0x94, 0x23, 0xF7, 0x5B, 0x07, 0x79,
        !           646:                                                0xFF, 0x39, 0x58, 0x9C, 0x2A, 0xF7, 0x7E, 0x5D,
        !           647:                                                0x81, 0xF9, 0x59, 0xFE, 0xB9, 0x9A, 0x96, 0x63,
        !           648:                                                0x1F, 0x65, 0xF6, 0xF0, 0x3D, 0xEA, 0xD7, 0xC2,
        !           649:                                                0x8A, 0xCF, 0xB5, 0x58, 0x74, 0x77, 0x23, 0xD6,
        !           650:                                                0x72, 0x58, 0xA8, 0xAE, 0x31, 0x8A, 0x59, 0xEA,
        !           651:                                                0x69, 0x14, 0x6A, 0x20, 0x78, 0x79, 0x28, 0x5A,
        !           652:                                                0xE1, 0x76, 0x6F, 0xA6, 0x1A, 0x9E, 0x47, 0xD2,
        !           653:                                                0xAF, 0x63, 0xF8, 0x06, 0xF6, 0xD8, 0xD5, 0x14,
        !           654:                                                0xA8, 0xD1, 0xEE, 0x96, 0xCE, 0xBB, 0x8E, 0x22,
        !           655:                                                0x69, 0x2F, 0x52, 0x06, 0xB6, 0x6F, 0xC8, 0x99,
        !           656:                                                0x96, 0xEA, 0xC6, 0x1D, 0x96, 0x4C, 0x69, 0x95,
        !           657:                                                0xFE, 0x74, 0x04, 0x3C, 0x55, 0xD9, 0x5F, 0xE0,
        !           658:                                                0x41, 0x21, 0x43, 0x21, 0x5A, 0x50, 0x5D, 0x8B,
        !           659:                                                0xE8, 0xB2, 0x51, 0x1B, 0x7C, 0x63, 0x50, 0xAE,
        !           660:                                                0x97, 0x4F, 0xBA, 0x7D, 0xF2, 0xB6, 0xB6, 0x16,
        !           661:                                                0x1D, 0x47, 0x9E, 0x19, 0x68, 0xD4, 0x6B, 0x2B,
        !           662:                                                0x75, 0xCD, 0xAE, 0x65, 0x33, 0x38, 0xF6, 0x6D,
        !           663:                                                0xC7, 0x3E, 0x46, 0x98, 0x9E, 0x98, 0x8B, 0x45,
        !           664:                                                0x11, 0xA7, 0x12, 0x05, 0xB0, 0x01, 0xC3, 0x51,
        !           665:                                                0xA0, 0xEE, 0x7C, 0x16, 0xD1, 0x42, 0x96, 0xC4,
        !           666:                                                0xF0, 0x7B, 0x71, 0xCD, 0x50, 0x38, 0xA4, 0xB0,
        !           667:                                                0x6E, 0x6F, 0xE0, 0xBD, 0xC4, 0xF7, 0x96, 0x2B,
        !           668:                                                0xF1, 0x6D, 0x9F, 0xF3, 0x71, 0x89, 0xFA, 0xB4,
        !           669:                                                0x44, 0xA4, 0x32, 0xDC, 0xB2, 0x55, 0x13, 0x31,
        !           670:                                                0x83, 0x29, 0x66, 0x21, 0x3E, 0x89, 0xF8, 0x78,
        !           671:                                                0x97, 0x9C, 0x64, 0xF9, 0x2C, 0x0A, 0x88, 0xBC,
        !           672:                                                0xCA, 0x6F, 0x83, 0x42, 0xF6, 0xD7, 0x00, 0xC4,
        !           673:                                                0x19, 0x52, 0xB0, 0x31, 0xA8, 0xBA, 0xE8, 0xD4,
        !           674:                                                0xAD, 0x4B, 0x5D, 0xC0, 0x01, 0x20, 0x6C, 0xBB,
        !           675:                                                0x1D, 0x9A, 0x1D, 0xD4, 0x19, 0xFD, 0x33, 0xAB,
        !           676:                                                0xA0, 0x54, 0x50, 0x91, 0xE9, 0x75, 0x5C, 0x7E,
        !           677:                                                0x7E, 0xB3, 0x24, 0x79, 0xAE, 0x10, 0x3C, 0xB4,
        !           678:                                                0xB7, 0x0A, 0x1D, 0x86, 0xAD, 0x06, 0x95, 0xCB,
        !           679:                                                0x84, 0x9B, 0x0E, 0x8B, 0x77, 0x7E, 0x3E, 0xD2,
        !           680:                                                0xA6, 0xDF, 0xAD, 0x4E, 0xFB, 0x69, 0x23, 0xAC,
        !           681:                                                0x7A, 0xCB, 0xAA, 0xB0, 0x22, 0xDD, 0xD2, 0xC6,
        !           682:                                                0xC7, 0xAD, 0xD7, 0xDE, 0xEC, 0x6F, 0x08, 0x41,
        !           683:                                                0x54, 0xD5, 0x52, 0xDC, 0x77, 0xE4, 0x72, 0xF9,
        !           684:                                                0x16, 0xB1, 0xC9, 0xAF, 0xB1, 0x3B, 0x18, 0x99,
        !           685:                                                0x20, 0x9F, 0x79, 0x63, 0x7B, 0x07, 0xC7, 0x35,
        !           686:                                                0xDF, 0xBB, 0xCE, 0x66, 0x93, 0x1B, 0xF5, 0x82,
        !           687:                                                0x25, 0x67, 0xC1, 0xF2, 0xF0, 0x89, 0x0F, 0xEF,
        !           688:                                                0x84, 0x0D, 0x63, 0xB6, 0x7B, 0xD0, 0x40, 0x8E,
        !           689:                                                0xDB, 0x94, 0xCC, 0x71, 0x3C, 0xDB, 0x36, 0x14,
        !           690:                                                0x34, 0xFD, 0xA0, 0xB0, 0xC1, 0x45, 0x31, 0xF8,
        !           691:                                                0x8D, 0xD8, 0x23, 0xB1, 0x05, 0x14, 0xA9, 0x55,
        !           692:                                                0x3A, 0x1A, 0x37, 0x48, 0x68, 0x89, 0x3F, 0x15,
        !           693:                                                0x25, 0xD4, 0x99, 0x53, 0x4C, 0x85, 0x98, 0x78,
        !           694:                                                0x1D, 0x35, 0x4A, 0x83, 0x79, 0x9A, 0x29, 0x90,
        !           695:                                                0x2B, 0x45, 0x76, 0x0C, 0x13, 0x80, 0x4A, 0xE0,
        !           696:                                                0x40, 0xED, 0x6B, 0x2E, 0x2A, 0x43, 0xA9, 0x28,
        !           697:                                                0xB0, 0x2F, 0x89, 0x01, 0x6B, 0x39, 0x8C, 0x5E,
        !           698:                                                0x80, 0x61, 0xD9, 0xEE, 0x0F, 0x41, 0x75, 0xB5,
        !           699:                                                0xAE, 0xB6, 0xC2, 0x42, 0x49, 0x8D, 0x89, 0xD8,
        !           700:                                                0xF4, 0x78, 0x1D, 0x90, 0x46, 0x26, 0x4C, 0x56,
        !           701:                                                0xB7, 0xC0, 0xD9, 0x98, 0x7B, 0x07, 0xA1, 0x20)
        !           702:        }
        !           703: };
        !           704: 
        !           705: START_TEST(test_ntru_privkey)
        !           706: {
        !           707:        rng_t *entropy;
        !           708:        drbg_t *drbg;
        !           709:        ntru_private_key_t *privkey;
        !           710:        ntru_public_key_t *pubkey;
        !           711:        ntru_param_set_t *params;
        !           712:        uint32_t strength;
        !           713:        chunk_t encoding, privkey_encoding, pubkey_encoding;
        !           714: 
        !           715:        params = TEST_FUNCTION(ntru, ntru_param_set_get_by_id,
        !           716:                                                   privkey_tests[_i].id);
        !           717:        strength = params->sec_strength_len * BITS_PER_BYTE;
        !           718: 
        !           719:        /* entropy rng will be owned by drbg */
        !           720:        entropy = rng_tester_create(privkey_tests[_i].entropy);
        !           721:        drbg = lib->crypto->create_drbg(lib->crypto, DRBG_HMAC_SHA256, strength,
        !           722:                                                                        entropy, chunk_from_str("IKE NTRU-KE"));
        !           723:        ck_assert(drbg != NULL);
        !           724: 
        !           725:        privkey = TEST_FUNCTION(ntru, ntru_private_key_create, drbg, params);
        !           726:        ck_assert(privkey);
        !           727:        ck_assert(privkey->get_id(privkey) == privkey_tests[_i].id);
        !           728: 
        !           729:        privkey_encoding = privkey->get_encoding(privkey);
        !           730:        encoding = privkey_tests[_i].encoding;
        !           731:        ck_assert(chunk_equals(privkey_encoding, encoding));
        !           732: 
        !           733:        /* load private key as a packed blob */
        !           734:        privkey->destroy(privkey);
        !           735:        privkey = TEST_FUNCTION(ntru, ntru_private_key_create_from_data,
        !           736:                                                        drbg, chunk_empty);
        !           737:        ck_assert(privkey == NULL);
        !           738: 
        !           739:        encoding = chunk_clone(encoding);
        !           740:        encoding.ptr[0] = NTRU_PUBKEY_TAG;
        !           741:        privkey = TEST_FUNCTION(ntru, ntru_private_key_create_from_data,
        !           742:                                                        drbg, encoding);
        !           743:        ck_assert(privkey == NULL);
        !           744: 
        !           745:        encoding.ptr[0] = NTRU_PRIVKEY_TRITS_TAG;
        !           746:        privkey = TEST_FUNCTION(ntru, ntru_private_key_create_from_data,
        !           747:                                                        drbg, encoding);
        !           748:        if (params->is_product_form)
        !           749:        {
        !           750:                ck_assert(privkey == NULL);
        !           751:        }
        !           752:        else
        !           753:        {
        !           754:                ck_assert(privkey != NULL);
        !           755:                privkey->destroy(privkey);
        !           756:        }
        !           757: 
        !           758:        encoding.ptr[0] = NTRU_PRIVKEY_INDICES_TAG;
        !           759:        privkey = TEST_FUNCTION(ntru, ntru_private_key_create_from_data,
        !           760:                                                        drbg, encoding);
        !           761:        if (params->is_product_form)
        !           762:        {
        !           763:                ck_assert(privkey != NULL);
        !           764:                privkey->destroy(privkey);
        !           765:        }
        !           766:        else
        !           767:        {
        !           768:                ck_assert(privkey == NULL);
        !           769:        }
        !           770: 
        !           771:        encoding.ptr[0] = NTRU_PRIVKEY_DEFAULT_TAG;
        !           772:        encoding.ptr[1] = NTRU_OID_LEN - 1;
        !           773:        privkey = TEST_FUNCTION(ntru, ntru_private_key_create_from_data,
        !           774:                                                        drbg, encoding);
        !           775:        ck_assert(privkey == NULL);
        !           776: 
        !           777:        encoding.ptr[1] = NTRU_OID_LEN;
        !           778:        encoding.ptr[2] = 0xff;
        !           779:        privkey = TEST_FUNCTION(ntru, ntru_private_key_create_from_data,
        !           780:                                                        drbg, encoding);
        !           781:        ck_assert(privkey == NULL);
        !           782: 
        !           783:        encoding.ptr[2] = params->oid[0];
        !           784:        privkey = TEST_FUNCTION(ntru, ntru_private_key_create_from_data,
        !           785:                                                        drbg, encoding);
        !           786:        privkey_encoding = privkey->get_encoding(privkey);
        !           787:        ck_assert(chunk_equals(privkey_encoding, encoding));
        !           788: 
        !           789:        pubkey = privkey->get_public_key(privkey);
        !           790:        pubkey_encoding = pubkey->get_encoding(pubkey);
        !           791: 
        !           792:        encoding.ptr[0] = NTRU_PUBKEY_TAG;
        !           793:        encoding.len = pubkey_encoding.len;
        !           794:        ck_assert(chunk_equals(pubkey_encoding, encoding));
        !           795: 
        !           796:        /* load public key as a packed blob */
        !           797:        pubkey->destroy(pubkey);
        !           798:        pubkey = TEST_FUNCTION(ntru, ntru_public_key_create_from_data,
        !           799:                                                   drbg, encoding);
        !           800:        pubkey_encoding = pubkey->get_encoding(pubkey);
        !           801:        ck_assert(chunk_equals(pubkey_encoding, encoding));
        !           802: 
        !           803:        chunk_free(&encoding);
        !           804:        privkey->destroy(privkey);
        !           805:        pubkey->destroy(pubkey);
        !           806:        drbg->destroy(drbg);
        !           807: }
        !           808: END_TEST
        !           809: 
        !           810: START_TEST(test_ntru_ke)
        !           811: {
        !           812:        chunk_t pub_key, cipher_text, i_shared_secret, r_shared_secret;
        !           813:        diffie_hellman_t *i_ntru, *r_ntru;
        !           814:        char buf[10];
        !           815:        int k, n, len;
        !           816: 
        !           817:        k = (_i) / countof(parameter_sets);
        !           818:        n = (_i) % countof(parameter_sets);
        !           819: 
        !           820:        len = snprintf(buf, sizeof(buf), "%N", diffie_hellman_group_names,
        !           821:                                   params[k].group);
        !           822:        ck_assert(len == 8);
        !           823:        ck_assert(streq(buf, params[k].group_name));
        !           824: 
        !           825:        lib->settings->set_str(lib->settings,
        !           826:                                "libstrongswan.plugins.ntru.parameter_set", parameter_sets[n]);
        !           827: 
        !           828:        i_ntru = lib->crypto->create_dh(lib->crypto, params[k].group);
        !           829:        ck_assert(i_ntru != NULL);
        !           830:        ck_assert(i_ntru->get_dh_group(i_ntru) == params[k].group);
        !           831: 
        !           832:        ck_assert(i_ntru->get_my_public_value(i_ntru, &pub_key));
        !           833:        ck_assert(pub_key.len > 0);
        !           834: 
        !           835:        r_ntru = lib->crypto->create_dh(lib->crypto, params[k].group);
        !           836:        ck_assert(r_ntru != NULL);
        !           837: 
        !           838:        ck_assert(r_ntru->set_other_public_value(r_ntru, pub_key));
        !           839:        ck_assert(r_ntru->get_my_public_value(r_ntru, &cipher_text));
        !           840:        ck_assert(cipher_text.len > 0);
        !           841: 
        !           842:        ck_assert(r_ntru->get_shared_secret(r_ntru, &r_shared_secret));
        !           843:        ck_assert(r_shared_secret.len > 0);
        !           844: 
        !           845:        ck_assert(i_ntru->set_other_public_value(i_ntru, cipher_text));
        !           846:        ck_assert(i_ntru->get_shared_secret(i_ntru, &i_shared_secret));
        !           847:        ck_assert(chunk_equals(i_shared_secret, r_shared_secret));
        !           848: 
        !           849:        chunk_clear(&i_shared_secret);
        !           850:        chunk_clear(&r_shared_secret);
        !           851:        chunk_free(&pub_key);
        !           852:        chunk_free(&cipher_text);
        !           853:        i_ntru->destroy(i_ntru);
        !           854:        r_ntru->destroy(r_ntru);
        !           855: }
        !           856: END_TEST
        !           857: 
        !           858: START_TEST(test_ntru_retransmission)
        !           859: {
        !           860:        diffie_hellman_t *i_ntru;
        !           861:        chunk_t pub_key1, pub_key2;
        !           862: 
        !           863:        i_ntru = lib->crypto->create_dh(lib->crypto, NTRU_256_BIT);
        !           864:        ck_assert(i_ntru->get_my_public_value(i_ntru, &pub_key1));
        !           865:        ck_assert(i_ntru->get_my_public_value(i_ntru, &pub_key2));
        !           866:        ck_assert(chunk_equals(pub_key1, pub_key2));
        !           867: 
        !           868:        chunk_free(&pub_key1);
        !           869:        chunk_free(&pub_key2);
        !           870:        i_ntru->destroy(i_ntru);
        !           871: }
        !           872: END_TEST
        !           873: 
        !           874: chunk_t oid_tests[] = {
        !           875:        { NULL, 0 },
        !           876:        chunk_from_chars(0x00),
        !           877:        chunk_from_chars(0x01),
        !           878:        chunk_from_chars(0x02),
        !           879:        chunk_from_chars(0x02, 0x03, 0x00, 0x03, 0x10),
        !           880:        chunk_from_chars(0x01, 0x04, 0x00, 0x03, 0x10),
        !           881:        chunk_from_chars(0x01, 0x03, 0x00, 0x03, 0x10),
        !           882:        chunk_from_chars(0x01, 0x03, 0xff, 0x03, 0x10),
        !           883: };
        !           884: 
        !           885: START_TEST(test_ntru_pubkey_oid)
        !           886: {
        !           887:        diffie_hellman_t *r_ntru;
        !           888:        chunk_t cipher_text;
        !           889: 
        !           890:        r_ntru = lib->crypto->create_dh(lib->crypto, NTRU_128_BIT);
        !           891:        ck_assert(!r_ntru->set_other_public_value(r_ntru, oid_tests[_i]));
        !           892:        ck_assert(r_ntru->get_my_public_value(r_ntru, &cipher_text));
        !           893:        ck_assert(cipher_text.len == 0);
        !           894:        r_ntru->destroy(r_ntru);
        !           895: }
        !           896: END_TEST
        !           897: 
        !           898: START_TEST(test_ntru_wrong_set)
        !           899: {
        !           900:        diffie_hellman_t *i_ntru, *r_ntru;
        !           901:        chunk_t pub_key, cipher_text;
        !           902: 
        !           903:        lib->settings->set_str(lib->settings,
        !           904:                                                  "libstrongswan.plugins.ntru.parameter_set",
        !           905:                                                  "x9_98_bandwidth");
        !           906:        i_ntru = lib->crypto->create_dh(lib->crypto, NTRU_112_BIT);
        !           907:        ck_assert(i_ntru->get_my_public_value(i_ntru, &pub_key));
        !           908: 
        !           909:        lib->settings->set_str(lib->settings,
        !           910:                                                  "libstrongswan.plugins.ntru.parameter_set",
        !           911:                                                  "optimum");
        !           912:        r_ntru = lib->crypto->create_dh(lib->crypto, NTRU_112_BIT);
        !           913:        ck_assert(!r_ntru->set_other_public_value(r_ntru, pub_key));
        !           914:        ck_assert(r_ntru->get_my_public_value(r_ntru, &cipher_text));
        !           915:        ck_assert(cipher_text.len == 0);
        !           916: 
        !           917:        chunk_free(&pub_key);
        !           918:        chunk_free(&cipher_text);
        !           919:        i_ntru->destroy(i_ntru);
        !           920:        r_ntru->destroy(r_ntru);
        !           921: }
        !           922: END_TEST
        !           923: 
        !           924: START_TEST(test_ntru_ciphertext)
        !           925: {
        !           926:        char buf_00[604], buf_ff[604];
        !           927: 
        !           928:        chunk_t test[] = {
        !           929:                chunk_empty,
        !           930:                chunk_from_chars(0x00),
        !           931:                chunk_create(buf_00, sizeof(buf_00)),
        !           932:                chunk_create(buf_ff, sizeof(buf_ff)),
        !           933:        };
        !           934: 
        !           935:        diffie_hellman_t *i_ntru;
        !           936:        chunk_t pub_key, shared_secret;
        !           937:        int i;
        !           938: 
        !           939:        memset(buf_00, 0x00, sizeof(buf_00));
        !           940:        memset(buf_ff, 0xff, sizeof(buf_ff));
        !           941: 
        !           942:        for (i = 0; i < countof(test); i++)
        !           943:        {
        !           944:                i_ntru = lib->crypto->create_dh(lib->crypto, NTRU_128_BIT);
        !           945:                ck_assert(i_ntru->get_my_public_value(i_ntru, &pub_key));
        !           946:                ck_assert(!i_ntru->set_other_public_value(i_ntru, test[i]));
        !           947:                ck_assert(!i_ntru->get_shared_secret(i_ntru, &shared_secret));
        !           948:                ck_assert(shared_secret.len == 0);
        !           949: 
        !           950:                chunk_free(&pub_key);
        !           951:                i_ntru->destroy(i_ntru);
        !           952:        }
        !           953: }
        !           954: END_TEST
        !           955: 
        !           956: START_TEST(test_ntru_wrong_ciphertext)
        !           957: {
        !           958:        diffie_hellman_t *i_ntru, *r_ntru, *m_ntru;
        !           959:        chunk_t pub_key_i, pub_key_m, cipher_text, shared_secret;
        !           960: 
        !           961:        i_ntru = lib->crypto->create_dh(lib->crypto, NTRU_128_BIT);
        !           962:        r_ntru = lib->crypto->create_dh(lib->crypto, NTRU_128_BIT);
        !           963:        m_ntru = lib->crypto->create_dh(lib->crypto, NTRU_128_BIT);
        !           964: 
        !           965:        ck_assert(i_ntru->get_my_public_value(i_ntru, &pub_key_i));
        !           966:        ck_assert(m_ntru->get_my_public_value(m_ntru, &pub_key_m));
        !           967:        ck_assert(r_ntru->set_other_public_value(r_ntru, pub_key_m));
        !           968:        ck_assert(r_ntru->get_my_public_value(r_ntru, &cipher_text));
        !           969:        ck_assert(!i_ntru->set_other_public_value(i_ntru, cipher_text));
        !           970:        ck_assert(!i_ntru->get_shared_secret(i_ntru, &shared_secret));
        !           971:        ck_assert(shared_secret.len == 0);
        !           972: 
        !           973:        chunk_free(&pub_key_i);
        !           974:        chunk_free(&pub_key_m);
        !           975:        chunk_free(&cipher_text);
        !           976:        i_ntru->destroy(i_ntru);
        !           977:        m_ntru->destroy(m_ntru);
        !           978:        r_ntru->destroy(r_ntru);
        !           979: }
        !           980: END_TEST
        !           981: 
        !           982: Suite *ntru_suite_create()
        !           983: {
        !           984:        Suite *s;
        !           985:        TCase *tc;
        !           986: 
        !           987:        s = suite_create("ntru");
        !           988: 
        !           989:        tc = tcase_create("trits");
        !           990:        tcase_add_loop_test(tc, test_ntru_trits, 0, countof(trits_tests));
        !           991:        suite_add_tcase(s, tc);
        !           992: 
        !           993:        tc = tcase_create("poly");
        !           994:        tcase_add_loop_test(tc, test_ntru_poly, 0, countof(trits_tests));
        !           995:        suite_add_tcase(s, tc);
        !           996: 
        !           997:        tc = tcase_create("ring_mult");
        !           998:        tcase_add_loop_test(tc, test_ntru_ring_mult, 0, countof(ring_mult_tests));
        !           999:        suite_add_tcase(s, tc);
        !          1000: 
        !          1001:        tc = tcase_create("array");
        !          1002:        tcase_add_loop_test(tc, test_ntru_array, 0, countof(array_tests));
        !          1003:        suite_add_tcase(s, tc);
        !          1004: 
        !          1005:        tc = tcase_create("param_set");
        !          1006:        tcase_add_test(tc, test_ntru_param_set);
        !          1007:        suite_add_tcase(s, tc);
        !          1008: 
        !          1009:        tc = tcase_create("privkey");
        !          1010:        tcase_add_loop_test(tc, test_ntru_privkey, 0, countof(privkey_tests));
        !          1011:        suite_add_tcase(s, tc);
        !          1012: 
        !          1013:        tc = tcase_create("ke");
        !          1014:        tcase_add_loop_test(tc, test_ntru_ke, 0,
        !          1015:                                                countof(params) * countof(parameter_sets));
        !          1016:        suite_add_tcase(s, tc);
        !          1017: 
        !          1018:        tc = tcase_create("retransmission");
        !          1019:        tcase_add_test(tc, test_ntru_retransmission);
        !          1020:        suite_add_tcase(s, tc);
        !          1021: 
        !          1022:        tc = tcase_create("pubkey_oid");
        !          1023:        tcase_add_loop_test(tc, test_ntru_pubkey_oid, 0, countof(oid_tests));
        !          1024:        suite_add_tcase(s, tc);
        !          1025: 
        !          1026:        tc = tcase_create("wrong_set");
        !          1027:        tcase_add_test(tc, test_ntru_wrong_set);
        !          1028:        suite_add_tcase(s, tc);
        !          1029: 
        !          1030:        tc = tcase_create("ciphertext");
        !          1031:        tcase_add_test(tc, test_ntru_ciphertext);
        !          1032:        suite_add_tcase(s, tc);
        !          1033: 
        !          1034:        tc = tcase_create("wrong_ciphertext");
        !          1035:        tcase_add_test(tc, test_ntru_wrong_ciphertext);
        !          1036:        suite_add_tcase(s, tc);
        !          1037:        return s;
        !          1038: }

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