mac_rand.c
上传用户:lyxiangda
上传日期:2007-01-12
资源大小:3042k
文件大小:7k
源码类别:

CA认证

开发平台:

WINDOWS

  1. /*
  2.  * The contents of this file are subject to the Mozilla Public
  3.  * License Version 1.1 (the "License"); you may not use this file
  4.  * except in compliance with the License. You may obtain a copy of
  5.  * the License at http://www.mozilla.org/MPL/
  6.  * 
  7.  * Software distributed under the License is distributed on an "AS
  8.  * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
  9.  * implied. See the License for the specific language governing
  10.  * rights and limitations under the License.
  11.  * 
  12.  * The Original Code is the Netscape security libraries.
  13.  * 
  14.  * The Initial Developer of the Original Code is Netscape
  15.  * Communications Corporation.  Portions created by Netscape are 
  16.  * Copyright (C) 1994-2000 Netscape Communications Corporation.  All
  17.  * Rights Reserved.
  18.  * 
  19.  * Contributor(s):
  20.  * 
  21.  * Alternatively, the contents of this file may be used under the
  22.  * terms of the GNU General Public License Version 2 or later (the
  23.  * "GPL"), in which case the provisions of the GPL are applicable 
  24.  * instead of those above.  If you wish to allow use of your 
  25.  * version of this file only under the terms of the GPL and not to
  26.  * allow others to use your version of this file under the MPL,
  27.  * indicate your decision by deleting the provisions above and
  28.  * replace them with the notice and other provisions required by
  29.  * the GPL.  If you do not delete the provisions above, a recipient
  30.  * may use your version of this file under either the MPL or the
  31.  * GPL.
  32.  */
  33. #ifdef notdef
  34. #include "xp_core.h"
  35. #include "xp_file.h"
  36. #endif
  37. #include "secrng.h"
  38. #include "mcom_db.h"
  39. #ifdef XP_MAC
  40. #include <Events.h>
  41. #include <OSUtils.h>
  42. #include <QDOffscreen.h>
  43. #include <PPCToolbox.h>
  44. #include <Processes.h>
  45. #include <LowMem.h>
  46. /* Static prototypes */
  47. static size_t CopyLowBits(void *dst, size_t dstlen, void *src, size_t srclen);
  48. void FE_ReadScreen();
  49. static size_t CopyLowBits(void *dst, size_t dstlen, void *src, size_t srclen)
  50. {
  51.     union endianness {
  52.         int32 i;
  53.         char c[4];
  54.     } u;
  55.     if (srclen <= dstlen) {
  56.         memcpy(dst, src, srclen);
  57.         return srclen;
  58.     }
  59.     u.i = 0x01020304;
  60.     if (u.c[0] == 0x01) {
  61.         /* big-endian case */
  62.         memcpy(dst, (char*)src + (srclen - dstlen), dstlen);
  63.     } else {
  64.         /* little-endian case */
  65.         memcpy(dst, src, dstlen);
  66.     }
  67.     return dstlen;
  68. }
  69. size_t RNG_GetNoise(void *buf, size_t maxbytes)
  70. {
  71.     uint32 c = TickCount();
  72.     return CopyLowBits(buf, maxbytes,  &c, sizeof(c));
  73. }
  74. void RNG_FileForRNG(char *filename)
  75. {   
  76.     unsigned char buffer[BUFSIZ];
  77.     size_t bytes;
  78. #ifdef notdef /*sigh*/
  79.     XP_File file;
  80. unsigned long totalFileBytes = 0;
  81. if (filename == NULL) /* For now, read in global history if filename is null */
  82. file = XP_FileOpen(NULL, xpGlobalHistory,XP_FILE_READ_BIN);
  83. else
  84. file = XP_FileOpen(NULL, xpURL,XP_FILE_READ_BIN);
  85.     if (file != NULL) {
  86.         for (;;) {
  87.             bytes = XP_FileRead(buffer, sizeof(buffer), file);
  88.             if (bytes == 0) break;
  89.             RNG_RandomUpdate( buffer, bytes);
  90.             totalFileBytes += bytes;
  91.             if (totalFileBytes > 100*1024) break; /* No more than 100 K */
  92.         }
  93. XP_FileClose(file);
  94.     }
  95. #endif
  96.     /*
  97.      * Pass yet another snapshot of our highest resolution clock into
  98.      * the hash function.
  99.      */
  100.     bytes = RNG_GetNoise(buffer, sizeof(buffer));
  101.     RNG_RandomUpdate(buffer, sizeof(buffer));
  102. }
  103. void RNG_SystemInfoForRNG()
  104. {
  105. /* Time */
  106. {
  107. unsigned long sec;
  108. size_t bytes;
  109. GetDateTime(&sec); /* Current time since 1970 */
  110. RNG_RandomUpdate( &sec, sizeof(sec));
  111.     bytes = RNG_GetNoise(&sec, sizeof(sec));
  112.     RNG_RandomUpdate(&sec, bytes);
  113.     }
  114. /* User specific variables */
  115. {
  116. MachineLocation loc;
  117. ReadLocation(&loc);
  118. RNG_RandomUpdate( &loc, sizeof(loc));
  119. }
  120. /* User name */
  121. {
  122. unsigned long userRef;
  123. Str32 userName;
  124. GetDefaultUser(&userRef, userName);
  125. RNG_RandomUpdate( &userRef, sizeof(userRef));
  126. RNG_RandomUpdate( userName, sizeof(userName));
  127. }
  128. /* Mouse location */
  129. {
  130. Point mouseLoc;
  131. GetMouse(&mouseLoc);
  132. RNG_RandomUpdate( &mouseLoc, sizeof(mouseLoc));
  133. }
  134. /* Keyboard time threshold */
  135. {
  136. SInt16 keyTresh = LMGetKeyThresh();
  137. RNG_RandomUpdate( &keyTresh, sizeof(keyTresh));
  138. }
  139. /* Last key pressed */
  140. {
  141. SInt8 keyLast;
  142. keyLast = LMGetKbdLast();
  143. RNG_RandomUpdate( &keyLast, sizeof(keyLast));
  144. }
  145. /* Volume */
  146. {
  147. UInt8 volume = LMGetSdVolume();
  148. RNG_RandomUpdate( &volume, sizeof(volume));
  149. }
  150. /* Current directory */
  151. {
  152. SInt32 dir = LMGetCurDirStore();
  153. RNG_RandomUpdate( &dir, sizeof(dir));
  154. }
  155. /* Process information about all the processes in the machine */
  156. {
  157. ProcessSerialNumber  process;
  158. ProcessInfoRec pi;
  159. process.highLongOfPSN = process.lowLongOfPSN  = kNoProcess;
  160. while (GetNextProcess(&process) == noErr)
  161. {
  162. FSSpec fileSpec;
  163. pi.processInfoLength = sizeof(ProcessInfoRec);
  164. pi.processName = NULL;
  165. pi.processAppSpec = &fileSpec;
  166. GetProcessInformation(&process, &pi);
  167. RNG_RandomUpdate( &pi, sizeof(pi));
  168. RNG_RandomUpdate( &fileSpec, sizeof(fileSpec));
  169. }
  170. }
  171. /* Heap */
  172. {
  173. THz zone = LMGetTheZone();
  174. RNG_RandomUpdate( &zone, sizeof(zone));
  175. }
  176. /* Screen */
  177. {
  178. GDHandle h = LMGetMainDevice(); /* GDHandle is **GDevice */
  179. RNG_RandomUpdate( *h, sizeof(GDevice));
  180. }
  181. /* Scrap size */
  182. {
  183. SInt32 scrapSize = LMGetScrapSize();
  184. RNG_RandomUpdate( &scrapSize, sizeof(scrapSize));
  185. }
  186. /* Scrap count */
  187. {
  188. SInt16 scrapCount = LMGetScrapCount();
  189. RNG_RandomUpdate( &scrapCount, sizeof(scrapCount));
  190. }
  191. /*  File stuff, last modified, etc. */
  192. {
  193. HParamBlockRec pb;
  194. GetVolParmsInfoBuffer volInfo;
  195. pb.ioParam.ioVRefNum = 0;
  196. pb.ioParam.ioNamePtr = nil;
  197. pb.ioParam.ioBuffer = (Ptr) &volInfo;
  198. pb.ioParam.ioReqCount = sizeof(volInfo);
  199. PBHGetVolParmsSync(&pb);
  200. RNG_RandomUpdate( &volInfo, sizeof(volInfo));
  201. }
  202. /* Event queue */
  203. {
  204. EvQElPtr eventQ;
  205. for (eventQ = (EvQElPtr) LMGetEventQueue()->qHead; 
  206. eventQ; 
  207. eventQ = (EvQElPtr)eventQ->qLink)
  208. RNG_RandomUpdate( &eventQ->evtQWhat, sizeof(EventRecord));
  209. }
  210. FE_ReadScreen();
  211. RNG_FileForRNG(NULL);
  212. }
  213. void FE_ReadScreen()
  214. {
  215. UInt16 coords[4];
  216. PixMapHandle  pmap;
  217. GDHandle gh;
  218. UInt16 screenHeight;
  219. UInt16 screenWidth; /* just what they say */
  220. UInt32 bytesToRead; /* number of bytes we're giving */
  221. UInt32 offset; /* offset into the graphics buffer */
  222. UInt16 rowBytes;
  223. UInt32 rowsToRead;
  224. float bytesPerPixel; /* dependent on buffer depth */
  225. Ptr p; /* temporary */
  226. UInt16 x, y, w, h;
  227. gh = LMGetMainDevice();
  228. if ( !gh )
  229. return;
  230. pmap = (**gh).gdPMap;
  231. if ( !pmap )
  232. return;
  233. RNG_GenerateGlobalRandomBytes( coords, sizeof( coords ) );
  234. /* make x and y inside the screen rect */
  235. screenHeight = (**pmap).bounds.bottom - (**pmap).bounds.top;
  236. screenWidth = (**pmap).bounds.right - (**pmap).bounds.left;
  237. x = coords[0] % screenWidth;
  238. y = coords[1] % screenHeight;
  239. w = ( coords[2] & 0x7F ) | 0x40; /* Make sure that w is in the range 64..128 */
  240. h = ( coords[3] & 0x7F ) | 0x40; /* same for h */
  241. bytesPerPixel = (**pmap).pixelSize / 8;
  242. rowBytes = (**pmap).rowBytes & 0x7FFF;
  243. /* starting address */
  244. offset = ( rowBytes * y ) + (UInt32)( (float)x * bytesPerPixel );
  245. /* don't read past the end of the pixmap's rowbytes */
  246. bytesToRead = MIN( (UInt32)( w * bytesPerPixel ),
  247. (UInt32)( rowBytes - ( x * bytesPerPixel ) ) );
  248. /* don't read past the end of the graphics device pixmap */
  249. rowsToRead = MIN( h, 
  250. ( screenHeight - y ) );
  251. p = GetPixBaseAddr( pmap ) + offset;
  252. while ( rowsToRead-- )
  253. {
  254. RNG_RandomUpdate( p, bytesToRead );
  255. p += rowBytes;
  256. }
  257. }
  258. #endif