Search in sources :

Example 36 with PublicKey

use of net.i2p.data.PublicKey in project i2p.i2p by i2p.

the class ClientMessageEventListener method handleCreateLeaseSet.

/**
 * override for testing
 */
protected void handleCreateLeaseSet(CreateLeaseSetMessage message) {
    if ((message.getLeaseSet() == null) || (message.getPrivateKey() == null) || (message.getSigningPrivateKey() == null)) {
        if (_log.shouldLog(Log.ERROR))
            _log.error("Null lease set granted: " + message);
        _runner.disconnectClient("Invalid CreateLeaseSetMessage");
        return;
    }
    SessionId id = message.getSessionId();
    SessionConfig cfg = _runner.getConfig(id);
    if (cfg == null) {
        List<SessionId> current = _runner.getSessionIds();
        String msg = "CreateLeaseSet invalid session: " + id + " current: " + current;
        if (_log.shouldLog(Log.ERROR))
            _log.error(msg);
        _runner.disconnectClient(msg);
        return;
    }
    Destination dest = cfg.getDestination();
    Destination ndest = message.getLeaseSet().getDestination();
    if (!dest.equals(ndest)) {
        if (_log.shouldLog(Log.ERROR))
            _log.error("Different destination in LS");
        _runner.disconnectClient("Different destination in LS");
        return;
    }
    LeaseSetKeys keys = _context.keyManager().getKeys(dest);
    if (keys == null || !message.getPrivateKey().equals(keys.getDecryptionKey())) {
        // Verify and register crypto keys if new or if changed
        // Private crypto key should never change, and if it does,
        // one of the checks below will fail
        PublicKey pk;
        try {
            pk = message.getPrivateKey().toPublic();
        } catch (IllegalArgumentException iae) {
            if (_log.shouldLog(Log.ERROR))
                _log.error("Bad private key in LS");
            _runner.disconnectClient("Bad private key in LS");
            return;
        }
        if (!pk.equals(message.getLeaseSet().getEncryptionKey())) {
            if (_log.shouldLog(Log.ERROR))
                _log.error("Private/public crypto key mismatch in LS");
            _runner.disconnectClient("Private/public crypto key mismatch in LS");
            return;
        }
        // just register new SPK, don't verify, unused
        _context.keyManager().registerKeys(dest, message.getSigningPrivateKey(), message.getPrivateKey());
    } else if (!message.getSigningPrivateKey().equals(keys.getRevocationKey())) {
        // just register new SPK, don't verify, unused
        _context.keyManager().registerKeys(dest, message.getSigningPrivateKey(), message.getPrivateKey());
    }
    try {
        _context.netDb().publish(message.getLeaseSet());
    } catch (IllegalArgumentException iae) {
        if (_log.shouldLog(Log.ERROR))
            _log.error("Invalid leaseset from client", iae);
        _runner.disconnectClient("Invalid leaseset: " + iae);
        return;
    }
    if (_log.shouldLog(Log.INFO))
        _log.info("New lease set granted for destination " + dest);
    // leaseSetCreated takes care of all the LeaseRequestState stuff (including firing any jobs)
    _runner.leaseSetCreated(message.getLeaseSet());
}
Also used : Destination(net.i2p.data.Destination) PublicKey(net.i2p.data.PublicKey) SessionConfig(net.i2p.data.i2cp.SessionConfig) LeaseSetKeys(net.i2p.router.LeaseSetKeys) SessionId(net.i2p.data.i2cp.SessionId)

Aggregations

PublicKey (net.i2p.data.PublicKey)36 PrivateKey (net.i2p.data.PrivateKey)23 SessionKey (net.i2p.data.SessionKey)14 SigningPublicKey (net.i2p.data.SigningPublicKey)13 DataFormatException (net.i2p.data.DataFormatException)8 SigningPrivateKey (net.i2p.data.SigningPrivateKey)8 HashSet (java.util.HashSet)7 SessionKeyManager (net.i2p.crypto.SessionKeyManager)7 SessionTag (net.i2p.data.SessionTag)7 IOException (java.io.IOException)6 SimpleDataStructure (net.i2p.data.SimpleDataStructure)6 Certificate (net.i2p.data.Certificate)5 Hash (net.i2p.data.Hash)5 ByteArrayOutputStream (java.io.ByteArrayOutputStream)4 GeneralSecurityException (java.security.GeneralSecurityException)4 SigType (net.i2p.crypto.SigType)4 TagSetHandle (net.i2p.crypto.TagSetHandle)4 CertificateTest (net.i2p.data.CertificateTest)4 PublicKeyTest (net.i2p.data.PublicKeyTest)4 SigningPublicKeyTest (net.i2p.data.SigningPublicKeyTest)4