Crypto: Only skip N mixHash for router messages

Still required for ECIES build replies; previous checkin broke it
Make a new pattern id for N without responses
Fixes ECIES build replies
This commit is contained in:
zzz
2020-12-30 07:08:47 -05:00
parent 2ceb9c429a
commit de43de17f6
3 changed files with 11 additions and 6 deletions

View File

@@ -136,6 +136,8 @@ public class HandshakeState implements Destroyable, Cloneable {
public static final String PATTERN_ID_XK = "XK";
public static final String PATTERN_ID_IK = "IK";
public static final String PATTERN_ID_N = "N";
/** same as N but no post-mixHash needed */
public static final String PATTERN_ID_N_NO_RESPONSE = "N!";
private static String dh;
private static final String cipher;
private static final String hash;
@@ -205,6 +207,8 @@ public class HandshakeState implements Destroyable, Cloneable {
pattern = PATTERN_IK;
else if (patternId.equals(PATTERN_ID_N))
pattern = PATTERN_N;
else if (patternId.equals(PATTERN_ID_N_NO_RESPONSE)) // same as N but no post-mixHash needed
pattern = PATTERN_N;
else
throw new IllegalArgumentException("Handshake pattern is not recognized");
short flags = pattern[0];
@@ -650,13 +654,13 @@ public class HandshakeState implements Destroyable, Cloneable {
// Add the payload to the message buffer and encrypt it.
if (payload != null) {
// no need to hash for N, we don't split() and no more messages follow
if (patternId.equals(PATTERN_ID_N))
if (patternId.equals(PATTERN_ID_N_NO_RESPONSE))
messagePosn += symmetric.encryptOnly(payload, payloadOffset, message, messagePosn, payloadLength);
else
messagePosn += symmetric.encryptAndHash(payload, payloadOffset, message, messagePosn, payloadLength);
} else {
// no need to hash for N, we don't split() and no more messages follow
if (patternId.equals(PATTERN_ID_N))
if (patternId.equals(PATTERN_ID_N_NO_RESPONSE))
messagePosn += symmetric.encryptOnly(message, messagePosn, message, messagePosn, 0);
else
messagePosn += symmetric.encryptAndHash(message, messagePosn, message, messagePosn, 0);
@@ -830,7 +834,7 @@ public class HandshakeState implements Destroyable, Cloneable {
// Decrypt the message payload.
int payloadLength;
// no need to hash for N, we don't split() and no more messages follow
if (patternId.equals(PATTERN_ID_N))
if (patternId.equals(PATTERN_ID_N_NO_RESPONSE))
payloadLength = symmetric.decryptOnly(message, messageOffset, payload, payloadOffset, messageEnd - messageOffset);
else
payloadLength = symmetric.decryptAndHash(message, messageOffset, payload, payloadOffset, messageEnd - messageOffset);

View File

@@ -121,7 +121,8 @@ class SymmetricState implements Destroyable, Cloneable {
} else if (patternId.equals(HandshakeState.PATTERN_ID_IK)) {
initCK = INIT_CK_IK;
initHash = INIT_HASH_IK;
} else if (patternId.equals(HandshakeState.PATTERN_ID_N)) {
} else if (patternId.equals(HandshakeState.PATTERN_ID_N) ||
patternId.equals(HandshakeState.PATTERN_ID_N_NO_RESPONSE)) {
initCK = INIT_CK_N;
initHash = INIT_HASH_N;
} else {

View File

@@ -503,7 +503,7 @@ public final class ECIESAEADEngine {
HandshakeState state;
try {
state = new HandshakeState(HandshakeState.PATTERN_ID_N, HandshakeState.RESPONDER, _context.commSystem().getXDHFactory());
state = new HandshakeState(HandshakeState.PATTERN_ID_N_NO_RESPONSE, HandshakeState.RESPONDER, _context.commSystem().getXDHFactory());
} catch (GeneralSecurityException gse) {
throw new IllegalStateException("bad proto", gse);
}
@@ -1009,7 +1009,7 @@ public final class ECIESAEADEngine {
private byte[] encryptNewSession(CloveSet cloves, PublicKey target) {
HandshakeState state;
try {
state = new HandshakeState(HandshakeState.PATTERN_ID_N, HandshakeState.INITIATOR, _context.commSystem().getXDHFactory());
state = new HandshakeState(HandshakeState.PATTERN_ID_N_NO_RESPONSE, HandshakeState.INITIATOR, _context.commSystem().getXDHFactory());
} catch (GeneralSecurityException gse) {
throw new IllegalStateException("bad proto", gse);
}