diff options
| author | Mattias Andrée <m@maandree.se> | 2026-05-21 17:12:20 +0200 |
|---|---|---|
| committer | Mattias Andrée <m@maandree.se> | 2026-05-21 17:12:20 +0200 |
| commit | b29f4153e83623f24bebe99976e1368ef31bb008 (patch) | |
| tree | 65473709df1194a2f9277dc5fb47add5e41430c0 /librecrypt_set_pepper.c | |
| parent | Add (so far untested and undocument) support for pepper (diff) | |
| download | librecrypt-b29f4153e83623f24bebe99976e1368ef31bb008.tar.gz librecrypt-b29f4153e83623f24bebe99976e1368ef31bb008.tar.bz2 librecrypt-b29f4153e83623f24bebe99976e1368ef31bb008.tar.xz | |
Add support for custom hash functions
Signed-off-by: Mattias Andrée <m@maandree.se>
Diffstat (limited to '')
| -rw-r--r-- | librecrypt_set_pepper.c | 143 |
1 files changed, 143 insertions, 0 deletions
diff --git a/librecrypt_set_pepper.c b/librecrypt_set_pepper.c new file mode 100644 index 0000000..966563c --- /dev/null +++ b/librecrypt_set_pepper.c @@ -0,0 +1,143 @@ +/* See LICENSE file for copyright and license details. */ +#include "common.h" +#ifndef TEST + + +int +librecrypt_set_pepper(LIBRECRYPT_CONTEXT *ctx, enum librecrypt_hash_algorithm algo, const void *data, size_t len) +{ + struct pepper *pepper; + + pepper = librecrypt_get_pepper_(ctx, algo, len); + if (!pepper) + return -1; + + pepper->data = data; + pepper->len = len; + return 0; +} + + +#else + + +#define CHECK_ENOSYS(ALGO, DATA, LEN)\ + do {\ + errno = 0;\ + EXPECT(librecrypt_set_pepper(ctx, ALGO, DATA, LEN) == -1);\ + EXPECT(errno == ENOSYS);\ + } while (0) + +#define CHECK_EINVAL(ALGO, DATA, LEN)\ + do {\ + errno = 0;\ + EXPECT(librecrypt_set_pepper(ctx, ALGO, DATA, LEN) == -1);\ + EXPECT(errno == EINVAL);\ + } while (0) + +#define SET_PEPPER(ALGO, DATA, LEN)\ + EXPECT(librecrypt_set_pepper(ctx, ALGO, DATA, LEN) == 0) + +#define CHECK_PEPPER(ALGO, DATA, LEN)\ + do {\ + pepper = librecrypt_get_pepper_(ctx, ALGO, 0u);\ + EXPECT(pepper != NULL);\ + EXPECT(pepper->data == (DATA));\ + EXPECT(pepper->len == (LEN));\ + } while (0) + + +int +main(void) +{ + LIBRECRYPT_CONTEXT *ctx; + char a2i10 = 1, a2d10 = 2, a2id10 = 3, a2ds10 = 4; + char a2i13 = 5, a2d13 = 6, a2id13 = 7, a2ds13 = 8; + struct pepper *pepper; + + SET_UP_ALARM(); + INIT_RESOURCE_TEST(); + + ctx = librecrypt_create_context(); + assert(ctx != NULL); + + +#if defined(SUPPORT_ARGON2I) + SET_PEPPER(LIBRECRYPT_ARGON2I_V1_0, &a2i10, 2u); + SET_PEPPER(LIBRECRYPT_ARGON2I_V1_3, &a2i13, 5u); +# if SIZE_MAX > UINT32_MAX + CHECK_EINVAL(LIBRECRYPT_ARGON2I_V1_0, NULL, (size_t)UINT32_MAX + 1u); + CHECK_EINVAL(LIBRECRYPT_ARGON2I_V1_3, NULL, (size_t)UINT32_MAX + 1u); +# endif +#else + CHECK_ENOSYS(LIBRECRYPT_ARGON2I_V1_0, &a2i10, 2u); + CHECK_ENOSYS(LIBRECRYPT_ARGON2I_V1_3, &a2i13, 5u); +#endif + +#if defined(SUPPORT_ARGON2D) + SET_PEPPER(LIBRECRYPT_ARGON2D_V1_0, &a2d10, 3u); + SET_PEPPER(LIBRECRYPT_ARGON2D_V1_3, &a2d13, 8u); +# if SIZE_MAX > UINT32_MAX + CHECK_EINVAL(LIBRECRYPT_ARGON2D_V1_0, NULL, (size_t)UINT32_MAX + 1u); + CHECK_EINVAL(LIBRECRYPT_ARGON2D_V1_3, NULL, (size_t)UINT32_MAX + 1u); +# endif +#else + CHECK_ENOSYS(LIBRECRYPT_ARGON2D_V1_0, &a2d10, 3u); + CHECK_ENOSYS(LIBRECRYPT_ARGON2D_V1_3, &a2d13, 8u); +#endif + +#if defined(SUPPORT_ARGON2ID) + SET_PEPPER(LIBRECRYPT_ARGON2ID_V1_0, &a2id10, 7u); + SET_PEPPER(LIBRECRYPT_ARGON2ID_V1_3, &a2id13, 4u); +# if SIZE_MAX > UINT32_MAX + CHECK_EINVAL(LIBRECRYPT_ARGON2ID_V1_0, NULL, (size_t)UINT32_MAX + 1u); + CHECK_EINVAL(LIBRECRYPT_ARGON2ID_V1_3, NULL, (size_t)UINT32_MAX + 1u); +# endif +#else + CHECK_ENOSYS(LIBRECRYPT_ARGON2ID_V1_0, &a2id10, 7u); + CHECK_ENOSYS(LIBRECRYPT_ARGON2ID_V1_3, &a2id13, 4u); +#endif + +#if defined(SUPPORT_ARGON2DS) + SET_PEPPER(LIBRECRYPT_ARGON2DS_V1_0, &a2ds10, 9u); + SET_PEPPER(LIBRECRYPT_ARGON2DS_V1_3, &a2ds13, 6u); +# if SIZE_MAX > UINT32_MAX + CHECK_EINVAL(LIBRECRYPT_ARGON2DS_V1_0, NULL, (size_t)UINT32_MAX + 1u); + CHECK_EINVAL(LIBRECRYPT_ARGON2DS_V1_3, NULL, (size_t)UINT32_MAX + 1u); +# endif +#else + CHECK_ENOSYS(LIBRECRYPT_ARGON2DS_V1_0, &a2ds10, 9u); + CHECK_ENOSYS(LIBRECRYPT_ARGON2DS_V1_3, &a2ds13, 6u); +#endif + + + CHECK_ENOSYS(LIBRECRYPT_HASH_ALGORITHM_END, NULL, 0u); + CHECK_ENOSYS(LIBRECRYPT_HASH_ALGORITHM_END, &(char){4}, 32u); + + +#if defined(SUPPORT_ARGON2I) + CHECK_PEPPER(LIBRECRYPT_ARGON2I_V1_0, &a2i10, 2u); + CHECK_PEPPER(LIBRECRYPT_ARGON2I_V1_3, &a2i13, 5u); +#endif +#if defined(SUPPORT_ARGON2D) + CHECK_PEPPER(LIBRECRYPT_ARGON2D_V1_0, &a2d10, 3u); + CHECK_PEPPER(LIBRECRYPT_ARGON2D_V1_3, &a2d13, 8u); +#endif +#if defined(SUPPORT_ARGON2ID) + CHECK_PEPPER(LIBRECRYPT_ARGON2ID_V1_0, &a2id10, 7u); + CHECK_PEPPER(LIBRECRYPT_ARGON2ID_V1_3, &a2id13, 4u); +#endif +#if defined(SUPPORT_ARGON2DS) + CHECK_PEPPER(LIBRECRYPT_ARGON2DS_V1_0, &a2ds10, 9u); + CHECK_PEPPER(LIBRECRYPT_ARGON2DS_V1_3, &a2ds13, 6u); +#endif + + + librecrypt_free_context(ctx); + + STOP_RESOURCE_TEST(); + return 0; +} + + +#endif |
