Android-cuttlefish cvd tool
Classes | Macros | Typedefs | Functions | Variables
f2fscrypt.c File Reference
#include <f2fs_fs.h>
#include <assert.h>
#include <errno.h>
#include <getopt.h>
#include <dirent.h>
#include <stdarg.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/ioctl.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <fcntl.h>
#include <termios.h>
#include <unistd.h>
#include <signal.h>
#include <sys/syscall.h>
Include dependency graph for f2fscrypt.c:

Classes

struct  f2fs_fscrypt_policy
 
struct  f2fs_encryption_key
 
struct  salt
 
struct  keyring_map
 
struct  cmd_desc
 

Macros

#define _GNU_SOURCE
 
#define F2FS_MAX_KEY_SIZE   64
 
#define F2FS_MAX_PASSPHRASE_SIZE   1024
 
#define F2FS_MAX_SALT_SIZE   256
 
#define F2FS_ENCRYPTION_MODE_INVALID   0
 
#define F2FS_ENCRYPTION_MODE_AES_256_XTS   1
 
#define F2FS_ENCRYPTION_MODE_AES_256_GCM   2
 
#define F2FS_ENCRYPTION_MODE_AES_256_CBC   3
 
#define F2FS_ENCRYPTION_MODE_AES_256_CTS   4
 
#define F2FS_AES_256_XTS_KEY_SIZE   64
 
#define F2FS_AES_256_GCM_KEY_SIZE   32
 
#define F2FS_AES_256_CBC_KEY_SIZE   32
 
#define F2FS_AES_256_CTS_KEY_SIZE   32
 
#define F2FS_MAX_KEY_SIZE   64
 
#define F2FS_MAX_PASSPHRASE_SIZE   1024
 
#define F2FS_MAX_SALT_SIZE   256
 
#define F2FS_PBKDF2_ITERATIONS   0xFFFF
 
#define KEY_SPEC_THREAD_KEYRING   -1
 
#define KEY_SPEC_PROCESS_KEYRING   -2
 
#define KEY_SPEC_SESSION_KEYRING   -3
 
#define KEY_SPEC_USER_KEYRING   -4
 
#define KEY_SPEC_USER_SESSION_KEYRING   -5
 
#define KEY_SPEC_GROUP_KEYRING   -6
 
#define KEYCTL_GET_KEYRING_ID   0
 
#define KEYCTL_JOIN_SESSION_KEYRING   1
 
#define KEYCTL_DESCRIBE   6
 
#define KEYCTL_SEARCH   10
 
#define KEYCTL_SESSION_TO_PARENT   18
 
#define F2FS_KEY_DESCRIPTOR_SIZE   8
 
#define F2FS_KEY_REF_STR_BUF_SIZE   ((F2FS_KEY_DESCRIPTOR_SIZE * 2) + 1)
 
#define F2FS_IOC_SET_ENCRYPTION_POLICY   _IOR('f', 19, struct f2fs_fscrypt_policy)
 
#define F2FS_IOC_GET_ENCRYPTION_PWSALT   _IOW('f', 20, __u8[16])
 
#define F2FS_IOC_GET_ENCRYPTION_POLICY   _IOW('f', 21, struct f2fs_fscrypt_policy)
 
#define OPT_VERBOSE   0x0001
 
#define OPT_QUIET   0x0002
 
#define SHA512_LENGTH   64
 
#define F2FS_KEY_TYPE_LOGON   "logon"
 
#define F2FS_KEY_DESC_PREFIX   "f2fs:"
 
#define F2FS_KEY_DESC_PREFIX_SIZE   5
 
#define PARSE_FLAGS_NOTSUPP_OK   0x0001
 
#define PARSE_FLAGS_FORCE_FN   0x0002
 
#define CMD_HIDDEN   0x0001
 
#define add_key_desc   "adds a key to the user's keyring"
 
#define add_key_help
 
#define set_policy_desc   "sets a policy for directories"
 
#define set_policy_help
 
#define get_policy_desc   "get the encryption for directories"
 
#define get_policy_help
 
#define new_session_desc   "give the invoking process a new session keyring"
 
#define new_session_help
 
#define CMD(name)   { #name, do_##name, name##_desc, name##_help, 0 }
 
#define _CMD(name)   { #name, do_##name, NULL, NULL, CMD_HIDDEN }
 

Typedefs

typedef unsigned char uuid_t[16]
 
typedef int32_t key_serial_t
 

Functions

void f2fs_sha512 (const unsigned char *in, unsigned long in_size, unsigned char *out)
 
static long keyctl (int cmd,...)
 
static key_serial_t add_key (const char *type, const char *description, const void *payload, size_t plen, key_serial_t keyring)
 
static int int_log2 (int arg)
 
static void validate_paths (int argc, char *argv[], int path_start_index)
 
static int hex2byte (const char *hex, size_t hex_size, unsigned char *bytes, size_t bytes_size)
 
static struct saltfind_by_salt (unsigned char *salt, size_t salt_len)
 
static void add_salt (unsigned char *salt, size_t salt_len)
 
static void clear_secrets (void)
 
static void die_signal_handler (int UNUSED(signum), siginfo_t *UNUSED(siginfo), void *UNUSED(context))
 
static void sigcatcher_setup (void)
 
static void parse_salt (char *salt_str, int flags)
 
static void set_policy (struct salt *set_salt, int pad, int argc, char *argv[], int path_start_index)
 
static void pbkdf2_sha512 (const char *passphrase, struct salt *salt, unsigned int count, unsigned char derived_key[F2FS_MAX_KEY_SIZE])
 
static int disable_echo (struct termios *saved_settings)
 
static void get_passphrase (char *passphrase, int len)
 
static int get_keyring_id (const char *keyring)
 
static void generate_key_ref_str (struct salt *salt)
 
static void insert_key_into_keyring (const char *keyring, struct salt *salt)
 
static void get_default_salts (void)
 
static void do_help (int argc, char **argv, const struct cmd_desc *cmd)
 
static void do_add_key (int argc, char **argv, const struct cmd_desc *cmd)
 
static void do_set_policy (int argc, char **argv, const struct cmd_desc *cmd)
 
static void do_get_policy (int argc, char **argv, const struct cmd_desc *cmd)
 
static void do_new_session (int argc, char **UNUSED(argv), const struct cmd_desc *cmd)
 
static void do_help (int argc, char **argv, const struct cmd_desc *UNUSED(cmd))
 
int main (int argc, char *argv[])
 

Variables

int options
 
static const unsigned char * hexchars = (const unsigned char *) "0123456789abcdef"
 
static const size_t hexchars_size = 16
 
struct saltsalt_list
 
unsigned num_salt
 
unsigned max_salt
 
char in_passphrase [F2FS_MAX_PASSPHRASE_SIZE]
 
static const struct keyring_map keyrings []
 
const struct cmd_desc cmd_list []
 

Macro Definition Documentation

◆ _CMD

#define _CMD (   name)    { #name, do_##name, NULL, NULL, CMD_HIDDEN }

◆ _GNU_SOURCE

#define _GNU_SOURCE

◆ add_key_desc

#define add_key_desc   "adds a key to the user's keyring"

◆ add_key_help

#define add_key_help
Value:
"f2fscrypt add_key -S salt [ -k keyring ] [-v] [-q] [ path ... ]\n\n" \
"Prompts the user for a passphrase and inserts it into the specified\n" \
"keyring. If no keyring is specified, f2fscrypt will use the session\n" \
"keyring if it exists or the user session keyring if it does not.\n\n" \
"If one or more directory paths are specified, f2fscrypt will try to\n" \
"set the policy of those directories to use the key just entered by\n" \
"the user.\n"

◆ CMD

#define CMD (   name)    { #name, do_##name, name##_desc, name##_help, 0 }

◆ CMD_HIDDEN

#define CMD_HIDDEN   0x0001

◆ F2FS_AES_256_CBC_KEY_SIZE

#define F2FS_AES_256_CBC_KEY_SIZE   32

◆ F2FS_AES_256_CTS_KEY_SIZE

#define F2FS_AES_256_CTS_KEY_SIZE   32

◆ F2FS_AES_256_GCM_KEY_SIZE

#define F2FS_AES_256_GCM_KEY_SIZE   32

◆ F2FS_AES_256_XTS_KEY_SIZE

#define F2FS_AES_256_XTS_KEY_SIZE   64

◆ F2FS_ENCRYPTION_MODE_AES_256_CBC

#define F2FS_ENCRYPTION_MODE_AES_256_CBC   3

◆ F2FS_ENCRYPTION_MODE_AES_256_CTS

#define F2FS_ENCRYPTION_MODE_AES_256_CTS   4

◆ F2FS_ENCRYPTION_MODE_AES_256_GCM

#define F2FS_ENCRYPTION_MODE_AES_256_GCM   2

◆ F2FS_ENCRYPTION_MODE_AES_256_XTS

#define F2FS_ENCRYPTION_MODE_AES_256_XTS   1

◆ F2FS_ENCRYPTION_MODE_INVALID

#define F2FS_ENCRYPTION_MODE_INVALID   0

◆ F2FS_IOC_GET_ENCRYPTION_POLICY

#define F2FS_IOC_GET_ENCRYPTION_POLICY   _IOW('f', 21, struct f2fs_fscrypt_policy)

◆ F2FS_IOC_GET_ENCRYPTION_PWSALT

#define F2FS_IOC_GET_ENCRYPTION_PWSALT   _IOW('f', 20, __u8[16])

◆ F2FS_IOC_SET_ENCRYPTION_POLICY

#define F2FS_IOC_SET_ENCRYPTION_POLICY   _IOR('f', 19, struct f2fs_fscrypt_policy)

◆ F2FS_KEY_DESC_PREFIX

#define F2FS_KEY_DESC_PREFIX   "f2fs:"

◆ F2FS_KEY_DESC_PREFIX_SIZE

#define F2FS_KEY_DESC_PREFIX_SIZE   5

◆ F2FS_KEY_DESCRIPTOR_SIZE

#define F2FS_KEY_DESCRIPTOR_SIZE   8

◆ F2FS_KEY_REF_STR_BUF_SIZE

#define F2FS_KEY_REF_STR_BUF_SIZE   ((F2FS_KEY_DESCRIPTOR_SIZE * 2) + 1)

◆ F2FS_KEY_TYPE_LOGON

#define F2FS_KEY_TYPE_LOGON   "logon"

◆ F2FS_MAX_KEY_SIZE [1/2]

#define F2FS_MAX_KEY_SIZE   64

◆ F2FS_MAX_KEY_SIZE [2/2]

#define F2FS_MAX_KEY_SIZE   64

◆ F2FS_MAX_PASSPHRASE_SIZE [1/2]

#define F2FS_MAX_PASSPHRASE_SIZE   1024

◆ F2FS_MAX_PASSPHRASE_SIZE [2/2]

#define F2FS_MAX_PASSPHRASE_SIZE   1024

◆ F2FS_MAX_SALT_SIZE [1/2]

#define F2FS_MAX_SALT_SIZE   256

◆ F2FS_MAX_SALT_SIZE [2/2]

#define F2FS_MAX_SALT_SIZE   256

◆ F2FS_PBKDF2_ITERATIONS

#define F2FS_PBKDF2_ITERATIONS   0xFFFF

◆ get_policy_desc

#define get_policy_desc   "get the encryption for directories"

◆ get_policy_help

#define get_policy_help
Value:
"f2fscrypt get_policy path ... \n\n" \
"Gets the policy for the directories specified on the command line.\n"

◆ KEY_SPEC_GROUP_KEYRING

#define KEY_SPEC_GROUP_KEYRING   -6

◆ KEY_SPEC_PROCESS_KEYRING

#define KEY_SPEC_PROCESS_KEYRING   -2

◆ KEY_SPEC_SESSION_KEYRING

#define KEY_SPEC_SESSION_KEYRING   -3

◆ KEY_SPEC_THREAD_KEYRING

#define KEY_SPEC_THREAD_KEYRING   -1

◆ KEY_SPEC_USER_KEYRING

#define KEY_SPEC_USER_KEYRING   -4

◆ KEY_SPEC_USER_SESSION_KEYRING

#define KEY_SPEC_USER_SESSION_KEYRING   -5

◆ KEYCTL_DESCRIBE

#define KEYCTL_DESCRIBE   6

◆ KEYCTL_GET_KEYRING_ID

#define KEYCTL_GET_KEYRING_ID   0

◆ KEYCTL_JOIN_SESSION_KEYRING

#define KEYCTL_JOIN_SESSION_KEYRING   1

◆ KEYCTL_SEARCH

#define KEYCTL_SEARCH   10

◆ KEYCTL_SESSION_TO_PARENT

#define KEYCTL_SESSION_TO_PARENT   18

◆ new_session_desc

#define new_session_desc   "give the invoking process a new session keyring"

◆ new_session_help

#define new_session_help
Value:
"f2fscrypt new_session\n\n" \
"Give the invoking process (typically a shell) a new session keyring,\n" \
"discarding its old session keyring.\n"

◆ OPT_QUIET

#define OPT_QUIET   0x0002

◆ OPT_VERBOSE

#define OPT_VERBOSE   0x0001

◆ PARSE_FLAGS_FORCE_FN

#define PARSE_FLAGS_FORCE_FN   0x0002

◆ PARSE_FLAGS_NOTSUPP_OK

#define PARSE_FLAGS_NOTSUPP_OK   0x0001

◆ set_policy_desc

#define set_policy_desc   "sets a policy for directories"

◆ set_policy_help

#define set_policy_help
Value:
"f2fscrypt set_policy policy path ... \n\n" \
"Sets the policy for the directories specified on the command line.\n" \
"All directories must be empty to set the policy; if the directory\n" \
"already has a policy established, f2fscrypt will validate that it the\n" \
"policy matches what was specified. A policy is an encryption key\n" \
"identifier consisting of 16 hexadecimal characters.\n"

◆ SHA512_LENGTH

#define SHA512_LENGTH   64

Typedef Documentation

◆ key_serial_t

typedef int32_t key_serial_t

◆ uuid_t

typedef unsigned char uuid_t[16]

Function Documentation

◆ add_key()

static key_serial_t add_key ( const char *  type,
const char *  description,
const void *  payload,
size_t  plen,
key_serial_t  keyring 
)
static

◆ add_salt()

static void add_salt ( unsigned char *  salt,
size_t  salt_len 
)
static

◆ clear_secrets()

static void clear_secrets ( void  )
static

◆ die_signal_handler()

static void die_signal_handler ( int   UNUSEDsignum,
siginfo_t *  UNUSEDsiginfo,
void *  UNUSEDcontext 
)
static

◆ disable_echo()

static int disable_echo ( struct termios *  saved_settings)
static

◆ do_add_key()

static void do_add_key ( int  argc,
char **  argv,
const struct cmd_desc cmd 
)
static

◆ do_get_policy()

static void do_get_policy ( int  argc,
char **  argv,
const struct cmd_desc cmd 
)
static

◆ do_help() [1/2]

static void do_help ( int  argc,
char **  argv,
const struct cmd_desc cmd 
)
static

◆ do_help() [2/2]

static void do_help ( int  argc,
char **  argv,
const struct cmd_desc UNUSEDcmd 
)
static

◆ do_new_session()

static void do_new_session ( int  argc,
char **  UNUSEDargv,
const struct cmd_desc cmd 
)
static

◆ do_set_policy()

static void do_set_policy ( int  argc,
char **  argv,
const struct cmd_desc cmd 
)
static

◆ f2fs_sha512()

void f2fs_sha512 ( const unsigned char *  in,
unsigned long  in_size,
unsigned char *  out 
)

◆ find_by_salt()

static struct salt * find_by_salt ( unsigned char *  salt,
size_t  salt_len 
)
static

◆ generate_key_ref_str()

static void generate_key_ref_str ( struct salt salt)
static

◆ get_default_salts()

static void get_default_salts ( void  )
static

◆ get_keyring_id()

static int get_keyring_id ( const char *  keyring)
static

◆ get_passphrase()

static void get_passphrase ( char *  passphrase,
int  len 
)
static

◆ hex2byte()

static int hex2byte ( const char *  hex,
size_t  hex_size,
unsigned char *  bytes,
size_t  bytes_size 
)
static

◆ insert_key_into_keyring()

static void insert_key_into_keyring ( const char *  keyring,
struct salt salt 
)
static

◆ int_log2()

static int int_log2 ( int  arg)
static

◆ keyctl()

static long keyctl ( int  cmd,
  ... 
)
static

◆ main()

int main ( int  argc,
char *  argv[] 
)

◆ parse_salt()

static void parse_salt ( char *  salt_str,
int  flags 
)
static

◆ pbkdf2_sha512()

static void pbkdf2_sha512 ( const char *  passphrase,
struct salt salt,
unsigned int  count,
unsigned char  derived_key[F2FS_MAX_KEY_SIZE] 
)
static

◆ set_policy()

static void set_policy ( struct salt set_salt,
int  pad,
int  argc,
char *  argv[],
int  path_start_index 
)
static

◆ sigcatcher_setup()

static void sigcatcher_setup ( void  )
static

◆ validate_paths()

static void validate_paths ( int  argc,
char *  argv[],
int  path_start_index 
)
static

Variable Documentation

◆ cmd_list

const struct cmd_desc cmd_list[]
Initial value:
= {
CMD(get_policy),
CMD(new_session),
{ NULL, NULL, NULL, NULL, 0 }
}
static void help()
Definition: commandline.cpp:87
static void set_policy(struct salt *set_salt, int pad, int argc, char *argv[], int path_start_index)
Definition: f2fscrypt.c:397
#define CMD(name)
Definition: f2fscrypt.c:870
#define _CMD(name)
Definition: f2fscrypt.c:871
static key_serial_t add_key(const char *type, const char *description, const void *payload, size_t plen, key_serial_t keyring)
Definition: f2fscrypt.c:146

◆ hexchars

const unsigned char* hexchars = (const unsigned char *) "0123456789abcdef"
static

◆ hexchars_size

const size_t hexchars_size = 16
static

◆ in_passphrase

char in_passphrase[F2FS_MAX_PASSPHRASE_SIZE]

◆ keyrings

const struct keyring_map keyrings[]
static
Initial value:
= {
}
#define KEY_SPEC_SESSION_KEYRING
Definition: f2fscrypt.c:77
#define KEY_SPEC_PROCESS_KEYRING
Definition: f2fscrypt.c:76
#define KEY_SPEC_USER_KEYRING
Definition: f2fscrypt.c:78
#define KEY_SPEC_THREAD_KEYRING
Definition: f2fscrypt.c:75
#define KEY_SPEC_USER_SESSION_KEYRING
Definition: f2fscrypt.c:79
#define KEY_SPEC_GROUP_KEYRING
Definition: f2fscrypt.c:80

◆ max_salt

unsigned max_salt

◆ num_salt

unsigned num_salt

◆ options

int options

◆ salt_list

struct salt* salt_list