// Copyright 2017 The Chromium OS 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 CRYPTOHOME_DIRCRYPTO_UTIL_H_
#define CRYPTOHOME_DIRCRYPTO_UTIL_H_

#include <base/files/file_path.h>
#include <brillo/secure_blob.h>

extern "C" {
#include <keyutils.h>
#include <linux/fscrypt.h>
}

namespace dircrypto {

// State of the directory's encryption key.
enum class KeyState {
  UNKNOWN,        // Cannot get the state.
  NOT_SUPPORTED,  // The directory doesn't support dircrypto.
  NO_KEY,         // No key is set.
  ENCRYPTED,      // Key is set.
};

// KeyReference describes an in-use fscrypt key.
struct KeyReference {
  // Policy version: FSCRYPT_POLICY_V2 is only supported on kernels >= 5.4.
  int policy_version = FSCRYPT_POLICY_V1;
  // Key identifier/descriptor.
  brillo::SecureBlob reference;
};

// keyutils functions use -1 as the invalid key serial value.
constexpr key_serial_t kInvalidKeySerial = -1;

// Checks if the device supports fscrypt key add/remove ioctls.
bool CheckFscryptKeyIoctlSupport();

// Sets the directory key.
bool SetDirectoryKey(const base::FilePath& dir,
                     const KeyReference& key_reference);

// Adds the directory key.
bool AddDirectoryKey(const brillo::SecureBlob& key,
                     KeyReference* key_reference);

// Removes the directory key.
bool RemoveDirectoryKey(const KeyReference& key_reference,
                        const base::FilePath& dir);

// Returns the directory's key state, or returns UNKNOWN on errors.
KeyState GetDirectoryKeyState(const base::FilePath& dir);

// Returns the directory's policy version or returns -1.
int GetDirectoryPolicyVersion(const base::FilePath& dir);

}  // namespace dircrypto

#endif  // CRYPTOHOME_DIRCRYPTO_UTIL_H_
