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
{
SilcUInt32 i, len;
unsigned char *data = NULL;
- SilcBool ret;
+ int ret;
SILC_LOG_DEBUG(("Parsing SILC public key file"));
break;
case SILC_PKCS_FILE_BASE64:
- data = silc_pem_decode(filedata, filedata_len, &filedata_len);
+ data = silc_base64_decode(filedata, filedata_len, &filedata_len);
if (!data)
return FALSE;
filedata = data;
ret_public_key);
silc_free(data);
- return ret;
+ return ret ? TRUE : FALSE;
}
/* Imports SILC protocol style public key */
-SilcBool silc_pkcs_silc_import_public_key(unsigned char *key,
- SilcUInt32 key_len,
- void **ret_public_key)
+int silc_pkcs_silc_import_public_key(unsigned char *key,
+ SilcUInt32 key_len,
+ void **ret_public_key)
{
const SilcPKCSAlgorithm *pkcs;
SilcBufferStruct buf, alg_key;
SILC_LOG_DEBUG(("Parsing SILC public key"));
if (!ret_public_key)
- return FALSE;
+ return 0;
silc_buffer_set(&buf, key, key_len);
/* Get length */
ret = silc_buffer_unformat(&buf,
+ SILC_STR_ADVANCE,
SILC_STR_UI_INT(&totlen),
SILC_STR_END);
if (ret == -1)
/* Get algorithm name and identifier */
ret =
silc_buffer_unformat(&buf,
- SILC_STR_OFFSET(4),
+ SILC_STR_ADVANCE,
SILC_STR_UI16_NSTRING_ALLOC(&pkcs_name, &pkcs_len),
SILC_STR_UI16_NSTRING_ALLOC(&ident, &identifier_len),
SILC_STR_END);
goto err;
/* Get key data */
- silc_buffer_pull(&buf, 4 + 2 + pkcs_len + 2 + identifier_len);
keydata_len = silc_buffer_len(&buf);
ret = silc_buffer_unformat(&buf,
- SILC_STR_UI_XNSTRING(&key_data,
- keydata_len),
+ SILC_STR_DATA(&key_data, keydata_len),
SILC_STR_END);
if (ret == -1)
goto err;
}
/* Import PKCS algorithm public key */
- if (pkcs->import_public_key)
- if (!pkcs->import_public_key(alg_key.data, silc_buffer_len(&alg_key),
- &silc_pubkey->public_key))
- goto err;
+ if (!pkcs->import_public_key(alg_key.data, silc_buffer_len(&alg_key),
+ &silc_pubkey->public_key))
+ goto err;
silc_free(pkcs_name);
silc_free(ident);
*ret_public_key = silc_pubkey;
- return TRUE;
+ return key_len;
err:
silc_free(pkcs_name);
silc_free(silc_pubkey);
if (asn1)
silc_asn1_free(asn1);
- return FALSE;
+ return 0;
}
/* Exports public key as SILC protocol style public key file */
break;
case SILC_PKCS_FILE_BASE64:
- data = silc_pem_encode_file(key, key_len);
+ data = silc_base64_encode_file(key, key_len);
if (!data)
return NULL;
silc_free(key);
SilcUInt32 blocklen;
unsigned char tmp[32], keymat[64], *data = NULL;
SilcUInt32 i, len, magic, mac_len;
- SilcBool ret;
+ int ret;
SILC_LOG_DEBUG(("Parsing SILC private key file"));
break;
case SILC_PKCS_FILE_BASE64:
- data = silc_pem_decode(filedata, filedata_len, &len);
+ data = silc_base64_decode(filedata, filedata_len, &len);
if (!data)
return FALSE;
filedata = data;
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);
silc_free(data);
- return ret;
+ return ret ? TRUE : FALSE;
}
/* Private key version */
/* Imports SILC implementation style private key */
-SilcBool silc_pkcs_silc_import_private_key(unsigned char *key,
- SilcUInt32 key_len,
- void **ret_private_key)
+int silc_pkcs_silc_import_private_key(unsigned char *key,
+ SilcUInt32 key_len,
+ void **ret_private_key)
{
SilcBufferStruct buf;
const SilcPKCSAlgorithm *pkcs;
SILC_LOG_DEBUG(("Parsing SILC private key"));
if (!ret_private_key)
- return FALSE;
+ return 0;
silc_buffer_set(&buf, key, key_len);
}
/* Import PKCS algorithm private key */
- if (pkcs->import_private_key)
- if (!pkcs->import_private_key(alg_key.data, silc_buffer_len(&alg_key),
- &silc_privkey->private_key))
- goto err;
+ if (!pkcs->import_private_key(alg_key.data, silc_buffer_len(&alg_key),
+ &silc_privkey->private_key))
+ goto err;
silc_free(pkcs_name);
silc_asn1_free(asn1);
*ret_private_key = silc_privkey;
- return TRUE;
+ return key_len;
err:
silc_free(pkcs_name);
silc_free(silc_privkey);
if (asn1)
silc_asn1_free(asn1);
- return FALSE;
+ return 0;
}
/* Exports private key as SILC implementation style private key file */
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. */
break;
case SILC_PKCS_FILE_BASE64:
- data = silc_pem_encode_file(enc->data, silc_buffer_len(enc));
+ data = silc_base64_encode_file(enc->data, silc_buffer_len(enc));
if (!data) {
silc_buffer_clear(enc);
silc_buffer_free(enc);
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 */