mirror of https://github.com/wolfSSL/wolfssh.git
PrepareUserAuthRequestEcc Missing Bounds Checks
For agent ECC public key parsing, replaced parsing the data by hand with the GetSkip() and GetStringRef() functions which do bounds checking. Affected function: PrepareUserAuthRequestEcc. Issue: F-526pull/892/head
parent
6638c01bbb
commit
6a3e97d12b
|
|
@ -14400,19 +14400,32 @@ static int PrepareUserAuthRequestEcc(WOLFSSH* ssh, word32* payloadSz,
|
|||
word32 idx = 0;
|
||||
#ifdef WOLFSSH_AGENT
|
||||
if (ssh->agentEnabled) {
|
||||
word32 sz;
|
||||
const byte* c = (const byte*)authData->sf.publicKey.publicKey;
|
||||
const byte* publicKey = NULL;
|
||||
word32 publicKeySz;
|
||||
|
||||
ato32(c + idx, &sz);
|
||||
idx += LENGTH_SZ + sz;
|
||||
ato32(c + idx, &sz);
|
||||
idx += LENGTH_SZ + sz;
|
||||
ato32(c + idx, &sz);
|
||||
idx += LENGTH_SZ;
|
||||
c += idx;
|
||||
idx = 0;
|
||||
|
||||
ret = wc_ecc_import_x963(c, sz, &keySig->ks.ecc.key);
|
||||
ret = GetSkip((const byte*)authData->sf.publicKey.publicKey,
|
||||
authData->sf.publicKey.publicKeySz, &idx);
|
||||
if (ret == WS_SUCCESS) {
|
||||
ret = GetSkip((const byte*)authData->sf.publicKey.publicKey,
|
||||
authData->sf.publicKey.publicKeySz, &idx);
|
||||
}
|
||||
if (ret == WS_SUCCESS) {
|
||||
ret = GetStringRef(&publicKeySz, &publicKey,
|
||||
(const byte*)authData->sf.publicKey.publicKey,
|
||||
authData->sf.publicKey.publicKeySz, &idx);
|
||||
}
|
||||
if (ret == WS_SUCCESS) {
|
||||
ret = wc_ecc_import_x963(publicKey, publicKeySz,
|
||||
&keySig->ks.ecc.key);
|
||||
}
|
||||
if (ret != 0) {
|
||||
WLOG(WS_LOG_ERROR,
|
||||
"wc_ecc_import_x963 failed, ret = %d", ret);
|
||||
ret = WS_ECC_E;
|
||||
}
|
||||
else {
|
||||
ret = WS_SUCCESS;
|
||||
}
|
||||
}
|
||||
else
|
||||
#endif
|
||||
|
|
|
|||
Loading…
Reference in New Issue