//
// 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 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_
