limb 0.2.0

2024-01-09

buffer_shldata_putinit(3)
limb manual
buffer_shldata_putinit(3)

NAME

buffer_shldata_putinit, buffer_shldata_put, buffer_shldata_putfinal - buffer_shldata_free - encrypt data using the shielded data protocol through buffer interface

SYNOPSIS

#include <limb/buffer-shldata.h>
ssize_t buffer_shldata_putinit(buffer *buf, const char *pwd, size_t plen, unsigned algo, unsigned iter,
                               size_t len, buffer_shldata_ctx *ctx)
ssize_t buffer_shldata_put(buffer *buf, char *data, size_t dlen, int inplace, buffer_shldata_ctx *ctx)
ssize_t buffer_shldata_putfinal(buffer *buf, buffer_shldata_ctx *ctx)

void buffer_shldata_free(buffer_shldata_ctx *ctx)

DESCRIPTION

All those functions are used to protect data with a user-supplied password using the shielded data protocol, as described in shldata(5), through the buffer.h(0) interface.

First, the buffer_shldata_putinit() function must be called to both write to the buffer pointed by buf the necessary parameters that will be needed for decryption, and to prepare the opaque structure pointed by ctx (which must have been initialized to BUFFER_SHLDATA_ZERO) in order to perform data encryption.

Key derivation will be performed using PBKDF2 from the password pointed by pwd of length plen, with the HMAC based on the algorithm indicated in algo - which must be a valid index/constant as defined in hasher.h(0) - and the number of iterations indicated in iter.

It is recommended, if possible, to indicate the exact length of data to be encrypted in len. It is however possible to use zero if not yet known.

The buffer_shldata_put() function can then be used to encrypt data pointed by data of length dlen and write the encrypted data into the buffer pointed by buf, using the specified ctx.

In inplace is non-zero the data might be encrypted in-place before being written to the buffer, meaning that afterwards the memory pointed by data will contain the encrypted data. Otherwise, memory might be heap-allocated before encrypting data.

Information

Note that even with inplace set to a non-zero value, the data might be encrypted elsewhere in memory, and stored to be written later on - i.e. during the call to buffer_shldata_putfinal(). This will happen if the length of data to encrypt wasn't specified to buffer_shldata_init(). Refer to shldata_initw(3) for more.

It is possible to call this function as many times as needed.

Then the buffer_shldata_putfinal() function must be called to write to the buffer pointed by buf the final additional data (MAC). As described above, if the length of the data to encrypt wasn't known/given to buffer_shldata_putinit() then encrypted data will also be written then, before the MAC.

Lastly, the buffer_shldata_free() function must be called to free memory associated with the given ctx.

RETURN VALUE

These functions (except buffer_shldata_free()) return the number of bytes written to the buffer pointed by buf on success. Otherwise they return -1 and set errno to indicate the error.

ERRORS

The buffer_shldata_putinit() function may fail for any of the errors described for shldata_initw(3), save for ENOBUFS.

The buffer_shldata_put() and buffer_shldata_putfinal() functions may fail if :

EINVAL

The total amount of data given to encrypt was larger than that specified to buffer_shldata_putinit().

The buffer_shldata_put() function may also fail if :

ENOMEM

Out of memory.

The buffer_shldata_put() function may also fail for any of the errors described for buffer_put(3).

The buffer_shldata_putfinal() function may fail for any of the errors described for shldata_finalw(3), save for ENOBUFS, as well as any of the errors described for buffer_putv(3).

SEE ALSO

buffer_shldata_getinit(3), shldata_initw(3)

limb 0.1.0
2023-07-24
buffer_shldata_putinit(3)