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