//
// Copyright (C) 2014 The Android Open Source Project
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//      http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//

#ifndef TRUNKS_ERROR_CODES_H_
#define TRUNKS_ERROR_CODES_H_

#include <string>

#include "trunks/tpm_generated.h"  // For TPM_RC.
#include "trunks/trunks_export.h"

namespace trunks {

// Use the TPM_RC type but with different layer bits (12 - 15). Choose the layer
// value arbitrarily. Currently TSS2 uses 9 for TCTI and 8 for SAPI.
// TCTI and SAPI error codes taken from
// http://www.trustedcomputinggroup.org/resources/
// tss_system_level_api_and_tpm_command_transmission_interface_specification
const TPM_RC kTrunksErrorBase = (7 << 12);
const TPM_RC kTctiErrorBase = (8 << 12);
const TPM_RC kSapiErrorBase = (9 << 12);
const TPM_RC kResourceManagerTpmErrorBase = (11 << 12);
const TPM_RC kResourceManagerErrorBase = (12 << 12);

const TPM_RC TRUNKS_RC_AUTHORIZATION_FAILED = kTrunksErrorBase + 1;
const TPM_RC TRUNKS_RC_ENCRYPTION_FAILED = kTrunksErrorBase + 2;
const TPM_RC TRUNKS_RC_READ_ERROR = kTrunksErrorBase + 3;
const TPM_RC TRUNKS_RC_WRITE_ERROR = kTrunksErrorBase + 4;
const TPM_RC TRUNKS_RC_IPC_ERROR = kTrunksErrorBase + 5;
const TPM_RC TRUNKS_RC_SESSION_SETUP_ERROR = kTrunksErrorBase + 6;
const TPM_RC TRUNKS_RC_INVALID_TPM_CONFIGURATION = kTrunksErrorBase + 7;

const TPM_RC TCTI_RC_TRY_AGAIN = kTctiErrorBase + 1;
const TPM_RC TCTI_RC_GENERAL_FAILURE = kTctiErrorBase + 2;
const TPM_RC TCTI_RC_BAD_CONTEXT = kTctiErrorBase + 3;
const TPM_RC TCTI_RC_WRONG_ABI_VERSION = kTctiErrorBase + 4;
const TPM_RC TCTI_RC_NOT_IMPLEMENTED = kTctiErrorBase + 5;
const TPM_RC TCTI_RC_BAD_PARAMETER = kTctiErrorBase + 6;
const TPM_RC TCTI_RC_INSUFFICIENT_BUFFER = kTctiErrorBase + 7;
const TPM_RC TCTI_RC_NO_CONNECTION = kTctiErrorBase + 8;
const TPM_RC TCTI_RC_DRIVER_NOT_FOUND = kTctiErrorBase + 9;
const TPM_RC TCTI_RC_DRIVERINFO_NOT_FOUND = kTctiErrorBase + 10;
const TPM_RC TCTI_RC_NO_RESPONSE = kTctiErrorBase + 11;
const TPM_RC TCTI_RC_BAD_VALUE = kTctiErrorBase + 12;

const TPM_RC SAPI_RC_INVALID_SESSIONS = kSapiErrorBase + 1;
const TPM_RC SAPI_RC_ABI_MISMATCH = kSapiErrorBase + 2;
const TPM_RC SAPI_RC_INSUFFICIENT_BUFFER = kSapiErrorBase + 3;
const TPM_RC SAPI_RC_BAD_PARAMETER = kSapiErrorBase + 4;
const TPM_RC SAPI_RC_BAD_SEQUENCE = kSapiErrorBase + 5;
const TPM_RC SAPI_RC_NO_DECRYPT_PARAM = kSapiErrorBase + 6;
const TPM_RC SAPI_RC_NO_ENCRYPT_PARAM = kSapiErrorBase + 7;
const TPM_RC SAPI_RC_NO_RESPONSE_RECEIVED = kSapiErrorBase + 8;
const TPM_RC SAPI_RC_BAD_SIZE = kSapiErrorBase + 9;
const TPM_RC SAPI_RC_CORRUPTED_DATA = kSapiErrorBase + 10;
const TPM_RC SAPI_RC_INSUFFICIENT_CONTEXT = kSapiErrorBase + 11;
const TPM_RC SAPI_RC_INSUFFICIENT_RESPONSE = kSapiErrorBase + 12;
const TPM_RC SAPI_RC_INCOMPATIBLE_TCTI = kSapiErrorBase + 13;
const TPM_RC SAPI_RC_MALFORMED_RESPONSE = kSapiErrorBase + 14;
const TPM_RC SAPI_RC_BAD_TCTI_STRUCTURE = kSapiErrorBase + 15;

// Returns a description of |error|.
TRUNKS_EXPORT std::string GetErrorString(TPM_RC error);

// Strips the P and N bits from a 'format one' error. If the given error code
// is not a format one error, it is returned as is. The error that is returned
// can be compared to TPM_RC_* constant values. See TPM 2.0 Part 2 Section 6.6
// for details on format one errors.
TRUNKS_EXPORT TPM_RC GetFormatOneError(TPM_RC error);

// Creates a well-formed response with the given |error_code|.
TRUNKS_EXPORT std::string CreateErrorResponse(TPM_RC error_code);

}  // namespace trunks

#endif  // TRUNKS_ERROR_CODES_H_
