Annotation of embedaddon/strongswan/scripts/pubkey_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 <library.h>
                     19: #include <utils/debug.h>
                     20: #include <credentials/keys/private_key.h>
                     21: 
                     22: void start_timing(struct timespec *start)
                     23: {
                     24:        clock_gettime(CLOCK_THREAD_CPUTIME_ID, start);
                     25: }
                     26: 
                     27: double end_timing(struct timespec *start)
                     28: {
                     29:        struct timespec end;
                     30: 
                     31:        clock_gettime(CLOCK_THREAD_CPUTIME_ID, &end);
                     32:        return (end.tv_nsec - start->tv_nsec) / 1000000000.0 +
                     33:                        (end.tv_sec - start->tv_sec) * 1.0;
                     34: }
                     35: 
                     36: static void usage()
                     37: {
                     38:        printf("usage: pubkey_speed plugins rsa|ecdsa rounds < key\n");
                     39:        exit(1);
                     40: }
                     41: 
                     42: int main(int argc, char *argv[])
                     43: {
                     44:        private_key_t *private;
                     45:        public_key_t *public;
                     46:        struct timespec timing;
                     47:        int round, rounds, read;
                     48:        char buf[8096], *pos = buf;
                     49:        key_type_t type = KEY_ANY;
                     50:        signature_scheme_t scheme = SIGN_UNKNOWN;
                     51:        chunk_t keydata, *sigs, data;
                     52: 
                     53:        if (argc < 4)
                     54:        {
                     55:                usage();
                     56:        }
                     57: 
                     58:        rounds = atoi(argv[3]);
                     59:        if (rounds < 0 || rounds > (1 << 26))
                     60:        {       /* arbitrary limit to the number of chunk_t/sigs that fit into 1 GiB */
                     61:                usage();
                     62:        }
                     63: 
                     64:        if (streq(argv[2], "rsa"))
                     65:        {
                     66:                type = KEY_RSA;
                     67:                scheme = SIGN_RSA_EMSA_PKCS1_SHA1;
                     68:        }
                     69:        else if (streq(argv[2], "ecdsa"))
                     70:        {
                     71:                type = KEY_ECDSA;
                     72:        }
                     73:        else
                     74:        {
                     75:                usage();
                     76:        }
                     77: 
                     78:        library_init(NULL, "pubkey_speed");
                     79:        lib->plugins->load(lib->plugins, argv[1]);
                     80:        atexit(library_deinit);
                     81: 
                     82:        keydata = chunk_create(buf, 0);
                     83:        while ((read = fread(pos, 1, sizeof(buf) - (pos - buf), stdin)))
                     84:        {
                     85:                pos += read;
                     86:                keydata.len += read;
                     87:        }
                     88: 
                     89:        private = lib->creds->create(lib->creds, CRED_PRIVATE_KEY, type,
                     90:                                                                 BUILD_BLOB_PEM, keydata, BUILD_END);
                     91:        if (!private)
                     92:        {
                     93:                printf("parsing private key failed.\n");
                     94:                exit(1);
                     95:        }
                     96:        if (type == KEY_ECDSA)
                     97:        {
                     98:                switch (private->get_keysize(private))
                     99:                {
                    100:                        case 256:
                    101:                                scheme = SIGN_ECDSA_256;
                    102:                                break;
                    103:                        case 384:
                    104:                                scheme = SIGN_ECDSA_384;
                    105:                                break;
                    106:                        case 521:
                    107:                                scheme = SIGN_ECDSA_521;
                    108:                                break;
                    109:                        default:
                    110:                                printf("%d bit ECDSA private key size not supported",
                    111:                                                private->get_keysize(private));
                    112:                                exit(1);
                    113:                }
                    114:        }
                    115: 
                    116:        printf("%4d bit %N: ", private->get_keysize(private),
                    117:                key_type_names, type);
                    118: 
                    119:        sigs = malloc(sizeof(chunk_t) * rounds);
                    120: 
                    121:        data = chunk_from_chars(0x01,0x02,0x03,0x04,0x05,0x06,0x07);
                    122:        start_timing(&timing);
                    123:        for (round = 0; round < rounds; round++)
                    124:        {
                    125:                if (!private->sign(private, scheme, NULL, data, &sigs[round]))
                    126:                {
                    127:                        printf("creating signature failed\n");
                    128:                        exit(1);
                    129:                }
                    130:        };
                    131:        printf("sign()/s: %8.1f   ", rounds / end_timing(&timing));
                    132: 
                    133:        public = private->get_public_key(private);
                    134:        if (!public)
                    135:        {
                    136:                printf("extracting public key failed\n");
                    137:                exit(1);
                    138:        }
                    139:        start_timing(&timing);
                    140:        for (round = 0; round < rounds; round++)
                    141:        {
                    142:                if (!public->verify(public, scheme, NULL, data, sigs[round]))
                    143:                {
                    144:                        printf("signature verification failed\n");
                    145:                        exit(1);
                    146:                }
                    147:        }
                    148:        printf("verify()/s: %8.1f\n", rounds / end_timing(&timing));
                    149:        public->destroy(public);
                    150:        private->destroy(private);
                    151: 
                    152:        for (round = 0; round < rounds; round++)
                    153:        {
                    154:                free(sigs[round].ptr);
                    155:        }
                    156:        free(sigs);
                    157:        return 0;
                    158: }

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