| OLD | NEW |
| (Empty) |
| 1 // Copyright (c) 2012 The Chromium 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 #ifndef CHROME_NACL_NACL_VALIDATION_QUERY_H_ | |
| 6 #define CHROME_NACL_NACL_VALIDATION_QUERY_H_ | |
| 7 | |
| 8 #include <string> | |
| 9 | |
| 10 #include "base/basictypes.h" | |
| 11 #include "base/strings/string_piece.h" | |
| 12 #include "crypto/hmac.h" | |
| 13 | |
| 14 struct NaClFileToken; | |
| 15 struct NaClValidationCache; | |
| 16 class NaClValidationDB; | |
| 17 class NaClValidationQuery; | |
| 18 | |
| 19 class NaClValidationQueryContext { | |
| 20 public: | |
| 21 NaClValidationQueryContext(NaClValidationDB* db, | |
| 22 const std::string& profile_key, | |
| 23 const std::string& nacl_version); | |
| 24 | |
| 25 NaClValidationQuery* CreateQuery(); | |
| 26 | |
| 27 bool ResolveFileToken(struct NaClFileToken* file_token, int32* fd, | |
| 28 std::string* path); | |
| 29 | |
| 30 private: | |
| 31 NaClValidationDB* db_; | |
| 32 | |
| 33 // A key used by HMAC that is specific to this installation of Chrome. | |
| 34 std::string profile_key_; | |
| 35 | |
| 36 // Bytes indicating the "version" of the validator being used. This is used | |
| 37 // to implicitly invalidate the cache - changing the version will change the | |
| 38 // hashes that are produced. | |
| 39 std::string nacl_version_; | |
| 40 }; | |
| 41 | |
| 42 class NaClValidationQuery { | |
| 43 public: | |
| 44 // SHA256 digest size. | |
| 45 static const size_t kDigestLength = 32; | |
| 46 | |
| 47 NaClValidationQuery(NaClValidationDB* db, const std::string& profile_key); | |
| 48 | |
| 49 void AddData(const char* data, size_t length); | |
| 50 void AddData(const unsigned char* data, size_t length); | |
| 51 void AddData(const base::StringPiece& data); | |
| 52 | |
| 53 int QueryKnownToValidate(); | |
| 54 | |
| 55 void SetKnownToValidate(); | |
| 56 | |
| 57 private: | |
| 58 enum QueryState { | |
| 59 READY, | |
| 60 GET_CALLED, | |
| 61 SET_CALLED | |
| 62 }; | |
| 63 | |
| 64 // The HMAC interface currently does not support incremental signing. To work | |
| 65 // around this, each piece of data is signed and the signature is added to a | |
| 66 // buffer. If there is not enough space in the buffer to accommodate new | |
| 67 // data, the buffer contents are signed and the new signature replaces the | |
| 68 // contents of the buffer. CompressBuffer performs this operation. In | |
| 69 // affect, a hash tree is constructed to emulate incremental signing. | |
| 70 void CompressBuffer(); | |
| 71 | |
| 72 // Track the state of the query to detect suspicious method calls. | |
| 73 QueryState state_; | |
| 74 | |
| 75 crypto::HMAC hasher_; | |
| 76 NaClValidationDB* db_; | |
| 77 | |
| 78 // The size of buffer_ is a somewhat arbitrary choice. It needs to be at | |
| 79 // at least kDigestLength * 2, but it can be arbitrarily large. In practice | |
| 80 // there are 4 calls to AddData (version, architechture, cpu features, and | |
| 81 // code), so 4 times digest length means the buffer will not need to be | |
| 82 // compressed as an intermediate step in the expected use cases. | |
| 83 char buffer_[kDigestLength * 4]; | |
| 84 size_t buffer_length_; | |
| 85 | |
| 86 DISALLOW_COPY_AND_ASSIGN(NaClValidationQuery); | |
| 87 }; | |
| 88 | |
| 89 // Create a validation cache interface for use by sel_ldr. | |
| 90 struct NaClValidationCache* CreateValidationCache( | |
| 91 NaClValidationDB* db, const std::string& profile_key, | |
| 92 const std::string& nacl_version); | |
| 93 | |
| 94 #endif // CHROME_NACL_NACL_VALIDATION_QUERY_H_ | |
| OLD | NEW |