aboutsummaryrefslogtreecommitdiffstats
path: root/libraries/spongycastle/core/src/main/j2me
diff options
context:
space:
mode:
authorDominik Schürmann <dominik@dominikschuermann.de>2014-04-16 21:49:29 +0200
committerDominik Schürmann <dominik@dominikschuermann.de>2014-04-16 21:49:29 +0200
commitf7c243564f87d60df322ea9f62c1591920f8d32b (patch)
tree39d8554ccb83722843ced80297ec3e09aece00dd /libraries/spongycastle/core/src/main/j2me
parentb0c65729a98dfbd61063491a5facff2f782f56af (diff)
downloadopen-keychain-f7c243564f87d60df322ea9f62c1591920f8d32b.tar.gz
open-keychain-f7c243564f87d60df322ea9f62c1591920f8d32b.tar.bz2
open-keychain-f7c243564f87d60df322ea9f62c1591920f8d32b.zip
Use git submodules for libs, fix compilation, remove library sourcecode
Diffstat (limited to 'libraries/spongycastle/core/src/main/j2me')
-rw-r--r--libraries/spongycastle/core/src/main/j2me/java/io/FilterInputStream.java56
-rw-r--r--libraries/spongycastle/core/src/main/j2me/java/io/FilterOutputStream.java39
-rw-r--r--libraries/spongycastle/core/src/main/j2me/java/math/BigInteger.java3272
-rw-r--r--libraries/spongycastle/core/src/main/j2me/java/security/SecureRandom.java141
-rw-r--r--libraries/spongycastle/core/src/main/j2me/java/util/AbstractCollection.java261
-rw-r--r--libraries/spongycastle/core/src/main/j2me/java/util/AbstractList.java304
-rw-r--r--libraries/spongycastle/core/src/main/j2me/java/util/AbstractMap.java173
-rw-r--r--libraries/spongycastle/core/src/main/j2me/java/util/AbstractSet.java46
-rw-r--r--libraries/spongycastle/core/src/main/j2me/java/util/ArrayList.java107
-rw-r--r--libraries/spongycastle/core/src/main/j2me/java/util/Arrays.java118
-rw-r--r--libraries/spongycastle/core/src/main/j2me/java/util/Collection.java21
-rw-r--r--libraries/spongycastle/core/src/main/j2me/java/util/Collections.java365
-rw-r--r--libraries/spongycastle/core/src/main/j2me/java/util/HashMap.java279
-rw-r--r--libraries/spongycastle/core/src/main/j2me/java/util/HashSet.java71
-rw-r--r--libraries/spongycastle/core/src/main/j2me/java/util/Iterator.java9
-rw-r--r--libraries/spongycastle/core/src/main/j2me/java/util/List.java32
-rw-r--r--libraries/spongycastle/core/src/main/j2me/java/util/ListIterator.java20
-rw-r--r--libraries/spongycastle/core/src/main/j2me/java/util/Map.java54
-rw-r--r--libraries/spongycastle/core/src/main/j2me/java/util/Set.java38
-rw-r--r--libraries/spongycastle/core/src/main/j2me/java/util/StringTokenizer.java115
-rw-r--r--libraries/spongycastle/core/src/main/j2me/java/util/Sublist.java142
-rw-r--r--libraries/spongycastle/core/src/main/j2me/org/spongycastle/asn1/ASN1GeneralizedTime.java27
-rw-r--r--libraries/spongycastle/core/src/main/j2me/org/spongycastle/asn1/ASN1UTCTime.java22
-rw-r--r--libraries/spongycastle/core/src/main/j2me/org/spongycastle/asn1/DERFactory.java31
-rw-r--r--libraries/spongycastle/core/src/main/j2me/org/spongycastle/asn1/DERGeneralizedTime.java260
-rw-r--r--libraries/spongycastle/core/src/main/j2me/org/spongycastle/asn1/DERUTCTime.java259
-rw-r--r--libraries/spongycastle/core/src/main/j2me/org/spongycastle/asn1/DateFormatter.java272
-rw-r--r--libraries/spongycastle/core/src/main/j2me/org/spongycastle/asn1/StreamUtil.java88
-rw-r--r--libraries/spongycastle/core/src/main/j2me/org/spongycastle/asn1/cms/Time.java122
-rw-r--r--libraries/spongycastle/core/src/main/j2me/org/spongycastle/asn1/eac/PackedDate.java70
-rw-r--r--libraries/spongycastle/core/src/main/j2me/org/spongycastle/asn1/x509/Time.java122
-rw-r--r--libraries/spongycastle/core/src/main/j2me/org/spongycastle/crypto/encodings/PKCS1Encoding.java238
-rw-r--r--libraries/spongycastle/core/src/main/j2me/org/spongycastle/crypto/examples/MIDPTest.java177
-rw-r--r--libraries/spongycastle/core/src/main/j2me/org/spongycastle/crypto/examples/midp_test.jad6
-rw-r--r--libraries/spongycastle/core/src/main/j2me/org/spongycastle/crypto/examples/midp_test.mf7
-rw-r--r--libraries/spongycastle/core/src/main/j2me/org/spongycastle/crypto/params/SkeinParameters.java258
-rw-r--r--libraries/spongycastle/core/src/main/j2me/org/spongycastle/crypto/tls/OCSPStatusRequest.java131
-rw-r--r--libraries/spongycastle/core/src/main/j2me/org/spongycastle/crypto/tls/ServerNameList.java86
-rw-r--r--libraries/spongycastle/core/src/main/j2me/org/spongycastle/crypto/tls/UDPTransport.java107
-rw-r--r--libraries/spongycastle/core/src/main/j2me/org/spongycastle/math/ec/LongArray.java1997
-rw-r--r--libraries/spongycastle/core/src/main/j2me/org/spongycastle/util/Integers.java9
-rw-r--r--libraries/spongycastle/core/src/main/j2me/org/spongycastle/util/Selector.java8
-rw-r--r--libraries/spongycastle/core/src/main/j2me/org/spongycastle/util/Shorts.java9
-rw-r--r--libraries/spongycastle/core/src/main/j2me/org/spongycastle/util/test/SimpleTest.java84
44 files changed, 0 insertions, 10053 deletions
diff --git a/libraries/spongycastle/core/src/main/j2me/java/io/FilterInputStream.java b/libraries/spongycastle/core/src/main/j2me/java/io/FilterInputStream.java
deleted file mode 100644
index be11e9fb6..000000000
--- a/libraries/spongycastle/core/src/main/j2me/java/io/FilterInputStream.java
+++ /dev/null
@@ -1,56 +0,0 @@
-package java.io;
-
-public class FilterInputStream extends InputStream
-{
- protected InputStream in;
-
- protected FilterInputStream(InputStream underlying)
- {
- in = underlying;
- }
-
- public int read() throws IOException
- {
- return in.read();
- }
-
- public int read(byte[] b) throws IOException
- {
- return read(b, 0, b.length);
- }
-
- public int read(byte[] b, int offset, int length) throws IOException
- {
- return in.read(b, offset, length);
- }
-
- public long skip(long n) throws IOException
- {
- return in.skip(n);
- }
-
- public int available() throws IOException
- {
- return in.available();
- }
-
- public void close() throws IOException
- {
- in.close();
- }
-
- public void mark(int readlimit)
- {
- in.mark(readlimit);
- }
-
- public void reset() throws IOException
- {
- in.reset();
- }
-
- public boolean markSupported()
- {
- return in.markSupported();
- }
-}
diff --git a/libraries/spongycastle/core/src/main/j2me/java/io/FilterOutputStream.java b/libraries/spongycastle/core/src/main/j2me/java/io/FilterOutputStream.java
deleted file mode 100644
index 52cfb74b1..000000000
--- a/libraries/spongycastle/core/src/main/j2me/java/io/FilterOutputStream.java
+++ /dev/null
@@ -1,39 +0,0 @@
-package java.io;
-
-public class FilterOutputStream extends OutputStream
-{
- protected OutputStream out;
-
- protected FilterOutputStream(OutputStream underlying)
- {
- out = underlying;
- }
-
- public void write(int b) throws IOException
- {
- out.write(b);
- }
-
- public void write(byte[] b) throws IOException
- {
- write(b, 0, b.length);
- }
-
- public void write(byte[] b, int offset, int length) throws IOException
- {
- for (int i = 0; i < length; i++)
- {
- write(b[offset + i]);
- }
- }
-
- public void flush() throws IOException
- {
- out.flush();
- }
-
- public void close() throws IOException
- {
- out.close();
- }
-}
diff --git a/libraries/spongycastle/core/src/main/j2me/java/math/BigInteger.java b/libraries/spongycastle/core/src/main/j2me/java/math/BigInteger.java
deleted file mode 100644
index 9017caa01..000000000
--- a/libraries/spongycastle/core/src/main/j2me/java/math/BigInteger.java
+++ /dev/null
@@ -1,3272 +0,0 @@
-package java.math;
-
-import java.util.Random;
-import java.util.Stack;
-
-import org.spongycastle.util.Arrays;
-
-public class BigInteger
-{
- // The first few odd primes
- /*
- 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 521 523 541
- 547 557 563 569 571 577 587 593 599 601
- 607 613 617 619 631 641 643 647 653 659
- 661 673 677 683 691 701 709 719 727 733
- 739 743 751 757 761 769 773 787 797 809
- 811 821 823 827 829 839 853 857 859 863
- 877 881 883 887 907 911 919 929 937 941
- 947 953 967 971 977 983 991 997 1009
- 1013 1019 1021 1031 1033 1039 1049 1051
- 1061 1063 1069 1087 1091 1093 1097 1103
- 1109 1117 1123 1129 1151 1153 1163 1171
- 1181 1187 1193 1201 1213 1217 1223 1229
- 1231 1237 1249 1259 1277 1279 1283 1289
- */
-
- // Each list has a product < 2^31
- private static final int[][] primeLists = new int[][]
- {
- new int[]{ 3, 5, 7, 11, 13, 17, 19, 23 },
- new int[]{ 29, 31, 37, 41, 43 },
- new int[]{ 47, 53, 59, 61, 67 },
- new int[]{ 71, 73, 79, 83 },
- new int[]{ 89, 97, 101, 103 },
-
- new int[]{ 107, 109, 113, 127 },
- new int[]{ 131, 137, 139, 149 },
- new int[]{ 151, 157, 163, 167 },
- new int[]{ 173, 179, 181, 191 },
- new int[]{ 193, 197, 199, 211 },
-
- new int[]{ 223, 227, 229 },
- new int[]{ 233, 239, 241 },
- new int[]{ 251, 257, 263 },
- new int[]{ 269, 271, 277 },
- new int[]{ 281, 283, 293 },
-
- new int[]{ 307, 311, 313 },
- new int[]{ 317, 331, 337 },
- new int[]{ 347, 349, 353 },
- new int[]{ 359, 367, 373 },
- new int[]{ 379, 383, 389 },
-
- new int[]{ 397, 401, 409 },
- new int[]{ 419, 421, 431 },
- new int[]{ 433, 439, 443 },
- new int[]{ 449, 457, 461 },
- new int[]{ 463, 467, 479 },
-
- new int[]{ 487, 491, 499 },
- new int[]{ 503, 509, 521 },
- new int[]{ 523, 541, 547 },
- new int[]{ 557, 563, 569 },
- new int[]{ 571, 577, 587 },
-
- new int[]{ 593, 599, 601 },
- new int[]{ 607, 613, 617 },
- new int[]{ 619, 631, 641 },
- new int[]{ 643, 647, 653 },
- new int[]{ 659, 661, 673 },
-
- new int[]{ 677, 683, 691 },
- new int[]{ 701, 709, 719 },
- new int[]{ 727, 733, 739 },
- new int[]{ 743, 751, 757 },
- new int[]{ 761, 769, 773 },
-
- new int[]{ 787, 797, 809 },
- new int[]{ 811, 821, 823 },
- new int[]{ 827, 829, 839 },
- new int[]{ 853, 857, 859 },
- new int[]{ 863, 877, 881 },
-
- new int[]{ 883, 887, 907 },
- new int[]{ 911, 919, 929 },
- new int[]{ 937, 941, 947 },
- new int[]{ 953, 967, 971 },
- new int[]{ 977, 983, 991 },
-
- new int[]{ 997, 1009, 1013 },
- new int[]{ 1019, 1021, 1031 },
- new int[]{ 1033, 1039, 1049 },
- new int[]{ 1051, 1061, 1063 },
- new int[]{ 1069, 1087, 1091 },
-
- new int[]{ 1093, 1097, 1103 },
- new int[]{ 1109, 1117, 1123 },
- new int[]{ 1129, 1151, 1153 },
- new int[]{ 1163, 1171, 1181 },
- new int[]{ 1187, 1193, 1201 },
-
- new int[]{ 1213, 1217, 1223 },
- new int[]{ 1229, 1231, 1237 },
- new int[]{ 1249, 1259, 1277 },
- new int[]{ 1279, 1283, 1289 },
- };
-
- private static int[] primeProducts;
-
- private static final long IMASK = 0xffffffffL;
-
- private static final int[] ZERO_MAGNITUDE = new int[0];
-
- private static final BigInteger[] SMALL_CONSTANTS = new BigInteger[17];
- public static final BigInteger ZERO;
- public static final BigInteger ONE;
- public static final BigInteger TWO;
- public static final BigInteger THREE;
- public static final BigInteger TEN;
-
- private final static byte[] bitCounts =
- {
- 0, 1, 1, 2, 1, 2, 2, 3, 1, 2, 2, 3, 2, 3, 3, 4,
- 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5,
- 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5,
- 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6,
- 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5,
- 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6,
- 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6,
- 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7,
- 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5,
- 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6,
- 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6,
- 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7,
- 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6,
- 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7,
- 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7,
- 4, 5, 5, 6, 5, 6, 6, 7, 5, 6, 6, 7, 6, 7, 7, 8
- };
-
- private final static byte[] bitLengths =
- {
- 0, 1, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4,
- 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
- 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
- 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
- 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
- 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
- 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
- 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
- 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
- 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
- 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
- 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
- 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
- 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
- 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
- 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8
- };
-
- /*
- * These are the threshold bit-lengths (of an exponent) where we increase the window size.
- * These were calculated according to the expected savings in multiplications.
- * Some squares will also be saved on average, but we offset these against the extra storage costs.
- */
- private static final int[] EXP_WINDOW_THRESHOLDS = { 7, 25, 81, 241, 673, 1793, 4609, Integer.MAX_VALUE };
-
- static
- {
- /*
- * Avoid using large windows in VMs with little memory.
- * Window size limited to 2 below 256kB, then increased by one for every doubling,
- * i.e. at 512kB, 1MB, 2MB, etc...
- */
- long totalMemory = Runtime.getRuntime().totalMemory();
- if (totalMemory <= Integer.MAX_VALUE)
- {
- int mem = (int)totalMemory;
- int maxExpThreshold = 1 + bitLen(mem >> 18);
- if (maxExpThreshold < EXP_WINDOW_THRESHOLDS.length)
- {
- EXP_WINDOW_THRESHOLDS[maxExpThreshold] = Integer.MAX_VALUE;
- }
- }
-
- ZERO = new BigInteger(0, ZERO_MAGNITUDE);
- ZERO.nBits = 0; ZERO.nBitLength = 0;
-
- SMALL_CONSTANTS[0] = ZERO;
- int numBits = 0;
- for (int i = 1; i < SMALL_CONSTANTS.length; ++i)
- {
- SMALL_CONSTANTS[i] = createValueOf(i);
-
- // Check for a power of two
- if ((i & -i) == i)
- {
- SMALL_CONSTANTS[i].nBits = 1;
- ++numBits;
- }
-
- SMALL_CONSTANTS[i].nBitLength = numBits;
- }
-
- ONE = SMALL_CONSTANTS[1];
- TWO = SMALL_CONSTANTS[2];
- THREE = SMALL_CONSTANTS[3];
- TEN = SMALL_CONSTANTS[10];
-
- primeProducts = new int[primeLists.length];
-
- for (int i = 0; i < primeLists.length; ++i)
- {
- int[] primeList = primeLists[i];
- int product = 1;
- for (int j = 0; j < primeList.length; ++j)
- {
- product *= primeList[j];
- }
- primeProducts[i] = product;
- }
- }
-
- private int sign; // -1 means -ve; +1 means +ve; 0 means 0;
- private int[] magnitude; // array of ints with [0] being the most significant
- private int nBits = -1; // cache bitCount() value
- private int nBitLength = -1; // cache bitLength() value
- private int mQuote = 0; // -m^(-1) mod b, b = 2^32 (see Montgomery mult.), 0 when uninitialised
-
- private BigInteger()
- {
- }
-
- private BigInteger(int signum, int[] mag)
- {
- if (mag.length > 0)
- {
- sign = signum;
-
- int i = 0;
- while (i < mag.length && mag[i] == 0)
- {
- i++;
- }
- if (i == 0)
- {
- magnitude = mag;
- }
- else
- {
- // strip leading 0 bytes
- int[] newMag = new int[mag.length - i];
- System.arraycopy(mag, i, newMag, 0, newMag.length);
- magnitude = newMag;
- if (newMag.length == 0)
- sign = 0;
- }
- }
- else
- {
- magnitude = mag;
- sign = 0;
- }
- }
-
- public BigInteger(String sval) throws NumberFormatException
- {
- this(sval, 10);
- }
-
- public BigInteger(String sval, int rdx) throws NumberFormatException
- {
- if (sval.length() == 0)
- {
- throw new NumberFormatException("Zero length BigInteger");
- }
-
- if (rdx < Character.MIN_RADIX || rdx > Character.MAX_RADIX)
- {
- throw new NumberFormatException("Radix out of range");
- }
-
- int index = 0;
- sign = 1;
-
- if (sval.charAt(0) == '-')
- {
- if (sval.length() == 1)
- {
- throw new NumberFormatException("Zero length BigInteger");
- }
-
- sign = -1;
- index = 1;
- }
-
- // strip leading zeros from the string value
- while (index < sval.length() && Character.digit(sval.charAt(index), rdx) == 0)
- {
- index++;
- }
-
- if (index >= sval.length())
- {
- // zero value - we're done
- sign = 0;
- magnitude = new int[0];
- return;
- }
-
- //////
- // could we work out the max number of ints required to store
- // sval.length digits in the given base, then allocate that
- // storage in one hit?, then generate the magnitude in one hit too?
- //////
-
- BigInteger b = ZERO;
- BigInteger r = valueOf(rdx);
- while (index < sval.length())
- {
- // (optimise this by taking chunks of digits instead?)
- b = b.multiply(r).add(valueOf(Character.digit(sval.charAt(index), rdx)));
- index++;
- }
-
- magnitude = b.magnitude;
- return;
- }
-
- public BigInteger(byte[] bval) throws NumberFormatException
- {
- if (bval.length == 0)
- {
- throw new NumberFormatException("Zero length BigInteger");
- }
-
- sign = 1;
- if (bval[0] < 0)
- {
- sign = -1;
- }
- magnitude = makeMagnitude(bval, sign);
- if (magnitude.length == 0) {
- sign = 0;
- }
- }
-
- /**
- * If sign >= 0, packs bytes into an array of ints, most significant first
- * If sign < 0, packs 2's complement of bytes into
- * an array of ints, most significant first,
- * adding an extra most significant byte in case bval = {0x80, 0x00, ..., 0x00}
- *
- * @param bval
- * @param sign
- * @return
- */
- private int[] makeMagnitude(byte[] bval, int sign)
- {
- if (sign >= 0) {
- int i;
- int[] mag;
- int firstSignificant;
-
- // strip leading zeros
- for (firstSignificant = 0; firstSignificant < bval.length
- && bval[firstSignificant] == 0; firstSignificant++);
-
- if (firstSignificant >= bval.length)
- {
- return new int[0];
- }
-
- int nInts = (bval.length - firstSignificant + 3) / 4;
- int bCount = (bval.length - firstSignificant) % 4;
- if (bCount == 0)
- bCount = 4;
- // n = k * (n / k) + n % k
- // bval.length - firstSignificant + 3 = 4 * nInts + bCount - 1
- // bval.length - firstSignificant + 4 - bCount = 4 * nInts
-
- mag = new int[nInts];
- int v = 0;
- int magnitudeIndex = 0;
- for (i = firstSignificant; i < bval.length; i++)
- {
- // bval.length + 4 - bCount - i + 4 * magnitudeIndex = 4 * nInts
- // 1 <= bCount <= 4
- v <<= 8;
- v |= bval[i] & 0xff;
- bCount--;
- if (bCount <= 0)
- {
- mag[magnitudeIndex] = v;
- magnitudeIndex++;
- bCount = 4;
- v = 0;
- }
- }
- // 4 - bCount + 4 * magnitudeIndex = 4 * nInts
- // bCount = 4 * (1 + magnitudeIndex - nInts)
- // 1 <= bCount <= 4
- // So bCount = 4 and magnitudeIndex = nInts = mag.length
-
-// if (magnitudeIndex < mag.length)
-// {
-// mag[magnitudeIndex] = v;
-// }
- return mag;
- }
- else {
- int i;
- int[] mag;
- int firstSignificant;
-
-
- // strip leading -1's
- for (firstSignificant = 0; firstSignificant < bval.length - 1
- && bval[firstSignificant] == 0xff; firstSignificant++);
-
- int nBytes = bval.length;
- boolean leadingByte = false;
-
- // check for -2^(n-1)
- if (bval[firstSignificant] == 0x80) {
- for (i = firstSignificant + 1; i < bval.length; i++) {
- if (bval[i] != 0) {
- break;
- }
- }
- if (i == bval.length) {
- nBytes++;
- leadingByte = true;
- }
- }
-
- int nInts = (nBytes - firstSignificant + 3) / 4;
- int bCount = (nBytes - firstSignificant) % 4;
- if (bCount == 0)
- bCount = 4;
-
- // n = k * (n / k) + n % k
- // nBytes - firstSignificant + 3 = 4 * nInts + bCount - 1
- // nBytes - firstSignificant + 4 - bCount = 4 * nInts
- // 1 <= bCount <= 4
-
- mag = new int[nInts];
- int v = 0;
- int magnitudeIndex = 0;
- // nBytes + 4 - bCount - i + 4 * magnitudeIndex = 4 * nInts
- // 1 <= bCount <= 4
- if (leadingByte) {
- // bval.length + 1 + 4 - bCount - i + 4 * magnitudeIndex = 4 * nInts
- bCount--;
- // bval.length + 1 + 4 - (bCount + 1) - i + 4 * magnitudeIndex = 4 * nInts
- // bval.length + 4 - bCount - i + 4 * magnitudeIndex = 4 * nInts
- if (bCount <= 0)
- {
- magnitudeIndex++;
- bCount = 4;
- }
- // bval.length + 4 - bCount - i + 4 * magnitudeIndex = 4 * nInts
- // 1 <= bCount <= 4
- }
- for (i = firstSignificant; i < bval.length; i++)
- {
- // bval.length + 4 - bCount - i + 4 * magnitudeIndex = 4 * nInts
- // 1 <= bCount <= 4
- v <<= 8;
- v |= ~bval[i] & 0xff;
- bCount--;
- if (bCount <= 0)
- {
- mag[magnitudeIndex] = v;
- magnitudeIndex++;
- bCount = 4;
- v = 0;
- }
- }
- // 4 - bCount + 4 * magnitudeIndex = 4 * nInts
- // 1 <= bCount <= 4
- // bCount = 4 * (1 + magnitudeIndex - nInts)
- // 1 <= bCount <= 4
- // So bCount = 4 and magnitudeIndex = nInts = mag.length
-
-// if (magnitudeIndex < mag.length)
-// {
-// mag[magnitudeIndex] = v;
-// }
- mag = inc(mag);
-
- // TODO Fix above so that this is not necessary?
- if (mag[0] == 0)
- {
- int[] tmp = new int[mag.length - 1];
- System.arraycopy(mag, 1, tmp, 0, tmp.length);
- mag = tmp;
- }
-
- return mag;
- }
- }
-
-
-
- public BigInteger(int sign, byte[] mag) throws NumberFormatException
- {
- if (sign < -1 || sign > 1)
- {
- throw new NumberFormatException("Invalid sign value");
- }
-
- if (sign == 0)
- {
- this.sign = 0;
- this.magnitude = new int[0];
- return;
- }
-
- // copy bytes
- this.magnitude = makeMagnitude(mag, 1);
- this.sign = sign;
- }
-
- public BigInteger(int numBits, Random rnd) throws IllegalArgumentException
- {
- if (numBits < 0)
- {
- throw new IllegalArgumentException("numBits must be non-negative");
- }
-
- this.nBits = -1;
- this.nBitLength = -1;
-
- if (numBits == 0)
- {
-// this.sign = 0;
- this.magnitude = ZERO_MAGNITUDE;
- return;
- }
-
- int nBytes = (numBits + 7) / 8;
-
- byte[] b = new byte[nBytes];
- nextRndBytes(rnd, b);
-
- // strip off any excess bits in the MSB
- int xBits = BITS_PER_BYTE * nBytes - numBits;
- b[0] &= (byte)(255 >>> xBits);
-
- this.magnitude = makeMagnitude(b, 1);
- this.sign = this.magnitude.length < 1 ? 0 : 1;
- }
-
- private static final int BITS_PER_BYTE = 8;
- private static final int BYTES_PER_INT = 4;
-
- /**
- * strictly speaking this is a little dodgey from a compliance
- * point of view as it forces people to be using SecureRandom as
- * well, that being said - this implementation is for a crypto
- * library and you do have the source!
- */
- private void nextRndBytes(Random rnd, byte[] bytes)
- {
- int numRequested = bytes.length;
- int numGot = 0,
- r = 0;
-
- if (rnd instanceof java.security.SecureRandom)
- {
- ((java.security.SecureRandom)rnd).nextBytes(bytes);
- }
- else
- {
- for (; ; )
- {
- for (int i = 0; i < BYTES_PER_INT; i++)
- {
- if (numGot == numRequested)
- {
- return;
- }
-
- r = (i == 0 ? rnd.nextInt() : r >> BITS_PER_BYTE);
- bytes[numGot++] = (byte)r;
- }
- }
- }
- }
-
- public BigInteger(int bitLength, int certainty, Random rnd) throws ArithmeticException
- {
- if (bitLength < 2)
- {
- throw new ArithmeticException("bitLength < 2");
- }
-
- this.sign = 1;
- this.nBitLength = bitLength;
-
- if (bitLength == 2)
- {
- this.magnitude = rnd.nextInt() < 0
- ? TWO.magnitude
- : THREE.magnitude;
- return;
- }
-
- int nBytes = (bitLength + 7) / BITS_PER_BYTE;
- int xBits = BITS_PER_BYTE * nBytes - bitLength;
- byte mask = (byte)(255 >>> xBits);
-
- byte[] b = new byte[nBytes];
-
- for (;;)
- {
- nextRndBytes(rnd, b);
-
- // strip off any excess bits in the MSB
- b[0] &= mask;
-
- // ensure the leading bit is 1 (to meet the strength requirement)
- b[0] |= (byte)(1 << (7 - xBits));
-
- // ensure the trailing bit is 1 (i.e. must be odd)
- b[nBytes - 1] |= (byte)1;
-
- this.magnitude = makeMagnitude(b, 1);
- this.nBits = -1;
- this.mQuote = 0;
-
- if (certainty < 1)
- break;
-
- if (this.isProbablePrime(certainty))
- break;
-
- if (bitLength > 32)
- {
- for (int rep = 0; rep < 10000; ++rep)
- {
- int n = 33 + (rnd.nextInt() >>> 1) % (bitLength - 2);
- this.magnitude[this.magnitude.length - (n >>> 5)] ^= (1 << (n & 31));
- this.magnitude[this.magnitude.length - 1] ^= (rnd.nextInt() << 1);
- this.mQuote = 0;
-
- if (this.isProbablePrime(certainty))
- return;
- }
- }
- }
- }
-
- public BigInteger abs()
- {
- return (sign >= 0) ? this : this.negate();
- }
-
- /**
- * return a = a + b - b preserved.
- */
- private int[] add(int[] a, int[] b)
- {
- int tI = a.length - 1;
- int vI = b.length - 1;
- long m = 0;
-
- while (vI >= 0)
- {
- m += (((long)a[tI]) & IMASK) + (((long)b[vI--]) & IMASK);
- a[tI--] = (int)m;
- m >>>= 32;
- }
-
- while (tI >= 0 && m != 0)
- {
- m += (((long)a[tI]) & IMASK);
- a[tI--] = (int)m;
- m >>>= 32;
- }
-
- return a;
- }
-
- /**
- * return a = a + 1.
- */
- private int[] inc(int[] a)
- {
- int tI = a.length - 1;
- long m = 0;
-
- m = (((long)a[tI]) & IMASK) + 1L;
- a[tI--] = (int)m;
- m >>>= 32;
-
- while (tI >= 0 && m != 0)
- {
- m += (((long)a[tI]) & IMASK);
- a[tI--] = (int)m;
- m >>>= 32;
- }
-
- return a;
- }
-
- public BigInteger add(BigInteger val) throws ArithmeticException
- {
- if (val.sign == 0 || val.magnitude.length == 0)
- return this;
- if (this.sign == 0 || this.magnitude.length == 0)
- return val;
-
- if (val.sign < 0)
- {
- if (this.sign > 0)
- return this.subtract(val.negate());
- }
- else
- {
- if (this.sign < 0)
- return val.subtract(this.negate());
- }
-
- return addToMagnitude(val.magnitude);
- }
-
- private BigInteger addToMagnitude(
- int[] magToAdd)
- {
- int[] big, small;
- if (this.magnitude.length < magToAdd.length)
- {
- big = magToAdd;
- small = this.magnitude;
- }
- else
- {
- big = this.magnitude;
- small = magToAdd;
- }
-
- // Conservatively avoid over-allocation when no overflow possible
- int limit = Integer.MAX_VALUE;
- if (big.length == small.length)
- limit -= small[0];
-
- boolean possibleOverflow = (big[0] ^ (1 << 31)) >= limit;
- int extra = possibleOverflow ? 1 : 0;
-
- int[] bigCopy = new int[big.length + extra];
- System.arraycopy(big, 0, bigCopy, extra, big.length);
-
- bigCopy = add(bigCopy, small);
-
- return new BigInteger(this.sign, bigCopy);
- }
-
- public BigInteger and(
- BigInteger value)
- {
- if (this.sign == 0 || value.sign == 0)
- {
- return ZERO;
- }
-
- int[] aMag = this.sign > 0
- ? this.magnitude
- : add(ONE).magnitude;
-
- int[] bMag = value.sign > 0
- ? value.magnitude
- : value.add(ONE).magnitude;
-
- boolean resultNeg = sign < 0 && value.sign < 0;
- int resultLength = Math.max(aMag.length, bMag.length);
- int[] resultMag = new int[resultLength];
-
- int aStart = resultMag.length - aMag.length;
- int bStart = resultMag.length - bMag.length;
-
- for (int i = 0; i < resultMag.length; ++i)
- {
- int aWord = i >= aStart ? aMag[i - aStart] : 0;
- int bWord = i >= bStart ? bMag[i - bStart] : 0;
-
- if (this.sign < 0)
- {
- aWord = ~aWord;
- }
-
- if (value.sign < 0)
- {
- bWord = ~bWord;
- }
-
- resultMag[i] = aWord & bWord;
-
- if (resultNeg)
- {
- resultMag[i] = ~resultMag[i];
- }
- }
-
- BigInteger result = new BigInteger(1, resultMag);
-
- // TODO Optimise this case
- if (resultNeg)
- {
- result = result.not();
- }
-
- return result;
- }
-
- public BigInteger andNot(
- BigInteger value)
- {
- return and(value.not());
- }
-
- public int bitCount()
- {
- if (nBits == -1)
- {
- if (sign < 0)
- {
- // TODO Optimise this case
- nBits = not().bitCount();
- }
- else
- {
- int sum = 0;
- for (int i = 0; i < magnitude.length; i++)
- {
- sum += bitCounts[magnitude[i] & 0xff];
- sum += bitCounts[(magnitude[i] >> 8) & 0xff];
- sum += bitCounts[(magnitude[i] >> 16) & 0xff];
- sum += bitCounts[(magnitude[i] >> 24) & 0xff];
- }
- nBits = sum;
- }
- }
-
- return nBits;
- }
-
- private static int calcBitLength(int sign, int indx, int[] mag)
- {
- if (mag.length == 0)
- {
- return 0;
- }
-
- while (indx != mag.length && mag[indx] == 0)
- {
- indx++;
- }
-
- if (indx == mag.length)
- {
- return 0;
- }
-
- // bit length for everything after the first int
- int bitLength = 32 * ((mag.length - indx) - 1);
-
- // and determine bitlength of first int
- bitLength += bitLen(mag[indx]);
-
- if (sign < 0)
- {
- // Check if magnitude is a power of two
- boolean pow2 = ((bitCounts[mag[indx] & 0xff])
- + (bitCounts[(mag[indx] >> 8) & 0xff])
- + (bitCounts[(mag[indx] >> 16) & 0xff])
- + (bitCounts[(mag[indx] >> 24) & 0xff])) == 1;
-
- for (int i = indx + 1; i < mag.length && pow2; i++)
- {
- pow2 = (mag[i] == 0);
- }
-
- bitLength -= (pow2 ? 1 : 0);
- }
-
- return bitLength;
- }
-
- public int bitLength()
- {
- if (nBitLength == -1)
- {
- if (sign == 0)
- {
- nBitLength = 0;
- }
- else
- {
- nBitLength = calcBitLength(sign, 0, magnitude);
- }
- }
-
- return nBitLength;
- }
-
- //
- // bitLen(value) is the number of bits in value.
- //
- private static int bitLen(int w)
- {
- int t = w >>> 24;
- if (t != 0)
- {
- return 24 + bitLengths[t];
- }
- t = w >>> 16;
- if (t != 0)
- {
- return 16 + bitLengths[t];
- }
- t = w >>> 8;
- if (t != 0)
- {
- return 8 + bitLengths[t];
- }
- return bitLengths[w];
- }
-
- private boolean quickPow2Check()
- {
- return sign > 0 && nBits == 1;
- }
-
- public int compareTo(Object o)
- {
- return compareTo((BigInteger)o);
- }
-
- /**
- * unsigned comparison on two arrays - note the arrays may
- * start with leading zeros.
- */
- private static int compareTo(int xIndx, int[] x, int yIndx, int[] y)
- {
- while (xIndx != x.length && x[xIndx] == 0)
- {
- xIndx++;
- }
-
- while (yIndx != y.length && y[yIndx] == 0)
- {
- yIndx++;
- }
-
- return compareNoLeadingZeroes(xIndx, x, yIndx, y);
- }
-
- private static int compareNoLeadingZeroes(int xIndx, int[] x, int yIndx, int[] y)
- {
- int diff = (x.length - y.length) - (xIndx - yIndx);
-
- if (diff != 0)
- {
- return diff < 0 ? -1 : 1;
- }
-
- // lengths of magnitudes the same, test the magnitude values
-
- while (xIndx < x.length)
- {
- int v1 = x[xIndx++];
- int v2 = y[yIndx++];
-
- if (v1 != v2)
- {
- return (v1 ^ Integer.MIN_VALUE) < (v2 ^ Integer.MIN_VALUE) ? -1 : 1;
- }
- }
-
- return 0;
- }
-
- public int compareTo(BigInteger val)
- {
- if (sign < val.sign)
- return -1;
- if (sign > val.sign)
- return 1;
- if (sign == 0)
- return 0;
-
- return sign * compareTo(0, magnitude, 0, val.magnitude);
- }
-
- /**
- * return z = x / y - done in place (z value preserved, x contains the
- * remainder)
- */
- private int[] divide(int[] x, int[] y)
- {
- int xyCmp = compareTo(0, x, 0, y);
- int[] count;
-
- if (xyCmp > 0)
- {
- int[] c;
-
- int shift = calcBitLength(1, 0, x) - calcBitLength(1, 0, y);
-
- if (shift > 1)
- {
- c = shiftLeft(y, shift - 1);
- count = shiftLeft(ONE.magnitude, shift - 1);
- if (shift % 32 == 0)
- {
- // Special case where the shift is the size of an int.
- int countSpecial[] = new int[shift / 32 + 1];
- System.arraycopy(count, 0, countSpecial, 1, countSpecial.length - 1);
- countSpecial[0] = 0;
- count = countSpecial;
- }
- }
- else
- {
- c = new int[x.length];
- count = new int[1];
-
- System.arraycopy(y, 0, c, c.length - y.length, y.length);
- count[0] = 1;
- }
-
- int[] iCount = new int[count.length];
-
- subtract(0, x, 0, c);
- System.arraycopy(count, 0, iCount, 0, count.length);
-
- int xStart = 0;
- int cStart = 0;
- int iCountStart = 0;
-
- for (; ; )
- {
- int cmp = compareTo(xStart, x, cStart, c);
-
- while (cmp >= 0)
- {
- subtract(xStart, x, cStart, c);
- add(count, iCount);
- cmp = compareTo(xStart, x, cStart, c);
- }
-
- xyCmp = compareTo(xStart, x, 0, y);
-
- if (xyCmp > 0)
- {
- if (x[xStart] == 0)
- {
- xStart++;
- }
-
- shift = calcBitLength(1, cStart, c) - calcBitLength(1, xStart, x);
-
- if (shift == 0)
- {
- shiftRightOneInPlace(cStart, c);
- shiftRightOneInPlace(iCountStart, iCount);
- }
- else
- {
- shiftRightInPlace(cStart, c, shift);
- shiftRightInPlace(iCountStart, iCount, shift);
- }
-
- if (c[cStart] == 0)
- {
- cStart++;
- }
-
- if (iCount[iCountStart] == 0)
- {
- iCountStart++;
- }
- }
- else if (xyCmp == 0)
- {
- add(count, ONE.magnitude);
- for (int i = xStart; i != x.length; i++)
- {
- x[i] = 0;
- }
- break;
- }
- else
- {
- break;
- }
- }
- }
- else if (xyCmp == 0)
- {
- count = new int[1];
- count[0] = 1;
- Arrays.fill(x, 0);
- }
- else
- {
- count = new int[1];
- count[0] = 0;
- }
-
- return count;
- }
-
- public BigInteger divide(BigInteger val) throws ArithmeticException
- {
- if (val.sign == 0)
- {
- throw new ArithmeticException("Divide by zero");
- }
-
- if (sign == 0)
- {
- return BigInteger.ZERO;
- }
-
- if (val.compareTo(BigInteger.ONE) == 0)
- {
- return this;
- }
-
- int[] mag = new int[this.magnitude.length];
- System.arraycopy(this.magnitude, 0, mag, 0, mag.length);
-
- return new BigInteger(this.sign * val.sign, divide(mag, val.magnitude));
- }
-
- public BigInteger[] divideAndRemainder(BigInteger val) throws ArithmeticException
- {
- if (val.sign == 0)
- {
- throw new ArithmeticException("Divide by zero");
- }
-
- BigInteger biggies[] = new BigInteger[2];
-
- if (sign == 0)
- {
- biggies[0] = biggies[1] = BigInteger.ZERO;
-
- return biggies;
- }
-
- if (val.compareTo(BigInteger.ONE) == 0)
- {
- biggies[0] = this;
- biggies[1] = BigInteger.ZERO;
-
- return biggies;
- }
-
- int[] remainder = new int[this.magnitude.length];
- System.arraycopy(this.magnitude, 0, remainder, 0, remainder.length);
-
- int[] quotient = divide(remainder, val.magnitude);
-
- biggies[0] = new BigInteger(this.sign * val.sign, quotient);
- biggies[1] = new BigInteger(this.sign, remainder);
-
- return biggies;
- }
-
- public boolean equals(Object val)
- {
- if (val == this)
- return true;
-
- if (!(val instanceof BigInteger))
- return false;
- BigInteger biggie = (BigInteger)val;
-
- return sign == biggie.sign && isEqualMagnitude(biggie);
- }
-
- private boolean isEqualMagnitude(BigInteger x)
- {
- if (magnitude.length != x.magnitude.length)
- {
- return false;
- }
- for (int i = 0; i < magnitude.length; i++)
- {
- if (magnitude[i] != x.magnitude[i])
- {
- return false;
- }
- }
- return true;
- }
-
- public BigInteger gcd(BigInteger val)
- {
- if (val.sign == 0)
- return this.abs();
- else if (sign == 0)
- return val.abs();
-
- BigInteger r;
- BigInteger u = this;
- BigInteger v = val;
-
- while (v.sign != 0)
- {
- r = u.mod(v);
- u = v;
- v = r;
- }
-
- return u;
- }
-
- public int hashCode()
- {
- int hc = magnitude.length;
-
- if (magnitude.length > 0)
- {
- hc ^= magnitude[0];
-
- if (magnitude.length > 1)
- {
- hc ^= magnitude[magnitude.length - 1];
- }
- }
-
- return sign < 0 ? ~hc : hc;
- }
-
- public int intValue()
- {
- if (sign == 0)
- {
- return 0;
- }
-
- int n = magnitude.length;
-
- int val = magnitude[n - 1];
-
- return sign < 0 ? -val : val;
- }
-
- public byte byteValue()
- {
- return (byte)intValue();
- }
-
- /**
- * return whether or not a BigInteger is probably prime with a
- * probability of 1 - (1/2)**certainty.
- * <p>
- * From Knuth Vol 2, pg 395.
- */
- public boolean isProbablePrime(int certainty)
- {
- if (certainty <= 0)
- return true;
-
- if (sign == 0)
- return false;
-
- BigInteger n = this.abs();
-
- if (!n.testBit(0))
- return n.equals(TWO);
-
- if (n.equals(ONE))
- return false;
-
- // Try to reduce the penalty for really small numbers
- int numLists = Math.min(n.bitLength() - 1, primeLists.length);
-
- for (int i = 0; i < numLists; ++i)
- {
- int test = n.remainder(primeProducts[i]);
-
- int[] primeList = primeLists[i];
- for (int j = 0; j < primeList.length; ++j)
- {
- int prime = primeList[j];
- int qRem = test % prime;
- if (qRem == 0)
- {
- // We may find small numbers in the list
- return n.bitLength() < 16 && n.intValue() == prime;
- }
- }
- }
-
- //
- // let n = 1 + 2^kq
- //
- int s = n.getLowestSetBitMaskFirst(-1 << 1);
- BigInteger r = n.shiftRight(s);
-
- Random random = new Random();
-
- // NOTE: Avoid conversion to/from Montgomery form and check for R/-R as result instead
-
- BigInteger montRadix = ONE.shiftLeft(32 * n.magnitude.length).remainder(n);
- BigInteger minusMontRadix = n.subtract(montRadix);
-
- do
- {
- BigInteger a;
-
- do
- {
- a = new BigInteger(n.bitLength(), random);
- }
- while (a.sign == 0 || a.compareTo(n) >= 0
- || a.isEqualMagnitude(montRadix) || a.isEqualMagnitude(minusMontRadix));
-
- BigInteger y = modPowMonty(a, r, n, false);
-
- if (!y.equals(montRadix))
- {
- int j = 0;
- while (!y.equals(minusMontRadix))
- {
- if (++j == s)
- {
- return false;
- }
-
- y = modPowMonty(y, TWO, n, false);
-
- if (y.equals(montRadix))
- {
- return false;
- }
- }
- }
-
- certainty -= 2; // composites pass for only 1/4 possible 'a'
- }
- while (certainty > 0);
-
- return true;
- }
-
- public long longValue()
- {
- if (sign == 0)
- {
- return 0;
- }
-
- int n = magnitude.length;
-
- long val = magnitude[n - 1] & IMASK;
- if (n > 1)
- {
- val |= (magnitude[n - 2] & IMASK) << 32;
- }
-
- return sign < 0 ? -val : val;
- }
-
- public BigInteger max(BigInteger val)
- {
- return (compareTo(val) > 0) ? this : val;
- }
-
- public BigInteger min(BigInteger val)
- {
- return (compareTo(val) < 0) ? this : val;
- }
-
- public BigInteger mod(BigInteger m) throws ArithmeticException
- {
- if (m.sign <= 0)
- {
- throw new ArithmeticException("BigInteger: modulus is not positive");
- }
-
- BigInteger biggie = this.remainder(m);
-
- return (biggie.sign >= 0 ? biggie : biggie.add(m));
- }
-
- public BigInteger modInverse(BigInteger m) throws ArithmeticException
- {
- if (m.sign < 1)
- {
- throw new ArithmeticException("Modulus must be positive");
- }
-
- if (m.quickPow2Check())
- {
- return modInversePow2(m);
- }
-
- BigInteger d = this.remainder(m);
- BigInteger x = new BigInteger();
- BigInteger gcd = BigInteger.extEuclid(d, m, x, null);
-
- if (!gcd.equals(BigInteger.ONE))
- {
- throw new ArithmeticException("Numbers not relatively prime.");
- }
-
- if (x.compareTo(BigInteger.ZERO) < 0)
- {
- x = x.add(m);
- }
-
- return x;
- }
-
- private BigInteger modInversePow2(BigInteger m)
- {
-// assert m.signum() > 0;
-// assert m.bitCount() == 1;
-
- if (!testBit(0))
- {
- throw new ArithmeticException("Numbers not relatively prime.");
- }
-
- int pow = m.bitLength() - 1;
-
- long inv64 = modInverse64(longValue());
- if (pow < 64)
- {
- inv64 &= ((1L << pow) - 1);
- }
-
- BigInteger x = BigInteger.valueOf(inv64);
-
- if (pow > 64)
- {
- BigInteger d = this.remainder(m);
- int bitsCorrect = 64;
-
- do
- {
- BigInteger t = x.multiply(d).remainder(m);
- x = x.multiply(TWO.subtract(t)).remainder(m);
- bitsCorrect <<= 1;
- }
- while (bitsCorrect < pow);
-
- if (x.sign < 0)
- {
- x = x.add(m);
- }
- }
-
- return x;
- }
-
- private static int modInverse32(int d)
- {
- // Newton-Raphson division (roughly)
- int x = d; // d.x == 1 mod 2**3
- x *= 2 - d * x; // d.x == 1 mod 2**6
- x *= 2 - d * x; // d.x == 1 mod 2**12
- x *= 2 - d * x; // d.x == 1 mod 2**24
- x *= 2 - d * x; // d.x == 1 mod 2**48
-// assert d * x == 1;
- return x;
- }
-
- private static long modInverse64(long d)
- {
- // Newton's method with initial estimate "correct to 4 bits"
- long x = d + (((d + 1L) & 4L) << 1); // d.x == 1 mod 2**4
- x *= 2 - d * x; // d.x == 1 mod 2**8
- x *= 2 - d * x; // d.x == 1 mod 2**16
- x *= 2 - d * x; // d.x == 1 mod 2**32
- x *= 2 - d * x; // d.x == 1 mod 2**64
-// assert d * x == 1L;
- return x;
- }
-
- /**
- * Calculate the numbers u1, u2, and u3 such that:
- *
- * u1 * a + u2 * b = u3
- *
- * where u3 is the greatest common divider of a and b.
- * a and b using the extended Euclid algorithm (refer p. 323
- * of The Art of Computer Programming vol 2, 2nd ed).
- * This also seems to have the side effect of calculating
- * some form of multiplicative inverse.
- *
- * @param a First number to calculate gcd for
- * @param b Second number to calculate gcd for
- * @param u1Out the return object for the u1 value
- * @param u2Out the return object for the u2 value
- * @return The greatest common divisor of a and b
- */
- private static BigInteger extEuclid(BigInteger a, BigInteger b, BigInteger u1Out,
- BigInteger u2Out)
- {
- BigInteger u1 = BigInteger.ONE;
- BigInteger u3 = a;
- BigInteger v1 = BigInteger.ZERO;
- BigInteger v3 = b;
-
- while (v3.sign > 0)
- {
- BigInteger[] q = u3.divideAndRemainder(v3);
-
- BigInteger tn = u1.subtract(v1.multiply(q[0]));
- u1 = v1;
- v1 = tn;
-
- u3 = v3;
- v3 = q[1];
- }
-
- if (u1Out != null)
- {
- u1Out.sign = u1.sign;
- u1Out.magnitude = u1.magnitude;
- }
-
- if (u2Out != null)
- {
- BigInteger res = u3.subtract(u1.multiply(a)).divide(b);
- u2Out.sign = res.sign;
- u2Out.magnitude = res.magnitude;
- }
-
- return u3;
- }
-
- /**
- * zero out the array x
- */
- private static void zero(int[] x)
- {
- for (int i = 0; i != x.length; i++)
- {
- x[i] = 0;
- }
- }
-
- public BigInteger modPow(BigInteger e, BigInteger m)
- {
- if (m.sign < 1)
- {
- throw new ArithmeticException("Modulus must be positive");
- }
-
- if (m.equals(ONE))
- {
- return ZERO;
- }
-
- if (e.sign == 0)
- {
- return ONE;
- }
-
- if (sign == 0)
- {
- return ZERO;
- }
-
- boolean negExp = e.sign < 0;
- if (negExp)
- {
- e = e.negate();
- }
-
- BigInteger result = this.mod(m);
- if (!e.equals(ONE))
- {
- if ((m.magnitude[m.magnitude.length - 1] & 1) == 0)
- {
- result = modPowBarrett(result, e, m);
- }
- else
- {
- result = modPowMonty(result, e, m, true);
- }
- }
-
- if (negExp)
- {
- result = result.modInverse(m);
- }
-
- return result;
- }
-
- private static BigInteger modPowBarrett(BigInteger b, BigInteger e, BigInteger m)
- {
- int k = m.magnitude.length;
- BigInteger mr = ONE.shiftLeft((k + 1) << 5);
- BigInteger yu = ONE.shiftLeft(k << 6).divide(m);
-
- // Sliding window from MSW to LSW
- int extraBits = 0, expLength = e.bitLength();
- while (expLength > EXP_WINDOW_THRESHOLDS[extraBits])
- {
- ++extraBits;
- }
-
- int numPowers = 1 << extraBits;
- BigInteger[] oddPowers = new BigInteger[numPowers];
- oddPowers[0] = b;
-
- BigInteger b2 = reduceBarrett(b.square(), m, mr, yu);
-
- for (int i = 1; i < numPowers; ++i)
- {
- oddPowers[i] = reduceBarrett(oddPowers[i - 1].multiply(b2), m, mr, yu);
- }
-
- int[] windowList = getWindowList(e.magnitude, extraBits);
-// assert windowList.size() > 0;
-
- int window = windowList[0];
- int mult = window & 0xFF, lastZeroes = window >>> 8;
-
- BigInteger y;
- if (mult == 1)
- {
- y = b2;
- --lastZeroes;
- }
- else
- {
- y = oddPowers[mult >>> 1];
- }
-
- int windowPos = 1;
- while ((window = windowList[windowPos++]) != -1)
- {
- mult = window & 0xFF;
-
- int bits = lastZeroes + bitLengths[mult];
- for (int j = 0; j < bits; ++j)
- {
- y = reduceBarrett(y.square(), m, mr, yu);
- }
-
- y = reduceBarrett(y.multiply(oddPowers[mult >>> 1]), m, mr, yu);
-
- lastZeroes = window >>> 8;
- }
-
- for (int i = 0; i < lastZeroes; ++i)
- {
- y = reduceBarrett(y.square(), m, mr, yu);
- }
-
- return y;
- }
-
- private static BigInteger reduceBarrett(BigInteger x, BigInteger m, BigInteger mr, BigInteger yu)
- {
- int xLen = x.bitLength(), mLen = m.bitLength();
- if (xLen < mLen)
- {
- return x;
- }
-
- if (xLen - mLen > 1)
- {
- int k = m.magnitude.length;
-
- BigInteger q1 = x.divideWords(k - 1);
- BigInteger q2 = q1.multiply(yu); // TODO Only need partial multiplication here
- BigInteger q3 = q2.divideWords(k + 1);
-
- BigInteger r1 = x.remainderWords(k + 1);
- BigInteger r2 = q3.multiply(m); // TODO Only need partial multiplication here
- BigInteger r3 = r2.remainderWords(k + 1);
-
- x = r1.subtract(r3);
- if (x.sign < 0)
- {
- x = x.add(mr);
- }
- }
-
- while (x.compareTo(m) >= 0)
- {
- x = x.subtract(m);
- }
-
- return x;
- }
-
- private static BigInteger modPowMonty(BigInteger b, BigInteger e, BigInteger m, boolean convert)
- {
- int n = m.magnitude.length;
- int powR = 32 * n;
- boolean smallMontyModulus = m.bitLength() + 2 <= powR;
- int mDash = m.getMQuote();
-
- // tmp = this * R mod m
- if (convert)
- {
- b = b.shiftLeft(powR).remainder(m);
- }
-
- int[] yAccum = new int[n + 1];
-
- int[] zVal = b.magnitude;
-// assert zVal.length <= n;
- if (zVal.length < n)
- {
- int[] tmp = new int[n];
- System.arraycopy(zVal, 0, tmp, n - zVal.length, zVal.length);
- zVal = tmp;
- }
-
- // Sliding window from MSW to LSW
-
- int extraBits = 0;
-
- // Filter the common case of small RSA exponents with few bits set
- if (e.magnitude.length > 1 || e.bitCount() > 2)
- {
- int expLength = e.bitLength();
- while (expLength > EXP_WINDOW_THRESHOLDS[extraBits])
- {
- ++extraBits;
- }
- }
-
- int numPowers = 1 << extraBits;
- int[][] oddPowers = new int[numPowers][];
- oddPowers[0] = zVal;
-
- int[] zSquared = Arrays.clone(zVal);
- squareMonty(yAccum, zSquared, m.magnitude, mDash, smallMontyModulus);
-
- for (int i = 1; i < numPowers; ++i)
- {
- oddPowers[i] = Arrays.clone(oddPowers[i - 1]);
- multiplyMonty(yAccum, oddPowers[i], zSquared, m.magnitude, mDash, smallMontyModulus);
- }
-
- int[] windowList = getWindowList(e.magnitude, extraBits);
-// assert windowList.size() > 0;
-
- int window = windowList[0];
- int mult = window & 0xFF, lastZeroes = window >>> 8;
-
- int[] yVal;
- if (mult == 1)
- {
- yVal = zSquared;
- --lastZeroes;
- }
- else
- {
- yVal = Arrays.clone(oddPowers[mult >>> 1]);
- }
-
- int windowPos = 1;
- while ((window = windowList[windowPos++]) != -1)
- {
- mult = window & 0xFF;
-
- int bits = lastZeroes + bitLengths[mult];
- for (int j = 0; j < bits; ++j)
- {
- squareMonty(yAccum, yVal, m.magnitude, mDash, smallMontyModulus);
- }
-
- multiplyMonty(yAccum, yVal, oddPowers[mult >>> 1], m.magnitude, mDash, smallMontyModulus);
-
- lastZeroes = window >>> 8;
- }
-
- for (int i = 0; i < lastZeroes; ++i)
- {
- squareMonty(yAccum, yVal, m.magnitude, mDash, smallMontyModulus);
- }
-
- if (convert)
- {
- // Return y * R^(-1) mod m
- reduceMonty(yVal, m.magnitude, mDash);
- }
- else if (smallMontyModulus && compareTo(0, yVal, 0, m.magnitude) >= 0)
- {
- subtract(0, yVal, 0, m.magnitude);
- }
-
- return new BigInteger(1, yVal);
- }
-
- private static int[] getWindowList(int[] mag, int extraBits)
- {
- int v = mag[0];
-// assert v != 0;
- int leadingBits = bitLen(v);
-
- int resultSize = (((mag.length - 1) << 5) + leadingBits) / (1 + extraBits) + 2;
- int[] result = new int[resultSize];
- int resultPos = 0;
-
- int bitPos = 33 - leadingBits;
- v <<= bitPos;
-
- int mult = 1, multLimit = 1 << extraBits;
- int zeroes = 0;
-
- int i = 0;
- for (; ; )
- {
- for (; bitPos < 32; ++bitPos)
- {
- if (mult < multLimit)
- {
- mult = (mult << 1) | (v >>> 31);
- }
- else if (v < 0)
- {
- result[resultPos++] = createWindowEntry(mult, zeroes);
- mult = 1;
- zeroes = 0;
- }
- else
- {
- ++zeroes;
- }
-
- v <<= 1;
- }
-
- if (++i == mag.length)
- {
- result[resultPos++] = createWindowEntry(mult, zeroes);
- break;
- }
-
- v = mag[i];
- bitPos = 0;
- }
-
- result[resultPos] = -1;
- return result;
- }
-
- private static int createWindowEntry(int mult, int zeroes)
- {
- while ((mult & 1) == 0)
- {
- mult >>>= 1;
- ++zeroes;
- }
-
- return mult | (zeroes << 8);
- }
-
- /**
- * return w with w = x * x - w is assumed to have enough space.
- */
- private static int[] square(int[] w, int[] x)
- {
- // Note: this method allows w to be only (2 * x.Length - 1) words if result will fit
-// if (w.length != 2 * x.length)
-// {
-// throw new IllegalArgumentException("no I don't think so...");
-// }
-
- long c;
-
- int wBase = w.length - 1;
-
- for (int i = x.length - 1; i != 0; --i)
- {
- long v = x[i] & IMASK;
-
- c = v * v + (w[wBase] & IMASK);
- w[wBase] = (int)c;
- c >>>= 32;
-
- for (int j = i - 1; j >= 0; --j)
- {
- long prod = v * (x[j] & IMASK);
-
- c += (w[--wBase] & IMASK) + ((prod << 1) & IMASK);
- w[wBase] = (int)c;
- c = (c >>> 32) + (prod >>> 31);
- }
-
- c += w[--wBase] & IMASK;
- w[wBase] = (int)c;
-
- if (--wBase >= 0)
- {
- w[wBase] = (int)(c >> 32);
- }
- wBase += i;
- }
-
- c = x[0] & IMASK;
-
- c = c * c + (w[wBase] & IMASK);
- w[wBase] = (int)c;
-
- if (--wBase >= 0)
- {
- w[wBase] += (int)(c >> 32);
- }
-
- return w;
- }
-
- /**
- * return x with x = y * z - x is assumed to have enough space.
- */
- private static int[] multiply(int[] x, int[] y, int[] z)
- {
- int i = z.length;
-
- if (i < 1)
- {
- return x;
- }
-
- int xBase = x.length - y.length;
-
- for (;;)
- {
- long a = z[--i] & IMASK;
- long val = 0;
-
- for (int j = y.length - 1; j >= 0; j--)
- {
- val += a * (y[j] & IMASK) + (x[xBase + j] & IMASK);
-
- x[xBase + j] = (int)val;
-
- val >>>= 32;
- }
-
- --xBase;
-
- if (i < 1)
- {
- if (xBase >= 0)
- {
- x[xBase] = (int)val;
- }
- break;
- }
-
- x[xBase] = (int)val;
- }
-
- return x;
- }
-
- /**
- * Calculate mQuote = -m^(-1) mod b with b = 2^32 (32 = word size)
- */
- private int getMQuote()
- {
- if (mQuote != 0)
- {
- return mQuote; // already calculated
- }
-
-// assert this.sign > 0;
-
- int d = -magnitude[magnitude.length - 1];
-
-// assert (d & 1) != 0;
-
- return mQuote = modInverse32(d);
- }
-
- private static void reduceMonty(int[] x, int[] m, int mDash) // mDash = -m^(-1) mod b
- {
- // NOTE: Not a general purpose reduction (which would allow x up to twice the bitlength of m)
-// assert x.length == m.length;
-
- int n = m.length;
-
- for (int i = n - 1; i >= 0; --i)
- {
- int x0 = x[n - 1];
-
- long t = (x0 * mDash) & IMASK;
-
- long carry = t * (m[n - 1] & IMASK) + (x0 & IMASK);
-// assert (int)carry == 0;
- carry >>>= 32;
-
- for (int j = n - 2; j >= 0; --j)
- {
- carry += t * (m[j] & IMASK) + (x[j] & IMASK);
- x[j + 1] = (int)carry;
- carry >>>= 32;
- }
-
- x[0] = (int)carry;
-// assert carry >>> 32 == 0;
- }
-
- if (compareTo(0, x, 0, m) >= 0)
- {
- subtract(0, x, 0, m);
- }
- }
-
- /**
- * Montgomery multiplication: a = x * y * R^(-1) mod m
- * <br>
- * Based algorithm 14.36 of Handbook of Applied Cryptography.
- * <br>
- * <li> m, x, y should have length n </li>
- * <li> a should have length (n + 1) </li>
- * <li> b = 2^32, R = b^n </li>
- * <br>
- * The result is put in x
- * <br>
- * NOTE: the indices of x, y, m, a different in HAC and in Java
- */
- private static void multiplyMonty(int[] a, int[] x, int[] y, int[] m, int mDash, boolean smallMontyModulus)
- // mDash = -m^(-1) mod b
- {
- int n = m.length;
- long y_0 = y[n - 1] & IMASK;
-
- // 1. a = 0 (Notation: a = (a_{n} a_{n-1} ... a_{0})_{b} )
- for (int i = 0; i <= n; i++)
- {
- a[i] = 0;
- }
-
- // 2. for i from 0 to (n - 1) do the following:
- for (int i = n; i > 0; i--)
- {
- long a0 = a[n] & IMASK;
- long x_i = x[i - 1] & IMASK;
-
- long prod1 = x_i * y_0;
- long carry = (prod1 & IMASK) + a0;
-
- // 2.1 u = ((a[0] + (x[i] * y[0]) * mDash) mod b
- long u = ((int)carry * mDash) & IMASK;
-
- // 2.2 a = (a + x_i * y + u * m) / b
- long prod2 = u * (m[n - 1] & IMASK);
- carry += (prod2 & IMASK);
-// assert (int)carry == 0;
- carry = (carry >>> 32) + (prod1 >>> 32) + (prod2 >>> 32);
-
- for (int j = n - 2; j >= 0; j--)
- {
- prod1 = x_i * (y[j] & IMASK);
- prod2 = u * (m[j] & IMASK);
-
- carry += (prod1 & IMASK) + (prod2 & IMASK) + (a[j + 1] & IMASK);
- a[j + 2] = (int)carry;
- carry = (carry >>> 32) + (prod1 >>> 32) + (prod2 >>> 32);
- }
-
- carry += (a[0] & IMASK);
- a[1] = (int)carry;
- a[0] = (int)(carry >>> 32);
- }
-
- // 3. if x >= m the x = x - m
- if (!smallMontyModulus && compareTo(0, a, 0, m) >= 0)
- {
- subtract(0, a, 0, m);
- }
-
- // put the result in x
- System.arraycopy(a, 1, x, 0, n);
- }
-
- private static void squareMonty(int[] a, int[] x, int[] m, int mDash, boolean smallMontyModulus) // mDash = -m^(-1) mod b
- {
- int n = m.length;
-
- long x0 = x[n - 1] & IMASK;
-
- {
- long carry = x0 * x0;
- long u = ((int)carry * mDash) & IMASK;
-
- long prod1, prod2 = u * (m[n - 1] & IMASK);
- carry += (prod2 & IMASK);
-// assert (int)carry == 0;
- carry = (carry >>> 32) + (prod2 >>> 32);
-// assert carry <= (IMASK << 1);
-
- for (int j = n - 2; j >= 0; --j)
- {
- prod1 = x0 * (x[j] & IMASK);
- prod2 = u * (m[j] & IMASK);
-
- carry += ((prod1 << 1) & IMASK) + (prod2 & IMASK);
- a[j + 2] = (int)carry;
- carry = (carry >>> 32) + (prod1 >>> 31) + (prod2 >>> 32);
- }
-
- a[1] = (int)carry;
- a[0] = (int)(carry >>> 32);
- }
-
- for (int i = n - 2; i >= 0; --i)
- {
- int a0 = a[n];
- long u = (a0 * mDash) & IMASK;
-
- long carry = u * (m[n - 1] & IMASK) + (a0 & IMASK);
-// assert (int)carry == 0;
- carry >>>= 32;
-
- for (int j = n - 2; j > i; --j)
- {
- carry += u * (m[j] & IMASK) + (a[j + 1] & IMASK);
- a[j + 2] = (int)carry;
- carry >>>= 32;
- }
-
- long xi = x[i] & IMASK;
-
- {
- long prod1 = xi * xi;
- long prod2 = u * (m[i] & IMASK);
-
- carry += (prod1 & IMASK) + (prod2 & IMASK) + (a[i + 1] & IMASK);
- a[i + 2] = (int)carry;
- carry = (carry >>> 32) + (prod1 >>> 32) + (prod2 >>> 32);
- }
-
- for (int j = i - 1; j >= 0; --j)
- {
- long prod1 = xi * (x[j] & IMASK);
- long prod2 = u * (m[j] & IMASK);
-
- carry += ((prod1 << 1) & IMASK) + (prod2 & IMASK) + (a[j + 1] & IMASK);
- a[j + 2] = (int)carry;
- carry = (carry >>> 32) + (prod1 >>> 31) + (prod2 >>> 32);
- }
-
- carry += (a[0] & IMASK);
- a[1] = (int)carry;
- a[0] = (int)(carry >>> 32);
- }
-
- if (!smallMontyModulus && compareTo(0, a, 0, m) >= 0)
- {
- subtract(0, a, 0, m);
- }
-
- System.arraycopy(a, 1, x, 0, n);
- }
-
- public BigInteger multiply(BigInteger val)
- {
- if (val == this)
- return square();
-
- if ((sign & val.sign) == 0)
- return ZERO;
-
- if (val.quickPow2Check()) // val is power of two
- {
- BigInteger result = this.shiftLeft(val.abs().bitLength() - 1);
- return val.sign > 0 ? result : result.negate();
- }
-
- if (this.quickPow2Check()) // this is power of two
- {
- BigInteger result = val.shiftLeft(this.abs().bitLength() - 1);
- return this.sign > 0 ? result : result.negate();
- }
-
- int resLength = magnitude.length + val.magnitude.length;
- int[] res = new int[resLength];
-
- multiply(res, this.magnitude, val.magnitude);
-
- int resSign = sign ^ val.sign ^ 1;
- return new BigInteger(resSign, res);
- }
-
- public BigInteger square()
- {
- if (sign == 0)
- {
- return ZERO;
- }
- if (this.quickPow2Check())
- {
- return shiftLeft(abs().bitLength() - 1);
- }
- int resLength = magnitude.length << 1;
- if ((magnitude[0] >>> 16) == 0)
- {
- --resLength;
- }
- int[] res = new int[resLength];
- square(res, magnitude);
- return new BigInteger(1, res);
- }
-
- public BigInteger negate()
- {
- if (sign == 0)
- {
- return this;
- }
-
- return new BigInteger(-sign, magnitude);
- }
-
- public BigInteger not()
- {
- return add(ONE).negate();
- }
-
- public BigInteger pow(int exp) throws ArithmeticException
- {
- if (exp <= 0)
- {
- if (exp < 0)
- throw new ArithmeticException("Negative exponent");
-
- return ONE;
- }
-
- if (sign == 0)
- {
- return this;
- }
-
- if (quickPow2Check())
- {
- long powOf2 = (long)exp * (bitLength() - 1);
- if (powOf2 > Integer.MAX_VALUE)
- {
- throw new ArithmeticException("Result too large");
- }
- return ONE.shiftLeft((int)powOf2);
- }
-
- BigInteger y = BigInteger.ONE, z = this;
-
- while (exp != 0)
- {
- if ((exp & 0x1) == 1)
- {
- y = y.multiply(z);
- }
- exp >>= 1;
- if (exp != 0)
- {
- z = z.multiply(z);
- }
- }
-
- return y;
- }
-
- public static BigInteger probablePrime(
- int bitLength,
- Random random)
- {
- return new BigInteger(bitLength, 100, random);
- }
-
- private int remainder(int m)
- {
- long acc = 0;
- for (int pos = 0; pos < magnitude.length; ++pos)
- {
- acc = (acc << 32 | ((long)magnitude[pos] & 0xffffffffL)) % m;
- }
-
- return (int) acc;
- }
-
- /**
- * return x = x % y - done in place (y value preserved)
- */
- private static int[] remainder(int[] x, int[] y)
- {
- int xStart = 0;
- while (xStart < x.length && x[xStart] == 0)
- {
- ++xStart;
- }
-
- int yStart = 0;
- while (yStart < y.length && y[yStart] == 0)
- {
- ++yStart;
- }
-
- int xyCmp = compareNoLeadingZeroes(xStart, x, yStart, y);
-
- if (xyCmp > 0)
- {
- int yBitLength = calcBitLength(1, yStart, y);
- int xBitLength = calcBitLength(1, xStart, x);
- int shift = xBitLength - yBitLength;
-
- int[] c;
- int cStart = 0;
- int cBitLength = yBitLength;
- if (shift > 0)
- {
- c = shiftLeft(y, shift);
- cBitLength += shift;
- }
- else
- {
- int len = y.length - yStart;
- c = new int[len];
- System.arraycopy(y, yStart, c, 0, len);
- }
-
- for (;;)
- {
- if (cBitLength < xBitLength
- || compareNoLeadingZeroes(xStart, x, cStart, c) >= 0)
- {
- subtract(xStart, x, cStart, c);
-
- while (x[xStart] == 0)
- {
- if (++xStart == x.length)
- {
- return x;
- }
- }
-
- xyCmp = compareNoLeadingZeroes(xStart, x, yStart, y);
-
- if (xyCmp <= 0)
- {
- break;
- }
-
- //xBitLength = bitLength(xStart, x);
- xBitLength = 32 * (x.length - xStart - 1) + bitLen(x[xStart]);
- }
-
- shift = cBitLength - xBitLength;
-
- if (shift < 2)
- {
- shiftRightOneInPlace(cStart, c);
- --cBitLength;
- }
- else
- {
- shiftRightInPlace(cStart, c, shift);
- cBitLength -= shift;
- }
-
-// cStart = c.length - ((cBitLength + 31) / 32);
- while (c[cStart] == 0)
- {
- ++cStart;
- }
- }
- }
-
- if (xyCmp == 0)
- {
- for (int i = xStart; i < x.length; ++i)
- {
- x[i] = 0;
- }
- }
-
- return x;
- }
-
- public BigInteger remainder(BigInteger n) throws ArithmeticException
- {
- if (n.sign == 0)
- {
- throw new ArithmeticException("BigInteger: Divide by zero");
- }
-
- if (sign == 0)
- {
- return BigInteger.ZERO;
- }
-
- // For small values, use fast remainder method
- if (n.magnitude.length == 1)
- {
- int val = n.magnitude[0];
-
- if (val > 0)
- {
- if (val == 1)
- return ZERO;
-
- int rem = remainder(val);
-
- return rem == 0
- ? ZERO
- : new BigInteger(sign, new int[]{ rem });
- }
- }
-
- if (compareTo(0, magnitude, 0, n.magnitude) < 0)
- return this;
-
- int[] res;
- if (n.quickPow2Check()) // n is power of two
- {
- // TODO Move before small values branch above?
- res = lastNBits(n.abs().bitLength() - 1);
- }
- else
- {
- res = new int[this.magnitude.length];
- System.arraycopy(this.magnitude, 0, res, 0, res.length);
- res = remainder(res, n.magnitude);
- }
-
- return new BigInteger(sign, res);
- }
-
- private int[] lastNBits(
- int n)
- {
- if (n < 1)
- {
- return ZERO_MAGNITUDE;
- }
-
- int numWords = (n + 31) / 32;
- numWords = Math.min(numWords, this.magnitude.length);
- int[] result = new int[numWords];
-
- System.arraycopy(this.magnitude, this.magnitude.length - numWords, result, 0, numWords);
-
- int excessBits = (numWords << 5) - n;
- if (excessBits > 0)
- {
- result[0] &= (-1 >>> excessBits);
- }
-
- return result;
- }
-
- private BigInteger divideWords(int w)
- {
-// assert w >= 0;
- int n = magnitude.length;
- if (w >= n)
- {
- return ZERO;
- }
- int[] mag = new int[n - w];
- System.arraycopy(magnitude, 0, mag, 0, n - w);
- return new BigInteger(sign, mag);
- }
-
- private BigInteger remainderWords(int w)
- {
-// assert w >= 0;
- int n = magnitude.length;
- if (w >= n)
- {
- return this;
- }
- int[] mag = new int[w];
- System.arraycopy(magnitude, n - w, mag, 0, w);
- return new BigInteger(sign, mag);
- }
-
- /**
- * do a left shift - this returns a new array.
- */
- private static int[] shiftLeft(int[] mag, int n)
- {
- int nInts = n >>> 5;
- int nBits = n & 0x1f;
- int magLen = mag.length;
- int newMag[] = null;
-
- if (nBits == 0)
- {
- newMag = new int[magLen + nInts];
- System.arraycopy(mag, 0, newMag, 0, magLen);
- }
- else
- {
- int i = 0;
- int nBits2 = 32 - nBits;
- int highBits = mag[0] >>> nBits2;
-
- if (highBits != 0)
- {
- newMag = new int[magLen + nInts + 1];
- newMag[i++] = highBits;
- }
- else
- {
- newMag = new int[magLen + nInts];
- }
-
- int m = mag[0];
- for (int j = 0; j < magLen - 1; j++)
- {
- int next = mag[j + 1];
-
- newMag[i++] = (m << nBits) | (next >>> nBits2);
- m = next;
- }
-
- newMag[i] = mag[magLen - 1] << nBits;
- }
-
- return newMag;
- }
-
- private static int shiftLeftOneInPlace(int[] x, int carry)
- {
-// assert carry == 0 || carry == 1;
- int pos = x.length;
- while (--pos >= 0)
- {
- int val = x[pos];
- x[pos] = (val << 1) | carry;
- carry = val >>> 31;
- }
- return carry;
- }
-
- public BigInteger shiftLeft(int n)
- {
- if (sign == 0 || magnitude.length == 0)
- {
- return ZERO;
- }
-
- if (n == 0)
- {
- return this;
- }
-
- if (n < 0)
- {
- return shiftRight( -n);
- }
-
- BigInteger result = new BigInteger(sign, shiftLeft(magnitude, n));
-
- if (this.nBits != -1)
- {
- result.nBits = sign > 0
- ? this.nBits
- : this.nBits + n;
- }
-
- if (this.nBitLength != -1)
- {
- result.nBitLength = this.nBitLength + n;
- }
-
- return result;
- }
-
- /**
- * do a right shift - this does it in place.
- */
- private static void shiftRightInPlace(int start, int[] mag, int n)
- {
- int nInts = (n >>> 5) + start;
- int nBits = n & 0x1f;
- int magEnd = mag.length - 1;
-
- if (nInts != start)
- {
- int delta = (nInts - start);
-
- for (int i = magEnd; i >= nInts; i--)
- {
- mag[i] = mag[i - delta];
- }
- for (int i = nInts - 1; i >= start; i--)
- {
- mag[i] = 0;
- }
- }
-
- if (nBits != 0)
- {
- int nBits2 = 32 - nBits;
- int m = mag[magEnd];
-
- for (int i = magEnd; i >= nInts + 1; i--)
- {
- int next = mag[i - 1];
-
- mag[i] = (m >>> nBits) | (next << nBits2);
- m = next;
- }
-
- mag[nInts] >>>= nBits;
- }
- }
-
- /**
- * do a right shift by one - this does it in place.
- */
- private static void shiftRightOneInPlace(int start, int[] mag)
- {
- int magEnd = mag.length - 1;
-
- int m = mag[magEnd];
-
- for (int i = magEnd; i > start; i--)
- {
- int next = mag[i - 1];
-
- mag[i] = (m >>> 1) | (next << 31);
- m = next;
- }
-
- mag[start] >>>= 1;
- }
-
- public BigInteger shiftRight(int n)
- {
- if (n == 0)
- {
- return this;
- }
-
- if (n < 0)
- {
- return shiftLeft( -n);
- }
-
- if (n >= bitLength())
- {
- return (this.sign < 0 ? valueOf( -1) : BigInteger.ZERO);
- }
-
- int[] res = new int[this.magnitude.length];
- System.arraycopy(this.magnitude, 0, res, 0, res.length);
- shiftRightInPlace(0, res, n);
-
- return new BigInteger(this.sign, res);
-
- // TODO Port C# version's optimisations...
- }
-
- public int signum()
- {
- return sign;
- }
-
- /**
- * returns x = x - y - we assume x is >= y
- */
- private static int[] subtract(int xStart, int[] x, int yStart, int[] y)
- {
- int iT = x.length;
- int iV = y.length;
- long m;
- int borrow = 0;
-
- do
- {
- m = ((long)x[--iT] & IMASK) - ((long)y[--iV] & IMASK) + borrow;
- x[iT] = (int)m;
-
-// borrow = (m < 0) ? -1 : 0;
- borrow = (int)(m >> 63);
- }
- while (iV > yStart);
-
- if (borrow != 0)
- {
- while (--x[--iT] == -1)
- {
- }
- }
-
- return x;
- }
-
- public BigInteger subtract(BigInteger val)
- {
- if (val.sign == 0 || val.magnitude.length == 0)
- {
- return this;
- }
- if (sign == 0 || magnitude.length == 0)
- {
- return val.negate();
- }
- if (this.sign != val.sign)
- {
- return this.add(val.negate());
- }
-
- int compare = compareTo(0, magnitude, 0, val.magnitude);
- if (compare == 0)
- {
- return ZERO;
- }
-
- BigInteger bigun, littlun;
- if (compare < 0)
- {
- bigun = val;
- littlun = this;
- }
- else
- {
- bigun = this;
- littlun = val;
- }
-
- int res[] = new int[bigun.magnitude.length];
-
- System.arraycopy(bigun.magnitude, 0, res, 0, res.length);
-
- return new BigInteger(this.sign * compare, subtract(0, res, 0, littlun.magnitude));
- }
-
- public byte[] toByteArray()
- {
- if (sign == 0)
- {
- return new byte[1];
- }
-
- int bitLength = bitLength();
- byte[] bytes = new byte[bitLength / 8 + 1];
-
- int magIndex = magnitude.length;
- int bytesIndex = bytes.length;
-
- if (sign > 0)
- {
- while (magIndex > 1)
- {
- int mag = magnitude[--magIndex];
- bytes[--bytesIndex] = (byte) mag;
- bytes[--bytesIndex] = (byte)(mag >>> 8);
- bytes[--bytesIndex] = (byte)(mag >>> 16);
- bytes[--bytesIndex] = (byte)(mag >>> 24);
- }
-
- int lastMag = magnitude[0];
- while ((lastMag & 0xFFFFFF00) != 0)
- {
- bytes[--bytesIndex] = (byte) lastMag;
- lastMag >>>= 8;
- }
-
- bytes[--bytesIndex] = (byte) lastMag;
- }
- else
- {
- boolean carry = true;
-
- while (magIndex > 1)
- {
- int mag = ~magnitude[--magIndex];
-
- if (carry)
- {
- carry = (++mag == 0);
- }
-
- bytes[--bytesIndex] = (byte) mag;
- bytes[--bytesIndex] = (byte)(mag >>> 8);
- bytes[--bytesIndex] = (byte)(mag >>> 16);
- bytes[--bytesIndex] = (byte)(mag >>> 24);
- }
-
- int lastMag = magnitude[0];
-
- if (carry)
- {
- // Never wraps because magnitude[0] != 0
- --lastMag;
- }
-
- while ((lastMag & 0xFFFFFF00) != 0)
- {
- bytes[--bytesIndex] = (byte) ~lastMag;
- lastMag >>>= 8;
- }
-
- bytes[--bytesIndex] = (byte) ~lastMag;
-
- if (bytesIndex > 0)
- {
- bytes[--bytesIndex] = (byte)0xFF;
- }
- }
-
- return bytes;
- }
-
- public BigInteger xor(BigInteger val)
- {
- if (this.sign == 0)
- {
- return val;
- }
-
- if (val.sign == 0)
- {
- return this;
- }
-
- int[] aMag = this.sign > 0
- ? this.magnitude
- : this.add(ONE).magnitude;
-
- int[] bMag = val.sign > 0
- ? val.magnitude
- : val.add(ONE).magnitude;
-
- boolean resultNeg = (sign < 0 && val.sign >= 0) || (sign >= 0 && val.sign < 0);
- int resultLength = Math.max(aMag.length, bMag.length);
- int[] resultMag = new int[resultLength];
-
- int aStart = resultMag.length - aMag.length;
- int bStart = resultMag.length - bMag.length;
-
- for (int i = 0; i < resultMag.length; ++i)
- {
- int aWord = i >= aStart ? aMag[i - aStart] : 0;
- int bWord = i >= bStart ? bMag[i - bStart] : 0;
-
- if (this.sign < 0)
- {
- aWord = ~aWord;
- }
-
- if (val.sign < 0)
- {
- bWord = ~bWord;
- }
-
- resultMag[i] = aWord ^ bWord;
-
- if (resultNeg)
- {
- resultMag[i] = ~resultMag[i];
- }
- }
-
- BigInteger result = new BigInteger(1, resultMag);
-
- if (resultNeg)
- {
- result = result.not();
- }
-
- return result;
- }
-
- public BigInteger or(
- BigInteger value)
- {
- if (this.sign == 0)
- {
- return value;
- }
-
- if (value.sign == 0)
- {
- return this;
- }
-
- int[] aMag = this.sign > 0
- ? this.magnitude
- : this.add(ONE).magnitude;
-
- int[] bMag = value.sign > 0
- ? value.magnitude
- : value.add(ONE).magnitude;
-
- boolean resultNeg = sign < 0 || value.sign < 0;
- int resultLength = Math.max(aMag.length, bMag.length);
- int[] resultMag = new int[resultLength];
-
- int aStart = resultMag.length - aMag.length;
- int bStart = resultMag.length - bMag.length;
-
- for (int i = 0; i < resultMag.length; ++i)
- {
- int aWord = i >= aStart ? aMag[i - aStart] : 0;
- int bWord = i >= bStart ? bMag[i - bStart] : 0;
-
- if (this.sign < 0)
- {
- aWord = ~aWord;
- }
-
- if (value.sign < 0)
- {
- bWord = ~bWord;
- }
-
- resultMag[i] = aWord | bWord;
-
- if (resultNeg)
- {
- resultMag[i] = ~resultMag[i];
- }
- }
-
- BigInteger result = new BigInteger(1, resultMag);
-
- if (resultNeg)
- {
- result = result.not();
- }
-
- return result;
- }
-
- public BigInteger setBit(int n)
- throws ArithmeticException
- {
- if (n < 0)
- {
- throw new ArithmeticException("Bit address less than zero");
- }
-
- if (testBit(n))
- {
- return this;
- }
-
- // TODO Handle negative values and zero
- if (sign > 0 && n < (bitLength() - 1))
- {
- return flipExistingBit(n);
- }
-
- return or(ONE.shiftLeft(n));
- }
-
- public BigInteger clearBit(int n)
- throws ArithmeticException
- {
- if (n < 0)
- {
- throw new ArithmeticException("Bit address less than zero");
- }
-
- if (!testBit(n))
- {
- return this;
- }
-
- // TODO Handle negative values
- if (sign > 0 && n < (bitLength() - 1))
- {
- return flipExistingBit(n);
- }
-
- return andNot(ONE.shiftLeft(n));
- }
-
- public BigInteger flipBit(int n)
- throws ArithmeticException
- {
- if (n < 0)
- {
- throw new ArithmeticException("Bit address less than zero");
- }
-
- // TODO Handle negative values and zero
- if (sign > 0 && n < (bitLength() - 1))
- {
- return flipExistingBit(n);
- }
-
- return xor(ONE.shiftLeft(n));
- }
-
- private BigInteger flipExistingBit(int n)
- {
- int[] mag = new int[this.magnitude.length];
- System.arraycopy(this.magnitude, 0, mag, 0, mag.length);
- mag[mag.length - 1 - (n >>> 5)] ^= (1 << (n & 31)); // Flip 0 bit to 1
- //mag[mag.Length - 1 - (n / 32)] |= (1 << (n % 32));
- return new BigInteger(this.sign, mag);
- }
-
- public String toString()
- {
- return toString(10);
- }
-
- public String toString(int rdx)
- {
- if (magnitude == null)
- {
- return "null";
- }
- if (sign == 0)
- {
- return "0";
- }
- if (rdx < Character.MIN_RADIX || rdx > Character.MAX_RADIX)
- {
- rdx = 10;
- }
-
-
- // NOTE: This *should* be unnecessary, since the magnitude *should* never have leading zero digits
- int firstNonZero = 0;
- while (firstNonZero < magnitude.length)
- {
- if (magnitude[firstNonZero] != 0)
- {
- break;
- }
- ++firstNonZero;
- }
-
- if (firstNonZero == magnitude.length)
- {
- return "0";
- }
-
-
- StringBuffer sb = new StringBuffer();
- if (sign == -1)
- {
- sb.append('-');
- }
-
- switch (rdx)
- {
- case 2:
- {
- int pos = firstNonZero;
- sb.append(Integer.toBinaryString(magnitude[pos]));
- while (++pos < magnitude.length)
- {
- appendZeroExtendedString(sb, Integer.toBinaryString(magnitude[pos]), 32);
- }
- break;
- }
- case 4:
- {
- int pos = firstNonZero;
- int mag = magnitude[pos];
- if (mag < 0)
- {
- sb.append(Integer.toString(mag >>> 30, 4));
- mag &= (1 << 30) - 1;
- appendZeroExtendedString(sb, Integer.toString(mag, 4), 15);
- }
- else
- {
- sb.append(Integer.toString(mag, 4));
- }
- int mask = (1 << 16) - 1;
- while (++pos < magnitude.length)
- {
- mag = magnitude[pos];
- appendZeroExtendedString(sb, Integer.toString(mag >>> 16, 4), 8);
- appendZeroExtendedString(sb, Integer.toString(mag & mask, 4), 8);
- }
- break;
- }
- case 8:
- {
- long mask = (1L << 63) - 1;
- BigInteger u = this.abs();
- int bits = u.bitLength();
- Stack S = new Stack();
- while (bits > 63)
- {
- S.push(Long.toString((u.longValue() & mask),8));
- u = u.shiftRight(63);
- bits -= 63;
- }
- sb.append(Long.toString(u.longValue(), 8));
- while (!S.empty())
- {
- appendZeroExtendedString(sb, (String)S.pop(), 21);
- }
- break;
- }
- case 16:
- {
- int pos = firstNonZero;
- sb.append(Integer.toHexString(magnitude[pos]));
- while (++pos < magnitude.length)
- {
- appendZeroExtendedString(sb, Integer.toHexString(magnitude[pos]), 8);
- }
- break;
- }
- default:
- {
- BigInteger q = this.abs();
- if (q.bitLength() < 64)
- {
- sb.append(Long.toString(q.longValue(), rdx));
- break;
- }
-
- // Based on algorithm 1a from chapter 4.4 in Seminumerical Algorithms (Knuth)
-
- // Work out the largest power of 'rdx' that is a positive 64-bit integer
- // TODO possibly cache power/exponent against radix?
- long limit = Long.MAX_VALUE / rdx;
- long power = rdx;
- int exponent = 1;
- while (power <= limit)
- {
- power *= rdx;
- ++exponent;
- }
-
- BigInteger bigPower = BigInteger.valueOf(power);
-
- Stack S = new Stack();
- while (q.compareTo(bigPower) >= 0)
- {
- BigInteger[] qr = q.divideAndRemainder(bigPower);
- S.push(Long.toString(qr[1].longValue(), rdx));
- q = qr[0];
- }
-
- sb.append(Long.toString(q.longValue(), rdx));
- while (!S.empty())
- {
- appendZeroExtendedString(sb, (String)S.pop(), exponent);
- }
- break;
- }
- }
-
- return sb.toString();
- }
-
- private static void appendZeroExtendedString(StringBuffer sb, String s, int minLength)
- {
- for (int len = s.length(); len < minLength; ++len)
- {
- sb.append('0');
- }
- sb.append(s);
- }
-
- public static BigInteger valueOf(long val)
- {
- if (val >= 0 && val < SMALL_CONSTANTS.length)
- {
- return SMALL_CONSTANTS[(int)val];
- }
-
- return createValueOf(val);
- }
-
- private static BigInteger createValueOf(long val)
- {
- if (val < 0)
- {
- if (val == Long.MIN_VALUE)
- {
- return valueOf(~val).not();
- }
-
- return valueOf(-val).negate();
- }
-
- // store val into a byte array
- byte[] b = new byte[8];
- for (int i = 0; i < 8; i++)
- {
- b[7 - i] = (byte)val;
- val >>= 8;
- }
-
- return new BigInteger(b);
- }
-
- public int getLowestSetBit()
- {
- if (this.sign == 0)
- {
- return -1;
- }
-
- return getLowestSetBitMaskFirst(-1);
- }
-
- private int getLowestSetBitMaskFirst(int firstWordMask)
- {
- int w = magnitude.length, offset = 0;
-
- int word = magnitude[--w] & firstWordMask;
-// assert magnitude[0] != 0;
-
- while (word == 0)
- {
- word = magnitude[--w];
- offset += 32;
- }
-
- while ((word & 0xFF) == 0)
- {
- word >>>= 8;
- offset += 8;
- }
-
- while ((word & 1) == 0)
- {
- word >>>= 1;
- ++offset;
- }
-
- return offset;
- }
-
- public boolean testBit(int n)
- throws ArithmeticException
- {
- if (n < 0)
- {
- throw new ArithmeticException("Bit position must not be negative");
- }
-
- if (sign < 0)
- {
- return !not().testBit(n);
- }
-
- int wordNum = n / 32;
- if (wordNum >= magnitude.length)
- return false;
-
- int word = magnitude[magnitude.length - 1 - wordNum];
- return ((word >> (n % 32)) & 1) > 0;
- }
-}
diff --git a/libraries/spongycastle/core/src/main/j2me/java/security/SecureRandom.java b/libraries/spongycastle/core/src/main/j2me/java/security/SecureRandom.java
deleted file mode 100644
index a6a562a4d..000000000
--- a/libraries/spongycastle/core/src/main/j2me/java/security/SecureRandom.java
+++ /dev/null
@@ -1,141 +0,0 @@
-package java.security;
-
-import java.util.Random;
-
-import org.spongycastle.crypto.digests.SHA1Digest;
-import org.spongycastle.crypto.digests.SHA256Digest;
-import org.spongycastle.crypto.prng.RandomGenerator;
-import org.spongycastle.crypto.prng.DigestRandomGenerator;
-
-/**
- * An implementation of SecureRandom specifically for the light-weight API, JDK
- * 1.0, and the J2ME. Random generation is based on the traditional SHA1 with
- * counter. Calling setSeed will always increase the entropy of the hash.
- * <p>
- * <b>Do not use this class without calling setSeed at least once</b>! There
- * are some example seed generators in the org.spongycastle.prng package.
- */
-public class SecureRandom extends java.util.Random
-{
- // Note: all objects of this class should be deriving their random data from
- // a single generator appropriate to the digest being used.
- private static final RandomGenerator sha1Generator = new DigestRandomGenerator(new SHA1Digest());
- private static final RandomGenerator sha256Generator = new DigestRandomGenerator(new SHA256Digest());
-
- protected RandomGenerator generator;
-
- // public constructors
- public SecureRandom()
- {
- this(sha1Generator);
- setSeed(System.currentTimeMillis());
- }
-
- public SecureRandom(byte[] inSeed)
- {
- this(sha1Generator);
- setSeed(inSeed);
- }
-
- protected SecureRandom(
- RandomGenerator generator)
- {
- super(0);
- this.generator = generator;
- }
-
- // protected constructors
- // protected SecureRandom(SecureRandomSpi srs, Provider provider);
-
- // public class methods
- public static SecureRandom getInstance(String algorithm)
- {
- if (algorithm.equals("SHA1PRNG"))
- {
- return new SecureRandom(sha1Generator);
- }
- if (algorithm.equals("SHA256PRNG"))
- {
- return new SecureRandom(sha256Generator);
- }
- return new SecureRandom(); // follow old behaviour
- }
-
- public static SecureRandom getInstance(String algorithm, String provider)
- {
- return getInstance(algorithm);
- }
-
- public static byte[] getSeed(int numBytes)
- {
- byte[] rv = new byte[numBytes];
-
- sha1Generator.addSeedMaterial(System.currentTimeMillis());
- sha1Generator.nextBytes(rv);
-
- return rv;
- }
-
- // public instance methods
- public byte[] generateSeed(int numBytes)
- {
- byte[] rv = new byte[numBytes];
-
- nextBytes(rv);
-
- return rv;
- }
-
- // public final Provider getProvider();
- public void setSeed(byte[] inSeed)
- {
- generator.addSeedMaterial(inSeed);
- }
-
- // public methods overriding random
- public void nextBytes(byte[] bytes)
- {
- generator.nextBytes(bytes);
- }
-
- public void setSeed(long rSeed)
- {
- if (rSeed != 0) // to avoid problems with Random calling setSeed in construction
- {
- generator.addSeedMaterial(rSeed);
- }
- }
-
- public int nextInt()
- {
- byte[] intBytes = new byte[4];
-
- nextBytes(intBytes);
-
- int result = 0;
-
- for (int i = 0; i < 4; i++)
- {
- result = (result << 8) + (intBytes[i] & 0xff);
- }
-
- return result;
- }
-
- protected final int next(int numBits)
- {
- int size = (numBits + 7) / 8;
- byte[] bytes = new byte[size];
-
- nextBytes(bytes);
-
- int result = 0;
-
- for (int i = 0; i < size; i++)
- {
- result = (result << 8) + (bytes[i] & 0xff);
- }
-
- return result & ((1 << numBits) - 1);
- }
-}
diff --git a/libraries/spongycastle/core/src/main/j2me/java/util/AbstractCollection.java b/libraries/spongycastle/core/src/main/j2me/java/util/AbstractCollection.java
deleted file mode 100644
index 44c85ee05..000000000
--- a/libraries/spongycastle/core/src/main/j2me/java/util/AbstractCollection.java
+++ /dev/null
@@ -1,261 +0,0 @@
-package java.util;
-
-public abstract class AbstractCollection
- implements Collection
-{
- protected AbstractCollection()
- {
- }
-
- public abstract Iterator iterator();
-
- public abstract int size();
-
- public boolean isEmpty()
- {
- return size() == 0;
- }
-
- public boolean contains(Object o)
- {
- Iterator it = iterator();
- while (it.hasNext())
- {
- Object e = it.next();
- if (o == null)
- {
- if (e == null)
- {
- return true;
- }
- }
- else
- {
- if (o.equals(e))
- {
- return true;
- }
- }
- }
- return false;
- }
-
- public Object[] toArray()
- {
- Object[] arObjects = new Object[size()];
- Iterator it = iterator();
- int i = 0;
- while (it.hasNext())
- {
- arObjects[i++] = it.next();
- }
- return arObjects;
- }
-
- public Object[] toArray(Object[] a)
- throws NullPointerException, ArrayStoreException
- //TODO: Check if this is realy compatible to SUN!!!
- {
- if (a == null)
- {
- throw new NullPointerException();
- }
-
- if (isEmpty())
- {
- return a;
- }
- Object[] arObjects = null;
- int size = size();
- if (a.length < size)
- {
- Iterator it = iterator();
- Object o = it.next();
- if (o == null) //no object or object is null
- {
- throw new ArrayStoreException(); //correct ?
- }
- throw new ArrayStoreException("please pass array of correct size");
- }
- else
- {
- arObjects = a;
- if (a.length > size)
- {
- arObjects[size] = null;
- }
-
- }
-
- Iterator it = iterator();
- int i = 0;
- while (it.hasNext())
- {
- Object o = it.next();
- arObjects[i++] = o;
- }
- return arObjects;
- }
-
- public boolean add(Object o)
- throws RuntimeException, NullPointerException, ClassCastException, IllegalArgumentException
- {
- throw new RuntimeException();
- }
-
- public boolean remove(Object o)
- throws RuntimeException
- {
- Iterator it = iterator();
- while (it.hasNext())
- {
- Object e = it.next();
- if (o == null)
- {
- if (e == null)
- {
- try
- {
- it.remove();
- }
- catch (RuntimeException ue)
- {
- throw ue;
- }
- return true;
- }
- }
- else
- {
- if (o.equals(e))
- {
- try
- {
- it.remove();
- }
- catch (RuntimeException ue)
- {
- throw ue;
- }
- return true;
- }
- }
- }
- return false;
- }
-
- public boolean containsAll(Collection c)
- {
- Iterator it = c.iterator();
- while (it.hasNext())
- {
- if (!contains(it.next()))
- {
- return false;
- }
- }
- return true;
- }
-
- public boolean addAll(Collection c)
- throws RuntimeException
- {
- Iterator it = c.iterator();
- boolean ret = false;
- while (it.hasNext())
- {
- try
- {
- ret |= add(it.next());
- }
- catch (RuntimeException ue)
- {
- throw ue;
- }
- }
- return ret;
- }
-
- public boolean removeAll(Collection c)
- throws RuntimeException
- {
- Iterator it = iterator();
- boolean ret = false;
- while (it.hasNext())
- {
- if (c.contains(it.next()))
- {
- try
- {
- it.remove();
- ret = true;
- }
- catch (RuntimeException ue)
- {
- throw ue;
- }
- }
- }
- return ret;
- }
-
- public boolean retainAll(Collection c)
- throws RuntimeException
- {
- Iterator it = iterator();
- boolean ret = false;
- while (it.hasNext())
- {
- if (!c.contains(it.next()))
- {
- try
- {
- it.remove();
- ret = true;
- }
- catch (RuntimeException ue)
- {
- throw ue;
- }
- }
- }
- return ret;
- }
-
- public void clear()
- throws RuntimeException
- {
- Iterator it = iterator();
- while (it.hasNext())
- {
- try
- {
- it.next();
- it.remove();
- }
- catch (RuntimeException ue)
- {
- throw ue;
- }
- }
- }
-
- public String toString()
- {
- StringBuffer ret = new StringBuffer("[");
- Iterator it = iterator();
- if (it.hasNext())
- {
- ret.append(String.valueOf(it.next()));
- }
- while (it.hasNext())
- {
- ret.append(", ");
- ret.append(String.valueOf(it.next()));
-
- }
- ret.append("]");
- return ret.toString();
- }
-
-}
diff --git a/libraries/spongycastle/core/src/main/j2me/java/util/AbstractList.java b/libraries/spongycastle/core/src/main/j2me/java/util/AbstractList.java
deleted file mode 100644
index dbb1dffc4..000000000
--- a/libraries/spongycastle/core/src/main/j2me/java/util/AbstractList.java
+++ /dev/null
@@ -1,304 +0,0 @@
-package java.util;
-
-public abstract class AbstractList
- extends AbstractCollection
- implements List
-{
- protected AbstractList al = this;
-
-
- protected AbstractList()
- {
- }
-
- public boolean add(Object o)
- throws RuntimeException, ClassCastException, IllegalArgumentException
- {
- try
- {
- add(size(), o);
- return true;
- }
- catch (RuntimeException ue)
- {
- throw ue;
- }
- }
-
- public abstract Object get(int index)
- throws IndexOutOfBoundsException;
-
- public Object set(int index, Object element)
- throws RuntimeException, ClassCastException, IllegalArgumentException, IndexOutOfBoundsException
- {
- throw new RuntimeException();
- }
-
- public void add(int index, Object element)
- throws RuntimeException, ClassCastException, IllegalArgumentException, IndexOutOfBoundsException
- {
- throw new RuntimeException();
- }
-
- public Object remove(int index)
- throws RuntimeException, IndexOutOfBoundsException
- {
- Object o = get(index);
-
- removeRange(index, index + 1);
- return o;
- }
-
- public int indexOf(Object o)
- {
- ListIterator li = listIterator();
- Object e;
- while (li.hasNext())
- {
- int index = li.nextIndex();
- e = li.next();
-
- if (o == null)
- {
- if (e == null)
- {
- return index;
- }
- }
- else
- {
- if (o.equals(e))
- {
- return index;
- }
- }
- }
- return -1;
- }
-
- public int lastIndexOf(Object o)
- {
- ListIterator li = listIterator(size());
- while (li.hasPrevious())
- {
- int index = li.previousIndex();
- Object e = li.previous();
- if (o == null)
- {
- if (e == null)
- {
- return index;
- }
- }
- else
- {
- if (o.equals(e))
- {
- return index;
- }
- }
- }
- return -1;
- }
-
- public void clear()
- throws RuntimeException
- {
- try
- {
- removeRange(0, size());
- }
- catch (RuntimeException ue)
- {
- throw ue;
- }
- }
-
- public boolean addAll(int index, Collection c)
- throws RuntimeException, ClassCastException, IllegalArgumentException, IndexOutOfBoundsException
- {
- Iterator it = c.iterator();
- boolean ret = false;
- while (it.hasNext())
- {
- try
- {
- add(index++, it.next());
- ret = true;
- }
- catch (RuntimeException ue)
- {
- throw ue;
- }
- }
- return ret;
- }
-
- public Iterator iterator()
- {
- return new AbstractListIterator(this, 0);
- }
-
- public ListIterator listIterator()
- {
- return listIterator(0);
- }
-
- public ListIterator listIterator(int index)
- throws IndexOutOfBoundsException
- {
- if (index < 0 || index > size())
- {
- throw new IndexOutOfBoundsException();
- }
- return new AbstractListListIterator(this, index);
- }
-
- public List subList(int fromIndex, int toIndex)
- throws IndexOutOfBoundsException, IllegalArgumentException
- {
- if (fromIndex < 0 || toIndex > size())
- {
- throw new IndexOutOfBoundsException();
- }
- if (fromIndex > toIndex)
- {
- throw new IllegalArgumentException();
- }
- return (List)new Sublist(this, fromIndex, toIndex);
- }
-
- public boolean equals(Object o)
- {
- if (o == this)
- {
- return true;
- }
- if (!(o instanceof List))
- {
- return false;
- }
- Iterator it1 = iterator();
- Iterator it2 = ((List)o).iterator();
- while (it1.hasNext())
- {
- if (!it2.hasNext())
- {
- return false;
- }
- Object e1 = it1.next();
- Object e2 = it2.next();
- if (e1 == null)
- {
- if (e2 != null)
- {
- return false;
- }
- }
- if (!e1.equals(e2))
- {
- return false;
- }
- }
- return true;
- }
-
- public int hashCode()
- {
- int hashCode = 1;
- Iterator it = iterator();
- while (it.hasNext())
- {
- Object o = it.next();
- hashCode = 31 * hashCode + (o == null ? 0 : o.hashCode());
- }
- return hashCode;
- }
-
- protected void removeRange(int fromIndex, int toIndex)
- {
- if (fromIndex == toIndex)
- {
- return;
- }
-
- ListIterator li = listIterator(fromIndex);
-
- int i = fromIndex;
- do
- {
- li.next();
- li.remove();
- i++;
- }
- while (li.hasNext() && i < toIndex);
- }
-
- private class AbstractListIterator
- implements Iterator
- {
- AbstractList m_al = null;
- int m_nextIndex = 0;
-
- public AbstractListIterator(AbstractList al, int index)
- {
- m_al = al;
- m_nextIndex = index;
- }
-
- public boolean hasNext()
- {
- return m_nextIndex < m_al.size();
- }
-
- public Object next()
- {
- return m_al.get(m_nextIndex++);
- }
-
- public void remove()
- {
- m_al.remove(m_nextIndex - 1);
- }
- }
-
- private class AbstractListListIterator
- extends AbstractListIterator
- implements ListIterator
- {
- public AbstractListListIterator(AbstractList al, int index)
- {
- super(al, index);
- }
-
- public boolean hasPrevious()
- {
- return m_nextIndex > 0;
- }
-
- public Object previous()// throws NoSuchElementException;
- {
- return m_al.get(--m_nextIndex);
- }
-
- public int nextIndex()
- {
- return m_nextIndex;
- }
-
- public int previousIndex()
- {
- return m_nextIndex - 1;
- }
-
- public void set(Object o) //throws RuntimeException, ClassCastException, IllegalArgumentException,IllegalStateException;
- {
- m_al.set(m_nextIndex - 1, o);
- }
-
- public void add(Object o)// throws RuntimeException, ClassCastException, IllegalArgumentException;
- {
- m_al.add(m_nextIndex - 1, o);
- }
- }
-}
diff --git a/libraries/spongycastle/core/src/main/j2me/java/util/AbstractMap.java b/libraries/spongycastle/core/src/main/j2me/java/util/AbstractMap.java
deleted file mode 100644
index 13c61ecfa..000000000
--- a/libraries/spongycastle/core/src/main/j2me/java/util/AbstractMap.java
+++ /dev/null
@@ -1,173 +0,0 @@
-package java.util;
-
-public abstract class AbstractMap
- implements Map
-{
-
- protected AbstractMap()
- {
- }
-
- public int size()
- {
- return entrySet().size();
- }
-
- public boolean isEmpty()
- {
- return size() == 0;
- }
-
- public boolean containsValue(Object value)
- {
- Iterator it = entrySet().iterator();
- while (it.hasNext())
- {
- Map.Entry v = (Map.Entry)it.next();
- if (value == null)
- {
- if (v.getValue() == null)
- {
- return true;
- }
- }
- else
- {
- if (value.equals(v.getValue()))
- {
- return true;
- }
- }
- }
- return false;
- }
-
- public boolean containsKey(Object key)
- throws ClassCastException, NullPointerException
- {
- Iterator it = entrySet().iterator();
- while (it.hasNext())
- {
- Map.Entry v = (Map.Entry)it.next();
- if (key == null)
- {
- if (v.getKey() == null)
- {
- return true;
- }
- }
- else
- {
- if (key.equals(v.getKey()))
- {
- return true;
- }
- }
- }
- return false;
- }
-
- public Object get(Object key)
- throws ClassCastException, NullPointerException
- {
- Iterator it = entrySet().iterator();
- while (it.hasNext())
- {
- Map.Entry v = (Map.Entry)it.next();
- if (key == null)
- {
- if (v.getKey() == null)
- {
- return v.getValue();
- }
- }
- else
- {
- if (key.equals(v.getKey()))
- {
- return v.getValue();
- }
- }
- }
- return null;
- }
-
- public Object put(Object key, Object value)
- throws RuntimeException
- {
- throw new RuntimeException();
- }
-
- public Object remove(Object key)
- {
- Iterator it = entrySet().iterator();
- Object o = null;
- while (it.hasNext())
- {
- Map.Entry v = (Map.Entry)it.next();
- if (key == null)
- {
- if (v.getKey() == null)
- {
- o = v.getValue();
- it.remove();
- return o;
- }
- }
- else
- {
- if (key.equals(v.getKey()))
- {
- o = v.getValue();
- it.remove();
- return o;
- }
- }
- }
- return null;
- }
-
- public void putAll(Map t)
- {
- Iterator it = t.entrySet().iterator();
- while (it.hasNext())
- {
- Map.Entry v = (Map.Entry)it.next();
- put(v.getKey(), v.getValue());
- }
- }
-
- public void clear()
- {
- entrySet().clear();
- }
-
- public Set keySet()
- {
- throw new RuntimeException("no keySet in AbstractMap()");
- }
-
- public Collection values()
- {
- throw new RuntimeException("no values in AbstractMap()");
- }
-
- public abstract Set entrySet();
-
- public boolean equals(Object o)
- {
- throw new RuntimeException("no equals in AbstractMap()");
- }
-
- public int hashCode()
- {
- throw new RuntimeException("no hashCode in AbstractMap()");
- }
-
- public String toString()
- {
- throw new RuntimeException("no toString in AbstractMap()");
- }
-
-
-}
diff --git a/libraries/spongycastle/core/src/main/j2me/java/util/AbstractSet.java b/libraries/spongycastle/core/src/main/j2me/java/util/AbstractSet.java
deleted file mode 100644
index 2a91c4766..000000000
--- a/libraries/spongycastle/core/src/main/j2me/java/util/AbstractSet.java
+++ /dev/null
@@ -1,46 +0,0 @@
-package java.util;
-
-public abstract class AbstractSet
- extends AbstractCollection
- implements Set
-{
- protected AbstractSet()
- {
- }
-
- public boolean equals(Object o)
- {
- if (this == o)
- {
- return true;
- }
- if (o == null)
- {
- return false;
- }
- if (!(o instanceof Set))
- {
- return false;
- }
- if (((Set)o).size() != size())
- {
- return false;
- }
- return containsAll((Collection)o);
- }
-
- public int hashCode()
- {
- int hashCode = 0;
- Iterator it = iterator();
- while (it.hasNext())
- {
- Object o = it.next();
- if (o != null)
- {
- hashCode += o.hashCode();
- }
- }
- return hashCode;
- }
-}
diff --git a/libraries/spongycastle/core/src/main/j2me/java/util/ArrayList.java b/libraries/spongycastle/core/src/main/j2me/java/util/ArrayList.java
deleted file mode 100644
index 80adf4785..000000000
--- a/libraries/spongycastle/core/src/main/j2me/java/util/ArrayList.java
+++ /dev/null
@@ -1,107 +0,0 @@
-package java.util;
-
-public class ArrayList extends AbstractList
- implements List
- {
- Vector m_Vector=null;
-
- public ArrayList()
- {
- m_Vector=new Vector();
- }
-
- public ArrayList(Collection c)
- {
- m_Vector=new Vector((int)(c.size()*1.1));
- addAll(c);
- }
-
- public ArrayList(int initialCapacity)
- {
- m_Vector=new Vector(initialCapacity);
- }
-
- public void trimToSize()
- {
- m_Vector.trimToSize();
- }
-
- public void ensureCapacity(int minCapacity)
- {
- m_Vector.ensureCapacity(minCapacity);
- }
-
- public int size()
- {
- return m_Vector.size();
- }
-
- public boolean contains(Object elem)
- {
- return m_Vector.contains(elem);
- }
-
- public int indexOf(Object elem)
- {
- return m_Vector.indexOf(elem);
- }
-
- public int lastIndexOf(Object elem)
- {
- return m_Vector.lastIndexOf(elem);
- }
-
- public Object clone()
- {
- ArrayList al=new ArrayList(this);
-
- return al;
- }
-
- public Object[] toArray()
- {
- Object[] o=new Object[m_Vector.size()];
- m_Vector.copyInto(o);
- return o;
- }
-
- public Object get(int index)
- {
- return m_Vector.elementAt(index);
- }
-
- public Object set(int index,Object elem)
- {
- Object o=m_Vector.elementAt(index);
- m_Vector.setElementAt(elem,index);
- return o;
- }
-
- public boolean add(Object o)
- {
- m_Vector.addElement(o);
- return true;
- }
-
- public void add(int index,Object elem)
- {
- m_Vector.insertElementAt(elem,index);
- }
-
- public Object remove(int index)
- {
- Object o=m_Vector.elementAt(index);
- m_Vector.removeElementAt(index);
- return o;
- }
-
- public void clear()
- {
- m_Vector.removeAllElements();
- }
-
-
-
-
-
- }
diff --git a/libraries/spongycastle/core/src/main/j2me/java/util/Arrays.java b/libraries/spongycastle/core/src/main/j2me/java/util/Arrays.java
deleted file mode 100644
index 8cd74daae..000000000
--- a/libraries/spongycastle/core/src/main/j2me/java/util/Arrays.java
+++ /dev/null
@@ -1,118 +0,0 @@
-package java.util;
-
-public class Arrays
-{
-
- private Arrays()
- {
- }
-
- public static void fill(byte[] ret, byte v)
- {
- for (int i = 0; i != ret.length; i++)
- {
- ret[i] = v;
- }
- }
-
- public static boolean equals(byte[] a, byte[] a2)
- {
- if (a == a2)
- {
- return true;
- }
- if (a == null || a2 == null)
- {
- return false;
- }
-
- int length = a.length;
- if (a2.length != length)
- {
- return false;
- }
-
- for (int i = 0; i < length; i++)
- {
- if (a[i] != a2[i])
- {
- return false;
- }
- }
-
- return true;
- }
-
- public static List asList(Object[] a)
- {
- return new ArrayList(a);
- }
-
- private static class ArrayList
- extends AbstractList
- {
- private Object[] a;
-
- ArrayList(Object[] array)
- {
- a = array;
- }
-
- public int size()
- {
- return a.length;
- }
-
- public Object[] toArray()
- {
- Object[] tmp = new Object[a.length];
-
- System.arraycopy(a, 0, tmp, 0, tmp.length);
-
- return tmp;
- }
-
- public Object get(int index)
- {
- return a[index];
- }
-
- public Object set(int index, Object element)
- {
- Object oldValue = a[index];
- a[index] = element;
- return oldValue;
- }
-
- public int indexOf(Object o)
- {
- if (o == null)
- {
- for (int i = 0; i < a.length; i++)
- {
- if (a[i] == null)
- {
- return i;
- }
- }
- }
- else
- {
- for (int i = 0; i < a.length; i++)
- {
- if (o.equals(a[i]))
- {
- return i;
- }
- }
- }
- return -1;
- }
-
- public boolean contains(Object o)
- {
- return indexOf(o) != -1;
- }
- }
-
-}
diff --git a/libraries/spongycastle/core/src/main/j2me/java/util/Collection.java b/libraries/spongycastle/core/src/main/j2me/java/util/Collection.java
deleted file mode 100644
index a911dcd63..000000000
--- a/libraries/spongycastle/core/src/main/j2me/java/util/Collection.java
+++ /dev/null
@@ -1,21 +0,0 @@
-
-package java.util;
-
-public interface Collection
- {
- public boolean add(Object o) throws RuntimeException,ClassCastException,IllegalArgumentException;
- public boolean addAll(Collection c) throws RuntimeException,ClassCastException,IllegalArgumentException;
- public void clear() throws RuntimeException;
- public boolean contains(Object o);
- public boolean containsAll(Collection c);
- public boolean equals(Object o);
- public int hashCode();
- public boolean isEmpty();
- public Iterator iterator();
- public /*SK13*/boolean remove(Object o) throws RuntimeException;
- public boolean removeAll(Collection c) throws RuntimeException;
- public boolean retainAll(Collection c) throws RuntimeException;
- public int size();
- public Object[] toArray();
- public Object[] toArray(Object[] a) throws ArrayStoreException;
- }
diff --git a/libraries/spongycastle/core/src/main/j2me/java/util/Collections.java b/libraries/spongycastle/core/src/main/j2me/java/util/Collections.java
deleted file mode 100644
index d611e5e3e..000000000
--- a/libraries/spongycastle/core/src/main/j2me/java/util/Collections.java
+++ /dev/null
@@ -1,365 +0,0 @@
-package java.util;
-
-public class Collections
-{
- public static List EMPTY_LIST = new ArrayList();
-
- private Collections()
- {
- }
-
- public static Collection unmodifiableCollection(Collection c)
- {
- return new UnmodifiableCollection(c);
- }
-
- static class UnmodifiableCollection
- implements Collection
- {
- Collection c;
-
- UnmodifiableCollection(Collection c)
- {
- this.c = c;
- }
-
- public int size()
- {
- return c.size();
- }
-
- public boolean isEmpty()
- {
- return c.isEmpty();
- }
-
- public boolean contains(Object o)
- {
- return c.contains(o);
- }
-
- public Object[] toArray()
- {
- return c.toArray();
- }
-
- public Object[] toArray(Object[] a)
- {
- return c.toArray(a);
- }
-
- public Iterator iterator()
- {
- return new Iterator()
- {
- Iterator i = c.iterator();
-
- public boolean hasNext()
- {
- return i.hasNext();
- }
-
- public Object next()
- {
- return i.next();
- }
-
- public void remove()
- {
- throw new RuntimeException();
- }
- };
- }
-
- public boolean add(Object o)
- {
- throw new RuntimeException();
- }
-
- public boolean remove(Object o)
- {
- throw new RuntimeException();
- }
-
- public boolean containsAll(Collection coll)
- {
- return c.containsAll(coll);
- }
-
- public boolean addAll(Collection coll)
- {
- throw new RuntimeException();
- }
-
- public boolean removeAll(Collection coll)
- {
- throw new RuntimeException();
- }
-
- public boolean retainAll(Collection coll)
- {
- throw new RuntimeException();
- }
-
- public void clear()
- {
- throw new RuntimeException();
- }
-
- public String toString()
- {
- return c.toString();
- }
- }
-
- public static Set unmodifiableSet(Set s)
- {
- return new UnmodifiableSet(s);
- }
-
- static class UnmodifiableSet
- extends UnmodifiableCollection
- implements Set
- {
- UnmodifiableSet(Set s)
- {
- super(s);
- }
-
- public boolean equals(Object o)
- {
- return c.equals(o);
- }
-
- public int hashCode()
- {
- return c.hashCode();
- }
- }
-
- public static Map unmodifiableMap(Map map)
- {
- return new UnmodifiableMap(map);
- }
-
- static class UnmodifiableMap
- implements Map
- {
- private Map map;
-
- UnmodifiableMap(Map map)
- {
- this.map = map;
- }
-
- public int size()
- {
- return map.size();
- }
-
- public boolean isEmpty()
- {
- return map.isEmpty();
- }
-
- public boolean containsKey(Object key)
- throws ClassCastException, NullPointerException
- {
- return map.containsKey(key);
- }
-
- public boolean containsValue(Object value)
- {
- return map.containsValue(value);
- }
-
- public Object get(Object key)
- throws ClassCastException, NullPointerException
- {
- return map.get(key);
- }
-
- public Object put(Object key, Object value)
- throws RuntimeException, ClassCastException, IllegalArgumentException, NullPointerException
- {
- throw new RuntimeException("unsupported operation - map unmodifiable");
- }
-
- public Object remove(Object key)
- throws RuntimeException
- {
- throw new RuntimeException("unsupported operation - map unmodifiable");
- }
-
- public void putAll(Map t)
- throws RuntimeException, ClassCastException, IllegalArgumentException, NullPointerException
- {
- throw new RuntimeException("unsupported operation - map unmodifiable");
- }
-
- public void clear()
- throws RuntimeException
- {
- throw new RuntimeException("unsupported operation - map unmodifiable");
- }
-
- public Set keySet()
- {
- return map.keySet();
- }
-
- public Collection values()
- {
- return map.values();
- }
-
- public Set entrySet()
- {
- return map.entrySet();
- }
- }
-
- public static List unmodifiableList(List list)
- {
- return new UnmodifiableList(list);
- }
-
- static class UnmodifiableList
- extends UnmodifiableCollection
- implements List
- {
- private List list;
-
- UnmodifiableList(List list)
- {
- super(list);
- this.list = list;
- }
-
- public boolean equals(Object o)
- {
- return list.equals(o);
- }
-
- public int hashCode()
- {
- return list.hashCode();
- }
-
- public Object get(int index)
- {
- return list.get(index);
- }
-
- public Object set(int index, Object element)
- {
- throw new RuntimeException();
- }
-
- public void add(int index, Object element)
- {
- throw new RuntimeException();
- }
-
- public Object remove(int index)
- {
- throw new RuntimeException();
- }
-
- public int indexOf(Object o)
- {
- return list.indexOf(o);
- }
-
- public int lastIndexOf(Object o)
- {
- return list.lastIndexOf(o);
- }
-
- public boolean addAll(int index, Collection c)
- {
- throw new RuntimeException();
- }
-
- public ListIterator listIterator()
- {
- return listIterator(0);
- }
-
- public ListIterator listIterator(final int index)
- {
- return new ListIterator()
- {
- ListIterator i = list.listIterator(index);
-
- public boolean hasNext()
- {
- return i.hasNext();
- }
-
- public Object next()
- {
- return i.next();
- }
-
- public boolean hasPrevious()
- {
- return i.hasPrevious();
- }
-
- public Object previous()
- {
- return i.previous();
- }
-
- public int nextIndex()
- {
- return i.nextIndex();
- }
-
- public int previousIndex()
- {
- return i.previousIndex();
- }
-
- public void remove()
- {
- throw new RuntimeException();
- }
-
- public void set(Object o)
- {
- throw new RuntimeException();
- }
-
- public void add(Object o)
- {
- throw new RuntimeException();
- }
- };
- }
-
- public List subList(int fromIndex, int toIndex)
- {
- return new UnmodifiableList(list.subList(fromIndex, toIndex));
- }
- }
-
- public static Enumeration enumeration(final Collection c)
- {
- return new Enumeration()
- {
- Iterator i = c.iterator();
-
- public boolean hasMoreElements()
- {
- return i.hasNext();
- }
-
- public Object nextElement()
- {
- return i.next();
- }
- };
- }
-}
diff --git a/libraries/spongycastle/core/src/main/j2me/java/util/HashMap.java b/libraries/spongycastle/core/src/main/j2me/java/util/HashMap.java
deleted file mode 100644
index 0bcd75ddd..000000000
--- a/libraries/spongycastle/core/src/main/j2me/java/util/HashMap.java
+++ /dev/null
@@ -1,279 +0,0 @@
-package java.util;
-
-
-public class HashMap extends AbstractMap{
-
- //////////////////////////////////////////////////////////////
- ///// innere Klasse Null ////////////////////////////////////
- //////////////////////////////////////////////////////////////
-public class Null extends Object
- {
- public Null()
- {
-
- }
-
- public String toString()
- {
- return "Nullobject";
- }
- }
-
-
- //////////////////////////////////////////////////////////////
- ///// innere Klasse innerSet ////////////////////////////////////
- //////////////////////////////////////////////////////////////
-
- class ISet extends AbstractSet implements java.util.Set
- {
-
- Vector vec = null;
-
- public ISet()
- {
-
- vec = new Vector();
-
- }
-
- public boolean add(Object o)
- {
- vec.addElement(o);
- return true;
- }
-
- public int size()
- {
- return vec.size();
- }
-
- public Iterator iterator()
- {
- return new IIterator(vec);
- }
- }
-
- //////////////////////////////////////////////////////////////
- ///// innere Klasse Iterator ////////////////////////////////////
- //////////////////////////////////////////////////////////////
- class IIterator implements java.util.Iterator
- {
- int index = 0;
- Vector vec = null;
- public IIterator(Vector ve)
- {
- vec = ve;
- }
-
- public boolean hasNext()
- {
- if (vec.size() > index) return true;
- return false;
- }
-
- public Object next()
- {
- Object o = vec.elementAt(index);
- if (o==Nullobject) o=null;
- index++;
- return o;
-
- }
-
- public void remove()
- {
- index--;
- vec.removeElementAt(index);
- }
-
- }
-
- //////////////////////////////////////////////////////////////
- ///// innere Klasse Entry ////////////////////////////////////
- //////////////////////////////////////////////////////////////
-
-
- class Entry implements Map.Entry
- {
- public Object key=null;
- public Object value=null;
-
- public Entry(Object ke,Object valu)
- {
- key = ke;
- value = valu;
- }
- public boolean equals(Object o)
- {
- if (value == ((Entry)o).value && key == ((Entry)o).key ) return true;
- else return false;
-
- }
-
- public Object getValue()
- {
- return value;
- }
-
- public Object getKey()
- {
- return (Object)key;
- }
-
- public int hashCode()
- {
- return value.hashCode() + key.hashCode();
-
- }
-
- public Object setValue(Object valu)
- {
- value = (String)valu;
- return this;
- }
- }
-
- ////////////////////////////////////////////////////////////////////
-
- private Hashtable m_HashTable=null;
- private Null Nullobject = null;
-
- public HashMap()
- {
- Nullobject = new Null();
- m_HashTable=new Hashtable();
- }
-
- public HashMap(int initialCapacity)
- {
- Nullobject = new Null();
- m_HashTable=new Hashtable(initialCapacity);
- }
-
- public HashMap(Map t)
- {
- Nullobject = new Null();
- m_HashTable=new Hashtable();
- this.putAll(t);
- }
-
- public void clear()
- {
- m_HashTable.clear();
- }
-
- public Object clone()
- {
- HashMap hm=new HashMap(this);
-
- return hm;
- }
-
- public boolean containsKey(Object key)
- {
- if (key == null) key = Nullobject;
- boolean b = m_HashTable.containsKey(key);
- return b;
-
- }
-
- public boolean containsValue(Object value)
- {
- if (value == null ) value = Nullobject;
- boolean b = m_HashTable.contains(value);
- return b;
- }
-
- public Set entrySet()
- {
-
- Object Key = null;
- ISet s = new ISet();
- Enumeration en = m_HashTable.keys();
- while (en.hasMoreElements())
- {
- Key = en.nextElement();
- s.add(new Entry(Key,m_HashTable.get(Key)));
- }
- return s;
- }
-
- public Object get(Object key)
- {
-
- if (key==null) key= Nullobject;
-
- Object o = m_HashTable.get(key);
-
- if (o == Nullobject) o=null;
-
- return o;
- }
-
- public boolean isEmpty()
- {
- return m_HashTable.isEmpty();
- }
-
- public Set keySet()
- {
- ISet s=new ISet();
- Enumeration en = m_HashTable.keys();
-
- while (en.hasMoreElements())
- {
- s.add(en.nextElement());
- }
-
- return s;
- }
-
- public Object put(Object key, Object value)
- {
- if (key==null) key=Nullobject;
- if (value==null) value = Nullobject;
- return m_HashTable.put(key,value);
- }
-
- public void putAll(Map m)
- {
- Iterator it = m.entrySet().iterator();
- Object key=null;
- Object value=null;
-
- while (it.hasNext())
- {
- Map.Entry me = (Map.Entry)it.next();
- if (me.getKey() == null) key = Nullobject;
- else key= me.getKey();
- if (me.getValue()==null) value = Nullobject;
- else value = me.getValue();
- m_HashTable.put(key,value);
- }
- }
-
- public Object remove(Object key)
- {
- return m_HashTable.remove(key);
- }
-
- public int size()
- {
- return m_HashTable.size();
- }
-
- public Collection values()
- {
-
- ISet s=new ISet();
- Enumeration en = m_HashTable.keys();
-
- while (en.hasMoreElements())
- {
- Object Key = en.nextElement();
- //s.add(((Map.Entry)m_HashTable.get(Key)).getValue());
- s.add(m_HashTable.get(Key));
- }
- return s;
- }
-}
diff --git a/libraries/spongycastle/core/src/main/j2me/java/util/HashSet.java b/libraries/spongycastle/core/src/main/j2me/java/util/HashSet.java
deleted file mode 100644
index e37cb7c8d..000000000
--- a/libraries/spongycastle/core/src/main/j2me/java/util/HashSet.java
+++ /dev/null
@@ -1,71 +0,0 @@
-package java.util;
-
-public class HashSet
- extends AbstractSet
-{
- private HashMap m_HashMap = null;
-
- public HashSet()
- {
- m_HashMap = new HashMap();
- }
-
- public HashSet(Collection c)
- {
- m_HashMap = new HashMap(Math.max(11, c.size() * 2));
- addAll(c);
- }
-
- public HashSet(int initialCapacity)
- {
- m_HashMap = new HashMap(initialCapacity);
-
- }
-
- public Iterator iterator()
- {
- return (m_HashMap.keySet()).iterator();
- }
-
- public int size()
- {
- return m_HashMap.size();
- }
-
- public boolean contains(Object o)
- {
- return m_HashMap.containsKey(o);
- }
-
- public boolean add(Object o)
- {
- if (!m_HashMap.containsValue(o))
- {
- m_HashMap.put((Object)o, (Object)o);
-
- return true;
-
- }
-
- return false;
- }
-
- public boolean remove(Object o)
- {
- return (m_HashMap.remove(o) != null);
- }
-
- public void clear()
- {
- m_HashMap.clear();
- }
-
-
- public Object clone()
- {
- HashSet hs = new HashSet();
- hs.m_HashMap = (HashMap)m_HashMap.clone();
- return hs;
- }
-
-}
diff --git a/libraries/spongycastle/core/src/main/j2me/java/util/Iterator.java b/libraries/spongycastle/core/src/main/j2me/java/util/Iterator.java
deleted file mode 100644
index f1b9c05fc..000000000
--- a/libraries/spongycastle/core/src/main/j2me/java/util/Iterator.java
+++ /dev/null
@@ -1,9 +0,0 @@
-
-package java.util;
-
-public interface Iterator
-{
- public abstract boolean hasNext();
- public abstract Object next() throws NoSuchElementException;
- public abstract void remove() throws RuntimeException,IllegalStateException;
-}
diff --git a/libraries/spongycastle/core/src/main/j2me/java/util/List.java b/libraries/spongycastle/core/src/main/j2me/java/util/List.java
deleted file mode 100644
index d9df616fd..000000000
--- a/libraries/spongycastle/core/src/main/j2me/java/util/List.java
+++ /dev/null
@@ -1,32 +0,0 @@
-package java.util;
-
-public interface List
- extends Collection
-{
- void add(int index, Object element)
- throws RuntimeException, ClassCastException, IllegalArgumentException, IndexOutOfBoundsException;
-
- boolean addAll(int index, Collection c)
- throws RuntimeException, ClassCastException, IllegalArgumentException, IndexOutOfBoundsException;
-
- Object get(int index)
- throws IndexOutOfBoundsException;
-
- int indexOf(Object o);
-
- int lastIndexOf(Object o);
-
- ListIterator listIterator();
-
- ListIterator listIterator(int index)
- throws IndexOutOfBoundsException;
-
- Object remove(int index)
- throws RuntimeException, IndexOutOfBoundsException;
-
- Object set(int index, Object element)
- throws RuntimeException, ClassCastException, IllegalArgumentException, IndexOutOfBoundsException;
-
- List subList(int fromIndex, int toIndex)
- throws IndexOutOfBoundsException;
-}
diff --git a/libraries/spongycastle/core/src/main/j2me/java/util/ListIterator.java b/libraries/spongycastle/core/src/main/j2me/java/util/ListIterator.java
deleted file mode 100644
index 3e08d959c..000000000
--- a/libraries/spongycastle/core/src/main/j2me/java/util/ListIterator.java
+++ /dev/null
@@ -1,20 +0,0 @@
-package java.util;
-
-public interface ListIterator
- extends Iterator
-{
- public boolean hasPrevious();
-
- public Object previous()
- throws NoSuchElementException;
-
- public int nextIndex();
-
- public int previousIndex();
-
- public void set(Object o)
- throws RuntimeException, ClassCastException, IllegalArgumentException, IllegalStateException;
-
- public void add(Object o)
- throws RuntimeException, ClassCastException, IllegalArgumentException;
-}
diff --git a/libraries/spongycastle/core/src/main/j2me/java/util/Map.java b/libraries/spongycastle/core/src/main/j2me/java/util/Map.java
deleted file mode 100644
index cf496f89d..000000000
--- a/libraries/spongycastle/core/src/main/j2me/java/util/Map.java
+++ /dev/null
@@ -1,54 +0,0 @@
-package java.util;
-
-public interface Map
-{
-
- public static interface Entry
- {
- public Object getKey();
-
- public Object getValue();
-
- public Object setValue(Object value)
- throws RuntimeException, ClassCastException, IllegalArgumentException, NullPointerException;
-
- public boolean equals(Object o);
-
- public int hashCode();
- }
-
- public int size();
-
- public boolean isEmpty();
-
- public boolean containsKey(Object Key)
- throws ClassCastException, NullPointerException;
-
- public boolean containsValue(Object value);
-
- public Object get(Object key)
- throws ClassCastException, NullPointerException;
-
- public Object put(Object key, Object value)
- throws RuntimeException, ClassCastException, IllegalArgumentException, NullPointerException;
-
- public Object remove(Object key)
- throws RuntimeException;
-
- public void putAll(Map t)
- throws RuntimeException, ClassCastException, IllegalArgumentException, NullPointerException;
-
- public void clear()
- throws RuntimeException;
-
- public Set keySet();
-
- public Collection values();
-
- public Set entrySet();
-
- public boolean equals(Object o);
-
- public int hashCode();
-
-}
diff --git a/libraries/spongycastle/core/src/main/j2me/java/util/Set.java b/libraries/spongycastle/core/src/main/j2me/java/util/Set.java
deleted file mode 100644
index 6ec45c748..000000000
--- a/libraries/spongycastle/core/src/main/j2me/java/util/Set.java
+++ /dev/null
@@ -1,38 +0,0 @@
-package java.util;
-
-public interface Set
- extends Collection
-{
-
- public int size();
-
- public boolean isEmpty();
-
- public boolean contains(Object o);
-
- public Iterator iterator();
-
- public Object[] toArray();
-
- public Object[] toArray(Object[] a);
-
- public boolean add(Object o);
-
- public boolean remove(Object o);
-
- public boolean containsAll(Collection c);
-
- public boolean addAll(Collection c);
-
- public boolean retainAll(Collection c);
-
- public boolean removeAll(Collection c);
-
- public void clear();
-
- public boolean equals(Object o);
-
- public int hashCode();
-
-
-}
diff --git a/libraries/spongycastle/core/src/main/j2me/java/util/StringTokenizer.java b/libraries/spongycastle/core/src/main/j2me/java/util/StringTokenizer.java
deleted file mode 100644
index 5ff7c7060..000000000
--- a/libraries/spongycastle/core/src/main/j2me/java/util/StringTokenizer.java
+++ /dev/null
@@ -1,115 +0,0 @@
-package java.util;
-
-import java.util.Enumeration;
-import java.util.NoSuchElementException;
-
-public class StringTokenizer
- implements Enumeration
-{
- private String s;
- private String delims;
- private boolean retDelims;
- private int maxPos;
-
- private int pos;
-
- public StringTokenizer(String s, String delims)
- {
- this(s, delims, false);
- }
-
- public StringTokenizer(String s, String delims, boolean retDelims)
- {
- this.s = s;
- this.delims = delims;
- this.retDelims = retDelims;
- this.maxPos = s.length();
- }
-
- public boolean hasMoreTokens()
- {
- if (retDelims)
- {
- return pos < maxPos;
- }
- else
- {
- int next = pos;
- while (next < maxPos && isDelim(next))
- {
- next++;
- }
-
- return next < maxPos;
- }
- }
-
- public String nextToken()
- {
- String tok;
-
- if (pos == maxPos)
- {
- throw new NoSuchElementException("no more tokens");
- }
-
- if (retDelims)
- {
- if (isDelim(pos))
- {
- tok = s.substring(pos, pos + 1);
- pos++;
-
- return tok;
- }
- }
-
- while (pos < maxPos && isDelim(pos))
- {
- pos++;
- }
-
- int start = pos;
-
- while (pos < maxPos && !isDelim(pos))
- {
- pos++;
- }
-
- if (pos < maxPos)
- {
- tok = s.substring(start, pos);
- }
- else
- {
- tok = s.substring(start);
- }
-
- return tok;
- }
-
- public boolean hasMoreElements()
- {
- return hasMoreTokens();
- }
-
- public Object nextElement()
- {
- return nextToken();
- }
-
- private boolean isDelim(int index)
- {
- char c = s.charAt(index);
-
- for (int i = 0; i != delims.length(); i++)
- {
- if (delims.charAt(i) == c)
- {
- return true;
- }
- }
-
- return false;
- }
-}
diff --git a/libraries/spongycastle/core/src/main/j2me/java/util/Sublist.java b/libraries/spongycastle/core/src/main/j2me/java/util/Sublist.java
deleted file mode 100644
index 48d8d8e89..000000000
--- a/libraries/spongycastle/core/src/main/j2me/java/util/Sublist.java
+++ /dev/null
@@ -1,142 +0,0 @@
-package java.util;
-
-public class Sublist
- extends AbstractList
-{
- AbstractList m_al = null;
- int m_fromIndex = 0;
- int m_toIndex = 0;
- int size = 0;
-
- public Sublist(AbstractList ali, int fromIndex, int toIndex)
- {
- m_al = ali;
- m_toIndex = toIndex;
- m_fromIndex = fromIndex;
- size = size();
- }
-
- public Object set(int index, Object o)
- {
- if (index < size)
- {
- o = m_al.set(index + m_fromIndex, o);
- if (o != null)
- {
- size++;
- m_toIndex++;
- }
- return o;
- }
- else
- {
- throw new IndexOutOfBoundsException();
- }
- }
-
- public Object get(int index)
- throws IndexOutOfBoundsException
- {
- if (index < size)
- {
- return m_al.get(index + m_fromIndex);
- }
- else
- {
- throw new IndexOutOfBoundsException();
- }
- }
-
- public void add(int index, Object o)
- {
-
- if (index <= size)
- {
- m_al.add(index + m_fromIndex, o);
- m_toIndex++;
- size++;
-
- }
- else
- {
- throw new IndexOutOfBoundsException();
- }
-
- }
-
- public Object remove(int index, Object o)
- {
- if (index < size)
- {
- Object ob = m_al.remove(index + m_fromIndex);
- if (ob != null)
- {
- m_toIndex--;
- size--;
- }
- return ob;
- }
- else
- {
- throw new IndexOutOfBoundsException();
- }
- }
-
- public boolean addAll(int index, Collection c)
- {
- if (index < size)
- {
- boolean bool = m_al.addAll(index + m_fromIndex, c);
- if (bool)
- {
- int lange = c.size();
- m_toIndex = m_toIndex + lange;
- size = size + lange;
- }
- return bool;
- }
- else
- {
- throw new IndexOutOfBoundsException();
- }
- }
-
- public boolean addAll(Collection c)
- {
- boolean bool = m_al.addAll(m_toIndex, c);
- if (bool)
- {
- int lange = c.size();
- m_toIndex = m_toIndex + lange;
- size = size + lange;
- }
- return bool;
- }
-
- public void removeRange(int from, int to)
- {
- if ((from <= to) && (from <= size) && (to <= size))
- {
- m_al.removeRange(from, to);
- int lange = to - from;
- m_toIndex = m_toIndex - lange;
- size = size - lange;
- }
- else
- {
- if (from > to)
- {
- throw new IllegalArgumentException();
- }
- else
- {
- throw new IndexOutOfBoundsException();
- }
- }
- }
-
- public int size()
- {
- return (m_toIndex - m_fromIndex);
- }
-}
diff --git a/libraries/spongycastle/core/src/main/j2me/org/spongycastle/asn1/ASN1GeneralizedTime.java b/libraries/spongycastle/core/src/main/j2me/org/spongycastle/asn1/ASN1GeneralizedTime.java
deleted file mode 100644
index 0fa3440a7..000000000
--- a/libraries/spongycastle/core/src/main/j2me/org/spongycastle/asn1/ASN1GeneralizedTime.java
+++ /dev/null
@@ -1,27 +0,0 @@
-package org.spongycastle.asn1;
-
-import java.util.Date;
-
-public class ASN1GeneralizedTime
- extends DERGeneralizedTime
-{
- ASN1GeneralizedTime(byte[] bytes)
- {
- super(bytes);
- }
-
- public ASN1GeneralizedTime(Date date)
- {
- super(date);
- }
-
- public ASN1GeneralizedTime(Date date, boolean includeMillis)
- {
- super(date, includeMillis);
- }
-
- public ASN1GeneralizedTime(String time)
- {
- super(time);
- }
-}
diff --git a/libraries/spongycastle/core/src/main/j2me/org/spongycastle/asn1/ASN1UTCTime.java b/libraries/spongycastle/core/src/main/j2me/org/spongycastle/asn1/ASN1UTCTime.java
deleted file mode 100644
index d682a182f..000000000
--- a/libraries/spongycastle/core/src/main/j2me/org/spongycastle/asn1/ASN1UTCTime.java
+++ /dev/null
@@ -1,22 +0,0 @@
-package org.spongycastle.asn1;
-
-import java.util.Date;
-
-public class ASN1UTCTime
- extends DERUTCTime
-{
- ASN1UTCTime(byte[] bytes)
- {
- super(bytes);
- }
-
- public ASN1UTCTime(Date date)
- {
- super(date);
- }
-
- public ASN1UTCTime(String time)
- {
- super(time);
- }
-}
diff --git a/libraries/spongycastle/core/src/main/j2me/org/spongycastle/asn1/DERFactory.java b/libraries/spongycastle/core/src/main/j2me/org/spongycastle/asn1/DERFactory.java
deleted file mode 100644
index c002ef6dd..000000000
--- a/libraries/spongycastle/core/src/main/j2me/org/spongycastle/asn1/DERFactory.java
+++ /dev/null
@@ -1,31 +0,0 @@
-package org.spongycastle.asn1;
-
-class DERFactory
-{
- static final ASN1Sequence EMPTY_SEQUENCE = new DERSequence();
- static final ASN1Set EMPTY_SET = new DERSet();
-
- static ASN1Sequence createSequence(ASN1EncodableVector v)
- {
- if (v.size() < 1)
- {
- return EMPTY_SEQUENCE;
- }
- else
- {
- return new DLSequence(v);
- }
- }
-
- static ASN1Set createSet(ASN1EncodableVector v)
- {
- if (v.size() < 1)
- {
- return EMPTY_SET;
- }
- else
- {
- return new DLSet(v);
- }
- }
-}
diff --git a/libraries/spongycastle/core/src/main/j2me/org/spongycastle/asn1/DERGeneralizedTime.java b/libraries/spongycastle/core/src/main/j2me/org/spongycastle/asn1/DERGeneralizedTime.java
deleted file mode 100644
index 82b780375..000000000
--- a/libraries/spongycastle/core/src/main/j2me/org/spongycastle/asn1/DERGeneralizedTime.java
+++ /dev/null
@@ -1,260 +0,0 @@
-package org.spongycastle.asn1;
-
-import java.io.IOException;
-import java.util.Date;
-import java.util.TimeZone;
-
-import org.spongycastle.util.Arrays;
-import org.spongycastle.util.Strings;
-
-/**
- * Generalized time object.
- */
-public class DERGeneralizedTime
- extends ASN1Primitive
-{
- private byte[] time;
-
- /**
- * return a generalized time from the passed in object
- *
- * @exception IllegalArgumentException if the object cannot be converted.
- */
- public static ASN1GeneralizedTime getInstance(
- Object obj)
- {
- if (obj == null || obj instanceof ASN1GeneralizedTime)
- {
- return (ASN1GeneralizedTime)obj;
- }
-
- if (obj instanceof DERGeneralizedTime)
- {
- return new ASN1GeneralizedTime(((DERGeneralizedTime)obj).time);
- }
-
- throw new IllegalArgumentException("illegal object in getInstance: " + obj.getClass().getName());
- }
-
- /**
- * return a Generalized Time object from a tagged object.
- *
- * @param obj the tagged object holding the object we want
- * @param explicit true if the object is meant to be explicitly
- * tagged false otherwise.
- * @exception IllegalArgumentException if the tagged object cannot
- * be converted.
- */
- public static ASN1GeneralizedTime getInstance(
- ASN1TaggedObject obj,
- boolean explicit)
- {
- ASN1Primitive o = obj.getObject();
-
- if (explicit || o instanceof DERGeneralizedTime)
- {
- return getInstance(o);
- }
- else
- {
- return new ASN1GeneralizedTime(((ASN1OctetString)o).getOctets());
- }
- }
-
- /**
- * The correct format for this is YYYYMMDDHHMMSS[.f]Z, or without the Z
- * for local time, or Z|[+|-]HHMM on the end, for difference between local
- * time and UTC time. The fractional second amount f must consist of at
- * least one number with trailing zeroes removed.
- *
- * @param time the time string.
- * @exception IllegalArgumentException if String is an illegal format.
- */
- public DERGeneralizedTime(
- String time)
- {
- char last = time.charAt(time.length() - 1);
- if (last != 'Z' && !(last >= 0 && last <= '9'))
- {
- if (time.indexOf('-') < 0 && time.indexOf('+') < 0)
- {
- throw new IllegalArgumentException("time needs to be in format YYYYMMDDHHMMSS[.f]Z or YYYYMMDDHHMMSS[.f][+-]HHMM");
- }
- }
-
- this.time = Strings.toByteArray(time);
- }
-
- /**
- * base constructer from a java.util.date object
- */
- public DERGeneralizedTime(
- Date time)
- {
- this.time = Strings.toByteArray(DateFormatter.getGeneralizedTimeDateString(time, false));
- }
-
- protected DERGeneralizedTime(Date date, boolean includeMillis)
- {
- this.time = Strings.toByteArray(DateFormatter.getGeneralizedTimeDateString(date, true));
- }
-
- DERGeneralizedTime(
- byte[] bytes)
- {
- this.time = bytes;
- }
-
- /**
- * Return the time.
- * @return The time string as it appeared in the encoded object.
- */
- public String getTimeString()
- {
- return Strings.fromByteArray(time);
- }
-
- /**
- * return the time - always in the form of
- * YYYYMMDDhhmmssGMT(+hh:mm|-hh:mm).
- * <p>
- * Normally in a certificate we would expect "Z" rather than "GMT",
- * however adding the "GMT" means we can just use:
- * <pre>
- * dateF = new SimpleDateFormat("yyyyMMddHHmmssz");
- * </pre>
- * To read in the time and get a date which is compatible with our local
- * time zone.
- */
- public String getTime()
- {
- String stime = Strings.fromByteArray(time);
-
- //
- // standardise the format.
- //
- if (stime.charAt(stime.length() - 1) == 'Z')
- {
- return stime.substring(0, stime.length() - 1) + "GMT+00:00";
- }
- else
- {
- int signPos = stime.length() - 5;
- char sign = stime.charAt(signPos);
- if (sign == '-' || sign == '+')
- {
- return stime.substring(0, signPos)
- + "GMT"
- + stime.substring(signPos, signPos + 3)
- + ":"
- + stime.substring(signPos + 3);
- }
- else
- {
- signPos = stime.length() - 3;
- sign = stime.charAt(signPos);
- if (sign == '-' || sign == '+')
- {
- return stime.substring(0, signPos)
- + "GMT"
- + stime.substring(signPos)
- + ":00";
- }
- }
- }
- return stime + calculateGMTOffset();
- }
-
- private String calculateGMTOffset()
- {
- String sign = "+";
- TimeZone timeZone = TimeZone.getDefault();
- int offset = timeZone.getRawOffset();
- if (offset < 0)
- {
- sign = "-";
- offset = -offset;
- }
- int hours = offset / (60 * 60 * 1000);
- int minutes = (offset - (hours * 60 * 60 * 1000)) / (60 * 1000);
-
-// try
-// {
-// if (timeZone.useDaylightTime() && timeZone.inDaylightTime(this.getDate()))
-// {
-// hours += sign.equals("+") ? 1 : -1;
-// }
-// }
-// catch (ParseException e)
-// {
-// // we'll do our best and ignore daylight savings
-// }
-
- return "GMT" + sign + convert(hours) + ":" + convert(minutes);
- }
-
- private String convert(int time)
- {
- if (time < 10)
- {
- return "0" + time;
- }
-
- return Integer.toString(time);
- }
-
- public Date getDate()
- {
- return DateFormatter.fromGeneralizedTimeString(time);
- }
-
- private boolean hasFractionalSeconds()
- {
- for (int i = 0; i != time.length; i++)
- {
- if (time[i] == '.')
- {
- if (i == 14)
- {
- return true;
- }
- }
- }
- return false;
- }
-
- boolean isConstructed()
- {
- return false;
- }
-
- int encodedLength()
- {
- int length = time.length;
-
- return 1 + StreamUtil.calculateBodyLength(length) + length;
- }
-
- void encode(
- ASN1OutputStream out)
- throws IOException
- {
- out.writeEncoded(BERTags.GENERALIZED_TIME, time);
- }
-
- boolean asn1Equals(
- ASN1Primitive o)
- {
- if (!(o instanceof DERGeneralizedTime))
- {
- return false;
- }
-
- return Arrays.areEqual(time, ((DERGeneralizedTime)o).time);
- }
-
- public int hashCode()
- {
- return Arrays.hashCode(time);
- }
-}
diff --git a/libraries/spongycastle/core/src/main/j2me/org/spongycastle/asn1/DERUTCTime.java b/libraries/spongycastle/core/src/main/j2me/org/spongycastle/asn1/DERUTCTime.java
deleted file mode 100644
index bc0411f76..000000000
--- a/libraries/spongycastle/core/src/main/j2me/org/spongycastle/asn1/DERUTCTime.java
+++ /dev/null
@@ -1,259 +0,0 @@
-package org.spongycastle.asn1;
-
-import java.io.IOException;
-import java.util.Date;
-
-import org.spongycastle.util.Arrays;
-import org.spongycastle.util.Strings;
-
-/**
- * UTC time object.
- */
-public class DERUTCTime
- extends ASN1Primitive
-{
- private byte[] time;
-
- /**
- * return an UTC Time from the passed in object.
- *
- * @exception IllegalArgumentException if the object cannot be converted.
- */
- public static ASN1UTCTime getInstance(
- Object obj)
- {
- if (obj == null || obj instanceof ASN1UTCTime)
- {
- return (ASN1UTCTime)obj;
- }
-
- if (obj instanceof DERUTCTime)
- {
- return new ASN1UTCTime(((DERUTCTime)obj).time);
- }
-
- throw new IllegalArgumentException("illegal object in getInstance: " + obj.getClass().getName());
- }
-
- /**
- * return an UTC Time from a tagged object.
- *
- * @param obj the tagged object holding the object we want
- * @param explicit true if the object is meant to be explicitly
- * tagged false otherwise.
- * @exception IllegalArgumentException if the tagged object cannot
- * be converted.
- */
- public static ASN1UTCTime getInstance(
- ASN1TaggedObject obj,
- boolean explicit)
- {
- ASN1Object o = obj.getObject();
-
- if (explicit || o instanceof ASN1UTCTime)
- {
- return getInstance(o);
- }
- else
- {
- return new ASN1UTCTime(((ASN1OctetString)o).getOctets());
- }
- }
-
- /**
- * The correct format for this is YYMMDDHHMMSSZ (it used to be that seconds were
- * never encoded. When you're creating one of these objects from scratch, that's
- * what you want to use, otherwise we'll try to deal with whatever gets read from
- * the input stream... (this is why the input format is different from the getTime()
- * method output).
- * <p>
- *
- * @param time the time string.
- */
- public DERUTCTime(
- String time)
- {
- if (time.charAt(time.length() - 1) != 'Z')
- {
- // we accept this as a variation
- if (time.indexOf('-') < 0 && time.indexOf('+') < 0)
- {
- throw new IllegalArgumentException("time needs to be in format YYMMDDHHMMSSZ");
- }
- }
-
- this.time = Strings.toByteArray(time);
- }
-
- /**
- * base constructor from a java.util.date object
- */
- public DERUTCTime(
- Date time)
- {
- this.time = Strings.toByteArray(DateFormatter.toUTCDateString(time));
- }
-
- DERUTCTime(
- byte[] time)
- {
- this.time = time;
- }
-
- /**
- * return the time as a date based on whatever a 2 digit year will return. For
- * standardised processing use getAdjustedDate().
- *
- * @return the resulting date
- */
- public Date getDate()
- {
- return DateFormatter.adjustedFromUTCDateString(time);
- }
-
- /**
- * return the time as an adjusted date
- * in the range of 1950 - 2049.
- *
- * @return a date in the range of 1950 to 2049.
- */
- public Date getAdjustedDate()
- {
- return DateFormatter.adjustedFromUTCDateString(time);
- }
-
- /**
- * return the time - always in the form of
- * YYMMDDhhmmssGMT(+hh:mm|-hh:mm).
- * <p>
- * Normally in a certificate we would expect "Z" rather than "GMT",
- * however adding the "GMT" means we can just use:
- * <pre>
- * dateF = new SimpleDateFormat("yyMMddHHmmssz");
- * </pre>
- * To read in the time and get a date which is compatible with our local
- * time zone.
- * <p>
- * <b>Note:</b> In some cases, due to the local date processing, this
- * may lead to unexpected results. If you want to stick the normal
- * convention of 1950 to 2049 use the getAdjustedTime() method.
- */
- public String getTime()
- {
- String stime = Strings.fromByteArray(time);
-
- //
- // standardise the format.
- //
- if (stime.indexOf('-') < 0 && stime.indexOf('+') < 0)
- {
- if (stime.length() == 11)
- {
- return stime.substring(0, 10) + "00GMT+00:00";
- }
- else
- {
- return stime.substring(0, 12) + "GMT+00:00";
- }
- }
- else
- {
- int index = stime.indexOf('-');
- if (index < 0)
- {
- index = stime.indexOf('+');
- }
- String d = stime;
-
- if (index == stime.length() - 3)
- {
- d += "00";
- }
-
- if (index == 10)
- {
- return d.substring(0, 10) + "00GMT" + d.substring(10, 13) + ":" + d.substring(13, 15);
- }
- else
- {
- return d.substring(0, 12) + "GMT" + d.substring(12, 15) + ":" + d.substring(15, 17);
- }
- }
- }
-
- /**
- * return a time string as an adjusted date with a 4 digit year. This goes
- * in the range of 1950 - 2049.
- */
- public String getAdjustedTime()
- {
- String d = this.getTime();
-
- if (d.charAt(0) < '5')
- {
- return "20" + d;
- }
- else
- {
- return "19" + d;
- }
- }
-
- /**
- * Return the time.
- * @return The time string as it appeared in the encoded object.
- */
- public String getTimeString()
- {
- return Strings.fromByteArray(time);
- }
-
- boolean isConstructed()
- {
- return false;
- }
-
- int encodedLength()
- {
- int length = time.length;
-
- return 1 + StreamUtil.calculateBodyLength(length) + length;
- }
-
- void encode(
- ASN1OutputStream out)
- throws IOException
- {
- out.write(BERTags.UTC_TIME);
-
- int length = time.length;
-
- out.writeLength(length);
-
- for (int i = 0; i != length; i++)
- {
- out.write((byte)time[i]);
- }
- }
-
- boolean asn1Equals(
- ASN1Primitive o)
- {
- if (!(o instanceof DERUTCTime))
- {
- return false;
- }
-
- return Arrays.areEqual(time, ((DERUTCTime)o).time);
- }
-
- public int hashCode()
- {
- return Arrays.hashCode(time);
- }
-
- public String toString()
- {
- return Strings.fromByteArray(time);
- }
-}
diff --git a/libraries/spongycastle/core/src/main/j2me/org/spongycastle/asn1/DateFormatter.java b/libraries/spongycastle/core/src/main/j2me/org/spongycastle/asn1/DateFormatter.java
deleted file mode 100644
index 7201a2a4c..000000000
--- a/libraries/spongycastle/core/src/main/j2me/org/spongycastle/asn1/DateFormatter.java
+++ /dev/null
@@ -1,272 +0,0 @@
-package org.spongycastle.asn1;
-
-import java.util.Calendar;
-import java.util.Date;
-import java.util.TimeZone;
-
-class DateFormatter
-{
- // YYMMDDHHMMSSZ
- static String toUTCDateString(Date date)
- {
- Calendar calendar = Calendar.getInstance(TimeZone.getTimeZone("GMT"));
-
- calendar.setTime(date);
-
- return format2Year(calendar.get(Calendar.YEAR)) + format2(calendar.get(Calendar.MONTH) + 1) + format2(calendar.get(Calendar.DAY_OF_MONTH))
- + format2(calendar.get(Calendar.HOUR_OF_DAY)) + format2(calendar.get(Calendar.MINUTE)) + format2(calendar.get(Calendar.SECOND)) + "Z";
- }
-
- static Date adjustedFromUTCDateString(byte[] date)
- {
- Calendar calendar = Calendar.getInstance(TimeZone.getTimeZone("GMT"));
-
- int year = toInt2(date, 0);
-
- if (year < 50)
- {
- year += 2000;
- }
- else
- {
- year += 1900;
- }
-
- calendar.setTimeZone(TimeZone.getTimeZone("GMT"));
-
- calendar.set(Calendar.YEAR, year);
- calendar.set(Calendar.MONTH, toInt2(date, 2) - 1);
- calendar.set(Calendar.DAY_OF_MONTH, toInt2(date, 4));
- calendar.set(Calendar.HOUR_OF_DAY, toInt2(date, 6));
- calendar.set(Calendar.MINUTE, toInt2(date, 8));
-
- int tzChar = 10;
-
- if (isNumber(date, tzChar))
- {
- calendar.set(Calendar.SECOND, toInt2(date, 10));
- tzChar = 12;
- }
- else
- {
- calendar.set(Calendar.SECOND, 0);
- }
-
- calendar.set(Calendar.MILLISECOND, 0);
-
- if (date[tzChar] != 'Z')
- {
- int hoursOff = 0;
- int minutesOff = 0;
-
- hoursOff = toInt2(date, tzChar + 1) * 60 * 60 * 1000;
-
- if (date.length > tzChar + 3)
- {
- minutesOff = toInt2(date, tzChar + 3) * 60 * 1000;
- }
-
- if (date[tzChar] == '-')
- {
- return new Date(calendar.getTime().getTime() + hoursOff + minutesOff);
- }
- else
- {
- return new Date(calendar.getTime().getTime() - (hoursOff + minutesOff));
- }
- }
-
- return calendar.getTime();
- }
-
- static String getGeneralizedTimeDateString(Date date, boolean includeMillis)
- {
- Calendar calendar = Calendar.getInstance(TimeZone.getTimeZone("GMT"));
-
- calendar.setTime(date);
-
- String time = format4Year(calendar.get(Calendar.YEAR)) + format2(calendar.get(Calendar.MONTH) + 1) + format2(calendar.get(Calendar.DAY_OF_MONTH))
- + format2(calendar.get(Calendar.HOUR_OF_DAY)) + format2(calendar.get(Calendar.MINUTE)) + format2(calendar.get(Calendar.SECOND));
-
- if (includeMillis)
- {
- time += "." + format3(calendar.get(Calendar.MILLISECOND));
- }
-
- return time + "Z";
- }
-
- static Date fromGeneralizedTimeString(byte[] date)
- {
- Calendar calendar = Calendar.getInstance(TimeZone.getTimeZone("GMT"));
-
- int year = toInt4(date, 0);
-
- if (isLocalTime(date))
- {
- calendar.setTimeZone(TimeZone.getTimeZone("GMT"));
- }
-
- calendar.set(Calendar.YEAR, year);
- calendar.set(Calendar.MONTH, toInt2(date, 4) - 1);
- calendar.set(Calendar.DAY_OF_MONTH, toInt2(date, 6));
- calendar.set(Calendar.HOUR_OF_DAY, toInt2(date, 8));
- calendar.set(Calendar.MINUTE, toInt2(date, 10));
-
- int tzChar = 12;
-
- if (isNumber(date, tzChar))
- {
- calendar.set(Calendar.SECOND, toInt2(date, 12));
- tzChar = 14;
- }
- else
- {
- calendar.set(Calendar.SECOND, 0);
- }
-
- if (tzChar != date.length && date[tzChar] == '.')
- {
- int millis = 0;
- tzChar++;
- if (isNumber(date, tzChar))
- {
- millis = (date[tzChar] - '0') * 100;
- tzChar++;
- }
- if (tzChar != date.length && isNumber(date, tzChar))
- {
- millis += (date[tzChar] - '0') * 10;
- tzChar++;
- }
- if (tzChar != date.length && isNumber(date, tzChar))
- {
- millis += (date[tzChar] - '0');
- tzChar++;
- }
- calendar.set(Calendar.MILLISECOND, millis);
- }
- else
- {
- calendar.set(Calendar.MILLISECOND, 0);
- }
-
- // skip nano-seconds
- while (tzChar != date.length && isNumber(date, tzChar))
- {
- tzChar++;
- }
-
- if (tzChar != date.length && date[tzChar] != 'Z')
- {
- int hoursOff = 0;
- int minutesOff = 0;
-
- hoursOff = toInt2(date, tzChar + 1) * 60 * 60 * 1000;
-
- if (date.length > tzChar + 3)
- {
- minutesOff = toInt2(date, tzChar + 3) * 60 * 1000;
- }
-
- if (date[tzChar] == '-')
- {
- return new Date(calendar.getTime().getTime() + hoursOff + minutesOff);
- }
- else
- {
- return new Date(calendar.getTime().getTime() - (hoursOff + minutesOff));
- }
- }
-
- return calendar.getTime();
- }
-
- private static String format2(int v)
- {
- if (v < 10)
- {
- return "0" + v;
- }
-
- return Integer.toString(v);
- }
-
- private static String format2Year(int v)
- {
- if (v > 2000)
- {
- v = v - 2000;
- }
- else
- {
- v = v - 1900;
- }
-
- return format2(v);
- }
-
- private static String format3(int v)
- {
- if (v < 10)
- {
- return "00" + v;
- }
-
- if (v < 100)
- {
- return "0" + v;
- }
-
- return Integer.toString(v);
- }
-
- private static String format4Year(int v)
- {
- if (v < 10)
- {
- return "000" + v;
- }
-
- if (v < 100)
- {
- return "00" + v;
- }
-
- if (v < 1000)
- {
- return "0" + v;
- }
-
- return Integer.toString(v);
- }
-
- private static boolean isNumber(byte[] input, int off)
- {
- byte b = input[off];
- return (b >= '0') && (b <= '9');
- }
-
- private static boolean isLocalTime(byte[] date)
- {
- for (int i = date.length - 1; i > date.length - 6; i--)
- {
- if (date[i] == 'Z' || date[i] == '-' || date[i] == '+')
- {
- return false;
- }
- }
-
- return true;
- }
-
- private static int toInt2(byte[] input, int off)
- {
- return (input[off] - '0') * 10 + (input[off + 1] - '0');
- }
-
- private static int toInt4(byte[] input, int off)
- {
- return toInt2(input, off) * 100 + toInt2(input, off + 2) ;
- }
-}
diff --git a/libraries/spongycastle/core/src/main/j2me/org/spongycastle/asn1/StreamUtil.java b/libraries/spongycastle/core/src/main/j2me/org/spongycastle/asn1/StreamUtil.java
deleted file mode 100644
index 4f798ffa5..000000000
--- a/libraries/spongycastle/core/src/main/j2me/org/spongycastle/asn1/StreamUtil.java
+++ /dev/null
@@ -1,88 +0,0 @@
-package org.spongycastle.asn1;
-
-import java.io.ByteArrayInputStream;
-import java.io.IOException;
-import java.io.InputStream;
-
-class StreamUtil
-{
- /**
- * Find out possible longest length...
- *
- * @param in input stream of interest
- * @return length calculation or MAX_VALUE.
- */
- static int findLimit(InputStream in)
- {
- if (in instanceof LimitedInputStream)
- {
- return ((LimitedInputStream)in).getRemaining();
- }
- else if (in instanceof ASN1InputStream)
- {
- return ((ASN1InputStream)in).getLimit();
- }
- else if (in instanceof ByteArrayInputStream)
- {
- return ((ByteArrayInputStream)in).available();
- }
-
- return Integer.MAX_VALUE;
- }
-
- static int calculateBodyLength(
- int length)
- {
- int count = 1;
-
- if (length > 127)
- {
- int size = 1;
- int val = length;
-
- while ((val >>>= 8) != 0)
- {
- size++;
- }
-
- for (int i = (size - 1) * 8; i >= 0; i -= 8)
- {
- count++;
- }
- }
-
- return count;
- }
-
- static int calculateTagLength(int tagNo)
- throws IOException
- {
- int length = 1;
-
- if (tagNo >= 31)
- {
- if (tagNo < 128)
- {
- length++;
- }
- else
- {
- byte[] stack = new byte[5];
- int pos = stack.length;
-
- stack[--pos] = (byte)(tagNo & 0x7F);
-
- do
- {
- tagNo >>= 7;
- stack[--pos] = (byte)(tagNo & 0x7F | 0x80);
- }
- while (tagNo > 127);
-
- length += stack.length - pos;
- }
- }
-
- return length;
- }
-}
diff --git a/libraries/spongycastle/core/src/main/j2me/org/spongycastle/asn1/cms/Time.java b/libraries/spongycastle/core/src/main/j2me/org/spongycastle/asn1/cms/Time.java
deleted file mode 100644
index f9ddfc2ed..000000000
--- a/libraries/spongycastle/core/src/main/j2me/org/spongycastle/asn1/cms/Time.java
+++ /dev/null
@@ -1,122 +0,0 @@
-package org.spongycastle.asn1.cms;
-
-import java.util.Calendar;
-import java.util.Date;
-
-import org.spongycastle.asn1.ASN1Choice;
-import org.spongycastle.asn1.ASN1Object;
-import org.spongycastle.asn1.ASN1Primitive;
-import org.spongycastle.asn1.ASN1TaggedObject;
-import org.spongycastle.asn1.DERGeneralizedTime;
-import org.spongycastle.asn1.DERUTCTime;
-
-public class Time
- extends ASN1Object
- implements ASN1Choice
-{
- ASN1Primitive time;
-
- public static Time getInstance(
- ASN1TaggedObject obj,
- boolean explicit)
- {
- return getInstance(obj.getObject()); // must be explicitly tagged
- }
-
- public Time(
- ASN1Primitive time)
- {
- if (!(time instanceof DERUTCTime)
- && !(time instanceof DERGeneralizedTime))
- {
- throw new IllegalArgumentException("unknown object passed to Time");
- }
-
- this.time = time;
- }
-
- /**
- * creates a time object from a given date - if the date is between 1950
- * and 2049 a UTCTime object is generated, otherwise a GeneralizedTime
- * is used.
- */
- public Time(
- Date date)
- {
- Calendar calendar = Calendar.getInstance();
-
- calendar.setTime(date);
-
- int year = calendar.get(Calendar.YEAR);
-
- if (year < 1950 || year > 2049)
- {
- time = new DERGeneralizedTime(date);
- }
- else
- {
- time = new DERUTCTime(date);
- }
- }
-
- public static Time getInstance(
- Object obj)
- {
- if (obj == null || obj instanceof Time)
- {
- return (Time)obj;
- }
- else if (obj instanceof DERUTCTime)
- {
- return new Time((DERUTCTime)obj);
- }
- else if (obj instanceof DERGeneralizedTime)
- {
- return new Time((DERGeneralizedTime)obj);
- }
-
- throw new IllegalArgumentException("unknown object in factory: " + obj.getClass().getName());
- }
-
- public String getTime()
- {
- if (time instanceof DERUTCTime)
- {
- return ((DERUTCTime)time).getAdjustedTime();
- }
- else
- {
- return ((DERGeneralizedTime)time).getTime();
- }
- }
-
- public Date getDate()
- {
- if (time instanceof DERUTCTime)
- {
- return ((DERUTCTime)time).getAdjustedDate();
- }
- else
- {
- return ((DERGeneralizedTime)time).getDate();
- }
- }
-
- /**
- * Produce an object suitable for an ASN1OutputStream.
- * <pre>
- * Time ::= CHOICE {
- * utcTime UTCTime,
- * generalTime GeneralizedTime }
- * </pre>
- */
- public ASN1Primitive toASN1Primitive()
- {
- return time;
- }
-
- public String toString()
- {
- return getTime();
- }
-}
diff --git a/libraries/spongycastle/core/src/main/j2me/org/spongycastle/asn1/eac/PackedDate.java b/libraries/spongycastle/core/src/main/j2me/org/spongycastle/asn1/eac/PackedDate.java
deleted file mode 100644
index e2472251c..000000000
--- a/libraries/spongycastle/core/src/main/j2me/org/spongycastle/asn1/eac/PackedDate.java
+++ /dev/null
@@ -1,70 +0,0 @@
-package org.spongycastle.asn1.eac;
-
-import org.spongycastle.util.Arrays;
-
-/**
- * EAC encoding date object
- */
-public class PackedDate
-{
- private byte[] time;
-
- public PackedDate(
- String time)
- {
- this.time = convert(time);
- }
-
- private byte[] convert(String sTime)
- {
- char[] digs = sTime.toCharArray();
- byte[] date = new byte[6];
-
- for (int i = 0; i != 6; i++)
- {
- date[i] = (byte)(digs[i] - '0');
- }
-
- return date;
- }
-
- PackedDate(
- byte[] bytes)
- {
- this.time = bytes;
- }
-
- public int hashCode()
- {
- return Arrays.hashCode(time);
- }
-
- public boolean equals(Object o)
- {
- if (!(o instanceof PackedDate))
- {
- return false;
- }
-
- PackedDate other = (PackedDate)o;
-
- return Arrays.areEqual(time, other.time);
- }
-
- public String toString()
- {
- char[] dateC = new char[time.length];
-
- for (int i = 0; i != dateC.length; i++)
- {
- dateC[i] = (char)((time[i] & 0xff) + '0');
- }
-
- return new String(dateC);
- }
-
- public byte[] getEncoding()
- {
- return time;
- }
-}
diff --git a/libraries/spongycastle/core/src/main/j2me/org/spongycastle/asn1/x509/Time.java b/libraries/spongycastle/core/src/main/j2me/org/spongycastle/asn1/x509/Time.java
deleted file mode 100644
index 0fe22ddc7..000000000
--- a/libraries/spongycastle/core/src/main/j2me/org/spongycastle/asn1/x509/Time.java
+++ /dev/null
@@ -1,122 +0,0 @@
-package org.spongycastle.asn1.x509;
-
-import java.util.Calendar;
-import java.util.Date;
-
-import org.spongycastle.asn1.ASN1Choice;
-import org.spongycastle.asn1.ASN1Object;
-import org.spongycastle.asn1.ASN1Primitive;
-import org.spongycastle.asn1.ASN1TaggedObject;
-import org.spongycastle.asn1.DERGeneralizedTime;
-import org.spongycastle.asn1.DERUTCTime;
-
-public class Time
- extends ASN1Object
- implements ASN1Choice
-{
- ASN1Primitive time;
-
- public static Time getInstance(
- ASN1TaggedObject obj,
- boolean explicit)
- {
- return getInstance(obj.getObject()); // must be explicitly tagged
- }
-
- public Time(
- ASN1Primitive time)
- {
- if (!(time instanceof DERUTCTime)
- && !(time instanceof DERGeneralizedTime))
- {
- throw new IllegalArgumentException("unknown object passed to Time");
- }
-
- this.time = time;
- }
-
- /**
- * creates a time object from a given date - if the date is between 1950
- * and 2049 a UTCTime object is generated, otherwise a GeneralizedTime
- * is used.
- */
- public Time(
- Date date)
- {
- Calendar calendar = Calendar.getInstance();
-
- calendar.setTime(date);
-
- int year = calendar.get(Calendar.YEAR);
-
- if (year < 1950 || year > 2049)
- {
- time = new DERGeneralizedTime(date);
- }
- else
- {
- time = new DERUTCTime(date);
- }
- }
-
- public static Time getInstance(
- Object obj)
- {
- if (obj == null || obj instanceof Time)
- {
- return (Time)obj;
- }
- else if (obj instanceof DERUTCTime)
- {
- return new Time((DERUTCTime)obj);
- }
- else if (obj instanceof DERGeneralizedTime)
- {
- return new Time((DERGeneralizedTime)obj);
- }
-
- throw new IllegalArgumentException("unknown object in factory: " + obj.getClass().getName());
- }
-
- public String getTime()
- {
- if (time instanceof DERUTCTime)
- {
- return ((DERUTCTime)time).getAdjustedTime();
- }
- else
- {
- return ((DERGeneralizedTime)time).getTime();
- }
- }
-
- public Date getDate()
- {
- if (time instanceof DERUTCTime)
- {
- return ((DERUTCTime)time).getAdjustedDate();
- }
- else
- {
- return ((DERGeneralizedTime)time).getDate();
- }
- }
-
- /**
- * Produce an object suitable for an ASN1OutputStream.
- * <pre>
- * Time ::= CHOICE {
- * utcTime UTCTime,
- * generalTime GeneralizedTime }
- * </pre>
- */
- public ASN1Primitive toASN1Primitive()
- {
- return time;
- }
-
- public String toString()
- {
- return getTime();
- }
-}
diff --git a/libraries/spongycastle/core/src/main/j2me/org/spongycastle/crypto/encodings/PKCS1Encoding.java b/libraries/spongycastle/core/src/main/j2me/org/spongycastle/crypto/encodings/PKCS1Encoding.java
deleted file mode 100644
index 3149a1f37..000000000
--- a/libraries/spongycastle/core/src/main/j2me/org/spongycastle/crypto/encodings/PKCS1Encoding.java
+++ /dev/null
@@ -1,238 +0,0 @@
-package org.spongycastle.crypto.encodings;
-
-import org.spongycastle.crypto.AsymmetricBlockCipher;
-import org.spongycastle.crypto.CipherParameters;
-import org.spongycastle.crypto.InvalidCipherTextException;
-import org.spongycastle.crypto.params.AsymmetricKeyParameter;
-import org.spongycastle.crypto.params.ParametersWithRandom;
-
-import java.security.SecureRandom;
-
-/**
- * this does your basic PKCS 1 v1.5 padding - whether or not you should be using this
- * depends on your application - see PKCS1 Version 2 for details.
- */
-public class PKCS1Encoding
- implements AsymmetricBlockCipher
-{
- /**
- * some providers fail to include the leading zero in PKCS1 encoded blocks. If you need to
- * work with one of these set the system property org.spongycastle.pkcs1.strict to false.
- * <p>
- * The system property is checked during construction of the encoding object, it is set to
- * true by default.
- * </p>
- */
- public static final String STRICT_LENGTH_ENABLED_PROPERTY = "org.spongycastle.pkcs1.strict";
-
- private static final int HEADER_LENGTH = 10;
-
- private SecureRandom random;
- private AsymmetricBlockCipher engine;
- private boolean forEncryption;
- private boolean forPrivateKey;
- private boolean useStrictLength;
-
- /**
- * Basic constructor.
- * @param cipher
- */
- public PKCS1Encoding(
- AsymmetricBlockCipher cipher)
- {
- this.engine = cipher;
- this.useStrictLength = useStrict();
- }
-
- //
- // for J2ME compatibility
- //
- private boolean useStrict()
- {
- String strict = System.getProperty(STRICT_LENGTH_ENABLED_PROPERTY);
-
- return strict == null || strict.equals("true");
- }
-
- public AsymmetricBlockCipher getUnderlyingCipher()
- {
- return engine;
- }
-
- public void init(
- boolean forEncryption,
- CipherParameters param)
- {
- AsymmetricKeyParameter kParam;
-
- if (param instanceof ParametersWithRandom)
- {
- ParametersWithRandom rParam = (ParametersWithRandom)param;
-
- this.random = rParam.getRandom();
- kParam = (AsymmetricKeyParameter)rParam.getParameters();
- }
- else
- {
- this.random = new SecureRandom();
- kParam = (AsymmetricKeyParameter)param;
- }
-
- engine.init(forEncryption, param);
-
- this.forPrivateKey = kParam.isPrivate();
- this.forEncryption = forEncryption;
- }
-
- public int getInputBlockSize()
- {
- int baseBlockSize = engine.getInputBlockSize();
-
- if (forEncryption)
- {
- return baseBlockSize - HEADER_LENGTH;
- }
- else
- {
- return baseBlockSize;
- }
- }
-
- public int getOutputBlockSize()
- {
- int baseBlockSize = engine.getOutputBlockSize();
-
- if (forEncryption)
- {
- return baseBlockSize;
- }
- else
- {
- return baseBlockSize - HEADER_LENGTH;
- }
- }
-
- public byte[] processBlock(
- byte[] in,
- int inOff,
- int inLen)
- throws InvalidCipherTextException
- {
- if (forEncryption)
- {
- return encodeBlock(in, inOff, inLen);
- }
- else
- {
- return decodeBlock(in, inOff, inLen);
- }
- }
-
- private byte[] encodeBlock(
- byte[] in,
- int inOff,
- int inLen)
- throws InvalidCipherTextException
- {
- if (inLen > getInputBlockSize())
- {
- throw new IllegalArgumentException("input data too large");
- }
-
- byte[] block = new byte[engine.getInputBlockSize()];
-
- if (forPrivateKey)
- {
- block[0] = 0x01; // type code 1
-
- for (int i = 1; i != block.length - inLen - 1; i++)
- {
- block[i] = (byte)0xFF;
- }
- }
- else
- {
- random.nextBytes(block); // random fill
-
- block[0] = 0x02; // type code 2
-
- //
- // a zero byte marks the end of the padding, so all
- // the pad bytes must be non-zero.
- //
- for (int i = 1; i != block.length - inLen - 1; i++)
- {
- while (block[i] == 0)
- {
- block[i] = (byte)random.nextInt();
- }
- }
- }
-
- block[block.length - inLen - 1] = 0x00; // mark the end of the padding
- System.arraycopy(in, inOff, block, block.length - inLen, inLen);
-
- return engine.processBlock(block, 0, block.length);
- }
-
- /**
- * @exception InvalidCipherTextException if the decrypted block is not in PKCS1 format.
- */
- private byte[] decodeBlock(
- byte[] in,
- int inOff,
- int inLen)
- throws InvalidCipherTextException
- {
- byte[] block = engine.processBlock(in, inOff, inLen);
-
- if (block.length < getOutputBlockSize())
- {
- throw new InvalidCipherTextException("block truncated");
- }
-
- byte type = block[0];
-
- if (type != 1 && type != 2)
- {
- throw new InvalidCipherTextException("unknown block type");
- }
-
- if (useStrictLength && block.length != engine.getOutputBlockSize())
- {
- throw new InvalidCipherTextException("block incorrect size");
- }
-
- //
- // find and extract the message block.
- //
- int start;
-
- for (start = 1; start != block.length; start++)
- {
- byte pad = block[start];
-
- if (pad == 0)
- {
- break;
- }
- if (type == 1 && pad != (byte)0xff)
- {
- throw new InvalidCipherTextException("block padding incorrect");
- }
- }
-
- start++; // data should start at the next byte
-
- if (start > block.length || start < HEADER_LENGTH)
- {
- throw new InvalidCipherTextException("no data in block");
- }
-
- byte[] result = new byte[block.length - start];
-
- System.arraycopy(block, start, result, 0, result.length);
-
- return result;
- }
-}
diff --git a/libraries/spongycastle/core/src/main/j2me/org/spongycastle/crypto/examples/MIDPTest.java b/libraries/spongycastle/core/src/main/j2me/org/spongycastle/crypto/examples/MIDPTest.java
deleted file mode 100644
index 32908a67e..000000000
--- a/libraries/spongycastle/core/src/main/j2me/org/spongycastle/crypto/examples/MIDPTest.java
+++ /dev/null
@@ -1,177 +0,0 @@
-package org.spongycastle.crypto.examples;
-
-import java.io.*;
-import java.lang.*;
-
-import javax.microedition.midlet.MIDlet;
-import javax.microedition.lcdui.*;
-
-import org.spongycastle.util.test.*;
-import org.spongycastle.util.encoders.*;
-
-import org.spongycastle.crypto.*;
-import org.spongycastle.crypto.paddings.*;
-import org.spongycastle.crypto.engines.*;
-import org.spongycastle.crypto.modes.*;
-import org.spongycastle.crypto.params.*;
-
-/**
- * MIDP is a simple graphics application for the J2ME CLDC/MIDP.
- *
- * It has hardcoded values for the key and plain text. It also performs the
- * standard testing for the chosen cipher, and displays the results.
- *
- * This example shows how to use the light-weight API and a symmetric cipher.
- *
- */
-public class MIDPTest extends MIDlet
-{
- private Display d = null;
-
- private boolean doneEncrypt = false;
-
- private String key = "0123456789abcdef0123456789abcdef";
- private String plainText = "www.bouncycastle.org";
- private byte[] keyBytes = null;
- private byte[] cipherText = null;
- private BufferedBlockCipher cipher = null;
-
- private String[] cipherNames = {"DES", "DESede", "IDEA", "Rijndael", "Twofish"};
-
- private Form output = null;
-
- public void startApp()
- {
- Display.getDisplay(this).setCurrent(output);
- }
-
- public void pauseApp()
- {
-
- }
-
- public void destroyApp(boolean unconditional)
- {
-
- }
-
- public MIDPTest()
- {
- output = new Form("BouncyCastle");
- output.append("Key: " + key.substring(0, 7) + "...\n");
- output.append("In : " + plainText.substring(0, 7) + "...\n");
-
- cipherText = performEncrypt(Hex.decode(key.getBytes()), plainText);
- String ctS = new String(Hex.encode(cipherText));
-
- output.append("\nCT : " + ctS.substring(0, 7) + "...\n");
-
- String decryptText = performDecrypt(Hex.decode(key.getBytes()), cipherText);
-
- output.append("PT : " + decryptText.substring(0, 7) + "...\n");
-
- if (decryptText.compareTo(plainText) == 0)
- {
- output.append("Success");
- }
- else
- {
- output.append("Failure");
- message("[" + plainText + "]");
- message("[" + decryptText + "]");
- }
-
- }
-
- private byte[] performEncrypt(byte[] key, String plainText)
- {
- byte[] ptBytes = plainText.getBytes();
-
- cipher = new PaddedBufferedBlockCipher(new CBCBlockCipher(getEngineInstance()));
-
- String name = cipher.getUnderlyingCipher().getAlgorithmName();
- message("Using " + name);
-
- cipher.init(true, new KeyParameter(key));
-
- byte[] rv = new byte[cipher.getOutputSize(ptBytes.length)];
-
- int oLen = cipher.processBytes(ptBytes, 0, ptBytes.length, rv, 0);
- try
- {
- cipher.doFinal(rv, oLen);
- }
- catch (CryptoException ce)
- {
- message("Ooops, encrypt exception");
- status(ce.toString());
- }
- return rv;
- }
-
- private String performDecrypt(byte[] key, byte[] cipherText)
- {
- cipher.init(false, new KeyParameter(key));
-
- byte[] rv = new byte[cipher.getOutputSize(cipherText.length)];
-
- int oLen = cipher.processBytes(cipherText, 0, cipherText.length, rv, 0);
- try
- {
- cipher.doFinal(rv, oLen);
- }
- catch (CryptoException ce)
- {
- message("Ooops, decrypt exception");
- status(ce.toString());
- }
- return new String(rv).trim();
- }
-
- private int whichCipher()
- {
- return 4; // DES
- }
-
- private BlockCipher getEngineInstance()
- {
- // returns a block cipher according to the current
- // state of the radio button lists. This is only
- // done prior to encryption.
- BlockCipher rv = null;
-
- switch (whichCipher())
- {
- case 0 :
- rv = new DESEngine();
- break;
- case 1 :
- rv = new DESedeEngine();
- break;
- case 2 :
- rv = new IDEAEngine();
- break;
- case 3 :
- rv = new RijndaelEngine();
- break;
- case 4 :
- rv = new TwofishEngine();
- break;
- default :
- rv = new DESEngine();
- break;
- }
- return rv;
- }
-
- public void message(String s)
- {
- System.out.println("M:" + s);
- }
-
- public void status(String s)
- {
- System.out.println("S:" + s);
- }
-
-}
diff --git a/libraries/spongycastle/core/src/main/j2me/org/spongycastle/crypto/examples/midp_test.jad b/libraries/spongycastle/core/src/main/j2me/org/spongycastle/crypto/examples/midp_test.jad
deleted file mode 100644
index 584f3156c..000000000
--- a/libraries/spongycastle/core/src/main/j2me/org/spongycastle/crypto/examples/midp_test.jad
+++ /dev/null
@@ -1,6 +0,0 @@
-MIDlet-1: MIDPTest, , org.spongycastle.crypto.examples.MIDPTest
-MIDlet-Name: MIDPTest
-MIDlet-Jar-Size: 300000
-MIDlet-Jar-URL: midp_test.jar
-MIDlet-Vendor: The Legion of the Bouncy Castle
-MIDlet-Version: 1.0.0
diff --git a/libraries/spongycastle/core/src/main/j2me/org/spongycastle/crypto/examples/midp_test.mf b/libraries/spongycastle/core/src/main/j2me/org/spongycastle/crypto/examples/midp_test.mf
deleted file mode 100644
index 273521093..000000000
--- a/libraries/spongycastle/core/src/main/j2me/org/spongycastle/crypto/examples/midp_test.mf
+++ /dev/null
@@ -1,7 +0,0 @@
-MIDlet-1: MIDPTTest, , org.spongycastle.crypto.examples.MIDPTest
-MIDlet-Name: MIDPTest
-MIDlet-Version: 1.0.0
-MIDlet-Vendor: Jon Eaves
-Created-By: 1.3.1 (Sun Microsystems Inc.)
-MicroEdition-Configuration: CLDC-1.0
-MicroEdition-Profile: MIDP-1.0
diff --git a/libraries/spongycastle/core/src/main/j2me/org/spongycastle/crypto/params/SkeinParameters.java b/libraries/spongycastle/core/src/main/j2me/org/spongycastle/crypto/params/SkeinParameters.java
deleted file mode 100644
index b29cd4418..000000000
--- a/libraries/spongycastle/core/src/main/j2me/org/spongycastle/crypto/params/SkeinParameters.java
+++ /dev/null
@@ -1,258 +0,0 @@
-package org.spongycastle.crypto.params;
-
-import java.io.ByteArrayOutputStream;
-import java.io.IOException;
-import java.io.OutputStreamWriter;
-import java.util.Date;
-import java.util.Enumeration;
-import java.util.Hashtable;
-
-import org.spongycastle.crypto.CipherParameters;
-import org.spongycastle.crypto.digests.SkeinDigest;
-import org.spongycastle.crypto.digests.SkeinEngine;
-import org.spongycastle.crypto.macs.SkeinMac;
-import org.spongycastle.util.Integers;
-
-/**
- * Parameters for the Skein hash function - a series of byte[] strings identified by integer tags.
- * <p/>
- * Parameterised Skein can be used for:
- * <ul>
- * <li>MAC generation, by providing a {@link SkeinParameters.Builder#setKey(byte[]) key}.</li>
- * <li>Randomised hashing, by providing a {@link SkeinParameters.Builder#setNonce(byte[]) nonce}.</li>
- * <li>A hash function for digital signatures, associating a
- * {@link SkeinParameters.Builder#setPublicKey(byte[]) public key} with the message digest.</li>
- * <li>A key derivation function, by providing a
- * {@link SkeinParameters.Builder#setKeyIdentifier(byte[]) key identifier}.</li>
- * <li>Personalised hashing, by providing a
- * {@link SkeinParameters.Builder#setPersonalisation(Date, String, String) recommended format} or
- * {@link SkeinParameters.Builder#setPersonalisation(byte[]) arbitrary} personalisation string.</li>
- * </ul>
- *
- * @see SkeinEngine
- * @see SkeinDigest
- * @see SkeinMac
- */
-public class SkeinParameters
- implements CipherParameters
-{
- /**
- * The parameter type for a secret key, supporting MAC or KDF functions: {@value
- * #PARAM_TYPE_KEY}.
- */
- public static final int PARAM_TYPE_KEY = 0;
-
- /**
- * The parameter type for the Skein configuration block: {@value #PARAM_TYPE_CONFIG}.
- */
- public static final int PARAM_TYPE_CONFIG = 4;
-
- /**
- * The parameter type for a personalisation string: {@value #PARAM_TYPE_PERSONALISATION}.
- */
- public static final int PARAM_TYPE_PERSONALISATION = 8;
-
- /**
- * The parameter type for a public key: {@value #PARAM_TYPE_PUBLIC_KEY}.
- */
- public static final int PARAM_TYPE_PUBLIC_KEY = 12;
-
- /**
- * The parameter type for a key identifier string: {@value #PARAM_TYPE_KEY_IDENTIFIER}.
- */
- public static final int PARAM_TYPE_KEY_IDENTIFIER = 16;
-
- /**
- * The parameter type for a nonce: {@value #PARAM_TYPE_NONCE}.
- */
- public static final int PARAM_TYPE_NONCE = 20;
-
- /**
- * The parameter type for the message: {@value #PARAM_TYPE_MESSAGE}.
- */
- public static final int PARAM_TYPE_MESSAGE = 48;
-
- /**
- * The parameter type for the output transformation: {@value #PARAM_TYPE_OUTPUT}.
- */
- public static final int PARAM_TYPE_OUTPUT = 63;
-
- private Hashtable parameters;
-
- public SkeinParameters()
- {
- this(new Hashtable());
- }
-
- private SkeinParameters(final Hashtable parameters)
- {
- this.parameters = parameters;
- }
-
- /**
- * Obtains a map of type (Integer) to value (byte[]) for the parameters tracked in this object.
- */
- public Hashtable getParameters()
- {
- return parameters;
- }
-
- /**
- * Obtains the value of the {@link #PARAM_TYPE_KEY key parameter}, or <code>null</code> if not
- * set.
- */
- public byte[] getKey()
- {
- return (byte[])parameters.get(Integers.valueOf(PARAM_TYPE_KEY));
- }
-
- /**
- * Obtains the value of the {@link #PARAM_TYPE_PERSONALISATION personalisation parameter}, or
- * <code>null</code> if not set.
- */
- public byte[] getPersonalisation()
- {
- return (byte[])parameters.get(Integers.valueOf(PARAM_TYPE_PERSONALISATION));
- }
-
- /**
- * Obtains the value of the {@link #PARAM_TYPE_PUBLIC_KEY public key parameter}, or
- * <code>null</code> if not set.
- */
- public byte[] getPublicKey()
- {
- return (byte[])parameters.get(Integers.valueOf(PARAM_TYPE_PUBLIC_KEY));
- }
-
- /**
- * Obtains the value of the {@link #PARAM_TYPE_KEY_IDENTIFIER key identifier parameter}, or
- * <code>null</code> if not set.
- */
- public byte[] getKeyIdentifier()
- {
- return (byte[])parameters.get(Integers.valueOf(PARAM_TYPE_KEY_IDENTIFIER));
- }
-
- /**
- * Obtains the value of the {@link #PARAM_TYPE_NONCE nonce parameter}, or <code>null</code> if
- * not set.
- */
- public byte[] getNonce()
- {
- return (byte[])parameters.get(Integers.valueOf(PARAM_TYPE_NONCE));
- }
-
- /**
- * A builder for {@link SkeinParameters}.
- */
- public static class Builder
- {
- private Hashtable parameters = new Hashtable();
-
- public Builder()
- {
- }
-
- public Builder(Hashtable paramsMap)
- {
- Enumeration keys = paramsMap.keys();
- while (keys.hasMoreElements())
- {
- Integer key = (Integer)keys.nextElement();
- parameters.put(key, paramsMap.get(key));
- }
- }
-
- public Builder(SkeinParameters params)
- {
- Enumeration keys = params.parameters.keys();
- while (keys.hasMoreElements())
- {
- Integer key = (Integer)keys.nextElement();
- parameters.put(key, params.parameters.get(key));
- }
- }
-
- /**
- * Sets a parameters to apply to the Skein hash function.<br>
- * Parameter types must be in the range 0,5..62, and cannot use the value {@value
- * SkeinParameters#PARAM_TYPE_MESSAGE} (reserved for message body).
- * <p/>
- * Parameters with type < {@value SkeinParameters#PARAM_TYPE_MESSAGE} are processed before
- * the message content, parameters with type > {@value SkeinParameters#PARAM_TYPE_MESSAGE}
- * are processed after the message and prior to output.
- *
- * @param type the type of the parameter, in the range 5..62.
- * @param value the byte sequence of the parameter.
- * @return
- */
- public Builder set(int type, byte[] value)
- {
- if (value == null)
- {
- throw new IllegalArgumentException("Parameter value must not be null.");
- }
- if ((type != PARAM_TYPE_KEY)
- && (type <= PARAM_TYPE_CONFIG || type >= PARAM_TYPE_OUTPUT || type == PARAM_TYPE_MESSAGE))
- {
- throw new IllegalArgumentException("Parameter types must be in the range 0,5..47,49..62.");
- }
- if (type == PARAM_TYPE_CONFIG)
- {
- throw new IllegalArgumentException("Parameter type " + PARAM_TYPE_CONFIG
- + " is reserved for internal use.");
- }
- this.parameters.put(Integers.valueOf(type), value);
- return this;
- }
-
- /**
- * Sets the {@link SkeinParameters#PARAM_TYPE_KEY} parameter.
- */
- public Builder setKey(byte[] key)
- {
- return set(PARAM_TYPE_KEY, key);
- }
-
- /**
- * Sets the {@link SkeinParameters#PARAM_TYPE_PERSONALISATION} parameter.
- */
- public Builder setPersonalisation(byte[] personalisation)
- {
- return set(PARAM_TYPE_PERSONALISATION, personalisation);
- }
-
- /**
- * Sets the {@link SkeinParameters#PARAM_TYPE_KEY_IDENTIFIER} parameter.
- */
- public Builder setPublicKey(byte[] publicKey)
- {
- return set(PARAM_TYPE_PUBLIC_KEY, publicKey);
- }
-
- /**
- * Sets the {@link SkeinParameters#PARAM_TYPE_KEY_IDENTIFIER} parameter.
- */
- public Builder setKeyIdentifier(byte[] keyIdentifier)
- {
- return set(PARAM_TYPE_KEY_IDENTIFIER, keyIdentifier);
- }
-
- /**
- * Sets the {@link SkeinParameters#PARAM_TYPE_NONCE} parameter.
- */
- public Builder setNonce(byte[] nonce)
- {
- return set(PARAM_TYPE_NONCE, nonce);
- }
-
- /**
- * Constructs a new {@link SkeinParameters} instance with the parameters provided to this
- * builder.
- */
- public SkeinParameters build()
- {
- return new SkeinParameters(parameters);
- }
- }
-}
diff --git a/libraries/spongycastle/core/src/main/j2me/org/spongycastle/crypto/tls/OCSPStatusRequest.java b/libraries/spongycastle/core/src/main/j2me/org/spongycastle/crypto/tls/OCSPStatusRequest.java
deleted file mode 100644
index c66d76dc7..000000000
--- a/libraries/spongycastle/core/src/main/j2me/org/spongycastle/crypto/tls/OCSPStatusRequest.java
+++ /dev/null
@@ -1,131 +0,0 @@
-package org.spongycastle.crypto.tls;
-
-import java.io.ByteArrayInputStream;
-import java.io.ByteArrayOutputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.OutputStream;
-import java.util.Vector;
-
-import org.spongycastle.asn1.ASN1Encoding;
-import org.spongycastle.asn1.ocsp.ResponderID;
-import org.spongycastle.asn1.x509.Extensions;
-
-/**
- * RFC 3546 3.6
- */
-public class OCSPStatusRequest
-{
- protected Vector responderIDList;
- protected Extensions requestExtensions;
-
- /**
- * @param responderIDList
- * a {@link Vector} of {@link ResponderID}, specifying the list of trusted OCSP
- * responders. An empty list has the special meaning that the responders are
- * implicitly known to the server - e.g., by prior arrangement.
- * @param requestExtensions
- * OCSP request extensions. A null value means that there are no extensions.
- */
- public OCSPStatusRequest(Vector responderIDList, Extensions requestExtensions)
- {
- this.responderIDList = responderIDList;
- this.requestExtensions = requestExtensions;
- }
-
- /**
- * @return a {@link Vector} of {@link ResponderID}
- */
- public Vector getResponderIDList()
- {
- return responderIDList;
- }
-
- /**
- * @return OCSP request extensions
- */
- public Extensions getRequestExtensions()
- {
- return requestExtensions;
- }
-
- /**
- * Encode this {@link OCSPStatusRequest} to an {@link OutputStream}.
- *
- * @param output
- * the {@link OutputStream} to encode to.
- * @throws IOException
- */
- public void encode(OutputStream output) throws IOException
- {
- if (responderIDList == null || responderIDList.isEmpty())
- {
- TlsUtils.writeUint16(0, output);
- }
- else
- {
- ByteArrayOutputStream buf = new ByteArrayOutputStream();
- for (int i = 0; i < responderIDList.size(); ++i)
- {
- ResponderID responderID = (ResponderID) responderIDList.elementAt(i);
- byte[] derEncoding = responderID.getEncoded(ASN1Encoding.DER);
- TlsUtils.writeOpaque16(derEncoding, buf);
- }
- TlsUtils.checkUint16(buf.size());
- TlsUtils.writeUint16(buf.size(), output);
- output.write(buf.toByteArray());
- }
-
- if (requestExtensions == null)
- {
- TlsUtils.writeUint16(0, output);
- }
- else
- {
- byte[] derEncoding = requestExtensions.getEncoded(ASN1Encoding.DER);
- TlsUtils.checkUint16(derEncoding.length);
- TlsUtils.writeUint16(derEncoding.length, output);
- output.write(derEncoding);
- }
- }
-
- /**
- * Parse a {@link OCSPStatusRequest} from an {@link InputStream}.
- *
- * @param input
- * the {@link InputStream} to parse from.
- * @return a {@link OCSPStatusRequest} object.
- * @throws IOException
- */
- public static OCSPStatusRequest parse(InputStream input) throws IOException
- {
- Vector responderIDList = new Vector();
- {
- int length = TlsUtils.readUint16(input);
- if (length > 0)
- {
- byte[] data = TlsUtils.readFully(length, input);
- ByteArrayInputStream buf = new ByteArrayInputStream(data);
- do
- {
- byte[] derEncoding = TlsUtils.readOpaque16(buf);
- ResponderID responderID = ResponderID.getInstance(TlsUtils.readDERObject(derEncoding));
- responderIDList.addElement(responderID);
- }
- while (buf.available() > 0);
- }
- }
-
- Extensions requestExtensions = null;
- {
- int length = TlsUtils.readUint16(input);
- if (length > 0)
- {
- byte[] derEncoding = TlsUtils.readFully(length, input);
- requestExtensions = Extensions.getInstance(TlsUtils.readDERObject(derEncoding));
- }
- }
-
- return new OCSPStatusRequest(responderIDList, requestExtensions);
- }
-}
diff --git a/libraries/spongycastle/core/src/main/j2me/org/spongycastle/crypto/tls/ServerNameList.java b/libraries/spongycastle/core/src/main/j2me/org/spongycastle/crypto/tls/ServerNameList.java
deleted file mode 100644
index 09817e6be..000000000
--- a/libraries/spongycastle/core/src/main/j2me/org/spongycastle/crypto/tls/ServerNameList.java
+++ /dev/null
@@ -1,86 +0,0 @@
-package org.spongycastle.crypto.tls;
-
-import java.io.ByteArrayInputStream;
-import java.io.ByteArrayOutputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.OutputStream;
-import java.util.Vector;
-
-public class ServerNameList
-{
- protected Vector serverNameList;
-
- /**
- * @param serverNameList a {@link Vector} of {@link ServerName}.
- */
- public ServerNameList(Vector serverNameList)
- {
- if (serverNameList == null || serverNameList.isEmpty())
- {
- throw new IllegalArgumentException("'serverNameList' must not be null or empty");
- }
-
- this.serverNameList = serverNameList;
- }
-
- /**
- * @return a {@link Vector} of {@link ServerName}.
- */
- public Vector getServerNameList()
- {
- return serverNameList;
- }
-
- /**
- * Encode this {@link ServerNameList} to an {@link OutputStream}.
- *
- * @param output
- * the {@link OutputStream} to encode to.
- * @throws IOException
- */
- public void encode(OutputStream output) throws IOException
- {
- ByteArrayOutputStream buf = new ByteArrayOutputStream();
-
- for (int i = 0; i < serverNameList.size(); ++i)
- {
- ServerName entry = (ServerName)serverNameList.elementAt(i);
- entry.encode(buf);
- }
-
- TlsUtils.checkUint16(buf.size());
- TlsUtils.writeUint16(buf.size(), output);
- output.write(buf.toByteArray());
- }
-
- /**
- * Parse a {@link ServerNameList} from an {@link InputStream}.
- *
- * @param input
- * the {@link InputStream} to parse from.
- * @return a {@link ServerNameList} object.
- * @throws IOException
- */
- public static ServerNameList parse(InputStream input) throws IOException
- {
- int length = TlsUtils.readUint16(input);
- if (length < 1)
- {
- throw new TlsFatalAlert(AlertDescription.decode_error);
- }
-
- byte[] data = TlsUtils.readFully(length, input);
-
- ByteArrayInputStream buf = new ByteArrayInputStream(data);
-
- Vector server_name_list = new Vector();
- while (buf.available() > 0)
- {
- ServerName entry = ServerName.parse(buf);
- server_name_list.addElement(entry);
- }
-
- return new ServerNameList(server_name_list);
- }
-}
diff --git a/libraries/spongycastle/core/src/main/j2me/org/spongycastle/crypto/tls/UDPTransport.java b/libraries/spongycastle/core/src/main/j2me/org/spongycastle/crypto/tls/UDPTransport.java
deleted file mode 100644
index ea287144b..000000000
--- a/libraries/spongycastle/core/src/main/j2me/org/spongycastle/crypto/tls/UDPTransport.java
+++ /dev/null
@@ -1,107 +0,0 @@
-package org.spongycastle.crypto.tls;
-
-import java.io.IOException;
-import javax.microedition.io.DatagramConnection;
-import javax.microedition.io.Datagram;
-
-public class UDPTransport
- implements DatagramTransport
-{
-
- protected final static int MIN_IP_OVERHEAD = 20;
- protected final static int MAX_IP_OVERHEAD = MIN_IP_OVERHEAD + 64;
- protected final static int UDP_OVERHEAD = 8;
-
- protected final DatagramConnection socket;
- protected final int receiveLimit, sendLimit;
-
- public UDPTransport(DatagramConnection socket, int mtu)
- throws IOException
- {
- //
- // In 1.3 and earlier sockets were bound and connected during creation
- //
- //if (!socket.isBound() || !socket.isConnected())
- //{
- // throw new IllegalArgumentException("'socket' must be bound and connected");
- //}
-
- this.socket = socket;
-
- // NOTE: As of JDK 1.6, can use NetworkInterface.getMTU
-
- this.receiveLimit = mtu - MIN_IP_OVERHEAD - UDP_OVERHEAD;
- this.sendLimit = mtu - MAX_IP_OVERHEAD - UDP_OVERHEAD;
- }
-
- public int getReceiveLimit()
- {
- return receiveLimit;
- }
-
- public int getSendLimit()
- {
- // TODO[DTLS] Implement Path-MTU discovery?
- return sendLimit;
- }
-
- public int receive(byte[] buf, int off, int len, int waitMillis)
- throws IOException
- {
- //socket.setSoTimeout(waitMillis); -- not applicable
-
- if (off == 0)
- {
- Datagram packet = socket.newDatagram(buf, len);
- socket.receive(packet);
-
- return packet.getLength();
- }
- else
- {
- byte[] rv = new byte[len];
-
- Datagram packet = socket.newDatagram(rv, len);
- socket.receive(packet);
-
- System.arraycopy(rv, 0, buf, off, packet.getLength());
-
- return packet.getLength();
- }
- }
-
- public void send(byte[] buf, int off, int len)
- throws IOException
- {
- if (len > getSendLimit())
- {
- /*
- * RFC 4347 4.1.1. "If the application attempts to send a record larger than the MTU,
- * the DTLS implementation SHOULD generate an error, thus avoiding sending a packet
- * which will be fragmented."
- */
- // TODO Exception
- }
-
- if (off == 0)
- {
- Datagram packet = socket.newDatagram(buf, len);
- socket.send(packet);
- }
- else
- {
- byte[] data = new byte[len];
-
- System.arraycopy(buf, off, data, 0, len);
-
- Datagram packet = socket.newDatagram(data, len);
- socket.send(packet);
- }
- }
-
- public void close()
- throws IOException
- {
- socket.close();
- }
-}
diff --git a/libraries/spongycastle/core/src/main/j2me/org/spongycastle/math/ec/LongArray.java b/libraries/spongycastle/core/src/main/j2me/org/spongycastle/math/ec/LongArray.java
deleted file mode 100644
index 70117db78..000000000
--- a/libraries/spongycastle/core/src/main/j2me/org/spongycastle/math/ec/LongArray.java
+++ /dev/null
@@ -1,1997 +0,0 @@
-package org.spongycastle.math.ec;
-
-import org.spongycastle.util.Arrays;
-
-import java.math.BigInteger;
-
-class LongArray
-{
-// private static long DEINTERLEAVE_MASK = 0x5555555555555555L;
-
- /*
- * This expands 8 bit indices into 16 bit contents (high bit 14), by inserting 0s between bits.
- * In a binary field, this operation is the same as squaring an 8 bit number.
- */
- private static final int[] INTERLEAVE2_TABLE = new int[]
- {
- 0x0000, 0x0001, 0x0004, 0x0005, 0x0010, 0x0011, 0x0014, 0x0015,
- 0x0040, 0x0041, 0x0044, 0x0045, 0x0050, 0x0051, 0x0054, 0x0055,
- 0x0100, 0x0101, 0x0104, 0x0105, 0x0110, 0x0111, 0x0114, 0x0115,
- 0x0140, 0x0141, 0x0144, 0x0145, 0x0150, 0x0151, 0x0154, 0x0155,
- 0x0400, 0x0401, 0x0404, 0x0405, 0x0410, 0x0411, 0x0414, 0x0415,
- 0x0440, 0x0441, 0x0444, 0x0445, 0x0450, 0x0451, 0x0454, 0x0455,
- 0x0500, 0x0501, 0x0504, 0x0505, 0x0510, 0x0511, 0x0514, 0x0515,
- 0x0540, 0x0541, 0x0544, 0x0545, 0x0550, 0x0551, 0x0554, 0x0555,
- 0x1000, 0x1001, 0x1004, 0x1005, 0x1010, 0x1011, 0x1014, 0x1015,
- 0x1040, 0x1041, 0x1044, 0x1045, 0x1050, 0x1051, 0x1054, 0x1055,
- 0x1100, 0x1101, 0x1104, 0x1105, 0x1110, 0x1111, 0x1114, 0x1115,
- 0x1140, 0x1141, 0x1144, 0x1145, 0x1150, 0x1151, 0x1154, 0x1155,
- 0x1400, 0x1401, 0x1404, 0x1405, 0x1410, 0x1411, 0x1414, 0x1415,
- 0x1440, 0x1441, 0x1444, 0x1445, 0x1450, 0x1451, 0x1454, 0x1455,
- 0x1500, 0x1501, 0x1504, 0x1505, 0x1510, 0x1511, 0x1514, 0x1515,
- 0x1540, 0x1541, 0x1544, 0x1545, 0x1550, 0x1551, 0x1554, 0x1555,
- 0x4000, 0x4001, 0x4004, 0x4005, 0x4010, 0x4011, 0x4014, 0x4015,
- 0x4040, 0x4041, 0x4044, 0x4045, 0x4050, 0x4051, 0x4054, 0x4055,
- 0x4100, 0x4101, 0x4104, 0x4105, 0x4110, 0x4111, 0x4114, 0x4115,
- 0x4140, 0x4141, 0x4144, 0x4145, 0x4150, 0x4151, 0x4154, 0x4155,
- 0x4400, 0x4401, 0x4404, 0x4405, 0x4410, 0x4411, 0x4414, 0x4415,
- 0x4440, 0x4441, 0x4444, 0x4445, 0x4450, 0x4451, 0x4454, 0x4455,
- 0x4500, 0x4501, 0x4504, 0x4505, 0x4510, 0x4511, 0x4514, 0x4515,
- 0x4540, 0x4541, 0x4544, 0x4545, 0x4550, 0x4551, 0x4554, 0x4555,
- 0x5000, 0x5001, 0x5004, 0x5005, 0x5010, 0x5011, 0x5014, 0x5015,
- 0x5040, 0x5041, 0x5044, 0x5045, 0x5050, 0x5051, 0x5054, 0x5055,
- 0x5100, 0x5101, 0x5104, 0x5105, 0x5110, 0x5111, 0x5114, 0x5115,
- 0x5140, 0x5141, 0x5144, 0x5145, 0x5150, 0x5151, 0x5154, 0x5155,
- 0x5400, 0x5401, 0x5404, 0x5405, 0x5410, 0x5411, 0x5414, 0x5415,
- 0x5440, 0x5441, 0x5444, 0x5445, 0x5450, 0x5451, 0x5454, 0x5455,
- 0x5500, 0x5501, 0x5504, 0x5505, 0x5510, 0x5511, 0x5514, 0x5515,
- 0x5540, 0x5541, 0x5544, 0x5545, 0x5550, 0x5551, 0x5554, 0x5555
- };
-
- /*
- * This expands 7 bit indices into 21 bit contents (high bit 18), by inserting 0s between bits.
- */
- private static final int[] INTERLEAVE3_TABLE = new int[]
- {
- 0x00000, 0x00001, 0x00008, 0x00009, 0x00040, 0x00041, 0x00048, 0x00049,
- 0x00200, 0x00201, 0x00208, 0x00209, 0x00240, 0x00241, 0x00248, 0x00249,
- 0x01000, 0x01001, 0x01008, 0x01009, 0x01040, 0x01041, 0x01048, 0x01049,
- 0x01200, 0x01201, 0x01208, 0x01209, 0x01240, 0x01241, 0x01248, 0x01249,
- 0x08000, 0x08001, 0x08008, 0x08009, 0x08040, 0x08041, 0x08048, 0x08049,
- 0x08200, 0x08201, 0x08208, 0x08209, 0x08240, 0x08241, 0x08248, 0x08249,
- 0x09000, 0x09001, 0x09008, 0x09009, 0x09040, 0x09041, 0x09048, 0x09049,
- 0x09200, 0x09201, 0x09208, 0x09209, 0x09240, 0x09241, 0x09248, 0x09249,
- 0x40000, 0x40001, 0x40008, 0x40009, 0x40040, 0x40041, 0x40048, 0x40049,
- 0x40200, 0x40201, 0x40208, 0x40209, 0x40240, 0x40241, 0x40248, 0x40249,
- 0x41000, 0x41001, 0x41008, 0x41009, 0x41040, 0x41041, 0x41048, 0x41049,
- 0x41200, 0x41201, 0x41208, 0x41209, 0x41240, 0x41241, 0x41248, 0x41249,
- 0x48000, 0x48001, 0x48008, 0x48009, 0x48040, 0x48041, 0x48048, 0x48049,
- 0x48200, 0x48201, 0x48208, 0x48209, 0x48240, 0x48241, 0x48248, 0x48249,
- 0x49000, 0x49001, 0x49008, 0x49009, 0x49040, 0x49041, 0x49048, 0x49049,
- 0x49200, 0x49201, 0x49208, 0x49209, 0x49240, 0x49241, 0x49248, 0x49249
- };
-
- /*
- * This expands 8 bit indices into 32 bit contents (high bit 28), by inserting 0s between bits.
- */
- private static final int[] INTERLEAVE4_TABLE = new int[]
- {
- 0x00000000, 0x00000001, 0x00000010, 0x00000011, 0x00000100, 0x00000101, 0x00000110, 0x00000111,
- 0x00001000, 0x00001001, 0x00001010, 0x00001011, 0x00001100, 0x00001101, 0x00001110, 0x00001111,
- 0x00010000, 0x00010001, 0x00010010, 0x00010011, 0x00010100, 0x00010101, 0x00010110, 0x00010111,
- 0x00011000, 0x00011001, 0x00011010, 0x00011011, 0x00011100, 0x00011101, 0x00011110, 0x00011111,
- 0x00100000, 0x00100001, 0x00100010, 0x00100011, 0x00100100, 0x00100101, 0x00100110, 0x00100111,
- 0x00101000, 0x00101001, 0x00101010, 0x00101011, 0x00101100, 0x00101101, 0x00101110, 0x00101111,
- 0x00110000, 0x00110001, 0x00110010, 0x00110011, 0x00110100, 0x00110101, 0x00110110, 0x00110111,
- 0x00111000, 0x00111001, 0x00111010, 0x00111011, 0x00111100, 0x00111101, 0x00111110, 0x00111111,
- 0x01000000, 0x01000001, 0x01000010, 0x01000011, 0x01000100, 0x01000101, 0x01000110, 0x01000111,
- 0x01001000, 0x01001001, 0x01001010, 0x01001011, 0x01001100, 0x01001101, 0x01001110, 0x01001111,
- 0x01010000, 0x01010001, 0x01010010, 0x01010011, 0x01010100, 0x01010101, 0x01010110, 0x01010111,
- 0x01011000, 0x01011001, 0x01011010, 0x01011011, 0x01011100, 0x01011101, 0x01011110, 0x01011111,
- 0x01100000, 0x01100001, 0x01100010, 0x01100011, 0x01100100, 0x01100101, 0x01100110, 0x01100111,
- 0x01101000, 0x01101001, 0x01101010, 0x01101011, 0x01101100, 0x01101101, 0x01101110, 0x01101111,
- 0x01110000, 0x01110001, 0x01110010, 0x01110011, 0x01110100, 0x01110101, 0x01110110, 0x01110111,
- 0x01111000, 0x01111001, 0x01111010, 0x01111011, 0x01111100, 0x01111101, 0x01111110, 0x01111111,
- 0x10000000, 0x10000001, 0x10000010, 0x10000011, 0x10000100, 0x10000101, 0x10000110, 0x10000111,
- 0x10001000, 0x10001001, 0x10001010, 0x10001011, 0x10001100, 0x10001101, 0x10001110, 0x10001111,
- 0x10010000, 0x10010001, 0x10010010, 0x10010011, 0x10010100, 0x10010101, 0x10010110, 0x10010111,
- 0x10011000, 0x10011001, 0x10011010, 0x10011011, 0x10011100, 0x10011101, 0x10011110, 0x10011111,
- 0x10100000, 0x10100001, 0x10100010, 0x10100011, 0x10100100, 0x10100101, 0x10100110, 0x10100111,
- 0x10101000, 0x10101001, 0x10101010, 0x10101011, 0x10101100, 0x10101101, 0x10101110, 0x10101111,
- 0x10110000, 0x10110001, 0x10110010, 0x10110011, 0x10110100, 0x10110101, 0x10110110, 0x10110111,
- 0x10111000, 0x10111001, 0x10111010, 0x10111011, 0x10111100, 0x10111101, 0x10111110, 0x10111111,
- 0x11000000, 0x11000001, 0x11000010, 0x11000011, 0x11000100, 0x11000101, 0x11000110, 0x11000111,
- 0x11001000, 0x11001001, 0x11001010, 0x11001011, 0x11001100, 0x11001101, 0x11001110, 0x11001111,
- 0x11010000, 0x11010001, 0x11010010, 0x11010011, 0x11010100, 0x11010101, 0x11010110, 0x11010111,
- 0x11011000, 0x11011001, 0x11011010, 0x11011011, 0x11011100, 0x11011101, 0x11011110, 0x11011111,
- 0x11100000, 0x11100001, 0x11100010, 0x11100011, 0x11100100, 0x11100101, 0x11100110, 0x11100111,
- 0x11101000, 0x11101001, 0x11101010, 0x11101011, 0x11101100, 0x11101101, 0x11101110, 0x11101111,
- 0x11110000, 0x11110001, 0x11110010, 0x11110011, 0x11110100, 0x11110101, 0x11110110, 0x11110111,
- 0x11111000, 0x11111001, 0x11111010, 0x11111011, 0x11111100, 0x11111101, 0x11111110, 0x11111111
- };
-
- /*
- * This expands 7 bit indices into 35 bit contents (high bit 30), by inserting 0s between bits.
- */
- private static final int[] INTERLEAVE5_TABLE = new int[] {
- 0x00000000, 0x00000001, 0x00000020, 0x00000021, 0x00000400, 0x00000401, 0x00000420, 0x00000421,
- 0x00008000, 0x00008001, 0x00008020, 0x00008021, 0x00008400, 0x00008401, 0x00008420, 0x00008421,
- 0x00100000, 0x00100001, 0x00100020, 0x00100021, 0x00100400, 0x00100401, 0x00100420, 0x00100421,
- 0x00108000, 0x00108001, 0x00108020, 0x00108021, 0x00108400, 0x00108401, 0x00108420, 0x00108421,
- 0x02000000, 0x02000001, 0x02000020, 0x02000021, 0x02000400, 0x02000401, 0x02000420, 0x02000421,
- 0x02008000, 0x02008001, 0x02008020, 0x02008021, 0x02008400, 0x02008401, 0x02008420, 0x02008421,
- 0x02100000, 0x02100001, 0x02100020, 0x02100021, 0x02100400, 0x02100401, 0x02100420, 0x02100421,
- 0x02108000, 0x02108001, 0x02108020, 0x02108021, 0x02108400, 0x02108401, 0x02108420, 0x02108421,
- 0x40000000, 0x40000001, 0x40000020, 0x40000021, 0x40000400, 0x40000401, 0x40000420, 0x40000421,
- 0x40008000, 0x40008001, 0x40008020, 0x40008021, 0x40008400, 0x40008401, 0x40008420, 0x40008421,
- 0x40100000, 0x40100001, 0x40100020, 0x40100021, 0x40100400, 0x40100401, 0x40100420, 0x40100421,
- 0x40108000, 0x40108001, 0x40108020, 0x40108021, 0x40108400, 0x40108401, 0x40108420, 0x40108421,
- 0x42000000, 0x42000001, 0x42000020, 0x42000021, 0x42000400, 0x42000401, 0x42000420, 0x42000421,
- 0x42008000, 0x42008001, 0x42008020, 0x42008021, 0x42008400, 0x42008401, 0x42008420, 0x42008421,
- 0x42100000, 0x42100001, 0x42100020, 0x42100021, 0x42100400, 0x42100401, 0x42100420, 0x42100421,
- 0x42108000, 0x42108001, 0x42108020, 0x42108021, 0x42108400, 0x42108401, 0x42108420, 0x42108421
- };
-
- /*
- * This expands 9 bit indices into 63 bit (long) contents (high bit 56), by inserting 0s between bits.
- */
- private static final long[] INTERLEAVE7_TABLE = new long[]
- {
- 0x0000000000000000L, 0x0000000000000001L, 0x0000000000000080L, 0x0000000000000081L,
- 0x0000000000004000L, 0x0000000000004001L, 0x0000000000004080L, 0x0000000000004081L,
- 0x0000000000200000L, 0x0000000000200001L, 0x0000000000200080L, 0x0000000000200081L,
- 0x0000000000204000L, 0x0000000000204001L, 0x0000000000204080L, 0x0000000000204081L,
- 0x0000000010000000L, 0x0000000010000001L, 0x0000000010000080L, 0x0000000010000081L,
- 0x0000000010004000L, 0x0000000010004001L, 0x0000000010004080L, 0x0000000010004081L,
- 0x0000000010200000L, 0x0000000010200001L, 0x0000000010200080L, 0x0000000010200081L,
- 0x0000000010204000L, 0x0000000010204001L, 0x0000000010204080L, 0x0000000010204081L,
- 0x0000000800000000L, 0x0000000800000001L, 0x0000000800000080L, 0x0000000800000081L,
- 0x0000000800004000L, 0x0000000800004001L, 0x0000000800004080L, 0x0000000800004081L,
- 0x0000000800200000L, 0x0000000800200001L, 0x0000000800200080L, 0x0000000800200081L,
- 0x0000000800204000L, 0x0000000800204001L, 0x0000000800204080L, 0x0000000800204081L,
- 0x0000000810000000L, 0x0000000810000001L, 0x0000000810000080L, 0x0000000810000081L,
- 0x0000000810004000L, 0x0000000810004001L, 0x0000000810004080L, 0x0000000810004081L,
- 0x0000000810200000L, 0x0000000810200001L, 0x0000000810200080L, 0x0000000810200081L,
- 0x0000000810204000L, 0x0000000810204001L, 0x0000000810204080L, 0x0000000810204081L,
- 0x0000040000000000L, 0x0000040000000001L, 0x0000040000000080L, 0x0000040000000081L,
- 0x0000040000004000L, 0x0000040000004001L, 0x0000040000004080L, 0x0000040000004081L,
- 0x0000040000200000L, 0x0000040000200001L, 0x0000040000200080L, 0x0000040000200081L,
- 0x0000040000204000L, 0x0000040000204001L, 0x0000040000204080L, 0x0000040000204081L,
- 0x0000040010000000L, 0x0000040010000001L, 0x0000040010000080L, 0x0000040010000081L,
- 0x0000040010004000L, 0x0000040010004001L, 0x0000040010004080L, 0x0000040010004081L,
- 0x0000040010200000L, 0x0000040010200001L, 0x0000040010200080L, 0x0000040010200081L,
- 0x0000040010204000L, 0x0000040010204001L, 0x0000040010204080L, 0x0000040010204081L,
- 0x0000040800000000L, 0x0000040800000001L, 0x0000040800000080L, 0x0000040800000081L,
- 0x0000040800004000L, 0x0000040800004001L, 0x0000040800004080L, 0x0000040800004081L,
- 0x0000040800200000L, 0x0000040800200001L, 0x0000040800200080L, 0x0000040800200081L,
- 0x0000040800204000L, 0x0000040800204001L, 0x0000040800204080L, 0x0000040800204081L,
- 0x0000040810000000L, 0x0000040810000001L, 0x0000040810000080L, 0x0000040810000081L,
- 0x0000040810004000L, 0x0000040810004001L, 0x0000040810004080L, 0x0000040810004081L,
- 0x0000040810200000L, 0x0000040810200001L, 0x0000040810200080L, 0x0000040810200081L,
- 0x0000040810204000L, 0x0000040810204001L, 0x0000040810204080L, 0x0000040810204081L,
- 0x0002000000000000L, 0x0002000000000001L, 0x0002000000000080L, 0x0002000000000081L,
- 0x0002000000004000L, 0x0002000000004001L, 0x0002000000004080L, 0x0002000000004081L,
- 0x0002000000200000L, 0x0002000000200001L, 0x0002000000200080L, 0x0002000000200081L,
- 0x0002000000204000L, 0x0002000000204001L, 0x0002000000204080L, 0x0002000000204081L,
- 0x0002000010000000L, 0x0002000010000001L, 0x0002000010000080L, 0x0002000010000081L,
- 0x0002000010004000L, 0x0002000010004001L, 0x0002000010004080L, 0x0002000010004081L,
- 0x0002000010200000L, 0x0002000010200001L, 0x0002000010200080L, 0x0002000010200081L,
- 0x0002000010204000L, 0x0002000010204001L, 0x0002000010204080L, 0x0002000010204081L,
- 0x0002000800000000L, 0x0002000800000001L, 0x0002000800000080L, 0x0002000800000081L,
- 0x0002000800004000L, 0x0002000800004001L, 0x0002000800004080L, 0x0002000800004081L,
- 0x0002000800200000L, 0x0002000800200001L, 0x0002000800200080L, 0x0002000800200081L,
- 0x0002000800204000L, 0x0002000800204001L, 0x0002000800204080L, 0x0002000800204081L,
- 0x0002000810000000L, 0x0002000810000001L, 0x0002000810000080L, 0x0002000810000081L,
- 0x0002000810004000L, 0x0002000810004001L, 0x0002000810004080L, 0x0002000810004081L,
- 0x0002000810200000L, 0x0002000810200001L, 0x0002000810200080L, 0x0002000810200081L,
- 0x0002000810204000L, 0x0002000810204001L, 0x0002000810204080L, 0x0002000810204081L,
- 0x0002040000000000L, 0x0002040000000001L, 0x0002040000000080L, 0x0002040000000081L,
- 0x0002040000004000L, 0x0002040000004001L, 0x0002040000004080L, 0x0002040000004081L,
- 0x0002040000200000L, 0x0002040000200001L, 0x0002040000200080L, 0x0002040000200081L,
- 0x0002040000204000L, 0x0002040000204001L, 0x0002040000204080L, 0x0002040000204081L,
- 0x0002040010000000L, 0x0002040010000001L, 0x0002040010000080L, 0x0002040010000081L,
- 0x0002040010004000L, 0x0002040010004001L, 0x0002040010004080L, 0x0002040010004081L,
- 0x0002040010200000L, 0x0002040010200001L, 0x0002040010200080L, 0x0002040010200081L,
- 0x0002040010204000L, 0x0002040010204001L, 0x0002040010204080L, 0x0002040010204081L,
- 0x0002040800000000L, 0x0002040800000001L, 0x0002040800000080L, 0x0002040800000081L,
- 0x0002040800004000L, 0x0002040800004001L, 0x0002040800004080L, 0x0002040800004081L,
- 0x0002040800200000L, 0x0002040800200001L, 0x0002040800200080L, 0x0002040800200081L,
- 0x0002040800204000L, 0x0002040800204001L, 0x0002040800204080L, 0x0002040800204081L,
- 0x0002040810000000L, 0x0002040810000001L, 0x0002040810000080L, 0x0002040810000081L,
- 0x0002040810004000L, 0x0002040810004001L, 0x0002040810004080L, 0x0002040810004081L,
- 0x0002040810200000L, 0x0002040810200001L, 0x0002040810200080L, 0x0002040810200081L,
- 0x0002040810204000L, 0x0002040810204001L, 0x0002040810204080L, 0x0002040810204081L,
- 0x0100000000000000L, 0x0100000000000001L, 0x0100000000000080L, 0x0100000000000081L,
- 0x0100000000004000L, 0x0100000000004001L, 0x0100000000004080L, 0x0100000000004081L,
- 0x0100000000200000L, 0x0100000000200001L, 0x0100000000200080L, 0x0100000000200081L,
- 0x0100000000204000L, 0x0100000000204001L, 0x0100000000204080L, 0x0100000000204081L,
- 0x0100000010000000L, 0x0100000010000001L, 0x0100000010000080L, 0x0100000010000081L,
- 0x0100000010004000L, 0x0100000010004001L, 0x0100000010004080L, 0x0100000010004081L,
- 0x0100000010200000L, 0x0100000010200001L, 0x0100000010200080L, 0x0100000010200081L,
- 0x0100000010204000L, 0x0100000010204001L, 0x0100000010204080L, 0x0100000010204081L,
- 0x0100000800000000L, 0x0100000800000001L, 0x0100000800000080L, 0x0100000800000081L,
- 0x0100000800004000L, 0x0100000800004001L, 0x0100000800004080L, 0x0100000800004081L,
- 0x0100000800200000L, 0x0100000800200001L, 0x0100000800200080L, 0x0100000800200081L,
- 0x0100000800204000L, 0x0100000800204001L, 0x0100000800204080L, 0x0100000800204081L,
- 0x0100000810000000L, 0x0100000810000001L, 0x0100000810000080L, 0x0100000810000081L,
- 0x0100000810004000L, 0x0100000810004001L, 0x0100000810004080L, 0x0100000810004081L,
- 0x0100000810200000L, 0x0100000810200001L, 0x0100000810200080L, 0x0100000810200081L,
- 0x0100000810204000L, 0x0100000810204001L, 0x0100000810204080L, 0x0100000810204081L,
- 0x0100040000000000L, 0x0100040000000001L, 0x0100040000000080L, 0x0100040000000081L,
- 0x0100040000004000L, 0x0100040000004001L, 0x0100040000004080L, 0x0100040000004081L,
- 0x0100040000200000L, 0x0100040000200001L, 0x0100040000200080L, 0x0100040000200081L,
- 0x0100040000204000L, 0x0100040000204001L, 0x0100040000204080L, 0x0100040000204081L,
- 0x0100040010000000L, 0x0100040010000001L, 0x0100040010000080L, 0x0100040010000081L,
- 0x0100040010004000L, 0x0100040010004001L, 0x0100040010004080L, 0x0100040010004081L,
- 0x0100040010200000L, 0x0100040010200001L, 0x0100040010200080L, 0x0100040010200081L,
- 0x0100040010204000L, 0x0100040010204001L, 0x0100040010204080L, 0x0100040010204081L,
- 0x0100040800000000L, 0x0100040800000001L, 0x0100040800000080L, 0x0100040800000081L,
- 0x0100040800004000L, 0x0100040800004001L, 0x0100040800004080L, 0x0100040800004081L,
- 0x0100040800200000L, 0x0100040800200001L, 0x0100040800200080L, 0x0100040800200081L,
- 0x0100040800204000L, 0x0100040800204001L, 0x0100040800204080L, 0x0100040800204081L,
- 0x0100040810000000L, 0x0100040810000001L, 0x0100040810000080L, 0x0100040810000081L,
- 0x0100040810004000L, 0x0100040810004001L, 0x0100040810004080L, 0x0100040810004081L,
- 0x0100040810200000L, 0x0100040810200001L, 0x0100040810200080L, 0x0100040810200081L,
- 0x0100040810204000L, 0x0100040810204001L, 0x0100040810204080L, 0x0100040810204081L,
- 0x0102000000000000L, 0x0102000000000001L, 0x0102000000000080L, 0x0102000000000081L,
- 0x0102000000004000L, 0x0102000000004001L, 0x0102000000004080L, 0x0102000000004081L,
- 0x0102000000200000L, 0x0102000000200001L, 0x0102000000200080L, 0x0102000000200081L,
- 0x0102000000204000L, 0x0102000000204001L, 0x0102000000204080L, 0x0102000000204081L,
- 0x0102000010000000L, 0x0102000010000001L, 0x0102000010000080L, 0x0102000010000081L,
- 0x0102000010004000L, 0x0102000010004001L, 0x0102000010004080L, 0x0102000010004081L,
- 0x0102000010200000L, 0x0102000010200001L, 0x0102000010200080L, 0x0102000010200081L,
- 0x0102000010204000L, 0x0102000010204001L, 0x0102000010204080L, 0x0102000010204081L,
- 0x0102000800000000L, 0x0102000800000001L, 0x0102000800000080L, 0x0102000800000081L,
- 0x0102000800004000L, 0x0102000800004001L, 0x0102000800004080L, 0x0102000800004081L,
- 0x0102000800200000L, 0x0102000800200001L, 0x0102000800200080L, 0x0102000800200081L,
- 0x0102000800204000L, 0x0102000800204001L, 0x0102000800204080L, 0x0102000800204081L,
- 0x0102000810000000L, 0x0102000810000001L, 0x0102000810000080L, 0x0102000810000081L,
- 0x0102000810004000L, 0x0102000810004001L, 0x0102000810004080L, 0x0102000810004081L,
- 0x0102000810200000L, 0x0102000810200001L, 0x0102000810200080L, 0x0102000810200081L,
- 0x0102000810204000L, 0x0102000810204001L, 0x0102000810204080L, 0x0102000810204081L,
- 0x0102040000000000L, 0x0102040000000001L, 0x0102040000000080L, 0x0102040000000081L,
- 0x0102040000004000L, 0x0102040000004001L, 0x0102040000004080L, 0x0102040000004081L,
- 0x0102040000200000L, 0x0102040000200001L, 0x0102040000200080L, 0x0102040000200081L,
- 0x0102040000204000L, 0x0102040000204001L, 0x0102040000204080L, 0x0102040000204081L,
- 0x0102040010000000L, 0x0102040010000001L, 0x0102040010000080L, 0x0102040010000081L,
- 0x0102040010004000L, 0x0102040010004001L, 0x0102040010004080L, 0x0102040010004081L,
- 0x0102040010200000L, 0x0102040010200001L, 0x0102040010200080L, 0x0102040010200081L,
- 0x0102040010204000L, 0x0102040010204001L, 0x0102040010204080L, 0x0102040010204081L,
- 0x0102040800000000L, 0x0102040800000001L, 0x0102040800000080L, 0x0102040800000081L,
- 0x0102040800004000L, 0x0102040800004001L, 0x0102040800004080L, 0x0102040800004081L,
- 0x0102040800200000L, 0x0102040800200001L, 0x0102040800200080L, 0x0102040800200081L,
- 0x0102040800204000L, 0x0102040800204001L, 0x0102040800204080L, 0x0102040800204081L,
- 0x0102040810000000L, 0x0102040810000001L, 0x0102040810000080L, 0x0102040810000081L,
- 0x0102040810004000L, 0x0102040810004001L, 0x0102040810004080L, 0x0102040810004081L,
- 0x0102040810200000L, 0x0102040810200001L, 0x0102040810200080L, 0x0102040810200081L,
- 0x0102040810204000L, 0x0102040810204001L, 0x0102040810204080L, 0x0102040810204081L
- };
-
- // For toString(); must have length 64
- private static final String ZEROES = "0000000000000000000000000000000000000000000000000000000000000000";
-
- final static byte[] bitLengths =
- {
- 0, 1, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4,
- 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
- 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
- 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
- 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
- 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
- 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
- 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
- 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
- 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
- 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
- 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
- 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
- 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
- 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
- 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8
- };
-
- // TODO make m fixed for the LongArray, and hence compute T once and for all
-
- private long[] m_ints;
-
- public LongArray(int intLen)
- {
- m_ints = new long[intLen];
- }
-
- public LongArray(long[] ints)
- {
- m_ints = ints;
- }
-
- public LongArray(long[] ints, int off, int len)
- {
- if (off == 0 && len == ints.length)
- {
- m_ints = ints;
- }
- else
- {
- m_ints = new long[len];
- System.arraycopy(ints, off, m_ints, 0, len);
- }
- }
-
- public LongArray(BigInteger bigInt)
- {
- if (bigInt == null || bigInt.signum() < 0)
- {
- throw new IllegalArgumentException("invalid F2m field value");
- }
-
- if (bigInt.signum() == 0)
- {
- m_ints = new long[] { 0L };
- return;
- }
-
- byte[] barr = bigInt.toByteArray();
- int barrLen = barr.length;
- int barrStart = 0;
- if (barr[0] == 0)
- {
- // First byte is 0 to enforce highest (=sign) bit is zero.
- // In this case ignore barr[0].
- barrLen--;
- barrStart = 1;
- }
- int intLen = (barrLen + 7) / 8;
- m_ints = new long[intLen];
-
- int iarrJ = intLen - 1;
- int rem = barrLen % 8 + barrStart;
- long temp = 0;
- int barrI = barrStart;
- if (barrStart < rem)
- {
- for (; barrI < rem; barrI++)
- {
- temp <<= 8;
- int barrBarrI = barr[barrI] & 0xFF;
- temp |= barrBarrI;
- }
- m_ints[iarrJ--] = temp;
- }
-
- for (; iarrJ >= 0; iarrJ--)
- {
- temp = 0;
- for (int i = 0; i < 8; i++)
- {
- temp <<= 8;
- int barrBarrI = barr[barrI++] & 0xFF;
- temp |= barrBarrI;
- }
- m_ints[iarrJ] = temp;
- }
- }
-
- public boolean isZero()
- {
- long[] a = m_ints;
- for (int i = 0; i < a.length; ++i)
- {
- if (a[i] != 0L)
- {
- return false;
- }
- }
- return true;
- }
-
- public int getUsedLength()
- {
- return getUsedLengthFrom(m_ints.length);
- }
-
- public int getUsedLengthFrom(int from)
- {
- long[] a = m_ints;
- from = Math.min(from, a.length);
-
- if (from < 1)
- {
- return 0;
- }
-
- // Check if first element will act as sentinel
- if (a[0] != 0)
- {
- while (a[--from] == 0)
- {
- }
- return from + 1;
- }
-
- do
- {
- if (a[--from] != 0)
- {
- return from + 1;
- }
- }
- while (from > 0);
-
- return 0;
- }
-
- public int degree()
- {
- int i = m_ints.length;
- long w;
- do
- {
- if (i == 0)
- {
- return 0;
- }
- w = m_ints[--i];
- }
- while (w == 0);
-
- return (i << 6) + bitLength(w);
- }
-
- private int degreeFrom(int limit)
- {
- int i = (limit + 62) >>> 6;
- long w;
- do
- {
- if (i == 0)
- {
- return 0;
- }
- w = m_ints[--i];
- }
- while (w == 0);
-
- return (i << 6) + bitLength(w);
- }
-
-// private int lowestCoefficient()
-// {
-// for (int i = 0; i < m_ints.length; ++i)
-// {
-// long mi = m_ints[i];
-// if (mi != 0)
-// {
-// int j = 0;
-// while ((mi & 0xFFL) == 0)
-// {
-// j += 8;
-// mi >>>= 8;
-// }
-// while ((mi & 1L) == 0)
-// {
-// ++j;
-// mi >>>= 1;
-// }
-// return (i << 6) + j;
-// }
-// }
-// return -1;
-// }
-
- private static int bitLength(long w)
- {
- int u = (int)(w >>> 32), b;
- if (u == 0)
- {
- u = (int)w;
- b = 0;
- }
- else
- {
- b = 32;
- }
-
- int t = u >>> 16, k;
- if (t == 0)
- {
- t = u >>> 8;
- k = (t == 0) ? bitLengths[u] : 8 + bitLengths[t];
- }
- else
- {
- int v = t >>> 8;
- k = (v == 0) ? 16 + bitLengths[t] : 24 + bitLengths[v];
- }
-
- return b + k;
- }
-
- private long[] resizedInts(int newLen)
- {
- long[] newInts = new long[newLen];
- System.arraycopy(m_ints, 0, newInts, 0, Math.min(m_ints.length, newLen));
- return newInts;
- }
-
- public BigInteger toBigInteger()
- {
- int usedLen = getUsedLength();
- if (usedLen == 0)
- {
- return ECConstants.ZERO;
- }
-
- long highestInt = m_ints[usedLen - 1];
- byte[] temp = new byte[8];
- int barrI = 0;
- boolean trailingZeroBytesDone = false;
- for (int j = 7; j >= 0; j--)
- {
- byte thisByte = (byte)(highestInt >>> (8 * j));
- if (trailingZeroBytesDone || (thisByte != 0))
- {
- trailingZeroBytesDone = true;
- temp[barrI++] = thisByte;
- }
- }
-
- int barrLen = 8 * (usedLen - 1) + barrI;
- byte[] barr = new byte[barrLen];
- for (int j = 0; j < barrI; j++)
- {
- barr[j] = temp[j];
- }
- // Highest value int is done now
-
- for (int iarrJ = usedLen - 2; iarrJ >= 0; iarrJ--)
- {
- long mi = m_ints[iarrJ];
- for (int j = 7; j >= 0; j--)
- {
- barr[barrI++] = (byte)(mi >>> (8 * j));
- }
- }
- return new BigInteger(1, barr);
- }
-
-// private static long shiftUp(long[] x, int xOff, int count)
-// {
-// long prev = 0;
-// for (int i = 0; i < count; ++i)
-// {
-// long next = x[xOff + i];
-// x[xOff + i] = (next << 1) | prev;
-// prev = next >>> 63;
-// }
-// return prev;
-// }
-
- private static long shiftUp(long[] x, int xOff, int count, int shift)
- {
- int shiftInv = 64 - shift;
- long prev = 0;
- for (int i = 0; i < count; ++i)
- {
- long next = x[xOff + i];
- x[xOff + i] = (next << shift) | prev;
- prev = next >>> shiftInv;
- }
- return prev;
- }
-
- private static long shiftUp(long[] x, int xOff, long[] z, int zOff, int count, int shift)
- {
- int shiftInv = 64 - shift;
- long prev = 0;
- for (int i = 0; i < count; ++i)
- {
- long next = x[xOff + i];
- z[zOff + i] = (next << shift) | prev;
- prev = next >>> shiftInv;
- }
- return prev;
- }
-
- public LongArray addOne()
- {
- if (m_ints.length == 0)
- {
- return new LongArray(new long[]{ 1L });
- }
-
- int resultLen = Math.max(1, getUsedLength());
- long[] ints = resizedInts(resultLen);
- ints[0] ^= 1L;
- return new LongArray(ints);
- }
-
-// private void addShiftedByBits(LongArray other, int bits)
-// {
-// int words = bits >>> 6;
-// int shift = bits & 0x3F;
-//
-// if (shift == 0)
-// {
-// addShiftedByWords(other, words);
-// return;
-// }
-//
-// int otherUsedLen = other.getUsedLength();
-// if (otherUsedLen == 0)
-// {
-// return;
-// }
-//
-// int minLen = otherUsedLen + words + 1;
-// if (minLen > m_ints.length)
-// {
-// m_ints = resizedInts(minLen);
-// }
-//
-// long carry = addShiftedByBits(m_ints, words, other.m_ints, 0, otherUsedLen, shift);
-// m_ints[otherUsedLen + words] ^= carry;
-// }
-
- private void addShiftedByBitsSafe(LongArray other, int otherDegree, int bits)
- {
- int otherLen = (otherDegree + 63) >>> 6;
-
- int words = bits >>> 6;
- int shift = bits & 0x3F;
-
- if (shift == 0)
- {
- add(m_ints, words, other.m_ints, 0, otherLen);
- return;
- }
-
- long carry = addShiftedUp(m_ints, words, other.m_ints, 0, otherLen, shift);
- if (carry != 0L)
- {
- m_ints[otherLen + words] ^= carry;
- }
- }
-
- private static long addShiftedUp(long[] x, int xOff, long[] y, int yOff, int count, int shift)
- {
- int shiftInv = 64 - shift;
- long prev = 0;
- for (int i = 0; i < count; ++i)
- {
- long next = y[yOff + i];
- x[xOff + i] ^= (next << shift) | prev;
- prev = next >>> shiftInv;
- }
- return prev;
- }
-
- private static long addShiftedDown(long[] x, int xOff, long[] y, int yOff, int count, int shift)
- {
- int shiftInv = 64 - shift;
- long prev = 0;
- int i = count;
- while (--i >= 0)
- {
- long next = y[yOff + i];
- x[xOff + i] ^= (next >>> shift) | prev;
- prev = next << shiftInv;
- }
- return prev;
- }
-
- public void addShiftedByWords(LongArray other, int words)
- {
- int otherUsedLen = other.getUsedLength();
- if (otherUsedLen == 0)
- {
- return;
- }
-
- int minLen = otherUsedLen + words;
- if (minLen > m_ints.length)
- {
- m_ints = resizedInts(minLen);
- }
-
- add(m_ints, words, other.m_ints, 0, otherUsedLen);
- }
-
- private static void add(long[] x, int xOff, long[] y, int yOff, int count)
- {
- for (int i = 0; i < count; ++i)
- {
- x[xOff + i] ^= y[yOff + i];
- }
- }
-
- private static void add(long[] x, int xOff, long[] y, int yOff, long[] z, int zOff, int count)
- {
- for (int i = 0; i < count; ++i)
- {
- z[zOff + i] = x[xOff + i] ^ y[yOff + i];
- }
- }
-
- private static void addBoth(long[] x, int xOff, long[] y1, int y1Off, long[] y2, int y2Off, int count)
- {
- for (int i = 0; i < count; ++i)
- {
- x[xOff + i] ^= y1[y1Off + i] ^ y2[y2Off + i];
- }
- }
-
- private static void distribute(long[] x, int src, int dst1, int dst2, int count)
- {
- for (int i = 0; i < count; ++i)
- {
- long v = x[src + i];
- x[dst1 + i] ^= v;
- x[dst2 + i] ^= v;
- }
- }
-
- public int getLength()
- {
- return m_ints.length;
- }
-
- private static void flipWord(long[] buf, int off, int bit, long word)
- {
- int n = off + (bit >>> 6);
- int shift = bit & 0x3F;
- if (shift == 0)
- {
- buf[n] ^= word;
- }
- else
- {
- buf[n] ^= word << shift;
- word >>>= (64 - shift);
- if (word != 0)
- {
- buf[++n] ^= word;
- }
- }
- }
-
-// private static long getWord(long[] buf, int off, int len, int bit)
-// {
-// int n = off + (bit >>> 6);
-// int shift = bit & 0x3F;
-// if (shift == 0)
-// {
-// return buf[n];
-// }
-// long result = buf[n] >>> shift;
-// if (++n < len)
-// {
-// result |= buf[n] << (64 - shift);
-// }
-// return result;
-// }
-
- public boolean testBitZero()
- {
- return m_ints.length > 0 && (m_ints[0] & 1L) != 0;
- }
-
- private static boolean testBit(long[] buf, int off, int n)
- {
- // theInt = n / 64
- int theInt = n >>> 6;
- // theBit = n % 64
- int theBit = n & 0x3F;
- long tester = 1L << theBit;
- return (buf[off + theInt] & tester) != 0;
- }
-
- private static void flipBit(long[] buf, int off, int n)
- {
- // theInt = n / 64
- int theInt = n >>> 6;
- // theBit = n % 64
- int theBit = n & 0x3F;
- long flipper = 1L << theBit;
- buf[off + theInt] ^= flipper;
- }
-
-// private static void setBit(long[] buf, int off, int n)
-// {
-// // theInt = n / 64
-// int theInt = n >>> 6;
-// // theBit = n % 64
-// int theBit = n & 0x3F;
-// long setter = 1L << theBit;
-// buf[off + theInt] |= setter;
-// }
-//
-// private static void clearBit(long[] buf, int off, int n)
-// {
-// // theInt = n / 64
-// int theInt = n >>> 6;
-// // theBit = n % 64
-// int theBit = n & 0x3F;
-// long setter = 1L << theBit;
-// buf[off + theInt] &= ~setter;
-// }
-
- private static void multiplyWord(long a, long[] b, int bLen, long[] c, int cOff)
- {
- if ((a & 1L) != 0L)
- {
- add(c, cOff, b, 0, bLen);
- }
- int k = 1;
- while ((a >>>= 1) != 0)
- {
- if ((a & 1L) != 0L)
- {
- long carry = addShiftedUp(c, cOff, b, 0, bLen, k);
- if (carry != 0)
- {
- c[cOff + bLen] ^= carry;
- }
- }
- ++k;
- }
- }
-
- public LongArray modMultiplyLD(LongArray other, int m, int[] ks)
- {
- /*
- * Find out the degree of each argument and handle the zero cases
- */
- int aDeg = degree();
- if (aDeg == 0)
- {
- return this;
- }
- int bDeg = other.degree();
- if (bDeg == 0)
- {
- return other;
- }
-
- /*
- * Swap if necessary so that A is the smaller argument
- */
- LongArray A = this, B = other;
- if (aDeg > bDeg)
- {
- A = other; B = this;
- int tmp = aDeg; aDeg = bDeg; bDeg = tmp;
- }
-
- /*
- * Establish the word lengths of the arguments and result
- */
- int aLen = (aDeg + 63) >>> 6;
- int bLen = (bDeg + 63) >>> 6;
- int cLen = (aDeg + bDeg + 62) >>> 6;
-
- if (aLen == 1)
- {
- long a = A.m_ints[0];
- if (a == 1L)
- {
- return B;
- }
-
- /*
- * Fast path for small A, with performance dependent only on the number of set bits
- */
- long[] c = new long[cLen];
- multiplyWord(a, B.m_ints, bLen, c, 0);
-
- /*
- * Reduce the raw answer against the reduction coefficients
- */
- return reduceResult(c, 0, cLen, m, ks);
- }
-
- /*
- * Determine if B will get bigger during shifting
- */
- int bMax = (bDeg + 7 + 63) >>> 6;
-
- /*
- * Lookup table for the offset of each B in the tables
- */
- int[] ti = new int[16];
-
- /*
- * Precompute table of all 4-bit products of B
- */
- long[] T0 = new long[bMax << 4];
- int tOff = bMax;
- ti[1] = tOff;
- System.arraycopy(B.m_ints, 0, T0, tOff, bLen);
- for (int i = 2; i < 16; ++i)
- {
- ti[i] = (tOff += bMax);
- if ((i & 1) == 0)
- {
- shiftUp(T0, tOff >>> 1, T0, tOff, bMax, 1);
- }
- else
- {
- add(T0, bMax, T0, tOff - bMax, T0, tOff, bMax);
- }
- }
-
- /*
- * Second table with all 4-bit products of B shifted 4 bits
- */
- long[] T1 = new long[T0.length];
- shiftUp(T0, 0, T1, 0, T0.length, 4);
-// shiftUp(T0, bMax, T1, bMax, tOff, 4);
-
- long[] a = A.m_ints;
- long[] c = new long[cLen];
-
- int MASK = 0xF;
-
- /*
- * Lopez-Dahab algorithm
- */
-
- for (int k = 56; k >= 0; k -= 8)
- {
- for (int j = 1; j < aLen; j += 2)
- {
- int aVal = (int)(a[j] >>> k);
- int u = aVal & MASK;
- int v = (aVal >>> 4) & MASK;
- addBoth(c, j - 1, T0, ti[u], T1, ti[v], bMax);
- }
- shiftUp(c, 0, cLen, 8);
- }
-
- for (int k = 56; k >= 0; k -= 8)
- {
- for (int j = 0; j < aLen; j += 2)
- {
- int aVal = (int)(a[j] >>> k);
- int u = aVal & MASK;
- int v = (aVal >>> 4) & MASK;
- addBoth(c, j, T0, ti[u], T1, ti[v], bMax);
- }
- if (k > 0)
- {
- shiftUp(c, 0, cLen, 8);
- }
- }
-
- /*
- * Finally the raw answer is collected, reduce it against the reduction coefficients
- */
- return reduceResult(c, 0, cLen, m, ks);
- }
-
- public LongArray modMultiply(LongArray other, int m, int[] ks)
- {
- /*
- * Find out the degree of each argument and handle the zero cases
- */
- int aDeg = degree();
- if (aDeg == 0)
- {
- return this;
- }
- int bDeg = other.degree();
- if (bDeg == 0)
- {
- return other;
- }
-
- /*
- * Swap if necessary so that A is the smaller argument
- */
- LongArray A = this, B = other;
- if (aDeg > bDeg)
- {
- A = other; B = this;
- int tmp = aDeg; aDeg = bDeg; bDeg = tmp;
- }
-
- /*
- * Establish the word lengths of the arguments and result
- */
- int aLen = (aDeg + 63) >>> 6;
- int bLen = (bDeg + 63) >>> 6;
- int cLen = (aDeg + bDeg + 62) >>> 6;
-
- if (aLen == 1)
- {
- long a = A.m_ints[0];
- if (a == 1L)
- {
- return B;
- }
-
- /*
- * Fast path for small A, with performance dependent only on the number of set bits
- */
- long[] c = new long[cLen];
- multiplyWord(a, B.m_ints, bLen, c, 0);
-
- /*
- * Reduce the raw answer against the reduction coefficients
- */
- return reduceResult(c, 0, cLen, m, ks);
- }
-
- /*
- * Determine if B will get bigger during shifting
- */
- int bMax = (bDeg + 7 + 63) >>> 6;
-
- /*
- * Lookup table for the offset of each B in the tables
- */
- int[] ti = new int[16];
-
- /*
- * Precompute table of all 4-bit products of B
- */
- long[] T0 = new long[bMax << 4];
- int tOff = bMax;
- ti[1] = tOff;
- System.arraycopy(B.m_ints, 0, T0, tOff, bLen);
- for (int i = 2; i < 16; ++i)
- {
- ti[i] = (tOff += bMax);
- if ((i & 1) == 0)
- {
- shiftUp(T0, tOff >>> 1, T0, tOff, bMax, 1);
- }
- else
- {
- add(T0, bMax, T0, tOff - bMax, T0, tOff, bMax);
- }
- }
-
- /*
- * Second table with all 4-bit products of B shifted 4 bits
- */
- long[] T1 = new long[T0.length];
- shiftUp(T0, 0, T1, 0, T0.length, 4);
-// shiftUp(T0, bMax, T1, bMax, tOff, 4);
-
- long[] a = A.m_ints;
- long[] c = new long[cLen << 3];
-
- int MASK = 0xF;
-
- /*
- * Lopez-Dahab (Modified) algorithm
- */
-
- for (int aPos = 0; aPos < aLen; ++aPos)
- {
- long aVal = a[aPos];
- int cOff = aPos;
- for (;;)
- {
- int u = (int)aVal & MASK;
- aVal >>>= 4;
- int v = (int)aVal & MASK;
- addBoth(c, cOff, T0, ti[u], T1, ti[v], bMax);
- if ((aVal >>>= 4) == 0L)
- {
- break;
- }
- cOff += cLen;
- }
- }
-
- int cOff = c.length;
- while ((cOff -= cLen) != 0)
- {
- addShiftedUp(c, cOff - cLen, c, cOff, cLen, 8);
- }
-
- /*
- * Finally the raw answer is collected, reduce it against the reduction coefficients
- */
- return reduceResult(c, 0, cLen, m, ks);
- }
-
- public LongArray modMultiplyAlt(LongArray other, int m, int[] ks)
- {
- /*
- * Find out the degree of each argument and handle the zero cases
- */
- int aDeg = degree();
- if (aDeg == 0)
- {
- return this;
- }
- int bDeg = other.degree();
- if (bDeg == 0)
- {
- return other;
- }
-
- /*
- * Swap if necessary so that A is the smaller argument
- */
- LongArray A = this, B = other;
- if (aDeg > bDeg)
- {
- A = other; B = this;
- int tmp = aDeg; aDeg = bDeg; bDeg = tmp;
- }
-
- /*
- * Establish the word lengths of the arguments and result
- */
- int aLen = (aDeg + 63) >>> 6;
- int bLen = (bDeg + 63) >>> 6;
- int cLen = (aDeg + bDeg + 62) >>> 6;
-
- if (aLen == 1)
- {
- long a = A.m_ints[0];
- if (a == 1L)
- {
- return B;
- }
-
- /*
- * Fast path for small A, with performance dependent only on the number of set bits
- */
- long[] c = new long[cLen];
- multiplyWord(a, B.m_ints, bLen, c, 0);
-
- /*
- * Reduce the raw answer against the reduction coefficients
- */
- return reduceResult(c, 0, cLen, m, ks);
- }
-
- // NOTE: This works, but is slower than width 4 processing
-// if (aLen == 2)
-// {
-// /*
-// * Use common-multiplicand optimization to save ~1/4 of the adds
-// */
-// long a1 = A.m_ints[0], a2 = A.m_ints[1];
-// long aa = a1 & a2; a1 ^= aa; a2 ^= aa;
-//
-// long[] b = B.m_ints;
-// long[] c = new long[cLen];
-// multiplyWord(aa, b, bLen, c, 1);
-// add(c, 0, c, 1, cLen - 1);
-// multiplyWord(a1, b, bLen, c, 0);
-// multiplyWord(a2, b, bLen, c, 1);
-//
-// /*
-// * Reduce the raw answer against the reduction coefficients
-// */
-// return reduceResult(c, 0, cLen, m, ks);
-// }
-
- /*
- * Determine the parameters of the interleaved window algorithm: the 'width' in bits to
- * process together, the number of evaluation 'positions' implied by that width, and the
- * 'top' position at which the regular window algorithm stops.
- */
- int width, positions, top, banks;
-
- // NOTE: width 4 is the fastest over the entire range of sizes used in current crypto
-// width = 1; positions = 64; top = 64; banks = 4;
-// width = 2; positions = 32; top = 64; banks = 4;
-// width = 3; positions = 21; top = 63; banks = 3;
- width = 4; positions = 16; top = 64; banks = 8;
-// width = 5; positions = 13; top = 65; banks = 7;
-// width = 7; positions = 9; top = 63; banks = 9;
-// width = 8; positions = 8; top = 64; banks = 8;
-
- /*
- * Determine if B will get bigger during shifting
- */
- int shifts = top < 64 ? positions : positions - 1;
- int bMax = (bDeg + shifts + 63) >>> 6;
-
- int bTotal = bMax * banks, stride = width * banks;
-
- /*
- * Create a single temporary buffer, with an offset table to find the positions of things in it
- */
- int[] ci = new int[1 << width];
- int cTotal = aLen;
- {
- ci[0] = cTotal;
- cTotal += bTotal;
- ci[1] = cTotal;
- for (int i = 2; i < ci.length; ++i)
- {
- cTotal += cLen;
- ci[i] = cTotal;
- }
- cTotal += cLen;
- }
- // NOTE: Provide a safe dump for "high zeroes" since we are adding 'bMax' and not 'bLen'
- ++cTotal;
-
- long[] c = new long[cTotal];
-
- // Prepare A in interleaved form, according to the chosen width
- interleave(A.m_ints, 0, c, 0, aLen, width);
-
- // Make a working copy of B, since we will be shifting it
- {
- int bOff = aLen;
- System.arraycopy(B.m_ints, 0, c, bOff, bLen);
- for (int bank = 1; bank < banks; ++bank)
- {
- shiftUp(c, aLen, c, bOff += bMax, bMax, bank);
- }
- }
-
- /*
- * The main loop analyzes the interleaved windows in A, and for each non-zero window
- * a single word-array XOR is performed to a carefully selected slice of 'c'. The loop is
- * breadth-first, checking the lowest window in each word, then looping again for the
- * next higher window position.
- */
- int MASK = (1 << width) - 1;
-
- int k = 0;
- for (;;)
- {
- int aPos = 0;
- do
- {
- long aVal = c[aPos] >>> k;
- int bank = 0, bOff = aLen;
- for (;;)
- {
- int index = (int)(aVal) & MASK;
- if (index != 0)
- {
- /*
- * Add to a 'c' buffer based on the bit-pattern of 'index'. Since A is in
- * interleaved form, the bits represent the current B shifted by 0, 'positions',
- * 'positions' * 2, ..., 'positions' * ('width' - 1)
- */
- add(c, aPos + ci[index], c, bOff, bMax);
- }
- if (++bank == banks)
- {
- break;
- }
- bOff += bMax;
- aVal >>>= width;
- }
- }
- while (++aPos < aLen);
-
- if ((k += stride) >= top)
- {
- if (k >= 64)
- {
- break;
- }
-
- /*
- * Adjustment for window setups with top == 63, the final bit (if any) is processed
- * as the top-bit of a window
- */
- k = 64 - width;
- MASK &= MASK << (top - k);
- }
-
- /*
- * After each position has been checked for all words of A, B is shifted up 1 place
- */
- shiftUp(c, aLen, bTotal, banks);
- }
-
- int ciPos = ci.length;
- while (--ciPos > 1)
- {
- if ((ciPos & 1L) == 0L)
- {
- /*
- * For even numbers, shift contents and add to the half-position
- */
- addShiftedUp(c, ci[ciPos >>> 1], c, ci[ciPos], cLen, positions);
- }
- else
- {
- /*
- * For odd numbers, 'distribute' contents to the result and the next-lowest position
- */
- distribute(c, ci[ciPos], ci[ciPos - 1], ci[1], cLen);
- }
- }
-
- /*
- * Finally the raw answer is collected, reduce it against the reduction coefficients
- */
- return reduceResult(c, ci[1], cLen, m, ks);
- }
-
- private static LongArray reduceResult(long[] buf, int off, int len, int m, int[] ks)
- {
- int rLen = reduceInPlace(buf, off, len, m, ks);
- return new LongArray(buf, off, rLen);
- }
-
-// private static void deInterleave(long[] x, int xOff, long[] z, int zOff, int count, int rounds)
-// {
-// for (int i = 0; i < count; ++i)
-// {
-// z[zOff + i] = deInterleave(x[zOff + i], rounds);
-// }
-// }
-//
-// private static long deInterleave(long x, int rounds)
-// {
-// while (--rounds >= 0)
-// {
-// x = deInterleave32(x & DEINTERLEAVE_MASK) | (deInterleave32((x >>> 1) & DEINTERLEAVE_MASK) << 32);
-// }
-// return x;
-// }
-//
-// private static long deInterleave32(long x)
-// {
-// x = (x | (x >>> 1)) & 0x3333333333333333L;
-// x = (x | (x >>> 2)) & 0x0F0F0F0F0F0F0F0FL;
-// x = (x | (x >>> 4)) & 0x00FF00FF00FF00FFL;
-// x = (x | (x >>> 8)) & 0x0000FFFF0000FFFFL;
-// x = (x | (x >>> 16)) & 0x00000000FFFFFFFFL;
-// return x;
-// }
-
- private static int reduceInPlace(long[] buf, int off, int len, int m, int[] ks)
- {
- int mLen = (m + 63) >>> 6;
- if (len < mLen)
- {
- return len;
- }
-
- int numBits = Math.min(len << 6, (m << 1) - 1); // TODO use actual degree?
- int excessBits = (len << 6) - numBits;
- while (excessBits >= 64)
- {
- --len;
- excessBits -= 64;
- }
-
- int kLen = ks.length, kMax = ks[kLen - 1], kNext = kLen > 1 ? ks[kLen - 2] : 0;
- int wordWiseLimit = Math.max(m, kMax + 64);
- int vectorableWords = (excessBits + Math.min(numBits - wordWiseLimit, m - kNext)) >> 6;
- if (vectorableWords > 1)
- {
- int vectorWiseWords = len - vectorableWords;
- reduceVectorWise(buf, off, len, vectorWiseWords, m, ks);
- while (len > vectorWiseWords)
- {
- buf[off + --len] = 0L;
- }
- numBits = vectorWiseWords << 6;
- }
-
- if (numBits > wordWiseLimit)
- {
- reduceWordWise(buf, off, len, wordWiseLimit, m, ks);
- numBits = wordWiseLimit;
- }
-
- if (numBits > m)
- {
- reduceBitWise(buf, off, numBits, m, ks);
- }
-
- return mLen;
- }
-
- private static void reduceBitWise(long[] buf, int off, int bitlength, int m, int[] ks)
- {
- while (--bitlength >= m)
- {
- if (testBit(buf, off, bitlength))
- {
- reduceBit(buf, off, bitlength, m, ks);
- }
- }
- }
-
- private static void reduceBit(long[] buf, int off, int bit, int m, int[] ks)
- {
- flipBit(buf, off, bit);
- int base = bit - m;
- int j = ks.length;
- while (--j >= 0)
- {
- flipBit(buf, off, ks[j] + base);
- }
- flipBit(buf, off, base);
- }
-
- private static void reduceWordWise(long[] buf, int off, int len, int toBit, int m, int[] ks)
- {
- int toPos = toBit >>> 6;
-
- while (--len > toPos)
- {
- long word = buf[off + len];
- if (word != 0)
- {
- buf[off + len] = 0;
- reduceWord(buf, off, (len << 6), word, m, ks);
- }
- }
-
- int partial = toBit & 0x3F;
- long word = buf[off + toPos] >>> partial;
- if (word != 0)
- {
- buf[off + toPos] ^= word << partial;
- reduceWord(buf, off, toBit, word, m, ks);
- }
- }
-
- private static void reduceWord(long[] buf, int off, int bit, long word, int m, int[] ks)
- {
- int offset = bit - m;
- int j = ks.length;
- while (--j >= 0)
- {
- flipWord(buf, off, offset + ks[j], word);
- }
- flipWord(buf, off, offset, word);
- }
-
- private static void reduceVectorWise(long[] buf, int off, int len, int words, int m, int[] ks)
- {
- /*
- * NOTE: It's important we go from highest coefficient to lowest, because for the highest
- * one (only) we allow the ranges to partially overlap, and therefore any changes must take
- * effect for the subsequent lower coefficients.
- */
- int baseBit = (words << 6) - m;
- int j = ks.length;
- while (--j >= 0)
- {
- flipVector(buf, off, buf, off + words, len - words, baseBit + ks[j]);
- }
- flipVector(buf, off, buf, off + words, len - words, baseBit);
- }
-
- private static void flipVector(long[] x, int xOff, long[] y, int yOff, int yLen, int bits)
- {
- xOff += bits >>> 6;
- bits &= 0x3F;
-
- if (bits == 0)
- {
- add(x, xOff, y, yOff, yLen);
- }
- else
- {
- long carry = addShiftedDown(x, xOff + 1, y, yOff, yLen, 64 - bits);
- x[xOff] ^= carry;
- }
- }
-
- public LongArray modSquare(int m, int[] ks)
- {
- int len = getUsedLength();
- if (len == 0)
- {
- return this;
- }
-
- int _2len = len << 1;
- long[] r = new long[_2len];
-
- int pos = 0;
- while (pos < _2len)
- {
- long mi = m_ints[pos >>> 1];
- r[pos++] = interleave2_32to64((int)mi);
- r[pos++] = interleave2_32to64((int)(mi >>> 32));
- }
-
- return new LongArray(r, 0, reduceInPlace(r, 0, r.length, m, ks));
- }
-
-// private LongArray modSquareN(int n, int m, int[] ks)
-// {
-// int len = getUsedLength();
-// if (len == 0)
-// {
-// return this;
-// }
-//
-// int mLen = (m + 63) >>> 6;
-// long[] r = new long[mLen << 1];
-// System.arraycopy(m_ints, 0, r, 0, len);
-//
-// while (--n >= 0)
-// {
-// squareInPlace(r, len, m, ks);
-// len = reduceInPlace(r, 0, r.length, m, ks);
-// }
-//
-// return new LongArray(r, 0, len);
-// }
-//
-// private static void squareInPlace(long[] x, int xLen, int m, int[] ks)
-// {
-// int pos = xLen << 1;
-// while (--xLen >= 0)
-// {
-// long xVal = x[xLen];
-// x[--pos] = interleave2_32to64((int)(xVal >>> 32));
-// x[--pos] = interleave2_32to64((int)xVal);
-// }
-// }
-
- private static void interleave(long[] x, int xOff, long[] z, int zOff, int count, int width)
- {
- switch (width)
- {
- case 3:
- interleave3(x, xOff, z, zOff, count);
- break;
- case 5:
- interleave5(x, xOff, z, zOff, count);
- break;
- case 7:
- interleave7(x, xOff, z, zOff, count);
- break;
- default:
- interleave2_n(x, xOff, z, zOff, count, bitLengths[width] - 1);
- break;
- }
- }
-
- private static void interleave3(long[] x, int xOff, long[] z, int zOff, int count)
- {
- for (int i = 0; i < count; ++i)
- {
- z[zOff + i] = interleave3(x[xOff + i]);
- }
- }
-
- private static long interleave3(long x)
- {
- long z = x & (1L << 63);
- return z
- | interleave3_21to63((int)x & 0x1FFFFF)
- | interleave3_21to63((int)(x >>> 21) & 0x1FFFFF) << 1
- | interleave3_21to63((int)(x >>> 42) & 0x1FFFFF) << 2;
-
-// int zPos = 0, wPos = 0, xPos = 0;
-// for (;;)
-// {
-// z |= ((x >>> xPos) & 1L) << zPos;
-// if (++zPos == 63)
-// {
-// String sz2 = Long.toBinaryString(z);
-// return z;
-// }
-// if ((xPos += 21) >= 63)
-// {
-// xPos = ++wPos;
-// }
-// }
- }
-
- private static long interleave3_21to63(int x)
- {
- int r00 = INTERLEAVE3_TABLE[x & 0x7F];
- int r21 = INTERLEAVE3_TABLE[(x >>> 7) & 0x7F];
- int r42 = INTERLEAVE3_TABLE[x >>> 14];
- return (r42 & 0xFFFFFFFFL) << 42 | (r21 & 0xFFFFFFFFL) << 21 | (r00 & 0xFFFFFFFFL);
- }
-
- private static void interleave5(long[] x, int xOff, long[] z, int zOff, int count)
- {
- for (int i = 0; i < count; ++i)
- {
- z[zOff + i] = interleave5(x[xOff + i]);
- }
- }
-
- private static long interleave5(long x)
- {
- return interleave3_13to65((int)x & 0x1FFF)
- | interleave3_13to65((int)(x >>> 13) & 0x1FFF) << 1
- | interleave3_13to65((int)(x >>> 26) & 0x1FFF) << 2
- | interleave3_13to65((int)(x >>> 39) & 0x1FFF) << 3
- | interleave3_13to65((int)(x >>> 52) & 0x1FFF) << 4;
-
-// long z = 0;
-// int zPos = 0, wPos = 0, xPos = 0;
-// for (;;)
-// {
-// z |= ((x >>> xPos) & 1L) << zPos;
-// if (++zPos == 64)
-// {
-// return z;
-// }
-// if ((xPos += 13) >= 64)
-// {
-// xPos = ++wPos;
-// }
-// }
- }
-
- private static long interleave3_13to65(int x)
- {
- int r00 = INTERLEAVE5_TABLE[x & 0x7F];
- int r35 = INTERLEAVE5_TABLE[x >>> 7];
- return (r35 & 0xFFFFFFFFL) << 35 | (r00 & 0xFFFFFFFFL);
- }
-
- private static void interleave7(long[] x, int xOff, long[] z, int zOff, int count)
- {
- for (int i = 0; i < count; ++i)
- {
- z[zOff + i] = interleave7(x[xOff + i]);
- }
- }
-
- private static long interleave7(long x)
- {
- long z = x & (1L << 63);
- return z
- | INTERLEAVE7_TABLE[(int)x & 0x1FF]
- | INTERLEAVE7_TABLE[(int)(x >>> 9) & 0x1FF] << 1
- | INTERLEAVE7_TABLE[(int)(x >>> 18) & 0x1FF] << 2
- | INTERLEAVE7_TABLE[(int)(x >>> 27) & 0x1FF] << 3
- | INTERLEAVE7_TABLE[(int)(x >>> 36) & 0x1FF] << 4
- | INTERLEAVE7_TABLE[(int)(x >>> 45) & 0x1FF] << 5
- | INTERLEAVE7_TABLE[(int)(x >>> 54) & 0x1FF] << 6;
-
-// int zPos = 0, wPos = 0, xPos = 0;
-// for (;;)
-// {
-// z |= ((x >>> xPos) & 1L) << zPos;
-// if (++zPos == 63)
-// {
-// return z;
-// }
-// if ((xPos += 9) >= 63)
-// {
-// xPos = ++wPos;
-// }
-// }
- }
-
- private static void interleave2_n(long[] x, int xOff, long[] z, int zOff, int count, int rounds)
- {
- for (int i = 0; i < count; ++i)
- {
- z[zOff + i] = interleave2_n(x[xOff + i], rounds);
- }
- }
-
- private static long interleave2_n(long x, int rounds)
- {
- while (rounds > 1)
- {
- rounds -= 2;
- x = interleave4_16to64((int)x & 0xFFFF)
- | interleave4_16to64((int)(x >>> 16) & 0xFFFF) << 1
- | interleave4_16to64((int)(x >>> 32) & 0xFFFF) << 2
- | interleave4_16to64((int)(x >>> 48) & 0xFFFF) << 3;
- }
- if (rounds > 0)
- {
- x = interleave2_32to64((int)x) | interleave2_32to64((int)(x >>> 32)) << 1;
- }
- return x;
- }
-
- private static long interleave4_16to64(int x)
- {
- int r00 = INTERLEAVE4_TABLE[x & 0xFF];
- int r32 = INTERLEAVE4_TABLE[x >>> 8];
- return (r32 & 0xFFFFFFFFL) << 32 | (r00 & 0xFFFFFFFFL);
- }
-
- private static long interleave2_32to64(int x)
- {
- int r00 = INTERLEAVE2_TABLE[x & 0xFF] | INTERLEAVE2_TABLE[(x >>> 8) & 0xFF] << 16;
- int r32 = INTERLEAVE2_TABLE[(x >>> 16) & 0xFF] | INTERLEAVE2_TABLE[x >>> 24] << 16;
- return (r32 & 0xFFFFFFFFL) << 32 | (r00 & 0xFFFFFFFFL);
- }
-
-// private static LongArray expItohTsujii2(LongArray B, int n, int m, int[] ks)
-// {
-// LongArray t1 = B, t3 = new LongArray(new long[]{ 1L });
-// int scale = 1;
-//
-// int numTerms = n;
-// while (numTerms > 1)
-// {
-// if ((numTerms & 1) != 0)
-// {
-// t3 = t3.modMultiply(t1, m, ks);
-// t1 = t1.modSquareN(scale, m, ks);
-// }
-//
-// LongArray t2 = t1.modSquareN(scale, m, ks);
-// t1 = t1.modMultiply(t2, m, ks);
-// numTerms >>>= 1; scale <<= 1;
-// }
-//
-// return t3.modMultiply(t1, m, ks);
-// }
-//
-// private static LongArray expItohTsujii23(LongArray B, int n, int m, int[] ks)
-// {
-// LongArray t1 = B, t3 = new LongArray(new long[]{ 1L });
-// int scale = 1;
-//
-// int numTerms = n;
-// while (numTerms > 1)
-// {
-// boolean m03 = numTerms % 3 == 0;
-// boolean m14 = !m03 && (numTerms & 1) != 0;
-//
-// if (m14)
-// {
-// t3 = t3.modMultiply(t1, m, ks);
-// t1 = t1.modSquareN(scale, m, ks);
-// }
-//
-// LongArray t2 = t1.modSquareN(scale, m, ks);
-// t1 = t1.modMultiply(t2, m, ks);
-//
-// if (m03)
-// {
-// t2 = t2.modSquareN(scale, m, ks);
-// t1 = t1.modMultiply(t2, m, ks);
-// numTerms /= 3; scale *= 3;
-// }
-// else
-// {
-// numTerms >>>= 1; scale <<= 1;
-// }
-// }
-//
-// return t3.modMultiply(t1, m, ks);
-// }
-//
-// private static LongArray expItohTsujii235(LongArray B, int n, int m, int[] ks)
-// {
-// LongArray t1 = B, t4 = new LongArray(new long[]{ 1L });
-// int scale = 1;
-//
-// int numTerms = n;
-// while (numTerms > 1)
-// {
-// if (numTerms % 5 == 0)
-// {
-//// t1 = expItohTsujii23(t1, 5, m, ks);
-//
-// LongArray t3 = t1;
-// t1 = t1.modSquareN(scale, m, ks);
-//
-// LongArray t2 = t1.modSquareN(scale, m, ks);
-// t1 = t1.modMultiply(t2, m, ks);
-// t2 = t1.modSquareN(scale << 1, m, ks);
-// t1 = t1.modMultiply(t2, m, ks);
-//
-// t1 = t1.modMultiply(t3, m, ks);
-//
-// numTerms /= 5; scale *= 5;
-// continue;
-// }
-//
-// boolean m03 = numTerms % 3 == 0;
-// boolean m14 = !m03 && (numTerms & 1) != 0;
-//
-// if (m14)
-// {
-// t4 = t4.modMultiply(t1, m, ks);
-// t1 = t1.modSquareN(scale, m, ks);
-// }
-//
-// LongArray t2 = t1.modSquareN(scale, m, ks);
-// t1 = t1.modMultiply(t2, m, ks);
-//
-// if (m03)
-// {
-// t2 = t2.modSquareN(scale, m, ks);
-// t1 = t1.modMultiply(t2, m, ks);
-// numTerms /= 3; scale *= 3;
-// }
-// else
-// {
-// numTerms >>>= 1; scale <<= 1;
-// }
-// }
-//
-// return t4.modMultiply(t1, m, ks);
-// }
-
- public LongArray modInverse(int m, int[] ks)
- {
- /*
- * Fermat's Little Theorem
- */
-// LongArray A = this;
-// LongArray B = A.modSquare(m, ks);
-// LongArray R0 = B, R1 = B;
-// for (int i = 2; i < m; ++i)
-// {
-// R1 = R1.modSquare(m, ks);
-// R0 = R0.modMultiply(R1, m, ks);
-// }
-//
-// return R0;
-
- /*
- * Itoh-Tsujii
- */
-// LongArray B = modSquare(m, ks);
-// switch (m)
-// {
-// case 409:
-// return expItohTsujii23(B, m - 1, m, ks);
-// case 571:
-// return expItohTsujii235(B, m - 1, m, ks);
-// case 163:
-// case 233:
-// case 283:
-// default:
-// return expItohTsujii2(B, m - 1, m, ks);
-// }
-
- /*
- * Inversion in F2m using the extended Euclidean algorithm
- *
- * Input: A nonzero polynomial a(z) of degree at most m-1
- * Output: a(z)^(-1) mod f(z)
- */
- int uzDegree = degree();
- if (uzDegree == 1)
- {
- return this;
- }
-
- // u(z) := a(z)
- LongArray uz = (LongArray)clone();
-
- int t = (m + 63) >>> 6;
-
- // v(z) := f(z)
- LongArray vz = new LongArray(t);
- reduceBit(vz.m_ints, 0, m, m, ks);
-
- // g1(z) := 1, g2(z) := 0
- LongArray g1z = new LongArray(t);
- g1z.m_ints[0] = 1L;
- LongArray g2z = new LongArray(t);
-
- int[] uvDeg = new int[]{ uzDegree, m + 1 };
- LongArray[] uv = new LongArray[]{ uz, vz };
-
- int[] ggDeg = new int[]{ 1, 0 };
- LongArray[] gg = new LongArray[]{ g1z, g2z };
-
- int b = 1;
- int duv1 = uvDeg[b];
- int dgg1 = ggDeg[b];
- int j = duv1 - uvDeg[1 - b];
-
- for (;;)
- {
- if (j < 0)
- {
- j = -j;
- uvDeg[b] = duv1;
- ggDeg[b] = dgg1;
- b = 1 - b;
- duv1 = uvDeg[b];
- dgg1 = ggDeg[b];
- }
-
- uv[b].addShiftedByBitsSafe(uv[1 - b], uvDeg[1 - b], j);
-
- int duv2 = uv[b].degreeFrom(duv1);
- if (duv2 == 0)
- {
- return gg[1 - b];
- }
-
- {
- int dgg2 = ggDeg[1 - b];
- gg[b].addShiftedByBitsSafe(gg[1 - b], dgg2, j);
- dgg2 += j;
-
- if (dgg2 > dgg1)
- {
- dgg1 = dgg2;
- }
- else if (dgg2 == dgg1)
- {
- dgg1 = gg[b].degreeFrom(dgg1);
- }
- }
-
- j += (duv2 - duv1);
- duv1 = duv2;
- }
- }
-
- public boolean equals(Object o)
- {
- if (!(o instanceof LongArray))
- {
- return false;
- }
- LongArray other = (LongArray) o;
- int usedLen = getUsedLength();
- if (other.getUsedLength() != usedLen)
- {
- return false;
- }
- for (int i = 0; i < usedLen; i++)
- {
- if (m_ints[i] != other.m_ints[i])
- {
- return false;
- }
- }
- return true;
- }
-
- public int hashCode()
- {
- int usedLen = getUsedLength();
- int hash = 1;
- for (int i = 0; i < usedLen; i++)
- {
- long mi = m_ints[i];
- hash *= 31;
- hash ^= (int)mi;
- hash *= 31;
- hash ^= (int)(mi >>> 32);
- }
- return hash;
- }
-
- public Object clone()
- {
- return new LongArray(Arrays.clone(m_ints));
- }
-
- public String toString()
- {
- int i = getUsedLength();
- if (i == 0)
- {
- return "0";
- }
-/*
- StringBuffer sb = new StringBuffer(Long.toBinaryString(m_ints[--i]));
- while (--i >= 0)
- {
- String s = Long.toBinaryString(m_ints[i]);
-
- // Add leading zeroes, except for highest significant word
- int len = s.length();
- if (len < 64)
- {
- sb.append(ZEROES.substring(len));
- }
-
- sb.append(s);
- }
- return sb.toString();
-*/
- return "not supported";
- }
-}
diff --git a/libraries/spongycastle/core/src/main/j2me/org/spongycastle/util/Integers.java b/libraries/spongycastle/core/src/main/j2me/org/spongycastle/util/Integers.java
deleted file mode 100644
index 3ac592d3c..000000000
--- a/libraries/spongycastle/core/src/main/j2me/org/spongycastle/util/Integers.java
+++ /dev/null
@@ -1,9 +0,0 @@
-package org.spongycastle.util;
-
-public class Integers
-{
- public static Integer valueOf(int value)
- {
- return new Integer(value);
- }
-}
diff --git a/libraries/spongycastle/core/src/main/j2me/org/spongycastle/util/Selector.java b/libraries/spongycastle/core/src/main/j2me/org/spongycastle/util/Selector.java
deleted file mode 100644
index a72cdaa20..000000000
--- a/libraries/spongycastle/core/src/main/j2me/org/spongycastle/util/Selector.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package org.spongycastle.util;
-
-public interface Selector
-{
- boolean match(Object obj);
-
- Object clone();
-}
diff --git a/libraries/spongycastle/core/src/main/j2me/org/spongycastle/util/Shorts.java b/libraries/spongycastle/core/src/main/j2me/org/spongycastle/util/Shorts.java
deleted file mode 100644
index 66a992f77..000000000
--- a/libraries/spongycastle/core/src/main/j2me/org/spongycastle/util/Shorts.java
+++ /dev/null
@@ -1,9 +0,0 @@
-package org.spongycastle.util;
-
-public class Shorts
-{
- public static Short valueOf(short value)
- {
- return new Short(value);
- }
-}
diff --git a/libraries/spongycastle/core/src/main/j2me/org/spongycastle/util/test/SimpleTest.java b/libraries/spongycastle/core/src/main/j2me/org/spongycastle/util/test/SimpleTest.java
deleted file mode 100644
index a61e3bdd8..000000000
--- a/libraries/spongycastle/core/src/main/j2me/org/spongycastle/util/test/SimpleTest.java
+++ /dev/null
@@ -1,84 +0,0 @@
-package org.spongycastle.util.test;
-
-import java.io.PrintStream;
-
-import org.spongycastle.util.Arrays;
-
-public abstract class SimpleTest
- implements Test
-{
- public abstract String getName();
-
- private TestResult success()
- {
- return SimpleTestResult.successful(this, "Okay");
- }
-
- protected void fail(
- String message)
- {
- throw new TestFailedException(SimpleTestResult.failed(this, message));
- }
-
- protected void fail(
- String message,
- Throwable throwable)
- {
- throw new TestFailedException(SimpleTestResult.failed(this, message, throwable));
- }
-
- protected void fail(
- String message,
- Object expected,
- Object found)
- {
- throw new TestFailedException(SimpleTestResult.failed(this, message, expected, found));
- }
-
- protected boolean areEqual(
- byte[] a,
- byte[] b)
- {
- return Arrays.areEqual(a, b);
- }
-
- public TestResult perform()
- {
- try
- {
- performTest();
-
- return success();
- }
- catch (TestFailedException e)
- {
- return e.getResult();
- }
- catch (Exception e)
- {
- return SimpleTestResult.failed(this, "Exception: " + e, e);
- }
- }
-
- protected static void runTest(
- Test test)
- {
- runTest(test, System.out);
- }
-
- protected static void runTest(
- Test test,
- PrintStream out)
- {
- TestResult result = test.perform();
-
- out.println(result.toString());
- if (result.getException() != null)
- {
- result.getException().printStackTrace();
- }
- }
-
- public abstract void performTest()
- throws Exception;
-}