123d4a742109fa29d6be20d3dc56a1b48797fe7b2Shawn Willden/* 223d4a742109fa29d6be20d3dc56a1b48797fe7b2Shawn Willden * Copyright (C) 2015 The Android Open Source Project 323d4a742109fa29d6be20d3dc56a1b48797fe7b2Shawn Willden * 423d4a742109fa29d6be20d3dc56a1b48797fe7b2Shawn Willden * Licensed under the Apache License, Version 2.0 (the "License"); 523d4a742109fa29d6be20d3dc56a1b48797fe7b2Shawn Willden * you may not use this file except in compliance with the License. 623d4a742109fa29d6be20d3dc56a1b48797fe7b2Shawn Willden * You may obtain a copy of the License at 723d4a742109fa29d6be20d3dc56a1b48797fe7b2Shawn Willden * 823d4a742109fa29d6be20d3dc56a1b48797fe7b2Shawn Willden * http://www.apache.org/licenses/LICENSE-2.0 923d4a742109fa29d6be20d3dc56a1b48797fe7b2Shawn Willden * 1023d4a742109fa29d6be20d3dc56a1b48797fe7b2Shawn Willden * Unless required by applicable law or agreed to in writing, software 1123d4a742109fa29d6be20d3dc56a1b48797fe7b2Shawn Willden * distributed under the License is distributed on an "AS IS" BASIS, 1223d4a742109fa29d6be20d3dc56a1b48797fe7b2Shawn Willden * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1323d4a742109fa29d6be20d3dc56a1b48797fe7b2Shawn Willden * See the License for the specific language governing permissions and 1423d4a742109fa29d6be20d3dc56a1b48797fe7b2Shawn Willden * limitations under the License. 1523d4a742109fa29d6be20d3dc56a1b48797fe7b2Shawn Willden */ 1623d4a742109fa29d6be20d3dc56a1b48797fe7b2Shawn Willden 17f54cc93ccf57a94f9a2c660dbf3e06494adf178dJanis Danisevskis#include <keymaster/operation_table.h> 18f54cc93ccf57a94f9a2c660dbf3e06494adf178dJanis Danisevskis#include <keymaster/operation.h> 19f3dc0b841da2c8938e4a8081ef6c6199ed92c876Janis Danisevskis#include <keymaster/android_keymaster_utils.h> 2023d4a742109fa29d6be20d3dc56a1b48797fe7b2Shawn Willden 2141d5a7486e335387c8dd9437e0c84b285b5c7f28Janis Danisevskis#include <keymaster/new> 2223d4a742109fa29d6be20d3dc56a1b48797fe7b2Shawn Willden 2323d4a742109fa29d6be20d3dc56a1b48797fe7b2Shawn Willdennamespace keymaster { 2423d4a742109fa29d6be20d3dc56a1b48797fe7b2Shawn Willden 25dc877aea40979bb5a18206cd9cec7bb4f31442e2Janis Danisevskiskeymaster_error_t OperationTable::Add(OperationPtr&& operation) { 26f3dc0b841da2c8938e4a8081ef6c6199ed92c876Janis Danisevskis if (!table_) { 27dc877aea40979bb5a18206cd9cec7bb4f31442e2Janis Danisevskis table_.reset(new (std::nothrow) OperationPtr[table_size_]); 28f3dc0b841da2c8938e4a8081ef6c6199ed92c876Janis Danisevskis if (!table_) 2923d4a742109fa29d6be20d3dc56a1b48797fe7b2Shawn Willden return KM_ERROR_MEMORY_ALLOCATION_FAILED; 3023d4a742109fa29d6be20d3dc56a1b48797fe7b2Shawn Willden } 3123d4a742109fa29d6be20d3dc56a1b48797fe7b2Shawn Willden for (size_t i = 0; i < table_size_; ++i) { 32dc877aea40979bb5a18206cd9cec7bb4f31442e2Janis Danisevskis if (!table_[i]) { 33dc877aea40979bb5a18206cd9cec7bb4f31442e2Janis Danisevskis table_[i] = move(operation); 3423d4a742109fa29d6be20d3dc56a1b48797fe7b2Shawn Willden return KM_ERROR_OK; 3523d4a742109fa29d6be20d3dc56a1b48797fe7b2Shawn Willden } 3623d4a742109fa29d6be20d3dc56a1b48797fe7b2Shawn Willden } 3723d4a742109fa29d6be20d3dc56a1b48797fe7b2Shawn Willden return KM_ERROR_TOO_MANY_OPERATIONS; 3823d4a742109fa29d6be20d3dc56a1b48797fe7b2Shawn Willden} 3923d4a742109fa29d6be20d3dc56a1b48797fe7b2Shawn Willden 4023d4a742109fa29d6be20d3dc56a1b48797fe7b2Shawn WilldenOperation* OperationTable::Find(keymaster_operation_handle_t op_handle) { 4123d4a742109fa29d6be20d3dc56a1b48797fe7b2Shawn Willden if (op_handle == 0) 4223d4a742109fa29d6be20d3dc56a1b48797fe7b2Shawn Willden return NULL; 4323d4a742109fa29d6be20d3dc56a1b48797fe7b2Shawn Willden 4423d4a742109fa29d6be20d3dc56a1b48797fe7b2Shawn Willden if (!table_.get()) 4523d4a742109fa29d6be20d3dc56a1b48797fe7b2Shawn Willden return NULL; 4623d4a742109fa29d6be20d3dc56a1b48797fe7b2Shawn Willden 4723d4a742109fa29d6be20d3dc56a1b48797fe7b2Shawn Willden for (size_t i = 0; i < table_size_; ++i) { 48f3dc0b841da2c8938e4a8081ef6c6199ed92c876Janis Danisevskis if (table_[i] && table_[i]->operation_handle() == op_handle) 49dc877aea40979bb5a18206cd9cec7bb4f31442e2Janis Danisevskis return table_[i].get(); 5023d4a742109fa29d6be20d3dc56a1b48797fe7b2Shawn Willden } 5123d4a742109fa29d6be20d3dc56a1b48797fe7b2Shawn Willden return NULL; 5223d4a742109fa29d6be20d3dc56a1b48797fe7b2Shawn Willden} 5323d4a742109fa29d6be20d3dc56a1b48797fe7b2Shawn Willden 5423d4a742109fa29d6be20d3dc56a1b48797fe7b2Shawn Willdenbool OperationTable::Delete(keymaster_operation_handle_t op_handle) { 5523d4a742109fa29d6be20d3dc56a1b48797fe7b2Shawn Willden if (!table_.get()) 5623d4a742109fa29d6be20d3dc56a1b48797fe7b2Shawn Willden return false; 5723d4a742109fa29d6be20d3dc56a1b48797fe7b2Shawn Willden 5823d4a742109fa29d6be20d3dc56a1b48797fe7b2Shawn Willden for (size_t i = 0; i < table_size_; ++i) { 59f3dc0b841da2c8938e4a8081ef6c6199ed92c876Janis Danisevskis if (table_[i] && table_[i]->operation_handle() == op_handle) { 60dc877aea40979bb5a18206cd9cec7bb4f31442e2Janis Danisevskis table_[i].reset(); 6123d4a742109fa29d6be20d3dc56a1b48797fe7b2Shawn Willden return true; 6223d4a742109fa29d6be20d3dc56a1b48797fe7b2Shawn Willden } 6323d4a742109fa29d6be20d3dc56a1b48797fe7b2Shawn Willden } 6423d4a742109fa29d6be20d3dc56a1b48797fe7b2Shawn Willden return false; 6523d4a742109fa29d6be20d3dc56a1b48797fe7b2Shawn Willden} 6623d4a742109fa29d6be20d3dc56a1b48797fe7b2Shawn Willden 6723d4a742109fa29d6be20d3dc56a1b48797fe7b2Shawn Willden} // namespace keymaster 68