16 #include <openssl/evp.h>
17 #include <openssl/conf.h>
18 #include <openssl/engine.h>
25 #ifdef DIGEST_TESTSUITE
47 {
static std::string _type(
"md5" );
return _type; }
50 {
static std::string _type(
"sha1" );
return _type; }
53 {
static std::string _type(
"sha224" );
return _type; }
56 {
static std::string _type(
"sha256" );
return _type; }
59 {
static std::string _type(
"sha384" );
return _type; }
62 {
static std::string _type(
"sha512" );
return _type; }
107 if(!openssl_digests_added)
109 OPENSSL_config(NULL);
110 ENGINE_load_builtin_engines();
111 ENGINE_register_all_complete();
112 OpenSSL_add_all_digests();
113 openssl_digests_added =
true;
118 md = EVP_get_digestbyname(
name.c_str());
122 #if OPENSSL_VERSION_NUMBER < 0x10100000L
123 EvpDataPtr tmp_mdctx(EVP_MD_CTX_create(), EVP_MD_CTX_destroy);
125 EvpDataPtr tmp_mdctx(EVP_MD_CTX_new(), EVP_MD_CTX_free);
130 if (!EVP_DigestInit_ex(tmp_mdctx.get(), md, NULL)) {
135 ::memset(md_value, 0,
sizeof(md_value));
137 mdctx.swap(tmp_mdctx);
159 if(
name.empty())
return false;
197 return std::string();
199 std::vector<char> resData ( vec.size()*2 + 1,
'\0' );
200 char *mdtxt = &resData[0];
201 for(
unsigned i = 0; i < vec.size(); ++i)
203 ::snprintf( mdtxt+(i*2), 3,
"%02hhx", vec[i]);
205 return std::string( resData.data() );
210 std::vector<unsigned char> r;
221 for(
unsigned i = 0; i <
_dp->
md_len; ++i)
243 if(!EVP_DigestUpdate(
_dp->
mdctx.get(),
reinterpret_cast<const unsigned char*
>(bytes), len))
259 is.read(buf, bufsize);
260 readed = is.gcount();
261 if(readed && !
update(buf, readed))
268 std::string
Digest::digest(
const std::string& name, std::istream& is,
size_t bufsize)
270 if(
name.empty() || !is)
271 return std::string();
275 return std::string();
277 if ( !
digest.update( is, bufsize ))
278 return std::string();
283 std::string
Digest::digest(
const std::string & name,
const std::string & input,
size_t bufsize )
285 std::istringstream is( input );
289 #ifdef DIGEST_TESTSUITE
290 int main(
int argc,
char *argv[])
292 bool openssl =
false;
295 if(argc > 1 && std::string(argv[argpos]) ==
"--openssl")
301 if(argc - argpos < 2)
303 cerr <<
"Usage: " << argv[0] <<
" <DIGESTNAME> <FILE>" << endl;
307 const char* digestname = argv[argpos++];
308 const char* fn = argv[argpos++];
310 std::ifstream file(fn);
315 cout << digestname <<
"(" << fn <<
")= " << digest << endl;
317 cout << digest <<
" " << fn << endl;