propagate from branch 'i2p.i2p' (head dc55b0e10a8da0fb3b9571a30bee6d96d2b1b271)

to branch 'i2p.i2p.zzz.test4' (head b246a3f2df80018875eafca6be6d5d2096c804fd)
This commit is contained in:
zzz
2011-01-15 14:39:28 +00:00
19 changed files with 3112 additions and 2766 deletions

View File

@@ -755,7 +755,7 @@
</target>
<target name="findbugs" depends="build2">
<echo message="Starting findbugs, this will take a while..." />
<exec executable="nice">
<exec executable="nice" failonerror="true">
<arg value="findbugs"/>
<arg value="-textui"/>
<arg value="-projectName"/>

View File

@@ -1,5 +1,6 @@
/*
* Created on Jul 14, 2004
* Updated on Jan 8, 2011
*/
package freenet.support.CPUInformation;
@@ -129,11 +130,26 @@ public class CPUID {
CPUIDResult c = doCPUID(1);
return c.EAX & 0xf;
}
private static int getCPUFlags()
private static int getEDXCPUFlags()
{
CPUIDResult c = doCPUID(1);
return c.EDX;
}
private static int getECXCPUFlags()
{
CPUIDResult c = doCPUID(1);
return c.ECX;
}
private static int getExtendedEDXCPUFlags()
{
CPUIDResult c = doCPUID(0x80000001);
return c.EDX;
}
private static int getExtendedECXCPUFlags()
{
CPUIDResult c = doCPUID(0x80000001);
return c.ECX;
}
//Returns a CPUInfo item for the current type of CPU
//If I could I would declare this method in a interface named
@@ -163,13 +179,25 @@ public class CPUID {
return getCPUVendorID();
}
public boolean hasMMX(){
return (getCPUFlags() & 0x800000) >0; //Bit 23
return (getEDXCPUFlags() & 0x800000) >0; //EDX Bit 23
}
public boolean hasSSE(){
return (getCPUFlags() & 0x2000000) >0; //Bit 25
return (getEDXCPUFlags() & 0x2000000) >0; //EDX Bit 25
}
public boolean hasSSE2(){
return (getCPUFlags() & 0x4000000) >0; //Bit 26
return (getEDXCPUFlags() & 0x4000000) >0; //EDX Bit 26
}
public boolean hasSSE3(){
return (getEDXCPUFlags() & 0x1) >0; //ECX Bit 0
}
public boolean hasSSE41(){
return (getEDXCPUFlags() & 0x80000) >0; //ECX Bit 19
}
public boolean hasSSE42(){
return (getEDXCPUFlags() & 0x100000) >0; //ECX Bit 20
}
public boolean hasSSE4A(){
return (getExtendedECXCPUFlags() & 0x40) >0; //Extended ECX Bit 6
}
public boolean IsC3Compatible() { return false; }
}
@@ -296,77 +324,119 @@ public class CPUID {
return getCPUFamily() > 6 || (getCPUFamily() == 6 && getCPUModel() >=3);
}
public boolean IsPentium3Compatible()
{
return getCPUFamily() > 6 || (getCPUFamily() == 6 && getCPUModel() >=7);
{
// Atom
if (getCPUExtendedModel() == 1 && (getCPUFamily() == 6 && (getCPUModel() == 12))){
return true;
// ??
} else if (getCPUExtendedModel() == 0 && (getCPUFamily() > 6 || (getCPUFamily() == 6 && getCPUModel() >=7))){
return true;
} else {
return false;
}
}
public boolean IsPentium4Compatible()
{
return getCPUFamily() >= 15;
{
// P4
if (getCPUFamily() >= 15){
return true;
// Xeon MP (45nm) or Core i7
} else if (getCPUExtendedModel() == 1 && (getCPUFamily() == 6 && (getCPUModel() == 10 || getCPUModel() == 13))){
return true;
// Core 2 Duo
} else if (getCPUExtendedModel() == 0 && getCPUFamily() == 6 && getCPUModel() == 15){
return true;
} else {
return false;
}
}
public String getCPUModelString() throws UnknownCPUException {
if(getCPUFamily() == 4){
switch(getCPUModel()){
case 0:
return "486 DX-25/33";
case 1:
return "486 DX-50";
case 2:
return "486 SX";
case 3:
return "486 DX/2";
case 4:
return "486 SL";
case 5:
return "486 SX/2";
case 7:
return "486 DX/2-WB";
case 8:
return "486 DX/4";
case 9:
return "486 DX/4-WB";
}
}
if(getCPUFamily() == 5){
switch(getCPUModel()){
case 0:
return "Pentium 60/66 A-step";
case 1:
return "Pentium 60/66";
case 2:
return "Pentium 75 - 200";
case 3:
return "OverDrive PODP5V83";
case 4:
return "Pentium MMX";
case 7:
return "Mobile Pentium 75 - 200";
case 8:
return "Mobile Pentium MMX";
}
if (getCPUExtendedModel() == 0){
if(getCPUFamily() == 4){
switch(getCPUModel()){
case 0:
return "486 DX-25/33";
case 1:
return "486 DX-50";
case 2:
return "486 SX";
case 3:
return "486 DX/2";
case 4:
return "486 SL";
case 5:
return "486 SX/2";
case 7:
return "486 DX/2-WB";
case 8:
return "486 DX/4";
case 9:
return "486 DX/4-WB";
}
}
}
if (getCPUExtendedModel() == 0){
if(getCPUFamily() == 5){
switch(getCPUModel()){
case 0:
return "Pentium 60/66 A-step";
case 1:
return "Pentium 60/66";
case 2:
return "Pentium 75 - 200";
case 3:
return "OverDrive PODP5V83";
case 4:
return "Pentium MMX";
case 7:
return "Mobile Pentium 75 - 200";
case 8:
return "Mobile Pentium MMX";
}
}
}
if(getCPUFamily() == 6){
switch(getCPUModel()){
case 0:
return "Pentium Pro A-step";
case 1:
return "Pentium Pro";
case 3:
return "Pentium II (Klamath)";
case 5:
return "Pentium II (Deschutes), Celeron (Covington), Mobile Pentium II (Dixon)";
case 6:
return "Mobile Pentium II, Celeron (Mendocino)";
case 7:
return "Pentium III (Katmai)";
case 8:
return "Pentium III (Coppermine), Celeron w/SSE";
case 9:
return "Mobile Pentium III";
case 10:
return "Pentium III Xeon (Cascades)";
case 11:
return "Pentium III (130 nm)";
}
if (getCPUExtendedModel() == 0){
switch(getCPUModel()){
case 0:
return "Pentium Pro A-step";
case 1:
return "Pentium Pro";
case 3:
return "Pentium II (Klamath)";
case 5:
return "Pentium II (Deschutes), Celeron (Covington), Mobile Pentium II (Dixon)";
case 6:
return "Mobile Pentium II, Celeron (Mendocino)";
case 7:
return "Pentium III (Katmai)";
case 8:
return "Pentium III (Coppermine), Celeron w/SSE";
case 9:
return "Mobile Pentium III (Banias)";
case 10:
return "Pentium III Xeon (Cascades)";
case 11:
return "Pentium III (130 nm)";
case 13:
return "Mobile Pentium III (Dothan)";
case 14:
return "Mobile Core (Yonah)";
case 15:
return "Core 2 (Conroe)";
}
} else {
if (getCPUExtendedModel() == 1){
switch(getCPUModel()){
case 10:
return "Core i7";
case 12:
return "Atom";
case 13:
return "Xeon MP";
}
}
}
}
if(getCPUFamily() == 7){
switch(getCPUModel()){
@@ -384,6 +454,10 @@ public class CPUID {
return "Pentium IV (130 nm)";
case 3:
return "Pentium IV (90 nm)";
case 4:
return "Pentium IV (90 nm)";
case 6:
return "Pentium IV (65 nm)";
}
}
if(getCPUExtendedFamily() == 1){
@@ -407,7 +481,7 @@ public class CPUID {
System.out.println("CPU Family: " + getCPUFamily());
System.out.println("CPU Model: " + getCPUModel());
System.out.println("CPU Stepping: " + getCPUStepping());
System.out.println("CPU Flags: " + getCPUFlags());
System.out.println("CPU Flags: " + getEDXCPUFlags());
CPUInfo c = getInfo();
System.out.println(" **More CPUInfo**");
@@ -415,6 +489,10 @@ public class CPUID {
System.out.println(" CPU has MMX: " + c.hasMMX());
System.out.println(" CPU has SSE: " + c.hasSSE());
System.out.println(" CPU has SSE2: " + c.hasSSE2());
System.out.println(" CPU has SSE3: " + c.hasSSE3());
System.out.println(" CPU has SSE4.1: " + c.hasSSE41());
System.out.println(" CPU has SSE4.2: " + c.hasSSE42());
System.out.println(" CPU has SSE4A: " + c.hasSSE4A());
if(c instanceof IntelCPUInfo){
System.out.println(" **Intel-info**");
System.out.println(" Is pII-compatible: "+((IntelCPUInfo)c).IsPentium2Compatible());

View File

@@ -1,6 +1,6 @@
/*
* Created on Jul 16, 2004
*
* Created on Jul 14, 2004
* Updated on Jan 8, 2011
*/
package freenet.support.CPUInformation;
@@ -42,5 +42,25 @@ public interface CPUInfo
*/
public boolean hasSSE2();
/**
* @return true iff the CPU support the SSE3 instruction set.
*/
public boolean hasSSE3();
/**
* @return true iff the CPU support the SSE4.1 instruction set.
*/
public boolean hasSSE41();
/**
* @return true iff the CPU support the SSE4.2 instruction set.
*/
public boolean hasSSE42();
/**
* @return true iff the CPU support the SSE4A instruction set.
*/
public boolean hasSSE4A();
public boolean IsC3Compatible();
}

View File

@@ -23,13 +23,18 @@ public final class SHA256Generator {
return I2PAppContext.getGlobalContext().sha();
}
/** Calculate the SHA-256 has of the source
/**
* Calculate the SHA-256 hash of the source and cache the result.
* @param source what to hash
* @return hash of the source
*/
public final Hash calculateHash(byte[] source) {
return calculateHash(source, 0, source.length);
}
/**
* Calculate the hash and cache the result.
*/
public final Hash calculateHash(byte[] source, int start, int len) {
Sha256Standalone digest = acquireGnu();
digest.update(source, start, len);
@@ -39,6 +44,10 @@ public final class SHA256Generator {
return Hash.create(rv);
}
/**
* Use this if you only need the data, not a Hash object.
* Does not cache.
*/
public final void calculateHash(byte[] source, int start, int len, byte out[], int outOffset) {
Sha256Standalone digest = acquireGnu();
digest.update(source, start, len);

View File

@@ -31,6 +31,7 @@ import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
import java.util.Comparator;
import java.util.Date;
import java.util.Iterator;
import java.util.List;
@@ -1040,25 +1041,45 @@ public class DataHelper {
}
/**
* Sort based on the Hash of the DataStructure
* Sort based on the Hash of the DataStructure.
* Warning - relatively slow.
* Only used by RouterInfo
* Why? Just because it has to be consistent so signing will work?
* WARNING - this sort order must be consistent network-wide, so while the order is arbitrary,
* it cannot be changed.
* Why? Just because it has to be consistent so signing will work.
* How to spec as returning the same type as the param?
* DEPRECATED - Only used by RouterInfo.
*/
public static List<? extends DataStructure> sortStructures(Collection<? extends DataStructure> dataStructures) {
if (dataStructures == null) return Collections.EMPTY_LIST;
ArrayList<DataStructure> rv = new ArrayList(dataStructures.size());
TreeMap<String, DataStructure> tm = new TreeMap();
for (DataStructure struct : dataStructures) {
tm.put(struct.calculateHash().toString(), struct);
}
for (DataStructure struct : tm.values()) {
rv.add(struct);
}
// This used to use Hash.toString(), which is insane, since a change to toString()
// would break the whole network. Now use Hash.toBase64().
// Note that the Base64 sort order is NOT the same as the raw byte sort order,
// despite what you may read elsewhere.
//ArrayList<DataStructure> rv = new ArrayList(dataStructures.size());
//TreeMap<String, DataStructure> tm = new TreeMap();
//for (DataStructure struct : dataStructures) {
// tm.put(struct.calculateHash().toString(), struct);
//}
//for (DataStructure struct : tm.values()) {
// rv.add(struct);
//}
ArrayList<DataStructure> rv = new ArrayList(dataStructures);
Collections.sort(rv, new DataStructureComparator());
return rv;
}
/**
* See sortStructures() comments.
* @since 0.8.3
*/
private static class DataStructureComparator implements Comparator<DataStructure> {
public int compare(DataStructure l, DataStructure r) {
return l.calculateHash().toBase64().compareTo(r.calculateHash().toBase64());
}
}
/**
* NOTE: formatDuration2() recommended in most cases for readability
*/

View File

@@ -16,6 +16,9 @@ import net.i2p.crypto.KeyGenerator;
* A private key is 256byte Integer. The private key represents only the
* exponent, not the primes, which are constant and defined in the crypto spec.
*
* Note that we use short exponents, so all but the last 28.25 bytes are zero.
* See http://www.i2p2.i2p/how_cryptography for details.
*
* @author jrandom
*/
public class PrivateKey extends SimpleDataStructure {
@@ -50,4 +53,24 @@ public class PrivateKey extends SimpleDataStructure {
return KeyGenerator.getPublicKey(this);
}
/**
* We assume the data has enough randomness in it, so use the last 4 bytes for speed.
* Overridden since we use short exponents, so the first 227 bytes are all zero.
* Not that we are storing PrivateKeys in any Sets or Maps anywhere.
*/
@Override
public int hashCode() {
if (_data == null)
return 0;
int rv = _data[KEYSIZE_BYTES - 4];
for (int i = 1; i < 4; i++)
rv ^= (_data[i + (KEYSIZE_BYTES - 4)] << (i*8));
return rv;
}
@Override
public boolean equals(Object obj) {
if ((obj == null) || !(obj instanceof PrivateKey)) return false;
return DataHelper.eq(_data, ((PrivateKey) obj)._data);
}
}

View File

@@ -131,10 +131,13 @@ public class RouterAddress extends DataStructureImpl {
&& DataHelper.eq(_transportStyle, addr.getTransportStyle());
}
/** the style should be sufficient, for speed */
/**
* Just use style and hashCode for speed (expiration is always null).
* If we add multiple addresses of the same style, this may need to be changed.
*/
@Override
public int hashCode() {
return DataHelper.hashCode(_transportStyle);
return DataHelper.hashCode(_transportStyle) ^ _cost;
}
/**

View File

@@ -14,6 +14,7 @@ import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.Collection;
import java.util.Collections;
import java.util.Date;
import java.util.HashSet;
import java.util.Iterator;
@@ -39,7 +40,8 @@ public class RouterInfo extends DatabaseEntry {
private RouterIdentity _identity;
private volatile long _published;
private final Set<RouterAddress> _addresses;
private final Set<Hash> _peers;
/** may be null to save memory, no longer final */
private Set<Hash> _peers;
private /* FIXME final FIXME */ Properties _options;
private volatile boolean _validated;
private volatile boolean _isValid;
@@ -47,6 +49,10 @@ public class RouterInfo extends DatabaseEntry {
private volatile byte _byteified[];
private volatile int _hashCode;
private volatile boolean _hashCodeInitialized;
/** should we cache the byte and string versions _byteified ? **/
private boolean _shouldCache;
/** maybe we should check if we are floodfill? */
private static final boolean CACHE_ALL = Runtime.getRuntime().maxMemory() > 128*1024*1024l;
public static final String PROP_NETWORK_ID = "netId";
public static final String PROP_CAPABILITIES = "caps";
@@ -58,7 +64,6 @@ public class RouterInfo extends DatabaseEntry {
public RouterInfo() {
_addresses = new HashSet(2);
_peers = new HashSet(0);
_options = new OrderedProperties();
}
@@ -70,6 +75,7 @@ public class RouterInfo extends DatabaseEntry {
setPeers(old.getPeers());
setOptions(old.getOptions());
setSignature(old.getSignature());
// copy over _byteified?
}
public long getDate() {
@@ -105,6 +111,11 @@ public class RouterInfo extends DatabaseEntry {
public void setIdentity(RouterIdentity ident) {
_identity = ident;
resetCache();
// We only want to cache the bytes for our own RI, which is frequently written.
// To cache for all RIs doubles the RI memory usage.
// setIdentity() is only called when we are creating our own RI.
// Otherwise, the data is populated with readBytes().
_shouldCache = true;
}
/**
@@ -159,6 +170,8 @@ public class RouterInfo extends DatabaseEntry {
* @deprecated Implemented here but unused elsewhere
*/
public Set<Hash> getPeers() {
if (_peers == null)
return Collections.EMPTY_SET;
return _peers;
}
@@ -169,9 +182,15 @@ public class RouterInfo extends DatabaseEntry {
* @deprecated Implemented here but unused elsewhere
*/
public void setPeers(Set<Hash> peers) {
if (peers == null || peers.isEmpty()) {
_peers = null;
return;
}
if (_peers == null)
_peers = new HashSet(2);
synchronized (_peers) {
_peers.clear();
if (peers != null) _peers.addAll(peers);
_peers.addAll(peers);
}
resetCache();
}
@@ -223,7 +242,6 @@ public class RouterInfo extends DatabaseEntry {
if (_byteified != null) return _byteified;
if (_identity == null) throw new DataFormatException("Router identity isn't set? wtf!");
if (_addresses == null) throw new DataFormatException("Router addressess isn't set? wtf!");
if (_peers == null) throw new DataFormatException("Router peers isn't set? wtf!");
if (_options == null) throw new DataFormatException("Router options isn't set? wtf!");
long before = Clock.getInstance().now();
@@ -239,6 +257,9 @@ public class RouterInfo extends DatabaseEntry {
DataHelper.writeLong(out, 1, sz);
Collection<RouterAddress> addresses = _addresses;
if (sz > 1)
// WARNING this sort algorithm cannot be changed, as it must be consistent
// network-wide. The signature is not checked at readin time, but only
// later, and the addresses are stored in a Set, not a List.
addresses = (Collection<RouterAddress>) DataHelper.sortStructures(addresses);
for (RouterAddress addr : addresses) {
addr.writeBytes(out);
@@ -248,12 +269,14 @@ public class RouterInfo extends DatabaseEntry {
// answer: they're always empty... they're a placeholder for one particular
// method of trusted links, which isn't implemented in the router
// at the moment, and may not be later.
// fixme to reduce objects - allow _peers == null
int psz = _peers.size();
int psz = _peers == null ? 0 : _peers.size();
DataHelper.writeLong(out, 1, psz);
if (psz > 0) {
Collection<Hash> peers = _peers;
if (psz > 1)
// WARNING this sort algorithm cannot be changed, as it must be consistent
// network-wide. The signature is not checked at readin time, but only
// later, and the hashes are stored in a Set, not a List.
peers = (Collection<Hash>) DataHelper.sortStructures(peers);
for (Hash peerHash : peers) {
peerHash.writeBytes(out);
@@ -266,7 +289,8 @@ public class RouterInfo extends DatabaseEntry {
byte data[] = out.toByteArray();
long after = Clock.getInstance().now();
_log.debug("getBytes() took " + (after - before) + "ms");
_byteified = data;
if (CACHE_ALL || _shouldCache)
_byteified = data;
return data;
}
@@ -466,10 +490,15 @@ public class RouterInfo extends DatabaseEntry {
_addresses.add(address);
}
int numPeers = (int) DataHelper.readLong(in, 1);
for (int i = 0; i < numPeers; i++) {
Hash peerIdentityHash = new Hash();
peerIdentityHash.readBytes(in);
_peers.add(peerIdentityHash);
if (numPeers == 0) {
_peers = null;
} else {
_peers = new HashSet(numPeers);
for (int i = 0; i < numPeers; i++) {
Hash peerIdentityHash = new Hash();
peerIdentityHash.readBytes(in);
_peers.add(peerIdentityHash);
}
}
_options = DataHelper.readProperties(in);
_signature = new Signature();
@@ -504,7 +533,7 @@ public class RouterInfo extends DatabaseEntry {
&& _published == info.getPublished()
&& DataHelper.eq(_addresses, info.getAddresses())
&& DataHelper.eq(_options, info.getOptions())
&& DataHelper.eq(_peers, info.getPeers());
&& DataHelper.eq(getPeers(), info.getPeers());
}
@Override
@@ -530,7 +559,7 @@ public class RouterInfo extends DatabaseEntry {
RouterAddress addr = (RouterAddress) iter.next();
buf.append("\n\t\tAddress: ").append(addr);
}
Set peers = _peers; // getPeers()
Set peers = getPeers();
buf.append("\n\tPeers: #: ").append(peers.size());
for (Iterator iter = peers.iterator(); iter.hasNext();) {
Hash hash = (Hash) iter.next();

View File

@@ -152,7 +152,9 @@ public class LogManager {
if (_writer != null)
return;
_writer = new LogWriter(this);
Thread t = new I2PThread(_writer, "LogWriter", true);
// NOT an I2PThread, as it contains logging and we end up with problems
Thread t = new Thread(_writer, "LogWriter");
t.setDaemon(true);
t.start();
}

View File

@@ -1,3 +1,16 @@
2011-01-09 zzz
* DataHelper: Speed up and annotate sortStructures()
* Data Structures: More caching improvements, don't cache where we shouldn't
* NetDB: Don't rescan netDb directory unless changed,
to reduce Hash cache thrash (backport from test4)
* RouterInfo:
- Don't cache byteified data by default, to save ~1.5 MB
- Don't create empty peers Set, to save ~100KB
2011-01-07 zzz
* Data Structures: More caching
* i2psnark: Improve request tracking to reduce memory usage
2011-01-05 zzz
* build.xml: Fix findbugs target
* Fix some miscellaneous findbugs bugs

View File

@@ -15,7 +15,7 @@
<div class="welcome"><h2>Welcome to the Invisible Internet</h2></div>
<ul class="links"><li class="tidylist"><b>Starting Up&hellip;</b><br>If you've just started I2P, the number of <i>Active Peers</i> indicated under the <i>Peers</i> section in the side panel on the left should start to grow over the next few minutes and you'll also see a <i>Local Destination</i> named <i>Shared Clients</i> listed there, and possibly other clients and servers depending on how I2P is configured (if not, see the troubleshooting section <a href="#trouble">below</a>). These <i>Local Destinations</i> provide connections on different ports (and sometimes protocols) to the I2P network, enabling your bittorrent, e-mail, web proxy and other services to function. Your <a href="/netdb">Network Database</a> indicates all known peers on the network. Additionally, you can monitor existing <a href="/peers">Peer Connections</a>, and view existing <a href="/tunnels">Tunnels</a> and their status. More information is available on the <a href="/help">help page</a>.</li>
<li class="tidylist"><b>Network integration</b><br> The first time you start I2P it may take a few minutes to bootstrap (integrate) you into the network and find additional peers to optimize your integration, so please be patient. Once green stars are indicated next to your <i>Local Destinations</i>, there is a wide variety of things you can do with I2P, and below we introduce you to some of them.</li></ul>
<li class="tidylist"><b>Network integration</b><br> The first time you start I2P it may take a few minutes to bootstrap (integrate) you into the network and find additional peers to optimize your integration, so please be patient. When I2P starts up, and during normal operation, I2P's tunnel build readiness indicator (immediately above the <i>Local Destinations</i> section in the sidepanel) may tell you that I2P is "Rejecting Tunnels"; this is normal behavior and should be of no cause for concern! Once green stars are indicated next to your <i>Local Destinations</i>, there is a wide variety of things you can do with I2P, and below we introduce you to some of them.</li></ul>
<h3>Services on I2P</h3>
<ul class="links">

View File

@@ -408,7 +408,19 @@ div.news li {
}
div.news h3 {
text-align: left !important;
background: none !important;
text-align: left;
border: none !important;
border-bottom: 1px dotted !important;
-moz-box-shadow: none;
-hktml-box-shadow: none;
box-shadow: none;
font-size: 10pt !important;
letter-spacing: 0.05em;
text-transform: capitalize !important;
text-shadow: none !important;
padding: 5px 10px 3px;
margin: 10px 10px -7px !important;
}
div.news p {

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -1,384 +1,421 @@
body {
margin: 0px;
padding: 0px;
text-align: center;
font-family: "Lucida Sans Unicode", Verdana, Helvetica, sans-serif;
background: #eef url('images/snowcamo.png');
color: #001;
font-size: 10pt;
/* we've avoided Tantek Hacks so far,
** but we can't avoid using the non-w3c method of
** box rendering. (and therefore one of mozilla's
** proprietry -moz properties (which hopefully they'll
** drop soon).
*/
-moz-box-sizing: border-box;
box-sizing: border-box;
background: #99f url(images/magic.png);
}
div {
-moz-box-sizing: border-box;
box-sizing: border-box;
}
label {
margin: 0px 4px;
padding: 1px 10px 2px 0px;
float: left;
width: 120px;
height: 24px;
font-weight: normal;
text-align: right;
font-size: 8pt;
font-style: italic;
-moz-box-sizing: border-box;
box-sizing: border-box;
line-height: 120%;
color: #101;
}
h4 {
font-size: 14px;
font-weight: bold !important;
color: #001;
text-align: center;
border: 1px solid #225;
margin: 5px 0 15px 0;
padding: 5px 10px;
background: #eef url(images/header.png) repeat-x center center;
letter-spacing: 0.08em;
-moz-box-shadow: inset 0px 0px 4px 0px #bbf;
-moz-border-radius: 4px;
-khtml-border-radius: 4px;
border-radius: 4px;
}
a {
text-decoration: none;
}
form {
margin: 0px;
}
textarea, input, select, button, a {
-moz-box-sizing: border-box;
box-sizing: border-box;
font-size: 9pt;
float: left;
vertical-align: middle;
}
button {
float: none;
text-decoration: none;
}
textarea {
border: 1px solid #9999ff;
color: #001;
background: #ddf;
border: 1px solid #44d;
}
br {
clear: left;
}
div.statusNotRunning {
float: left;
width: 68px;
height: 24px;
overflow: hidden;
color: #d00;
background: url('images/console_status_stopped.png') 0 0 no-repeat;
padding-top: 24px;
margin-top: 4px;
}
div.statusRunning {
float: left;
width: 68px;
height: 24px;
overflow: hidden;
color: #0b0;
background: url('images/console_status_running.png') 0 0 no-repeat;
padding-top: 24px;
margin-top: 4px;
}
div.statusStarting {
float: left;
width: 68px;
height: 24px;
overflow: hidden;
color: #339933;
background: url('images/console_status_starting.png') 0 0 no-repeat;
padding-top: 24px;
margin-top: 4px;
}
hr {
display: none;
}
.separator, .subdivider {
clear: both;
height: 1px;
margin: 1px 0px 1px 0px;
border-bottom: 1px solid #225;
/*
display: none;
*/
}
.subdivider {
border-bottom: 1px solid #225;
padding: 5px 0px 0px 0px;
}
.freetext {
width: 150px;
height: 24px;
border: 1px solid #44d;
padding: 2px;
margin: 4px 0 2px 0px;
font: 10pt "Lucida Console", "DejaVu Sans Mono", Courier, mono;
font-weight: bold;
background: #ddf;
color: #001;
-moz-border-radius: 0 4px 4px 0;
-khtml-border-radius: 0 4px 4px 0;
border-radius: 0 4px 4px 0;
/*
-moz-box-shadow: inset 0px -1px 1px 0px #fff;
*/
}
.control, control:link, control:visited {
margin: 4px 0 0 4px !important;
padding: 2px;
overflow: hidden;
min-width: 60px;
font-weight: bold;
background: #ffe;
color: #001;
border: 1px outset #ddddc0;
text-align: center;
white-space: nowrap;
-moz-border-radius: 4px;
-khtml-border-radius: 4px;
border-radius: 4px;
margin-top: 8px;
text-decoration: none;
}
/*
.control:active {
border: 1px inset;
background-color: #003;
color: #f60;
text-decoration: none;
}
*/
.control:hover, control:visited:hover {
border: 1px solid #eef;
background-color: #f60;
color: #fff !important;
text-decoration: none;
}
.control:link, control:visited {
margin: 4px 0 0 4px !important;
padding: 2px;
overflow: hidden;
min-width: 60px;
font-weight: bold;
color: #001;
border: 1px outset #ddddc0;
text-align: center;
white-space: nowrap;
-moz-border-radius: 4px;
-khtml-border-radius: 4px;
border-radius: 4px;
margin-top: 8px;
background: #ffe url(images/header.png) center center repeat:x !important;
text-decoration: none;
}
.panel {
width: 800px;
margin: 16px auto 16px auto;
overflow: hidden;
text-align: left !important;
font-size: 7pt;
background-color: #fff;
background: url(images/magic.png);
-moz-border-radius: 4px;
-khtml-border-radius: 4px;
border-radius: 4px;
border: 1px solid #002;
padding: 10px 20px;
-moz-box-shadow: inset 0px 0px 1px 0px #002;
background: none repeat scroll 0 0 #EEEEFF;
background: #fff url(images/magic.png);
border: 1px solid #444477;
color: #000011;
}
.panel .footer {
float: right;
padding: 4px;
}
.toolbox {
float: right;
}
.rowItem {
width: 750px;
float: left;
margin: 0px;
}
.comment {
font-weight: bold;
display: block;
padding: 2px 10px 0 20px;
text-align: left;
}
.text {
height: 24px;
width: 150px;
padding: 0 0 0 2px;
float: left;
margin: 0;
font-size: 9pt !important;
font-weight: bold;
}
.accessKey {
text-decoration: underline;
}
#globalOperationsPanel {
background-color: #fff;
border: 1px solid #003;
padding: 5px 20px 11px 10px;
-moz-box-shadow: inset 0px 0px 0px 1px #f00;
-moz-box-shadow: inset 0px 0px 1px 0px #f60;
background: #fff url(images/magic.png);
border: 1px solid #444477;
color: #613;
}
#globalOperationsPanel .control {
min-width: 120px;
}
#globalOperationsPanel .control:link {
min-width: 120px;
}
globalOperationsPanel .control:link {
min-width: 120px;
margin: 4px 0 0 4px !important;
padding: 2px;
overflow: hidden;
font-weight: bold;
background-color: #bbbbff;
color: black;
border: 1px outset #ddddc0;
text-align: center;
white-space: nowrap;
-moz-border-radius: 4px;
-khtml-border-radius: 4px;
border-radius: 4px;
margin-top: 8px;
background: #ffe url(images/header.png) 0 0 repeat: x !important;
}
globalOperationsPanel .control:visited {
min-width: 120px;
margin: 4px 0 0 4px !important;
padding: 2px;
overflow: hidden;
font-weight: bold;
background-color: #ffe;
color: black;
border: 1px outset #ddddc0;
text-align: center;
white-space: nowrap;
-moz-border-radius: 4px;
-khtml-border-radius: 4px;
border-radius: 4px;
margin-top: 8px;
background: url(images/header.png) 0 0 repeat: x !important;
}
globalOperationsPanel .control:hover {
min-width: 120px;
margin: 4px 0 0 4px !important;
padding: 2px;
overflow: hidden;
font-weight: bold;
background-color: #003;
color: #f60;
border: 1px outset #fff;
text-align: center;
white-space: nowrap;
-moz-border-radius: 4px;
-khtml-border-radius: 4px;
border-radius: 4px;
margin-top: 8px;
background: url(images/header_on.png) 0 0 repeat: x !important;
}
.header {
-moz-border-radius: 4px;
-khtml-border-radius: 4px;
border-radius: 4px;
}
select {
background-color: #eef;
color: #001;
margin: 4px;
font-family: "Lucida Sans Unicode", Verdana, Tahoma, Helvetica, sans-serif;
font-weight: bold;
border: 1px solid #001;
padding: 2px;
min-width: 270px;
font-size: 8pt;
max-height: 24px;
}
a:link{
color: #613;
text-decoration: none;
font-weight: bold;
word-wrap: break-word;
}
a:visited{
color: #606;
text-decoration: none;
font-weight: bold;
}
a:hover{
color: #f60;
text-decoration: underline;
font-weight: bold;
}
a:active{
color: #f93;
text-decoration: underline;
font-weight: bold;
}
/* I2P Tunnel Manager Theme: Light */
/* Description: Light blue highlights. */
/* Author: dr|z3d */
body {
margin: 0px;
padding: 0px;
text-align: center;
font-family: "Lucida Sans Unicode", Verdana, Helvetica, sans-serif;
background: #eef url('images/snowcamo.png');
color: #001;
font-size: 10pt;
/* we've avoided Tantek Hacks so far,
** but we can't avoid using the non-w3c method of
** box rendering. (and therefore one of mozilla's
** proprietry -moz properties (which hopefully they'll
** drop soon).
*/
-moz-box-sizing: border-box;
box-sizing: border-box;
background: #99f url(images/magic.png);
}
div {
-moz-box-sizing: border-box;
box-sizing: border-box;
}
label {
margin: 0px 4px;
padding: 1px 10px 2px 0px;
float: left;
width: 120px;
height: 24px;
font-weight: normal;
text-align: right;
font-size: 8pt;
font-style: italic;
-moz-box-sizing: border-box;
box-sizing: border-box;
line-height: 120%;
color: #101;
}
h4 {
font-size: 11pt;
font-weight: bold !important;
color: #001;
text-align: center;
border: 1px solid #225;
margin: 5px 0 15px 0;
padding: 5px 10px;
background: #eef url(images/header.png) repeat-x center center;
text-transform: uppercase;
letter-spacing: 0.07em;
-moz-border-radius: 4px;
-khtml-border-radius: 4px;
border-radius: 4px;
text-shadow: 0px 1px 1px #77f;
-moz-box-shadow: 0 2px 1px 1px rgba(176, 176, 216, 0.4);
-khtml-box-shadow: 0 2px 1px 1px rgba(176, 176, 216, 0.4);
box-shadow: 0 2px 1px 1px rgba(176, 176, 216, 0.4);
}
a {
text-decoration: none;
}
form {
margin: 0px;
}
textarea, input, select, button, a {
-moz-box-sizing: border-box;
box-sizing: border-box;
font-size: 9pt;
float: left;
vertical-align: middle;
}
button {
float: none;
text-decoration: none;
}
textarea {
color: #003;
background: #fff;
border: 1px solid #447;
-moz-border-radius: 4px;
-khtml-border-radius: 4px;
border-radius: 4px;
}
textarea:active {
-moz-box-shadow: inset 0px 0px 0px 1px #f60;
-khtml-box-shadow: inset 0px 0px 0px 1px #f60;
box-shadow: inset 0px 0px 0px 1px #f60;
}
br {
clear: left;
}
div.statusNotRunning {
float: left;
width: 68px;
height: 24px;
overflow: hidden;
color: #d00;
background: url('images/console_status_stopped.png') 0 0 no-repeat;
padding-top: 24px;
margin-top: 4px;
}
div.statusRunning {
float: left;
width: 68px;
height: 24px;
overflow: hidden;
color: #0b0;
background: url('images/console_status_running.png') 0 0 no-repeat;
padding-top: 24px;
margin-top: 4px;
}
div.statusStarting {
float: left;
width: 68px;
height: 24px;
overflow: hidden;
color: #339933;
background: url('images/console_status_starting.png') 0 0 no-repeat;
padding-top: 24px;
margin-top: 4px;
}
hr {
display: none;
}
.separator, .subdivider {
clear: both;
height: 1px;
margin: 10px 0px 10px 0px;
border-bottom: 1px dotted #447;
/*
display: none;
*/
}
.subdivider {
border-bottom: 1px dotted #447;
padding: 5px 0;
}
.freetext {
width: 150px;
height: 24px;
border: 1px solid #447;
padding: 2px;
margin: 4px 0 2px 0px;
font: 10pt "Lucida Console", "DejaVu Sans Mono", Courier, mono;
font-weight: bold;
background: #fff;
color: #003;
-moz-border-radius: 4px;
-khtml-border-radius: 4px;
border-radius: 4px;
/*
-moz-box-shadow: inset 0px -1px 1px 0px #fff;
*/
}
.freetext:active {
-moz-box-shadow: inset 0px 0px 0px 1px #f60;
-khtml-box-shadow: inset 0px 0px 0px 1px #f60;
box-shadow: inset 0px 0px 0px 1px #f60;
}
.control, control:link, control:visited {
margin: 4px 0 0 4px !important;
padding: 2px;
overflow: hidden;
min-width: 60px;
font-weight: bold;
background: #ffe;
color: #001;
border: 1px outset #66a;
text-align: center;
white-space: nowrap;
-moz-border-radius: 4px;
-khtml-border-radius: 4px;
border-radius: 4px;
margin-top: 8px;
text-decoration: none;
}
/*
.control:active {
border: 1px inset;
background-color: #003;
color: #f60;
text-decoration: none;
}
*/
.control:hover, control:visited:hover {
background-color: #f60;
color: #fff !important;
text-decoration: none;
border: 1px solid #f60 !important;
background: #f60 !important;
color: #fff;
-moz-box-shadow: inset 0px 0px 0px 1px #fff !important;
-khtml-box-shadow: inset 0px 0px 0px 1px #fff !important;
box-shadow: inset 0px 0px 0px 1px #fff !important;
}
.control:link, control:visited {
margin: 4px 0 0 4px !important;
padding: 2px;
overflow: hidden;
min-width: 60px;
font-weight: bold;
color: #001;
border: 1px outset #66a;
text-align: center;
white-space: nowrap;
-moz-border-radius: 4px;
-khtml-border-radius: 4px;
border-radius: 4px;
margin-top: 8px;
background: #ffe url(images/header.png) center center repeat:x !important;
text-decoration: none;
}
.panel {
width: 800px;
margin: 16px auto 16px auto;
overflow: hidden;
text-align: left !important;
font-size: 7pt;
background-color: #fff;
background: url(images/magic.png);
-moz-border-radius: 4px;
-khtml-border-radius: 4px;
border-radius: 4px;
border: 1px solid #002;
padding: 10px 20px;
-moz-box-shadow: inset 0px 0px 1px 0px #002;
background: none repeat scroll 0 0 #EEEEFF;
background: #fff url(images/magic.png);
border: 1px solid #444477;
color: #000011;
}
.panel .footer {
float: right;
padding: 4px;
}
.toolbox {
float: right;
}
.rowItem {
width: 750px;
float: left;
margin: 2px 0;
}
.comment {
font-weight: bold;
display: block;
padding: 2px 10px 0 20px;
text-align: left;
}
.text {
height: 24px;
width: 150px;
padding: 0 0 0 2px;
float: left;
margin: 0;
font-size: 9pt !important;
font-weight: bold;
}
.accessKey {
text-decoration: underline;
}
#globalOperationsPanel {
background-color: #fff;
border: 1px solid #003;
padding: 5px 20px 11px 10px;
-moz-box-shadow: inset 0px 0px 0px 1px #f00;
-moz-box-shadow: inset 0px 0px 1px 0px #f60;
background: #fff url(images/magic.png);
border: 1px solid #444477;
color: #613;
}
#globalOperationsPanel .control {
min-width: 120px;
}
#globalOperationsPanel .control:link {
min-width: 120px;
}
globalOperationsPanel .control:link {
min-width: 120px;
margin: 4px 0 0 4px !important;
padding: 2px;
overflow: hidden;
font-weight: bold;
background-color: #bbbbff;
color: black;
border: 1px outset #ddddc0;
text-align: center;
white-space: nowrap;
-moz-border-radius: 4px;
-khtml-border-radius: 4px;
border-radius: 4px;
margin-top: 8px;
background: #ffe url(images/header.png) 0 0 repeat: x !important;
}
globalOperationsPanel .control:visited {
min-width: 120px;
margin: 4px 0 0 4px !important;
padding: 2px;
overflow: hidden;
font-weight: bold;
background-color: #ffe;
color: black;
border: 1px outset #ddddc0;
text-align: center;
white-space: nowrap;
-moz-border-radius: 4px;
-khtml-border-radius: 4px;
border-radius: 4px;
margin-top: 8px;
background: url(images/header.png) 0 0 repeat: x !important;
}
globalOperationsPanel .control:hover {
min-width: 120px;
margin: 4px 0 0 4px !important;
padding: 2px;
overflow: hidden;
font-weight: bold;
background-color: #003;
color: #f60;
border: 1px outset #fff;
text-align: center;
white-space: nowrap;
-moz-border-radius: 4px;
-khtml-border-radius: 4px;
border-radius: 4px;
margin-top: 8px;
background: url(images/header_on.png) 0 0 repeat: x !important;
}
.header {
-moz-border-radius: 4px;
-khtml-border-radius: 4px;
border-radius: 4px;
}
select {
background-color: #fff;
color: #003;
margin: 4px;
font-family: "Lucida Sans Unicode", Verdana, Tahoma, Helvetica, sans-serif;
font-weight: bold;
border: 1px solid #447;
padding: 3px 3px 3px 0;
min-width: 270px;
font-size: 8pt;
max-height: 24px;
-moz-border-radius: 4px;
-khtml-border-radius: 4px;
border-radius: 4px;
}
select:active {
-moz-box-shadow: inset 0px 0px 0px 1px #f60;
-khtml-box-shadow: inset 0px 0px 0px 1px #f60;
box-shadow: inset 0px 0px 0px 1px #f60;
}
a:link{
color: #359;
text-decoration: none;
font-weight: bold;
word-wrap: break-word;
}
a:visited{
color: #218;
text-decoration: none;
font-weight: bold;
}
a:hover{
color: #f60;
text-decoration: underline;
font-weight: bold;
}
a:active{
color: #f93;
text-decoration: underline;
font-weight: bold;
}

View File

@@ -329,7 +329,7 @@ div.main {
border-top: 0;
text-align: left;
color: #eef;
min-width: 570px;
min-width: 590px;
/* -moz-border-radius: 0 0 3px 3px;
-khtml-border-radius: 0 0 3px 3px;
border-radius: 0 0 3px 3px;*/
@@ -432,13 +432,27 @@ div.news li {
}
div.news h3 {
text-align: left !important;
background: none !important;
text-align: left;
border: none !important;
padding-left: 0;
padding-top: 0px;
border-bottom: 1px dotted !important;
-moz-box-shadow: none;
-hktml-box-shadow: none;
box-shadow: none;
font-size: 10pt !important;
letter-spacing: 0.05em;
text-transform: uppercase !important;
margin: 15px 10px -5px;
padding: 5px 0 5px;
}
div.news p {
color: #eef;
font-size: 9pt;
margin-bottom: -10px;
margin-top: 10px;
}
/*
div.news p:first-child {
@@ -755,7 +769,7 @@ input {
vertical-align: middle;
}
input[type=text], input[type=password] {
input[type=text] {
margin: 3px 5px 3px 5px;
vertical-align: middle;
}
@@ -765,7 +779,7 @@ select {
vertical-align: middle;
}
input[type=text], input[type=password] select {
input[type=text], select {
background: #001;
color: #eef;
border: 1px solid #99f;
@@ -964,4 +978,4 @@ div.footnote hr{
margin-top: -5px;
margin-bottom: -10px;
margin-right: 5px;
}
}

View File

@@ -20,6 +20,7 @@ import net.i2p.data.DataHelper;
import net.i2p.data.DataStructureImpl;
import net.i2p.data.Hash;
import net.i2p.util.Log;
import net.i2p.util.SimpleByteCache;
/**
* Defines the base message implementation.
@@ -72,6 +73,7 @@ public abstract class I2NPMessageImpl extends DataStructureImpl implements I2NPM
* Read the header, then read the rest into buffer, then call
* readMessage in the implemented message type
*
*<pre>
* Specifically:
* 1 byte type (if caller didn't read already, as specified by the type param
* 4 byte ID
@@ -79,9 +81,11 @@ public abstract class I2NPMessageImpl extends DataStructureImpl implements I2NPM
* 2 byte size
* 1 byte checksum
* size bytes of payload (read by readMessage() in implementation)
*</pre>
*
* @param type the message type or -1 if we should read it here
* @param buffer temp buffer to use
* @return total length of the message
*/
public int readBytes(InputStream in, int type, byte buffer[]) throws I2NPMessageException, IOException {
try {
@@ -110,9 +114,11 @@ public abstract class I2NPMessageImpl extends DataStructureImpl implements I2NPM
cur += numRead;
}
Hash calc = _context.sha().calculateHash(buffer, 0, size);
byte[] calc = SimpleByteCache.acquire(Hash.HASH_LENGTH);
_context.sha().calculateHash(buffer, 0, size, calc, 0);
//boolean eq = calc.equals(h);
boolean eq = DataHelper.eq(checksum, 0, calc.getData(), 0, CHECKSUM_LENGTH);
boolean eq = DataHelper.eq(checksum, 0, calc, 0, CHECKSUM_LENGTH);
SimpleByteCache.release(calc);
if (!eq)
throw new I2NPMessageException("Hash does not match for " + getClass().getName());
@@ -123,11 +129,29 @@ public abstract class I2NPMessageImpl extends DataStructureImpl implements I2NPM
//long time = _context.clock().now() - start;
//if (time > 50)
// _context.statManager().addRateData("i2np.readTime", time, time);
return size + Hash.HASH_LENGTH + 1 + 4 + DataHelper.DATE_LENGTH;
return CHECKSUM_LENGTH + 1 + 2 + 4 + DataHelper.DATE_LENGTH + size;
} catch (DataFormatException dfe) {
throw new I2NPMessageException("Error reading the message header", dfe);
}
}
/**
* Read the header, then read the rest into buffer, then call
* readMessage in the implemented message type
*
*<pre>
* Specifically:
* 1 byte type (if caller didn't read already, as specified by the type param
* 4 byte ID
* 8 byte expiration
* 2 byte size
* 1 byte checksum
* size bytes of payload (read by readMessage() in implementation)
*</pre>
*
* @param type the message type or -1 if we should read it here
* @return total length of the message
*/
public int readBytes(byte data[], int type, int offset) throws I2NPMessageException, IOException {
int cur = offset;
if (type < 0) {
@@ -153,9 +177,10 @@ public abstract class I2NPMessageImpl extends DataStructureImpl implements I2NPM
+ " cur=" + cur
+ " wanted=" + size + "]: " + getClass().getName());
Hash calc = _context.sha().calculateHash(data, cur, size);
//boolean eq = calc.equals(h);
boolean eq = DataHelper.eq(hdata, 0, calc.getData(), 0, CHECKSUM_LENGTH);
byte[] calc = SimpleByteCache.acquire(Hash.HASH_LENGTH);
_context.sha().calculateHash(data, cur, size, calc, 0);
boolean eq = DataHelper.eq(hdata, 0, calc, 0, CHECKSUM_LENGTH);
SimpleByteCache.release(calc);
if (!eq)
throw new I2NPMessageException("Hash does not match for " + getClass().getName());
@@ -231,7 +256,8 @@ public abstract class I2NPMessageImpl extends DataStructureImpl implements I2NPM
try {
int writtenLen = writeMessageBody(buffer, prefixLen);
int payloadLen = writtenLen - prefixLen;
Hash h = _context.sha().calculateHash(buffer, prefixLen, payloadLen);
byte[] h = SimpleByteCache.acquire(Hash.HASH_LENGTH);
_context.sha().calculateHash(buffer, prefixLen, payloadLen, h, 0);
int off = 0;
DataHelper.toLong(buffer, off, 1, getType());
@@ -242,7 +268,8 @@ public abstract class I2NPMessageImpl extends DataStructureImpl implements I2NPM
off += DataHelper.DATE_LENGTH;
DataHelper.toLong(buffer, off, 2, payloadLen);
off += 2;
System.arraycopy(h.getData(), 0, buffer, off, CHECKSUM_LENGTH);
System.arraycopy(h, 0, buffer, off, CHECKSUM_LENGTH);
SimpleByteCache.release(h);
//long time = _context.clock().now() - start;
//if (time > 50)

View File

@@ -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 = 8;
public final static long BUILD = 10;
/** for example "-test" */
public final static String EXTRA = "";

View File

@@ -15,6 +15,7 @@ import net.i2p.data.i2np.I2NPMessageHandler;
import net.i2p.router.RouterContext;
import net.i2p.util.ByteCache;
import net.i2p.util.Log;
import net.i2p.util.SimpleByteCache;
import net.i2p.util.SimpleTimer;
/**
@@ -241,19 +242,21 @@ public class FragmentHandler {
if (_log.shouldLog(Log.DEBUG))
_log.debug("endpoint IV: " + Base64.encode(preV, validLength - HopProcessor.IV_LENGTH, HopProcessor.IV_LENGTH));
Hash v = _context.sha().calculateHash(preV, 0, validLength);
byte[] v = SimpleByteCache.acquire(Hash.HASH_LENGTH);
_context.sha().calculateHash(preV, 0, validLength, v, 0);
_validateCache.release(ba);
boolean eq = DataHelper.eq(v.getData(), 0, preprocessed, offset + HopProcessor.IV_LENGTH, 4);
boolean eq = DataHelper.eq(v, 0, preprocessed, offset + HopProcessor.IV_LENGTH, 4);
if (!eq) {
if (_log.shouldLog(Log.WARN)) {
_log.warn("Corrupt tunnel message - verification fails: " + Base64.encode(preprocessed, offset+HopProcessor.IV_LENGTH, 4)
+ " != " + Base64.encode(v.getData(), 0, 4));
+ " != " + Base64.encode(v, 0, 4));
_log.warn("No matching endpoint: # pad bytes: " + (paddingEnd-(HopProcessor.IV_LENGTH+4)-1)
+ " offset=" + offset + " length=" + length + " paddingEnd=" + paddingEnd + ' '
+ Base64.encode(preprocessed, offset, length), new Exception("trace"));
}
}
SimpleByteCache.release(v);
if (eq) {
int excessPadding = paddingEnd - (HopProcessor.IV_LENGTH + 4 + 1);