blob: 52ac1b75fd5a9227195bb9f535f5a19513a92f35 [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
14// Omaha uses base64 encoded SHA-1 as the hash. This class provides a simple
15// wrapper around OpenSSL providing such a formatted hash of data passed in.
16// The methods of this class must be called in a very specific order:
17// First the ctor (of course), then 0 or more calls to Update(), then
18// Finalize(), then 0 or more calls to hash().
19
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
Andrew de los Reyes932bc4c2010-08-23 18:14:09 -070048 static bool RawHashOfData(const std::vector<char>& data,
49 std::vector<char>* out_hash);
50
rspangler@google.com49fdf182009-10-10 00:57:34 +000051 // Used by tests
52 static std::string OmahaHashOfBytes(const void* data, size_t length);
53 static std::string OmahaHashOfString(const std::string& str);
54 static std::string OmahaHashOfData(const std::vector<char>& data);
55
56 private:
Darin Petkovd7061ab2010-10-06 14:37:09 -070057 // If non-empty, the final base64 encoded hash and the raw hash. Will only be
58 // set to non-empty when Finalize is called.
rspangler@google.com49fdf182009-10-10 00:57:34 +000059 std::string hash_;
Darin Petkovd7061ab2010-10-06 14:37:09 -070060 std::vector<char> raw_hash_;
rspangler@google.com49fdf182009-10-10 00:57:34 +000061
Andrew de los Reyes932bc4c2010-08-23 18:14:09 -070062 // Init success
63 bool valid_;
64
rspangler@google.com49fdf182009-10-10 00:57:34 +000065 // The hash state used by OpenSSL
Darin Petkovd22cb292010-09-29 10:02:29 -070066 SHA256_CTX ctx_;
rspangler@google.com49fdf182009-10-10 00:57:34 +000067 DISALLOW_COPY_AND_ASSIGN(OmahaHashCalculator);
68};
69
70} // namespace chromeos_update_engine
71
Andrew de los Reyes932bc4c2010-08-23 18:14:09 -070072#endif // CHROMEOS_PLATFORM_UPDATE_ENGINE_OMAHA_HASH_CALCULATOR_H__