xref: /aosp_15_r20/external/fsverity-utils/lib/enable.c (revision b13c0e4024008a1f948ee8189745cb3371f4ac04)
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