Skip to content

Commit

Permalink
digest: implement compile time option to exclude less common algorithms
Browse files Browse the repository at this point in the history
Introduce a new default enabled CMake option `DIGEST_SUPPORT_EXTENDED`
which, when turned off, disables all but the most common md5, sha1 and
cha256 alogirthms to reduce the library size.

Signed-off-by: Jo-Philipp Wich <[email protected]>
  • Loading branch information
jow- committed Nov 6, 2024
1 parent f8cbce7 commit 6e62ada
Show file tree
Hide file tree
Showing 2 changed files with 77 additions and 65 deletions.
4 changes: 4 additions & 0 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -73,6 +73,7 @@ option(LOG_SUPPORT "Log plugin support" ON)
option(SOCKET_SUPPORT "Socket plugin support" ON)
option(ZLIB_SUPPORT "Zlib plugin support" ${DEFAULT_ZLIB_SUPPORT})
option(DIGEST_SUPPORT "Digest plugin support" ${DEFAULT_DIGEST_SUPPORT})
option(DIGEST_SUPPORT_EXTENDED "Enable additional hash algorithms" ${DEFAULT_DIGEST_SUPPORT})

set(LIB_SEARCH_PATH "${CMAKE_INSTALL_PREFIX}/lib/ucode/*.so:${CMAKE_INSTALL_PREFIX}/share/ucode/*.uc:./*.so:./*.uc" CACHE STRING "Default library search path")
string(REPLACE ":" "\", \"" LIB_SEARCH_DEFINE "${LIB_SEARCH_PATH}")
Expand Down Expand Up @@ -300,6 +301,9 @@ if(DIGEST_SUPPORT)
set(LIBRARIES ${LIBRARIES} digest_lib)
add_library(digest_lib MODULE lib/digest.c)
set_target_properties(digest_lib PROPERTIES OUTPUT_NAME digest PREFIX "")
if(DIGEST_SUPPORT_EXTENDED)
target_compile_definitions(digest_lib PUBLIC HAVE_DIGEST_EXTENDED)
endif()
target_link_options(digest_lib PRIVATE ${UCODE_MODULE_LINK_OPTIONS})
target_link_libraries(digest_lib ${libmd})
endif()
Expand Down
138 changes: 73 additions & 65 deletions lib/digest.c
Original file line number Diff line number Diff line change
Expand Up @@ -22,12 +22,15 @@
* @module digest
*/

#include <md2.h>
#include <md4.h>
#include <md5.h>
#include <sha1.h>
#include <sha2.h>

#ifdef HAVE_DIGEST_EXTENDED
#include <md2.h>
#include <md4.h>
#endif

#include "ucode/module.h"


Expand Down Expand Up @@ -59,115 +62,115 @@ uc_digest_calc_file(uc_value_t *path, char *(fn)(const char *,char *))
return NULL;
}


/**
* Calculates the MD2 hash of string and returns that hash.
* Calculates the MD5 hash of string and returns that hash.
*
* Returns `null` if a non-string argument is given.
*
* @function module:digest#md2
* @function module:digest#md5
*
* @param {string} str
* The string to hash.
*
* @returns {?string}
*
* @example
* md2("This is a test"); // Returns "dc378580fd0722e56b82666a6994c718"
* md2(123); // Returns null
* md5("This is a test"); // Returns "ce114e4501d2f4e2dcea3e17b546f339"
* md5(123); // Returns null
*/
static uc_value_t *
uc_digest_md2(uc_vm_t *vm, size_t nargs)
uc_digest_md5(uc_vm_t *vm, size_t nargs)
{
return uc_digest_calc_data(uc_fn_arg(0), MD2Data);
return uc_digest_calc_data(uc_fn_arg(0), MD5Data);
}

/**
* Calculates the MD4 hash of string and returns that hash.
* Calculates the SHA1 hash of string and returns that hash.
*
* Returns `null` if a non-string argument is given.
*
* @function module:digest#md4
* @function module:digest#sha1
*
* @param {string} str
* The string to hash.
*
* @returns {?string}
*
* @example
* md4("This is a test"); // Returns "3b487cf6856af7e330bc4b1b7d977ef8"
* md4(123); // Returns null
* sha1("This is a test"); // Returns "a54d88e06612d820bc3be72877c74f257b561b19"
* sha1(123); // Returns null
*/
static uc_value_t *
uc_digest_md4(uc_vm_t *vm, size_t nargs)
uc_digest_sha1(uc_vm_t *vm, size_t nargs)
{
return uc_digest_calc_data(uc_fn_arg(0), MD4Data);
return uc_digest_calc_data(uc_fn_arg(0), SHA1Data);
}

/**
* Calculates the MD5 hash of string and returns that hash.
* Calculates the SHA256 hash of string and returns that hash.
*
* Returns `null` if a non-string argument is given.
*
* @function module:digest#md5
* @function module:digest#sha256
*
* @param {string} str
* The string to hash.
*
* @returns {?string}
*
* @example
* md5("This is a test"); // Returns "ce114e4501d2f4e2dcea3e17b546f339"
* md5(123); // Returns null
* sha256("This is a test"); // Returns "c7be1ed902fb8dd4d48997c6452f5d7e509fbcdbe2808b16bcf4edce4c07d14e"
* sha256(123); // Returns null
*/
static uc_value_t *
uc_digest_md5(uc_vm_t *vm, size_t nargs)
uc_digest_sha256(uc_vm_t *vm, size_t nargs)
{
return uc_digest_calc_data(uc_fn_arg(0), MD5Data);
return uc_digest_calc_data(uc_fn_arg(0), SHA256Data);
}

#ifdef HAVE_DIGEST_EXTENDED
/**
* Calculates the SHA1 hash of string and returns that hash.
* Calculates the MD2 hash of string and returns that hash.
*
* Returns `null` if a non-string argument is given.
*
* @function module:digest#sha1
* @function module:digest#md2
*
* @param {string} str
* The string to hash.
*
* @returns {?string}
*
* @example
* sha1("This is a test"); // Returns "a54d88e06612d820bc3be72877c74f257b561b19"
* sha1(123); // Returns null
* md2("This is a test"); // Returns "dc378580fd0722e56b82666a6994c718"
* md2(123); // Returns null
*/
static uc_value_t *
uc_digest_sha1(uc_vm_t *vm, size_t nargs)
uc_digest_md2(uc_vm_t *vm, size_t nargs)
{
return uc_digest_calc_data(uc_fn_arg(0), SHA1Data);
return uc_digest_calc_data(uc_fn_arg(0), MD2Data);
}

/**
* Calculates the SHA256 hash of string and returns that hash.
* Calculates the MD4 hash of string and returns that hash.
*
* Returns `null` if a non-string argument is given.
*
* @function module:digest#sha256
* @function module:digest#md4
*
* @param {string} str
* The string to hash.
*
* @returns {?string}
*
* @example
* sha256("This is a test"); // Returns "c7be1ed902fb8dd4d48997c6452f5d7e509fbcdbe2808b16bcf4edce4c07d14e"
* sha256(123); // Returns null
* md4("This is a test"); // Returns "3b487cf6856af7e330bc4b1b7d977ef8"
* md4(123); // Returns null
*/
static uc_value_t *
uc_digest_sha256(uc_vm_t *vm, size_t nargs)
uc_digest_md4(uc_vm_t *vm, size_t nargs)
{
return uc_digest_calc_data(uc_fn_arg(0), SHA256Data);
return uc_digest_calc_data(uc_fn_arg(0), MD4Data);
}

/**
Expand Down Expand Up @@ -213,95 +216,97 @@ uc_digest_sha512(uc_vm_t *vm, size_t nargs)
{
return uc_digest_calc_data(uc_fn_arg(0), SHA512Data);
}
#endif

/**
* Calculates the MD2 hash of a given file and returns that hash.
* Calculates the MD5 hash of a given file and returns that hash.
*
* Returns `null` if an error occurred.
*
* @function module:digest#md2_file
* @function module:digest#md5_file
*
* @param {string} path
* The path to the file.
*
* @returns {?string}
*/
static uc_value_t *
uc_digest_md2_file(uc_vm_t *vm, size_t nargs)
uc_digest_md5_file(uc_vm_t *vm, size_t nargs)
{
return uc_digest_calc_file(uc_fn_arg(0), MD2File);
return uc_digest_calc_file(uc_fn_arg(0), MD5File);
}

/**
* Calculates the MD4 hash of a given file and returns that hash.
* Calculates the SHA1 hash of a given file and returns that hash.
*
* Returns `null` if an error occurred.
*
* @function module:digest#md4_file
* @function module:digest#sha1_file
*
* @param {string} path
* The path to the file.
*
* @returns {?string}
*/
static uc_value_t *
uc_digest_md4_file(uc_vm_t *vm, size_t nargs)
uc_digest_sha1_file(uc_vm_t *vm, size_t nargs)
{
return uc_digest_calc_file(uc_fn_arg(0), MD4File);
return uc_digest_calc_file(uc_fn_arg(0), SHA1File);
}

/**
* Calculates the MD5 hash of a given file and returns that hash.
* Calculates the SHA256 hash of a given file and returns that hash.
*
* Returns `null` if an error occurred.
*
* @function module:digest#md5_file
* @function module:digest#sha256_file
*
* @param {string} path
* The path to the file.
*
* @returns {?string}
*/
static uc_value_t *
uc_digest_md5_file(uc_vm_t *vm, size_t nargs)
uc_digest_sha256_file(uc_vm_t *vm, size_t nargs)
{
return uc_digest_calc_file(uc_fn_arg(0), MD5File);
return uc_digest_calc_file(uc_fn_arg(0), SHA256File);
}

#ifdef HAVE_DIGEST_EXTENDED
/**
* Calculates the SHA1 hash of a given file and returns that hash.
* Calculates the MD2 hash of a given file and returns that hash.
*
* Returns `null` if an error occurred.
*
* @function module:digest#sha1_file
* @function module:digest#md2_file
*
* @param {string} path
* The path to the file.
*
* @returns {?string}
*/
static uc_value_t *
uc_digest_sha1_file(uc_vm_t *vm, size_t nargs)
uc_digest_md2_file(uc_vm_t *vm, size_t nargs)
{
return uc_digest_calc_file(uc_fn_arg(0), SHA1File);
return uc_digest_calc_file(uc_fn_arg(0), MD2File);
}

/**
* Calculates the SHA256 hash of a given file and returns that hash.
* Calculates the MD4 hash of a given file and returns that hash.
*
* Returns `null` if an error occurred.
*
* @function module:digest#sha256_file
* @function module:digest#md4_file
*
* @param {string} path
* The path to the file.
*
* @returns {?string}
*/
static uc_value_t *
uc_digest_sha256_file(uc_vm_t *vm, size_t nargs)
uc_digest_md4_file(uc_vm_t *vm, size_t nargs)
{
return uc_digest_calc_file(uc_fn_arg(0), SHA256File);
return uc_digest_calc_file(uc_fn_arg(0), MD4File);
}

/**
Expand Down Expand Up @@ -339,26 +344,29 @@ uc_digest_sha512_file(uc_vm_t *vm, size_t nargs)
{
return uc_digest_calc_file(uc_fn_arg(0), SHA512File);
}
#endif


static const uc_function_list_t global_fns[] = {
{ "md2" , uc_digest_md2 },
{ "md4" , uc_digest_md4 },
{ "md5" , uc_digest_md5 },
{ "sha1" , uc_digest_sha1 },
{ "sha256" , uc_digest_sha256 },
{ "sha384" , uc_digest_sha384 },
{ "sha512" , uc_digest_sha512 },
{ "md2_file" , uc_digest_md2_file },
{ "md4_file" , uc_digest_md4_file },
{ "md5_file" , uc_digest_md5_file },
{ "sha1_file" , uc_digest_sha1_file },
{ "md5", uc_digest_md5 },
{ "sha1", uc_digest_sha1 },
{ "sha256", uc_digest_sha256 },
{ "md5_file", uc_digest_md5_file },
{ "sha1_file", uc_digest_sha1_file },
{ "sha256_file", uc_digest_sha256_file },
#ifdef HAVE_DIGEST_EXTENDED
{ "md2", uc_digest_md2 },
{ "md4", uc_digest_md4 },
{ "sha384", uc_digest_sha384 },
{ "sha512", uc_digest_sha512 },
{ "md2_file", uc_digest_md2_file },
{ "md4_file", uc_digest_md4_file },
{ "sha384_file", uc_digest_sha384_file },
{ "sha512_file", uc_digest_sha512_file },
#endif
};

void uc_module_init(uc_vm_t *vm, uc_value_t *scope)
{
uc_function_list_register(scope,global_fns);
uc_function_list_register(scope, global_fns);
}

0 comments on commit 6e62ada

Please sign in to comment.