blob: 79f22adcf5aaaba7eb4d4d519ed0d0f29519a88d [file] [log] [blame]
Alex Deymoaea4c1c2015-08-19 20:24:43 -07001//
2// Copyright (C) 2009 The Android Open Source Project
3//
4// Licensed under the Apache License, Version 2.0 (the "License");
5// you may not use this file except in compliance with the License.
6// You may obtain a copy of the License at
7//
8// http://www.apache.org/licenses/LICENSE-2.0
9//
10// Unless required by applicable law or agreed to in writing, software
11// distributed under the License is distributed on an "AS IS" BASIS,
12// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13// See the License for the specific language governing permissions and
14// limitations under the License.
15//
rspangler@google.com49fdf182009-10-10 00:57:34 +000016
Alex Deymo39910dc2015-11-09 17:04:30 -080017#include "update_engine/common/hash_calculator.h"
Alex Deymoaab50e32014-11-10 19:55:35 -080018
rspangler@google.com49fdf182009-10-10 00:57:34 +000019#include <math.h>
20#include <unistd.h>
Darin Petkovd7061ab2010-10-06 14:37:09 -070021
Darin Petkov36a58222010-10-07 22:00:09 -070022#include <string>
Darin Petkovd7061ab2010-10-06 14:37:09 -070023#include <vector>
24
Sen Jiang2703ef42017-03-16 13:36:21 -070025#include <brillo/data_encoding.h>
Alex Vakulenko3f39d5c2015-10-13 09:27:13 -070026#include <brillo/secure_blob.h>
rspangler@google.com49fdf182009-10-10 00:57:34 +000027#include <gtest/gtest.h>
Darin Petkovd7061ab2010-10-06 14:37:09 -070028
Sen Jiang0779a152018-07-02 17:34:56 -070029#include "update_engine/common/test_utils.h"
Alex Deymo39910dc2015-11-09 17:04:30 -080030#include "update_engine/common/utils.h"
rspangler@google.com49fdf182009-10-10 00:57:34 +000031
Darin Petkov36a58222010-10-07 22:00:09 -070032using std::string;
Darin Petkovd7061ab2010-10-06 14:37:09 -070033using std::vector;
34
rspangler@google.com49fdf182009-10-10 00:57:34 +000035namespace chromeos_update_engine {
36
Darin Petkovd7061ab2010-10-06 14:37:09 -070037// Generated by running this on a linux shell:
Sen Jiang2703ef42017-03-16 13:36:21 -070038// $ echo -n hi | openssl dgst -sha256 -binary |
39// hexdump -v -e '" " 12/1 "0x%02x, " "\n"'
Alex Vakulenkof68bbbc2015-02-09 12:53:18 -080040static const uint8_t kExpectedRawHash[] = {
Darin Petkovd7061ab2010-10-06 14:37:09 -070041 0x8f, 0x43, 0x43, 0x46, 0x64, 0x8f, 0x6b, 0x96,
42 0xdf, 0x89, 0xdd, 0xa9, 0x01, 0xc5, 0x17, 0x6b,
43 0x10, 0xa6, 0xd8, 0x39, 0x61, 0xdd, 0x3c, 0x1a,
44 0xc8, 0x8b, 0x59, 0xb2, 0xdc, 0x32, 0x7a, 0xa4
45};
46
Sen Jiang0779a152018-07-02 17:34:56 -070047class HashCalculatorTest : public ::testing::Test {};
Han Shen2643cb72012-06-26 14:45:33 -070048
Alex Deymo39910dc2015-11-09 17:04:30 -080049TEST_F(HashCalculatorTest, SimpleTest) {
50 HashCalculator calc;
rspangler@google.com49fdf182009-10-10 00:57:34 +000051 calc.Update("hi", 2);
52 calc.Finalize();
Alex Vakulenko3f39d5c2015-10-13 09:27:13 -070053 brillo::Blob raw_hash(std::begin(kExpectedRawHash),
54 std::end(kExpectedRawHash));
Sen Jiang0779a152018-07-02 17:34:56 -070055 EXPECT_EQ(raw_hash, calc.raw_hash());
rspangler@google.com49fdf182009-10-10 00:57:34 +000056}
57
Alex Deymo39910dc2015-11-09 17:04:30 -080058TEST_F(HashCalculatorTest, MultiUpdateTest) {
59 HashCalculator calc;
rspangler@google.com49fdf182009-10-10 00:57:34 +000060 calc.Update("h", 1);
61 calc.Update("i", 1);
62 calc.Finalize();
Alex Vakulenko3f39d5c2015-10-13 09:27:13 -070063 brillo::Blob raw_hash(std::begin(kExpectedRawHash),
64 std::end(kExpectedRawHash));
Sen Jiang0779a152018-07-02 17:34:56 -070065 EXPECT_EQ(raw_hash, calc.raw_hash());
rspangler@google.com49fdf182009-10-10 00:57:34 +000066}
67
Alex Deymo39910dc2015-11-09 17:04:30 -080068TEST_F(HashCalculatorTest, ContextTest) {
69 HashCalculator calc;
Darin Petkov73058b42010-10-06 16:32:19 -070070 calc.Update("h", 1);
Darin Petkov36a58222010-10-07 22:00:09 -070071 string calc_context = calc.GetContext();
72 calc.Finalize();
Alex Deymo39910dc2015-11-09 17:04:30 -080073 HashCalculator calc_next;
Darin Petkov36a58222010-10-07 22:00:09 -070074 calc_next.SetContext(calc_context);
Darin Petkov73058b42010-10-06 16:32:19 -070075 calc_next.Update("i", 1);
76 calc_next.Finalize();
Alex Vakulenko3f39d5c2015-10-13 09:27:13 -070077 brillo::Blob raw_hash(std::begin(kExpectedRawHash),
78 std::end(kExpectedRawHash));
Sen Jiang0779a152018-07-02 17:34:56 -070079 EXPECT_EQ(raw_hash, calc_next.raw_hash());
Darin Petkov73058b42010-10-06 16:32:19 -070080}
81
Alex Deymo39910dc2015-11-09 17:04:30 -080082TEST_F(HashCalculatorTest, BigTest) {
83 HashCalculator calc;
rspangler@google.com49fdf182009-10-10 00:57:34 +000084
Andrew de los Reyes21067cc2011-06-28 15:27:03 -070085 int digit_count = 1;
86 int next_overflow = 10;
rspangler@google.com49fdf182009-10-10 00:57:34 +000087 for (int i = 0; i < 1000000; i++) {
88 char buf[8];
Andrew de los Reyes21067cc2011-06-28 15:27:03 -070089 if (i == next_overflow) {
90 next_overflow *= 10;
91 digit_count++;
92 }
93 ASSERT_EQ(digit_count, snprintf(buf, sizeof(buf), "%d", i)) << " i = " << i;
rspangler@google.com49fdf182009-10-10 00:57:34 +000094 calc.Update(buf, strlen(buf));
95 }
96 calc.Finalize();
97
98 // Hash constant generated by running this on a linux shell:
99 // $ C=0
100 // $ while [ $C -lt 1000000 ]; do
101 // echo -n $C
102 // let C=C+1
Darin Petkovd22cb292010-09-29 10:02:29 -0700103 // done | openssl dgst -sha256 -binary | openssl base64
Sen Jiang2703ef42017-03-16 13:36:21 -0700104 EXPECT_EQ("NZf8k6SPBkYMvhaX8YgzuMgbkLP1XZ+neM8K5wcSsf8=",
105 brillo::data_encoding::Base64Encode(calc.raw_hash()));
rspangler@google.com49fdf182009-10-10 00:57:34 +0000106}
107
Alex Deymo39910dc2015-11-09 17:04:30 -0800108TEST_F(HashCalculatorTest, UpdateFileSimpleTest) {
Sen Jiang0779a152018-07-02 17:34:56 -0700109 test_utils::ScopedTempFile data_file("data.XXXXXX");
110 ASSERT_TRUE(test_utils::WriteFileString(data_file.path(), "hi"));
Darin Petkov36a58222010-10-07 22:00:09 -0700111
Sen Jiang0779a152018-07-02 17:34:56 -0700112 for (const int length : {-1, 2, 10}) {
Alex Deymo39910dc2015-11-09 17:04:30 -0800113 HashCalculator calc;
Sen Jiang0779a152018-07-02 17:34:56 -0700114 EXPECT_EQ(2, calc.UpdateFile(data_file.path(), length));
Darin Petkov36a58222010-10-07 22:00:09 -0700115 EXPECT_TRUE(calc.Finalize());
Alex Vakulenko3f39d5c2015-10-13 09:27:13 -0700116 brillo::Blob raw_hash(std::begin(kExpectedRawHash),
117 std::end(kExpectedRawHash));
Sen Jiang0779a152018-07-02 17:34:56 -0700118 EXPECT_EQ(raw_hash, calc.raw_hash());
Darin Petkov36a58222010-10-07 22:00:09 -0700119 }
120
Alex Deymo39910dc2015-11-09 17:04:30 -0800121 HashCalculator calc;
Sen Jiang0779a152018-07-02 17:34:56 -0700122 EXPECT_EQ(0, calc.UpdateFile(data_file.path(), 0));
123 EXPECT_EQ(1, calc.UpdateFile(data_file.path(), 1));
Darin Petkov36a58222010-10-07 22:00:09 -0700124 EXPECT_TRUE(calc.Finalize());
125 // echo -n h | openssl dgst -sha256 -binary | openssl base64
Sen Jiang2703ef42017-03-16 13:36:21 -0700126 EXPECT_EQ("qqlAJmTxpB9A67xSyZk+tmrrNmYClY/fqig7ceZNsSM=",
127 brillo::data_encoding::Base64Encode(calc.raw_hash()));
Darin Petkov36a58222010-10-07 22:00:09 -0700128}
129
Alex Deymo39910dc2015-11-09 17:04:30 -0800130TEST_F(HashCalculatorTest, RawHashOfFileSimpleTest) {
Sen Jiang0779a152018-07-02 17:34:56 -0700131 test_utils::ScopedTempFile data_file("data.XXXXXX");
132 ASSERT_TRUE(test_utils::WriteFileString(data_file.path(), "hi"));
Darin Petkov698d0412010-10-13 10:59:44 -0700133
Sen Jiang0779a152018-07-02 17:34:56 -0700134 for (const int length : {-1, 2, 10}) {
Alex Vakulenko3f39d5c2015-10-13 09:27:13 -0700135 brillo::Blob exp_raw_hash(std::begin(kExpectedRawHash),
136 std::end(kExpectedRawHash));
137 brillo::Blob raw_hash;
Sen Jiang0779a152018-07-02 17:34:56 -0700138 EXPECT_EQ(
139 2, HashCalculator::RawHashOfFile(data_file.path(), length, &raw_hash));
140 EXPECT_EQ(exp_raw_hash, raw_hash);
Darin Petkov698d0412010-10-13 10:59:44 -0700141 }
142}
143
Alex Deymo39910dc2015-11-09 17:04:30 -0800144TEST_F(HashCalculatorTest, UpdateFileNonexistentTest) {
145 HashCalculator calc;
Darin Petkov36a58222010-10-07 22:00:09 -0700146 EXPECT_EQ(-1, calc.UpdateFile("/some/non-existent/file", -1));
147}
148
Alex Deymo39910dc2015-11-09 17:04:30 -0800149TEST_F(HashCalculatorTest, AbortTest) {
rspangler@google.com49fdf182009-10-10 00:57:34 +0000150 // Just make sure we don't crash and valgrind doesn't detect memory leaks
151 {
Alex Deymo39910dc2015-11-09 17:04:30 -0800152 HashCalculator calc;
rspangler@google.com49fdf182009-10-10 00:57:34 +0000153 }
154 {
Alex Deymo39910dc2015-11-09 17:04:30 -0800155 HashCalculator calc;
rspangler@google.com49fdf182009-10-10 00:57:34 +0000156 calc.Update("h", 1);
157 }
158}
159
160} // namespace chromeos_update_engine