#include "internal.h"
#include "kcapi.h"
void kcapi_set_verbosity(enum kcapi_verbosity level)
{
kcapi_verbosity_level = level;
}
void kcapi_versionstring(char *buf, uint32_t buflen)
{
snprintf(buf, buflen, "libkcapi%s%d.%d.%.f",
(((uint32_t)KCAPI_PATCHLEVEL != KCAPI_PATCHLEVEL) ?
" pre-release " : " "),
KCAPI_MAJVERSION, KCAPI_MINVERSION, (double)KCAPI_PATCHLEVEL);
}
uint32_t kcapi_version(void)
{
uint32_t version = 0;
version = KCAPI_MAJVERSION * 1000000;
version += KCAPI_MINVERSION * 10000;
version += KCAPI_PATCHLEVEL * 100;
return version;
}
int kcapi_pad_iv(struct kcapi_handle *handle,
const uint8_t *iv, uint32_t ivlen,
uint8_t **newiv, uint32_t *newivlen)
{
uint8_t *niv = NULL;
struct kcapi_handle_tfm *tfm = handle->tfm;
uint32_t nivlen = tfm->info.ivsize;
uint32_t copylen = (ivlen > nivlen) ? nivlen : ivlen;
int ret = 0;
ret = posix_memalign((void *)&niv, 16, nivlen);
if (ret)
return -ret;
memcpy(niv, iv, copylen);
if (nivlen > copylen)
memset(niv + copylen, 0, nivlen - copylen);
*newiv = niv;
*newivlen = nivlen;
return 0;
}
int kcapi_set_maxsplicesize(struct kcapi_handle *handle, unsigned int size)
{
int ret;
if (!handle)
return -EINVAL;
ret = fcntl(handle->pipes[0], F_SETPIPE_SZ, size);
if (ret < 0)
goto err;
ret = fcntl(handle->pipes[1], F_SETPIPE_SZ, size);
if (ret < 0)
goto err;
handle->pipesize = (unsigned int)ret;
return 0;
err:
ret = -errno;
if (ret == -EBUSY) {
kcapi_dolog(KCAPI_LOG_WARN,
"AF_ALG: setting maximum splice pipe size to %u failed - it would exceed maximum quota",
size);
} else {
kcapi_dolog(KCAPI_LOG_WARN,
"AF_ALG: setting maximum splice pipe size to %u failed: %s",
size, strerror(ret));
}
return ret;
}
int kcapi_get_maxsplicesize(struct kcapi_handle *handle)
{
unsigned int pagesize = (unsigned int)sysconf(_SC_PAGESIZE);
if (!handle)
return -EINVAL;
handle->pipesize = (unsigned int)fcntl(handle->pipes[0], F_GETPIPE_SZ);
if (handle->pipesize > pagesize)
handle->pipesize -= pagesize;
return ((int)handle->pipesize);
}