@Override protected LeaseSet locked_buildNewLeaseSet() { LeaseSet ls = _context.netDb().lookupLeaseSetLocally(_aliasOf.getSettings().getDestination()); if (ls == null) return null; // copy everything so it isn't corrupted LeaseSet rv = new LeaseSet(); for (int i = 0; i < ls.getLeaseCount(); i++) { Lease old = ls.getLease(i); Lease lease = new Lease(); lease.setEndDate(old.getEndDate()); lease.setTunnelId(old.getTunnelId()); lease.setGateway(old.getGateway()); rv.addLease(lease); } return rv; }
@Override public boolean equals(Object object) { if (object == this) return true; if ((object == null) || !(object instanceof LeaseSet)) return false; LeaseSet ls = (LeaseSet) object; return DataHelper.eq(_signature, ls.getSignature()) && DataHelper.eq(_leases, ls._leases) && DataHelper.eq(getEncryptionKey(), ls.getEncryptionKey()) && DataHelper.eq(_signingKey, ls.getSigningKey()) && DataHelper.eq(_destination, ls.getDestination()); }
@Override public String toString() { StringBuilder buf = new StringBuilder(128); buf.append("[LeaseSet: "); buf.append("\n\tDestination: ").append(_destination); buf.append("\n\tEncryptionKey: ").append(_encryptionKey); buf.append("\n\tSigningKey: ").append(_signingKey); //buf.append("\n\tVersion: ").append(getVersion()); buf.append("\n\tSignature: ").append(_signature); buf.append("\n\tLeases: #").append(getLeaseCount()); for (int i = 0; i < getLeaseCount(); i++) buf.append("\n\t\t").append(getLease(i)); buf.append("]"); return buf.toString(); }
try { rv = (LeaseSet)_ds.get(key); if ( (rv != null) && (rv.equals(leaseSet)) ) { if (rv != null && !leaseSet.getDestination().equals(rv.getDestination())) throw new IllegalArgumentException("LS Hash collision");
int leases = set.getLeaseCount(); current = sp.currentLeaseSet; if (current != null && current.getLeaseCount() == leases && current.getType() != DatabaseEntry.KEY_TYPE_META_LS2) { for (int i = 0; i < leases; i++) { if (! current.getLease(i).getTunnelId().equals(set.getLease(i).getTunnelId())) break; if (! current.getLease(i).getGateway().equals(set.getLease(i).getGateway())) break; if (i == leases - 1) { LeaseSet requested = state.getRequested(); LeaseSet granted = state.getGranted(); long ours = set.getEarliestLeaseDate(); if ( ( (requested != null) && (requested.getEarliestLeaseDate() > ours) ) || ( (granted != null) && (granted.getEarliestLeaseDate() > ours) ) ) { } else { set.setDestination(dest); Rerequest timer = new Rerequest(set, expirationTime, onCreateJob, onFailedJob); sp.rerequestTimer = timer; set.setDestination(dest); if (current == null && _context.tunnelManager().getOutboundClientTunnelCount(h) <= 0) {
public DataStructure createDataStructure() throws DataFormatException { LeaseSet leaseSet = new LeaseSet(); leaseSet.setDestination((Destination)(new DestinationTest()).createDataStructure()); leaseSet.setEncryptionKey((PublicKey)(new PublicKeyTest()).createDataStructure()); leaseSet.setSignature((Signature)(new SignatureTest()).createDataStructure()); leaseSet.setSigningKey((SigningPublicKey)(new SigningPublicKeyTest()).createDataStructure()); //leaseSet.setVersion(42l); return leaseSet; } public DataStructure createStructureToRead() { return new LeaseSet(); }
int lsType = _leaseSet.getType(); return MessageStatusMessage.STATUS_SEND_FAILURE_BAD_LEASESET; PublicKey pk = _leaseSet.getEncryptionKey(); if (pk == null) return MessageStatusMessage.STATUS_SEND_FAILURE_BAD_LEASESET; for (int i = 0; i < _leaseSet.getLeaseCount(); i++) { Lease lease = _leaseSet.getLease(i); List<Lease> leases = new ArrayList<Lease>(_leaseSet.getLeaseCount()); for (int i = 0; i < _leaseSet.getLeaseCount(); i++) { Lease lease = _leaseSet.getLease(i); if (!lease.isExpired(Router.CLOCK_FUDGE_FACTOR / 4)) leases.add(lease); for (int i = 0; i < _leaseSet.getLeaseCount(); i++) { Lease lease = _leaseSet.getLease(i); if (!lease.isExpired(Router.CLOCK_FUDGE_FACTOR)) leases.add(lease);
long endTime = requested.getEarliestLeaseDate(); SessionId id = _runner.getSessionId(requested.getDestination().calculateHash()); if (id == null) { _runner.failLeaseRequest(_requestState); for (int i = 0; i < requested.getLeaseCount(); i++) { Lease lease = requested.getLease(i); if (lease.getEndDate().getTime() < endTime) { rmsg.setEndDate(end); rmsg.setSessionId(id); for (int i = 0; i < requested.getLeaseCount(); i++) { Lease lease = requested.getLease(i); rmsg.addEndpoint(lease.getGateway(), lease.getTunnelId());
Destination dest = session.getMyDestination(); leaseSet.setDestination(dest); leaseSet.setEncryptionKey(li.getPublicKey()); leaseSet.setSigningKey(li.getSigningPublicKey()); try { key.fromBase64(sk); leaseSet.encrypt(key); _context.keyRing().put(h, key); } catch (DataFormatException dfe) { leaseSet.sign(session.getPrivateKey());
if (!key.equals(leaseSet.getDestination().calculateHash())) { if (_log.shouldLog(Log.WARN)) _log.warn("Invalid store attempt! key does not match leaseSet.destination! key = " if (!leaseSet.verifySignature()) { long earliest = leaseSet.getEarliestLeaseDate(); long latest = leaseSet.getLatestLeaseDate(); long now = _context.clock().now(); if (earliest <= now - 10*60*1000L || if (_log.shouldLog(Log.WARN)) _log.warn("Old leaseSet! not storing it: " + leaseSet.getDestination().toBase32() + " first exp. " + new Date(earliest) + " last exp. " + new Date(latest), new Exception("Rejecting store")); return "Expired leaseSet for " + leaseSet.getDestination().toBase32() + " expired " + DataHelper.formatDuration(age) + " ago"; (leaseSet.getType() != DatabaseEntry.KEY_TYPE_META_LS2 || latest > now + (Router.CLOCK_FUDGE_FACTOR + MAX_META_LEASE_FUTURE))) { long age = latest - now; + leaseSet.getDestination().toBase32() + " expires " + DataHelper.formatDuration(age) + " from now"); return "Future expiring leaseSet for " + leaseSet.getDestination().toBase32() + " expiring in " + DataHelper.formatDuration(age);
int type = in.read(); if (type == DatabaseEntry.KEY_TYPE_LEASESET) { _leaseSet = new LeaseSet(); } else if (type == DatabaseEntry.KEY_TYPE_LS2) { _leaseSet = new LeaseSet2(); throw new I2CPMessageException("Unsupported Leaseset type: " + type); _leaseSet.readBytes(in); if (type != DatabaseEntry.KEY_TYPE_META_LS2) { SigType stype = _leaseSet.getSignature().getType(); if (stype == null) throw new I2CPMessageException("Unsupported sig type"); EncType etype = _leaseSet.getEncryptionKey().getType(); if (etype == null) throw new I2CPMessageException("Unsupported encryption type");
/** * @param lease must be a Lease2 * @throws IllegalArgumentException if not a Lease2 */ @Override public void addLease(Lease lease) { if (getType() == KEY_TYPE_LS2 && !(lease instanceof Lease2)) throw new IllegalArgumentException(); super.addLease(lease); _expires = _lastExpiration; }
if (!ls.getReceivedAsReply()) ls.setReceivedAsPublished(true); if (match == null) { wasNew = true; } else if (match.getEarliestLeaseDate() < ls.getEarliestLeaseDate()) { wasNew = true; if (match.getReceivedAsPublished()) ls.setReceivedAsPublished(true); } else { wasNew = false;
return; int type = ls.getType(); if (type != DatabaseEntry.KEY_TYPE_META_LS2 && (message.getPrivateKey() == null || message.getSigningPrivateKey() == null)) { Destination ndest = ls.getDestination(); if (!dest.equals(ndest)) { if (_log.shouldLog(Log.ERROR)) return; if (!pk.equals(ls.getEncryptionKey())) { if (_log.shouldLog(Log.ERROR)) _log.error("Private/public crypto key mismatch in LS");
if (old != null) { LeaseSet ols = (LeaseSet)old; if (ls.getEarliestLeaseDate() < ols.getEarliestLeaseDate()) { if (_log.shouldLog(Log.INFO)) _log.info("Almost clobbered an old leaseSet! " + key + ": [old expires " + new Date(ols.getEarliestLeaseDate()) + " new on " + new Date(ls.getEarliestLeaseDate()) + ']'); } else if (ls.getEarliestLeaseDate() == ols.getEarliestLeaseDate()) { if (_log.shouldLog(Log.INFO)) _log.info("Duplicate " + key); } else { if (_log.shouldLog(Log.INFO)) { _log.info("Updated old leaseSet " + key + ": [old expires " + new Date(ols.getEarliestLeaseDate()) + " new on " + new Date(ls.getEarliestLeaseDate()) + ']'); if (_log.shouldLog(Log.DEBUG)) _log.debug("RAP? " + ls.getReceivedAsPublished() + " RAR? " + ls.getReceivedAsReply()); _log.info("New leaseset for " + key + ": expires " + new Date(ls.getEarliestLeaseDate())); if (_log.shouldLog(Log.DEBUG)) _log.debug("RAP? " + ls.getReceivedAsPublished() + " RAR? " + ls.getReceivedAsReply());
@Override protected void doReadMessage(InputStream in, int size) throws I2CPMessageException, IOException { try { _sessionId = new SessionId(); _sessionId.readBytes(in); // Revocation is unimplemented. // As the SPK comes before the LeaseSet, we don't know the key type. // We could have some sort of callback or state setting so we get the // expected type from the session. But for now, we just assume it's 20 bytes. // Clients outside router context should throw in a dummy 20 bytes. _signingPrivateKey = new SigningPrivateKey(); _signingPrivateKey.readBytes(in); _privateKey = new PrivateKey(); _privateKey.readBytes(in); _leaseSet = new LeaseSet(); _leaseSet.readBytes(in); } catch (DataFormatException dfe) { throw new I2CPMessageException("Error reading the CreateLeaseSetMessage", dfe); } }
public DataStructure createStructureToRead() { return new LeaseSet(); }
return; if (_leaseSet != null && _leaseSet.getType() == DatabaseEntry.KEY_TYPE_META_LS2) { _log.debug(getJobId() + ": Send outbound client message - leaseSet found locally for " + _toString); if (!_leaseSet.isCurrent(Router.CLOCK_FUDGE_FACTOR / 4)) { long exp = now - _leaseSet.getLatestLeaseDate(); _log.warn(getJobId() + ": leaseSet expired " + DataHelper.formatDuration(exp) + " ago, firing search: " + _leaseSet.getHash().toBase32()); getContext().netDb().lookupLeaseSetRemotely(_leaseSet.getHash(), _from.calculateHash());