4 * An ActionScript 3 implementation of a Random Number Generator
\r
5 * Copyright (c) 2007 Henri Torgemane
\r
8 * The jsbn library, Copyright (c) 2003-2005 Tom Wu
\r
10 * See LICENSE.txt for full license information.
\r
12 package com.hurlant.crypto.prng
\r
14 import flash.utils.ByteArray;
\r
15 import com.hurlant.util.Memory;
\r
16 import flash.system.System;
\r
17 import flash.system.Capabilities;
\r
18 import flash.accessibility.AccessibilityProperties;
\r
19 import flash.display.SWFVersion;
\r
20 import flash.display.Stage;
\r
21 import flash.utils.getTimer;
\r
22 import flash.text.Font;
\r
26 private var state:IPRNG;
\r
27 private var ready:Boolean = false;
\r
28 private var pool:ByteArray;
\r
29 private var psize:int;
\r
30 private var pptr:int;
\r
31 private var seeded:Boolean = false;
\r
33 public function Random(prng:Class = null) {
\r
34 if (prng==null) prng = ARC4;
\r
35 state = new prng as IPRNG;
\r
36 psize= state.getPoolSize();
\r
37 pool = new ByteArray;
\r
39 while (pptr <psize) {
\r
40 var t:uint = 65536*Math.random();
\r
41 pool[pptr++] = t >>> 8;
\r
42 pool[pptr++] = t&255;
\r
48 public function seed(x:int = 0):void {
\r
50 x = new Date().getTime();
\r
52 pool[pptr++] ^= x & 255;
\r
53 pool[pptr++] ^= (x>>8)&255;
\r
54 pool[pptr++] ^= (x>>16)&255;
\r
55 pool[pptr++] ^= (x>>24)&255;
\r
61 * Gather anything we have that isn't entirely predictable:
\r
63 * - system capabilities
\r
67 public function autoSeed():void {
\r
68 var b:ByteArray = new ByteArray;
\r
69 b.writeUnsignedInt(System.totalMemory);
\r
70 b.writeUTF(Capabilities.serverString);
\r
71 b.writeUnsignedInt(getTimer());
\r
72 b.writeUnsignedInt((new Date).getTime());
\r
73 var a:Array = Font.enumerateFonts(true);
\r
74 for each (var f:Font in a) {
\r
75 b.writeUTF(f.fontName);
\r
76 b.writeUTF(f.fontStyle);
\r
77 b.writeUTF(f.fontType);
\r
80 while (b.bytesAvailable>=4) {
\r
81 seed(b.readUnsignedInt());
\r
86 public function nextBytes(buffer:ByteArray, length:int):void {
\r
88 buffer.writeByte(nextByte());
\r
91 public function nextByte():int {
\r
101 return state.next();
\r
103 public function dispose():void {
\r
104 for (var i:uint=0;i<pool.length;i++) {
\r
105 pool[i] = Math.random()*256;
\r
115 public function toString():String {
\r
116 return "random-"+state.toString();
\r