diff options
author | Nikita Slyusarev <nslus@yandex-team.com> | 2022-02-10 16:46:52 +0300 |
---|---|---|
committer | Daniil Cherednik <dcherednik@yandex-team.ru> | 2022-02-10 16:46:52 +0300 |
commit | cd77cecfc03a3eaf87816af28a33067c4f0cdb59 (patch) | |
tree | 1308e0bae862d52e0020d881fe758080437fe389 /contrib/libs/curl/lib/md5.c | |
parent | cdae02d225fb5b3afbb28990e79a7ac6c9125327 (diff) | |
download | ydb-cd77cecfc03a3eaf87816af28a33067c4f0cdb59.tar.gz |
Restoring authorship annotation for Nikita Slyusarev <nslus@yandex-team.com>. Commit 1 of 2.
Diffstat (limited to 'contrib/libs/curl/lib/md5.c')
-rw-r--r-- | contrib/libs/curl/lib/md5.c | 464 |
1 files changed, 232 insertions, 232 deletions
diff --git a/contrib/libs/curl/lib/md5.c b/contrib/libs/curl/lib/md5.c index ff0b369f02..7165f04388 100644 --- a/contrib/libs/curl/lib/md5.c +++ b/contrib/libs/curl/lib/md5.c @@ -1,35 +1,35 @@ -/*************************************************************************** - * _ _ ____ _ - * Project ___| | | | _ \| | - * / __| | | | |_) | | - * | (__| |_| | _ <| |___ - * \___|\___/|_| \_\_____| - * +/*************************************************************************** + * _ _ ____ _ + * Project ___| | | | _ \| | + * / __| | | | |_) | | + * | (__| |_| | _ <| |___ + * \___|\___/|_| \_\_____| + * * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al. - * - * This software is licensed as described in the file COPYING, which - * you should have received as part of this distribution. The terms + * + * This software is licensed as described in the file COPYING, which + * you should have received as part of this distribution. The terms * are also available at https://curl.se/docs/copyright.html. - * - * You may opt to use, copy, modify, merge, publish, distribute and/or sell - * copies of the Software, and permit persons to whom the Software is - * furnished to do so, under the terms of the COPYING file. - * - * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY - * KIND, either express or implied. - * - ***************************************************************************/ - -#include "curl_setup.h" - -#ifndef CURL_DISABLE_CRYPTO_AUTH - + * + * You may opt to use, copy, modify, merge, publish, distribute and/or sell + * copies of the Software, and permit persons to whom the Software is + * furnished to do so, under the terms of the COPYING file. + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY + * KIND, either express or implied. + * + ***************************************************************************/ + +#include "curl_setup.h" + +#ifndef CURL_DISABLE_CRYPTO_AUTH + #include <curl/curl.h> -#include "curl_md5.h" -#include "curl_hmac.h" -#include "warnless.h" - +#include "curl_md5.h" +#include "curl_hmac.h" +#include "warnless.h" + #ifdef USE_MBEDTLS #error #include <mbedtls/version.h> @@ -38,66 +38,66 @@ #endif #endif /* USE_MBEDTLS */ -#if defined(USE_GNUTLS_NETTLE) - -#include <nettle/md5.h> +#if defined(USE_GNUTLS_NETTLE) + +#include <nettle/md5.h> #include "curl_memory.h" -/* The last #include file should be: */ -#include "memdebug.h" - -typedef struct md5_ctx MD5_CTX; - +/* The last #include file should be: */ +#include "memdebug.h" + +typedef struct md5_ctx MD5_CTX; + static void MD5_Init(MD5_CTX *ctx) -{ - md5_init(ctx); -} - +{ + md5_init(ctx); +} + static void MD5_Update(MD5_CTX *ctx, const unsigned char *input, - unsigned int inputLen) -{ - md5_update(ctx, inputLen, input); -} - + unsigned int inputLen) +{ + md5_update(ctx, inputLen, input); +} + static void MD5_Final(unsigned char *digest, MD5_CTX *ctx) -{ - md5_digest(ctx, 16, digest); -} - -#elif defined(USE_GNUTLS) - -#include <gcrypt.h> +{ + md5_digest(ctx, 16, digest); +} + +#elif defined(USE_GNUTLS) + +#include <gcrypt.h> #include "curl_memory.h" -/* The last #include file should be: */ -#include "memdebug.h" - -typedef gcry_md_hd_t MD5_CTX; - +/* The last #include file should be: */ +#include "memdebug.h" + +typedef gcry_md_hd_t MD5_CTX; + static void MD5_Init(MD5_CTX *ctx) -{ - gcry_md_open(ctx, GCRY_MD_MD5, 0); -} - +{ + gcry_md_open(ctx, GCRY_MD_MD5, 0); +} + static void MD5_Update(MD5_CTX *ctx, const unsigned char *input, - unsigned int inputLen) -{ - gcry_md_write(*ctx, input, inputLen); -} - + unsigned int inputLen) +{ + gcry_md_write(*ctx, input, inputLen); +} + static void MD5_Final(unsigned char *digest, MD5_CTX *ctx) -{ - memcpy(digest, gcry_md_read(*ctx, 0), 16); - gcry_md_close(*ctx); -} - +{ + memcpy(digest, gcry_md_read(*ctx, 0), 16); + gcry_md_close(*ctx); +} + #elif defined(USE_OPENSSL) && !defined(USE_AMISSL) -/* When OpenSSL is available we use the MD5-function from OpenSSL */ +/* When OpenSSL is available we use the MD5-function from OpenSSL */ #include <openssl/md5.h> #include "curl_memory.h" /* The last #include file should be: */ #include "memdebug.h" - + #elif defined(USE_MBEDTLS) #error #include <mbedtls/md5.h> @@ -138,85 +138,85 @@ static void MD5_Final(unsigned char *digest, MD5_CTX *ctx) #endif } -#elif (defined(__MAC_OS_X_VERSION_MAX_ALLOWED) && \ +#elif (defined(__MAC_OS_X_VERSION_MAX_ALLOWED) && \ (__MAC_OS_X_VERSION_MAX_ALLOWED >= 1040) && \ defined(__MAC_OS_X_VERSION_MIN_ALLOWED) && \ (__MAC_OS_X_VERSION_MIN_ALLOWED < 101500)) || \ - (defined(__IPHONE_OS_VERSION_MAX_ALLOWED) && \ - (__IPHONE_OS_VERSION_MAX_ALLOWED >= 20000)) - -/* For Apple operating systems: CommonCrypto has the functions we need. - These functions are available on Tiger and later, as well as iOS 2.0 - and later. If you're building for an older cat, well, sorry. - - Declaring the functions as static like this seems to be a bit more - reliable than defining COMMON_DIGEST_FOR_OPENSSL on older cats. */ -# include <CommonCrypto/CommonDigest.h> -# define MD5_CTX CC_MD5_CTX + (defined(__IPHONE_OS_VERSION_MAX_ALLOWED) && \ + (__IPHONE_OS_VERSION_MAX_ALLOWED >= 20000)) + +/* For Apple operating systems: CommonCrypto has the functions we need. + These functions are available on Tiger and later, as well as iOS 2.0 + and later. If you're building for an older cat, well, sorry. + + Declaring the functions as static like this seems to be a bit more + reliable than defining COMMON_DIGEST_FOR_OPENSSL on older cats. */ +# include <CommonCrypto/CommonDigest.h> +# define MD5_CTX CC_MD5_CTX #include "curl_memory.h" /* The last #include file should be: */ #include "memdebug.h" - -static void MD5_Init(MD5_CTX *ctx) -{ - CC_MD5_Init(ctx); -} - -static void MD5_Update(MD5_CTX *ctx, - const unsigned char *input, - unsigned int inputLen) -{ - CC_MD5_Update(ctx, input, inputLen); -} - + +static void MD5_Init(MD5_CTX *ctx) +{ + CC_MD5_Init(ctx); +} + +static void MD5_Update(MD5_CTX *ctx, + const unsigned char *input, + unsigned int inputLen) +{ + CC_MD5_Update(ctx, input, inputLen); +} + static void MD5_Final(unsigned char *digest, MD5_CTX *ctx) -{ - CC_MD5_Final(digest, ctx); -} - +{ + CC_MD5_Final(digest, ctx); +} + #elif defined(USE_WIN32_CRYPTO) - -#include <wincrypt.h> + +#include <wincrypt.h> #include "curl_memory.h" /* The last #include file should be: */ #include "memdebug.h" - + struct md5_ctx { - HCRYPTPROV hCryptProv; - HCRYPTHASH hHash; + HCRYPTPROV hCryptProv; + HCRYPTHASH hHash; }; typedef struct md5_ctx MD5_CTX; - -static void MD5_Init(MD5_CTX *ctx) -{ + +static void MD5_Init(MD5_CTX *ctx) +{ if(CryptAcquireContext(&ctx->hCryptProv, NULL, NULL, PROV_RSA_FULL, CRYPT_VERIFYCONTEXT | CRYPT_SILENT)) { - CryptCreateHash(ctx->hCryptProv, CALG_MD5, 0, 0, &ctx->hHash); - } -} - -static void MD5_Update(MD5_CTX *ctx, - const unsigned char *input, - unsigned int inputLen) -{ - CryptHashData(ctx->hHash, (unsigned char *)input, inputLen, 0); -} - + CryptCreateHash(ctx->hCryptProv, CALG_MD5, 0, 0, &ctx->hHash); + } +} + +static void MD5_Update(MD5_CTX *ctx, + const unsigned char *input, + unsigned int inputLen) +{ + CryptHashData(ctx->hHash, (unsigned char *)input, inputLen, 0); +} + static void MD5_Final(unsigned char *digest, MD5_CTX *ctx) -{ +{ unsigned long length = 0; - CryptGetHashParam(ctx->hHash, HP_HASHVAL, NULL, &length, 0); - if(length == 16) - CryptGetHashParam(ctx->hHash, HP_HASHVAL, digest, &length, 0); - if(ctx->hHash) - CryptDestroyHash(ctx->hHash); - if(ctx->hCryptProv) - CryptReleaseContext(ctx->hCryptProv, 0); -} - -#else - -/* When no other crypto library is available we use this code segment */ + CryptGetHashParam(ctx->hHash, HP_HASHVAL, NULL, &length, 0); + if(length == 16) + CryptGetHashParam(ctx->hHash, HP_HASHVAL, digest, &length, 0); + if(ctx->hHash) + CryptDestroyHash(ctx->hHash); + if(ctx->hCryptProv) + CryptReleaseContext(ctx->hCryptProv, 0); +} + +#else + +/* When no other crypto library is available we use this code segment */ /* * This is an OpenSSL-compatible implementation of the RSA Data Security, Inc. @@ -253,17 +253,17 @@ static void MD5_Final(unsigned char *digest, MD5_CTX *ctx) * It is meant to be fast, but not as fast as possible. Some known * optimizations are not included to reduce source code size and avoid * compile-time configuration. - */ - + */ + #include <string.h> - + /* The last #include files should be: */ #include "curl_memory.h" #include "memdebug.h" - + /* Any 32-bit or wider unsigned integer data type will do */ typedef unsigned int MD5_u32plus; - + struct md5_ctx { MD5_u32plus lo, hi; MD5_u32plus a, b, c, d; @@ -271,32 +271,32 @@ struct md5_ctx { MD5_u32plus block[16]; }; typedef struct md5_ctx MD5_CTX; - + static void MD5_Init(MD5_CTX *ctx); static void MD5_Update(MD5_CTX *ctx, const void *data, unsigned long size); static void MD5_Final(unsigned char *result, MD5_CTX *ctx); - + /* * The basic MD5 functions. * * F and G are optimized compared to their RFC 1321 definitions for * architectures that lack an AND-NOT instruction, just like in Colin Plumb's * implementation. - */ + */ #define F(x, y, z) ((z) ^ ((x) & ((y) ^ (z)))) #define G(x, y, z) ((y) ^ ((z) & ((x) ^ (y)))) #define H(x, y, z) (((x) ^ (y)) ^ (z)) #define H2(x, y, z) ((x) ^ ((y) ^ (z))) #define I(x, y, z) ((y) ^ ((x) | ~(z))) - + /* * The MD5 transformation for all four rounds. - */ + */ #define STEP(f, a, b, c, d, x, t, s) \ (a) += f((b), (c), (d)) + (x) + (t); \ (a) = (((a) << (s)) | (((a) & 0xffffffff) >> (32 - (s)))); \ (a) += (b); - + /* * SET reads 4 input bytes in little-endian byte order and stores them * in a properly aligned word in host byte order. @@ -304,7 +304,7 @@ static void MD5_Final(unsigned char *result, MD5_CTX *ctx); * The check for little-endian architectures that tolerate unaligned * memory accesses is just an optimization. Nothing will break if it * doesn't work. - */ + */ #if defined(__i386__) || defined(__x86_64__) || defined(__vax__) #define SET(n) \ (*(MD5_u32plus *)(void *)&ptr[(n) * 4]) @@ -320,23 +320,23 @@ static void MD5_Final(unsigned char *result, MD5_CTX *ctx); #define GET(n) \ (ctx->block[(n)]) #endif - + /* * This processes one or more 64-byte data blocks, but does NOT update * the bit counters. There are no alignment requirements. - */ + */ static const void *body(MD5_CTX *ctx, const void *data, unsigned long size) -{ +{ const unsigned char *ptr; MD5_u32plus a, b, c, d; - + ptr = (const unsigned char *)data; - + a = ctx->a; b = ctx->b; c = ctx->c; d = ctx->d; - + do { MD5_u32plus saved_a, saved_b, saved_c, saved_d; @@ -344,7 +344,7 @@ static const void *body(MD5_CTX *ctx, const void *data, unsigned long size) saved_b = b; saved_c = c; saved_d = d; - + /* Round 1 */ STEP(F, a, b, c, d, SET(0), 0xd76aa478, 7) STEP(F, d, a, b, c, SET(1), 0xe8c7b756, 12) @@ -362,7 +362,7 @@ static const void *body(MD5_CTX *ctx, const void *data, unsigned long size) STEP(F, d, a, b, c, SET(13), 0xfd987193, 12) STEP(F, c, d, a, b, SET(14), 0xa679438e, 17) STEP(F, b, c, d, a, SET(15), 0x49b40821, 22) - + /* Round 2 */ STEP(G, a, b, c, d, GET(1), 0xf61e2562, 5) STEP(G, d, a, b, c, GET(6), 0xc040b340, 9) @@ -380,7 +380,7 @@ static const void *body(MD5_CTX *ctx, const void *data, unsigned long size) STEP(G, d, a, b, c, GET(2), 0xfcefa3f8, 9) STEP(G, c, d, a, b, GET(7), 0x676f02d9, 14) STEP(G, b, c, d, a, GET(12), 0x8d2a4c8a, 20) - + /* Round 3 */ STEP(H, a, b, c, d, GET(5), 0xfffa3942, 4) STEP(H2, d, a, b, c, GET(8), 0x8771f681, 11) @@ -398,7 +398,7 @@ static const void *body(MD5_CTX *ctx, const void *data, unsigned long size) STEP(H2, d, a, b, c, GET(12), 0xe6db99e5, 11) STEP(H, c, d, a, b, GET(15), 0x1fa27cf8, 16) STEP(H2, b, c, d, a, GET(2), 0xc4ac5665, 23) - + /* Round 4 */ STEP(I, a, b, c, d, GET(0), 0xf4292244, 6) STEP(I, d, a, b, c, GET(7), 0x432aff97, 10) @@ -416,73 +416,73 @@ static const void *body(MD5_CTX *ctx, const void *data, unsigned long size) STEP(I, d, a, b, c, GET(11), 0xbd3af235, 10) STEP(I, c, d, a, b, GET(2), 0x2ad7d2bb, 15) STEP(I, b, c, d, a, GET(9), 0xeb86d391, 21) - + a += saved_a; b += saved_b; c += saved_c; d += saved_d; - + ptr += 64; } while(size -= 64); - + ctx->a = a; ctx->b = b; ctx->c = c; ctx->d = d; - + return ptr; } - + static void MD5_Init(MD5_CTX *ctx) { ctx->a = 0x67452301; ctx->b = 0xefcdab89; ctx->c = 0x98badcfe; ctx->d = 0x10325476; - + ctx->lo = 0; ctx->hi = 0; -} - +} + static void MD5_Update(MD5_CTX *ctx, const void *data, unsigned long size) -{ +{ MD5_u32plus saved_lo; unsigned long used; - + saved_lo = ctx->lo; ctx->lo = (saved_lo + size) & 0x1fffffff; if(ctx->lo < saved_lo) ctx->hi++; ctx->hi += (MD5_u32plus)size >> 29; - + used = saved_lo & 0x3f; - + if(used) { unsigned long available = 64 - used; - + if(size < available) { memcpy(&ctx->buffer[used], data, size); return; } - + memcpy(&ctx->buffer[used], data, available); data = (const unsigned char *)data + available; size -= available; body(ctx, ctx->buffer, 64); } - + if(size >= 64) { data = body(ctx, data, size & ~(unsigned long)0x3f); size &= 0x3f; } - + memcpy(ctx->buffer, data, size); -} - +} + static void MD5_Final(unsigned char *result, MD5_CTX *ctx) -{ +{ unsigned long used, available; - + used = ctx->lo & 0x3f; ctx->buffer[used++] = 0x80; @@ -494,10 +494,10 @@ static void MD5_Final(unsigned char *result, MD5_CTX *ctx) body(ctx, ctx->buffer, 64); used = 0; available = 64; - } - + } + memset(&ctx->buffer[used], 0, available - 8); - + ctx->lo <<= 3; ctx->buffer[56] = curlx_ultouc((ctx->lo)&0xff); ctx->buffer[57] = curlx_ultouc((ctx->lo >> 8)&0xff); @@ -528,12 +528,12 @@ static void MD5_Final(unsigned char *result, MD5_CTX *ctx) result[15] = curlx_ultouc(ctx->d >> 24); memset(ctx, 0, sizeof(*ctx)); -} - -#endif /* CRYPTO LIBS */ - +} + +#endif /* CRYPTO LIBS */ + const struct HMAC_params Curl_HMAC_MD5[] = { - { + { /* Hash initialization function. */ CURLX_FUNCTION_CAST(HMAC_hinit_func, MD5_Init), /* Hash update function. */ @@ -546,11 +546,11 @@ const struct HMAC_params Curl_HMAC_MD5[] = { 64, /* Result size. */ 16 - } -}; - + } +}; + const struct MD5_params Curl_DIGEST_MD5[] = { - { + { /* Digest initialization function */ CURLX_FUNCTION_CAST(Curl_MD5_init_func, MD5_Init), /* Digest update function */ @@ -561,63 +561,63 @@ const struct MD5_params Curl_DIGEST_MD5[] = { sizeof(MD5_CTX), /* Result size */ 16 - } -}; - + } +}; + /* * @unittest: 1601 */ void Curl_md5it(unsigned char *outbuffer, const unsigned char *input, const size_t len) -{ - MD5_CTX ctx; +{ + MD5_CTX ctx; - MD5_Init(&ctx); + MD5_Init(&ctx); MD5_Update(&ctx, input, curlx_uztoui(len)); - MD5_Final(outbuffer, &ctx); -} - + MD5_Final(outbuffer, &ctx); +} + struct MD5_context *Curl_MD5_init(const struct MD5_params *md5params) -{ +{ struct MD5_context *ctxt; - - /* Create MD5 context */ + + /* Create MD5 context */ ctxt = malloc(sizeof(*ctxt)); - - if(!ctxt) - return ctxt; - - ctxt->md5_hashctx = malloc(md5params->md5_ctxtsize); - - if(!ctxt->md5_hashctx) { - free(ctxt); - return NULL; - } - - ctxt->md5_hash = md5params; - - (*md5params->md5_init_func)(ctxt->md5_hashctx); - - return ctxt; -} - + + if(!ctxt) + return ctxt; + + ctxt->md5_hashctx = malloc(md5params->md5_ctxtsize); + + if(!ctxt->md5_hashctx) { + free(ctxt); + return NULL; + } + + ctxt->md5_hash = md5params; + + (*md5params->md5_init_func)(ctxt->md5_hashctx); + + return ctxt; +} + CURLcode Curl_MD5_update(struct MD5_context *context, const unsigned char *data, unsigned int len) -{ - (*context->md5_hash->md5_update_func)(context->md5_hashctx, data, len); - +{ + (*context->md5_hash->md5_update_func)(context->md5_hashctx, data, len); + return CURLE_OK; -} - +} + CURLcode Curl_MD5_final(struct MD5_context *context, unsigned char *result) -{ - (*context->md5_hash->md5_final_func)(result, context->md5_hashctx); - - free(context->md5_hashctx); - free(context); - +{ + (*context->md5_hash->md5_final_func)(result, context->md5_hashctx); + + free(context->md5_hashctx); + free(context); + return CURLE_OK; -} - -#endif /* CURL_DISABLE_CRYPTO_AUTH */ +} + +#endif /* CURL_DISABLE_CRYPTO_AUTH */ |