Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

In which library is the MD5() function?

Tags:

openssl

md5

As I'm writing code to install on a target machine, I was wondering about the dependencies and noticed that there were no openssl library needed. I wondered because I know I am using OpenSSL:

#include <openssl/md5.h>

...
MD5(a, b, c);
...

To my surprise, it seems that we only get linked against libc. Is MD5 really implemented in libc and not in some libssl library?


objdump gives me the info about the linked library:

Dynamic Section:
  NEEDED               libQtCore.so.4
  NEEDED               libstdc++.so.6
  NEEDED               libgcc_s.so.1
  NEEDED               libc.so.6
  SONAME               libcontent.so

As suggested by noloader I tried with ldd and still fail to see a library that would make sense for MD5. libcontent.so is directly using MD5()...

ldd ../BUILD/snapwebsites/plugins/content/libcontent.so 
    linux-vdso.so.1 =>  (0x00007fff4f3ff000)
    libQtCore.so.4 => /usr/lib/x86_64-linux-gnu/libQtCore.so.4 (0x00007ff37ad0f000)
    libstdc++.so.6 => /usr/lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007ff37aa0c000)
    libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007ff37a7f5000)
    libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007ff37a42c000)
    libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007ff37a20f000)
    libz.so.1 => /lib/x86_64-linux-gnu/libz.so.1 (0x00007ff379ff7000)
    libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007ff379df3000)
    libglib-2.0.so.0 => /lib/x86_64-linux-gnu/libglib-2.0.so.0 (0x00007ff379af7000)
    librt.so.1 => /lib/x86_64-linux-gnu/librt.so.1 (0x00007ff3798ee000)
    libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007ff3795e9000)
    /lib64/ld-linux-x86-64.so.2 (0x00007ff37b5e5000)
    libpcre.so.3 => /lib/x86_64-linux-gnu/libpcre.so.3 (0x00007ff3793a9000)

Also, just to make sure, I tried nm on that content library and I can see the MD5 entry:

                 w _ITM_registerTMCloneTable
00000000003c9468 d __JCR_END__
00000000003c9468 d __JCR_LIST__
                 w _Jv_RegisterClasses
                 U MD5                       <---- it's here...
                 U memcmp@@GLIBC_2.2.5
                 w pthread_cancel
                 U pthread_mutex_destroy@@GLIBC_2.2.5
like image 731
Alexis Wilke Avatar asked Feb 21 '14 23:02

Alexis Wilke


People also ask

What is MD5 () function?

The MD5 (message-digest algorithm) hashing algorithm is a one-way cryptographic function that accepts a message of any length as input and returns as output a fixed-length digest value to be used for authenticating the original message.

How do I use MD5 in Java?

Call MessageDigest. getInstance("MD5") to get a MD5 instance of MessageDigest you can use. The compute the hash by doing one of: Feed the entire input as a byte[] and calculate the hash in one operation with md.

What is MD5 in node JS?

MD5 stands for message digest 5 is a widely used hash function which produces 128-bit hashes. We are generating a simple hash using md5 hashing algorithm of node.js. Code. //md5-hash.js //Loading the crypto module in node.js var crypto = require('crypto'); //creating hash object var hash = crypto.


Video Answer


1 Answers

In which library is the MD5() function?

The OpenSSL library. Link to libcrypto. See md5(3).


Is MD5 really implemented in libc and not in some libssl library?

Well, its not in Ubuntu's libc:

$ nm -D  /lib/x86_64-linux-gnu/libc.so.6 | grep -i md5
$

And it is in OpenSSL's libcrypto:

$ nm -D /usr/lib/x86_64-linux-gnu/libcrypto.so | grep MD5
0000000000066840 T MD5
0000000000066640 T MD5_Final
0000000000066790 T MD5_Init
0000000000066630 T MD5_Transform
0000000000066420 T MD5_Update

The T means the symbol (MD5) is defined in the TEXT section and its exported. A t means the symbol is defined in the TEXT section, but its not exported so you cannot link against it (think GCC's visibility=private or a static declaration).

If you get a U, then that means the symbol is required but undefined and a library will have to provide it.


#include <openssl/md5.h>

...
MD5(a, b, c, d);

MD5(a, b, c, d); is not OpenSSL's MD5. OpenSSL's MD5 has three parameters, not four.


objdump gives me the info about the linked library

ldd might give you different results. Its what I use to check dependencies (and I don't use objdump):

$ cat t.c
#include <openssl/md5.h>

int main(int argc, char* argv[])
{
    const char password[] = "password";
    char hash[MD5_DIGEST_LENGTH];    
    MD5(password, sizeof(password), hash);

    return 0;
}

$ gcc t.c -o t.exe -lcrypto
$ ldd t.exe 
    linux-vdso.so.1 =>  (0x00007fff435ff000)
    libcrypto.so.1.0.0 => /usr/lib/x86_64-linux-gnu/libcrypto.so.1.0.0 (0x00007fbaff01b000)
    libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fbafec90000)
    libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007fbafea8b000)
    libz.so.1 => /lib/x86_64-linux-gnu/libz.so.1 (0x00007fbafe874000)
    /lib64/ld-linux-x86-64.so.2 (0x00007fbaff429000)

And t.exe's unresolved symbol:

$ nm t.exe | grep MD5
    U MD5@@OPENSSL_1.0.0
like image 134
jww Avatar answered Oct 17 '22 00:10

jww