I2P Address: [http://git.idk.i2p]

Skip to content
Snippets Groups Projects
Commit d3016697 authored by zzz's avatar zzz
Browse files

Router: Don't re-derive public key from private for every HandshakeState

parent 010bb0a2
No related branches found
No related tags found
No related merge requests found
...@@ -107,12 +107,35 @@ class Curve25519DHState implements DHState, Cloneable { ...@@ -107,12 +107,35 @@ class Curve25519DHState implements DHState, Cloneable {
System.arraycopy(privateKey, 0, key, offset, 32); System.arraycopy(privateKey, 0, key, offset, 32);
} }
/**
* @deprecated use setKeys()
*/
@Deprecated
@Override @Override
public void setPrivateKey(byte[] key, int offset) { public void setPrivateKey(byte[] key, int offset) {
System.arraycopy(key, offset, privateKey, 0, 32); System.arraycopy(key, offset, privateKey, 0, 32);
Curve25519.eval(publicKey, 0, privateKey, null); Curve25519.eval(publicKey, 0, privateKey, null);
mode = 0x03; mode = 0x03;
} }
/**
* Sets the private and public keys for this object.
* I2P for efficiency, since setPrivateKey() calculates the public key
* and overwrites it.
* Does NOT check that the two keys match.
*
* @param privkey The buffer containing the private key.
* @param privoffset The first offset in the buffer that contains the key.
* @param pubkey The buffer containing the public key.
* @param puboffset The first offset in the buffer that contains the key.
* @since 0.9.48
*/
@Override
public void setKeys(byte[] privkey, int privoffset, byte[] pubkey, int puboffset) {
System.arraycopy(privkey, privoffset, privateKey, 0, 32);
System.arraycopy(pubkey, puboffset, publicKey, 0, 32);
mode = 0x03;
}
@Override @Override
public void setToNullPublicKey() { public void setToNullPublicKey() {
......
...@@ -95,8 +95,25 @@ public interface DHState extends Destroyable, Cloneable { ...@@ -95,8 +95,25 @@ public interface DHState extends Destroyable, Cloneable {
* *
* If this object previously held only a public key, then * If this object previously held only a public key, then
* this function will change it into a key pair. * this function will change it into a key pair.
*
* @deprecated use setKeys()
*/ */
@Deprecated
void setPrivateKey(byte[] key, int offset); void setPrivateKey(byte[] key, int offset);
/**
* Sets the private and public keys for this object.
* I2P for efficiency, since setPrivateKey() calculates the public key
* and overwrites it.
* Does NOT check that the two keys match.
*
* @param privkey The buffer containing the private key.
* @param privoffset The first offset in the buffer that contains the key.
* @param pubkey The buffer containing the private key.
* @param puboffset The first offset in the buffer that contains the key.
* @since 0.9.48
*/
void setKeys(byte[] privkey, int privoffset, byte[] pubkey, int puboffset);
/** /**
* Sets this object to the null public key and clears the private key. * Sets this object to the null public key and clears the private key.
......
...@@ -380,8 +380,8 @@ public class BuildRequestRecord { ...@@ -380,8 +380,8 @@ public class BuildRequestRecord {
try { try {
KeyFactory kf = TEST ? TESTKF : ctx.commSystem().getXDHFactory(); KeyFactory kf = TEST ? TESTKF : ctx.commSystem().getXDHFactory();
state = new HandshakeState(HandshakeState.PATTERN_ID_N, HandshakeState.RESPONDER, kf); state = new HandshakeState(HandshakeState.PATTERN_ID_N, HandshakeState.RESPONDER, kf);
state.getLocalKeyPair().setPublicKey(ourKey.toPublic().getData(), 0); state.getLocalKeyPair().setKeys(ourKey.getData(), 0,
state.getLocalKeyPair().setPrivateKey(ourKey.getData(), 0); ourKey.toPublic().getData(), 0);
state.start(); state.start();
decrypted = new byte[LENGTH_EC]; decrypted = new byte[LENGTH_EC];
state.readMessage(encryptedRecord.getData(), PEER_SIZE, EncryptedBuildRecord.LENGTH - PEER_SIZE, state.readMessage(encryptedRecord.getData(), PEER_SIZE, EncryptedBuildRecord.LENGTH - PEER_SIZE,
......
...@@ -356,8 +356,8 @@ public final class ECIESAEADEngine { ...@@ -356,8 +356,8 @@ public final class ECIESAEADEngine {
} catch (GeneralSecurityException gse) { } catch (GeneralSecurityException gse) {
throw new IllegalStateException("bad proto", gse); throw new IllegalStateException("bad proto", gse);
} }
state.getLocalKeyPair().setPublicKey(targetPrivateKey.toPublic().getData(), 0); state.getLocalKeyPair().setKeys(targetPrivateKey.getData(), 0,
state.getLocalKeyPair().setPrivateKey(targetPrivateKey.getData(), 0); targetPrivateKey.toPublic().getData(), 0);
state.start(); state.start();
if (_log.shouldDebug()) if (_log.shouldDebug())
_log.debug("State before decrypt new session: " + state); _log.debug("State before decrypt new session: " + state);
...@@ -786,8 +786,8 @@ public final class ECIESAEADEngine { ...@@ -786,8 +786,8 @@ public final class ECIESAEADEngine {
throw new IllegalStateException("bad proto", gse); throw new IllegalStateException("bad proto", gse);
} }
state.getRemotePublicKey().setPublicKey(target.getData(), 0); state.getRemotePublicKey().setPublicKey(target.getData(), 0);
state.getLocalKeyPair().setPublicKey(priv.toPublic().getData(), 0); state.getLocalKeyPair().setKeys(priv.getData(), 0,
state.getLocalKeyPair().setPrivateKey(priv.getData(), 0); priv.toPublic().getData(), 0);
state.start(); state.start();
if (_log.shouldDebug()) if (_log.shouldDebug())
_log.debug("State before encrypt new session: " + state); _log.debug("State before encrypt new session: " + state);
......
...@@ -685,8 +685,8 @@ class InboundEstablishState extends EstablishBase implements NTCP2Payload.Payloa ...@@ -685,8 +685,8 @@ class InboundEstablishState extends EstablishBase implements NTCP2Payload.Payloa
} catch (GeneralSecurityException gse) { } catch (GeneralSecurityException gse) {
throw new IllegalStateException("bad proto", gse); throw new IllegalStateException("bad proto", gse);
} }
_handshakeState.getLocalKeyPair().setPublicKey(_transport.getNTCP2StaticPubkey(), 0); _handshakeState.getLocalKeyPair().setKeys(_transport.getNTCP2StaticPrivkey(), 0,
_handshakeState.getLocalKeyPair().setPrivateKey(_transport.getNTCP2StaticPrivkey(), 0); _transport.getNTCP2StaticPubkey(), 0);
Hash h = _context.routerHash(); Hash h = _context.routerHash();
SessionKey bobHash = new SessionKey(h.getData()); SessionKey bobHash = new SessionKey(h.getData());
// save encrypted data for CBC for msg 2 // save encrypted data for CBC for msg 2
......
...@@ -217,8 +217,8 @@ class OutboundNTCP2State implements EstablishState { ...@@ -217,8 +217,8 @@ class OutboundNTCP2State implements EstablishState {
return; return;
} }
_handshakeState.getRemotePublicKey().setPublicKey(bk, 0); _handshakeState.getRemotePublicKey().setPublicKey(bk, 0);
_handshakeState.getLocalKeyPair().setPublicKey(_transport.getNTCP2StaticPubkey(), 0); _handshakeState.getLocalKeyPair().setKeys(_transport.getNTCP2StaticPrivkey(), 0,
_handshakeState.getLocalKeyPair().setPrivateKey(_transport.getNTCP2StaticPrivkey(), 0); _transport.getNTCP2StaticPubkey(), 0);
// output to _tmp // output to _tmp
try { try {
_handshakeState.start(); _handshakeState.start();
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment