Changeset 149359f for core


Ignore:
Timestamp:
Jan 1, 2019 8:17:56 PM (17 months ago)
Author:
zzz <zzz@…>
Branches:
master
Children:
a0d2288
Parents:
4ae57f4
Message:

Data: Fix LS2 size(), fix Meta LS2, fix date rouding

Location:
core/java/src/net/i2p/data
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • core/java/src/net/i2p/data/LeaseSet.java

    r4ae57f4 r149359f  
    188188        if (lease == null) throw new IllegalArgumentException("erm, null lease");
    189189        if (lease.getGateway() == null) throw new IllegalArgumentException("erm, lease has no gateway");
    190         if (lease.getTunnelId() == null) throw new IllegalArgumentException("erm, lease has no tunnel");
     190        if (getType() != KEY_TYPE_META_LS2 && lease.getTunnelId() == null)
     191            throw new IllegalArgumentException("erm, lease has no tunnel");
    191192        if (_signature != null)
    192193            throw new IllegalStateException();
  • core/java/src/net/i2p/data/LeaseSet2.java

    r4ae57f4 r149359f  
    325325        if (_published <= 0)
    326326            _published = Clock.getInstance().now();
    327         DataHelper.writeLong(out, 4, _published / 1000);
    328         DataHelper.writeLong(out, 2, (_expires - _published) / 1000);
     327        long pub1k = _published / 1000;
     328        DataHelper.writeLong(out, 4, pub1k);
     329        // Divide separately to prevent rounding errors
     330        DataHelper.writeLong(out, 2, ((_expires / 1000) - pub1k));
    329331        DataHelper.writeLong(out, 2, _flags);
    330332        if (isOffline())
     
    360362    public int size() {
    361363        int rv = _destination.size()
    362              + _encryptionKey.length()
    363              + 11
     364             + 10
    364365             + (_leases.size() * 40);
     366        for (PublicKey key : getEncryptionKeys()) {
     367            rv += 4;
     368            rv += key.length();
     369        }
    365370        if (isOffline())
    366             rv += 2 + _transientSigningPublicKey.length() + _offlineSignature.length();
     371            rv += 6 + _transientSigningPublicKey.length() + _offlineSignature.length();
    367372        if (_options != null && !_options.isEmpty()) {
    368373            try {
     
    383388    @Override
    384389    public void addLease(Lease lease) {
    385         if (!(lease instanceof Lease2))
     390        if (getType() == KEY_TYPE_LS2 && !(lease instanceof Lease2))
    386391            throw new IllegalArgumentException();
    387392        super.addLease(lease);
     
    591596        out2.close();
    592597        java.io.ByteArrayInputStream in = new java.io.ByteArrayInputStream(out.toByteArray());
     598        System.out.println("Size calculated: " + (ls2.size() + ls2.getSignature().length()));
     599        System.out.println("Size to read in: " + in.available());
    593600        LeaseSet2 ls3 = new LeaseSet2();
    594601        ls3.readBytes(in);
  • core/java/src/net/i2p/data/MetaLease.java

    r4ae57f4 r149359f  
    8080               ^ _cost;
    8181    }
     82   
     83    @Override
     84    public String toString() {
     85        StringBuilder buf = new StringBuilder(128);
     86        buf.append("[Meta Lease: ");
     87        buf.append("\n\tEnd Date: ").append(_end);
     88        buf.append("\n\tTarget: ").append(_gateway);
     89        buf.append("\n\tCost: ").append(_cost);
     90        buf.append("]");
     91        return buf.toString();
     92    }
    8293}
  • core/java/src/net/i2p/data/MetaLeaseSet.java

    r4ae57f4 r149359f  
    44import java.io.InputStream;
    55import java.io.OutputStream;
     6import java.util.Map;
    67
    78import net.i2p.crypto.SigType;
     
    2324    public int getType() {
    2425        return KEY_TYPE_META_LS2;
     26    }
     27
     28    /**
     29     *  @throws UnsupportedOperationException always
     30     */
     31    @Override
     32    public void setEncryptionKey(PublicKey key) {
     33        throw new UnsupportedOperationException();
     34    }
     35
     36    /**
     37     *  @throws UnsupportedOperationException always
     38     */
     39    @Override
     40    public void addEncryptionKey(PublicKey key) {
     41        throw new UnsupportedOperationException();
    2542    }
    2643
     
    6582    @Override
    6683    protected void writeBytesWithoutSig(OutputStream out) throws DataFormatException, IOException {
    67         if (_destination == null || _encryptionKey == null)
     84        if (_destination == null)
    6885            throw new DataFormatException("Not enough data to write out a LeaseSet");
    6986        // LS2 header
     
    89106    public int size() {
    90107        int rv = _destination.size()
    91              + 2
     108             + 10
    92109             + (_leases.size() * 40);
    93110        if (isOffline())
    94             rv += 2 + _transientSigningPublicKey.length() + _offlineSignature.length();
     111            rv += 6 + _transientSigningPublicKey.length() + _offlineSignature.length();
    95112        if (_options != null && !_options.isEmpty()) {
    96113            try {
     
    102119            rv += 2;
    103120        }
     121        // revocations TODO
     122        // rv += 32 * numRevocations
    104123        return rv;
    105124    }
     
    125144               DataHelper.eq(_signature, ls.getSignature())
    126145               && DataHelper.eq(_leases, ls._leases)
    127                && DataHelper.eq(getEncryptionKey(), ls.getEncryptionKey())
    128146               && DataHelper.eq(_destination, ls.getDestination());
    129147    }
     
    132150    @Override
    133151    public int hashCode() {
    134         if (_destination == null)
    135             return 0;
    136         return _destination.hashCode();
     152        return super.hashCode();
    137153    }
    138154   
     
    148164        }
    149165        buf.append("\n\tOptions: ").append((_options != null) ? _options.size() : 0);
     166        if (_options != null && !_options.isEmpty()) {
     167            for (Map.Entry<Object, Object> e : _options.entrySet()) {
     168                String key = (String) e.getKey();
     169                String val = (String) e.getValue();
     170                buf.append("\n\t\t[").append(key).append("] = [").append(val).append("]");
     171            }
     172        }
    150173        buf.append("\n\tSignature: ").append(_signature);
    151174        buf.append("\n\tPublished: ").append(new java.util.Date(_published));
     
    157180        return buf.toString();
    158181    }
     182
     183/****
     184    public static void main(String args[]) throws Exception {
     185        if (args.length != 1) {
     186            System.out.println("Usage: MetaLeaseSet privatekeyfile.dat");
     187            System.exit(1);
     188        }
     189        java.io.File f = new java.io.File(args[0]);
     190        PrivateKeyFile pkf = new PrivateKeyFile(f);
     191        pkf.createIfAbsent(SigType.EdDSA_SHA512_Ed25519);
     192        System.out.println("Online test");
     193        java.io.File f2 = new java.io.File("online-metals2.dat");
     194        test(pkf, f2, false);
     195        System.out.println("Offline test");
     196        f2 = new java.io.File("offline-metals2.dat");
     197        test(pkf, f2, true);
     198    }
     199
     200    private static void test(PrivateKeyFile pkf, java.io.File outfile, boolean offline) throws Exception {
     201        net.i2p.util.RandomSource rand = net.i2p.util.RandomSource.getInstance();
     202        long now = System.currentTimeMillis() + 5*60*1000;
     203        MetaLeaseSet ls2 = new MetaLeaseSet();
     204        for (int i = 0; i < 3; i++) {
     205            MetaLease l2 = new MetaLease();
     206            now += 10000;
     207            l2.setEndDate(new java.util.Date(now));
     208            byte[] gw = new byte[32];
     209            rand.nextBytes(gw);
     210            l2.setGateway(new Hash(gw));
     211            l2.setCost(i * 5);
     212            ls2.addLease(l2);
     213        }
     214        java.util.Properties opts = new java.util.Properties();
     215        opts.setProperty("foo", "bar");
     216        opts.setProperty("test", "bazzle");
     217        ls2.setOptions(opts);
     218        ls2.setDestination(pkf.getDestination());
     219        SigningPrivateKey spk = pkf.getSigningPrivKey();
     220        if (offline) {
     221            now += 365*24*60*60*1000L;
     222            SimpleDataStructure transKeys[] = net.i2p.crypto.KeyGenerator.getInstance().generateSigningKeys(SigType.EdDSA_SHA512_Ed25519);
     223            SigningPublicKey transientPub = (SigningPublicKey) transKeys[0];
     224            SigningPrivateKey transientPriv = (SigningPrivateKey) transKeys[1];
     225            Signature sig = offlineSign(now, transientPub, spk);
     226            ls2.setOfflineSignature(now, transientPub, sig);
     227            ls2.sign(transientPriv);
     228        } else {
     229            ls2.sign(spk);
     230        }
     231        System.out.println("Created: " + ls2);
     232        if (!ls2.verifySignature())
     233            System.out.println("Verify FAILED");
     234        java.io.ByteArrayOutputStream out = new java.io.ByteArrayOutputStream();
     235        ls2.writeBytes(out);
     236        java.io.OutputStream out2 = new java.io.FileOutputStream(outfile);
     237        ls2.writeBytes(out2);
     238        out2.close();
     239        java.io.ByteArrayInputStream in = new java.io.ByteArrayInputStream(out.toByteArray());
     240        System.out.println("Size calculated: " + (ls2.size() + ls2.getSignature().length()));
     241        System.out.println("Size to read in: " + in.available());
     242        LeaseSet2 ls3 = new MetaLeaseSet();
     243        ls3.readBytes(in);
     244        System.out.println("Read back: " + ls3);
     245        if (!ls3.verifySignature()) {
     246            System.out.println("Verify FAILED");
     247            System.out.println("Wrote out");
     248            byte[] b2 = ls2.toByteArray();
     249            System.out.println(net.i2p.util.HexDump.dump(b2));
     250            System.out.println("Read in");
     251            byte[] b3 = ls3.toByteArray();
     252            System.out.println(net.i2p.util.HexDump.dump(b3));
     253        }
     254    }
     255****/
    159256}
Note: See TracChangeset for help on using the changeset viewer.