Merge pull request #625 from ejohnstown/known-hosts-fix

Known Hosts Update
pull/628/head
JacobBarthelmeh 2023-12-01 10:42:01 -07:00 committed by GitHub
commit e2ee49f064
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
1 changed files with 23 additions and 15 deletions

View File

@ -273,20 +273,22 @@ int ClientPublicKeyCheck(const byte* pubKey, word32 pubKeySz, void* ctx)
char *env; char *env;
env = getenv("HOME"); env = getenv("HOME");
sz = (word32)(WSTRLEN(env) + WSTRLEN(defaultName) + 1); if (env != NULL) {
knownHostsName = (char*)WMALLOC(sz, NULL, 0); sz = (word32)(WSTRLEN(env) + WSTRLEN(defaultName) + 1);
if (knownHostsName != NULL) { knownHostsName = (char*)WMALLOC(sz, NULL, 0);
WSTRCPY(knownHostsName, env); if (knownHostsName != NULL) {
WSTRCAT(knownHostsName, defaultName); WSTRCPY(knownHostsName, env);
WSTRCAT(knownHostsName, defaultName);
}
} }
else
ret = -1;
} }
sz = 0; if (ret == 0) {
ret = load_der_file(knownHostsName, (byte**)&knownHosts, &sz); sz = 0;
/* load_der_file() loads exactly what's in the file. Since it is ret = load_der_file(knownHostsName, (byte**)&knownHosts, &sz);
* NL terminated lines of known host data, and the last line ends }
* in a NL, overwrite that with a nul to terminate the new string. */
knownHosts[sz - 1] = 0;
if (ret == 0) { if (ret == 0) {
if (sz < sizeof(word32)) { if (sz < sizeof(word32)) {
@ -297,6 +299,11 @@ int ClientPublicKeyCheck(const byte* pubKey, word32 pubKeySz, void* ctx)
} }
if (ret == 0) { if (ret == 0) {
/* load_der_file() loads exactly what's in the file. Since it is
* NL terminated lines of known host data, and the last line ends
* in a NL, overwrite that with a nul to terminate the new string. */
knownHosts[sz - 1] = 0;
encodedKey = (char*)WMALLOC(WOLFSSH_CLIENT_ENCKEY_SIZE_ESTIMATE encodedKey = (char*)WMALLOC(WOLFSSH_CLIENT_ENCKEY_SIZE_ESTIMATE
+ WOLFSSH_CLIENT_PUBKEYTYPE_SIZE_ESTIMATE + WOLFSSH_CLIENT_PUBKEYTYPE_SIZE_ESTIMATE
+ WOLFSSH_CLIENT_FINGERPRINT_SIZE_ESTIMATE, NULL, 0); + WOLFSSH_CLIENT_FINGERPRINT_SIZE_ESTIMATE, NULL, 0);
@ -306,8 +313,6 @@ int ClientPublicKeyCheck(const byte* pubKey, word32 pubKeySz, void* ctx)
} }
if (ret == 0) { if (ret == 0) {
word32 keySz;
pubKeyType = encodedKey + WOLFSSH_CLIENT_ENCKEY_SIZE_ESTIMATE; pubKeyType = encodedKey + WOLFSSH_CLIENT_ENCKEY_SIZE_ESTIMATE;
fp = pubKeyType + WOLFSSH_CLIENT_PUBKEYTYPE_SIZE_ESTIMATE; fp = pubKeyType + WOLFSSH_CLIENT_PUBKEYTYPE_SIZE_ESTIMATE;
@ -316,8 +321,9 @@ int ClientPublicKeyCheck(const byte* pubKey, word32 pubKeySz, void* ctx)
fp[0] = 0; fp[0] = 0;
/* Get the key type out of the key. */ /* Get the key type out of the key. */
ato32(pubKey, &keySz); ato32(pubKey, &sz);
if (keySz > sz - sizeof(word32)) { if ((sz > pubKeySz - sizeof(word32))
|| (sz > WOLFSSH_CLIENT_PUBKEYTYPE_SIZE_ESTIMATE - 1)) {
ret = -1; ret = -1;
} }
} }
@ -479,6 +485,8 @@ int ClientPublicKeyCheck(const byte* pubKey, word32 pubKeySz, void* ctx)
WFREE(encodedKey, NULL, 0); WFREE(encodedKey, NULL, 0);
if (knownHosts) if (knownHosts)
WFREE(knownHosts, NULL, 0); WFREE(knownHosts, NULL, 0);
if (knownHostsName)
WFREE(knownHostsName, NULL, 0);
return ret; return ret;
} }