blob: 7aa37e4338f71ba1eb1a4545d93a89c03761789a [file] [log] [blame]
rspangler@google.com49fdf182009-10-10 00:57:34 +00001// Copyright (c) 2009 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
adlr@google.comc98a7ed2009-12-04 18:54:03 +00005#ifndef CHROMEOS_PLATFORM_UPDATE_ENGINE_OMAHA_HASH_CALCULATOR_H__
6#define CHROMEOS_PLATFORM_UPDATE_ENGINE_OMAHA_HASH_CALCULATOR_H__
rspangler@google.com49fdf182009-10-10 00:57:34 +00007
rspangler@google.com49fdf182009-10-10 00:57:34 +00008#include <string>
adlr@google.comc98a7ed2009-12-04 18:54:03 +00009#include <vector>
rspangler@google.com49fdf182009-10-10 00:57:34 +000010#include <openssl/sha.h>
Andrew de los Reyes09e56d62010-04-23 13:45:53 -070011#include "base/basictypes.h"
Andrew de los Reyes932bc4c2010-08-23 18:14:09 -070012#include "base/logging.h"
rspangler@google.com49fdf182009-10-10 00:57:34 +000013
Darin Petkov73058b42010-10-06 16:32:19 -070014// Omaha uses base64 encoded SHA-256 as the hash. This class provides a simple
rspangler@google.com49fdf182009-10-10 00:57:34 +000015// wrapper around OpenSSL providing such a formatted hash of data passed in.
Darin Petkov73058b42010-10-06 16:32:19 -070016// The methods of this class must be called in a very specific order: First the
17// ctor (of course), then 0 or more calls to Update(), then Finalize(), then 0
18// or more calls to hash().
rspangler@google.com49fdf182009-10-10 00:57:34 +000019
20namespace chromeos_update_engine {
21
22class OmahaHashCalculator {
23 public:
Andrew de los Reyes932bc4c2010-08-23 18:14:09 -070024 OmahaHashCalculator();
rspangler@google.com49fdf182009-10-10 00:57:34 +000025
26 // Update is called with all of the data that should be hashed in order.
Andrew de los Reyes932bc4c2010-08-23 18:14:09 -070027 // Update will read |length| bytes of |data|.
28 // Returns true on success.
29 bool Update(const char* data, size_t length);
rspangler@google.com49fdf182009-10-10 00:57:34 +000030
31 // Call Finalize() when all data has been passed in. This method tells
32 // OpenSSl that no more data will come in and base64 encodes the resulting
33 // hash.
Andrew de los Reyes932bc4c2010-08-23 18:14:09 -070034 // Returns true on success.
35 bool Finalize();
rspangler@google.com49fdf182009-10-10 00:57:34 +000036
37 // Gets the hash. Finalize() must have been called.
38 const std::string& hash() const {
Andrew de los Reyes932bc4c2010-08-23 18:14:09 -070039 DCHECK(!hash_.empty()) << "Call Finalize() first";
rspangler@google.com49fdf182009-10-10 00:57:34 +000040 return hash_;
41 }
42
Darin Petkovd7061ab2010-10-06 14:37:09 -070043 const std::vector<char>& raw_hash() const {
44 DCHECK(!raw_hash_.empty()) << "Call Finalize() first";
45 return raw_hash_;
46 }
47
Darin Petkov73058b42010-10-06 16:32:19 -070048 // Gets the current hash context. Note that the string will contain binary
49 // data (including \0 characters).
50 std::string GetContext() const;
51
52 // Sets the current hash context. |context| must the string returned by a
53 // previous OmahaHashCalculator::GetContext method call. Returns true on
54 // success, and false otherwise.
55 bool SetContext(const std::string& context);
56
Andrew de los Reyes932bc4c2010-08-23 18:14:09 -070057 static bool RawHashOfData(const std::vector<char>& data,
58 std::vector<char>* out_hash);
59
rspangler@google.com49fdf182009-10-10 00:57:34 +000060 // Used by tests
61 static std::string OmahaHashOfBytes(const void* data, size_t length);
62 static std::string OmahaHashOfString(const std::string& str);
63 static std::string OmahaHashOfData(const std::vector<char>& data);
64
65 private:
Darin Petkovd7061ab2010-10-06 14:37:09 -070066 // If non-empty, the final base64 encoded hash and the raw hash. Will only be
67 // set to non-empty when Finalize is called.
rspangler@google.com49fdf182009-10-10 00:57:34 +000068 std::string hash_;
Darin Petkovd7061ab2010-10-06 14:37:09 -070069 std::vector<char> raw_hash_;
rspangler@google.com49fdf182009-10-10 00:57:34 +000070
Andrew de los Reyes932bc4c2010-08-23 18:14:09 -070071 // Init success
72 bool valid_;
73
rspangler@google.com49fdf182009-10-10 00:57:34 +000074 // The hash state used by OpenSSL
Darin Petkovd22cb292010-09-29 10:02:29 -070075 SHA256_CTX ctx_;
rspangler@google.com49fdf182009-10-10 00:57:34 +000076 DISALLOW_COPY_AND_ASSIGN(OmahaHashCalculator);
77};
78
79} // namespace chromeos_update_engine
80
Andrew de los Reyes932bc4c2010-08-23 18:14:09 -070081#endif // CHROMEOS_PLATFORM_UPDATE_ENGINE_OMAHA_HASH_CALCULATOR_H__