Changeset 9951e34 for core/java


Ignore:
Timestamp:
Jan 2, 2019 11:50:05 AM (19 months ago)
Author:
zzz <zzz@…>
Branches:
master
Children:
d10d7227
Parents:
62fd049
Message:

Data: More work on Encrypted LS2 (proposal 123)

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

Legend:

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

    r62fd049 r9951e34  
    11package net.i2p.data;
    22
     3import java.io.ByteArrayOutputStream;
    34import java.io.IOException;
    45import java.io.InputStream;
     
    5354        // TODO attempt decryption
    5455        return _decryptedLS2 != null ? _decryptedLS2.getLease(index) : null;
     56    }
     57
     58    /**
     59     * Overridden to set the blinded key
     60     *
     61     * @param dest non-null, must be EdDSA_SHA512_Ed25519
     62     * @throws IllegalStateException if already signed
     63     * @throws IllegalArgumentException if not EdDSA
     64     */
     65    @Override
     66    public void setDestination(Destination dest) {
     67        super.setDestination(dest);
     68        SigningPublicKey spk = dest.getSigningPublicKey();
     69        if (spk.getType() != SigType.EdDSA_SHA512_Ed25519)
     70            throw new IllegalArgumentException();
     71        // TODO generate blinded key
     72        _signingKey = blind(spk, null);
     73    }
     74
     75    private static SigningPublicKey blind(SigningPublicKey spk, SigningPrivateKey priv) {
     76        // TODO generate blinded key
     77        return spk;
     78    }
     79
     80    /**
     81     * Overridden to return the blinded key so super.verifySignature() will work.
     82     *
     83     * @return SPK or null
     84     */
     85    @Override
     86    protected SigningPublicKey getSigningPublicKey() {
     87        return _signingKey;
    5588    }
    5689
     
    89122        writeHeader(out);
    90123        // Encrypted LS2 part
     124        if (_encryptedData == null) {
     125            // TODO
     126            encrypt(null);
     127        }
    91128        DataHelper.writeLong(out, 2, _encryptedData.length);
    92129        out.write(_encryptedData);
     
    171208    public int size() {
    172209        int rv = _signingKey.length()
    173              + 12
    174              + _encryptedData.length;
     210             + 12;
     211        if (_encryptedData != null)
     212            rv += _encryptedData.length;
     213        else
     214            rv += 99; // TODO
    175215        if (isOffline())
    176             rv += 2 + _transientSigningPublicKey.length() + _offlineSignature.length();
     216            rv += 6 + _transientSigningPublicKey.length() + _offlineSignature.length();
    177217        return rv;
    178218    }
     
    199239    }
    200240
    201     // encrypt / decrypt TODO
     241    /**
     242     *  Throws IllegalStateException if not initialized.
     243     *
     244     *  @param key ignored, to be fixed
     245     *  @throws IllegalStateException
     246     */
     247    @Override
     248    public void encrypt(SessionKey key) {
     249        if (_encryptedData != null)
     250            throw new IllegalStateException();
     251        ByteArrayOutputStream baos = new ByteArrayOutputStream();
     252        try {
     253            // Middle layer - flag
     254            baos.write(0);
     255            // Inner layer - type - data covered by sig
     256            baos.write(KEY_TYPE_LS2);
     257            super.writeHeader(baos);
     258            writeBody(baos);
     259        } catch (DataFormatException dfe) {
     260            throw new IllegalStateException("Error encrypting LS2", dfe);
     261        } catch (IOException ioe) {
     262            throw new IllegalStateException("Error encrypting LS2", ioe);
     263        }
     264
     265        // TODO sign and add signature
     266        // TODO encrypt - TESTING ONLY
     267        _encryptedData = baos.toByteArray();
     268        for (int i = 0; i < _encryptedData.length; i++) {
     269             _encryptedData[i] ^= 0x5a;
     270        }
     271    }
    202272
    203273    @Override
     
    235305        return buf.toString();
    236306    }
     307
     308/****
     309    public static void main(String args[]) throws Exception {
     310        if (args.length != 1) {
     311            System.out.println("Usage: LeaseSet2 privatekeyfile.dat");
     312            System.exit(1);
     313        }
     314        java.io.File f = new java.io.File(args[0]);
     315        PrivateKeyFile pkf = new PrivateKeyFile(f);
     316        pkf.createIfAbsent(SigType.EdDSA_SHA512_Ed25519);
     317        System.out.println("Online test");
     318        java.io.File f2 = new java.io.File("online-encls2.dat");
     319        test(pkf, f2, false);
     320        System.out.println("Offline test");
     321        f2 = new java.io.File("offline-encls2.dat");
     322        test(pkf, f2, true);
     323    }
     324
     325    private static void test(PrivateKeyFile pkf, java.io.File outfile, boolean offline) throws Exception {
     326        net.i2p.util.RandomSource rand = net.i2p.util.RandomSource.getInstance();
     327        long now = System.currentTimeMillis() + 5*60*1000;
     328        EncryptedLeaseSet ls2 = new EncryptedLeaseSet();
     329        for (int i = 0; i < 3; i++) {
     330            Lease2 l2 = new Lease2();
     331            now += 10000;
     332            l2.setEndDate(new java.util.Date(now));
     333            byte[] gw = new byte[32];
     334            rand.nextBytes(gw);
     335            l2.setGateway(new Hash(gw));
     336            TunnelId id = new TunnelId(1 + rand.nextLong(TunnelId.MAX_ID_VALUE));
     337            l2.setTunnelId(id);
     338            ls2.addLease(l2);
     339        }
     340        java.util.Properties opts = new java.util.Properties();
     341        opts.setProperty("foof", "bar");
     342        ls2.setOptions(opts);
     343        ls2.setDestination(pkf.getDestination());
     344        SimpleDataStructure encKeys[] = net.i2p.crypto.KeyGenerator.getInstance().generatePKIKeys();
     345        PublicKey pubKey = (PublicKey) encKeys[0];
     346        ls2.addEncryptionKey(pubKey);
     347        net.i2p.crypto.KeyPair encKeys2 = net.i2p.crypto.KeyGenerator.getInstance().generatePKIKeys(net.i2p.crypto.EncType.ECIES_X25519);
     348        pubKey = encKeys2.getPublic();
     349        ls2.addEncryptionKey(pubKey);
     350        SigningPrivateKey spk = pkf.getSigningPrivKey();
     351        if (offline) {
     352            now += 365*24*60*60*1000L;
     353            SimpleDataStructure transKeys[] = net.i2p.crypto.KeyGenerator.getInstance().generateSigningKeys(SigType.EdDSA_SHA512_Ed25519);
     354            SigningPublicKey transientPub = (SigningPublicKey) transKeys[0];
     355            SigningPrivateKey transientPriv = (SigningPrivateKey) transKeys[1];
     356            Signature sig = offlineSign(now, transientPub, spk);
     357            ls2.setOfflineSignature(now, transientPub, sig);
     358            ls2.sign(transientPriv);
     359        } else {
     360            ls2.sign(spk);
     361        }
     362        System.out.println("Created: " + ls2);
     363        if (!ls2.verifySignature())
     364            System.out.println("Verify FAILED");
     365        ByteArrayOutputStream out = new ByteArrayOutputStream();
     366        ls2.writeBytes(out);
     367        java.io.OutputStream out2 = new java.io.FileOutputStream(outfile);
     368        ls2.writeBytes(out2);
     369        out2.close();
     370        java.io.ByteArrayInputStream in = new java.io.ByteArrayInputStream(out.toByteArray());
     371        System.out.println("Size calculated: " + (ls2.size() + ls2.getSignature().length()));
     372        System.out.println("Size to read in: " + in.available());
     373        EncryptedLeaseSet ls3 = new EncryptedLeaseSet();
     374        ls3.readBytes(in);
     375        System.out.println("Read back: " + ls3);
     376        if (!ls3.verifySignature())
     377            System.out.println("Verify FAILED");
     378    }
     379****/
    237380}
  • core/java/src/net/i2p/data/LeaseSet2.java

    r62fd049 r9951e34  
    180180        }
    181181        byte[] data = baos.toByteArray();
    182         return ctx.dsa().verifySignature(_offlineSignature, data, 0, data.length, _destination.getSigningPublicKey());
     182        return ctx.dsa().verifySignature(_offlineSignature, data, 0, data.length, getSigningPublicKey());
    183183    }
    184184
     
    289289        writeHeader(out);
    290290        // LS2 part
     291        writeBody(out);
     292    }
     293
     294    /**
     295     *  Without sig. This does NOT validate the signature
     296     */
     297    protected void writeBody(OutputStream out) throws DataFormatException, IOException {
    291298        if (_options != null && !_options.isEmpty()) {
    292299            DataHelper.writeProperties(out, _options);
Note: See TracChangeset for help on using the changeset viewer.