blob: f7c59a625e9f09e308061840a78f23a98934dde0 [file] [log] [blame]
Andrew de los Reyes0c440052010-08-20 11:25:54 -07001// 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#include <string>
6#include <vector>
7#include <gtest/gtest.h>
8#include "base/logging.h"
9#include "update_engine/payload_signer.h"
10#include "update_engine/update_metadata.pb.h"
11#include "update_engine/utils.h"
12
13using std::string;
14using std::vector;
15
16// Note: the test key was generated with the following command:
Andrew de los Reyesbdfaaf02011-03-30 10:35:12 -070017// openssl genrsa -out unittest_key.pem 2048
Andrew de los Reyes0c440052010-08-20 11:25:54 -070018
Andrew de los Reyes0c440052010-08-20 11:25:54 -070019namespace chromeos_update_engine {
20
Andrew de los Reyes932bc4c2010-08-23 18:14:09 -070021const char* kUnittestPrivateKeyPath = "unittest_key.pem";
Darin Petkovd7061ab2010-10-06 14:37:09 -070022const char* kUnittestPublicKeyPath = "unittest_key.pub.pem";
23
24// Some data and its corresponding hash and signature:
25const char kDataToSign[] = "This is some data to sign.";
Andrew de los Reyesbdfaaf02011-03-30 10:35:12 -070026
27// Generated by:
28// echo -n 'This is some data to sign.' | openssl dgst -sha256 -binary |
29// hexdump -v -e '" " 8/1 "0x%02x, " "\n"'
Darin Petkovd7061ab2010-10-06 14:37:09 -070030const char kDataHash[] = {
31 0x7a, 0x07, 0xa6, 0x44, 0x08, 0x86, 0x20, 0xa6,
32 0xc1, 0xf8, 0xd9, 0x02, 0x05, 0x63, 0x0d, 0xb7,
33 0xfc, 0x2b, 0xa0, 0xa9, 0x7c, 0x9d, 0x1d, 0x8c,
34 0x01, 0xf5, 0x78, 0x6d, 0xc5, 0x11, 0xb4, 0x06
35};
Andrew de los Reyesbdfaaf02011-03-30 10:35:12 -070036
37// Generated with openssl 1.0, which at the time of this writing, you need
38// to download and install yourself. Here's my command:
39// echo -n 'This is some data to sign.' | openssl dgst -sha256 -binary |
40// ~/local/bin/openssl pkeyutl -sign -inkey unittest_key.pem -pkeyopt
41// digest:sha256 | hexdump -v -e '" " 8/1 "0x%02x, " "\n"'
Darin Petkovd7061ab2010-10-06 14:37:09 -070042const char kDataSignature[] = {
Andrew de los Reyesbdfaaf02011-03-30 10:35:12 -070043 0x9f, 0x86, 0x25, 0x8b, 0xf3, 0xcc, 0xe3, 0x95,
44 0x5f, 0x45, 0x83, 0xb2, 0x66, 0xf0, 0x2a, 0xcf,
45 0xb7, 0xaa, 0x52, 0x25, 0x7a, 0xdd, 0x9d, 0x65,
46 0xe5, 0xd6, 0x02, 0x4b, 0x37, 0x99, 0x53, 0x06,
47 0xc2, 0xc9, 0x37, 0x36, 0x25, 0x62, 0x09, 0x4f,
48 0x6b, 0x22, 0xf8, 0xb3, 0x89, 0x14, 0x98, 0x1a,
49 0xbc, 0x30, 0x90, 0x4a, 0x43, 0xf5, 0xea, 0x2e,
50 0xf0, 0xa4, 0xba, 0xc3, 0xa7, 0xa3, 0x44, 0x70,
51 0xd6, 0xc4, 0x89, 0xd8, 0x45, 0x71, 0xbb, 0xee,
52 0x59, 0x87, 0x3d, 0xd5, 0xe5, 0x40, 0x22, 0x3d,
53 0x73, 0x7e, 0x2a, 0x58, 0x93, 0x8e, 0xcb, 0x9c,
54 0xf2, 0xbb, 0x4a, 0xc9, 0xd2, 0x2c, 0x52, 0x42,
55 0xb0, 0xd1, 0x13, 0x22, 0xa4, 0x78, 0xc7, 0xc6,
56 0x3e, 0xf1, 0xdc, 0x4c, 0x7b, 0x2d, 0x40, 0xda,
57 0x58, 0xac, 0x4a, 0x11, 0x96, 0x3d, 0xa0, 0x01,
58 0xf6, 0x96, 0x74, 0xf6, 0x6c, 0x0c, 0x49, 0x69,
59 0x4e, 0xc1, 0x7e, 0x9f, 0x2a, 0x42, 0xdd, 0x15,
60 0x6b, 0x37, 0x2e, 0x3a, 0xa7, 0xa7, 0x6d, 0x91,
61 0x13, 0xe8, 0x59, 0xde, 0xfe, 0x99, 0x07, 0xd9,
62 0x34, 0x0f, 0x17, 0xb3, 0x05, 0x4c, 0xd2, 0xc6,
63 0x82, 0xb7, 0x38, 0x36, 0x63, 0x1d, 0x9e, 0x21,
64 0xa6, 0x32, 0xef, 0xf1, 0x65, 0xe6, 0xed, 0x95,
65 0x25, 0x9b, 0x61, 0xe0, 0xba, 0x86, 0xa1, 0x7f,
66 0xf8, 0xa5, 0x4a, 0x32, 0x1f, 0x15, 0x20, 0x8a,
67 0x41, 0xc5, 0xb0, 0xd9, 0x4a, 0xda, 0x85, 0xf3,
68 0xdc, 0xa0, 0x98, 0x5d, 0x1d, 0x18, 0x9d, 0x2e,
69 0x42, 0xea, 0x69, 0x13, 0x74, 0x3c, 0x74, 0xf7,
70 0x6d, 0x43, 0xb0, 0x63, 0x90, 0xdb, 0x04, 0xd5,
71 0x05, 0xc9, 0x73, 0x1f, 0x6c, 0xd6, 0xfa, 0x46,
72 0x4e, 0x0f, 0x33, 0x58, 0x5b, 0x0d, 0x1b, 0x55,
73 0x39, 0xb9, 0x0f, 0x43, 0x37, 0xc0, 0x06, 0x0c,
74 0x29, 0x93, 0x43, 0xc7, 0x43, 0xb9, 0xab, 0x7d
Darin Petkovd7061ab2010-10-06 14:37:09 -070075};
Andrew de los Reyes932bc4c2010-08-23 18:14:09 -070076
Andrew de los Reyes0c440052010-08-20 11:25:54 -070077//class PayloadSignerTest : public ::testing::Test {};
78
Darin Petkovd7061ab2010-10-06 14:37:09 -070079namespace {
80void SignSampleData(vector<char>* out_signature_blob) {
Andrew de los Reyes0c440052010-08-20 11:25:54 -070081 string data_path;
82 ASSERT_TRUE(
83 utils::MakeTempFile("/tmp/data.XXXXXX", &data_path, NULL));
84 ScopedPathUnlinker data_path_unlinker(data_path);
85 ASSERT_TRUE(utils::WriteFile(data_path.c_str(),
Darin Petkovd7061ab2010-10-06 14:37:09 -070086 kDataToSign,
87 strlen(kDataToSign)));
Andrew de los Reyes0c440052010-08-20 11:25:54 -070088 uint64_t length = 0;
89 EXPECT_TRUE(PayloadSigner::SignatureBlobLength(kUnittestPrivateKeyPath,
90 &length));
91 EXPECT_GT(length, 0);
Andrew de los Reyes0c440052010-08-20 11:25:54 -070092 EXPECT_TRUE(PayloadSigner::SignPayload(data_path,
93 kUnittestPrivateKeyPath,
Darin Petkovd7061ab2010-10-06 14:37:09 -070094 out_signature_blob));
95 EXPECT_EQ(length, out_signature_blob->size());
96}
97}
98
99TEST(PayloadSignerTest, SimpleTest) {
100 vector<char> signature_blob;
101 SignSampleData(&signature_blob);
Andrew de los Reyes0c440052010-08-20 11:25:54 -0700102
103 // Check the signature itself
Andrew de los Reyes0c440052010-08-20 11:25:54 -0700104 Signatures signatures;
105 EXPECT_TRUE(signatures.ParseFromArray(&signature_blob[0],
106 signature_blob.size()));
107 EXPECT_EQ(1, signatures.signatures_size());
108 const Signatures_Signature& signature = signatures.signatures(0);
109 EXPECT_EQ(kSignatureMessageVersion, signature.version());
110 const string sig_data = signature.data();
Darin Petkovd7061ab2010-10-06 14:37:09 -0700111 ASSERT_EQ(arraysize(kDataSignature), sig_data.size());
112 for (size_t i = 0; i < arraysize(kDataSignature); i++) {
113 EXPECT_EQ(kDataSignature[i], sig_data[i]);
114 }
115}
116
Darin Petkovb039d502010-12-03 09:08:04 -0800117TEST(PayloadSignerTest, VerifySignatureTest) {
Darin Petkovd7061ab2010-10-06 14:37:09 -0700118 vector<char> signature_blob;
119 SignSampleData(&signature_blob);
120
121 vector<char> hash_data;
122 EXPECT_TRUE(PayloadSigner::VerifySignature(signature_blob,
123 kUnittestPublicKeyPath,
124 &hash_data));
Andrew de los Reyesbdfaaf02011-03-30 10:35:12 -0700125 vector<char> padded_hash_data(kDataHash, kDataHash + sizeof(kDataHash));
126 PayloadSigner::PadRSA2048SHA256Hash(&padded_hash_data);
127 ASSERT_EQ(padded_hash_data.size(), hash_data.size());
128 for (size_t i = 0; i < padded_hash_data.size(); i++) {
129 EXPECT_EQ(padded_hash_data[i], hash_data[i]);
Andrew de los Reyes0c440052010-08-20 11:25:54 -0700130 }
131}
132
133} // namespace chromeos_update_engine