Annotation of embedaddon/strongswan/scripts/dh_speed.c, revision 1.1.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>