rocket-js 0.0.2 → 0.0.3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (125) hide show
  1. data/Rakefile +5 -52
  2. data/spec/ruby/spec_helper.rb +2 -1
  3. metadata +7 -129
  4. data/src/vendor/web-socket-js/FABridge.js +0 -604
  5. data/src/vendor/web-socket-js/README.txt +0 -109
  6. data/src/vendor/web-socket-js/WebSocketMain.swf +0 -0
  7. data/src/vendor/web-socket-js/WebSocketMainInsecure.zip +0 -0
  8. data/src/vendor/web-socket-js/flash-src/WebSocket.as +0 -473
  9. data/src/vendor/web-socket-js/flash-src/WebSocketMain.as +0 -88
  10. data/src/vendor/web-socket-js/flash-src/WebSocketMainInsecure.as +0 -19
  11. data/src/vendor/web-socket-js/flash-src/WebSocketStateEvent.as +0 -32
  12. data/src/vendor/web-socket-js/flash-src/bridge/FABridge.as +0 -943
  13. data/src/vendor/web-socket-js/flash-src/build.sh +0 -10
  14. data/src/vendor/web-socket-js/flash-src/com/adobe/net/proxies/RFC2817Socket.as +0 -204
  15. data/src/vendor/web-socket-js/flash-src/com/gsolo/encryption/MD5.as +0 -375
  16. data/src/vendor/web-socket-js/flash-src/com/hurlant/crypto/Crypto.as +0 -287
  17. data/src/vendor/web-socket-js/flash-src/com/hurlant/crypto/cert/MozillaRootCertificates.as +0 -3235
  18. data/src/vendor/web-socket-js/flash-src/com/hurlant/crypto/cert/X509Certificate.as +0 -218
  19. data/src/vendor/web-socket-js/flash-src/com/hurlant/crypto/cert/X509CertificateCollection.as +0 -57
  20. data/src/vendor/web-socket-js/flash-src/com/hurlant/crypto/hash/HMAC.as +0 -82
  21. data/src/vendor/web-socket-js/flash-src/com/hurlant/crypto/hash/IHMAC.as +0 -27
  22. data/src/vendor/web-socket-js/flash-src/com/hurlant/crypto/hash/IHash.as +0 -21
  23. data/src/vendor/web-socket-js/flash-src/com/hurlant/crypto/hash/MAC.as +0 -137
  24. data/src/vendor/web-socket-js/flash-src/com/hurlant/crypto/hash/MD2.as +0 -124
  25. data/src/vendor/web-socket-js/flash-src/com/hurlant/crypto/hash/MD5.as +0 -204
  26. data/src/vendor/web-socket-js/flash-src/com/hurlant/crypto/hash/SHA1.as +0 -106
  27. data/src/vendor/web-socket-js/flash-src/com/hurlant/crypto/hash/SHA224.as +0 -28
  28. data/src/vendor/web-socket-js/flash-src/com/hurlant/crypto/hash/SHA256.as +0 -115
  29. data/src/vendor/web-socket-js/flash-src/com/hurlant/crypto/hash/SHABase.as +0 -71
  30. data/src/vendor/web-socket-js/flash-src/com/hurlant/crypto/prng/ARC4.as +0 -90
  31. data/src/vendor/web-socket-js/flash-src/com/hurlant/crypto/prng/IPRNG.as +0 -20
  32. data/src/vendor/web-socket-js/flash-src/com/hurlant/crypto/prng/Random.as +0 -119
  33. data/src/vendor/web-socket-js/flash-src/com/hurlant/crypto/prng/TLSPRF.as +0 -142
  34. data/src/vendor/web-socket-js/flash-src/com/hurlant/crypto/rsa/RSAKey.as +0 -339
  35. data/src/vendor/web-socket-js/flash-src/com/hurlant/crypto/symmetric/AESKey.as +0 -2797
  36. data/src/vendor/web-socket-js/flash-src/com/hurlant/crypto/symmetric/BlowFishKey.as +0 -375
  37. data/src/vendor/web-socket-js/flash-src/com/hurlant/crypto/symmetric/CBCMode.as +0 -55
  38. data/src/vendor/web-socket-js/flash-src/com/hurlant/crypto/symmetric/CFB8Mode.as +0 -61
  39. data/src/vendor/web-socket-js/flash-src/com/hurlant/crypto/symmetric/CFBMode.as +0 -64
  40. data/src/vendor/web-socket-js/flash-src/com/hurlant/crypto/symmetric/CTRMode.as +0 -58
  41. data/src/vendor/web-socket-js/flash-src/com/hurlant/crypto/symmetric/DESKey.as +0 -365
  42. data/src/vendor/web-socket-js/flash-src/com/hurlant/crypto/symmetric/ECBMode.as +0 -86
  43. data/src/vendor/web-socket-js/flash-src/com/hurlant/crypto/symmetric/ICipher.as +0 -21
  44. data/src/vendor/web-socket-js/flash-src/com/hurlant/crypto/symmetric/IMode.as +0 -15
  45. data/src/vendor/web-socket-js/flash-src/com/hurlant/crypto/symmetric/IPad.as +0 -32
  46. data/src/vendor/web-socket-js/flash-src/com/hurlant/crypto/symmetric/IStreamCipher.as +0 -21
  47. data/src/vendor/web-socket-js/flash-src/com/hurlant/crypto/symmetric/ISymmetricKey.as +0 -35
  48. data/src/vendor/web-socket-js/flash-src/com/hurlant/crypto/symmetric/IVMode.as +0 -110
  49. data/src/vendor/web-socket-js/flash-src/com/hurlant/crypto/symmetric/NullPad.as +0 -34
  50. data/src/vendor/web-socket-js/flash-src/com/hurlant/crypto/symmetric/OFBMode.as +0 -52
  51. data/src/vendor/web-socket-js/flash-src/com/hurlant/crypto/symmetric/PKCS5.as +0 -44
  52. data/src/vendor/web-socket-js/flash-src/com/hurlant/crypto/symmetric/SSLPad.as +0 -44
  53. data/src/vendor/web-socket-js/flash-src/com/hurlant/crypto/symmetric/SimpleIVMode.as +0 -60
  54. data/src/vendor/web-socket-js/flash-src/com/hurlant/crypto/symmetric/TLSPad.as +0 -42
  55. data/src/vendor/web-socket-js/flash-src/com/hurlant/crypto/symmetric/TripleDESKey.as +0 -88
  56. data/src/vendor/web-socket-js/flash-src/com/hurlant/crypto/symmetric/XTeaKey.as +0 -94
  57. data/src/vendor/web-socket-js/flash-src/com/hurlant/crypto/symmetric/aeskey.pl +0 -29
  58. data/src/vendor/web-socket-js/flash-src/com/hurlant/crypto/symmetric/dump.txt +0 -2304
  59. data/src/vendor/web-socket-js/flash-src/com/hurlant/crypto/tests/AESKeyTest.as +0 -1220
  60. data/src/vendor/web-socket-js/flash-src/com/hurlant/crypto/tests/ARC4Test.as +0 -58
  61. data/src/vendor/web-socket-js/flash-src/com/hurlant/crypto/tests/BigIntegerTest.as +0 -39
  62. data/src/vendor/web-socket-js/flash-src/com/hurlant/crypto/tests/BlowFishKeyTest.as +0 -148
  63. data/src/vendor/web-socket-js/flash-src/com/hurlant/crypto/tests/CBCModeTest.as +0 -160
  64. data/src/vendor/web-socket-js/flash-src/com/hurlant/crypto/tests/CFB8ModeTest.as +0 -71
  65. data/src/vendor/web-socket-js/flash-src/com/hurlant/crypto/tests/CFBModeTest.as +0 -98
  66. data/src/vendor/web-socket-js/flash-src/com/hurlant/crypto/tests/CTRModeTest.as +0 -109
  67. data/src/vendor/web-socket-js/flash-src/com/hurlant/crypto/tests/DESKeyTest.as +0 -112
  68. data/src/vendor/web-socket-js/flash-src/com/hurlant/crypto/tests/ECBModeTest.as +0 -151
  69. data/src/vendor/web-socket-js/flash-src/com/hurlant/crypto/tests/HMACTest.as +0 -184
  70. data/src/vendor/web-socket-js/flash-src/com/hurlant/crypto/tests/ITestHarness.as +0 -20
  71. data/src/vendor/web-socket-js/flash-src/com/hurlant/crypto/tests/MD2Test.as +0 -56
  72. data/src/vendor/web-socket-js/flash-src/com/hurlant/crypto/tests/MD5Test.as +0 -58
  73. data/src/vendor/web-socket-js/flash-src/com/hurlant/crypto/tests/OFBModeTest.as +0 -101
  74. data/src/vendor/web-socket-js/flash-src/com/hurlant/crypto/tests/RSAKeyTest.as +0 -92
  75. data/src/vendor/web-socket-js/flash-src/com/hurlant/crypto/tests/SHA1Test.as +0 -198
  76. data/src/vendor/web-socket-js/flash-src/com/hurlant/crypto/tests/SHA224Test.as +0 -58
  77. data/src/vendor/web-socket-js/flash-src/com/hurlant/crypto/tests/SHA256Test.as +0 -60
  78. data/src/vendor/web-socket-js/flash-src/com/hurlant/crypto/tests/TLSPRFTest.as +0 -51
  79. data/src/vendor/web-socket-js/flash-src/com/hurlant/crypto/tests/TestCase.as +0 -42
  80. data/src/vendor/web-socket-js/flash-src/com/hurlant/crypto/tests/TripleDESKeyTest.as +0 -59
  81. data/src/vendor/web-socket-js/flash-src/com/hurlant/crypto/tests/XTeaKeyTest.as +0 -66
  82. data/src/vendor/web-socket-js/flash-src/com/hurlant/crypto/tls/BulkCiphers.as +0 -102
  83. data/src/vendor/web-socket-js/flash-src/com/hurlant/crypto/tls/CipherSuites.as +0 -117
  84. data/src/vendor/web-socket-js/flash-src/com/hurlant/crypto/tls/IConnectionState.as +0 -14
  85. data/src/vendor/web-socket-js/flash-src/com/hurlant/crypto/tls/ISecurityParameters.as +0 -29
  86. data/src/vendor/web-socket-js/flash-src/com/hurlant/crypto/tls/KeyExchanges.as +0 -24
  87. data/src/vendor/web-socket-js/flash-src/com/hurlant/crypto/tls/MACs.as +0 -38
  88. data/src/vendor/web-socket-js/flash-src/com/hurlant/crypto/tls/SSLConnectionState.as +0 -171
  89. data/src/vendor/web-socket-js/flash-src/com/hurlant/crypto/tls/SSLEvent.as +0 -26
  90. data/src/vendor/web-socket-js/flash-src/com/hurlant/crypto/tls/SSLSecurityParameters.as +0 -340
  91. data/src/vendor/web-socket-js/flash-src/com/hurlant/crypto/tls/TLSConfig.as +0 -70
  92. data/src/vendor/web-socket-js/flash-src/com/hurlant/crypto/tls/TLSConnectionState.as +0 -151
  93. data/src/vendor/web-socket-js/flash-src/com/hurlant/crypto/tls/TLSEngine.as +0 -895
  94. data/src/vendor/web-socket-js/flash-src/com/hurlant/crypto/tls/TLSError.as +0 -39
  95. data/src/vendor/web-socket-js/flash-src/com/hurlant/crypto/tls/TLSEvent.as +0 -27
  96. data/src/vendor/web-socket-js/flash-src/com/hurlant/crypto/tls/TLSSecurityParameters.as +0 -197
  97. data/src/vendor/web-socket-js/flash-src/com/hurlant/crypto/tls/TLSSocket.as +0 -370
  98. data/src/vendor/web-socket-js/flash-src/com/hurlant/crypto/tls/TLSSocketEvent.as +0 -26
  99. data/src/vendor/web-socket-js/flash-src/com/hurlant/crypto/tls/TLSTest.as +0 -180
  100. data/src/vendor/web-socket-js/flash-src/com/hurlant/math/BarrettReduction.as +0 -90
  101. data/src/vendor/web-socket-js/flash-src/com/hurlant/math/BigInteger.as +0 -1543
  102. data/src/vendor/web-socket-js/flash-src/com/hurlant/math/ClassicReduction.as +0 -35
  103. data/src/vendor/web-socket-js/flash-src/com/hurlant/math/IReduction.as +0 -11
  104. data/src/vendor/web-socket-js/flash-src/com/hurlant/math/MontgomeryReduction.as +0 -85
  105. data/src/vendor/web-socket-js/flash-src/com/hurlant/math/NullReduction.as +0 -34
  106. data/src/vendor/web-socket-js/flash-src/com/hurlant/math/bi_internal.as +0 -11
  107. data/src/vendor/web-socket-js/flash-src/com/hurlant/util/ArrayUtil.as +0 -25
  108. data/src/vendor/web-socket-js/flash-src/com/hurlant/util/Base64.as +0 -189
  109. data/src/vendor/web-socket-js/flash-src/com/hurlant/util/Hex.as +0 -66
  110. data/src/vendor/web-socket-js/flash-src/com/hurlant/util/Memory.as +0 -28
  111. data/src/vendor/web-socket-js/flash-src/com/hurlant/util/der/ByteString.as +0 -43
  112. data/src/vendor/web-socket-js/flash-src/com/hurlant/util/der/DER.as +0 -210
  113. data/src/vendor/web-socket-js/flash-src/com/hurlant/util/der/IAsn1Type.as +0 -21
  114. data/src/vendor/web-socket-js/flash-src/com/hurlant/util/der/Integer.as +0 -44
  115. data/src/vendor/web-socket-js/flash-src/com/hurlant/util/der/OID.as +0 -35
  116. data/src/vendor/web-socket-js/flash-src/com/hurlant/util/der/ObjectIdentifier.as +0 -112
  117. data/src/vendor/web-socket-js/flash-src/com/hurlant/util/der/PEM.as +0 -118
  118. data/src/vendor/web-socket-js/flash-src/com/hurlant/util/der/PrintableString.as +0 -49
  119. data/src/vendor/web-socket-js/flash-src/com/hurlant/util/der/Sequence.as +0 -90
  120. data/src/vendor/web-socket-js/flash-src/com/hurlant/util/der/Set.as +0 -27
  121. data/src/vendor/web-socket-js/flash-src/com/hurlant/util/der/Type.as +0 -94
  122. data/src/vendor/web-socket-js/flash-src/com/hurlant/util/der/UTCTime.as +0 -60
  123. data/src/vendor/web-socket-js/sample.html +0 -76
  124. data/src/vendor/web-socket-js/swfobject.js +0 -4
  125. data/src/vendor/web-socket-js/web_socket.js +0 -388
@@ -1,26 +0,0 @@
1
- /**
2
- * TLSEvent
3
- *
4
- * This is used by TLSEngine to let the application layer know
5
- * when we're ready for sending, or have received application data
6
- * Copyright (c) 2007 Henri Torgemane
7
- *
8
- * See LICENSE.txt for full license information.
9
- */
10
- package com.hurlant.crypto.tls {
11
- import flash.events.Event;
12
- import flash.utils.ByteArray;
13
- import com.hurlant.crypto.cert.X509Certificate;
14
-
15
- public class TLSSocketEvent extends Event {
16
-
17
- static public const PROMPT_ACCEPT_CERT:String = "promptAcceptCert";
18
-
19
- public var cert:X509Certificate;
20
-
21
- public function TLSSocketEvent( cert:X509Certificate = null) {
22
- super(PROMPT_ACCEPT_CERT, false, false);
23
- this.cert = cert;
24
- }
25
- }
26
- }
@@ -1,180 +0,0 @@
1
- /**
2
- * TLSTest
3
- *
4
- * A test class for TLS. Not a finished product.
5
- * Copyright (c) 2007 Henri Torgemane
6
- *
7
- * See LICENSE.txt for full license information.
8
- */
9
- package com.hurlant.crypto.tls {
10
- import com.hurlant.crypto.cert.X509Certificate;
11
- import com.hurlant.crypto.cert.X509CertificateCollection;
12
- import com.hurlant.util.Hex;
13
- import com.hurlant.util.der.PEM;
14
-
15
- import flash.events.Event;
16
- import flash.events.ProgressEvent;
17
- import flash.net.Socket;
18
- import flash.utils.ByteArray;
19
- import flash.utils.getTimer;
20
-
21
- public class TLSTest {
22
-
23
-
24
- public var myDebugData:String;
25
-
26
- //[Embed(source="/src/host.cert",mimeType="application/octet-stream")]
27
- public var myCert:Class;
28
- //[Embed(source="/src/host.key",mimeType="application/octet-stream")]
29
- public var myKey:Class;
30
-
31
- public function TLSTest(host:String = null, port:int = 0, type:int = 0 ) {
32
- //loopback();
33
- if (host != null) {
34
- if (type == 0) { // SSL 3.0
35
- connectLoginYahooCom();
36
- // connectLocalSSL(host, port);
37
- } else {
38
- connectLocalTLS(host, port);
39
- }
40
- } else {
41
- testSocket();
42
- }
43
- }
44
-
45
- public function connectLoginYahooCom():void {
46
- trace("Connecting test socket");
47
- var s:Socket = new Socket("esx.bluebearllc.net", 903);
48
-
49
- var clientConfig:TLSConfig = new TLSConfig(TLSEngine.CLIENT,
50
- null,
51
- null,
52
- null,
53
- null,
54
- null,
55
- SSLSecurityParameters.PROTOCOL_VERSION);
56
-
57
- var client:TLSEngine = new TLSEngine(clientConfig, s, s);
58
- // hook some events.
59
- s.addEventListener(ProgressEvent.SOCKET_DATA, client.dataAvailable);
60
- client.addEventListener(ProgressEvent.SOCKET_DATA, function(e:*):void { s.flush(); });
61
- client.start();
62
-
63
- }
64
- public function connectLocalTLS(host:String, port:int):void {
65
- var s:Socket = new Socket(host, port);
66
-
67
- var clientConfig:TLSConfig = new TLSConfig(TLSEngine.CLIENT);
68
-
69
- var client:TLSEngine = new TLSEngine(clientConfig, s, s);
70
- // hook some events.
71
- s.addEventListener(ProgressEvent.SOCKET_DATA, client.dataAvailable);
72
- client.addEventListener(ProgressEvent.SOCKET_DATA, function(e:*):void { s.flush(); });
73
-
74
- client.start();
75
-
76
- }
77
- public function connectLocalSSL(host:String, port:int):void {
78
- var s:Socket = new Socket(host, port);
79
-
80
- var clientConfig:TLSConfig = new TLSConfig(TLSEngine.CLIENT,
81
- null,
82
- null,
83
- null,
84
- null,
85
- null,
86
- SSLSecurityParameters.PROTOCOL_VERSION);
87
-
88
- var client:TLSEngine = new TLSEngine(clientConfig, s, s);
89
- // hook some events.
90
- s.addEventListener(ProgressEvent.SOCKET_DATA, client.dataAvailable);
91
- client.addEventListener(ProgressEvent.SOCKET_DATA, function(e:*):void { s.flush(); });
92
-
93
- client.start();
94
- }
95
-
96
- public function loopback():void {
97
-
98
- var server_write:ByteArray = new ByteArray;
99
- var client_write:ByteArray = new ByteArray;
100
- var server_write_cursor:uint = 0;
101
- var client_write_cursor:uint = 0;
102
-
103
- var clientConfig:TLSConfig = new TLSConfig(TLSEngine.CLIENT, null, null, null, null, null, SSLSecurityParameters.PROTOCOL_VERSION);
104
- var serverConfig:TLSConfig = new TLSConfig(TLSEngine.SERVER, null, null, null, null, null, SSLSecurityParameters.PROTOCOL_VERSION);
105
-
106
-
107
- var cert:ByteArray = new myCert;
108
- var key:ByteArray = new myKey;
109
- serverConfig.setPEMCertificate(cert.readUTFBytes(cert.length), key.readUTFBytes(key.length));
110
- // tmp, for debugging. currently useless
111
- cert.position = 0;
112
- key.position = 0;
113
- clientConfig.setPEMCertificate(cert.readUTFBytes(cert.length), key.readUTFBytes(key.length));
114
- // put the server cert in the client's trusted store, to keep things happy.
115
- clientConfig.CAStore = new X509CertificateCollection;
116
- cert.position = 0;
117
- var x509:X509Certificate = new X509Certificate(PEM.readCertIntoArray(cert.readUTFBytes(cert.length)));
118
- clientConfig.CAStore.addCertificate(x509);
119
-
120
-
121
- var server:TLSEngine = new TLSEngine(serverConfig, client_write, server_write);
122
- var client:TLSEngine = new TLSEngine(clientConfig, server_write, client_write);
123
-
124
- server.addEventListener(ProgressEvent.SOCKET_DATA, function(e:*=null):void {
125
- trace("server wrote something!");
126
- trace(Hex.fromArray(server_write));
127
- var l:uint = server_write.position;
128
- server_write.position = server_write_cursor;
129
- client.dataAvailable(e);
130
- server_write.position = l;
131
- server_write_cursor = l;
132
- });
133
- client.addEventListener(ProgressEvent.SOCKET_DATA, function(e:*=null):void {
134
- trace("client wrote something!");
135
- trace(Hex.fromArray(client_write));
136
- var l:uint = client_write.position;
137
- client_write.position = client_write_cursor;
138
- server.dataAvailable(e);
139
- client_write.position = l;
140
- client_write_cursor = l;
141
- });
142
-
143
- server.start();
144
- client.start();
145
- }
146
-
147
- public function testSocket():void {
148
- var hosts:Array = [
149
- "bugs.adobe.com", // apache
150
- "login.yahoo.com", // apache, bigger response
151
- "login.live.com", // IIS-6, chain of 3 certs
152
- "banking.wellsfargo.com", // custom, sends its CA cert along for the ride.
153
- "www.bankofamerica.com" // sun-one, chain of 3 certs
154
- ];
155
- var i:int =0;
156
- (function next():void {
157
- testHost(hosts[i++], next);
158
- })();
159
- }
160
-
161
- private function testHost(host:String, next:Function):void {
162
- if (host==null) return;
163
- var t1:int = getTimer();
164
-
165
- var host:String = host;
166
- var t:TLSSocket = new TLSSocket;
167
- t.connect(host, 4433);
168
- t.writeUTFBytes("GET / HTTP/1.0\nHost: "+host+"\n\n");
169
- t.addEventListener(Event.CLOSE, function(e:*):void {
170
- var s:String = t.readUTFBytes(t.bytesAvailable);
171
- trace("Response from "+host+": "+s.length+" characters");
172
- var bytes:ByteArray = new ByteArray();
173
- t.readBytes(bytes, 0, t.bytesAvailable);
174
- trace(Hex.fromArray(bytes));
175
- trace("Time used = "+(getTimer()-t1)+"ms");
176
- next();
177
- });
178
- }
179
- }
180
- }
@@ -1,90 +0,0 @@
1
- package com.hurlant.math
2
- {
3
- use namespace bi_internal;
4
-
5
- internal class BarrettReduction implements IReduction
6
- {
7
- private var m:BigInteger;
8
- private var r2:BigInteger;
9
- private var q3:BigInteger;
10
- private var mu:BigInteger;
11
-
12
- public function BarrettReduction(m:BigInteger) {
13
- // setup Barrett
14
- r2 = new BigInteger;
15
- q3 = new BigInteger;
16
- BigInteger.ONE.dlShiftTo(2*m.t, r2);
17
- mu = r2.divide(m);
18
- this.m = m;
19
- }
20
-
21
- public function revert(x:BigInteger):BigInteger
22
- {
23
- return x;
24
- }
25
-
26
- /**
27
- *
28
- * @param x
29
- * @param y
30
- * @param r = x*y mod m; x != r
31
- *
32
- */
33
- public function mulTo(x:BigInteger, y:BigInteger, r:BigInteger):void
34
- {
35
- x.multiplyTo(y, r);
36
- reduce(r);
37
- }
38
-
39
- /**
40
- *
41
- * @param x
42
- * @param r = x^2 mod m; x != r
43
- *
44
- */
45
- public function sqrTo(x:BigInteger, r:BigInteger):void
46
- {
47
- x.squareTo(r);
48
- reduce(r);
49
- }
50
-
51
- public function convert(x:BigInteger):BigInteger
52
- {
53
- if (x.s<0 || x.t>2*m.t) {
54
- return x.mod(m);
55
- } else if (x.compareTo(m)<0) {
56
- return x;
57
- } else {
58
- var r:BigInteger = new BigInteger;
59
- x.copyTo(r);
60
- reduce(r);
61
- return r;
62
- }
63
- }
64
-
65
- /**
66
- *
67
- * @param x = x mod m (HAC 14.42)
68
- *
69
- */
70
- public function reduce(lx:BigInteger):void
71
- {
72
- var x:BigInteger = lx as BigInteger;
73
- x.drShiftTo(m.t-1,r2);
74
- if (x.t>m.t+1) {
75
- x.t = m.t+1;
76
- x.clamp();
77
- }
78
- mu.multiplyUpperTo(r2, m.t+1, q3);
79
- m.multiplyLowerTo(q3, m.t+1, r2);
80
- while (x.compareTo(r2)<0) {
81
- x.dAddOffset(1, m.t+1);
82
- }
83
- x.subTo(r2,x);
84
- while (x.compareTo(m)>=0) {
85
- x.subTo(m,x);
86
- }
87
- }
88
-
89
- }
90
- }
@@ -1,1543 +0,0 @@
1
- /**
2
- * BigInteger
3
- *
4
- * An ActionScript 3 implementation of BigInteger (light version)
5
- * Copyright (c) 2007 Henri Torgemane
6
- *
7
- * Derived from:
8
- * The jsbn library, Copyright (c) 2003-2005 Tom Wu
9
- *
10
- * See LICENSE.txt for full license information.
11
- */
12
- package com.hurlant.math
13
- {
14
-
15
- import com.hurlant.crypto.prng.Random;
16
- import com.hurlant.util.Hex;
17
- import com.hurlant.util.Memory;
18
-
19
- import flash.utils.ByteArray;
20
- use namespace bi_internal;
21
-
22
- public class BigInteger
23
- {
24
- public static const DB:int = 30; // number of significant bits per chunk
25
- public static const DV:int = (1<<DB);
26
- public static const DM:int = (DV-1); // Max value in a chunk
27
-
28
- public static const BI_FP:int = 52;
29
- public static const FV:Number = Math.pow(2, BI_FP);
30
- public static const F1:int = BI_FP - DB;
31
- public static const F2:int = 2*DB - BI_FP;
32
-
33
- public static const ZERO:BigInteger = nbv(0);
34
- public static const ONE:BigInteger = nbv(1);
35
-
36
- /*bi_internal */public var t:int; // number of chunks.
37
- bi_internal var s:int; // sign
38
- bi_internal var a:Array; // chunks
39
-
40
- /**
41
- *
42
- * @param value
43
- * @param radix WARNING: If value is ByteArray, this holds the number of bytes to use.
44
- * @param unsigned
45
- *
46
- */
47
- public function BigInteger(value:* = null, radix:int = 0, unsigned:Boolean = false) {
48
- a = new Array;
49
- if (value is String) {
50
- if (radix&&radix!=16) throw new Error("BigInteger construction with radix!=16 is not supported.");
51
- value = Hex.toArray(value);
52
- radix=0;
53
- }
54
- if (value is ByteArray) {
55
- var array:ByteArray = value as ByteArray;
56
- var length:int = radix || (array.length - array.position);
57
- fromArray(array, length, unsigned);
58
- }
59
- }
60
- public function dispose():void {
61
- var r:Random = new Random;
62
- for (var i:uint=0;i<a.length;i++) {
63
- a[i] = r.nextByte();
64
- delete a[i];
65
- }
66
- a=null;
67
- t=0;
68
- s=0;
69
- Memory.gc();
70
- }
71
-
72
- public function toString(radix:Number=16):String {
73
- if (s<0) return "-"+negate().toString(radix);
74
- var k:int;
75
- switch (radix) {
76
- case 2: k=1; break;
77
- case 4: k=2; break;
78
- case 8: k=3; break;
79
- case 16: k=4; break;
80
- case 32: k=5; break;
81
- default:
82
- // return toRadix(radix);
83
- }
84
- var km:int = (1<<k)-1;
85
- var d:int = 0;
86
- var m:Boolean = false;
87
- var r:String = "";
88
- var i:int = t;
89
- var p:int = DB-(i*DB)%k;
90
- if (i-->0) {
91
- if (p<DB && (d=a[i]>>p)>0) {
92
- m = true;
93
- r = d.toString(36);
94
- }
95
- while (i >= 0) {
96
- if (p<k) {
97
- d = (a[i]&((1<<p)-1))<<(k-p);
98
- d|= a[--i]>>(p+=DB-k);
99
- } else {
100
- d = (a[i]>>(p-=k))&km;
101
- if (p<=0) {
102
- p += DB;
103
- --i;
104
- }
105
- }
106
- if (d>0) {
107
- m = true;
108
- }
109
- if (m) {
110
- r += d.toString(36);
111
- }
112
- }
113
- }
114
- return m?r:"0";
115
- }
116
- public function toArray(array:ByteArray):uint {
117
- const k:int = 8;
118
- const km:int = (1<<8)-1;
119
- var d:int = 0;
120
- var i:int = t;
121
- var p:int = DB-(i*DB)%k;
122
- var m:Boolean = false;
123
- var c:int = 0;
124
- if (i-->0) {
125
- if (p<DB && (d=a[i]>>p)>0) {
126
- m = true;
127
- array.writeByte(d);
128
- c++;
129
- }
130
- while (i >= 0) {
131
- if (p<k) {
132
- d = (a[i]&((1<<p)-1))<<(k-p);
133
- d|= a[--i]>>(p+=DB-k);
134
- } else {
135
- d = (a[i]>>(p-=k))&km;
136
- if (p<=0) {
137
- p += DB;
138
- --i;
139
- }
140
- }
141
- if (d>0) {
142
- m = true;
143
- }
144
- if (m) {
145
- array.writeByte(d);
146
- c++;
147
- }
148
- }
149
- }
150
- return c;
151
- }
152
- /**
153
- * best-effort attempt to fit into a Number.
154
- * precision can be lost if it just can't fit.
155
- */
156
- public function valueOf():Number {
157
- if (s==-1) {
158
- return -negate().valueOf();
159
- }
160
- var coef:Number = 1;
161
- var value:Number = 0;
162
- for (var i:uint=0;i<t;i++) {
163
- value += a[i]*coef;
164
- coef *= DV;
165
- }
166
- return value;
167
- }
168
- /**
169
- * -this
170
- */
171
- public function negate():BigInteger {
172
- var r:BigInteger = nbi();
173
- ZERO.subTo(this, r);
174
- return r;
175
- }
176
- /**
177
- * |this|
178
- */
179
- public function abs():BigInteger {
180
- return (s<0)?negate():this;
181
- }
182
- /**
183
- * return + if this > v, - if this < v, 0 if equal
184
- */
185
- public function compareTo(v:BigInteger):int {
186
- var r:int = s - v.s;
187
- if (r!=0) {
188
- return r;
189
- }
190
- var i:int = t;
191
- r = i-v.t;
192
- if (r!=0) {
193
- return r;
194
- }
195
- while (--i >=0) {
196
- r=a[i]-v.a[i];
197
- if (r != 0) return r;
198
- }
199
- return 0;
200
- }
201
- /**
202
- * returns bit length of the integer x
203
- */
204
- bi_internal function nbits(x:int):int {
205
- var r:int = 1;
206
- var t:int;
207
- if ((t=x>>>16) != 0) { x = t; r += 16; }
208
- if ((t=x>>8) != 0) { x = t; r += 8; }
209
- if ((t=x>>4) != 0) { x = t; r += 4; }
210
- if ((t=x>>2) != 0) { x = t; r += 2; }
211
- if ((t=x>>1) != 0) { x = t; r += 1; }
212
- return r;
213
- }
214
- /**
215
- * returns the number of bits in this
216
- */
217
- public function bitLength():int {
218
- if (t<=0) return 0;
219
- return DB*(t-1)+nbits(a[t-1]^(s&DM));
220
- }
221
- /**
222
- *
223
- * @param v
224
- * @return this % v
225
- *
226
- */
227
- public function mod(v:BigInteger):BigInteger {
228
- var r:BigInteger = nbi();
229
- abs().divRemTo(v,null,r);
230
- if (s<0 && r.compareTo(ZERO)>0) {
231
- v.subTo(r,r);
232
- }
233
- return r;
234
- }
235
- /**
236
- * this^e % m, 0 <= e < 2^32
237
- */
238
- public function modPowInt(e:int, m:BigInteger):BigInteger {
239
- var z:IReduction;
240
- if (e<256 || m.isEven()) {
241
- z = new ClassicReduction(m);
242
- } else {
243
- z = new MontgomeryReduction(m);
244
- }
245
- return exp(e, z);
246
- }
247
-
248
- /**
249
- * copy this to r
250
- */
251
- bi_internal function copyTo(r:BigInteger):void {
252
- for (var i:int = t-1; i>=0; --i) {
253
- r.a[i] = a[i];
254
- }
255
- r.t = t;
256
- r.s = s;
257
- }
258
- /**
259
- * set from integer value "value", -DV <= value < DV
260
- */
261
- bi_internal function fromInt(value:int):void {
262
- t = 1;
263
- s = (value<0)?-1:0;
264
- if (value>0) {
265
- a[0] = value;
266
- } else if (value<-1) {
267
- a[0] = value+DV;
268
- } else {
269
- t = 0;
270
- }
271
- }
272
- /**
273
- * set from ByteArray and length,
274
- * starting a current position
275
- * If length goes beyond the array, pad with zeroes.
276
- */
277
- bi_internal function fromArray(value:ByteArray, length:int, unsigned:Boolean = false):void {
278
- var p:int = value.position;
279
- var i:int = p+length;
280
- var sh:int = 0;
281
- const k:int = 8;
282
- t = 0;
283
- s = 0;
284
- while (--i >= p) {
285
- var x:int = i<value.length?value[i]:0;
286
- if (sh == 0) {
287
- a[t++] = x;
288
- } else if (sh+k > DB) {
289
- a[t-1] |= (x&((1<<(DB-sh))-1))<<sh;
290
- a[t++] = x>>(DB-sh);
291
- } else {
292
- a[t-1] |= x<<sh;
293
- }
294
- sh += k;
295
- if (sh >= DB) sh -= DB;
296
- }
297
- if (!unsigned && (value[0]&0x80)==0x80) {
298
- s = -1;
299
- if (sh > 0) {
300
- a[t-1] |= ((1<<(DB-sh))-1)<<sh;
301
- }
302
- }
303
- clamp();
304
- value.position = Math.min(p+length,value.length);
305
- }
306
- /**
307
- * clamp off excess high words
308
- */
309
- bi_internal function clamp():void {
310
- var c:int = s&DM;
311
- while (t>0 && a[t-1]==c) {
312
- --t;
313
- }
314
- }
315
- /**
316
- * r = this << n*DB
317
- */
318
- bi_internal function dlShiftTo(n:int, r:BigInteger):void {
319
- var i:int;
320
- for (i=t-1; i>=0; --i) {
321
- r.a[i+n] = a[i];
322
- }
323
- for (i=n-1; i>=0; --i) {
324
- r.a[i] = 0;
325
- }
326
- r.t = t+n;
327
- r.s = s;
328
- }
329
- /**
330
- * r = this >> n*DB
331
- */
332
- bi_internal function drShiftTo(n:int, r:BigInteger):void {
333
- var i:int;
334
- for (i=n; i<t; ++i) {
335
- r.a[i-n] = a[i];
336
- }
337
- r.t = Math.max(t-n,0);
338
- r.s = s;
339
- }
340
- /**
341
- * r = this << n
342
- */
343
- bi_internal function lShiftTo(n:int, r:BigInteger):void {
344
- var bs:int = n%DB;
345
- var cbs:int = DB-bs;
346
- var bm:int = (1<<cbs)-1;
347
- var ds:int = n/DB;
348
- var c:int = (s<<bs)&DM;
349
- var i:int;
350
- for (i=t-1; i>=0; --i) {
351
- r.a[i+ds+1] = (a[i]>>cbs)|c;
352
- c = (a[i]&bm)<<bs;
353
- }
354
- for (i=ds-1; i>=0; --i) {
355
- r.a[i] = 0;
356
- }
357
- r.a[ds] = c;
358
- r.t = t+ds+1;
359
- r.s = s;
360
- r.clamp();
361
- }
362
- /**
363
- * r = this >> n
364
- */
365
- bi_internal function rShiftTo(n:int, r:BigInteger):void {
366
- r.s = s;
367
- var ds:int = n/DB;
368
- if (ds >= t) {
369
- r.t = 0;
370
- return;
371
- }
372
- var bs:int = n%DB;
373
- var cbs:int = DB-bs;
374
- var bm:int = (1<<bs)-1;
375
- r.a[0] = a[ds]>>bs;
376
- var i:int;
377
- for (i=ds+1; i<t; ++i) {
378
- r.a[i-ds-1] |= (a[i]&bm)<<cbs;
379
- r.a[i-ds] = a[i]>>bs;
380
- }
381
- if (bs>0) {
382
- r.a[t-ds-1] |= (s&bm)<<cbs;
383
- }
384
- r.t = t-ds;
385
- r.clamp();
386
- }
387
- /**
388
- * r = this - v
389
- */
390
- bi_internal function subTo(v:BigInteger, r:BigInteger):void {
391
- var i:int = 0;
392
- var c:int = 0;
393
- var m:int = Math.min(v.t, t);
394
- while (i<m) {
395
- c += a[i] - v.a[i];
396
- r.a[i++] = c & DM;
397
- c >>= DB;
398
- }
399
- if (v.t < t) {
400
- c -= v.s;
401
- while (i< t) {
402
- c+= a[i];
403
- r.a[i++] = c&DM;
404
- c >>= DB;
405
- }
406
- c += s;
407
- } else {
408
- c += s;
409
- while (i < v.t) {
410
- c -= v.a[i];
411
- r.a[i++] = c&DM;
412
- c >>= DB;
413
- }
414
- c -= v.s;
415
- }
416
- r.s = (c<0)?-1:0;
417
- if (c<-1) {
418
- r.a[i++] = DV+c;
419
- } else if (c>0) {
420
- r.a[i++] = c;
421
- }
422
- r.t = i;
423
- r.clamp();
424
- }
425
- /**
426
- * am: Compute w_j += (x*this_i), propagates carries,
427
- * c is initial carry, returns final carry.
428
- * c < 3*dvalue, x < 2*dvalue, this_i < dvalue
429
- */
430
- bi_internal function am(i:int,x:int,w:BigInteger,j:int,c:int,n:int):int {
431
- var xl:int = x&0x7fff;
432
- var xh:int = x>>15;
433
- while(--n >= 0) {
434
- var l:int = a[i]&0x7fff;
435
- var h:int = a[i++]>>15;
436
- var m:int = xh*l + h*xl;
437
- l = xl*l + ((m&0x7fff)<<15)+w.a[j]+(c&0x3fffffff);
438
- c = (l>>>30)+(m>>>15)+xh*h+(c>>>30);
439
- w.a[j++] = l&0x3fffffff;
440
- }
441
- return c;
442
- }
443
- /**
444
- * r = this * v, r != this,a (HAC 14.12)
445
- * "this" should be the larger one if appropriate
446
- */
447
- bi_internal function multiplyTo(v:BigInteger, r:BigInteger):void {
448
- var x:BigInteger = abs();
449
- var y:BigInteger = v.abs();
450
- var i:int = x.t;
451
- r.t = i+y.t;
452
- while (--i >= 0) {
453
- r.a[i] = 0;
454
- }
455
- for (i=0; i<y.t; ++i) {
456
- r.a[i+x.t] = x.am(0, y.a[i], r, i, 0, x.t);
457
- }
458
- r.s = 0;
459
- r.clamp();
460
- if (s!=v.s) {
461
- ZERO.subTo(r, r);
462
- }
463
- }
464
- /**
465
- * r = this^2, r != this (HAC 14.16)
466
- */
467
- bi_internal function squareTo(r:BigInteger):void {
468
- var x:BigInteger = abs();
469
- var i:int = r.t = 2*x.t;
470
- while (--i>=0) r.a[i] = 0;
471
- for (i=0; i<x.t-1; ++i) {
472
- var c:int = x.am(i, x.a[i], r, 2*i, 0, 1);
473
- if ((r.a[i+x.t] += x.am(i+1, 2*x.a[i], r, 2*i+1, c, x.t-i-1)) >= DV) {
474
- r.a[i+x.t] -= DV;
475
- r.a[i+x.t+1] = 1;
476
- }
477
- }
478
- if (r.t>0) {
479
- r.a[r.t-1] += x.am(i, x.a[i], r, 2*i, 0, 1);
480
- }
481
- r.s = 0;
482
- r.clamp();
483
- }
484
- /**
485
- * divide this by m, quotient and remainder to q, r (HAC 14.20)
486
- * r != q, this != m. q or r may be null.
487
- */
488
- bi_internal function divRemTo(m:BigInteger, q:BigInteger = null, r:BigInteger = null):void {
489
- var pm:BigInteger = m.abs();
490
- if (pm.t <= 0) return;
491
- var pt:BigInteger = abs();
492
- if (pt.t < pm.t) {
493
- if (q!=null) q.fromInt(0);
494
- if (r!=null) copyTo(r);
495
- return;
496
- }
497
- if (r==null) r = nbi();
498
- var y:BigInteger = nbi();
499
- var ts:int = s;
500
- var ms:int = m.s;
501
- var nsh:int = DB-nbits(pm.a[pm.t-1]); // normalize modulus
502
- if (nsh>0) {
503
- pm.lShiftTo(nsh, y);
504
- pt.lShiftTo(nsh, r);
505
- } else {
506
- pm.copyTo(y);
507
- pt.copyTo(r);
508
- }
509
- var ys:int = y.t;
510
- var y0:int = y.a[ys-1];
511
- if (y0==0) return;
512
- var yt:Number = y0*(1<<F1)+((ys>1)?y.a[ys-2]>>F2:0);
513
- var d1:Number = FV/yt;
514
- var d2:Number = (1<<F1)/yt;
515
- var e:Number = 1<<F2;
516
- var i:int = r.t;
517
- var j:int = i-ys;
518
- var t:BigInteger = (q==null)?nbi():q;
519
- y.dlShiftTo(j,t);
520
- if (r.compareTo(t)>=0) {
521
- r.a[r.t++] = 1;
522
- r.subTo(t,r);
523
- }
524
- ONE.dlShiftTo(ys,t);
525
- t.subTo(y,y); // "negative" y so we can replace sub with am later.
526
- while(y.t<ys) y.(y.t++, 0);
527
- while(--j >= 0) {
528
- // Estimate quotient digit
529
- var qd:int = (r.a[--i]==y0)?DM:Number(r.a[i])*d1+(Number(r.a[i-1])+e)*d2;
530
- if ((r.a[i]+= y.am(0, qd, r, j, 0, ys))<qd) { // Try it out
531
- y.dlShiftTo(j, t);
532
- r.subTo(t,r);
533
- while (r.a[i]<--qd) {
534
- r.subTo(t,r);
535
- }
536
- }
537
- }
538
- if (q!=null) {
539
- r.drShiftTo(ys,q);
540
- if (ts!=ms) {
541
- ZERO.subTo(q,q);
542
- }
543
- }
544
- r.t = ys;
545
- r.clamp();
546
- if (nsh>0) {
547
- r.rShiftTo(nsh, r); // Denormalize remainder
548
- }
549
- if (ts<0) {
550
- ZERO.subTo(r,r);
551
- }
552
- }
553
- /**
554
- * return "-1/this % 2^DB"; useful for Mont. reduction
555
- * justification:
556
- * xy == 1 (mod n)
557
- * xy = 1+km
558
- * xy(2-xy) = (1+km)(1-km)
559
- * x[y(2-xy)] = 1-k^2.m^2
560
- * x[y(2-xy)] == 1 (mod m^2)
561
- * if y is 1/x mod m, then y(2-xy) is 1/x mod m^2
562
- * should reduce x and y(2-xy) by m^2 at each step to keep size bounded
563
- * [XXX unit test the living shit out of this.]
564
- */
565
- bi_internal function invDigit():int {
566
- if (t<1) return 0;
567
- var x:int = a[0];
568
- if ((x&1)==0) return 0;
569
- var y:int = x&3; // y == 1/x mod 2^2
570
- y = (y*(2-(x&0xf )*y)) &0xf; // y == 1/x mod 2^4
571
- y = (y*(2-(x&0xff)*y)) &0xff; // y == 1/x mod 2^8
572
- y = (y*(2-(((x&0xffff)*y)&0xffff)))&0xffff; // y == 1/x mod 2^16
573
- // last step - calculate inverse mod DV directly;
574
- // assumes 16 < DB <= 32 and assumes ability to handle 48-bit ints
575
- // XXX 48 bit ints? Whaaaa? is there an implicit float conversion in here?
576
- y = (y*(2-x*y%DV))%DV; // y == 1/x mod 2^dbits
577
- // we really want the negative inverse, and -DV < y < DV
578
- return (y>0)?DV-y:-y;
579
- }
580
- /**
581
- * true iff this is even
582
- */
583
- bi_internal function isEven():Boolean {
584
- return ((t>0)?(a[0]&1):s) == 0;
585
- }
586
- /**
587
- * this^e, e < 2^32, doing sqr and mul with "r" (HAC 14.79)
588
- */
589
- bi_internal function exp(e:int, z:IReduction):BigInteger {
590
- if (e > 0xffffffff || e < 1) return ONE;
591
- var r:BigInteger = nbi();
592
- var r2:BigInteger = nbi();
593
- var g:BigInteger = z.convert(this);
594
- var i:int = nbits(e)-1;
595
- g.copyTo(r);
596
- while(--i>=0) {
597
- z.sqrTo(r, r2);
598
- if ((e&(1<<i))>0) {
599
- z.mulTo(r2,g,r);
600
- } else {
601
- var t:BigInteger = r;
602
- r = r2;
603
- r2 = t;
604
- }
605
-
606
- }
607
- return z.revert(r);
608
- }
609
- bi_internal function intAt(str:String, index:int):int {
610
- return parseInt(str.charAt(index), 36);
611
- }
612
-
613
-
614
- protected function nbi():* {
615
- return new BigInteger;
616
- }
617
- /**
618
- * return bigint initialized to value
619
- */
620
- public static function nbv(value:int):BigInteger {
621
- var bn:BigInteger = new BigInteger;
622
- bn.fromInt(value);
623
- return bn;
624
- }
625
-
626
-
627
- // Functions above are sufficient for RSA encryption.
628
- // The stuff below is useful for decryption and key generation
629
-
630
- public static const lowprimes:Array = [2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71,73,79,83,89,97,101,103,107,109,113,127,131,137,139,149,151,157,163,167,173,179,181,191,193,197,199,211,223,227,229,233,239,241,251,257,263,269,271,277,281,283,293,307,311,313,317,331,337,347,349,353,359,367,373,379,383,389,397,401,409,419,421,431,433,439,443,449,457,461,463,467,479,487,491,499,503,509];
631
- public static const lplim:int = (1<<26)/lowprimes[lowprimes.length-1];
632
-
633
-
634
- public function clone():BigInteger {
635
- var r:BigInteger = new BigInteger;
636
- this.copyTo(r);
637
- return r;
638
- }
639
-
640
- /**
641
- *
642
- * @return value as integer
643
- *
644
- */
645
- public function intValue():int {
646
- if (s<0) {
647
- if (t==1) {
648
- return a[0]-DV;
649
- } else if (t==0) {
650
- return -1;
651
- }
652
- } else if (t==1) {
653
- return a[0];
654
- } else if (t==0) {
655
- return 0;
656
- }
657
- // assumes 16 < DB < 32
658
- return ((a[1]&((1<<(32-DB))-1))<<DB)|a[0];
659
- }
660
-
661
- /**
662
- *
663
- * @return value as byte
664
- *
665
- */
666
- public function byteValue():int {
667
- return (t==0)?s:(a[0]<<24)>>24;
668
- }
669
-
670
- /**
671
- *
672
- * @return value as short (assumes DB>=16)
673
- *
674
- */
675
- public function shortValue():int {
676
- return (t==0)?s:(a[0]<<16)>>16;
677
- }
678
-
679
- /**
680
- *
681
- * @param r
682
- * @return x s.t. r^x < DV
683
- *
684
- */
685
- protected function chunkSize(r:Number):int {
686
- return Math.floor(Math.LN2*DB/Math.log(r));
687
- }
688
-
689
- /**
690
- *
691
- * @return 0 if this ==0, 1 if this >0
692
- *
693
- */
694
- public function sigNum():int {
695
- if (s<0) {
696
- return -1;
697
- } else if (t<=0 || (t==1 && a[0]<=0)) {
698
- return 0;
699
- } else{
700
- return 1;
701
- }
702
- }
703
-
704
- /**
705
- *
706
- * @param b: radix to use
707
- * @return a string representing the integer converted to the radix.
708
- *
709
- */
710
- protected function toRadix(b:uint=10):String {
711
- if (sigNum()==0 || b<2 || b>32) return "0";
712
- var cs:int = chunkSize(b);
713
- var a:Number = Math.pow(b, cs);
714
- var d:BigInteger = nbv(a);
715
- var y:BigInteger = nbi();
716
- var z:BigInteger = nbi();
717
- var r:String = "";
718
- divRemTo(d, y, z);
719
- while (y.sigNum()>0) {
720
- r = (a+z.intValue()).toString(b).substr(1) + r;
721
- y.divRemTo(d,y,z);
722
- }
723
- return z.intValue().toString(b) + r;
724
- }
725
-
726
- /**
727
- *
728
- * @param s a string to convert from using radix.
729
- * @param b a radix
730
- *
731
- */
732
- protected function fromRadix(s:String, b:int = 10):void {
733
- fromInt(0);
734
- var cs:int = chunkSize(b);
735
- var d:Number = Math.pow(b, cs);
736
- var mi:Boolean = false;
737
- var j:int = 0;
738
- var w:int = 0;
739
- for (var i:int=0;i<s.length;++i) {
740
- var x:int = intAt(s, i);
741
- if (x<0) {
742
- if (s.charAt(i) == "-" && sigNum() == 0) {
743
- mi = true;
744
- }
745
- continue;
746
- }
747
- w = b*w+x;
748
- if (++j >= cs) {
749
- dMultiply(d);
750
- dAddOffset(w,0);
751
- j=0;
752
- w=0;
753
- }
754
- }
755
- if (j>0) {
756
- dMultiply(Math.pow(b,j));
757
- dAddOffset(w,0);
758
- }
759
- if (mi) {
760
- BigInteger.ZERO.subTo(this, this);
761
- }
762
- }
763
-
764
- // XXX function fromNumber not written yet.
765
-
766
- /**
767
- *
768
- * @return a byte array.
769
- *
770
- */
771
- public function toByteArray():ByteArray {
772
- var i:int = t;
773
- var r:ByteArray = new ByteArray;
774
- r[0] = s;
775
- var p:int = DB-(i*DB)%8;
776
- var d:int;
777
- var k:int=0;
778
- if (i-->0) {
779
- if (p<DB && (d=a[i]>>p)!=(s&DM)>>p) {
780
- r[k++] = d|(s<<(DB-p));
781
- }
782
- while (i>=0) {
783
- if(p<8) {
784
- d = (a[i]&((1<<p)-1))<<(8-p);
785
- d|= a[--i]>>(p+=DB-8);
786
- } else {
787
- d = (a[i]>>(p-=8))&0xff;
788
- if (p<=0) {
789
- p += DB;
790
- --i;
791
- }
792
- }
793
- if ((d&0x80)!=0) d|=-256;
794
- if (k==0 && (s&0x80)!=(d&0x80)) ++k;
795
- if (k>0 || d!=s) r[k++] = d;
796
- }
797
- }
798
- return r;
799
- }
800
-
801
- public function equals(a:BigInteger):Boolean {
802
- return compareTo(a)==0;
803
- }
804
- public function min(a:BigInteger):BigInteger {
805
- return (compareTo(a)<0)?this:a;
806
- }
807
- public function max(a:BigInteger):BigInteger {
808
- return (compareTo(a)>0)?this:a;
809
- }
810
-
811
- /**
812
- *
813
- * @param a a BigInteger to perform the operation with
814
- * @param op a Function implementing the operation
815
- * @param r a BigInteger to store the result of the operation
816
- *
817
- */
818
- protected function bitwiseTo(a:BigInteger, op:Function, r:BigInteger):void {
819
- var i:int;
820
- var f:int;
821
- var m:int = Math.min(a.t, t);
822
- for (i=0; i<m; ++i) {
823
- r.a[i] = op(this.a[i],a.a[i]);
824
- }
825
- if (a.t<t) {
826
- f = a.s&DM;
827
- for (i=m;i<t;++i) {
828
- r.a[i] = op(this.a[i],f);
829
- }
830
- r.t = t;
831
- } else {
832
- f = s&DM;
833
- for (i=m;i<a.t;++i) {
834
- r.a[i] = op(f,a.a[i]);
835
- }
836
- r.t = a.t;
837
- }
838
- r.s = op(s, a.s);
839
- r.clamp();
840
- }
841
-
842
- private function op_and(x:int, y:int):int {return x&y;}
843
- public function and(a:BigInteger):BigInteger {
844
- var r:BigInteger = new BigInteger;
845
- bitwiseTo(a, op_and, r);
846
- return r;
847
- }
848
-
849
- private function op_or(x:int, y:int):int {return x|y;}
850
- public function or(a:BigInteger):BigInteger {
851
- var r:BigInteger = new BigInteger;
852
- bitwiseTo(a, op_or, r);
853
- return r;
854
- }
855
-
856
- private function op_xor(x:int, y:int):int {return x^y;}
857
- public function xor(a:BigInteger):BigInteger {
858
- var r:BigInteger = new BigInteger;
859
- bitwiseTo(a, op_xor, r);
860
- return r;
861
- }
862
-
863
- private function op_andnot(x:int, y:int):int { return x&~y;}
864
- public function andNot(a:BigInteger):BigInteger {
865
- var r:BigInteger = new BigInteger;
866
- bitwiseTo(a, op_andnot, r);
867
- return r;
868
- }
869
-
870
- public function not():BigInteger {
871
- var r:BigInteger = new BigInteger;
872
- for (var i:int=0;i<t;++i) {
873
- r[i] = DM&~a[i];
874
- }
875
- r.t = t;
876
- r.s = ~s;
877
- return r;
878
- }
879
-
880
- public function shiftLeft(n:int):BigInteger {
881
- var r:BigInteger = new BigInteger;
882
- if (n<0) {
883
- rShiftTo(-n, r);
884
- } else {
885
- lShiftTo(n, r);
886
- }
887
- return r;
888
- }
889
- public function shiftRight(n:int):BigInteger {
890
- var r:BigInteger = new BigInteger;
891
- if (n<0) {
892
- lShiftTo(-n, r);
893
- } else {
894
- rShiftTo(n, r);
895
- }
896
- return r;
897
- }
898
-
899
- /**
900
- *
901
- * @param x
902
- * @return index of lowet 1-bit in x, x < 2^31
903
- *
904
- */
905
- private function lbit(x:int):int {
906
- if (x==0) return -1;
907
- var r:int = 0;
908
- if ((x&0xffff)==0) { x>>= 16; r += 16; }
909
- if ((x&0xff) == 0) { x>>= 8; r += 8; }
910
- if ((x&0xf) == 0) { x>>= 4; r += 4; }
911
- if ((x&0x3) == 0) { x>>= 2; r += 2; }
912
- if ((x&0x1) == 0) ++r;
913
- return r;
914
- }
915
-
916
- /**
917
- *
918
- * @return index of lowest 1-bit (or -1 if none)
919
- *
920
- */
921
- public function getLowestSetBit():int {
922
- for (var i:int=0;i<t;++i) {
923
- if (a[i]!=0) return i*DB+lbit(a[i]);
924
- }
925
- if (s<0) return t*DB;
926
- return -1;
927
- }
928
-
929
- /**
930
- *
931
- * @param x
932
- * @return number of 1 bits in x
933
- *
934
- */
935
- private function cbit(x:int):int {
936
- var r:uint =0;
937
- while (x!=0) { x &= x-1; ++r }
938
- return r;
939
- }
940
-
941
- /**
942
- *
943
- * @return number of set bits
944
- *
945
- */
946
- public function bitCount():int {
947
- var r:int=0;
948
- var x:int = s&DM;
949
- for (var i:int=0;i<t;++i) {
950
- r += cbit(a[i]^x);
951
- }
952
- return r;
953
- }
954
-
955
- /**
956
- *
957
- * @param n
958
- * @return true iff nth bit is set
959
- *
960
- */
961
- public function testBit(n:int):Boolean {
962
- var j:int = Math.floor(n/DB);
963
- if (j>=t) {
964
- return s!=0;
965
- }
966
- return ((a[j]&(1<<(n%DB)))!=0);
967
- }
968
-
969
- /**
970
- *
971
- * @param n
972
- * @param op
973
- * @return this op (1<<n)
974
- *
975
- */
976
- protected function changeBit(n:int,op:Function):BigInteger {
977
- var r:BigInteger = BigInteger.ONE.shiftLeft(n);
978
- bitwiseTo(r, op, r);
979
- return r;
980
- }
981
-
982
- /**
983
- *
984
- * @param n
985
- * @return this | (1<<n)
986
- *
987
- */
988
- public function setBit(n:int):BigInteger { return changeBit(n, op_or); }
989
-
990
- /**
991
- *
992
- * @param n
993
- * @return this & ~(1<<n)
994
- *
995
- */
996
- public function clearBit(n:int):BigInteger { return changeBit(n, op_andnot); }
997
-
998
- /**
999
- *
1000
- * @param n
1001
- * @return this ^ (1<<n)
1002
- *
1003
- */
1004
- public function flipBit(n:int):BigInteger { return changeBit(n, op_xor); }
1005
-
1006
- /**
1007
- *
1008
- * @param a
1009
- * @param r = this + a
1010
- *
1011
- */
1012
- protected function addTo(a:BigInteger, r:BigInteger):void {
1013
- var i:int = 0;
1014
- var c:int = 0;
1015
- var m:int = Math.min(a.t, t);
1016
- while (i<m) {
1017
- c += this.a[i] + a.a[i];
1018
- r.a[i++] = c&DM;
1019
- c>>=DB;
1020
- }
1021
- if (a.t < t) {
1022
- c += a.s;
1023
- while (i<t) {
1024
- c += this.a[i];
1025
- r.a[i++] = c&DM;
1026
- c >>= DB;
1027
- }
1028
- c += s;
1029
- } else {
1030
- c += s;
1031
- while (i<a.t) {
1032
- c += a.a[i];
1033
- r.a[i++] = c&DM;
1034
- c >>= DB;
1035
- }
1036
- c += a.s;
1037
- }
1038
- r.s = (c<0)?-1:0;
1039
- if (c>0) {
1040
- r.a[i++] = c;
1041
- } else if (c<-1) {
1042
- r.a[i++] = DV+c;
1043
- }
1044
- r.t = i;
1045
- r.clamp();
1046
- }
1047
-
1048
- /**
1049
- *
1050
- * @param a
1051
- * @return this + a
1052
- *
1053
- */
1054
- public function add(a:BigInteger):BigInteger {
1055
- var r:BigInteger = new BigInteger;
1056
- addTo(a,r);
1057
- return r;
1058
- }
1059
-
1060
- /**
1061
- *
1062
- * @param a
1063
- * @return this - a
1064
- *
1065
- */
1066
- public function subtract(a:BigInteger):BigInteger {
1067
- var r:BigInteger = new BigInteger;
1068
- subTo(a,r);
1069
- return r;
1070
- }
1071
-
1072
- /**
1073
- *
1074
- * @param a
1075
- * @return this * a
1076
- *
1077
- */
1078
- public function multiply(a:BigInteger):BigInteger {
1079
- var r:BigInteger = new BigInteger;
1080
- multiplyTo(a,r);
1081
- return r;
1082
- }
1083
-
1084
- /**
1085
- *
1086
- * @param a
1087
- * @return this / a
1088
- *
1089
- */
1090
- public function divide(a:BigInteger):BigInteger {
1091
- var r:BigInteger = new BigInteger;
1092
- divRemTo(a, r, null);
1093
- return r;
1094
- }
1095
-
1096
- public function remainder(a:BigInteger):BigInteger {
1097
- var r:BigInteger = new BigInteger;
1098
- divRemTo(a, null, r);
1099
- return r;
1100
- }
1101
-
1102
- /**
1103
- *
1104
- * @param a
1105
- * @return [this/a, this%a]
1106
- *
1107
- */
1108
- public function divideAndRemainder(a:BigInteger):Array {
1109
- var q:BigInteger = new BigInteger;
1110
- var r:BigInteger = new BigInteger;
1111
- divRemTo(a, q, r);
1112
- return [q,r];
1113
- }
1114
-
1115
- /**
1116
- *
1117
- * this *= n, this >=0, 1 < n < DV
1118
- *
1119
- * @param n
1120
- *
1121
- */
1122
- bi_internal function dMultiply(n:int):void {
1123
- a[t] = am(0, n-1, this, 0, 0, t);
1124
- ++t;
1125
- clamp();
1126
- }
1127
-
1128
- /**
1129
- *
1130
- * this += n << w words, this >= 0
1131
- *
1132
- * @param n
1133
- * @param w
1134
- *
1135
- */
1136
- bi_internal function dAddOffset(n:int, w:int):void {
1137
- while (t<=w) {
1138
- a[t++] = 0;
1139
- }
1140
- a[w] += n;
1141
- while (a[w] >= DV) {
1142
- a[w] -= DV;
1143
- if (++w >= t) {
1144
- a[t++] = 0;
1145
- }
1146
- ++a[w];
1147
- }
1148
- }
1149
-
1150
- /**
1151
- *
1152
- * @param e
1153
- * @return this^e
1154
- *
1155
- */
1156
- public function pow(e:int):BigInteger {
1157
- return exp(e, new NullReduction);
1158
- }
1159
-
1160
- /**
1161
- *
1162
- * @param a
1163
- * @param n
1164
- * @param r = lower n words of "this * a", a.t <= n
1165
- *
1166
- */
1167
- bi_internal function multiplyLowerTo(a:BigInteger, n:int, r:BigInteger):void {
1168
- var i:int = Math.min(t+a.t, n);
1169
- r.s = 0; // assumes a, this >= 0
1170
- r.t = i;
1171
- while (i>0) {
1172
- r.a[--i]=0;
1173
- }
1174
- var j:int;
1175
- for (j=r.t-t;i<j;++i) {
1176
- r.a[i+t] = am(0, a.a[i], r, i, 0, t);
1177
- }
1178
- for (j=Math.min(a.t,n);i<j;++i) {
1179
- am(0, a.a[i], r, i, 0, n-i);
1180
- }
1181
- r.clamp();
1182
- }
1183
-
1184
- /**
1185
- *
1186
- * @param a
1187
- * @param n
1188
- * @param r = "this * a" without lower n words, n > 0
1189
- *
1190
- */
1191
- bi_internal function multiplyUpperTo(a:BigInteger, n:int, r:BigInteger):void {
1192
- --n;
1193
- var i:int = r.t = t+a.t-n;
1194
- r.s = 0; // assumes a,this >= 0
1195
- while (--i>=0) {
1196
- r.a[i] = 0;
1197
- }
1198
- for (i=Math.max(n-t,0);i<a.t;++i) {
1199
- r.a[t+i-n] = am(n-i, a.a[i], r, 0, 0, t+i-n);
1200
- }
1201
- r.clamp();
1202
- r.drShiftTo(1,r);
1203
- }
1204
-
1205
- /**
1206
- *
1207
- * @param e
1208
- * @param m
1209
- * @return this^e % m (HAC 14.85)
1210
- *
1211
- */
1212
- public function modPow(e:BigInteger, m:BigInteger):BigInteger {
1213
- var i:int = e.bitLength();
1214
- var k:int;
1215
- var r:BigInteger = nbv(1);
1216
- var z:IReduction;
1217
-
1218
- if (i<=0) {
1219
- return r;
1220
- } else if (i<18) {
1221
- k=1;
1222
- } else if (i<48) {
1223
- k=3;
1224
- } else if (i<144) {
1225
- k=4;
1226
- } else if (i<768) {
1227
- k=5;
1228
- } else {
1229
- k=6;
1230
- }
1231
- if (i<8) {
1232
- z = new ClassicReduction(m);
1233
- } else if (m.isEven()) {
1234
- z = new BarrettReduction(m);
1235
- } else {
1236
- z = new MontgomeryReduction(m);
1237
- }
1238
- // precomputation
1239
- var g:Array = [];
1240
- var n:int = 3;
1241
- var k1:int = k-1;
1242
- var km:int = (1<<k)-1;
1243
- g[1] = z.convert(this);
1244
- if (k > 1) {
1245
- var g2:BigInteger = new BigInteger;
1246
- z.sqrTo(g[1], g2);
1247
- while (n<=km) {
1248
- g[n] = new BigInteger;
1249
- z.mulTo(g2, g[n-2], g[n]);
1250
- n += 2;
1251
- }
1252
- }
1253
-
1254
- var j:int = e.t-1;
1255
- var w:int;
1256
- var is1:Boolean = true;
1257
- var r2:BigInteger = new BigInteger;
1258
- var t:BigInteger;
1259
- i = nbits(e.a[j])-1;
1260
- while (j>=0) {
1261
- if (i>=k1) {
1262
- w = (e.a[j]>>(i-k1))&km;
1263
- } else {
1264
- w = (e.a[j]&((1<<(i+1))-1))<<(k1-i);
1265
- if (j>0) {
1266
- w |= e.a[j-1]>>(DB+i-k1);
1267
- }
1268
- }
1269
- n = k;
1270
- while ((w&1)==0) {
1271
- w >>= 1;
1272
- --n;
1273
- }
1274
- if ((i -= n) <0) {
1275
- i += DB;
1276
- --j;
1277
- }
1278
- if (is1) { // ret == 1, don't bother squaring or multiplying it
1279
- g[w].copyTo(r);
1280
- is1 = false;
1281
- } else {
1282
- while (n>1) {
1283
- z.sqrTo(r, r2);
1284
- z.sqrTo(r2, r);
1285
- n -= 2;
1286
- }
1287
- if (n>0) {
1288
- z.sqrTo(r, r2);
1289
- } else {
1290
- t = r;
1291
- r = r2;
1292
- r2 = t;
1293
- }
1294
- z.mulTo(r2, g[w], r);
1295
- }
1296
- while (j>=0 && (e.a[j]&(1<<i)) == 0) {
1297
- z.sqrTo(r, r2);
1298
- t = r;
1299
- r = r2;
1300
- r2 = t;
1301
- if (--i<0) {
1302
- i = DB-1;
1303
- --j;
1304
- }
1305
-
1306
- }
1307
- }
1308
- return z.revert(r);
1309
- }
1310
-
1311
- /**
1312
- *
1313
- * @param a
1314
- * @return gcd(this, a) (HAC 14.54)
1315
- *
1316
- */
1317
- public function gcd(a:BigInteger):BigInteger {
1318
- var x:BigInteger = (s<0)?negate():clone();
1319
- var y:BigInteger = (a.s<0)?a.negate():a.clone();
1320
- if (x.compareTo(y)<0) {
1321
- var t:BigInteger=x;
1322
- x=y;
1323
- y=t;
1324
- }
1325
- var i:int = x.getLowestSetBit();
1326
- var g:int = y.getLowestSetBit();
1327
- if (g<0) return x;
1328
- if (i<g) g= i;
1329
- if (g>0) {
1330
- x.rShiftTo(g, x);
1331
- y.rShiftTo(g, y);
1332
- }
1333
- while (x.sigNum()>0) {
1334
- if ((i = x.getLowestSetBit()) >0) {
1335
- x.rShiftTo(i, x);
1336
- }
1337
- if ((i = y.getLowestSetBit()) >0) {
1338
- y.rShiftTo(i, y);
1339
- }
1340
- if (x.compareTo(y) >= 0) {
1341
- x.subTo(y, x);
1342
- x.rShiftTo(1, x);
1343
- } else {
1344
- y.subTo(x, y);
1345
- y.rShiftTo(1, y);
1346
- }
1347
- }
1348
- if (g>0) {
1349
- y.lShiftTo(g, y);
1350
- }
1351
- return y;
1352
- }
1353
-
1354
- /**
1355
- *
1356
- * @param n
1357
- * @return this % n, n < 2^DB
1358
- *
1359
- */
1360
- protected function modInt(n:int):int {
1361
- if (n<=0) return 0;
1362
- var d:int = DV%n;
1363
- var r:int = (s<0)?n-1:0;
1364
- if (t>0) {
1365
- if (d==0) {
1366
- r = a[0]%n;
1367
- } else {
1368
- for (var i:int=t-1;i>=0;--i) {
1369
- r = (d*r+a[i])%n;
1370
- }
1371
- }
1372
- }
1373
- return r;
1374
- }
1375
-
1376
- /**
1377
- *
1378
- * @param m
1379
- * @return 1/this %m (HAC 14.61)
1380
- *
1381
- */
1382
- public function modInverse(m:BigInteger):BigInteger {
1383
- var ac:Boolean = m.isEven();
1384
- if ((isEven()&&ac) || m.sigNum()==0) {
1385
- return BigInteger.ZERO;
1386
- }
1387
- var u:BigInteger = m.clone();
1388
- var v:BigInteger = clone();
1389
- var a:BigInteger = nbv(1);
1390
- var b:BigInteger = nbv(0);
1391
- var c:BigInteger = nbv(0);
1392
- var d:BigInteger = nbv(1);
1393
- while (u.sigNum()!=0) {
1394
- while (u.isEven()) {
1395
- u.rShiftTo(1,u);
1396
- if (ac) {
1397
- if (!a.isEven() || !b.isEven()) {
1398
- a.addTo(this,a);
1399
- b.subTo(m,b);
1400
- }
1401
- a.rShiftTo(1,a);
1402
- } else if (!b.isEven()) {
1403
- b.subTo(m,b);
1404
- }
1405
- b.rShiftTo(1,b);
1406
- }
1407
- while (v.isEven()) {
1408
- v.rShiftTo(1,v);
1409
- if (ac) {
1410
- if (!c.isEven() || !d.isEven()) {
1411
- c.addTo(this,c);
1412
- d.subTo(m,d);
1413
- }
1414
- c.rShiftTo(1,c);
1415
- } else if (!d.isEven()) {
1416
- d.subTo(m,d);
1417
- }
1418
- d.rShiftTo(1,d);
1419
- }
1420
- if (u.compareTo(v)>=0) {
1421
- u.subTo(v,u);
1422
- if (ac) {
1423
- a.subTo(c,a);
1424
- }
1425
- b.subTo(d,b);
1426
- } else {
1427
- v.subTo(u,v);
1428
- if (ac) {
1429
- c.subTo(a,c);
1430
- }
1431
- d.subTo(b,d);
1432
- }
1433
- }
1434
- if (v.compareTo(BigInteger.ONE) != 0) {
1435
- return BigInteger.ZERO;
1436
- }
1437
- if (d.compareTo(m) >= 0) {
1438
- return d.subtract(m);
1439
- }
1440
- if (d.sigNum()<0) {
1441
- d.addTo(m,d);
1442
- } else {
1443
- return d;
1444
- }
1445
- if (d.sigNum()<0) {
1446
- return d.add(m);
1447
- } else {
1448
- return d;
1449
- }
1450
- }
1451
-
1452
- /**
1453
- *
1454
- * @param t
1455
- * @return primality with certainty >= 1-.5^t
1456
- *
1457
- */
1458
- public function isProbablePrime(t:int):Boolean {
1459
- var i:int;
1460
- var x:BigInteger = abs();
1461
- if (x.t == 1 && x.a[0]<=lowprimes[lowprimes.length-1]) {
1462
- for (i=0;i<lowprimes.length;++i) {
1463
- if (x[0]==lowprimes[i]) return true;
1464
- }
1465
- return false;
1466
- }
1467
- if (x.isEven()) return false;
1468
- i = 1;
1469
- while (i<lowprimes.length) {
1470
- var m:int = lowprimes[i];
1471
- var j:int = i+1;
1472
- while (j<lowprimes.length && m<lplim) {
1473
- m *= lowprimes[j++];
1474
- }
1475
- m = x.modInt(m);
1476
- while (i<j) {
1477
- if (m%lowprimes[i++]==0) {
1478
- return false;
1479
- }
1480
- }
1481
- }
1482
- return x.millerRabin(t);
1483
- }
1484
-
1485
- /**
1486
- *
1487
- * @param t
1488
- * @return true if probably prime (HAC 4.24, Miller-Rabin)
1489
- *
1490
- */
1491
- protected function millerRabin(t:int):Boolean {
1492
- var n1:BigInteger = subtract(BigInteger.ONE);
1493
- var k:int = n1.getLowestSetBit();
1494
- if (k<=0) {
1495
- return false;
1496
- }
1497
- var r:BigInteger = n1.shiftRight(k);
1498
- t = (t+1)>>1;
1499
- if (t>lowprimes.length) {
1500
- t = lowprimes.length;
1501
- }
1502
- var a:BigInteger = new BigInteger;
1503
- for (var i:int=0;i<t;++i) {
1504
- a.fromInt(lowprimes[i]);
1505
- var y:BigInteger = a.modPow(r, this);
1506
- if (y.compareTo(BigInteger.ONE)!=0 && y.compareTo(n1)!=0) {
1507
- var j:int = 1;
1508
- while (j++<k && y.compareTo(n1)!=0) {
1509
- y = y.modPowInt(2, this);
1510
- if (y.compareTo(BigInteger.ONE)==0) {
1511
- return false;
1512
- }
1513
- }
1514
- if (y.compareTo(n1)!=0) {
1515
- return false;
1516
- }
1517
- }
1518
- }
1519
- return true;
1520
- }
1521
-
1522
- /**
1523
- * Tweak our BigInteger until it looks prime enough
1524
- *
1525
- * @param bits
1526
- * @param t
1527
- *
1528
- */
1529
- public function primify(bits:int, t:int):void {
1530
- if (!testBit(bits-1)) { // force MSB set
1531
- bitwiseTo(BigInteger.ONE.shiftLeft(bits-1), op_or, this);
1532
- }
1533
- if (isEven()) {
1534
- dAddOffset(1,0); // force odd
1535
- }
1536
- while (!isProbablePrime(t)) {
1537
- dAddOffset(2,0);
1538
- while(bitLength()>bits) subTo(BigInteger.ONE.shiftLeft(bits-1),this);
1539
- }
1540
- }
1541
-
1542
- }
1543
- }