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