Author: Pekka Riikonen <priikone@silcnet.org>
- Copyright (C) 1997 - 2006 Pekka Riikonen
+ Copyright (C) 1997 - 2007 Pekka Riikonen
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
if (ret == -1)
goto err;
+ /* Backwards compatibility */
+ if (totlen == key_len)
+ totlen -= 4;
+
if (totlen + 4 != key_len)
goto err;
/* Check file magic */
SILC_GET32_MSB(magic, filedata);
if (magic != SILC_PKCS_PRIVATE_KEY_MAGIC) {
- SILC_LOG_ERROR(("Private key does not have correct magic"));
+ SILC_LOG_DEBUG(("Private key does not have correct magic"));
return FALSE;
}
silc_hash_final(sha1, keymat + 16);
/* Set the key to the cipher */
- silc_cipher_set_key(aes, keymat, 256);
+ silc_cipher_set_key(aes, keymat, 256, FALSE);
/* First, verify the MAC of the private key data */
mac_len = silc_hmac_len(sha1hmac);
/* Parse the RSA SILC private key */
SilcBufferStruct k;
SilcMPInt n, e, d, dp, dq, qp, p, q;
- SilcMPInt version;
unsigned char *tmp;
SilcUInt32 len, ver;
}
/* Encode to PKCS #1 format */
- silc_mp_init(&version);
- silc_mp_set_ui(&version, 0);
memset(&alg_key, 0, sizeof(alg_key));
if (!silc_asn1_encode(asn1, &alg_key,
SILC_ASN1_SEQUENCE,
- SILC_ASN1_INT(&version),
+ SILC_ASN1_SHORT_INT(0),
SILC_ASN1_INT(&n),
SILC_ASN1_INT(&e),
SILC_ASN1_INT(&d),
SILC_ASN1_END, SILC_ASN1_END))
goto err;
- silc_mp_uninit(&version);
silc_mp_uninit(&n);
silc_mp_uninit(&e);
silc_mp_uninit(&e);
silc_hash_final(sha1, keymat + 16);
/* Set the key to the cipher */
- silc_cipher_set_key(aes, keymat, 256);
+ silc_cipher_set_key(aes, keymat, 256, TRUE);
/* Encode the buffer to be encrypted. Add padding to it too, at least
block size of the cipher. */
SilcUInt32 src_len,
unsigned char *dst,
SilcUInt32 dst_size,
- SilcUInt32 *ret_dst_len)
+ SilcUInt32 *ret_dst_len,
+ SilcRng rng)
{
SilcSILCPublicKey silc_pubkey = public_key;
return silc_pubkey->pkcs->encrypt(silc_pubkey->public_key,
src, src_len,
- dst, dst_size, ret_dst_len);
+ dst, dst_size, ret_dst_len, rng);
}
/* Decrypts as specified in SILC protocol specification */