From f7c243564f87d60df322ea9f62c1591920f8d32b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dominik=20Sch=C3=BCrmann?= Date: Wed, 16 Apr 2014 21:49:29 +0200 Subject: Use git submodules for libs, fix compilation, remove library sourcecode --- .../src/main/j2me/java/io/FilterInputStream.java | 56 - .../src/main/j2me/java/io/FilterOutputStream.java | 39 - .../core/src/main/j2me/java/math/BigInteger.java | 3272 -------------------- .../src/main/j2me/java/security/SecureRandom.java | 141 - .../main/j2me/java/util/AbstractCollection.java | 261 -- .../core/src/main/j2me/java/util/AbstractList.java | 304 -- .../core/src/main/j2me/java/util/AbstractMap.java | 173 -- .../core/src/main/j2me/java/util/AbstractSet.java | 46 - .../core/src/main/j2me/java/util/ArrayList.java | 107 - .../core/src/main/j2me/java/util/Arrays.java | 118 - .../core/src/main/j2me/java/util/Collection.java | 21 - .../core/src/main/j2me/java/util/Collections.java | 365 --- .../core/src/main/j2me/java/util/HashMap.java | 279 -- .../core/src/main/j2me/java/util/HashSet.java | 71 - .../core/src/main/j2me/java/util/Iterator.java | 9 - .../core/src/main/j2me/java/util/List.java | 32 - .../core/src/main/j2me/java/util/ListIterator.java | 20 - .../core/src/main/j2me/java/util/Map.java | 54 - .../core/src/main/j2me/java/util/Set.java | 38 - .../src/main/j2me/java/util/StringTokenizer.java | 115 - .../core/src/main/j2me/java/util/Sublist.java | 142 - .../org/spongycastle/asn1/ASN1GeneralizedTime.java | 27 - .../j2me/org/spongycastle/asn1/ASN1UTCTime.java | 22 - .../j2me/org/spongycastle/asn1/DERFactory.java | 31 - .../org/spongycastle/asn1/DERGeneralizedTime.java | 260 -- .../j2me/org/spongycastle/asn1/DERUTCTime.java | 259 -- .../j2me/org/spongycastle/asn1/DateFormatter.java | 272 -- .../j2me/org/spongycastle/asn1/StreamUtil.java | 88 - .../main/j2me/org/spongycastle/asn1/cms/Time.java | 122 - .../j2me/org/spongycastle/asn1/eac/PackedDate.java | 70 - .../main/j2me/org/spongycastle/asn1/x509/Time.java | 122 - .../crypto/encodings/PKCS1Encoding.java | 238 -- .../org/spongycastle/crypto/examples/MIDPTest.java | 177 -- .../org/spongycastle/crypto/examples/midp_test.jad | 6 - .../org/spongycastle/crypto/examples/midp_test.mf | 7 - .../crypto/params/SkeinParameters.java | 258 -- .../spongycastle/crypto/tls/OCSPStatusRequest.java | 131 - .../spongycastle/crypto/tls/ServerNameList.java | 86 - .../org/spongycastle/crypto/tls/UDPTransport.java | 107 - .../j2me/org/spongycastle/math/ec/LongArray.java | 1997 ------------ .../main/j2me/org/spongycastle/util/Integers.java | 9 - .../main/j2me/org/spongycastle/util/Selector.java | 8 - .../main/j2me/org/spongycastle/util/Shorts.java | 9 - .../org/spongycastle/util/test/SimpleTest.java | 84 - 44 files changed, 10053 deletions(-) delete mode 100644 libraries/spongycastle/core/src/main/j2me/java/io/FilterInputStream.java delete mode 100644 libraries/spongycastle/core/src/main/j2me/java/io/FilterOutputStream.java delete mode 100644 libraries/spongycastle/core/src/main/j2me/java/math/BigInteger.java delete mode 100644 libraries/spongycastle/core/src/main/j2me/java/security/SecureRandom.java delete mode 100644 libraries/spongycastle/core/src/main/j2me/java/util/AbstractCollection.java delete mode 100644 libraries/spongycastle/core/src/main/j2me/java/util/AbstractList.java delete mode 100644 libraries/spongycastle/core/src/main/j2me/java/util/AbstractMap.java delete mode 100644 libraries/spongycastle/core/src/main/j2me/java/util/AbstractSet.java delete mode 100644 libraries/spongycastle/core/src/main/j2me/java/util/ArrayList.java delete mode 100644 libraries/spongycastle/core/src/main/j2me/java/util/Arrays.java delete mode 100644 libraries/spongycastle/core/src/main/j2me/java/util/Collection.java delete mode 100644 libraries/spongycastle/core/src/main/j2me/java/util/Collections.java delete mode 100644 libraries/spongycastle/core/src/main/j2me/java/util/HashMap.java delete mode 100644 libraries/spongycastle/core/src/main/j2me/java/util/HashSet.java delete mode 100644 libraries/spongycastle/core/src/main/j2me/java/util/Iterator.java delete mode 100644 libraries/spongycastle/core/src/main/j2me/java/util/List.java delete mode 100644 libraries/spongycastle/core/src/main/j2me/java/util/ListIterator.java delete mode 100644 libraries/spongycastle/core/src/main/j2me/java/util/Map.java delete mode 100644 libraries/spongycastle/core/src/main/j2me/java/util/Set.java delete mode 100644 libraries/spongycastle/core/src/main/j2me/java/util/StringTokenizer.java delete mode 100644 libraries/spongycastle/core/src/main/j2me/java/util/Sublist.java delete mode 100644 libraries/spongycastle/core/src/main/j2me/org/spongycastle/asn1/ASN1GeneralizedTime.java delete mode 100644 libraries/spongycastle/core/src/main/j2me/org/spongycastle/asn1/ASN1UTCTime.java delete mode 100644 libraries/spongycastle/core/src/main/j2me/org/spongycastle/asn1/DERFactory.java delete mode 100644 libraries/spongycastle/core/src/main/j2me/org/spongycastle/asn1/DERGeneralizedTime.java delete mode 100644 libraries/spongycastle/core/src/main/j2me/org/spongycastle/asn1/DERUTCTime.java delete mode 100644 libraries/spongycastle/core/src/main/j2me/org/spongycastle/asn1/DateFormatter.java delete mode 100644 libraries/spongycastle/core/src/main/j2me/org/spongycastle/asn1/StreamUtil.java delete mode 100644 libraries/spongycastle/core/src/main/j2me/org/spongycastle/asn1/cms/Time.java delete mode 100644 libraries/spongycastle/core/src/main/j2me/org/spongycastle/asn1/eac/PackedDate.java delete mode 100644 libraries/spongycastle/core/src/main/j2me/org/spongycastle/asn1/x509/Time.java delete mode 100644 libraries/spongycastle/core/src/main/j2me/org/spongycastle/crypto/encodings/PKCS1Encoding.java delete mode 100644 libraries/spongycastle/core/src/main/j2me/org/spongycastle/crypto/examples/MIDPTest.java delete mode 100644 libraries/spongycastle/core/src/main/j2me/org/spongycastle/crypto/examples/midp_test.jad delete mode 100644 libraries/spongycastle/core/src/main/j2me/org/spongycastle/crypto/examples/midp_test.mf delete mode 100644 libraries/spongycastle/core/src/main/j2me/org/spongycastle/crypto/params/SkeinParameters.java delete mode 100644 libraries/spongycastle/core/src/main/j2me/org/spongycastle/crypto/tls/OCSPStatusRequest.java delete mode 100644 libraries/spongycastle/core/src/main/j2me/org/spongycastle/crypto/tls/ServerNameList.java delete mode 100644 libraries/spongycastle/core/src/main/j2me/org/spongycastle/crypto/tls/UDPTransport.java delete mode 100644 libraries/spongycastle/core/src/main/j2me/org/spongycastle/math/ec/LongArray.java delete mode 100644 libraries/spongycastle/core/src/main/j2me/org/spongycastle/util/Integers.java delete mode 100644 libraries/spongycastle/core/src/main/j2me/org/spongycastle/util/Selector.java delete mode 100644 libraries/spongycastle/core/src/main/j2me/org/spongycastle/util/Shorts.java delete mode 100644 libraries/spongycastle/core/src/main/j2me/org/spongycastle/util/test/SimpleTest.java (limited to 'libraries/spongycastle/core/src/main/j2me') 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. - *

- * 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 - *
- * Based algorithm 14.36 of Handbook of Applied Cryptography. - *
- *

  • m, x, y should have length n
  • - *
  • a should have length (n + 1)
  • - *
  • b = 2^32, R = b^n
  • - *
    - * The result is put in x - *
    - * 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. - *

    - * Do not use this class without calling setSeed at least once! 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). - *

    - * Normally in a certificate we would expect "Z" rather than "GMT", - * however adding the "GMT" means we can just use: - *

    -     *     dateF = new SimpleDateFormat("yyyyMMddHHmmssz");
    -     * 
    - * 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). - *

    - * - * @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). - *

    - * Normally in a certificate we would expect "Z" rather than "GMT", - * however adding the "GMT" means we can just use: - *

    -     *     dateF = new SimpleDateFormat("yyMMddHHmmssz");
    -     * 
    - * To read in the time and get a date which is compatible with our local - * time zone. - *

    - * Note: 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. - *

    -     * Time ::= CHOICE {
    -     *             utcTime        UTCTime,
    -     *             generalTime    GeneralizedTime }
    -     * 
    - */ - 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. - *
    -     * Time ::= CHOICE {
    -     *             utcTime        UTCTime,
    -     *             generalTime    GeneralizedTime }
    -     * 
    - */ - 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. - *

    - * The system property is checked during construction of the encoding object, it is set to - * true by default. - *

    - */ - 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. - *

    - * Parameterised Skein can be used for: - *

    - * - * @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 null 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 - * null 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 - * null 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 - * null 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 null 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.
    - * Parameter types must be in the range 0,5..62, and cannot use the value {@value - * SkeinParameters#PARAM_TYPE_MESSAGE} (reserved for message body). - *

    - * 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; -} -- cgit v1.2.3