SSU2: Data phase fixes

Fix receiver CipherState key
Override clearWantedACKSendSince() to avoid NPE
Add/tweak debug logging
This commit is contained in:
zzz
2022-03-02 08:32:22 -05:00
parent 0f26baf114
commit 9d9310a726
4 changed files with 30 additions and 7 deletions

View File

@@ -462,9 +462,9 @@ class InboundEstablishState2 extends InboundEstablishState implements SSU2Payloa
ChaChaPolyCipherState sender = new ChaChaPolyCipherState();
sender.initializeKey(d_ba, 0);
ChaChaPolyCipherState rcvr = new ChaChaPolyCipherState();
sender.initializeKey(d_ab, 0);
rcvr.initializeKey(d_ab, 0);
if (_log.shouldDebug())
_log.debug("Generated Chain key: " + Base64.encode(ckd) +
_log.debug("split()\nGenerated Chain key: " + Base64.encode(ckd) +
"\nGenerated split key for A->B: " + Base64.encode(k_ab) +
"\nGenerated split key for B->A: " + Base64.encode(k_ba) +
"\nGenerated encrypt key for A->B: " + Base64.encode(d_ab) +

View File

@@ -418,15 +418,15 @@ class OutboundEstablishState2 extends OutboundEstablishState implements SSU2Payl
ChaChaPolyCipherState sender = new ChaChaPolyCipherState();
sender.initializeKey(d_ab, 0);
ChaChaPolyCipherState rcvr = new ChaChaPolyCipherState();
sender.initializeKey(d_ba, 0);
rcvr.initializeKey(d_ba, 0);
if (_log.shouldDebug())
_log.debug("Generated Chain key: " + Base64.encode(ckd) +
_log.debug("split()\nGenerated Chain key: " + Base64.encode(ckd) +
"\nGenerated split key for A->B: " + Base64.encode(k_ab) +
"\nGenerated split key for B->A: " + Base64.encode(k_ba) +
"\nGenerated encrypt key for A->B: " + Base64.encode(d_ab) +
"\nGenerated encrypt key for B->A: " + Base64.encode(d_ba) +
"\nIntro key for Alice: " + Base64.encode(_sendHeaderEncryptKey1) +
"\nIntro key for Bob: " + Base64.encode(_rcvHeaderEncryptKey1) +
"\nIntro key for Alice: " + Base64.encode(_transport.getSSU2StaticIntroKey()) +
"\nIntro key for Bob: " + Base64.encode(_sendHeaderEncryptKey1) +
"\nGenerated header key 2 for A->B: " + Base64.encode(h_ab) +
"\nGenerated header key 2 for B->A: " + Base64.encode(h_ba));
_handshakeState.destroy();

View File

@@ -29,6 +29,7 @@ import net.i2p.router.transport.udp.PacketBuilder.Fragment;
import net.i2p.router.transport.udp.SSU2Payload.Block;
import static net.i2p.router.transport.udp.SSU2Util.*;
import net.i2p.util.Addresses;
import net.i2p.util.HexDump;
import net.i2p.util.Log;
/**
@@ -215,9 +216,13 @@ class PacketBuilder2 {
}
SSU2Payload.writePayload(data, SHORT_HEADER_SIZE, blocks);
pkt.setLength(off);
if (_log.shouldDebug())
_log.debug("Packet " + pktNum + " before encryption:\n" + HexDump.dump(data, 0, off));
encryptDataPacket(packet, peer.getSendCipher(), pktNum, peer.getSendHeaderEncryptKey1(), peer.getSendHeaderEncryptKey2());
setTo(packet, peer.getRemoteIPAddress(), peer.getRemotePort());
if (_log.shouldDebug())
_log.debug("Packet " + pktNum + " after encryption:\n" + HexDump.dump(data, 0, pkt.getLength()));
// FIXME ticket #2675
// the packet could have been built before the current mtu got lowered, so

View File

@@ -119,6 +119,16 @@ public class PeerState2 extends PeerState implements SSU2Payload.PayloadCallback
DATA_FOLLOWON_EXTRA_SIZE; // Followon fragment block overhead (5)
}
/**
* All acks have been sent.
*/
@Override
void clearWantedACKSendSince() {
// TODO
//if ( )
// _wantACKSendSince = 0;
}
// SSU 1 unsupported things
@Override
@@ -160,6 +170,8 @@ public class PeerState2 extends PeerState implements SSU2Payload.PayloadCallback
byte[] data = dpacket.getData();
int off = dpacket.getOffset();
int len = dpacket.getLength();
if (_log.shouldDebug())
_log.debug("Packet before header decryption:\n" + HexDump.dump(data, off, len));
try {
if (len < MIN_DATA_LEN) {
if (_log.shouldWarn())
@@ -192,10 +204,14 @@ public class PeerState2 extends PeerState implements SSU2Payload.PayloadCallback
}
long n = header.getPacketNumber();
SSU2Header.acceptTrialDecrypt(packet, header);
if (_log.shouldDebug())
_log.debug("Packet " + n + " after header decryption:\n" + HexDump.dump(data, off, len));
synchronized (_rcvCha) {
_rcvCha.setNonce(n);
// decrypt in-place
_rcvCha.decryptWithAd(header.data, data, off + SHORT_HEADER_SIZE, data, off + SHORT_HEADER_SIZE, len - SHORT_HEADER_SIZE);
if (_log.shouldDebug())
_log.debug("Packet " + n + " after full decryption:\n" + HexDump.dump(data, off, len - MAC_LEN));
if (_receivedMessages.set(n)) {
if (_log.shouldWarn())
_log.warn("dup pkt rcvd " + n + " on " + this);
@@ -203,6 +219,8 @@ public class PeerState2 extends PeerState implements SSU2Payload.PayloadCallback
}
}
int payloadLen = len - (SHORT_HEADER_SIZE + MAC_LEN);
if (_log.shouldInfo())
_log.info("New pkt rcvd " + n + " on " + this);
processPayload(data, off + SHORT_HEADER_SIZE, payloadLen);
packetReceived(payloadLen);
} catch (GeneralSecurityException gse) {
@@ -220,7 +238,7 @@ public class PeerState2 extends PeerState implements SSU2Payload.PayloadCallback
try {
int blocks = SSU2Payload.processPayload(_context, this, payload, offset, length, false);
} catch (Exception e) {
throw new GeneralSecurityException("Session Created payload error", e);
throw new GeneralSecurityException("Data payload error", e);
}
}