diff options
author | Sergei Golubchik <serg@mariadb.org> | 2014-09-26 20:03:20 +0200 |
---|---|---|
committer | Sergei Golubchik <serg@mariadb.org> | 2014-10-01 23:38:28 +0200 |
commit | d6141a553c566b3c8f997ae811dd4c00d9019613 (patch) | |
tree | 7c2665d2864172a6f15a284d5f752407a0ce90fb /mysys_ssl | |
parent | 11b6452a0f2f0f99bbd7c2767ebca7d043a2f43c (diff) | |
download | mariadb-git-d6141a553c566b3c8f997ae811dd4c00d9019613.tar.gz |
MD5 service
Diffstat (limited to 'mysys_ssl')
-rw-r--r-- | mysys_ssl/my_md5.cc | 124 |
1 files changed, 102 insertions, 22 deletions
diff --git a/mysys_ssl/my_md5.cc b/mysys_ssl/my_md5.cc index 4c14366a4e3..697655244eb 100644 --- a/mysys_ssl/my_md5.cc +++ b/mysys_ssl/my_md5.cc @@ -1,4 +1,5 @@ -/* Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved. +/* Copyright (c) 2012, Oracle and/or its affiliates. + Copyright (c) 2014, SkySQL Ab. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -24,45 +25,124 @@ #include <my_global.h> #include <my_md5.h> +#include <stdarg.h> #if defined(HAVE_YASSL) -#include "my_config.h" #include "md5.hpp" -static void my_md5_hash(char *digest, const char *buf, int len) +typedef TaoCrypt::MD5 MD5_CTX; + +static void md5_init(MD5_CTX *context) +{ + context->Init(); +} + +/* + this is a variant of md5_init to be used in this file only. + does nothing for yassl, because the context's constructor was called automatically. +*/ +static void md5_init_fast(MD5_CTX *context) +{ +} + +static void md5_input(MD5_CTX *context, const uchar *buf, unsigned len) +{ + context->Update((const TaoCrypt::byte *) buf, len); +} + +static void md5_result(MD5_CTX *context, uchar digest[MD5_HASH_SIZE]) { - TaoCrypt::MD5 hasher; - hasher.Update((TaoCrypt::byte *) buf, len); - hasher.Final((TaoCrypt::byte *) digest); + context->Final((TaoCrypt::byte *) digest); } #elif defined(HAVE_OPENSSL) #include <openssl/md5.h> -static void my_md5_hash(unsigned char* digest, unsigned const char *buf, int len) +static void md5_init(MD5_CTX *context) +{ + MD5_Init(context); +} + +static void md5_init_fast(MD5_CTX *context) +{ + md5_init(context); +} + +static void md5_input(MD5_CTX *context, const uchar *buf, unsigned len) +{ + MD5_Update(context, buf, len); +} + +static void md5_result(MD5_CTX *context, uchar digest[MD5_HASH_SIZE]) { - MD5_CTX ctx; - MD5_Init (&ctx); - MD5_Update (&ctx, buf, len); - MD5_Final (digest, &ctx); + MD5_Final(digest, context); } #endif /* HAVE_YASSL */ /** - Wrapper function to compute MD5 message digest. + Wrapper function to compute MD5 message digest. - @param digest [out] Computed MD5 digest - @param buf [in] Message to be computed - @param len [in] Length of the message + @param digest [out] Computed MD5 digest + @param buf [in] Message to be computed + @param len [in] Length of the message - @return void + @return void */ -void compute_md5_hash(char *digest, const char *buf, int len) +void my_md5(uchar *digest, const char *buf, size_t len) { -#if defined(HAVE_YASSL) - my_md5_hash(digest, buf, len); -#elif defined(HAVE_OPENSSL) - my_md5_hash((unsigned char*)digest, (unsigned const char*)buf, len); -#endif /* HAVE_YASSL */ + MD5_CTX md5_context; + + md5_init_fast(&md5_context); + md5_input(&md5_context, (const uchar *)buf, len); + md5_result(&md5_context, digest); +} + + +/** + Wrapper function to compute MD5 message digest for + two messages in order to emulate md5(msg1, msg2). + + @param digest [out] Computed MD5 digest + @param buf1 [in] First message + @param len1 [in] Length of first message + @param buf2 [in] Second message + @param len2 [in] Length of second message + + @return void +*/ +void my_md5_multi(uchar *digest, ...) +{ + va_list args; + va_start(args, digest); + + MD5_CTX md5_context; + const uchar *str; + + md5_init_fast(&md5_context); + for (str= va_arg(args, const uchar*); str; str= va_arg(args, const uchar*)) + md5_input(&md5_context, str, va_arg(args, size_t)); + + md5_result(&md5_context, digest); + va_end(args); +} + +size_t my_md5_context_size() +{ + return sizeof(MD5_CTX); +} + +void my_md5_init(void *context) +{ + md5_init((MD5_CTX *)context); +} + +void my_md5_input(void *context, const uchar *buf, size_t len) +{ + md5_input((MD5_CTX *)context, buf, len); +} + +void my_md5_result(void *context, uchar *digest) +{ + md5_result((MD5_CTX *)context, digest); } |