#include #include #include #include #define MAXBUF 1024 int main(int argc, char **argv){ unsigned char secret[] = "this_is_my_secret"; if(argc != 2){ fprintf(stderr,"Invalid parameters. Usage: %s filename\n",argv[0]); exit(1); } FILE *f_in; if((f_in = fopen(argv[1],"r")) == NULL) { fprintf(stderr,"Couldn't open the input file, try again\n"); exit(1); } //EVP_MD_CTX *EVP_MD_CTX_new(void); EVP_MD_CTX *md = EVP_MD_CTX_new(); //int EVP_DigestInit(EVP_MD_CTX *ctx, const EVP_MD *type); // int EVP_DigestInit_ex(EVP_MD_CTX *ctx, const EVP_MD *type, ENGINE *impl); EVP_DigestInit(md, EVP_sha512()); int n; unsigned char buffer[MAXBUF]; EVP_DigestUpdate(md, secret, strlen(secret)); while((n = fread(buffer,1,MAXBUF,f_in)) > 0){ EVP_DigestUpdate(md, buffer, n); } EVP_DigestUpdate(md, secret, strlen(secret)); unsigned char md_value[EVP_MD_size(EVP_sha512())]; int md_len; //int EVP_DigestFinal_ex(EVP_MD_CTX *ctx, unsigned char *md, unsigned int *s); EVP_DigestFinal_ex(md, md_value, &md_len); // void EVP_MD_CTX_free(EVP_MD_CTX *ctx); EVP_MD_CTX_free(md); printf("The digest is: "); for(int i = 0; i < md_len; i++) printf("%02x", md_value[i]); printf("\n"); return 0; }