123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476 |
- #include "Randomizer.h"
- #include <Files.h>
- #include <Folders.h>
- #include <Events.h>
- #include <Processes.h>
- #include <Gestalt.h>
- #include <Resources.h>
- #include <LowMem.h>
- #include <stdlib.h>
- #include <math.h>
- extern "C" void RAND_add (const void *buf, int num, double entropy);
- unsigned long GetPPCTimer (bool is601);
-
- #define kMouseResolution 6
-
-
- #define kMousePositionEntropy 5.16
- #define kTypicalMouseIdleTicks 300.0
-
-
- #define kVolumeBytesEntropy 12.0
-
-
-
- #define kApplicationUpTimeEntropy 6.0
-
- #define kSysStartupEntropy 7.0
-
- CRandomizer::CRandomizer (void)
- {
- long result;
-
- mSupportsLargeVolumes =
- (Gestalt(gestaltFSAttr, &result) == noErr) &&
- ((result & (1L << gestaltFSSupports2TBVols)) != 0);
-
- if (Gestalt (gestaltNativeCPUtype, &result) != noErr)
- {
- mIsPowerPC = false;
- mIs601 = false;
- }
- else
- {
- mIs601 = (result == gestaltCPU601);
- mIsPowerPC = (result >= gestaltCPU601);
- }
- mLastMouse.h = mLastMouse.v = -10;
-
- mLastPeriodicTicks = TickCount();
- GetTimeBaseResolution ();
-
-
- AddTimeSinceMachineStartup ();
- AddAbsoluteSystemStartupTime ();
- AddStartupVolumeInfo ();
- AddFiller ();
- }
- void CRandomizer::PeriodicAction (void)
- {
- AddCurrentMouse ();
- AddNow (0.0);
- mLastPeriodicTicks = TickCount();
- }
- void CRandomizer::AddCurrentMouse (void)
- {
- Point mouseLoc;
- unsigned long lastCheck;
-
- #if TARGET_API_MAC_CARBON
- GetGlobalMouse (&mouseLoc);
- #else
- mouseLoc = LMGetMouseLocation();
- #endif
-
- if (labs (mLastMouse.h - mouseLoc.h) > kMouseResolution/2 &&
- labs (mLastMouse.v - mouseLoc.v) > kMouseResolution/2)
- AddBytes (&mouseLoc, sizeof (mouseLoc),
- kMousePositionEntropy);
-
- if (mLastMouse.h == mouseLoc.h && mLastMouse.v == mouseLoc.v)
- mMouseStill ++;
- else
- {
- double entropy;
-
-
-
-
- lastCheck = TickCount() - mLastPeriodicTicks;
- if (lastCheck <= 0)
- lastCheck = 1;
- entropy = log2l
- (kTypicalMouseIdleTicks/(double)lastCheck);
- if (entropy < 0.0)
- entropy = 0.0;
- AddBytes (&mMouseStill, sizeof (mMouseStill), entropy);
- mMouseStill = 0;
- }
- mLastMouse = mouseLoc;
- }
- void CRandomizer::AddAbsoluteSystemStartupTime (void)
- {
- unsigned long now;
-
- GetDateTime (&now);
- now -= TickCount() / 60;
-
- AddBytes (&now, sizeof (now), kSysStartupEntropy);
- }
- void CRandomizer::AddTimeSinceMachineStartup (void)
- {
- AddNow (1.5);
-
-
- }
- void CRandomizer::AddAppRunningTime (void)
- {
- ProcessSerialNumber PSN;
- ProcessInfoRec ProcessInfo;
-
- ProcessInfo.processInfoLength = sizeof (ProcessInfoRec);
- ProcessInfo.processName = nil;
- ProcessInfo.processAppSpec = nil;
-
- GetCurrentProcess (&PSN);
- GetProcessInformation (&PSN, &ProcessInfo);
-
-
- AddBytes (&ProcessInfo, sizeof (ProcessInfoRec),
- kApplicationUpTimeEntropy);
- }
- void CRandomizer::AddStartupVolumeInfo (void)
- {
- short vRefNum;
- long dirID;
- XVolumeParam pb;
- OSErr err;
-
- if (!mSupportsLargeVolumes)
- return;
-
- FindFolder (kOnSystemDisk, kSystemFolderType, kDontCreateFolder,
- &vRefNum, &dirID);
- pb.ioVRefNum = vRefNum;
- pb.ioCompletion = 0;
- pb.ioNamePtr = 0;
- pb.ioVolIndex = 0;
- err = PBXGetVolInfoSync (&pb);
- if (err != noErr)
- return;
-
-
-
-
-
- AddBytes (&pb, sizeof (pb),
- kVolumeBytesEntropy +
- log2l (((pb.ioVTotalBytes.hi - pb.ioVFreeBytes.hi)
- * 4294967296.0D +
- (pb.ioVTotalBytes.lo - pb.ioVFreeBytes.lo))
- / pb.ioVAlBlkSiz - 3.0));
- }
- void CRandomizer::AddFiller (void)
- {
- struct
- {
- ProcessSerialNumber psn;
-
- RGBColor hiliteRGBValue;
-
- long processCount;
-
- long cpuSpeed;
- long totalMemory;
-
- long systemVersion;
- short resFile;
- } data;
-
- GetNextProcess ((ProcessSerialNumber*) kNoProcess);
- while (GetNextProcess (&data.psn) == noErr)
- data.processCount++;
- GetFrontProcess (&data.psn);
- LMGetHiliteRGB (&data.hiliteRGBValue);
- Gestalt (gestaltProcClkSpeed, &data.cpuSpeed);
- Gestalt (gestaltLogicalRAMSize, &data.totalMemory);
- Gestalt (gestaltSystemVersion, &data.systemVersion);
- data.resFile = CurResFile ();
-
-
-
-
-
-
-
- AddBytes (&data, sizeof(data), 8.0 * sizeof(data));
- AddCurrentMouse ();
- AddNow (1.0);
- }
- void CRandomizer::AddBytes (void *data, long size, double entropy)
- {
- RAND_add (data, size, entropy * 0.125);
-
- }
- void CRandomizer::AddNow (double millisecondUncertainty)
- {
- long time = SysTimer();
- AddBytes (&time, sizeof (time), log2l (millisecondUncertainty *
- mTimebaseTicksPerMillisec));
- }
- void CRandomizer::GetTimeBaseResolution (void)
- {
- #ifdef __powerc
- long speed;
-
-
- if (Gestalt (gestaltProcClkSpeed, &speed) != noErr)
-
-
- mTimebaseTicksPerMillisec = 6000.0D;
-
-
- mTimebaseTicksPerMillisec = speed / 1.0e4D;
- #else
-
- mTimebaseTicksPerMillisec = 783.360D;
- #endif
- }
- unsigned long CRandomizer::SysTimer (void)
-
- {
- #ifdef __powerc
- return GetPPCTimer (mIs601);
- #else
- UnsignedWide usec;
- Microseconds (&usec);
- return usec.lo;
- #endif
- }
- #ifdef __powerc
- asm unsigned long GetPPCTimer (register bool is601)
- {
- cmplwi is601, 0
- bne _601
- mftb r3
- blr
- _601:
- mfspr r3, spr5
-
- }
- #endif
|