Skip to content

Commit a6f48b1

Browse files
fix tests
1 parent eac42de commit a6f48b1

3 files changed

Lines changed: 44 additions & 11 deletions

File tree

src/main/java/org/ethereum/beacon/discovery/pipeline/handler/UnauthorizedMessagePacketHandler.java

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -42,18 +42,20 @@ public void handle(Envelope envelope) {
4242

4343
NodeSession session = envelope.get(Field.SESSION);
4444

45-
// If already awaiting handshake completion, resend the original WHOAREYOU so the
46-
// initiator can complete it using the same challenge nonce, rather than issuing a
47-
// new challenge with the retransmitted packet's nonce.
45+
OrdinaryMessagePacket unknownPacket = envelope.get(Field.UNAUTHORIZED_PACKET_MESSAGE);
46+
Bytes12 msgNonce = unknownPacket.getHeader().getStaticHeader().getNonce();
47+
48+
// If already awaiting handshake completion, resend the original WHOAREYOU for retransmissions
49+
// of the same packet (same nonce). For a new nonce, fall through and issue a fresh WHOAREYOU
50+
// so the initiator's nonce check can pass.
4851
if (session.getState() == SessionState.WHOAREYOU_SENT) {
49-
session.resendOutgoingWhoAreYou();
50-
return;
52+
if (session.getPendingWhoAreYouNonce().map(msgNonce::equals).orElse(false)) {
53+
session.resendOutgoingWhoAreYou();
54+
return;
55+
}
5156
}
5257

53-
OrdinaryMessagePacket unknownPacket = envelope.get(Field.UNAUTHORIZED_PACKET_MESSAGE);
5458
try {
55-
// packet it either random or message packet if session is expired
56-
Bytes12 msgNonce = unknownPacket.getHeader().getStaticHeader().getNonce();
5759
Bytes16 idNonce = Bytes16.random(Functions.getRandom());
5860

5961
Header<WhoAreYouAuthData> header =

src/main/java/org/ethereum/beacon/discovery/schema/NodeSession.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -170,6 +170,11 @@ public synchronized void sendOutgoingWhoAreYou(final WhoAreYouPacket packet) {
170170
dispatchWhoAreYou(maskingIV, packet);
171171
}
172172

173+
public synchronized Optional<Bytes12> getPendingWhoAreYouNonce() {
174+
return pendingWhoAreYouPacket.map(
175+
p -> p.getHeader().getStaticHeader().getNonce());
176+
}
177+
173178
public synchronized void resendOutgoingWhoAreYou() {
174179
pendingWhoAreYouPacket.ifPresent(
175180
packet -> {

src/test/java/org/ethereum/beacon/discovery/pipeline/handler/UnauthorizedMessagePacketHandlerTest.java

Lines changed: 29 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -35,8 +35,11 @@ void shouldResendExistingWhoAreYouWhenInWhoAreYouSentState() {
3535
final NodeSession session = mock(NodeSession.class);
3636
when(session.getState()).thenReturn(SessionState.WHOAREYOU_SENT);
3737

38-
final Envelope envelope = envelopeWith(session, createOrdinaryPacket());
39-
handler.handle(envelope);
38+
final OrdinaryMessagePacket packet = createOrdinaryPacket();
39+
final Bytes12 nonce = packet.getHeader().getStaticHeader().getNonce();
40+
when(session.getPendingWhoAreYouNonce()).thenReturn(Optional.of(nonce));
41+
42+
handler.handle(envelopeWith(session, packet));
4043

4144
verify(session).resendOutgoingWhoAreYou();
4245
verify(session, never()).sendOutgoingWhoAreYou(any());
@@ -48,11 +51,34 @@ void shouldNotChangeStateWhenResendingInWhoAreYouSentState() {
4851
final NodeSession session = mock(NodeSession.class);
4952
when(session.getState()).thenReturn(SessionState.WHOAREYOU_SENT);
5053

51-
handler.handle(envelopeWith(session, createOrdinaryPacket()));
54+
final OrdinaryMessagePacket packet = createOrdinaryPacket();
55+
final Bytes12 nonce = packet.getHeader().getStaticHeader().getNonce();
56+
when(session.getPendingWhoAreYouNonce()).thenReturn(Optional.of(nonce));
57+
58+
handler.handle(envelopeWith(session, packet));
5259

5360
verify(session, never()).setState(any());
5461
}
5562

63+
@Test
64+
void shouldSendNewWhoAreYouWhenInWhoAreYouSentStateButDifferentNonce() {
65+
final NodeSession session = mock(NodeSession.class);
66+
when(session.getState()).thenReturn(SessionState.WHOAREYOU_SENT);
67+
when(session.getNodeRecord()).thenReturn(Optional.empty());
68+
// Pending WhoAreYou was for a different nonce
69+
when(session.getPendingWhoAreYouNonce())
70+
.thenReturn(Optional.of(Bytes12.wrap(Bytes.random(12))));
71+
72+
final OrdinaryMessagePacket packet = createOrdinaryPacket();
73+
handler.handle(envelopeWith(session, packet));
74+
75+
verify(session, never()).resendOutgoingWhoAreYou();
76+
final ArgumentCaptor<WhoAreYouPacket> captor = ArgumentCaptor.forClass(WhoAreYouPacket.class);
77+
verify(session).sendOutgoingWhoAreYou(captor.capture());
78+
final Bytes12 expectedNonce = packet.getHeader().getStaticHeader().getNonce();
79+
assertThat(captor.getValue().getHeader().getStaticHeader().getNonce()).isEqualTo(expectedNonce);
80+
}
81+
5682
@Test
5783
void shouldSendNewWhoAreYouWithIncomingNonceWhenInInitialState() {
5884
final NodeSession session = mock(NodeSession.class);

0 commit comments

Comments
 (0)