#include "md5.h"
#include <strings.h>
#include <stdio.h>

unsigned char* 
hex_16(const unsigned char* from, char* to)
{
    static char *hexdigits = "0123456789abcdef";
    const unsigned char *end = from + 16;
    char *d = to;

    while (from < end) {
	*d++ = hexdigits[(*from >> 4)];
	*d++ = hexdigits[(*from & 0x0F)];
	from++;
    }
    *d = '\0';
    return to;
}

unsigned char* 
base64_16(const unsigned char* from, char* to)
{
    static char* base64 =
	"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
    const unsigned char *end = from + 16;
    unsigned char c1, c2, c3;
    char *d = to;

    while (1) {
	c1 = *from++;
	*d++ = base64[c1>>2];
	if (from == end) {
	    *d++ = base64[(c1 & 0x3) << 4];
	    break;
	}
	c2 = *from++;
	c3 = *from++;
	*d++ = base64[((c1 & 0x3) << 4) | ((c2 & 0xF0) >> 4)];
	*d++ = base64[((c2 & 0xF) << 2) | ((c3 & 0xC0) >>6)];
	*d++ = base64[c3 & 0x3F];
    }
    *d = '\0';
    return to;
}

unsigned char* 
digest(const unsigned char *str, int len, unsigned char *digest)
{
    unsigned char digeststr[16];
    MD5_CTX ctx;

    MD5Init(&ctx);
    MD5Update(&ctx, str, len);
    MD5Final(digeststr, &ctx);
    
    memcpy(digest, digeststr, 16);
    
    return digest;
}

unsigned char *crc_calc (const unsigned char* src, unsigned char *dest)
{
 	unsigned char buffer [1024];

	unsigned int k;

	char *p;	

	k = strlen (src);

	p = digest (src,k,buffer);

	base64_16(p,dest);

	return (dest);
};

