lsflib/src/md5sum.c
author Markus Bröker <mbroeker@largo.dyndns.tv>
Sat, 13 Dec 2008 17:57:58 +0100
changeset 6 c3dc3eb3b541
child 9 c3fecc82ade6
permissions -rw-r--r--
a small libtool demo added to the demo distribution committer: Markus Bröker <mbroeker@largo.homelinux.org>

/*
 *  $Id: md5sum.c 94 2008-04-05 01:27:30Z mbroeker $
 * $URL: http://localhost/svn/c/lsflib/trunk/src/md5sum.c $
 *
 */

#include <stdio.h>
#include <string.h>
#include <openssl/evp.h>

#include <lsf.h>

unsigned char *md5sum (char *fname)
{
    EVP_MD_CTX mdctx;
    const EVP_MD *md;
    char line[81];
    unsigned char md_value[EVP_MAX_MD_SIZE];
    int md_len, i;
    FILE *f;
    static unsigned char *value = NULL;

    OpenSSL_add_all_digests ();

    if ((f = fopen (fname, "rb")) == NULL) {
        perror ("FOPEN");
        value = malloc (1);
        value = 0;
        return value;
    }

    if ((md = EVP_get_digestbyname ("md5")) == NULL) {
        value = malloc (1);
        value = 0;
        return value;
    }

    EVP_MD_CTX_init (&mdctx);
    EVP_DigestInit_ex (&mdctx, md, NULL);

    *line = 0;
    while ((i = fread (line, 1, 80, f)) != 0) {
        EVP_DigestUpdate (&mdctx, line, i);
    }

    fclose (f);

    EVP_DigestFinal_ex (&mdctx, md_value, (unsigned int *)&md_len);
    EVP_MD_CTX_cleanup (&mdctx);

    value = malloc (md_len + 1);

    for (i = 0; i < md_len; i++)
        value[i] = md_value[i];
    value[i] = 0;
    return value;
}