diff --git a/history.txt b/history.txt index 5ec2e394b7..e0f74c70f1 100644 --- a/history.txt +++ b/history.txt @@ -1,3 +1,11 @@ +2020-09-02 zzz + * Installer: New Ed25519 destinations for postman's servers + * Router: + - Prep for router encryption types (Proposal 156 WIP) + - Randomize SSU intro key + - Reduce next key threshold for ratchet + - Change ratchet SparseArray from int to char to reduce space + 2020-08-29 zzz * i2ptunnel: Prevent creating bad alt destination when tunnel is running diff --git a/router/java/src/net/i2p/router/RouterVersion.java b/router/java/src/net/i2p/router/RouterVersion.java index 87e5bffca0..282c18b422 100644 --- a/router/java/src/net/i2p/router/RouterVersion.java +++ b/router/java/src/net/i2p/router/RouterVersion.java @@ -18,7 +18,7 @@ public class RouterVersion { /** deprecated */ public final static String ID = "Monotone"; public final static String VERSION = CoreVersion.VERSION; - public final static long BUILD = 1; + public final static long BUILD = 2; /** for example "-test" */ public final static String EXTRA = ""; diff --git a/router/java/src/net/i2p/router/crypto/ratchet/ArrayUtils.java b/router/java/src/net/i2p/router/crypto/ratchet/ArrayUtils.java index baae6f16af..96e10bf1c2 100644 --- a/router/java/src/net/i2p/router/crypto/ratchet/ArrayUtils.java +++ b/router/java/src/net/i2p/router/crypto/ratchet/ArrayUtils.java @@ -24,8 +24,8 @@ class ArrayUtils { private ArrayUtils() { /* cannot be instantiated */ } - public static int[] newUnpaddedIntArray(int minLen) { - return new int[minLen]; + public static char[] newUnpaddedCharArray(int minLen) { + return new char[minLen]; } public static Object[] newUnpaddedObjectArray(int minLen) { diff --git a/router/java/src/net/i2p/router/crypto/ratchet/ContainerHelpers.java b/router/java/src/net/i2p/router/crypto/ratchet/ContainerHelpers.java index a8802858df..41dc53c3a9 100644 --- a/router/java/src/net/i2p/router/crypto/ratchet/ContainerHelpers.java +++ b/router/java/src/net/i2p/router/crypto/ratchet/ContainerHelpers.java @@ -19,13 +19,13 @@ package net.i2p.router.crypto.ratchet; class ContainerHelpers { // This is Arrays.binarySearch(), but doesn't do any argument validation. - static int binarySearch(int[] array, int size, int value) { + static int binarySearch(char[] array, int size, char value) { int lo = 0; int hi = size - 1; while (lo <= hi) { final int mid = (lo + hi) >>> 1; - final int midVal = array[mid]; + final char midVal = array[mid]; if (midVal < value) { lo = mid + 1; diff --git a/router/java/src/net/i2p/router/crypto/ratchet/GrowingArrayUtils.java b/router/java/src/net/i2p/router/crypto/ratchet/GrowingArrayUtils.java index 58eff2e5a8..2048226432 100644 --- a/router/java/src/net/i2p/router/crypto/ratchet/GrowingArrayUtils.java +++ b/router/java/src/net/i2p/router/crypto/ratchet/GrowingArrayUtils.java @@ -51,13 +51,13 @@ final class GrowingArrayUtils { } /** - * Primitive int version of {@link #append(Object[], int, Object)}. + * Primitive char version of {@link #append(Object[], int, Object)}. */ - public static int[] append(int[] array, int currentSize, int element) { + public static char[] append(char[] array, int currentSize, char element) { assert currentSize <= array.length; if (currentSize + 1 > array.length) { - int[] newArray = ArrayUtils.newUnpaddedIntArray(growSize(currentSize)); + char[] newArray = ArrayUtils.newUnpaddedCharArray(growSize(currentSize)); System.arraycopy(array, 0, newArray, 0, currentSize); array = newArray; } @@ -95,9 +95,9 @@ final class GrowingArrayUtils { } /** - * Primitive int version of {@link #insert(Object[], int, int, Object)}. + * Primitive char version of {@link #insert(Object[], int, int, Object)}. */ - public static int[] insert(int[] array, int currentSize, int index, int element) { + public static char[] insert(char[] array, int currentSize, int index, char element) { assert currentSize <= array.length; if (currentSize + 1 <= array.length) { @@ -106,7 +106,7 @@ final class GrowingArrayUtils { return array; } - int[] newArray = ArrayUtils.newUnpaddedIntArray(growSize(currentSize)); + char[] newArray = ArrayUtils.newUnpaddedCharArray(growSize(currentSize)); System.arraycopy(array, 0, newArray, 0, index); newArray[index] = element; System.arraycopy(array, index, newArray, index + 1, array.length - index); diff --git a/router/java/src/net/i2p/router/crypto/ratchet/SparseArray.java b/router/java/src/net/i2p/router/crypto/ratchet/SparseArray.java index 395e00b33f..6c7c2c6812 100644 --- a/router/java/src/net/i2p/router/crypto/ratchet/SparseArray.java +++ b/router/java/src/net/i2p/router/crypto/ratchet/SparseArray.java @@ -45,14 +45,17 @@ package net.i2p.router.crypto.ratchet; * keyAt(int) with ascending values of the index returns the * keys in ascending order. In the case of valueAt(int), the * values corresponding to the keys are returned in ascending order. + * + * I2P - as of 0.9.48, changed to use chars for the index, max value 65535 + * */ class SparseArray implements Cloneable { - private static final int[] EMPTY_INTS = new int[0]; + private static final char[] EMPTY_CHARS = new char[0]; private static final Object[] EMPTY_OBJECTS = new Object[0]; private static final Object DELETED = new Object(); private boolean mGarbage = false; - private int[] mKeys; + private char[] mKeys; private Object[] mValues; private int mSize; @@ -72,11 +75,11 @@ class SparseArray implements Cloneable { */ public SparseArray(int initialCapacity) { if (initialCapacity == 0) { - mKeys = EMPTY_INTS; + mKeys = EMPTY_CHARS; mValues = EMPTY_OBJECTS; } else { mValues = ArrayUtils.newUnpaddedObjectArray(initialCapacity); - mKeys = new int[mValues.length]; + mKeys = new char[mValues.length]; } mSize = 0; } @@ -106,10 +109,14 @@ class SparseArray implements Cloneable { /** * Gets the Object mapped from the specified key, or the specified Object * if no such mapping has been made. + * + * @param key 0 MIN, 65535 MAX */ @SuppressWarnings("unchecked") public E get(int key, E valueIfKeyNotFound) { - int i = ContainerHelpers.binarySearch(mKeys, mSize, key); + if (key < 0 || key > 65535) + return valueIfKeyNotFound; + int i = ContainerHelpers.binarySearch(mKeys, mSize, (char) key); if (i < 0 || mValues[i] == DELETED) { return valueIfKeyNotFound; @@ -120,9 +127,13 @@ class SparseArray implements Cloneable { /** * Removes the mapping from the specified key, if there was any. + * + * @param key 0 MIN, 65535 MAX */ public void delete(int key) { - int i = ContainerHelpers.binarySearch(mKeys, mSize, key); + if (key < 0 || key > 65535) + return; + int i = ContainerHelpers.binarySearch(mKeys, mSize, (char) key); if (i >= 0) { if (mValues[i] != DELETED) { @@ -134,10 +145,14 @@ class SparseArray implements Cloneable { /** * Removes the mapping from the specified key, if there was any, returning the old value. + * + * @param key 0 MIN, 65535 MAX */ @SuppressWarnings("unchecked") public E removeReturnOld(int key) { - int i = ContainerHelpers.binarySearch(mKeys, mSize, key); + if (key < 0 || key > 65535) + return null; + int i = ContainerHelpers.binarySearch(mKeys, mSize, (char) key); if (i >= 0) { if (mValues[i] != DELETED) { @@ -197,7 +212,7 @@ class SparseArray implements Cloneable { int n = mSize; int o = 0; - int[] keys = mKeys; + char[] keys = mKeys; Object[] values = mValues; for (int i = 0; i < n; i++) { @@ -224,9 +239,13 @@ class SparseArray implements Cloneable { * Adds a mapping from the specified key to the specified value, * replacing the previous mapping from the specified key if there * was one. + * + * @param key 0 MIN, 65535 MAX */ public void put(int key, E value) { - int i = ContainerHelpers.binarySearch(mKeys, mSize, key); + if (key < 0 || key > 65535) + throw new IllegalArgumentException(); + int i = ContainerHelpers.binarySearch(mKeys, mSize, (char) key); if (i >= 0) { mValues[i] = value; @@ -234,7 +253,7 @@ class SparseArray implements Cloneable { i = ~i; if (i < mSize && mValues[i] == DELETED) { - mKeys[i] = key; + mKeys[i] = (char) key; mValues[i] = value; return; } @@ -243,10 +262,10 @@ class SparseArray implements Cloneable { gc(); // Search again because indices may have changed. - i = ~ContainerHelpers.binarySearch(mKeys, mSize, key); + i = ~ContainerHelpers.binarySearch(mKeys, mSize, (char) key); } - mKeys = GrowingArrayUtils.insert(mKeys, mSize, i, key); + mKeys = GrowingArrayUtils.insert(mKeys, mSize, i, (char) key); mValues = GrowingArrayUtils.insert(mValues, mSize, i, value); mSize++; } @@ -346,13 +365,17 @@ class SparseArray implements Cloneable { * Returns the index for which {@link #keyAt} would return the * specified key, or a negative number if the specified * key is not mapped. + * + * @param key 0 MIN, 65535 MAX */ public int indexOfKey(int key) { + if (key < 0 || key > 65535) + return -1; if (mGarbage) { gc(); } - return ContainerHelpers.binarySearch(mKeys, mSize, key); + return ContainerHelpers.binarySearch(mKeys, mSize, (char) key); } /** @@ -425,8 +448,12 @@ class SparseArray implements Cloneable { /** * Puts a key/value pair into the array, optimizing for the case where * the key is greater than all existing keys in the array. + * + * @param key 0 MIN, 65535 MAX */ public void append(int key, E value) { + if (key < 0 || key > 65535) + throw new IllegalArgumentException(); if (mSize != 0 && key <= mKeys[mSize - 1]) { put(key, value); return; @@ -436,7 +463,7 @@ class SparseArray implements Cloneable { gc(); } - mKeys = GrowingArrayUtils.append(mKeys, mSize, key); + mKeys = GrowingArrayUtils.append(mKeys, mSize, (char) key); mValues = GrowingArrayUtils.append(mValues, mSize, value); mSize++; }