Annotation of embedaddon/strongswan/scripts/dh_speed.c, revision 1.1

1.1     ! misho       1: /*
        !             2:  * Copyright (C) 2009 Martin Willi
        !             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 <stdio.h>
        !            17: #include <time.h>
        !            18: #include <assert.h>
        !            19: #include <library.h>
        !            20: #include <utils/debug.h>
        !            21: #include <crypto/diffie_hellman.h>
        !            22: 
        !            23: static void usage()
        !            24: {
        !            25:        printf("usage: dh_speed plugins rounds group1 [group2 [...]]\n");
        !            26:        exit(1);
        !            27: }
        !            28: 
        !            29: struct {
        !            30:        char *name;
        !            31:        diffie_hellman_group_t group;
        !            32: } groups[] = {
        !            33:        {"modp768",                     MODP_768_BIT},
        !            34:        {"modp1024",            MODP_1024_BIT},
        !            35:        {"modp1024s160",        MODP_1024_160},
        !            36:        {"modp1536",            MODP_1536_BIT},
        !            37:        {"modp2048",            MODP_2048_BIT},
        !            38:        {"modp2048s224",        MODP_2048_224},
        !            39:        {"modp2048s256",        MODP_2048_256},
        !            40:        {"modp3072",            MODP_3072_BIT},
        !            41:        {"modp4096",            MODP_4096_BIT},
        !            42:        {"modp6144",            MODP_6144_BIT},
        !            43:        {"modp8192",            MODP_8192_BIT},
        !            44:        {"ecp256",                      ECP_256_BIT},
        !            45:        {"ecp384",                      ECP_384_BIT},
        !            46:        {"ecp521",                      ECP_521_BIT},
        !            47:        {"ecp192",                      ECP_192_BIT},
        !            48:        {"ecp224",                      ECP_224_BIT},
        !            49:        {"curve25519",          CURVE_25519},
        !            50:        {"curve448",            CURVE_448},
        !            51: };
        !            52: 
        !            53: static void start_timing(struct timespec *start)
        !            54: {
        !            55:        clock_gettime(CLOCK_THREAD_CPUTIME_ID, start);
        !            56: }
        !            57: 
        !            58: static double end_timing(struct timespec *start)
        !            59: {
        !            60:        struct timespec end;
        !            61: 
        !            62:        clock_gettime(CLOCK_THREAD_CPUTIME_ID, &end);
        !            63:        return (end.tv_nsec - start->tv_nsec) / 1000000000.0 +
        !            64:                        (end.tv_sec - start->tv_sec) * 1.0;
        !            65: }
        !            66: 
        !            67: static void run_test(diffie_hellman_group_t group, int rounds)
        !            68: {
        !            69:        diffie_hellman_t *l[rounds], *r;
        !            70:        chunk_t chunk, chunks[rounds], lsecrets[rounds], rsecrets[rounds];
        !            71:        struct timespec timing;
        !            72:        int round;
        !            73: 
        !            74:        r = lib->crypto->create_dh(lib->crypto, group);
        !            75:        if (!r)
        !            76:        {
        !            77:                printf("skipping %N, not supported\n",
        !            78:                                diffie_hellman_group_names, group);
        !            79:                return;
        !            80:        }
        !            81: 
        !            82:        printf("%N:\t", diffie_hellman_group_names, group);
        !            83: 
        !            84:        start_timing(&timing);
        !            85:        for (round = 0; round < rounds; round++)
        !            86:        {
        !            87:                l[round] = lib->crypto->create_dh(lib->crypto, group);
        !            88:                assert(l[round]->get_my_public_value(l[round], &chunks[round]));
        !            89:        }
        !            90:        printf("A = g^a/s: %8.1f", rounds / end_timing(&timing));
        !            91: 
        !            92:        for (round = 0; round < rounds; round++)
        !            93:        {
        !            94:                assert(r->set_other_public_value(r, chunks[round]));
        !            95:                assert(r->get_shared_secret(r, &rsecrets[round]));
        !            96:                chunk_free(&chunks[round]);
        !            97:        }
        !            98: 
        !            99:        assert(r->get_my_public_value(r, &chunk));
        !           100:        start_timing(&timing);
        !           101:        for (round = 0; round < rounds; round++)
        !           102:        {
        !           103:                assert(l[round]->set_other_public_value(l[round], chunk));
        !           104:                assert(l[round]->get_shared_secret(l[round], &lsecrets[round]));
        !           105:        }
        !           106:        printf(" | S = B^a/s: %8.1f\n", rounds / end_timing(&timing));
        !           107:        chunk_free(&chunk);
        !           108: 
        !           109:        for (round = 0; round < rounds; round++)
        !           110:        {
        !           111:                assert(chunk_equals(rsecrets[round], lsecrets[round]));
        !           112:                free(lsecrets[round].ptr);
        !           113:                free(rsecrets[round].ptr);
        !           114:                l[round]->destroy(l[round]);
        !           115:        }
        !           116:        r->destroy(r);
        !           117: }
        !           118: 
        !           119: int main(int argc, char *argv[])
        !           120: {
        !           121:        int rounds, i, j;
        !           122: 
        !           123:        if (argc < 4)
        !           124:        {
        !           125:                usage();
        !           126:        }
        !           127: 
        !           128:        library_init(NULL, "dh_speed");
        !           129:        lib->plugins->load(lib->plugins, argv[1]);
        !           130:        atexit(library_deinit);
        !           131: 
        !           132:        rounds = atoi(argv[2]);
        !           133: 
        !           134:        for (i = 3; i < argc; i++)
        !           135:        {
        !           136:                bool found = FALSE;
        !           137: 
        !           138:                for (j = 0; j < countof(groups); j++)
        !           139:                {
        !           140:                        if (streq(groups[j].name, argv[i]))
        !           141:                        {
        !           142:                                run_test(groups[j].group, rounds);
        !           143:                                found = TRUE;
        !           144:                        }
        !           145:                }
        !           146:                if (!found)
        !           147:                {
        !           148:                        printf("group %s not found\n", argv[i]);
        !           149:                }
        !           150:        }
        !           151:        return 0;
        !           152: }

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