/*
 * Copyright 2016 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 SECURE_STORAGE_H_
#define SECURE_STORAGE_H_

#include <stddef.h>
#include <stdint.h>

namespace avb {

// Abstract interface for secure storage.
class SecureStorageInterface {
public:
    SecureStorageInterface() = default;
    virtual ~SecureStorageInterface() = default;

    // SecureStorageInterface is neither copyable nor moveable
    SecureStorageInterface(const SecureStorageInterface&) = delete;
    SecureStorageInterface& operator=(const SecureStorageInterface&) = delete;

    // Opens a file in secure storage named |filename|.
    //
    // Returns NO_ERROR on success, negative error code on failure.
    virtual int open(const char* filename) = 0;

    // Deletes a file in secure storage named |filename|.
    //
    // Returns NO_ERROR on success, negative error code on failure.
    virtual int delete_file(const char* filename) = 0;

    // Reads |size| bytes into |buf| from the file starting at offset |off|. The
    // file must have been previously opened by open().
    //
    // Returns number of bytes read on success, negative error code on failure.
    virtual int read(uint64_t off, void* buf, size_t size) const = 0;

    // Gets the size of the file in secure storage previously opened with open()
    // and stores it in |size|.
    //
    // Returns NO_ERROR on success, negative error code on failure.
    virtual int get_file_size(uint64_t* size) const = 0;

    // Writes |size| bytes from |buf| into the file starting at offset |off|.
    // The file must have been previously opened by open().
    //
    // Returns number of bytes written on succes, negative error code on
    // failure.
    virtual int write(uint64_t off, const void* buf, size_t size) const = 0;
};

}  // namespace avb

#endif  // SECURE_STORAGE_H_