/* Copyright (C) 2015-2020, Dirk Krause SPDX-License-Identifier: BSD-3-Clause */ /* WARNING: This file was generated by the dkct program (see http://dktools.sourceforge.net/ for details). Changes you make here will be lost if dkct is run again! You should modify the original source and run dkct on it. Original source: dk4md.ctr */ /** @file dk4md.c The dk4md module. */ #line 272 "dk4md.ctr" #include "dk4conf.h" #include "dk4md.h" #include "dk4mem.h" #include "dk4numco.h" #include "dk4binenc.h" #if DK4_HAVE_ASSERT_H #ifndef ASSERT_H_INCLUDED #include #define ASSERT_H_INCLUDED 1 #endif #endif #line 289 "dk4md.ctr" int dk4md_ctx_init(dk4_md_ctx_t *ctxptr, int mdt, int mde, dk4_er_t *erp) { int back = 0; #if DK4_USE_ASSERT assert(NULL != ctxptr); #endif if (NULL != ctxptr) { DK4_MEMRES(ctxptr, sizeof(dk4_md_ctx_t)); ctxptr->mdtype = -1; ctxptr->encoding = -1; switch (mde) { case DK4_BINARY_TO_TEXT_ENCODING_HEX: case DK4_BINARY_TO_TEXT_ENCODING_A85: { ctxptr->encoding = mde; } break; default : { dk4error_set_simple_error_code(erp, DK4_E_SYNTAX); } break; } if (-1 != ctxptr->encoding) { switch (mdt) { case DK4_MD_MD5 : { #if DK4_HAVE_OPENSSL_MD5_H ctxptr->mdtype = mdt; if (1 == MD5_Init(&((ctxptr->ctx).md5))) { back = 1; } else { dk4error_set_simple_error_code(erp, DK4_E_SYSTEM); } #else dk4error_set_simple_error_code(erp, DK4_E_NOT_SUPPORTED); #endif } break; case DK4_MD_SHA1 : { #if DK4_HAVE_OPENSSL_SHA_H ctxptr->mdtype = mdt; if (1 == SHA1_Init(&((ctxptr->ctx).sha))) { back = 1; } else { dk4error_set_simple_error_code(erp, DK4_E_SYSTEM); } #else dk4error_set_simple_error_code(erp, DK4_E_NOT_SUPPORTED); #endif } break; case DK4_MD_SHA224 : { #if DK4_HAVE_OPENSSL_SHA_H && DK4_HAVE_SHA224 ctxptr->mdtype = mdt; if (1 == SHA224_Init(&((ctxptr->ctx).sha256))) { back = 1; } else { dk4error_set_simple_error_code(erp, DK4_E_SYSTEM); } #else dk4error_set_simple_error_code(erp, DK4_E_NOT_SUPPORTED); #endif } break; case DK4_MD_SHA256 : { #if DK4_HAVE_OPENSSL_SHA_H && DK4_HAVE_SHA256 ctxptr->mdtype = mdt; if (1 == SHA256_Init(&((ctxptr->ctx).sha256))) { back = 1; } else { dk4error_set_simple_error_code(erp, DK4_E_SYSTEM); } #else dk4error_set_simple_error_code(erp, DK4_E_NOT_SUPPORTED); #endif } break; case DK4_MD_SHA384 : { #if DK4_HAVE_OPENSSL_SHA_H && DK4_HAVE_SHA384 ctxptr->mdtype = mdt; if (1 == SHA384_Init(&((ctxptr->ctx).sha512))) { back = 1; } else { dk4error_set_simple_error_code(erp, DK4_E_SYSTEM); } #else dk4error_set_simple_error_code(erp, DK4_E_NOT_SUPPORTED); #endif } break; case DK4_MD_SHA512 : { #if DK4_HAVE_OPENSSL_SHA_H && DK4_HAVE_SHA512 ctxptr->mdtype = mdt; if (1 == SHA512_Init(&((ctxptr->ctx).sha512))) { back = 1; } else { dk4error_set_simple_error_code(erp, DK4_E_SYSTEM); } #else dk4error_set_simple_error_code(erp, DK4_E_NOT_SUPPORTED); #endif } break; case DK4_MD_RIPEMD_160 : { #if DK4_HAVE_OPENSSL_RIPEMD_H ctxptr->mdtype = mdt; if (1 == RIPEMD160_Init(&((ctxptr->ctx).ripemd160))) { back = 1; } else { dk4error_set_simple_error_code(erp, DK4_E_SYSTEM); } #else dk4error_set_simple_error_code(erp, DK4_E_NOT_SUPPORTED); #endif } break; } } } else { dk4error_set_simple_error_code(erp, DK4_E_INVALID_ARGUMENTS); } return back; } int dk4md_ctx_add( dk4_md_ctx_t *ctxptr, const void *buffer, size_t sz, dk4_er_t *erp ) { int back = 0; #if DK4_USE_ASSERT assert(NULL != ctxptr); assert(NULL != buffer); assert(0 < sz); #endif if ((NULL != ctxptr) && (NULL != buffer) && (0 < sz)) { if ((dk4_um_t)sz <= (dk4_um_t)ULONG_MAX) { if (-1 != ctxptr->mdtype) { switch (ctxptr->mdtype) { case DK4_MD_MD5 : { #if DK4_HAVE_OPENSSL_MD5_H back = MD5_Update( &((ctxptr->ctx).md5), buffer, (unsigned long)sz ); if (0 == back) { dk4error_set_simple_error_code(erp, DK4_E_SYSTEM); } #else dk4error_set_simple_error_code(erp, DK4_E_NOT_SUPPORTED); #endif } break; case DK4_MD_SHA1 : { #if DK4_HAVE_OPENSSL_SHA_H back = SHA1_Update( &((ctxptr->ctx).sha), buffer, (unsigned long)sz ); if (0 == back) { dk4error_set_simple_error_code(erp, DK4_E_SYSTEM); } #else dk4error_set_simple_error_code(erp, DK4_E_NOT_SUPPORTED); #endif } break; case DK4_MD_SHA224 : { #if DK4_HAVE_OPENSSL_SHA_H && DK4_HAVE_SHA224 back = SHA224_Update( &((ctxptr->ctx).sha256), buffer, (unsigned long)sz ); if (0 == back) { dk4error_set_simple_error_code(erp, DK4_E_SYSTEM); } #else dk4error_set_simple_error_code(erp, DK4_E_NOT_SUPPORTED); #endif } break; case DK4_MD_SHA256 : { #if DK4_HAVE_OPENSSL_SHA_H && DK4_HAVE_SHA256 back = SHA256_Update( &((ctxptr->ctx).sha256), buffer, (unsigned long)sz ); if (0 == back) { dk4error_set_simple_error_code(erp, DK4_E_SYSTEM); } #else dk4error_set_simple_error_code(erp, DK4_E_NOT_SUPPORTED); #endif } break; case DK4_MD_SHA384 : { #if DK4_HAVE_OPENSSL_SHA_H && DK4_HAVE_SHA384 back = SHA384_Update( &((ctxptr->ctx).sha512), buffer, (unsigned long)sz ); if (0 == back) { dk4error_set_simple_error_code(erp, DK4_E_SYSTEM); } #else dk4error_set_simple_error_code(erp, DK4_E_NOT_SUPPORTED); #endif } break; case DK4_MD_SHA512 : { #if DK4_HAVE_OPENSSL_SHA_H && DK4_HAVE_SHA512 back = SHA512_Update( &((ctxptr->ctx).sha512), buffer, (unsigned long)sz ); if (0 == back) { dk4error_set_simple_error_code(erp, DK4_E_SYSTEM); } #else dk4error_set_simple_error_code(erp, DK4_E_NOT_SUPPORTED); #endif } break; case DK4_MD_RIPEMD_160 : { #if DK4_HAVE_OPENSSL_RIPEMD_H back = RIPEMD160_Update( &((ctxptr->ctx).ripemd160), buffer, (unsigned long)sz ); if (0 == back) { dk4error_set_simple_error_code(erp, DK4_E_SYSTEM); } #else dk4error_set_simple_error_code(erp, DK4_E_NOT_SUPPORTED); #endif } break; default : { dk4error_set_simple_error_code(erp, DK4_E_SYNTAX); } break; } } else { dk4error_set_simple_error_code(erp, DK4_E_SYNTAX); } } else { dk4error_set_simple_error_code(erp, DK4_E_INVALID_ARGUMENTS); } } else { dk4error_set_simple_error_code(erp, DK4_E_INVALID_ARGUMENTS); } return back; } int dk4md_ctx_finish( const char **rptr, size_t *rszptr, dk4_md_ctx_t *ctxptr, dk4_er_t *erp ) { int back = 0; #line 533 "dk4md.ctr" #if DK4_USE_ASSERT assert(NULL != rptr); assert(NULL != rszptr); assert(NULL != ctxptr); #endif if ((NULL != rptr) && (NULL != rszptr) && (NULL != ctxptr)) { if (-1 != ctxptr->mdtype) { switch (ctxptr->mdtype) { case DK4_MD_MD5 : { #if DK4_HAVE_OPENSSL_MD5_H back = MD5_Final(&(ctxptr->bbuf[0]), &((ctxptr->ctx).md5)); if (0 != back) { back = dk4binenc( &(ctxptr->obuf[0]), DK4MD_BUFFER_SIZE_TEXT, &(ctxptr->bbuf[0]), 16, ctxptr->encoding, erp ); if (0 != back) { *rptr = &(ctxptr->obuf[0]); switch (ctxptr->encoding) { case DK4_BINARY_TO_TEXT_ENCODING_NONE : { *rszptr = 16; } break; case DK4_BINARY_TO_TEXT_ENCODING_HEX : { *rszptr = 32; } break; case DK4_BINARY_TO_TEXT_ENCODING_A85 : { *rszptr = 20; } break; } } } else { dk4error_set_simple_error_code(erp, DK4_E_SYSTEM); } #else dk4error_set_simple_error_code(erp, DK4_E_NOT_SUPPORTED); #endif } break; case DK4_MD_SHA1 : { #if DK4_HAVE_OPENSSL_SHA_H back = SHA1_Final(&(ctxptr->bbuf[0]), &((ctxptr->ctx).sha)); if (0 != back) { back = dk4binenc( &(ctxptr->obuf[0]), DK4MD_BUFFER_SIZE_TEXT, &(ctxptr->bbuf[0]), 20, ctxptr->encoding, erp ); if (0 != back) { *rptr = &(ctxptr->obuf[0]); switch (ctxptr->encoding) { case DK4_BINARY_TO_TEXT_ENCODING_NONE : { *rszptr = 20; } break; case DK4_BINARY_TO_TEXT_ENCODING_HEX : { *rszptr = 40; } break; case DK4_BINARY_TO_TEXT_ENCODING_A85 : { *rszptr = 25; } break; } } } else { dk4error_set_simple_error_code(erp, DK4_E_SYSTEM); } #else dk4error_set_simple_error_code(erp, DK4_E_NOT_SUPPORTED); #endif } break; case DK4_MD_SHA224 : { #if DK4_HAVE_OPENSSL_SHA_H && DK4_HAVE_SHA224 back = SHA224_Final(&(ctxptr->bbuf[0]), &((ctxptr->ctx).sha256)); if (0 != back) { back = dk4binenc( &(ctxptr->obuf[0]), DK4MD_BUFFER_SIZE_TEXT, &(ctxptr->bbuf[0]), 28, ctxptr->encoding, erp ); if (0 != back) { *rptr = &(ctxptr->obuf[0]); switch (ctxptr->encoding) { case DK4_BINARY_TO_TEXT_ENCODING_NONE : { *rszptr = 28; } break; case DK4_BINARY_TO_TEXT_ENCODING_HEX : { *rszptr = 56; } break; case DK4_BINARY_TO_TEXT_ENCODING_A85 : { *rszptr = 35; } break; } } } else { dk4error_set_simple_error_code(erp, DK4_E_SYSTEM); } #else dk4error_set_simple_error_code(erp, DK4_E_NOT_SUPPORTED); #endif } break; case DK4_MD_SHA256 : { #if DK4_HAVE_OPENSSL_SHA_H && DK4_HAVE_SHA256 back = SHA256_Final(&(ctxptr->bbuf[0]), &((ctxptr->ctx).sha256)); if (0 != back) { back = dk4binenc( &(ctxptr->obuf[0]), DK4MD_BUFFER_SIZE_TEXT, &(ctxptr->bbuf[0]), 32, ctxptr->encoding, erp ); if (0 != back) { *rptr = &(ctxptr->obuf[0]); switch (ctxptr->encoding) { case DK4_BINARY_TO_TEXT_ENCODING_NONE : { *rszptr = 32; } break; case DK4_BINARY_TO_TEXT_ENCODING_HEX : { *rszptr = 64; } break; case DK4_BINARY_TO_TEXT_ENCODING_A85 : { *rszptr = 40; } break; } } } else { dk4error_set_simple_error_code(erp, DK4_E_SYSTEM); } #else dk4error_set_simple_error_code(erp, DK4_E_NOT_SUPPORTED); #endif } break; case DK4_MD_SHA384 : { #if DK4_HAVE_OPENSSL_SHA_H && DK4_HAVE_SHA384 back = SHA384_Final(&(ctxptr->bbuf[0]), &((ctxptr->ctx).sha512)); if (0 != back) { back = dk4binenc( &(ctxptr->obuf[0]), DK4MD_BUFFER_SIZE_TEXT, &(ctxptr->bbuf[0]), 48, ctxptr->encoding, erp ); if (0 != back) { *rptr = &(ctxptr->obuf[0]); switch (ctxptr->encoding) { case DK4_BINARY_TO_TEXT_ENCODING_NONE : { *rszptr = 48; } break; case DK4_BINARY_TO_TEXT_ENCODING_HEX : { *rszptr = 96; } break; case DK4_BINARY_TO_TEXT_ENCODING_A85 : { *rszptr = 60; } break; } } } else { dk4error_set_simple_error_code(erp, DK4_E_SYSTEM); } #else dk4error_set_simple_error_code(erp, DK4_E_NOT_SUPPORTED); #endif } break; case DK4_MD_SHA512 : { #line 662 "dk4md.ctr" #if DK4_HAVE_OPENSSL_SHA_H && DK4_HAVE_SHA512 #line 664 "dk4md.ctr" back = SHA512_Final(&(ctxptr->bbuf[0]), &((ctxptr->ctx).sha512)); if (0 != back) { #line 666 "dk4md.ctr" back = dk4binenc( &(ctxptr->obuf[0]), DK4MD_BUFFER_SIZE_TEXT, &(ctxptr->bbuf[0]), 64, ctxptr->encoding, erp ); if (0 != back) { #line 672 "dk4md.ctr" *rptr = &(ctxptr->obuf[0]); #line 673 "dk4md.ctr" switch (ctxptr->encoding) { case DK4_BINARY_TO_TEXT_ENCODING_NONE : { *rszptr = 64; } break; case DK4_BINARY_TO_TEXT_ENCODING_HEX : { *rszptr = 128;} break; case DK4_BINARY_TO_TEXT_ENCODING_A85 : { *rszptr = 80; } break; } } else { #line 679 "dk4md.ctr" } } else { #line 681 "dk4md.ctr" dk4error_set_simple_error_code(erp, DK4_E_SYSTEM); } #else dk4error_set_simple_error_code(erp, DK4_E_NOT_SUPPORTED); #endif } break; case DK4_MD_RIPEMD_160 : { #if DK4_HAVE_OPENSSL_RIPEMD_H back = RIPEMD160_Final(&(ctxptr->bbuf[0]),&((ctxptr->ctx).ripemd160)); if (0 != back) { back = dk4binenc( &(ctxptr->obuf[0]), DK4MD_BUFFER_SIZE_TEXT, &(ctxptr->bbuf[0]), 20, ctxptr->encoding, erp ); if (0 != back) { *rptr = &(ctxptr->obuf[0]); switch (ctxptr->encoding) { case DK4_BINARY_TO_TEXT_ENCODING_NONE : { *rszptr = 20; } break; case DK4_BINARY_TO_TEXT_ENCODING_HEX : { *rszptr = 40; } break; case DK4_BINARY_TO_TEXT_ENCODING_A85 : { *rszptr = 25; } break; } } } else { dk4error_set_simple_error_code(erp, DK4_E_SYSTEM); } #else dk4error_set_simple_error_code(erp, DK4_E_NOT_SUPPORTED); #endif } break; default : { /* ERROR: Wrong MD type */ dk4error_set_simple_error_code(erp, DK4_E_NOT_SUPPORTED); } break; } } else { /* ERROR Wrong MD type */ dk4error_set_simple_error_code(erp, DK4_E_NOT_SUPPORTED); } } else { dk4error_set_simple_error_code(erp, DK4_E_INVALID_ARGUMENTS); } #line 723 "dk4md.ctr" return back; } size_t dk4md_size(int mdt, int mde, dk4_er_t *erp) { size_t back = 0; switch (mdt) { case DK4_MD_MD5 : { switch (mde) { case DK4_BINARY_TO_TEXT_ENCODING_NONE : { back = 16; } break; case DK4_BINARY_TO_TEXT_ENCODING_HEX : { back = 32; } break; case DK4_BINARY_TO_TEXT_ENCODING_A85 : { back = 20; } break; } } break; case DK4_MD_SHA1 : case DK4_MD_RIPEMD_160 : { switch (mde) { case DK4_BINARY_TO_TEXT_ENCODING_NONE : { back = 20; } break; case DK4_BINARY_TO_TEXT_ENCODING_HEX : { back = 40; } break; case DK4_BINARY_TO_TEXT_ENCODING_A85 : { back = 25; } break; } } break; case DK4_MD_SHA224 : { switch (mde) { case DK4_BINARY_TO_TEXT_ENCODING_NONE : { back = 28; } break; case DK4_BINARY_TO_TEXT_ENCODING_HEX : { back = 56; } break; case DK4_BINARY_TO_TEXT_ENCODING_A85 : { back = 35; } break; } } break; case DK4_MD_SHA256 : { switch (mde) { case DK4_BINARY_TO_TEXT_ENCODING_NONE : { back = 32; } break; case DK4_BINARY_TO_TEXT_ENCODING_HEX : { back = 64; } break; case DK4_BINARY_TO_TEXT_ENCODING_A85 : { back = 40; } break; } } break; case DK4_MD_SHA384 : { switch (mde) { case DK4_BINARY_TO_TEXT_ENCODING_NONE : { back = 48; } break; case DK4_BINARY_TO_TEXT_ENCODING_HEX : { back = 96; } break; case DK4_BINARY_TO_TEXT_ENCODING_A85 : { back = 60; } break; } } break; case DK4_MD_SHA512 : { switch (mde) { case DK4_BINARY_TO_TEXT_ENCODING_NONE : { back = 64; } break; case DK4_BINARY_TO_TEXT_ENCODING_HEX : { back = 128; } break; case DK4_BINARY_TO_TEXT_ENCODING_A85 : { back = 80; } break; } } break; } if (0 == back) { dk4error_set_simple_error_code(erp, DK4_E_INVALID_ARGUMENTS); } return back; }