// AuxHash.cpp -- Auxillary Hash class implementation // (c) Copyright Schlumberger Technology Corp., unpublished work, created // 1999. This computer program includes Confidential, Proprietary // Information and is a Trade Secret of Schlumberger Technology Corp. All // use, disclosure, and/or reproduction is prohibited unless authorized // in writing. All Rights Reserved. #include "NoWarning.h" #include "ForceLib.h" #include // for _alloca #include #include #include #include "AuxHash.h" /////////////////////////// HELPER ///////////////////////////////// /////////////////////////// LOCAL VAR ///////////////////////////////// /////////////////////////// PUBLIC ///////////////////////////////// // Types // C'tors/D'tors AuxHash::AuxHash(AuxContext &rauxcontext, ALG_ID ai, HCRYPTKEY hKey) : m_hHash(0) { if (!CryptCreateHash(rauxcontext(), ai, hKey, 0, &m_hHash)) throw scu::OsException(GetLastError()); } AuxHash::~AuxHash() { if (m_hHash) CryptDestroyHash(m_hHash); } // Operators // Operations // Import a hash value into the hash object. void AuxHash::Import(Blob const &rblbHashValue) { if (!CryptSetHashParam(m_hHash, HP_HASHVAL, const_cast(rblbHashValue.data()), 0)) throw scu::OsException(GetLastError()); } // Update the hash value with the data blob. void AuxHash::Update(Blob const &rblob) { if (!CryptHashData(m_hHash, rblob.data(), rblob.length(), 0)) throw scu::OsException(GetLastError()); } // Access ALG_ID AuxHash::AlgId() const { ALG_ID ai; DWORD c = sizeof ai; if (!CryptGetHashParam(m_hHash, HP_ALGID, reinterpret_cast(&ai), &c, 0)) throw scu::OsException(GetLastError()); return ai; } DWORD AuxHash::Size() const { DWORD dwSize; DWORD cSize = sizeof dwSize; if (!CryptGetHashParam(m_hHash, HP_ALGID, reinterpret_cast(&dwSize), &cSize, 0)) throw scu::OsException(GetLastError()); return dwSize; } // Completes the hash returning the hash value. No more hashing can // occur with this object. Blob AuxHash::Value() const { DWORD dwSize = Size(); BYTE *bp = reinterpret_cast(_alloca(dwSize)); if (!CryptGetHashParam(m_hHash, HP_HASHVAL, bp, &dwSize, 0)) throw scu::OsException(GetLastError()); return Blob(bp, dwSize); } // Returns the hash of the data blob passed. No more hashing can // occur with this object. Blob AuxHash::Value(Blob const &rblob) { Update(rblob); return Value(); } // Predicates // Static Variables /////////////////////////// PROTECTED ///////////////////////////////// // C'tors/D'tors // Operators // Operations // Access // Predicates // Static Variables /////////////////////////// PRIVATE ///////////////////////////////// // C'tors/D'tors // Operators // Operations // Access // Predicates // Static Variables