blob: e8f73d5ce0671bdca49912dc28c4076097838609 [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[] = {
Amin Hassanib2689592019-01-13 17:04:28 -080041 0x8f, 0x43, 0x43, 0x46, 0x64, 0x8f, 0x6b, 0x96, 0xdf, 0x89, 0xdd,
42 0xa9, 0x01, 0xc5, 0x17, 0x6b, 0x10, 0xa6, 0xd8, 0x39, 0x61, 0xdd,
43 0x3c, 0x1a, 0xc8, 0x8b, 0x59, 0xb2, 0xdc, 0x32, 0x7a, 0xa4};
Darin Petkovd7061ab2010-10-06 14:37:09 -070044
Sen Jiang0779a152018-07-02 17:34:56 -070045class HashCalculatorTest : public ::testing::Test {};
Han Shen2643cb72012-06-26 14:45:33 -070046
Alex Deymo39910dc2015-11-09 17:04:30 -080047TEST_F(HashCalculatorTest, SimpleTest) {
48 HashCalculator calc;
rspangler@google.com49fdf182009-10-10 00:57:34 +000049 calc.Update("hi", 2);
50 calc.Finalize();
Alex Vakulenko3f39d5c2015-10-13 09:27:13 -070051 brillo::Blob raw_hash(std::begin(kExpectedRawHash),
52 std::end(kExpectedRawHash));
Sen Jiang0779a152018-07-02 17:34:56 -070053 EXPECT_EQ(raw_hash, calc.raw_hash());
rspangler@google.com49fdf182009-10-10 00:57:34 +000054}
55
Alex Deymo39910dc2015-11-09 17:04:30 -080056TEST_F(HashCalculatorTest, MultiUpdateTest) {
57 HashCalculator calc;
rspangler@google.com49fdf182009-10-10 00:57:34 +000058 calc.Update("h", 1);
59 calc.Update("i", 1);
60 calc.Finalize();
Alex Vakulenko3f39d5c2015-10-13 09:27:13 -070061 brillo::Blob raw_hash(std::begin(kExpectedRawHash),
62 std::end(kExpectedRawHash));
Sen Jiang0779a152018-07-02 17:34:56 -070063 EXPECT_EQ(raw_hash, calc.raw_hash());
rspangler@google.com49fdf182009-10-10 00:57:34 +000064}
65
Alex Deymo39910dc2015-11-09 17:04:30 -080066TEST_F(HashCalculatorTest, ContextTest) {
67 HashCalculator calc;
Darin Petkov73058b42010-10-06 16:32:19 -070068 calc.Update("h", 1);
Darin Petkov36a58222010-10-07 22:00:09 -070069 string calc_context = calc.GetContext();
70 calc.Finalize();
Alex Deymo39910dc2015-11-09 17:04:30 -080071 HashCalculator calc_next;
Darin Petkov36a58222010-10-07 22:00:09 -070072 calc_next.SetContext(calc_context);
Darin Petkov73058b42010-10-06 16:32:19 -070073 calc_next.Update("i", 1);
74 calc_next.Finalize();
Alex Vakulenko3f39d5c2015-10-13 09:27:13 -070075 brillo::Blob raw_hash(std::begin(kExpectedRawHash),
76 std::end(kExpectedRawHash));
Sen Jiang0779a152018-07-02 17:34:56 -070077 EXPECT_EQ(raw_hash, calc_next.raw_hash());
Darin Petkov73058b42010-10-06 16:32:19 -070078}
79
Alex Deymo39910dc2015-11-09 17:04:30 -080080TEST_F(HashCalculatorTest, BigTest) {
81 HashCalculator calc;
rspangler@google.com49fdf182009-10-10 00:57:34 +000082
Andrew de los Reyes21067cc2011-06-28 15:27:03 -070083 int digit_count = 1;
84 int next_overflow = 10;
rspangler@google.com49fdf182009-10-10 00:57:34 +000085 for (int i = 0; i < 1000000; i++) {
86 char buf[8];
Andrew de los Reyes21067cc2011-06-28 15:27:03 -070087 if (i == next_overflow) {
88 next_overflow *= 10;
89 digit_count++;
90 }
91 ASSERT_EQ(digit_count, snprintf(buf, sizeof(buf), "%d", i)) << " i = " << i;
rspangler@google.com49fdf182009-10-10 00:57:34 +000092 calc.Update(buf, strlen(buf));
93 }
94 calc.Finalize();
95
96 // Hash constant generated by running this on a linux shell:
97 // $ C=0
98 // $ while [ $C -lt 1000000 ]; do
99 // echo -n $C
100 // let C=C+1
Darin Petkovd22cb292010-09-29 10:02:29 -0700101 // done | openssl dgst -sha256 -binary | openssl base64
Sen Jiang2703ef42017-03-16 13:36:21 -0700102 EXPECT_EQ("NZf8k6SPBkYMvhaX8YgzuMgbkLP1XZ+neM8K5wcSsf8=",
103 brillo::data_encoding::Base64Encode(calc.raw_hash()));
rspangler@google.com49fdf182009-10-10 00:57:34 +0000104}
105
Alex Deymo39910dc2015-11-09 17:04:30 -0800106TEST_F(HashCalculatorTest, UpdateFileSimpleTest) {
Sen Jiang0779a152018-07-02 17:34:56 -0700107 test_utils::ScopedTempFile data_file("data.XXXXXX");
108 ASSERT_TRUE(test_utils::WriteFileString(data_file.path(), "hi"));
Darin Petkov36a58222010-10-07 22:00:09 -0700109
Sen Jiang0779a152018-07-02 17:34:56 -0700110 for (const int length : {-1, 2, 10}) {
Alex Deymo39910dc2015-11-09 17:04:30 -0800111 HashCalculator calc;
Sen Jiang0779a152018-07-02 17:34:56 -0700112 EXPECT_EQ(2, calc.UpdateFile(data_file.path(), length));
Darin Petkov36a58222010-10-07 22:00:09 -0700113 EXPECT_TRUE(calc.Finalize());
Alex Vakulenko3f39d5c2015-10-13 09:27:13 -0700114 brillo::Blob raw_hash(std::begin(kExpectedRawHash),
115 std::end(kExpectedRawHash));
Sen Jiang0779a152018-07-02 17:34:56 -0700116 EXPECT_EQ(raw_hash, calc.raw_hash());
Darin Petkov36a58222010-10-07 22:00:09 -0700117 }
118
Alex Deymo39910dc2015-11-09 17:04:30 -0800119 HashCalculator calc;
Sen Jiang0779a152018-07-02 17:34:56 -0700120 EXPECT_EQ(0, calc.UpdateFile(data_file.path(), 0));
121 EXPECT_EQ(1, calc.UpdateFile(data_file.path(), 1));
Darin Petkov36a58222010-10-07 22:00:09 -0700122 EXPECT_TRUE(calc.Finalize());
123 // echo -n h | openssl dgst -sha256 -binary | openssl base64
Sen Jiang2703ef42017-03-16 13:36:21 -0700124 EXPECT_EQ("qqlAJmTxpB9A67xSyZk+tmrrNmYClY/fqig7ceZNsSM=",
125 brillo::data_encoding::Base64Encode(calc.raw_hash()));
Darin Petkov36a58222010-10-07 22:00:09 -0700126}
127
Alex Deymo39910dc2015-11-09 17:04:30 -0800128TEST_F(HashCalculatorTest, RawHashOfFileSimpleTest) {
Sen Jiang0779a152018-07-02 17:34:56 -0700129 test_utils::ScopedTempFile data_file("data.XXXXXX");
130 ASSERT_TRUE(test_utils::WriteFileString(data_file.path(), "hi"));
Darin Petkov698d0412010-10-13 10:59:44 -0700131
Sen Jiang0779a152018-07-02 17:34:56 -0700132 for (const int length : {-1, 2, 10}) {
Alex Vakulenko3f39d5c2015-10-13 09:27:13 -0700133 brillo::Blob exp_raw_hash(std::begin(kExpectedRawHash),
134 std::end(kExpectedRawHash));
135 brillo::Blob raw_hash;
Sen Jiang0779a152018-07-02 17:34:56 -0700136 EXPECT_EQ(
137 2, HashCalculator::RawHashOfFile(data_file.path(), length, &raw_hash));
138 EXPECT_EQ(exp_raw_hash, raw_hash);
Darin Petkov698d0412010-10-13 10:59:44 -0700139 }
140}
141
Alex Deymo39910dc2015-11-09 17:04:30 -0800142TEST_F(HashCalculatorTest, UpdateFileNonexistentTest) {
143 HashCalculator calc;
Darin Petkov36a58222010-10-07 22:00:09 -0700144 EXPECT_EQ(-1, calc.UpdateFile("/some/non-existent/file", -1));
145}
146
Alex Deymo39910dc2015-11-09 17:04:30 -0800147TEST_F(HashCalculatorTest, AbortTest) {
rspangler@google.com49fdf182009-10-10 00:57:34 +0000148 // Just make sure we don't crash and valgrind doesn't detect memory leaks
Amin Hassanib2689592019-01-13 17:04:28 -0800149 { HashCalculator calc; }
rspangler@google.com49fdf182009-10-10 00:57:34 +0000150 {
Alex Deymo39910dc2015-11-09 17:04:30 -0800151 HashCalculator calc;
rspangler@google.com49fdf182009-10-10 00:57:34 +0000152 calc.Update("h", 1);
153 }
154}
155
156} // namespace chromeos_update_engine