X-Git-Url: https://wimlib.net/git/?p=wimlib;a=blobdiff_plain;f=include%2Fwimlib%2Fsecurity.h;fp=include%2Fwimlib%2Fsecurity.h;h=7fa122ee8f8b82c1cba0e7029a42484c414470f6;hp=0000000000000000000000000000000000000000;hb=e8c3ca2d1d0cac3d64985b45a9f654d2029a7518;hpb=726f9bbd0bd664294fce8a50be1d5b6881df8d16 diff --git a/include/wimlib/security.h b/include/wimlib/security.h new file mode 100644 index 00000000..7fa122ee --- /dev/null +++ b/include/wimlib/security.h @@ -0,0 +1,65 @@ +#ifndef _WIMLIB_SECURITY_H +#define _WIMLIB_SECURITY_H + +#include "wimlib/rbtree.h" +#include "wimlib/types.h" + +/* Red-black tree that maps SHA1 message digests of security descriptors to + * security IDs, which are themselves indices into the table of security + * descriptors in the 'struct wim_security_data'. */ +struct wim_sd_set { + struct wim_security_data *sd; + struct rb_root rb_root; + int32_t orig_num_entries; +}; + +/* Table of security descriptors for a WIM image. */ +struct wim_security_data { + /* The total length of the security data, in bytes. If there are no + * security descriptors, this field, when read from the on-disk metadata + * resource, may be either 8 (which is correct) or 0 (which is + * interpreted as 0). */ + u32 total_length; + + /* The number of security descriptors in the array @descriptors, below. + * It is really an unsigned int on-disk, but it must fit into an int + * because the security ID's are signed. (Not like you would ever have + * more than a few hundred security descriptors anyway.) */ + int32_t num_entries; + + /* Array of sizes of the descriptors in the array @descriptors. */ + u64 *sizes; + + /* Array of descriptors. */ + u8 **descriptors; +}; + +extern void +destroy_sd_set(struct wim_sd_set *sd_set, bool rollback); + +extern int +lookup_sd(struct wim_sd_set *set, const u8 hash[]); + +extern int +sd_set_add_sd(struct wim_sd_set *sd_set, const char descriptor[], + size_t size); + +extern int +init_sd_set(struct wim_sd_set *sd_set, struct wim_security_data *sd); + +extern struct wim_security_data * +new_wim_security_data(void); + +extern int +read_security_data(const u8 metadata_resource[], + u64 metadata_resource_len, struct wim_security_data **sd_p); +extern void +print_security_data(const struct wim_security_data *sd); + +extern u8 * +write_security_data(const struct wim_security_data *sd, u8 *p); + +extern void +free_security_data(struct wim_security_data *sd); + +#endif /* _WIMLIB_SECURITY_H */