engine/crypt/cryptMGF.cc
2024-01-07 04:36:33 +00:00

45 lines
1.3 KiB
C++

//-----------------------------------------------------------------------------
// V12 Engine
//
// Copyright (c) 2001 GarageGames.Com
// Portions Copyright (c) 2001 by Sierra Online, Inc.
//-----------------------------------------------------------------------------
#include "crypt/cryptMGF.h"
#include "crypt/cryptSHA1.h"
bool MGF1(const U8* seed, const U32 seedLen,
U8* mask, const U32 maskLen)
{
AssertFatal(seed != NULL, "Error, no seed!");
AssertFatal(mask != NULL && maskLen != 0, "No mask pointer or maskLen == 0");
U32 upper = (maskLen + SHA1Context::csmHashLenBytes - 1) / SHA1Context::csmHashLenBytes;
U8* maskBuffer = new U8[upper * SHA1Context::csmHashLenBytes];
U8* catBuffer = new U8[seedLen + 4];
dMemcpy(catBuffer, seed, seedLen);
SHA1Context hashContext;
for (U32 i = 0; i < upper; i++) {
catBuffer[seedLen + 0] = (i >> 24) & 0xFF;
catBuffer[seedLen + 1] = (i >> 16) & 0xFF;
catBuffer[seedLen + 2] = (i >> 8) & 0xFF;
catBuffer[seedLen + 3] = (i >> 0) & 0xFF;
hashContext.init();
hashContext.hashBytes(catBuffer, seedLen + 4);
hashContext.finalize();
hashContext.getHash(maskBuffer + (SHA1Context::csmHashLenBytes * i));
}
dMemcpy(mask, maskBuffer, maskLen);
delete [] catBuffer;
delete [] maskBuffer;
return true;
}