I followed your lead but still can not figure out why its not taking
SHA() as the algorithm. Here is my complete code. Kindly see if you
couls figure something out. 

// Crypto++
#include "/util/crypto++-5.2.1/hex.h"        // HexEncoder
#include "/util/crypto++-5.2.1/sha.h"        // SHA-1, SHA-256, SHA-384,
SHA-512
#include "/util/crypto++-5.2.1/ripemd.h"     // RIPEMD160
#include "/util/crypto++-5.2.1/md5.h"        // MD5
#include "/util/crypto++-5.2.1/crc.h"        // CRC-32
  
// std
#include <iostream>
#include <string>
#include <fstream>
#include <vector>
 
std::fstream fout("hash.txt", std::ios::out | std::ios::app);

void ReadInput(std::vector<std::string>& vecText, unsigned int
nNrPlaintexts)
{
  // delare namespaces in use
  using namespace std;
  using namespace CryptoPP;
 
  char str[200];

  // resize vector so that it references the 0th element
  vecText.resize(0);
     
  // open the input file to read plaintext from
  fstream fin("plaintext.txt", ios::in);

  while (nNrPlaintexts--)
    {
      if(!fin.eof())
        {// while end of file is not reached read each line of data
          fin.getline(str,200);
          vecText.push_back(str);
        }
      else
        {
          cout << "The file does not have sufficient data";
          break;
        }
    }

  // close the file
  fin.close();
} 

void HashDump(CryptoPP::HashTransformation& hash, char const*
szModuleName, std::string const& strData)    
{
  // declare namespaces in use
  using namespace std;
  using namespace CryptoPP;

  string strHash;

  // byte hashOutputBuffer[SHA::DIGESTSIZE];
  // memset(hashOutputBuffer, 0x00, SHA::DIGESTSIZE);

  // Cannot use std::string for buffer;
  // its internal storage might not be contiguous
  SecByteBlock sbbDigest(hash.DigestSize());
 
  // calculate the requisite hash
  hash.CalculateDigest(sbbDigest, (byte const*) strData.data(),
strData.size()); 
 
  // HexEncode the hash and store in a string
  StringSource(sbbDigest.begin(), true, new HexEncoder(new
StringSink(strHash)));
  
  // display the generated hash
  fout << szModuleName << ": " << strHash << endl;
}
  
int main()
{
  // declares namespaces in use
  using namespace std;
  using namespace CryptoPP;
 
  try
  {
    unsigned int nText = 10;
    vector<string> vecText;
  
    // populate vector with the plaintexts
    ReadInput(vecText, nText);
      
    for (unsigned int i=0; i!=nText; ++i)
      {
        cout << "(" << i << ") ";
        cout << vecText[i] << endl;
        
        //  calculate SHA digest
        HashDump(CryptoPP::SHA(), SHA::StaticAlgorithm, vecText[i]);
        
        //calculate 256 bit hash digest
        //HashDump(CryptoPP::SHA256(), "SHA256 ", vecText[i]);
        
        // calculate RIPEMD digest
        //HashDump(CryptoPP::RIPEMD160(), "RIPEMD160 ", vecText[i]);
        
        //  calculate MD5 hash digest
        HashDump(CryptoPP::MD5(), "MD5 ", vecText[i]);
        
        // calculaye CRC digest
        // HashDump(CryptoPP::CRC32(), "CRC32 ", vecText[i]);
      }
  }
  catch (CryptoPP::Exception const& e)
  {// catch CryptoPP exceptions
    cout << "CryptoPP::Exception caught: " << endl
           << e.what() << endl;
   return 1;
  }

  fout.close(); 
  return 0;
}


Quoting Cornel Maftuleac <[EMAIL PROTECTED]>:

> Manik Taneja wrote:
> 
> >I am trying to write a hash program which could 
> >compute the Hash for all the different types -
> >SHA1, SHA256, MD5, ....
> >
> >As such, I wrote the following function that 
> >computes the hash for different algorithms
> >
> >i coded the function as -
> >
> >void HashDump(CryptoPP::HashTransformation& hash, char const*
> Module,
> >std::string const& strData)
> >{
> >....
> >...
> >....
> >...
> >
> >
> >}
> >
> >However, when I call the function as -
> >
> >HashDump(SHA(), "SHA 1", strData);
> >
> >the compiler generates an error saying -
> >
> >could not convert 'SHA()' to 'CryptoPP::HashTransformation&'
> >
> >I really wish to figure out which **interface** to use so that I
> could
> >just pass the requisite arguments and the function computes the
> >appropriate hash for me.
> >  
> >
> I think CryptoPP::HashTransformation is just what you need.
> But are you sure that compiler knows what is SHA()?
> Maybe you should write CryptoPP::SHA?
> A little hint: you can replace the second hard-coded parameter by 
> CryptoPP::SHA::StaticAlgorithmName(), this way you'll get the
> algorithm 
> name from cryptopp inside.  ;)
> Also you can make a template function that will do the similar job,
> like 
> this:
> 
> template<class HASH>
> void HashDump(std::string const& strData)
> {
>       //get the algorithm name like this:
>       char* alg = HASH::StaticAlgorithmName();
> }
> 
> >=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
> >Manik Taneja
> >University at Buffalo
> >mtaneja [at] buffalo [dot] edu
> >
> >
> >
> >  
> >
> 
> 
> 



=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
Manik Taneja
University at Buffalo
mtaneja [at] buffalo [dot] edu

Reply via email to