MD5Update(&md5c, passphrase, strlen(passphrase));
MD5Update(&md5c, (unsigned char *)passphrase, strlen(passphrase));
int saversakey(char *filename, struct RSAKey *key, char *passphrase){    unsigned char buf[16384];    unsigned char keybuf[16];    struct MD5Context md5c;    unsigned char *p, *estart;    FILE *fp;    /*     * Write the initial signature.     */    p = buf;    memcpy(p, rsa_signature, sizeof(rsa_signature));    p += sizeof(rsa_signature);    /*     * One byte giving encryption type, and one reserved (zero)     * uint32.     */    *p++ = (passphrase ? SSH_CIPHER_3DES : 0);    PUT_32BIT(p, 0);    p += 4;    /*     * An ordinary SSH 1 public key consists of: a uint32     * containing the bit count, then two bignums containing the     * modulus and exponent respectively.     */    PUT_32BIT(p, bignum_bitcount(key->modulus));    p += 4;    p += ssh1_write_bignum(p, key->modulus);    p += ssh1_write_bignum(p, key->exponent);    /*     * A string containing the comment field.     */    if (key->comment) {	PUT_32BIT(p, strlen(key->comment));	p += 4;	memcpy(p, key->comment, strlen(key->comment));	p += strlen(key->comment);    } else {	PUT_32BIT(p, 0);	p += 4;    }    /*     * The encrypted portion starts here.     */    estart = p;    /*     * Two bytes, then the same two bytes repeated.     */    *p++ = random_byte();    *p++ = random_byte();    p[0] = p[-2];    p[1] = p[-1];    p += 2;    /*     * Four more bignums: the decryption exponent, then iqmp, then     * q, then p.     */    p += ssh1_write_bignum(p, key->private_exponent);    p += ssh1_write_bignum(p, key->iqmp);    p += ssh1_write_bignum(p, key->q);    p += ssh1_write_bignum(p, key->p);    /*     * Now write zeros until the encrypted portion is a multiple of     * 8 bytes.     */    while ((p - estart) % 8)	*p++ = '\0';    /*     * Now encrypt the encrypted portion.     */    if (passphrase) {	MD5Init(&md5c);	MD5Update(&md5c, passphrase, strlen(passphrase));	MD5Final(keybuf, &md5c);	des3_encrypt_pubkey(keybuf, estart, p - estart);	memset(keybuf, 0, sizeof(keybuf));	/* burn the evidence */    }    /*     * Done. Write the result to the file.     */    fp = fopen(filename, "wb");    if (fp) {	int ret = (fwrite(buf, 1, p - buf, fp) == (size_t) (p - buf));	ret = ret && (fclose(fp) == 0);	return ret;    } else	return 0;}