if (len < 4)
goto error;
bytes = GET_32BIT(d);
- if (len < 4+bytes)
+ if (bytes < 0 || len-4 < bytes)
goto error;
ret->start = d + 4;
const char **errmsg_p)
{
struct openssh_key *ret;
- FILE *fp;
+ FILE *fp = NULL;
char *line = NULL;
char *errmsg, *p;
int headers_done;
line = NULL;
}
+ fclose(fp);
+ fp = NULL;
+
if (ret->keyblob_len == 0 || !ret->keyblob) {
errmsg = "key body not present";
goto error;
sfree(ret);
}
if (errmsg_p) *errmsg_p = errmsg;
+ if (fp) fclose(fp);
return NULL;
}
p = key->keyblob;
- /* Expect the SEQUENCE header. Take its absence as a failure to decrypt. */
+ /* Expect the SEQUENCE header. Take its absence as a failure to
+ * decrypt, if the key was encrypted. */
ret = ber_read_id_len(p, key->keyblob_len, &id, &len, &flags);
p += ret;
if (ret < 0 || id != 16) {
errmsg = "ASN.1 decoding failure";
- retval = SSH2_WRONG_PASSPHRASE;
+ retval = key->encrypted ? SSH2_WRONG_PASSPHRASE : NULL;
goto error;
}
if (ret < 0 || id != 2 ||
key->keyblob+key->keyblob_len-p < len) {
errmsg = "ASN.1 decoding failure";
- retval = SSH2_WRONG_PASSPHRASE;
+ retval = key->encrypted ? SSH2_WRONG_PASSPHRASE : NULL;
goto error;
}