| Index: src/trusted/validator/validation_cache.c
|
| diff --git a/src/trusted/validator/validation_cache.c b/src/trusted/validator/validation_cache.c
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..cf4a3aec6bfcba473fd372ccbbb2b7932948a169
|
| --- /dev/null
|
| +++ b/src/trusted/validator/validation_cache.c
|
| @@ -0,0 +1,54 @@
|
| +/*
|
| + * Copyright (c) 2013 The Native Client Authors. All rights reserved.
|
| + * Use of this source code is governed by a BSD-style license that can be
|
| + * found in the LICENSE file.
|
| + */
|
| +
|
| +#include "native_client/src/trusted/validator/validation_cache.h"
|
| +
|
| +#include "native_client/src/shared/platform/nacl_check.h"
|
| +#include "native_client/src/trusted/validator/validation_metadata.h"
|
| +
|
| +#define ADD_LITERAL(cache, query, data) \
|
| + ((cache)->AddData((query), (uint8_t*)&(data), sizeof(data)))
|
| +
|
| +void AddCodeIdentity(uint8_t *data,
|
| + size_t size,
|
| + const struct NaClValidationMetadata *metadata,
|
| + struct NaClValidationCache *cache,
|
| + void *query) {
|
| + NaClCodeIdentityType identity_type;
|
| + if (NULL != metadata) {
|
| + identity_type = metadata->identity_type;
|
| + } else {
|
| + /* Fallback: identity unknown, treat it as anonymous data. */
|
| + identity_type = NaClCodeIdentityData;
|
| + }
|
| + CHECK(identity_type < NaClCodeIdentityMax);
|
| +
|
| + /*
|
| + * Explicitly record the type of identity being used to prevent attacks
|
| + * that confuse the payload of different identity types.
|
| + */
|
| + ADD_LITERAL(cache, query, identity_type);
|
| +
|
| + if (identity_type == NaClCodeIdentityFile) {
|
| + /* Sanity checks. */
|
| + CHECK(metadata->file_name);
|
| + CHECK(metadata->file_name_length);
|
| + CHECK(metadata->code_offset + (int64_t) size <= metadata->file_size);
|
| +
|
| + /* The location of the code in the file. */
|
| + ADD_LITERAL(cache, query, metadata->code_offset);
|
| + ADD_LITERAL(cache, query, size);
|
| +
|
| + /* The identity of the file. */
|
| + cache->AddData(query, (uint8_t *) metadata->file_name,
|
| + metadata->file_name_length);
|
| + ADD_LITERAL(cache, query, metadata->file_size);
|
| + ADD_LITERAL(cache, query, metadata->mtime);
|
| + } else {
|
| + /* Hash all the code. */
|
| + cache->AddData(query, data, size);
|
| + }
|
| +}
|
|
|