1ced56a00Sopenharmony_ci// SPDX-License-Identifier: MIT
2ced56a00Sopenharmony_ci/*
3ced56a00Sopenharmony_ci * Implementation of libfsverity_enable() and libfsverity_enable_with_sig().
4ced56a00Sopenharmony_ci *
5ced56a00Sopenharmony_ci * Copyright 2020 Google LLC
6ced56a00Sopenharmony_ci *
7ced56a00Sopenharmony_ci * Use of this source code is governed by an MIT-style
8ced56a00Sopenharmony_ci * license that can be found in the LICENSE file or at
9ced56a00Sopenharmony_ci * https://opensource.org/licenses/MIT.
10ced56a00Sopenharmony_ci */
11ced56a00Sopenharmony_ci
12ced56a00Sopenharmony_ci#include "lib_private.h"
13ced56a00Sopenharmony_ci
14ced56a00Sopenharmony_ci#include <sys/ioctl.h>
15ced56a00Sopenharmony_ci
16ced56a00Sopenharmony_ciLIBEXPORT int
17ced56a00Sopenharmony_cilibfsverity_enable(int fd, const struct libfsverity_merkle_tree_params *params)
18ced56a00Sopenharmony_ci{
19ced56a00Sopenharmony_ci	return libfsverity_enable_with_sig(fd, params, NULL, 0);
20ced56a00Sopenharmony_ci}
21ced56a00Sopenharmony_ci
22ced56a00Sopenharmony_ciLIBEXPORT int
23ced56a00Sopenharmony_cilibfsverity_enable_with_sig(int fd,
24ced56a00Sopenharmony_ci			    const struct libfsverity_merkle_tree_params *params,
25ced56a00Sopenharmony_ci			    const uint8_t *sig, size_t sig_size)
26ced56a00Sopenharmony_ci{
27ced56a00Sopenharmony_ci	struct fsverity_enable_arg arg = {};
28ced56a00Sopenharmony_ci
29ced56a00Sopenharmony_ci	if (!params) {
30ced56a00Sopenharmony_ci		libfsverity_error_msg("missing required parameters for enable");
31ced56a00Sopenharmony_ci		return -EINVAL;
32ced56a00Sopenharmony_ci	}
33ced56a00Sopenharmony_ci
34ced56a00Sopenharmony_ci	if (params->version != 1) {
35ced56a00Sopenharmony_ci		libfsverity_error_msg("unsupported version (%u)",
36ced56a00Sopenharmony_ci				      params->version);
37ced56a00Sopenharmony_ci		return -EINVAL;
38ced56a00Sopenharmony_ci	}
39ced56a00Sopenharmony_ci
40ced56a00Sopenharmony_ci	arg.version = 1;
41ced56a00Sopenharmony_ci	arg.hash_algorithm =
42ced56a00Sopenharmony_ci		params->hash_algorithm ?: FS_VERITY_HASH_ALG_DEFAULT;
43ced56a00Sopenharmony_ci	arg.block_size =
44ced56a00Sopenharmony_ci		params->block_size ?: FS_VERITY_BLOCK_SIZE_DEFAULT;
45ced56a00Sopenharmony_ci	arg.salt_size = params->salt_size;
46ced56a00Sopenharmony_ci	arg.salt_ptr = (uintptr_t)params->salt;
47ced56a00Sopenharmony_ci	arg.sig_size = sig_size;
48ced56a00Sopenharmony_ci	arg.sig_ptr = (uintptr_t)sig;
49ced56a00Sopenharmony_ci
50ced56a00Sopenharmony_ci	if (ioctl(fd, FS_IOC_ENABLE_VERITY, &arg) != 0)
51ced56a00Sopenharmony_ci		return -errno;
52ced56a00Sopenharmony_ci	return 0;
53ced56a00Sopenharmony_ci}
54