Randall Spangler | 32a6526 | 2011-06-27 10:49:11 -0700 | [diff] [blame] | 1 | /* Copyright (c) 2011 The Chromium OS Authors. All rights reserved. |
Gaurav Shah | 52898d3 | 2010-02-17 16:37:33 -0800 | [diff] [blame] | 2 | * Use of this source code is governed by a BSD-style license that can be |
| 3 | * found in the LICENSE file. |
| 4 | */ |
| 5 | |
Bill Richardson | 0c3ba24 | 2013-03-29 11:09:30 -0700 | [diff] [blame] | 6 | #include <stdint.h> |
Gaurav Shah | 52898d3 | 2010-02-17 16:37:33 -0800 | [diff] [blame] | 7 | #include <stdio.h> |
| 8 | #include <stdlib.h> |
| 9 | |
Gaurav Shah | 5411c7a | 2010-03-31 10:56:49 -0700 | [diff] [blame] | 10 | #include "cryptolib.h" |
Gaurav Shah | 52898d3 | 2010-02-17 16:37:33 -0800 | [diff] [blame] | 11 | #include "file_keys.h" |
Randall Spangler | 32a6526 | 2011-06-27 10:49:11 -0700 | [diff] [blame] | 12 | #include "host_common.h" |
Gaurav Shah | 52898d3 | 2010-02-17 16:37:33 -0800 | [diff] [blame] | 13 | #include "timer_utils.h" |
Gaurav Shah | 52898d3 | 2010-02-17 16:37:33 -0800 | [diff] [blame] | 14 | |
| 15 | #define FILE_NAME_SIZE 128 |
| 16 | #define NUM_OPERATIONS 100 /* Number of signature operations to time. */ |
| 17 | |
Gaurav Shah | 8b95c70 | 2010-02-28 12:50:29 -0800 | [diff] [blame] | 18 | int SpeedTestAlgorithm(int algorithm) { |
Gaurav Shah | 52898d3 | 2010-02-17 16:37:33 -0800 | [diff] [blame] | 19 | int i, key_size; |
Gaurav Shah | 8b95c70 | 2010-02-28 12:50:29 -0800 | [diff] [blame] | 20 | int error_code = 0; |
Gaurav Shah | 52898d3 | 2010-02-17 16:37:33 -0800 | [diff] [blame] | 21 | double speed, msecs; |
| 22 | char file_name[FILE_NAME_SIZE]; |
| 23 | uint8_t* digest = NULL; |
| 24 | uint8_t* signature = NULL; |
Gaurav Shah | 456678b | 2010-03-10 18:38:45 -0800 | [diff] [blame] | 25 | uint64_t digest_len, sig_len; |
Gaurav Shah | 52898d3 | 2010-02-17 16:37:33 -0800 | [diff] [blame] | 26 | RSAPublicKey* key = NULL; |
| 27 | ClockTimerState ct; |
| 28 | char* sha_strings[] = { /* Maps algorithm->SHA algorithm. */ |
Gaurav Shah | c7daf38 | 2010-03-01 20:24:37 -0800 | [diff] [blame] | 29 | "sha1", "sha256", "sha512", /* RSA-1024 */ |
Gaurav Shah | 52898d3 | 2010-02-17 16:37:33 -0800 | [diff] [blame] | 30 | "sha1", "sha256", "sha512", /* RSA-2048 */ |
| 31 | "sha1", "sha256", "sha512", /* RSA-4096 */ |
| 32 | "sha1", "sha256", "sha512", /* RSA-8192 */ |
| 33 | }; |
| 34 | |
Gaurav Shah | cae5fa6 | 2010-02-28 20:02:29 -0800 | [diff] [blame] | 35 | key_size = siglen_map[algorithm] * 8; /* in bits. */ |
Gaurav Shah | 52898d3 | 2010-02-17 16:37:33 -0800 | [diff] [blame] | 36 | /* Get key. */ |
| 37 | snprintf(file_name, FILE_NAME_SIZE, "testkeys/key_rsa%d.keyb", key_size); |
| 38 | key = RSAPublicKeyFromFile(file_name); |
| 39 | if (!key) { |
Bill Richardson | abf0550 | 2010-07-01 10:22:06 -0700 | [diff] [blame] | 40 | VBDEBUG(("Couldn't read RSA Public key from file: %s\n", file_name)); |
Gaurav Shah | 8b95c70 | 2010-02-28 12:50:29 -0800 | [diff] [blame] | 41 | error_code = 1; |
Gaurav Shah | 52898d3 | 2010-02-17 16:37:33 -0800 | [diff] [blame] | 42 | goto failure; |
| 43 | } |
| 44 | |
| 45 | /* Get expected digest. */ |
| 46 | snprintf(file_name, FILE_NAME_SIZE, "testcases/test_file.%s.digest", |
| 47 | sha_strings[algorithm]); |
| 48 | digest = BufferFromFile(file_name, &digest_len); |
| 49 | if (!digest) { |
Bill Richardson | abf0550 | 2010-07-01 10:22:06 -0700 | [diff] [blame] | 50 | VBDEBUG(("Couldn't read digest file.\n")); |
Gaurav Shah | 8b95c70 | 2010-02-28 12:50:29 -0800 | [diff] [blame] | 51 | error_code = 1; |
Gaurav Shah | 52898d3 | 2010-02-17 16:37:33 -0800 | [diff] [blame] | 52 | goto failure; |
| 53 | } |
| 54 | |
| 55 | /* Get signature to verify against. */ |
| 56 | snprintf(file_name, FILE_NAME_SIZE, "testcases/test_file.rsa%d_%s.sig", |
| 57 | key_size, sha_strings[algorithm]); |
| 58 | signature = BufferFromFile(file_name, &sig_len); |
| 59 | if (!signature) { |
Bill Richardson | abf0550 | 2010-07-01 10:22:06 -0700 | [diff] [blame] | 60 | VBDEBUG(("Couldn't read signature file.\n")); |
Gaurav Shah | 8b95c70 | 2010-02-28 12:50:29 -0800 | [diff] [blame] | 61 | error_code = 1; |
Gaurav Shah | 52898d3 | 2010-02-17 16:37:33 -0800 | [diff] [blame] | 62 | goto failure; |
| 63 | } |
| 64 | |
| 65 | StartTimer(&ct); |
| 66 | for (i = 0; i < NUM_OPERATIONS; i++) { |
Gaurav Shah | f5564fa | 2010-03-02 15:40:01 -0800 | [diff] [blame] | 67 | if (!RSAVerify(key, signature, sig_len, algorithm, digest)) |
Bill Richardson | abf0550 | 2010-07-01 10:22:06 -0700 | [diff] [blame] | 68 | VBDEBUG(("Warning: Signature Check Failed.\n")); |
Gaurav Shah | 52898d3 | 2010-02-17 16:37:33 -0800 | [diff] [blame] | 69 | } |
| 70 | StopTimer(&ct); |
| 71 | |
| 72 | msecs = (float) GetDurationMsecs(&ct) / NUM_OPERATIONS; |
| 73 | speed = 1000.0 / msecs ; |
Gaurav Shah | 8b95c70 | 2010-02-28 12:50:29 -0800 | [diff] [blame] | 74 | fprintf(stderr, "# rsa%d/%s:\tTime taken per verification = %.02f ms," |
Gaurav Shah | 52898d3 | 2010-02-17 16:37:33 -0800 | [diff] [blame] | 75 | " Speed = %.02f verifications/s\n", key_size, sha_strings[algorithm], |
| 76 | msecs, speed); |
Gaurav Shah | c7daf38 | 2010-03-01 20:24:37 -0800 | [diff] [blame] | 77 | fprintf(stdout, "ms_rsa%d_%s:%.02f\n", key_size, sha_strings[algorithm], |
| 78 | msecs); |
Gaurav Shah | 52898d3 | 2010-02-17 16:37:33 -0800 | [diff] [blame] | 79 | |
| 80 | failure: |
Randall Spangler | 32a6526 | 2011-06-27 10:49:11 -0700 | [diff] [blame] | 81 | free(signature); |
| 82 | free(digest); |
Gaurav Shah | 259de40 | 2010-03-12 17:42:03 -0800 | [diff] [blame] | 83 | RSAPublicKeyFree(key); |
Gaurav Shah | 8b95c70 | 2010-02-28 12:50:29 -0800 | [diff] [blame] | 84 | return error_code; |
Gaurav Shah | 52898d3 | 2010-02-17 16:37:33 -0800 | [diff] [blame] | 85 | } |
| 86 | |
| 87 | int main(int argc, char* argv[]) { |
| 88 | int i; |
Gaurav Shah | 8b95c70 | 2010-02-28 12:50:29 -0800 | [diff] [blame] | 89 | int error_code = 0; |
Gaurav Shah | 52898d3 | 2010-02-17 16:37:33 -0800 | [diff] [blame] | 90 | for (i = 0; i < kNumAlgorithms; ++i) { |
Gaurav Shah | 8b95c70 | 2010-02-28 12:50:29 -0800 | [diff] [blame] | 91 | if(SpeedTestAlgorithm(i)) |
| 92 | error_code = 1; |
Gaurav Shah | 52898d3 | 2010-02-17 16:37:33 -0800 | [diff] [blame] | 93 | } |
Gaurav Shah | 8b95c70 | 2010-02-28 12:50:29 -0800 | [diff] [blame] | 94 | return error_code; |
Gaurav Shah | 52898d3 | 2010-02-17 16:37:33 -0800 | [diff] [blame] | 95 | } |