Changeset 973aab8 for apps


Ignore:
Timestamp:
May 28, 2019 3:12:20 PM (10 months ago)
Author:
zzz <zzz@…>
Branches:
master
Children:
a3fe746
Parents:
0c7c1945
Message:

Blinding:

  • Blinding only throws IAE
  • Remove context arg from encode()
  • Hook in new form args on /configkeyring
  • Show b33 on /configkeyring
  • Remove support for appended secret in b33
  • Persist cache immediately when storing secret or privkey
  • Fix i2ptunnel for std. ls2
  • Add auth/secret required flags to BlindData?

more to do

Location:
apps
Files:
5 edited

Legend:

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

    r0c7c1945 r973aab8  
    565565        if (d != null) {
    566566            int mode = _helper.getEncryptMode(tunnel);
    567             if (mode > 1) {
     567            if (mode > 1 && mode < 10) {
    568568                try {
    569569                    String secret = _helper.getBlindedPassword(tunnel);
     
    571571                                            (mode == 3 || mode == 5 || mode == 7 || mode == 9);
    572572                    boolean requireAuth = mode >= 4 && mode <= 9;
    573                     return Blinding.encode(_context, d.getSigningPublicKey(), requireSecret, requireAuth);
     573                    return Blinding.encode(d.getSigningPublicKey(), requireSecret, requireAuth);
    574574                } catch (RuntimeException re) {}
    575575            }
  • apps/i2ptunnel/jsp/editServer.jsi

    r0c7c1945 r973aab8  
    463463                <option title="<%=intl._t("Only clients with the password will be able to connect")%>" value="3" <%=(curEncryptMode.equals("3") ? " selected=\"selected\"" : "")%> >
    464464                    <%=intl._t("Blinded with lookup password")%></option>
    465 <%
    466                          // TODO, unimplemented
    467 %>
    468465                <option title="<%=intl._t("Only clients with the encryption key will be able to connect")%>" value="4" <%=(curEncryptMode.equals("4") ? " selected=\"selected\"" : "")%> >
    469                     <%=intl._t("Blinded with shared key")%></option>
     466                    <%=intl._t("Blinded with shared key")%> (PSK)</option>
    470467                <option title="<%=intl._t("Only clients with the password and key will be able to connect")%>" value="5" <%=(curEncryptMode.equals("5") ? " selected=\"selected\"" : "")%> >
    471                     <%=intl._t("Blinded with lookup password and shared key")%></option>
     468                    <%=intl._t("Blinded with lookup password and shared key")%> (PSK)</option>
    472469                <option title="<%=intl._t("Only clients with the encryption key will be able to connect")%>" value="6" <%=(curEncryptMode.equals("6") ? " selected=\"selected\"" : "")%> >
    473470                    <%=intl._t("Blinded with per-user key")%> (PSK)</option>
  • apps/routerconsole/java/src/net/i2p/router/web/helpers/ConfigKeyringHandler.java

    r0c7c1945 r973aab8  
    11package net.i2p.router.web.helpers;
    22
     3import net.i2p.crypto.Blinding;
     4import net.i2p.crypto.EncType;
     5import net.i2p.crypto.SigType;
     6import net.i2p.data.Base64;
     7import net.i2p.data.BlindData;
    38import net.i2p.data.DataFormatException;
     9import net.i2p.data.Destination;
    410import net.i2p.data.Hash;
     11import net.i2p.data.PrivateKey;
    512import net.i2p.data.SessionKey;
     13import net.i2p.data.SigningPublicKey;
    614import net.i2p.router.web.FormHandler;
    715import net.i2p.util.ConvertToHash;
     
    1321    private String _peer;
    1422    private String _key;
     23    private String _secret;
     24    private int _mode;
    1525   
    1626    @Override
     
    1828        boolean adding = _action.equals(_t("Add key"));
    1929        if (adding || _action.equals(_t("Delete key"))) {
    20             if (_peer == null)
     30            if (_peer == null) {
    2131                addFormError(_t("You must enter a destination"));
    22             if (_key == null && adding)
    23                 addFormError(_t("You must enter a key"));
    24             if (_peer == null || (_key == null && adding))
    2532                return;
    26             Hash h = ConvertToHash.getHash(_peer);
     33            }
     34            Hash h = null;
     35            if (!_peer.endsWith(".b32.i2p") || _peer.length() <= 60) {
     36                // don't wait for several seconds for b33 lookup
     37                h = ConvertToHash.getHash(_peer);
     38            }
    2739            if (adding) {
    28                 SessionKey sk = new SessionKey();
    29                 try {
    30                     sk.fromBase64(_key);
    31                 } catch (DataFormatException dfe) {}
    32                 if (h == null || h.getData() == null) {
    33                     addFormError(_t("Invalid destination"));
    34                 } else if (_context.clientManager().isLocal(h)) {
    35                     // don't bother translating
    36                     addFormError("Cannot add key for local destination. Enable encryption in the Hidden Services Manager.");
    37                 } else if (sk.getData() == null) {
    38                     addFormError(_t("Invalid key"));
     40                byte[] b = null;
     41                if (_mode == 1 || _mode == 4 || _mode == 5) {
     42                    if (_key == null) {
     43                        addFormError(_t("You must enter a key"));
     44                        return;
     45                    }
     46                    b = Base64.decode(_key);
     47                    if (b == null || b.length != 32) {
     48                        addFormError(_t("Invalid key"));
     49                        return;
     50                    }
     51                }
     52                if (_mode == 1) {
     53                    // LS1
     54                    if (h == null || h.getData() == null) {
     55                        addFormError(_t("Invalid destination"));
     56                    } else if (_context.clientManager().isLocal(h)) {
     57                        // don't bother translating
     58                        addFormError("Cannot add key for local destination. Enable encryption in the Hidden Services Manager.");
     59                    } else {
     60                        SessionKey sk = new SessionKey(b);
     61                        _context.keyRing().put(h, sk);
     62                        addFormNotice(_t("Key for {0} added to keyring", h.toBase32()));
     63                    }
    3964                } else {
    40                     _context.keyRing().put(h, sk);
    41                     addFormNotice(_t("Key for {0} added to keyring", h.toBase32()));
     65                    if ((_mode == 3 || _mode == 5 || _mode == 7) && _secret == null) {
     66                        addFormError(_t("Lookup password required"));
     67                        return;
     68                    }
     69                    // b33 if supplied as hostname
     70                    BlindData bdin = null;
     71                    try {
     72                        bdin = Blinding.decode(_context, _peer);
     73                    } catch (IllegalArgumentException iae) {}
     74
     75                    // we need the dest or the spk, not just the desthash
     76                    SigningPublicKey spk = null;
     77                    Destination d = null;
     78                    // don't cause LS fetch
     79                    if (!_peer.endsWith(".b32.i2p"))
     80                        d = _context.namingService().lookup(_peer);
     81                    if (d != null) {
     82                        spk = d.getSigningPublicKey();
     83                    } else if (bdin != null) {
     84                        spk = bdin.getUnblindedPubKey();
     85                    }
     86                    if (spk == null) {
     87                        addFormError(_t("Requires hostname, destination, or blinded base32"));
     88                        return;
     89                    }
     90                    // from BlindCache
     91                    BlindData bdold = _context.netDb().getBlindData(spk);
     92                    if (bdold != null && d == null)
     93                        d = bdold.getDestination();
     94                    if (d != null && _context.clientManager().isLocal(d)) {
     95                        // don't bother translating
     96                        addFormError("Cannot add key for local destination. Enable encryption in the Hidden Services Manager.");
     97                        return;
     98                    }
     99
     100                    SigType blindType;
     101                    if (bdin != null) {
     102                        blindType = bdin.getBlindedSigType();
     103                    } else if (bdold != null) {
     104                        blindType = bdold.getBlindedSigType();
     105                    } else {
     106                        blindType = Blinding.getDefaultBlindedType(spk.getType());
     107                    }
     108
     109                    int atype;
     110                    PrivateKey pk;
     111                    if (_mode == 4 || _mode == 5) {
     112                        atype = BlindData.AUTH_PSK;
     113                        // use supplied pk
     114                        pk = new PrivateKey(EncType.ECIES_X25519, b);
     115                    } else if (_mode == 6 || _mode == 7) {
     116                        atype = BlindData.AUTH_DH;
     117                        // create new pk
     118                        b = new byte[32];
     119                        _context.random().nextBytes(b);
     120                        pk = new PrivateKey(EncType.ECIES_X25519, b);
     121                    } else {
     122                        // modes 2 and 3
     123                        atype = BlindData.AUTH_NONE;
     124                        pk = null;
     125                    }
     126                    if (_mode == 2 || _mode == 4 || _mode == 6)
     127                        _secret = null;
     128                    if (bdin != null) {
     129                        // more checks based on supplied b33
     130                        if (bdin.getSecretRequired() && _secret == null) {
     131                            addFormError(_t("Destination requires lookup password"));
     132                            return;
     133                        }
     134                        if (!bdin.getSecretRequired() && _secret != null) {
     135                            addFormError(_t("Destination does not require lookup password"));
     136                            return;
     137                        }
     138                        if (bdin.getAuthRequired() && pk == null) {
     139                            addFormError(_t("Destination requires encryption key"));
     140                            return;
     141                        }
     142                        if (!bdin.getAuthRequired() && pk != null) {
     143                            addFormError(_t("Destination does not require encryption key"));
     144                            return;
     145                        }
     146                    }
     147
     148                    // to BlindCache
     149                    BlindData bdout;
     150                    if (d != null) {
     151                        bdout = new BlindData(_context, d, blindType, _secret, atype, pk);
     152                    } else {
     153                        bdout = new BlindData(_context, spk, blindType, _secret, atype, pk);
     154                    }
     155                    if (bdold != null) {
     156                        // debug
     157                        addFormNotice("already cached: " + bdold);
     158                    }
     159                    try {
     160                        _context.netDb().setBlindData(bdout);
     161                        addFormNotice(_t("Key for {0} added to keyring", bdout.toBase32()));
     162                        if (_mode == 6 || _mode == 7) {
     163                            addFormNotice(_t("Send your new key to the server opererator") + ": " + pk.toPublic().toBase64());
     164                        }
     165                    } catch (IllegalArgumentException iae) {
     166                        addFormError(_t("Invalid destination") + ": " + iae.getMessage());
     167                    }
    42168                }
    43169            } else {  // Delete
     
    62188    public void setPeer(String peer) { if (peer != null) _peer = peer.trim(); }
    63189    public void setKey(String key) { if (key != null) _key = key.trim(); }
     190
     191    /** @since 0.9.41 */
     192    public void setNofilter_blindedPassword(String pw) {
     193         if (pw != null) {
     194             pw = pw.trim();
     195             if (pw.length() > 0)
     196                 _secret = pw;
     197        }
     198    }
     199
     200    /** @since 0.9.41 */
     201    public void setEncryptMode(String m) {
     202        try {
     203             _mode = Integer.parseInt(m);
     204        } catch (NumberFormatException nfe) {}
     205    }
    64206}
  • apps/routerconsole/java/src/net/i2p/router/web/helpers/ConfigKeyringHelper.java

    r0c7c1945 r973aab8  
    8686            // TODO sort by hostname
    8787            for (BlindData bd : bdata) {
     88                buf.append("\n<tr><td>");
     89                buf.append(bd.toBase32());
     90                buf.append("</td><td>");
    8891                Hash h = bd.getDestHash();
    89                 if (h == null)
    90                     continue;
    91                 buf.append("\n<tr><td>");
    92                 buf.append(h.toBase32());
    93                 buf.append("</td><td>");
    94                 String host = _context.namingService().reverseLookup(h);
    95                 if (host != null)
    96                     buf.append(host);
     92                if (h != null) {
     93                    String host = _context.namingService().reverseLookup(h);
     94                    if (host != null)
     95                        buf.append(host);
     96                }
    9797                buf.append("</td><td>");
    9898                int type = bd.getAuthType();
  • apps/routerconsole/jsp/configkeyring.jsp

    r0c7c1945 r973aab8  
    5353          <option title="<%=intl._t("Only clients with the password and key will be able to connect")%>" value="5">
    5454              <%=intl._t("Blinded with lookup password and shared key")%></option>
    55           <option title="<%=intl._t("Only clients with the encryption key will be able to connect")%>" value="8">
     55          <option title="<%=intl._t("Only clients with the encryption key will be able to connect")%>" value="6">
    5656              <%=intl._t("Blinded with per-user key")%> (DH)</option>
    57           <option title="<%=intl._t("Only clients with the password and key will be able to connect")%>" value="9">
     57          <option title="<%=intl._t("Only clients with the password and key will be able to connect")%>" value="7">
    5858              <%=intl._t("Blinded with lookup password and per-user key")%> (DH)</option>
    5959          </select></td>
Note: See TracChangeset for help on using the changeset viewer.