Skip to content

Commit f291d99

Browse files
Merge pull request #917 from yosuke-wolfssl/f_2471
Fix DoKexDhReply() to reject the server's pub key if no PublicKeyCheck callback is registered
2 parents 53ae73b + 9e3eee1 commit f291d99

4 files changed

Lines changed: 63 additions & 5 deletions

File tree

src/internal.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5818,8 +5818,8 @@ static int DoKexDhReply(WOLFSSH* ssh, byte* buf, word32 len, word32* idx)
58185818
}
58195819
}
58205820
else {
5821-
WLOG(WS_LOG_DEBUG, "DKDR: no public key check callback, accepted");
5822-
ret = WS_SUCCESS;
5821+
WLOG(WS_LOG_DEBUG, "DKDR: no public key check callback, rejected");
5822+
ret = WS_PUBKEY_REJECTED_E;
58235823
}
58245824
}
58255825

tests/api.c

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1158,6 +1158,15 @@ static int sftpUserAuth(byte authType, WS_UserAuthData* authData, void* ctx)
11581158
return ret;
11591159
}
11601160

1161+
static int AcceptAnyServerHostKey(const byte* pubKey, word32 pubKeySz,
1162+
void* ctx)
1163+
{
1164+
(void)pubKey;
1165+
(void)pubKeySz;
1166+
(void)ctx;
1167+
return 0;
1168+
}
1169+
11611170
/* performs connection to port, sets WOLFSSH_CTX and WOLFSSH on success
11621171
* caller needs to free ctx and ssh when done
11631172
*/
@@ -1180,6 +1189,7 @@ static void sftp_client_connect(WOLFSSH_CTX** ctx, WOLFSSH** ssh, int port)
11801189
return;
11811190
}
11821191

1192+
wolfSSH_CTX_SetPublicKeyCheck(*ctx, AcceptAnyServerHostKey);
11831193
wolfSSH_SetUserAuth(*ctx, sftpUserAuth);
11841194
*ssh = wolfSSH_new(*ctx);
11851195
if (*ssh == NULL) {
@@ -1888,6 +1898,7 @@ static void keyboard_client_connect(WOLFSSH_CTX** ctx, WOLFSSH** ssh, int port)
18881898
return;
18891899
}
18901900

1901+
wolfSSH_CTX_SetPublicKeyCheck(*ctx, AcceptAnyServerHostKey);
18911902
wolfSSH_SetUserAuth(*ctx, keyboardUserAuth);
18921903
*ssh = wolfSSH_new(*ctx);
18931904
if (*ssh == NULL) {

tests/auth.c

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -549,6 +549,15 @@ static THREAD_RETURN WOLFSSH_THREAD pubkey_server_thread(void* args)
549549
WOLFSSL_RETURN_FROM_THREAD(0);
550550
}
551551

552+
static int AcceptAnyServerHostKey(const byte* pubKey, word32 pubKeySz,
553+
void* ctx)
554+
{
555+
(void)pubKey;
556+
(void)pubKeySz;
557+
(void)ctx;
558+
return 0;
559+
}
560+
552561
/* Run one pubkey auth attempt.
553562
* sCtx – server context (authorised key hash)
554563
* cCtx – client context (key material to present)
@@ -578,6 +587,7 @@ static int run_pubkey_test(PubkeyServerCtx* sCtx, PubkeyClientCtx* cCtx,
578587

579588
clientCtx = wolfSSH_CTX_new(WOLFSSH_ENDPOINT_CLIENT, NULL);
580589
AssertNotNull(clientCtx);
590+
wolfSSH_CTX_SetPublicKeyCheck(clientCtx, AcceptAnyServerHostKey);
581591
wolfSSH_SetUserAuth(clientCtx, clientPubkeyUserAuth);
582592

583593
clientSsh = wolfSSH_new(clientCtx);
@@ -977,6 +987,7 @@ static int basic_client_connect(WOLFSSH_CTX** ctx, WOLFSSH** ssh, int port)
977987
return WS_BAD_ARGUMENT;
978988
}
979989

990+
wolfSSH_CTX_SetPublicKeyCheck(*ctx, AcceptAnyServerHostKey);
980991
wolfSSH_SetUserAuth(*ctx, keyboardUserAuth);
981992
*ssh = wolfSSH_new(*ctx);
982993
if (*ssh == NULL) {

tests/regress.c

Lines changed: 39 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -749,8 +749,8 @@ static void FreeKexReplyHarness(KexReplyHarness* harness)
749749
}
750750
}
751751

752-
static void InitKexReplyHarness(KexReplyHarness* harness,
753-
const char* keyAlgo, byte mutateReply)
752+
static void InitKexReplyHarnessEx(KexReplyHarness* harness,
753+
const char* keyAlgo, byte mutateReply, byte skipPublicKeyCheck)
754754
{
755755
byte keyBuf[2048];
756756
word32 keySz;
@@ -781,7 +781,9 @@ static void InitKexReplyHarness(KexReplyHarness* harness,
781781

782782
wolfSSH_SetUserAuth(harness->clientCtx, RegressionClientUserAuth);
783783
wolfSSH_SetUserAuth(harness->serverCtx, RegressionServerUserAuth);
784-
wolfSSH_CTX_SetPublicKeyCheck(harness->clientCtx, AcceptAnyServerHostKey);
784+
if (!skipPublicKeyCheck) {
785+
wolfSSH_CTX_SetPublicKeyCheck(harness->clientCtx, AcceptAnyServerHostKey);
786+
}
785787

786788
keySz = LoadFileBuffer(REGRESS_SERVER_KEY_PATH, keyBuf, sizeof(keyBuf));
787789
AssertTrue(keySz > 0);
@@ -802,6 +804,12 @@ static void InitKexReplyHarness(KexReplyHarness* harness,
802804
WS_SUCCESS);
803805
}
804806

807+
static void InitKexReplyHarness(KexReplyHarness* harness,
808+
const char* keyAlgo, byte mutateReply)
809+
{
810+
InitKexReplyHarnessEx(harness, keyAlgo, mutateReply, 0);
811+
}
812+
805813
static int IsHandshakeRetryable(int err)
806814
{
807815
return err == WS_WANT_READ || err == WS_WANT_WRITE ||
@@ -903,6 +911,33 @@ static void TestKexDhReplyRejectsRsaSha2_512SigNameDowngrade(void)
903911
}
904912
#endif
905913

914+
static void AssertHandshakeRejectsWithNoPublicKeyCheck(const char* keyAlgo)
915+
{
916+
KexReplyHarness harness;
917+
KexReplyRunResult result;
918+
919+
InitKexReplyHarnessEx(&harness, keyAlgo, 0, 1 /* skipPublicKeyCheck */);
920+
RunKexReplyHandshake(&harness, &result);
921+
922+
AssertFalse(result.clientSuccess);
923+
AssertTrue(result.clientRet == WS_FATAL_ERROR);
924+
AssertTrue(result.clientErr != WS_WANT_READ && result.clientErr != WS_WANT_WRITE);
925+
AssertIntEQ(result.clientErr, WS_PUBKEY_REJECTED_E);
926+
AssertFalse(harness.client->connectState >= CONNECT_KEYED);
927+
928+
FreeKexReplyHarness(&harness);
929+
}
930+
931+
static void TestKexDhReplyRejectsNoPublicKeyCheck(void)
932+
{
933+
#ifndef WOLFSSH_NO_RSA_SHA2_256
934+
AssertHandshakeRejectsWithNoPublicKeyCheck("rsa-sha2-256");
935+
#endif
936+
#ifndef WOLFSSH_NO_RSA_SHA2_512
937+
AssertHandshakeRejectsWithNoPublicKeyCheck("rsa-sha2-512");
938+
#endif
939+
}
940+
906941
#endif /* KEXDH_REPLY_REGRESS_KEX_ALGO */
907942

908943
static void AssertChannelOpenFailResponse(const ChannelOpenHarness* harness,
@@ -1667,6 +1702,7 @@ int main(int argc, char** argv)
16671702
#ifndef WOLFSSH_NO_RSA_SHA2_512
16681703
TestKexDhReplyRejectsRsaSha2_512SigNameDowngrade();
16691704
#endif
1705+
TestKexDhReplyRejectsNoPublicKeyCheck();
16701706
#endif
16711707

16721708
#ifdef WOLFSSH_SFTP

0 commit comments

Comments
 (0)