Changeset ed4fe56


Ignore:
Timestamp:
Aug 26, 2014 7:14:51 PM (6 years ago)
Author:
zzz <zzz@…>
Branches:
master
Children:
176c106
Parents:
51f9d6d
Message:

I2CP:

  • Verify crypto key pair in LS
  • Verfiy same dest as before in LS

Router: Don't try to use an unavailable sig type for the router,

even if it's the default

RouterInfo?: Work around unsupported raw signatures for

RI Ed25519 sig type

Files:
6 edited

Legend:

Unmodified
Added
Removed
  • apps/i2ptunnel/java/src/net/i2p/i2ptunnel/web/EditBean.java

    r51f9d6d red4fe56  
    189189    /** @since 0.9.12 */
    190190    public boolean isSigTypeAvailable(int code) {
    191         SigType type = SigType.getByCode(code);
    192         return type != null && type.isAvailable();
     191        return SigType.isAvailable(code);
    193192    }
    194193   
  • core/java/src/net/i2p/data/PrivateKey.java

    r51f9d6d red4fe56  
    5151     * of this PrivateKey
    5252     * @return a PublicKey object
     53     * @throws IllegalArgumentException on bad key
    5354     */
    5455    public PublicKey toPublic() {
  • router/java/src/net/i2p/data/router/RouterInfo.java

    r51f9d6d red4fe56  
    3131import net.i2p.crypto.SHA1Hash;
    3232import net.i2p.crypto.SHA256Generator;
     33import net.i2p.crypto.SigType;
    3334import net.i2p.data.DatabaseEntry;
    3435import net.i2p.data.DataFormatException;
     
    533534        MessageDigest digest;
    534535        if (verifySig) {
    535             digest = _identity.getSigningPublicKey().getType().getDigestInstance();
    536             // TODO any better way?
    537             digest.update(_identity.toByteArray());
    538             din = new DigestInputStream(in, digest);
     536            SigType type = _identity.getSigningPublicKey().getType();
     537            if (type != SigType.EdDSA_SHA512_Ed25519) {
     538                // This won't work for EdDSA
     539                digest = _identity.getSigningPublicKey().getType().getDigestInstance();
     540                // TODO any better way?
     541                digest.update(_identity.toByteArray());
     542                din = new DigestInputStream(in, digest);
     543            } else {
     544                digest = null;
     545                din = in;
     546            }
    539547        } else {
    540548            digest = null;
     
    570578
    571579        if (verifySig) {
    572             SimpleDataStructure hash = _identity.getSigningPublicKey().getType().getHashInstance();
    573             hash.setData(digest.digest());
    574             _isValid = DSAEngine.getInstance().verifySignature(_signature, hash, _identity.getSigningPublicKey());
    575             _validated = true;
     580            SigType type = _identity.getSigningPublicKey().getType();
     581            if (type != SigType.EdDSA_SHA512_Ed25519) {
     582                // This won't work for EdDSA
     583                SimpleDataStructure hash = _identity.getSigningPublicKey().getType().getHashInstance();
     584                hash.setData(digest.digest());
     585                _isValid = DSAEngine.getInstance().verifySignature(_signature, hash, _identity.getSigningPublicKey());
     586                _validated = true;
     587            } else {
     588                doValidate();
     589            }
    576590            if (!_isValid) {
    577591                throw new DataFormatException("Bad sig");
  • router/java/src/net/i2p/router/LeaseSetKeys.java

    r51f9d6d red4fe56  
    4141     * Key with which a LeaseSet can be revoked (by republishing it with no Leases)
    4242     *
    43      * @deprecated unused
     43     * Deprecated, unused
    4444     */
    4545    public SigningPrivateKey getRevocationKey() { return _revocationKey; }
  • router/java/src/net/i2p/router/client/ClientMessageEventListener.java

    r51f9d6d red4fe56  
    1313import net.i2p.CoreVersion;
    1414import net.i2p.crypto.SigType;
     15import net.i2p.data.Destination;
    1516import net.i2p.data.Hash;
    1617import net.i2p.data.Payload;
     
    3839import net.i2p.data.i2cp.SetDateMessage;
    3940import net.i2p.router.ClientTunnelSettings;
     41import net.i2p.router.LeaseSetKeys;
    4042import net.i2p.router.RouterContext;
    4143import net.i2p.util.Log;
     
    368370            return;
    369371        }
    370 
    371         _context.keyManager().registerKeys(message.getLeaseSet().getDestination(), message.getSigningPrivateKey(), message.getPrivateKey());
     372        Destination dest = _runner.getConfig().getDestination();
     373        Destination ndest = message.getLeaseSet().getDestination();
     374        if (!dest.equals(ndest)) {
     375            if (_log.shouldLog(Log.ERROR))
     376                _log.error("Different destination in LS");
     377            _runner.disconnectClient("Different destination in LS");
     378            return;
     379        }
     380        LeaseSetKeys keys = _context.keyManager().getKeys(dest);
     381        if (keys == null ||
     382            !message.getPrivateKey().equals(keys.getDecryptionKey())) {
     383            // Verify and register crypto keys if new or if changed
     384            // Private crypto key should never change
     385            if (!message.getPrivateKey().toPublic().equals(dest.getPublicKey())) {
     386                if (_log.shouldLog(Log.ERROR))
     387                    _log.error("Private/public crypto key mismatch in LS");
     388                _runner.disconnectClient("Private/public crypto key mismatch in LS");
     389                return;
     390            }
     391            // just register new SPK, don't verify, unused
     392            _context.keyManager().registerKeys(dest, message.getSigningPrivateKey(), message.getPrivateKey());
     393        } else if (!message.getSigningPrivateKey().equals(keys.getRevocationKey())) {
     394            // just register new SPK, don't verify, unused
     395            _context.keyManager().registerKeys(dest, message.getSigningPrivateKey(), message.getPrivateKey());
     396        }
    372397        try {
    373398            _context.netDb().publish(message.getLeaseSet());
  • router/java/src/net/i2p/router/startup/CreateRouterInfoJob.java

    r51f9d6d red4fe56  
    171171        if (sstype != null) {
    172172            SigType ntype = SigType.parseSigType(sstype);
    173             if (ntype != null && ntype.isAvailable())
     173            if (ntype != null)
    174174                cstype = ntype;
    175175        }
     176        // fallback?
     177        if (cstype != SigType.DSA_SHA1 && !cstype.isAvailable())
     178            cstype = SigType.DSA_SHA1;
    176179        return cstype;
    177180    }
Note: See TracChangeset for help on using the changeset viewer.