blob: 4b0b785ad7d607213c453a01da41793004e38161 [file] [log] [blame]
Gaurav Shah322536d2010-01-28 15:01:23 -08001/* Copyright (c) 2010 The Chromium OS Authors. All rights reserved.
2 * Use of this source code is governed by a BSD-style license that can be
3 * found in the LICENSE file.
4 */
5
6/* Routines for verifying a file's signature. Useful in testing the core
7 * RSA verification implementation.
8 */
9
10#include <fcntl.h>
11#include <stdio.h>
12#include <stdlib.h>
13#include <string.h>
14#include <sys/stat.h>
15#include <sys/types.h>
16#include <unistd.h>
17
Gaurav Shah431b9882010-02-12 15:54:37 -080018#include "file_keys.h"
David Garcia21c3f7f2010-03-31 09:04:15 -070019#include "sha_utility.h"
20#include "padding.h"
21#include "rsa.h"
22#include "rsa_utility.h"
Gaurav Shah322536d2010-01-28 15:01:23 -080023#include "verify_data.h"
24
Gaurav Shah08df9b82010-02-23 16:16:23 -080025/* ANSI Color coding sequences. */
26#define COL_GREEN "\e[1;32m"
27#define COL_RED "\e[0;31m]"
28#define COL_STOP "\e[m"
29
Gaurav Shahe178fd92010-02-05 11:44:58 -080030uint8_t* read_signature(char* input_file, int len) {
Gaurav Shah322536d2010-01-28 15:01:23 -080031 int i, sigfd;
Gaurav Shahe178fd92010-02-05 11:44:58 -080032 uint8_t* signature = NULL;
Gaurav Shah322536d2010-01-28 15:01:23 -080033 if ((sigfd = open(input_file, O_RDONLY)) == -1) {
34 fprintf(stderr, "Couldn't open signature file\n");
35 return NULL;
36 }
37
38 /* Read the signature into a buffer*/
39 signature = (uint8_t*) malloc(len);
40 if (!signature)
41 return NULL;
42
43 if( (i = read(sigfd, signature, len)) != len ) {
44 fprintf(stderr, "Wrong signature length - Expected = %d, Received = %d\n",
45 len, i);
46 close(sigfd);
47 return NULL;
48 }
49
50 close(sigfd);
51 return signature;
52}
53
Gaurav Shah322536d2010-01-28 15:01:23 -080054int main(int argc, char* argv[]) {
55 int i, algorithm, sig_len;
Gaurav Shah6f555392010-02-11 21:04:49 -080056 int return_code = 1; /* Default to error. */
Gaurav Shahe178fd92010-02-05 11:44:58 -080057 uint8_t* digest = NULL;
58 uint8_t* signature = NULL;
Gaurav Shah322536d2010-01-28 15:01:23 -080059 RSAPublicKey* key = NULL;
60
61 if (argc!=5) {
62 fprintf(stderr, "Usage: %s <algorithm> <key file> <signature file>"
63 " <input file>\n\n", argv[0]);
64 fprintf(stderr, "where <algorithm> depends on the signature algorithm"
65 " used:\n");
66 for(i = 0; i<kNumAlgorithms; i++)
67 fprintf(stderr, "\t%d for %s\n", i, algo_strings[i]);
68 return -1;
69 }
70
71 algorithm = atoi(argv[1]);
72 if (algorithm >= kNumAlgorithms) {
73 fprintf(stderr, "Invalid Algorithm!\n");
74 return 0;
75 }
76 /* Length of the RSA Signature/RSA Key */
Gaurav Shahf5564fa2010-03-02 15:40:01 -080077 sig_len = siglen_map[algorithm];
78 if ((key = RSAPublicKeyFromFile(argv[2])) &&
79 (signature = read_signature(argv[3], sig_len)) &&
80 (digest = DigestFile(argv[4], algorithm))) {
81 if (RSAVerify(key, signature, sig_len, algorithm, digest)) {
82 return_code = 0;
83 fprintf(stderr, "Signature Verification "
84 COL_GREEN "SUCCEEDED" COL_STOP "\n");
85 } else {
86 fprintf(stderr, "Signature Verification "
87 COL_RED "FAILED" COL_STOP "\n");
88 }
Gaurav Shah6f555392010-02-11 21:04:49 -080089 }
Gaurav Shahf5564fa2010-03-02 15:40:01 -080090 else
91 return_code = -1;
Gaurav Shah322536d2010-01-28 15:01:23 -080092
Gaurav Shah322536d2010-01-28 15:01:23 -080093 free(key);
94 free(signature);
95 free(digest);
96
Gaurav Shah6f555392010-02-11 21:04:49 -080097 return return_code;
Gaurav Shah322536d2010-01-28 15:01:23 -080098}