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