#include <stdio.h>
#include <string.h>

#include <openssl/evp.h>

#ifdef DEBUG
#define DBG 1
#else
#define DBG 0
#endif

#define MAX_SIZE_WORD 200

unsigned char *simple_digest(char *algth, char *buffer, unsigned int len, int *olen){

	EVP_MD *m;
	EVP_MD_CTX ctx;
	unsigned char *ret;
	
	OpenSSL_add_all_digests ();
	if (!(m = (EVP_MD*) EVP_get_digestbyname(algth)))
		return NULL;
	
	if (!(ret = (unsigned char *) malloc(EVP_MAX_MD_SIZE)))
		return NULL;
	
	EVP_DigestInit(&ctx, m);
	EVP_DigestUpdate(&ctx, buffer, len);
	EVP_DigestFinal(&ctx, ret, olen);
	
	return ret;
}

void hex_print(unsigned char *buff,int len){
	int i;
	for(i=0;i<len;i++)
		printf("%02x",(unsigned char)(buff[i]&0xFF));	
}

int main(int argc, char **argv){

	unsigned char buff[MAX_SIZE_WORD];
	int olen;
	char *out;
	
	if(!argv[1]) {
	        printf("Usage: mymd5 word\n");
        	exit(1);
	}

	// copy arg string into a buffer
	if (strlen(argv[1]) < MAX_SIZE_WORD ){
	
		strncpy(buff, argv[1], strlen(argv[1]));
		
		// calculate string's md5 hash
		out = simple_digest("md5",buff,strlen(argv[1]),&olen);
		
		// print results	
		if (DBG){
			printf("Word: %s\n",argv[1]);
			printf("Hash: ");
		}
		hex_print(out,olen);
		printf("\n");
		
		return 0;
	}
	
	printf("\nNot computing hash\n");
	printf("\nI can feel your dark side... ;)\n");
	
	return -1;
}