Skip to content

Commit 47a07d4

Browse files
Fix minor issues and Add unit test for wrong padded OpenSSH key
1 parent 6e69959 commit 47a07d4

4 files changed

Lines changed: 52 additions & 6 deletions

File tree

apps/wolfsshd/configuration.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1120,7 +1120,7 @@ WOLFSSHD_STATIC int ParseConfigLine(WOLFSSHD_CONFIG** conf, const char* l,
11201120
*/
11211121
idx = sz;
11221122
idx += CountWhitespace(l + idx, lSz - sz, 0);
1123-
sz = CountWhitespace(l + idx, lSz - sz, 1);
1123+
sz = CountWhitespace(l + idx, lSz - idx, 1);
11241124
if (sz >= MAX_FILENAME_SZ) {
11251125
wolfSSH_Log(WS_LOG_ERROR, "[SSHD] Filename too long.");
11261126
ret = WS_FATAL_ERROR;

src/internal.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1990,6 +1990,8 @@ static int GetOpenSshKey(WS_KeySignature *key,
19901990
check1++, subIdx++) {
19911991
if (check1 != str[subIdx]) {
19921992
/* Bad pad value. */
1993+
ret = WS_KEY_FORMAT_E;
1994+
break;
19931995
}
19941996
}
19951997
}

src/keygen.c

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -102,12 +102,14 @@ int wolfSSH_MakeRsaKey(byte* out, word32 outSz, word32 size, word32 e)
102102

103103
if (wc_FreeRsaKey(&key) != 0) {
104104
WLOG(WS_LOG_DEBUG, "RSA key free failed");
105-
ret = WS_CRYPTO_FAILED;
105+
if (ret >= 0)
106+
ret = WS_CRYPTO_FAILED;
106107
}
107108

108109
if (wc_FreeRng(&rng) != 0) {
109110
WLOG(WS_LOG_DEBUG, "Couldn't free RNG");
110-
ret = WS_CRYPTO_FAILED;
111+
if (ret >= 0)
112+
ret = WS_CRYPTO_FAILED;
111113
}
112114
}
113115

@@ -167,12 +169,14 @@ int wolfSSH_MakeEcdsaKey(byte* out, word32 outSz, word32 size)
167169

168170
if (wc_ecc_free(&key) != 0) {
169171
WLOG(WS_LOG_DEBUG, "ECDSA key free failed");
170-
ret = WS_CRYPTO_FAILED;
172+
if (ret >= 0)
173+
ret = WS_CRYPTO_FAILED;
171174
}
172175

173176
if (wc_FreeRng(&rng) != 0) {
174177
WLOG(WS_LOG_DEBUG, "Couldn't free RNG");
175-
ret = WS_CRYPTO_FAILED;
178+
if (ret >= 0)
179+
ret = WS_CRYPTO_FAILED;
176180
}
177181
}
178182

@@ -234,7 +238,8 @@ int wolfSSH_MakeEd25519Key(byte* out, word32 outSz, word32 size)
234238

235239
if (wc_FreeRng(&rng) != 0) {
236240
WLOG(WS_LOG_DEBUG, "Couldn't free RNG");
237-
ret = WS_CRYPTO_FAILED;
241+
if (ret >= 0)
242+
ret = WS_CRYPTO_FAILED;
238243
}
239244
}
240245

tests/api.c

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -733,6 +733,19 @@ const char id_ecdsa_pub[] =
733733
"BMCp0GAKnxthKraRBDjz9R3wjLoyOdv9+kHct9IT/WTH1VpoTgUveL0aDa8NXR4sYzc9aSwU"
734734
"0+FQvG1xgnKNoGM= bob@localhost\n";
735735

736+
/* Same as id_ecdsa but with the last pad byte changed from 0x03 to 0x04,
737+
* so the padding sequence 1,2,3 is broken at position 3. */
738+
const char id_ecdsa_bad_pad[] =
739+
"-----BEGIN OPENSSH PRIVATE KEY-----\n"
740+
"b3BlbnNzaC1rZXktdjEAAAAABG5vbmUAAAAEbm9uZQAAAAAAAAABAAAAaAAAABNlY2RzYS\n"
741+
"1zaGEyLW5pc3RwMjU2AAAACG5pc3RwMjU2AAAAQQTAqdBgCp8bYSq2kQQ48/Ud8Iy6Mjnb\n"
742+
"/fpB3LfSE/1kx9VaaE4FL3i9Gg2vDV0eLGM3PWksFNPhULxtcYJyjaBjAAAAqJAeleSQHp\n"
743+
"XkAAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBMCp0GAKnxthKraR\n"
744+
"BDjz9R3wjLoyOdv9+kHct9IT/WTH1VpoTgUveL0aDa8NXR4sYzc9aSwU0+FQvG1xgnKNoG\n"
745+
"MAAAAgPrOgktioNqad/wHNC/rt/zVrpNqDnOwg9tNDFMOTwo8AAAANYm9iQGxvY2FsaG9z\n"
746+
"dAECBA==\n"
747+
"-----END OPENSSH PRIVATE KEY-----\n";
748+
736749
#endif /* WOLFSSH_NO_ECDSA_SHA2_NISTP256 */
737750

738751
static void test_wolfSSH_ReadKey(void)
@@ -870,6 +883,31 @@ static void test_wolfSSH_ReadKey(void)
870883
}
871884

872885

886+
static void test_wolfSSH_ReadKey_badPad(void)
887+
{
888+
#ifndef WOLFSSH_NO_ECDSA_SHA2_NISTP256
889+
byte* key = NULL;
890+
word32 keySz = 0;
891+
const byte* keyType = NULL;
892+
word32 keyTypeSz = 0;
893+
int ret;
894+
895+
ret = wolfSSH_ReadKey_buffer((const byte*)id_ecdsa_bad_pad,
896+
(word32)WSTRLEN(id_ecdsa_bad_pad), WOLFSSH_FORMAT_OPENSSH,
897+
&key, &keySz, &keyType, &keyTypeSz, NULL);
898+
AssertIntEQ(ret, WS_KEY_FORMAT_E);
899+
/* DoOpenSshKey never assigns *outSz, *outType, or *outTypeSz
900+
* on the error branch (only on success),
901+
* these assertions will catch any future regression
902+
* where the API partially writes output before failing. */
903+
AssertNull(key);
904+
AssertIntEQ(keySz, 0);
905+
AssertNull(keyType);
906+
AssertIntEQ(keyTypeSz, 0);
907+
#endif
908+
}
909+
910+
873911
#ifdef WOLFSSH_SCP
874912

875913
static int my_ScpRecv(WOLFSSH* ssh, int state, const char* basePath,
@@ -2079,6 +2117,7 @@ int wolfSSH_ApiTest(int argc, char** argv)
20792117
test_wolfSSH_CTX_UsePrivateKey_buffer_pem();
20802118
test_wolfSSH_CertMan();
20812119
test_wolfSSH_ReadKey();
2120+
test_wolfSSH_ReadKey_badPad();
20822121
test_wolfSSH_QueryAlgoList();
20832122
test_wolfSSH_SetAlgoList();
20842123
#ifdef WOLFSSH_AGENT

0 commit comments

Comments
 (0)