digest.cpp
00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023 #include <interfaces/generator/digest.h>
00024 #include <interfaces/generator/exceptions.h>
00025
00026 #include <cstdio>
00027 #include <openssl/evp.h>
00028
00029 #define FILE_STEP 1024
00030
00031 using namespace fawkes;
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043 InterfaceDigest::InterfaceDigest(std::string config_filename)
00044 {
00045 digest = NULL;
00046
00047 EVP_MD_CTX ctx;
00048 if ( ! EVP_DigestInit(&ctx, EVP_md5())) {
00049 throw Exception("Could not initialize digest context");
00050 }
00051
00052 FILE *f = fopen(config_filename.c_str(), "r");
00053 void *buf = malloc(FILE_STEP);
00054 while ( ! feof(f) && ! ferror(f) ) {
00055 size_t rb;
00056 if ((rb = fread(buf, 1, FILE_STEP, f)) > 0) {
00057 if ( ! EVP_DigestUpdate(&ctx, buf, rb) ) {
00058 fclose(f);
00059 throw Exception("Failed to update digest");
00060 }
00061 }
00062 }
00063 if ( ferror(f) ) {
00064 fclose(f);
00065 throw Exception("Failure while reading the file");
00066 }
00067 fclose(f);
00068
00069 digest_size=EVP_MD_CTX_size(&ctx);
00070 digest = new unsigned char[digest_size];
00071
00072 if ( ! EVP_DigestFinal(&ctx, digest, NULL) ) {
00073 delete digest;
00074 digest = NULL;
00075 throw Exception("Could not finalize digest");
00076 }
00077 }
00078
00079
00080
00081 InterfaceDigest::~InterfaceDigest()
00082 {
00083 delete digest;
00084 }
00085
00086
00087
00088
00089
00090 const unsigned char *
00091 InterfaceDigest::get_hash()
00092 {
00093 return digest;
00094 }
00095
00096
00097
00098
00099
00100 size_t
00101 InterfaceDigest::get_hash_size()
00102 {
00103 return digest_size;
00104 }