aboutsummaryrefslogtreecommitdiff
path: root/src/crypto/impl
diff options
context:
space:
mode:
Diffstat (limited to 'src/crypto/impl')
-rw-r--r--src/crypto/impl/bcrypt.c263
-rw-r--r--src/crypto/impl/mbedtls.c172
-rw-r--r--src/crypto/impl/monocypher.c80
-rw-r--r--src/crypto/impl/openssl.c180
4 files changed, 0 insertions, 695 deletions
diff --git a/src/crypto/impl/bcrypt.c b/src/crypto/impl/bcrypt.c
deleted file mode 100644
index 9b01cac..0000000
--- a/src/crypto/impl/bcrypt.c
+++ /dev/null
@@ -1,263 +0,0 @@
-/*
-* Copyright (c) 2024 Vaughn Nugent
-*
-* Package: noscrypt
-* File: impl/bcrypt.c
-*
-* This library is free software; you can redistribute it and/or
-* modify it under the terms of the GNU Lesser General Public License
-* as published by the Free Software Foundation; either version 2.1
-* of the License, or (at your option) any later version.
-*
-* This library is distributed in the hope that it will be useful,
-* but WITHOUT ANY WARRANTY; without even the implied warranty of
-* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-* Lesser General Public License for more details.
-*
-* You should have received a copy of the GNU Lesser General Public License
-* along with noscrypt. If not, see http://www.gnu.org/licenses/.
-*/
-
-
-/*
-* This file provides as many fallback implementations on Windows plaforms
-* as possible using the bcrypt library. This file should be included behind
-* other libarry implementations, as it is a fallback.
-*/
-
-#ifdef _NC_IS_WINDOWS
-
-#define WIN32_LEAN_AND_MEAN
-#include <Windows.h>
-#include <bcrypt.h>
-
-#include "nc-util.h"
-#include "hkdf.h"
-
-#define IF_BC_FAIL(x) if(!BCRYPT_SUCCESS(x))
-#define BC_FAIL(x) if(!BCRYPT_SUCCESS(x)) return CSTATUS_FAIL;
-
-struct _bcrypt_ctx
-{
- BCRYPT_ALG_HANDLE hAlg;
- BCRYPT_HASH_HANDLE hHash;
-};
-
-_IMPLSTB NTSTATUS _bcInitSha256(struct _bcrypt_ctx* ctx, DWORD flags)
-{
- NTSTATUS result;
-
- result = BCryptOpenAlgorithmProvider(
- &ctx->hAlg,
- BCRYPT_SHA256_ALGORITHM,
- NULL,
- flags
- );
-
- /*
- * If operation failed, ensure the algorithm handle is null
- * to make free code easier to cleanup
- */
- if (!BCRYPT_SUCCESS(result))
- {
- ctx->hAlg = NULL;
- }
-
- return result;
-}
-
-_IMPLSTB NTSTATUS _bcCreateHmac(struct _bcrypt_ctx* ctx, const cspan_t* key)
-{
- /*
- * NOTE:
- * I am not explicitly managing the update object buffer. By setting
- * the update object to NULL, and length to 0, the buffer will be
- * managed by the bcrypt library.
- *
- * See: https://learn.microsoft.com/en-us/windows/win32/api/bcrypt/nf-bcrypt-bcryptcreatehash
- */
-
- return BCryptCreateHash(
- ctx->hAlg,
- &ctx->hHash,
- NULL,
- 0,
- (uint8_t*)key->data,
- key->size,
- BCRYPT_HASH_REUSABLE_FLAG /* Enable reusable for expand function */
- );
-}
-
-_IMPLSTB NTSTATUS _bcCreate(struct _bcrypt_ctx* ctx)
-{
- cspan_t key;
-
- /* Zero out key span for 0 size and NULL data ptr */
- SecureZeroMemory(&key, sizeof(cspan_t));
-
- return _bcCreateHmac(ctx, &key);
-}
-
-_IMPLSTB NTSTATUS _bcHashDataRaw(const struct _bcrypt_ctx* ctx, const uint8_t* data, uint32_t len)
-{
- return BCryptHashData(ctx->hHash, (uint8_t*)data, len, 0);
-}
-
-_IMPLSTB NTSTATUS _bcHashData(const struct _bcrypt_ctx* ctx, const cspan_t* data)
-{
- return _bcHashDataRaw(ctx, data->data, data->size);
-}
-
-_IMPLSTB NTSTATUS _bcFinishHash(const struct _bcrypt_ctx* ctx, sha256_t digestOut32)
-{
- return BCryptFinishHash(ctx->hHash, digestOut32, sizeof(sha256_t), 0);
-}
-
-_IMPLSTB void _bcDestroyCtx(struct _bcrypt_ctx* ctx)
-{
- /* Free the update memory if it was allocated */
- if(ctx->hHash) BCryptDestroyHash(ctx->hHash);
-
- /* Close the algorithm provider */
- if (ctx->hAlg) BCryptCloseAlgorithmProvider(ctx->hAlg, 0);
-
- ctx->hAlg = NULL;
- ctx->hHash = NULL;
-}
-
-#ifndef _IMPL_SECURE_ZERO_MEMSET
- /*
- * On Windows, we can use SecureZeroMemory
- * as platform zeroing function.
- *
- * NOTE:
- * SecureZeroMemory2 uses volitle function argument
- * pointers, which is a contested mehtod of compiler
- * optimization prevention. GNU seems to oppose this method
- *
- * https://learn.microsoft.com/en-us/windows/win32/memory/winbase-securezeromemory2
- */
- #define _IMPL_SECURE_ZERO_MEMSET SecureZeroMemory
-#endif /* !_IMPL_SECURE_ZERO_MEMSET */
-
-/*
-* Provide win32 fallback for sha256 digest if needed
-*/
-
-#ifndef _IMPL_CRYPTO_SHA256_DIGEST
-
- /* Export function fallack */
- #define _IMPL_CRYPTO_SHA256_DIGEST _bcrypt_sha256_digest
-
- _IMPLSTB cstatus_t _bcrypt_sha256_digest(const cspan_t* data, sha256_t digestOut32)
- {
- cstatus_t result;
- struct _bcrypt_ctx ctx;
-
- result = CSTATUS_FAIL; /* Start in fail state */
-
- IF_BC_FAIL(_bcInitSha256(&ctx, 0)) goto Exit;
-
- IF_BC_FAIL(_bcCreate(&ctx)) goto Exit;
-
- IF_BC_FAIL(_bcHashData(&ctx, data)) goto Exit;
-
- IF_BC_FAIL(_bcFinishHash(&ctx, digestOut32)) goto Exit;
-
- result = CSTATUS_OK; /* Hash operation completed, so set success */
-
- Exit:
-
- _bcDestroyCtx(&ctx);
-
- return result;
- }
-
-#endif /* !_IMPL_CRYPTO_SHA256_DIGEST */
-
-#ifndef _IMPL_CRYPTO_SHA256_HMAC
-
- /* Export function */
- #define _IMPL_CRYPTO_SHA256_HMAC _bcrypt_hmac_sha256
-
- _IMPLSTB cstatus_t _bcrypt_hmac_sha256(const cspan_t* key, const cspan_t* data, sha256_t hmacOut32)
- {
- cstatus_t result;
- struct _bcrypt_ctx ctx;
-
- result = CSTATUS_FAIL; /* Start in fail state */
-
- /* Init context with hmac flag set */
- IF_BC_FAIL(_bcInitSha256(&ctx, BCRYPT_ALG_HANDLE_HMAC_FLAG)) goto Exit;
-
- IF_BC_FAIL(_bcCreateHmac(&ctx, key)) goto Exit;
-
- IF_BC_FAIL(_bcHashData(&ctx, data)) goto Exit;
-
- IF_BC_FAIL(_bcFinishHash(&ctx, hmacOut32)) goto Exit;
-
- result = CSTATUS_OK; /* HMAC operation completed, so set success */
-
- Exit:
-
- _bcDestroyCtx(&ctx);
-
- return result;
- }
-
-#endif /* !_IMPL_CRYPTO_SHA256_HMAC */
-
-/*
-* Provide a fallback HKDF expand function using the
-* HMAC function as a base.
-*/
-
-#ifndef _IMPL_CRYPTO_SHA256_HKDF_EXPAND
-
- #define _IMPL_CRYPTO_SHA256_HKDF_EXPAND _bcrypt_fallback_hkdf_expand
-
- cstatus_t _bcrypt_hkdf_update(void* ctx, const cspan_t* data)
- {
- DEBUG_ASSERT(ctx != NULL)
-
- BC_FAIL(_bcHashData((struct _bcrypt_ctx*)ctx, data))
- return CSTATUS_OK;
- }
-
- cstatus_t _bcrypt_hkdf_finish(void* ctx, sha256_t hmacOut32)
- {
- DEBUG_ASSERT(ctx != NULL)
-
- BC_FAIL(_bcFinishHash((struct _bcrypt_ctx*)ctx, hmacOut32))
- return CSTATUS_OK;
- }
-
- _IMPLSTB cstatus_t _bcrypt_fallback_hkdf_expand(const cspan_t* prk, const cspan_t* info, span_t* okm)
- {
- cstatus_t result;
- struct _bcrypt_ctx ctx;
- struct nc_hkdf_fn_cb_struct handler;
-
- handler.update = _bcrypt_hkdf_update;
- handler.finish = _bcrypt_hkdf_finish;
-
- /* Init bcrypt */
- BC_FAIL(_bcInitSha256(&ctx, BCRYPT_ALG_HANDLE_HMAC_FLAG))
-
- BC_FAIL(_bcCreateHmac(&ctx, prk))
-
- /*
- * NOTE! Hmac reusable flag must be set to allow for multiple
- * calls to the finish function without losing the context.
- */
-
- result = hkdfExpandProcess(&handler, &ctx, info, okm);
-
- _bcDestroyCtx(&ctx);
-
- return result;
- }
-
-#endif /* !_IMPL_CRYPTO_SHA256_HKDF_EXPAND */
-
-#endif /* _NC_IS_WINDOWS */ \ No newline at end of file
diff --git a/src/crypto/impl/mbedtls.c b/src/crypto/impl/mbedtls.c
deleted file mode 100644
index 057e7b4..0000000
--- a/src/crypto/impl/mbedtls.c
+++ /dev/null
@@ -1,172 +0,0 @@
-/*
-* Copyright (c) 2024 Vaughn Nugent
-*
-* Package: noscrypt
-* File: mbedtls.c
-*
-* This library is free software; you can redistribute it and/or
-* modify it under the terms of the GNU Lesser General Public License
-* as published by the Free Software Foundation; either version 2.1
-* of the License, or (at your option) any later version.
-*
-* This library is distributed in the hope that it will be useful,
-* but WITHOUT ANY WARRANTY; without even the implied warranty of
-* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-* Lesser General Public License for more details.
-*
-* You should have received a copy of the GNU Lesser General Public License
-* along with noscrypt. If not, see http://www.gnu.org/licenses/.
-*/
-
-
-/*
-* This file contains implemntation functions for the required
-* cryptography primitives of noscrypt. This file stubs functionality
-* using the Mbed-TLS library, if the builder desires to link against
-* it.
-*/
-
-#ifdef MBEDTLS_CRYPTO_LIB
-
-/* Inline errors on linux in header files on linux */
-#ifndef inline
- #define inline __inline
-#endif
-
-#include <mbedtls/md.h>
-#include <mbedtls/hkdf.h>
-#include <mbedtls/hmac_drbg.h>
-#include <mbedtls/sha256.h>
-#include <mbedtls/chacha20.h>
-#include <mbedtls/constant_time.h>
-
-#ifndef inline
- #undef inline
-#endif
-
-
-_IMPLSTB const mbedtls_md_info_t* _mbed_sha256_alg(void)
-{
- const mbedtls_md_info_t* info;
- /* Get sha256 md info for hdkf operations */
- info = mbedtls_md_info_from_type(MBEDTLS_MD_SHA256);
- DEBUG_ASSERT2(info != NULL, "Expected SHA256 md info pointer to be valid")
- return info;
-}
-
-#if SIZE_MAX < UINT64_MAX
- #define _ssize_guard_int(x) if(x > SIZE_MAX) return 1;
-#else
- #define _ssize_guard_int(x)
-#endif
-
-#ifndef _IMPL_CHACHA20_CRYPT
-
- /* Export chacha20 computation */
- #define _IMPL_CHACHA20_CRYPT _mbed_chacha20_encrypt
-
- _IMPLSTB cstatus_t _mbed_chacha20_encrypt(
- const uint8_t* key,
- const uint8_t* nonce,
- const uint8_t* input,
- uint8_t* output,
- uint32_t dataLen
- )
- {
- _overflow_check(dataLen)
-
- /* Counter always starts at 0 */
- return mbedtls_chacha20_crypt(
- key,
- nonce,
- 0x00u, /* nip-44 counter version */
- dataLen,
- input,
- output
- ) == 0 ? CSTATUS_OK : CSTATUS_FAIL;
- }
-
-#endif
-
-/* Export sha256 if not already defined */
-#ifndef _IMPL_CRYPTO_SHA256_DIGEST
-
- #define _IMPL_CRYPTO_SHA256_DIGEST _mbed_sha256_digest
-
- _IMPLSTB cstatus_t _mbed_sha256_digest(const cspan_t* data, sha256_t digestOut32)
- {
- _overflow_check(data->size)
-
- return mbedtls_sha256(
- data->data,
- data->size,
- digestOut32,
- 0 /* Set 0 for sha256 mode */
- ) == 0 ? CSTATUS_OK : CSTATUS_FAIL;
- }
-
-#endif
-
-/* Export Sha256 hmac if not already defined by other libs */
-#ifndef _IMPL_CRYPTO_SHA256_HMAC
-
- #define _IMPL_CRYPTO_SHA256_HMAC _mbed_sha256_hmac
-
- _IMPLSTB cstatus_t _mbed_sha256_hmac(const cspan_t* key, const cspan_t* data, sha256_t hmacOut32)
- {
- _overflow_check(data->size)
-
- /* Keys should never be large enough for this to matter, but sanity check. */
- DEBUG_ASSERT2(key->size < SIZE_MAX, "Expected key size to be less than SIZE_MAX")
-
- return mbedtls_md_hmac(
- _mbed_sha256_alg(),
- key->data,
- key->size,
- data->data,
- data->size,
- hmacOut32
- ) == 0 ? CSTATUS_OK : CSTATUS_FAIL;
- }
-#endif
-
-/* Export hkdf expand if not already defined */
-#ifndef _IMPL_CRYPTO_SHA256_HKDF_EXPAND
-
- #define _IMPL_CRYPTO_SHA256_HKDF_EXPAND _mbed_sha256_hkdf_expand
-
- _IMPLSTB cstatus_t _mbed_sha256_hkdf_expand(const cspan_t* prk, const cspan_t* info, span_t* okm)
- {
- /* These sizes should never be large enough to overflow on <64bit platforms, but sanity check */
- DEBUG_ASSERT(okm->size < SIZE_MAX)
- DEBUG_ASSERT(prk->size < SIZE_MAX)
- DEBUG_ASSERT(info->size < SIZE_MAX)
-
- return mbedtls_hkdf_expand(
- _mbed_sha256_alg(),
- prk->data,
- prk->size,
- info->data,
- info->size,
- okm->data,
- okm->size
- ) == 0 ? CSTATUS_OK : CSTATUS_FAIL;
- }
-
-#endif
-
-/* Export fixed-time compare if not already defined */
-#ifndef _IMPL_CRYPTO_FIXED_TIME_COMPARE
-
- #define _IMPL_CRYPTO_FIXED_TIME_COMPARE _mbed_fixed_time_compare
-
- /* fixed-time memcmp */
- _IMPLSTB uint32_t _mbed_fixed_time_compare(const uint8_t* a, const uint8_t* b, uint32_t size)
- {
- _ssize_guard_int(size)
-
- return (uint32_t)mbedtls_ct_memcmp(a, b, size);
- }
-#endif
-
-#endif \ No newline at end of file
diff --git a/src/crypto/impl/monocypher.c b/src/crypto/impl/monocypher.c
deleted file mode 100644
index 7c9faea..0000000
--- a/src/crypto/impl/monocypher.c
+++ /dev/null
@@ -1,80 +0,0 @@
-/*
-* Copyright (c) 2024 Vaughn Nugent
-*
-* Package: noscrypt
-* File: impl/monocypher.c
-*
-* This library is free software; you can redistribute it and/or
-* modify it under the terms of the GNU Lesser General Public License
-* as published by the Free Software Foundation; either version 2.1
-* of the License, or (at your option) any later version.
-*
-* This library is distributed in the hope that it will be useful,
-* but WITHOUT ANY WARRANTY; without even the implied warranty of
-* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-* Lesser General Public License for more details.
-*
-* You should have received a copy of the GNU Lesser General Public License
-* along with noscrypt. If not, see http://www.gnu.org/licenses/.
-*/
-
-
-/*
-* This file handles some fallbacks that may not be available on
-* some platforms. More specifically:
-* - Secure memset 0
-* - Chacha20 cipher
-*
-*/
-
-#ifdef NC_ENABLE_MONOCYPHER
-
-#include <monocypher.h>
-
-#include "nc-util.h"
-
-/* Export secure memse0 */
-#ifndef _IMPL_SECURE_ZERO_MEMSET
-
- /* export cytpo wipe function as is */
- #define _IMPL_SECURE_ZERO_MEMSET crypto_wipe
-#endif
-
-/* Export Chacha20 */
-#ifndef _IMPL_CHACHA20_CRYPT
-
- #define _IMPL_CHACHA20_CRYPT _mc_chacha20_crypt
-
- _IMPLSTB cstatus_t _mc_chacha20_crypt(
- const uint8_t* key,
- const uint8_t* nonce,
- const uint8_t* input,
- uint8_t* output,
- uint32_t dataLen
- )
- {
- _overflow_check(dataLen)
-
- /*
- * Function returns the next counter value which is not
- * needed for noscrypt as encryptions are one-shot, and
- * require a new nonce for each encryption.
- *
- * ITEF function uses a 12byte nonce which is required for
- * nip-44 compliant encryption.
- */
- crypto_chacha20_ietf(
- output,
- input,
- (size_t)dataLen,
- key,
- nonce,
- 0x00 /* Counter always starts at 0 */
- );
-
- return CSTATUS_OK;
- }
-
-#endif
-
-#endif /* !NC_ENABLE_MONOCYPHER */ \ No newline at end of file
diff --git a/src/crypto/impl/openssl.c b/src/crypto/impl/openssl.c
deleted file mode 100644
index fd3b4e6..0000000
--- a/src/crypto/impl/openssl.c
+++ /dev/null
@@ -1,180 +0,0 @@
-/*
-* Copyright (c) 2024 Vaughn Nugent
-*
-* Package: noscrypt
-* File: impl/openssl.c
-*
-* This library is free software; you can redistribute it and/or
-* modify it under the terms of the GNU Lesser General Public License
-* as published by the Free Software Foundation; either version 2.1
-* of the License, or (at your option) any later version.
-*
-* This library is distributed in the hope that it will be useful,
-* but WITHOUT ANY WARRANTY; without even the implied warranty of
-* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-* Lesser General Public License for more details.
-*
-* You should have received a copy of the GNU Lesser General Public License
-* along with noscrypt. If not, see http://www.gnu.org/licenses/.
-*/
-
-
-/* Setup openssl */
-#ifdef OPENSSL_CRYPTO_LIB
-
-#include "nc-util.h"
-#include <openssl/crypto.h>
-
-#define _OSSL_FAIL(x) if(!(x)) return CSTATUS_FAIL;
-
-#ifndef _IMPL_SECURE_ZERO_MEMSET
-
- #define _IMPL_SECURE_ZERO_MEMSET _ossl_secure_zero_memset
-
- _IMPLSTB void _ossl_secure_zero_memset(void* ptr, size_t size)
- {
- _overflow_check(size)
-
- OPENSSL_cleanse(ptr, size);
- }
-#endif
-
-#ifndef _IMPL_CRYPTO_FIXED_TIME_COMPARE
-
- #define _IMPL_CRYPTO_FIXED_TIME_COMPARE _ossl_fixed_time_compare
-
- _IMPLSTB uint32_t _ossl_fixed_time_compare(const uint8_t* a, const uint8_t* b, uint32_t size)
- {
- int result;
-
- /* Size checks are required for platforms that have integer sizes under 32bit */
- _overflow_check(size)
-
- result = CRYPTO_memcmp(a, b, size);
-
- return (uint32_t)result;
- }
-
-#endif /* _IMPL_CRYPTO_FIXED_TIME_COMPARE */
-
-
-#ifndef _IMPL_CRYPTO_SHA256_DIGEST
-
- #include <openssl/sha.h>
-
- #define _IMPL_CRYPTO_SHA256_DIGEST _ossl_sha256_digest
-
- _IMPLSTB cstatus_t _ossl_sha256_digest(const cspan_t* data, sha256_t digestOut32)
- {
- _overflow_check(data->size)
-
- _OSSL_FAIL(SHA256(data->data, data->size, digestOut32))
-
- return CSTATUS_OK;
- }
-
-#endif
-
-#ifndef _IMPL_CRYPTO_SHA256_HMAC
-
- #include <openssl/hmac.h>
-
- /* Export function */
- #define _IMPL_CRYPTO_SHA256_HMAC _ossl_hmac_sha256
-
- _IMPLSTB cstatus_t _ossl_hmac_sha256(const cspan_t* key, const cspan_t* data, sha256_t hmacOut32)
- {
- unsigned int hmacLen;
-
- _overflow_check(key->size)
- _overflow_check(data->size)
-
- hmacLen = sizeof(sha256_t);
-
- _OSSL_FAIL(
- HMAC(
- EVP_sha256(),
- key->data,
- key->size,
- data->data,
- data->size,
- hmacOut32,
- &hmacLen
- )
- )
-
- /* digest length should match the actual digest size */
- DEBUG_ASSERT(hmacLen == sizeof(sha256_t))
-
- return CSTATUS_OK;
- }
-
-#endif /* !_IMPL_CRYPTO_SHA256_HMAC */
-
-#ifndef _IMPL_CRYPTO_SHA256_HKDF_EXPAND
-
- #include <openssl/hmac.h>
- #include "hkdf.h"
-
- #define _IMPL_CRYPTO_SHA256_HKDF_EXPAND _ossl_sha256_hkdf_expand
-
- cstatus_t _ossl_hkdf_update(void* ctx, const cspan_t* data)
- {
- DEBUG_ASSERT(ctx != NULL)
-
- _overflow_check(data->size)
-
- _OSSL_FAIL(EVP_DigestUpdate((EVP_MD_CTX*)ctx, data->data, data->size))
-
- return CSTATUS_OK;
- }
-
- cstatus_t _ossl_hkdf_finish(void* ctx, sha256_t hmacOut32)
- {
- unsigned int hmacSize;
-
- DEBUG_ASSERT(ctx != NULL)
-
- hmacSize = sizeof(sha256_t);
-
- _OSSL_FAIL(EVP_DigestFinal_ex((EVP_MD_CTX*)ctx, hmacOut32, &hmacSize))
-
- /* When configured for sha256, should always be the same size in/out */
- DEBUG_ASSERT(hmacSize == sizeof(sha256_t))
-
- return CSTATUS_OK;
- }
-
- _IMPLSTB cstatus_t _ossl_sha256_hkdf_expand(const cspan_t* prk, const cspan_t* info, span_t* okm)
- {
- EVP_MD_CTX* ctx;
- cstatus_t result;
- struct nc_hkdf_fn_cb_struct handler;
-
- /*
- * NOTE! Hmac reusable flag must be set to allow for multiple
- * calls to the finish function without losing the context.
- */
-
- if ((ctx = EVP_MD_CTX_create()) == NULL)
- {
- return CSTATUS_FAIL;
- }
-
- _OSSL_FAIL(EVP_DigestInit_ex2(ctx, EVP_sha256(), NULL))
-
- _OSSL_FAIL(EVP_DigestUpdate(ctx, prk->data, prk->size));
-
- handler.update = _ossl_hkdf_update;
- handler.finish = _ossl_hkdf_finish;
-
- result = hkdfExpandProcess(&handler, ctx, info, okm);
-
- EVP_MD_CTX_destroy(ctx);
-
- return result;
- }
-
-#endif /* !_IMPL_CRYPTO_SHA256_HKDF_EXPAND */
-
-#endif /*!OPENSSL_CRYPTO_LIB */ \ No newline at end of file