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>