blob: f4db9141fe8e708e981ec4d8e5be5bb48d2406e1 [file] [log] [blame]
/* SPDX-License-Identifier: BSD-2-Clause */
/*
* Copyright (c) 2020, Vaisala Oyj.
*/
/*
* Definitions for configuring and using Access Control List (ACL)
* based login methods.
*/
#ifndef TEEACL_H
#define TEEACL_H
#include <grp.h>
#include <uuid/uuid.h>
#ifdef __cplusplus
extern "C" {
#endif
// TEE Client UUID name space identifier (UUIDv4)
// same as `tee_client_uuid_ns` in linux kernel drivers/tee/tee_core.c
#define KERNEL_NAMESPACE "58ac9ca0-2086-4683-a1b8-ec4bc08e01b6"
/*
* len UUID = 36 characters
*
* Prefixes:
* public
* user:
* group:
*
* + '\0' character totals 43, roundup.
*/
/**
* Required length for UUID char buffers
*/
#define TEEACL_L_UUID 48
/**
* teeacl_gid_from_name - Try to resolve gid_t for a given `group_name`.
*
* If a matching group is found, zero is returned and `gid_out` will be set to
* the found value.
* If no group is found, -ENOENT is returned.
* If memory allocation fails, -ENOMEM is returned.
* For other failures, errno is returned.
*
* @param gid_out Ptr to gid result. Will be set to group id if a matching
* group is found.
* @param group_name Name of group to resolve.
* @return 0 if a matching group is found, see detailed description for other
* cases.
*/
int teeacl_gid_from_name(gid_t *gid_out, const char *group_name);
/**
* teeacl_group_acl_uuid() - Encode a group login ACL string to the
* provided uuid_buf
*
* @param uuid_buf A buffer of length TEEACL_L_UUID.
* @param group Group id to encode for login.
* @return 0 on success, otherwise a negative number is returned in case of failure.
*/
int teeacl_group_acl_uuid(char uuid_buf[TEEACL_L_UUID], gid_t group);
/**
* The possible return values of the *_user_is_member_of functions.
*/
enum rv_groupmember {
NOT_MEMBER,
IS_MEMBER,
E_MEMORY, /**< Failed to allocate memory. */
E_GROUPLIST /**< Failed to read group listing. */
};
/**
* teeacl_current_user_is_member_of() - Check if the effective user ID of
* the process is a member in `group`.
*
* @param group Group id to check membership of.
* @return enum rv_groupmember form result.
*/
enum rv_groupmember teeacl_current_user_is_member_of(gid_t group);
/**
* teeacl_user_is_member_of() - Check if `user` is a member in `group`.
*
* @param user Username string.
* @param group Group id to check membership of.
* @return enum rv_groupmember form result.
*/
enum rv_groupmember teeacl_user_is_member_of(const char *user, gid_t group);
#ifdef __cplusplus
} // extern "C"
#endif
#endif /* TEEACL_H */