// Copyright 2017 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef SRC_SECURITY_FCRYPTO_BYTES_H_
#define SRC_SECURITY_FCRYPTO_BYTES_H_

#include <stddef.h>
#include <stdint.h>
#include <zircon/types.h>

#include <memory>

#include <fbl/macros.h>

// |crypto::Bytes| is a small helper class that simply wraps a buffer.  It saves on some boilerplate
// when allocating a buffer.  More importantly, when going out of scope, the destructor guarantees
// that the buffer will be zeroed in a way that will not be optimized away.  Any buffer that holds
// cryptographically sensitive random data should be a |Bytes| and get its data via a call to
// |Bytes::Randomize|.
namespace crypto {

class __EXPORT Bytes final {
 public:
  Bytes();
  ~Bytes();

  // Accessors
  const uint8_t* get() const { return buf_.get(); }
  uint8_t* get() { return buf_.get(); }
  size_t len() const { return len_; }

  // Resizes the underlying buffer to |len| bytes and fills it with random data.
  zx_status_t Randomize() { return Randomize(len_); }
  zx_status_t Randomize(size_t len);

  // Resize the underlying buffer.  If the new length is shorter, the data is truncated.  If it is
  // longer, it is padded with the given |fill| value.
  zx_status_t Resize(size_t size, uint8_t fill = 0);

  // Copies |len| bytes from |src| to |dst_off| in the underlying buffer.  Resizes the buffer as
  // needed, padding with zeros.
  zx_status_t Copy(const void* src, size_t len, zx_off_t dst_off = 0);
  zx_status_t Copy(const Bytes& src, zx_off_t dst_off = 0) {
    return Copy(src.get(), src.len(), dst_off);
  }

  // Array access operators.  Assert that |off| is not out of bounds.
  const uint8_t& operator[](zx_off_t off) const;
  uint8_t& operator[](zx_off_t off);

  // Comparison operators.  These are guaranteed to be constant-time.
  bool operator==(const Bytes& other) const;
  bool operator!=(const Bytes& other) const { return !(*this == other); }

 private:
  DISALLOW_COPY_AND_ASSIGN_ALLOW_MOVE(Bytes);

  // The underlying buffer.
  std::unique_ptr<uint8_t[]> buf_;
  // Length in bytes of memory currently allocated to the underlying buffer.
  size_t len_;
};

}  // namespace crypto

#endif  // SRC_SECURITY_FCRYPTO_BYTES_H_
