APR_REMOVEFROM(SWITCH_AM_CXXFLAGS, -std=c99)
+# check for usable system MD5 library
+AS_CASE([$host],
+ [*-solaris2*], [AC_CHECK_LIB(md5, MD5Init)],
+ [*-freebsd*], [AC_CHECK_LIB(md, MD5Init)],
+ [*-openbsd*|*-netbsd*], [AC_CHECK_FUNCS([MD5Init])])
+
AC_CHECK_LIB(z, inflateReset, have_libz=yes, AC_MSG_ERROR([no usable zlib; please install zlib devel package or equivalent]))
if test "x$have_libz" = "xyes" ; then
APR_ADDTO([PLATFORM_CORE_LIBS], [-lz])
{
int indexnum;
const char *cur;
- su_md5_t ctx;
- char uridigest[2 * SU_MD5_DIGEST_SIZE + 1];
- char bigdigest[2 * SU_MD5_DIGEST_SIZE + 1];
+ char uridigest[SWITCH_MD5_DIGEST_STRING_SIZE];
+ char bigdigest[SWITCH_MD5_DIGEST_STRING_SIZE];
char *username, *realm, *nonce, *uri, *qop, *cnonce, *nc, *response, *input = NULL, *input2 = NULL;
auth_res_t ret = AUTH_FORBIDDEN;
int first = 0;
char *sql;
char *number_alias = NULL;
switch_xml_t user = NULL, param, uparams;
- char hexdigest[2 * SU_MD5_DIGEST_SIZE + 1] = "";
+ char hexdigest[SWITCH_MD5_DIGEST_STRING_SIZE] = "";
char *domain_name = NULL;
switch_event_t *params = NULL;
const char *auth_acl = NULL;
if (!a1_hash) {
input = switch_mprintf("%s:%s:%s", username, realm, passwd);
- su_md5_init(&ctx);
- su_md5_strupdate(&ctx, input);
- su_md5_hexdigest(&ctx, hexdigest);
- su_md5_deinit(&ctx);
+ switch_md5_string(hexdigest, (void *) input, strlen(input));
switch_safe_free(input);
a1_hash = hexdigest;
for_the_sake_of_interop:
if ((input = switch_mprintf("%s:%q", regstr, uri))) {
- su_md5_init(&ctx);
- su_md5_strupdate(&ctx, input);
- su_md5_hexdigest(&ctx, uridigest);
- su_md5_deinit(&ctx);
+ switch_md5_string(uridigest, (void *) input, strlen(input));
}
if (nc && cnonce && qop) {
}
if (input2) {
- memset(&ctx, 0, sizeof(ctx));
- su_md5_init(&ctx);
- su_md5_strupdate(&ctx, input2);
- su_md5_hexdigest(&ctx, bigdigest);
- su_md5_deinit(&ctx);
+ switch_md5_string(bigdigest, (void *) input2, strlen(input2));
}
if (input2 && !strcasecmp(bigdigest, response)) {
/* apr-util headers */
#include <apr_queue.h>
#include <apr_uuid.h>
+#if (defined(HAVE_LIBMD5) || defined(HAVE_LIBMD) || defined(HAVE_MD5INIT))
+#include <md5.h>
+#elif defined(HAVE_LIBCRYPTO)
+#include <openssl/md5.h>
+#else
#include <apr_md5.h>
+#endif
/* apr stubs */
SWITCH_DECLARE(switch_status_t) switch_md5(unsigned char digest[SWITCH_MD5_DIGESTSIZE], const void *input, switch_size_t inputLen)
{
+#if (defined(HAVE_LIBMD5) || defined(HAVE_LIBMD) || defined(HAVE_MD5INIT))
+ MD5_CTX md5_context;
+
+ MD5Init(&md5_context);
+ MD5Update(&md5_context, input, inputLen);
+ MD5Final(digest, &md5_context);
+
+ return SWITCH_STATUS_SUCCESS;
+#elif defined(HAVE_LIBCRYPTO)
+ MD5_CTX md5_context;
+
+ MD5_Init(&md5_context);
+ MD5_Update(&md5_context, input, inputLen);
+ MD5_Final(digest, &md5_context);
+
+ return SWITCH_STATUS_SUCCESS;
+#else
return apr_md5(digest, input, inputLen);
+#endif
}
SWITCH_DECLARE(switch_status_t) switch_md5_string(char digest_str[SWITCH_MD5_DIGEST_STRING_SIZE], const void *input, switch_size_t inputLen)
{
unsigned char digest[SWITCH_MD5_DIGESTSIZE];
- apr_status_t status = apr_md5(digest, input, inputLen);
- int x;
+ switch_status_t status = switch_md5(digest, input, inputLen);
+ short i, x;
+ uint8_t b;
digest_str[SWITCH_MD5_DIGEST_STRING_SIZE - 1] = '\0';
- for (x = 0; x < SWITCH_MD5_DIGESTSIZE; x++) {
- switch_snprintf(digest_str + (x * 2), 3, "%02x", digest[x]);
+ for (x = i = 0; x < SWITCH_MD5_DIGESTSIZE; x++) {
+ b = (digest[x] >> 4) & 15;
+ digest_str[i++] = b + (b > 9 ? 'a' - 10 : '0');
+ b = digest[x] & 15;
+ digest_str[i++] = b + (b > 9 ? 'a' - 10 : '0');
}
+ digest_str[i] = '\0';
return status;
}