i += ssh1_read_bignum(buf+i, &key->p);
if (len-i < 0) goto end;
- ret = 1;
+ if (!rsa_verify(key)) {
+ freersakey(key);
+ ret = 0;
+ } else
+ ret = 1;
+
end:
memset(buf, 0, sizeof(buf)); /* burn the evidence */
return ret;
*
* where the sequence-number increases from zero. As many of these
* hashes are used as necessary.
+ *
+ * NOTE! It is important that all _public_ data can be verified
+ * with reference to the _private_ data. There exist attacks based
+ * on modifying the public key but leaving the private section
+ * intact.
+ *
+ * With RSA, this is easy: verify that n = p*q, and also verify
+ * that e*d == 1 modulo (p-1)(q-1). With DSA (if we were ever to
+ * support it), we would need to store extra data in the private
+ * section other than just x.
*/
static int read_header(FILE *fp, char *header) {
{
char realhash[41];
unsigned char binary[20];
- SHA_State s;
SHA_Simple(private_blob, private_blob_len, binary);
for (i = 0; i < 20; i++)
ret->comment = comment;
ret->data = alg->createkey(public_blob, public_blob_len,
private_blob, private_blob_len);
+ if (!ret->data) {
+ sfree(ret->comment);
+ sfree(ret);
+ ret = NULL;
+ }
sfree(public_blob);
sfree(private_blob);
return ret;
FILE *fp;
char header[40], *b;
const struct ssh_signkey *alg;
- int cipher, cipherblk;
unsigned char *public_blob;
int public_blob_len;
int i;