{
char tmp[100];
unsigned char tmps[2];
- char *cp;
memset(rid, 0, sizeof(rid));
switch(id_type) {
case SILC_ID_SERVER:
{
SilcServerID *server_id = (SilcServerID *)id;
- if (server_id->ip.data_len > 4) {
-#ifdef HAVE_IPV6
- struct sockaddr_in6 ipv6;
- memset(&ipv6, 0, sizeof(ipv6));
- ipv6.sin6_family = AF_INET6;
- memmove(&ipv6.sin6_addr, server_id->ip.data, sizeof(ipv6.sin6_addr));
- if (!getnameinfo((struct sockaddr *)&ipv6, sizeof(ipv6),
- tmp, sizeof(tmp) - 1, NULL, 0, NI_NUMERICHOST))
- _PUT_STRING(rid, tmp);
-#endif
- } else {
- struct in_addr ipv4;
- memmove(&ipv4.s_addr, server_id->ip.data, 4);
- cp = inet_ntoa(ipv4);
- if (cp)
- _PUT_STRING(rid, cp);
- }
+
+ if (!silc_net_bin2addr(server_id->ip.data, server_id->ip.data_len,
+ tmp, sizeof(tmp)))
+ return NULL;
memset(tmp, 0, sizeof(tmp));
- silc_snprintf(tmp, sizeof(tmp) - 1, ",%d,", ntohs(server_id->port));
+ silc_snprintf(tmp, sizeof(tmp) - 1, ",%d,", silc_ntohs(server_id->port));
_PUT_STRING(rid, tmp);
SILC_PUT16_MSB(server_id->rnd, tmps);
memset(tmp, 0, sizeof(tmp));
case SILC_ID_CLIENT:
{
SilcClientID *client_id = (SilcClientID *)id;
- if (client_id->ip.data_len > 4) {
-#ifdef HAVE_IPV6
- struct sockaddr_in6 ipv6;
- memset(&ipv6, 0, sizeof(ipv6));
- ipv6.sin6_family = AF_INET6;
- memmove(&ipv6.sin6_addr, client_id->ip.data, sizeof(ipv6.sin6_addr));
- if (!getnameinfo((struct sockaddr *)&ipv6, sizeof(ipv6),
- tmp, sizeof(tmp) - 1, NULL, 0, NI_NUMERICHOST))
- _PUT_STRING(rid, tmp);
-#endif
- } else {
- struct in_addr ipv4;
- memmove(&ipv4.s_addr, client_id->ip.data, 4);
- cp = inet_ntoa(ipv4);
- if (cp)
- _PUT_STRING(rid, cp);
- }
+
+ if (!silc_net_bin2addr(client_id->ip.data, client_id->ip.data_len,
+ tmp, sizeof(tmp)))
+ return NULL;
memset(tmp, 0, sizeof(tmp));
silc_snprintf(tmp, sizeof(tmp) - 1, ",%02x,", client_id->rnd);
case SILC_ID_CHANNEL:
{
SilcChannelID *channel_id = (SilcChannelID *)id;
- if (channel_id->ip.data_len > 4) {
-#ifdef HAVE_IPV6
- struct sockaddr_in6 ipv6;
- memset(&ipv6, 0, sizeof(ipv6));
- ipv6.sin6_family = AF_INET6;
- memmove(&ipv6.sin6_addr, channel_id->ip.data, sizeof(ipv6.sin6_addr));
- if (!getnameinfo((struct sockaddr *)&ipv6, sizeof(ipv6),
- tmp, sizeof(tmp) - 1, NULL, 0, NI_NUMERICHOST))
- _PUT_STRING(rid, tmp);
-#endif
- } else {
- struct in_addr ipv4;
- memmove(&ipv4.s_addr, channel_id->ip.data, 4);
- cp = inet_ntoa(ipv4);
- if (cp)
- _PUT_STRING(rid, cp);
- }
+
+ if (!silc_net_bin2addr(channel_id->ip.data, channel_id->ip.data_len,
+ tmp, sizeof(tmp)))
+ return NULL;
memset(tmp, 0, sizeof(tmp));
- silc_snprintf(tmp, sizeof(tmp) - 1, ",%d,", ntohs(channel_id->port));
+ silc_snprintf(tmp, sizeof(tmp) - 1, ",%d,",
+ silc_ntohs(channel_id->port));
_PUT_STRING(rid, tmp);
SILC_PUT16_MSB(channel_id->rnd, tmps);
memset(tmp, 0, sizeof(tmp));
Author: Pekka Riikonen <priikone@silcnet.org>
- Copyright (C) 1997 - 2007 Pekka Riikonen
+ Copyright (C) 1997 - 2008 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
GNU General Public License for more details.
*/
-/* $Id$ */
#include "silc.h"
#include "silcclient.h"
s->buffer = buffer;
/* Finally compute the digital signature of all the data we provided. */
- silc_pkcs_sign(conn->private_key, silc_buffer_data(buffer),
- silc_buffer_len(buffer), TRUE, conn->internal->sha1hash,
- client->rng, silc_client_attributes_process_signed, s);
+ silc_pkcs_sign_async(conn->private_key, silc_buffer_data(buffer),
+ silc_buffer_len(buffer), TRUE, NULL,
+ client->rng, silc_client_attributes_process_signed, s);
}
static void silc_client_attribute_destruct(void *key, void *context,
Author: Pekka Riikonen <priikone@silcnet.org>
- Copyright (C) 2001 - 2007 Pekka Riikonen
+ Copyright (C) 2001 - 2008 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
GNU General Public License for more details.
*/
-/* $Id$ */
#include "silc.h"
#include "silcclient.h"
SILC_CLIENT_MESSAGE_ERROR,
"File `%s' open failed: %s",
session->filepath,
- strerror(errno));
+ silc_errno_string(silc_errno));
if (session->monitor)
(*session->monitor)(session->client, session->conn,
if (!session->listener) {
client->internal->ops->say(client, conn, SILC_CLIENT_MESSAGE_ERROR,
"Cannot create listener for file transfer: "
- "%s", strerror(errno));
+ "%s", silc_errno_string(silc_errno));
+
silc_free(session);
return SILC_CLIENT_FILE_NO_MEMORY;
}
if (!session->listener) {
client->internal->ops->say(client, conn, SILC_CLIENT_MESSAGE_ERROR,
"Cannot create listener for file transfer: "
- "%s", strerror(errno));
+ "%s", silc_errno_string(silc_errno));
+
silc_free(session);
return SILC_CLIENT_FILE_NO_MEMORY;
}
Author: Pekka Riikonen <priikone@silcnet.org>
- Copyright (C) 2007 Pekka Riikonen
+ Copyright (C) 2007 - 2008 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
client, NULL, SILC_CLIENT_MESSAGE_ERROR,
"Cannot create UDP listener on %s on port %d: %s",
params->bind_ip ? params->bind_ip :
- params->local_ip, params->local_port, strerror(errno));
+ params->local_ip, params->local_port,
+ silc_errno_string(silc_errno));
silc_client_listener_free(listener);
if (stream)
silc_stream_destroy(stream);
client, NULL, SILC_CLIENT_MESSAGE_ERROR,
"Cannot create listener on %s on port %d: %s",
params->bind_ip ? params->bind_ip :
- params->local_ip, params->local_port, strerror(errno));
+ params->local_ip, params->local_port,
+ silc_errno_string(silc_errno));
silc_client_listener_free(listener);
return NULL;
}
/* Compute the hash and the signature. */
- op = silc_pkcs_sign(private_key, tmp, tmp_len, TRUE, hash, rng,
- silc_auth_public_key_auth_generate_cb, a);
+ op = silc_pkcs_sign_async(private_key, tmp, tmp_len, TRUE, hash, rng,
+ silc_auth_public_key_auth_generate_cb, a);
memset(tmp, 0, tmp_len);
silc_sfree(stack, tmp);
}
/* Verify the authentication data */
- op = silc_pkcs_verify(public_key, payload->auth_data,
- payload->auth_len, tmp, tmp_len, hash,
- result, context);
+ op = silc_pkcs_verify_async(public_key, payload->auth_data,
+ payload->auth_len, tmp, tmp_len, TRUE, hash,
+ result, context);
memset(tmp, 0, tmp_len);
silc_sfree(payload->stack, tmp);
Author: Pekka Riikonen <priikone@silcnet.org>
- Copyright (C) 2001 - 2007 Pekka Riikonen
+ Copyright (C) 2001 - 2008 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
#ifndef SILCAUTH_H
#define SILCAUTH_H
+#define SILC_DEFAULT_HMAC "hmac-sha1-96"
+#define SILC_DEFAULT_HASH "sha1"
+#define SILC_DEFAULT_PKCS "rsa"
+#define SILC_DEFAULT_CIPHER "aes-256-cbc"
+
/****d* silccore/SilcAuthAPI/SilcAuthMethod
*
* NAME
}
/* Compute signature */
- op = silc_pkcs_sign(private_key, sign->data, silc_buffer_len(sign),
- TRUE, hash, rng,
- silc_message_signed_payload_encode_cb, e);
+ op = silc_pkcs_sign_async(private_key, sign->data, silc_buffer_len(sign),
+ TRUE, hash, rng,
+ silc_message_signed_payload_encode_cb, e);
return op;
}
}
/* Verify the authentication data */
- op = silc_pkcs_verify(remote_public_key, sig->sign_data, sig->sign_len,
- silc_buffer_data(sign), silc_buffer_len(sign),
- hash, result, context);
+ op = silc_pkcs_verify_async(remote_public_key, sig->sign_data,
+ sig->sign_len,
+ silc_buffer_data(sign), silc_buffer_len(sign),
+ TRUE, hash, result, context);
silc_buffer_clear(sign);
silc_buffer_sfree(stack, sign);
Author: Pekka Riikonen <priikone@silcnet.org>
- Copyright (C) 2001 - 2007 Pekka Riikonen
+ Copyright (C) 2001 - 2008 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
(attrs->flags & SILC_SFTP_ATTR_PERMISSIONS ?
attrs->permissions : 0600));
if (fd == -1) {
- (*callback)(sftp, silc_sftp_map_errno(errno), NULL, callback_context);
+ (*callback)(sftp, silc_sftp_map_errno(silc_errno), NULL, callback_context);
return;
}
if (h->fd != -1) {
ret = silc_file_close(h->fd);
if (ret == -1) {
- (*callback)(sftp, silc_sftp_map_errno(errno), NULL, NULL,
+ (*callback)(sftp, silc_sftp_map_errno(silc_errno), NULL, NULL,
callback_context);
return;
}
if (!ret)
(*callback)(sftp, SILC_SFTP_STATUS_EOF, NULL, 0, callback_context);
else
- (*callback)(sftp, silc_sftp_map_errno(errno), NULL, 0, callback_context);
+ (*callback)(sftp, silc_sftp_map_errno(silc_errno),
+ NULL, 0, callback_context);
return;
}
if (!ret)
(*callback)(sftp, SILC_SFTP_STATUS_EOF, NULL, 0, callback_context);
else
- (*callback)(sftp, silc_sftp_map_errno(errno), NULL, 0, callback_context);
+ (*callback)(sftp, silc_sftp_map_errno(silc_errno),
+ NULL, 0, callback_context);
return;
}
/* Attempt to write */
ret = silc_file_write(h->fd, data, data_len);
if (ret <= 0) {
- (*callback)(sftp, silc_sftp_map_errno(errno), NULL, NULL,
+ (*callback)(sftp, silc_sftp_map_errno(silc_errno), NULL, NULL,
callback_context);
return;
}
char long_name[256];
SilcUInt64 filesize = 0;
char *date;
- struct stat stats;
+ SilcFileStatStruct stats;
if (!h->entry->directory) {
(*callback)(sftp, SILC_SFTP_STATUS_FAILURE, NULL, callback_context);
if (!entry->directory) {
filesize = silc_file_size(entry->data + 7);
- memset(&stats, 0, sizeof(stats));
- stat(entry->data + 7, &stats);
+ silc_file_stat(entry->data + 7, TRUE, &stats);
}
/* Long name format is:
attrs->gid = 0;
if (!entry->directory) {
attrs->flags |= SILC_SFTP_ATTR_ACMODTIME;
- attrs->atime = stats.st_atime;
- attrs->mtime = stats.st_mtime;
+ attrs->atime = silc_time_epoch(&stats.last_access);
+ attrs->mtime = silc_time_epoch(&stats.last_mod);
}
/* Add the name */
MemFS fs = (MemFS)context;
MemFSEntry entry;
SilcSFTPAttributes attrs;
- int ret;
- struct stat stats;
+ SilcFileStatStruct stats;
if (!path || !strlen(path))
path = (const char *)DIR_SEPARATOR;
}
/* Get real stat */
- ret = stat(entry->data + 7, &stats);
- if (ret == -1) {
- (*callback)(sftp, silc_sftp_map_errno(errno), NULL, callback_context);
+ if (!silc_file_stat(entry->data + 7, TRUE, &stats)) {
+ (*callback)(sftp, silc_sftp_map_errno(silc_errno), NULL, callback_context);
return;
}
attrs->flags = (SILC_SFTP_ATTR_SIZE |
SILC_SFTP_ATTR_UIDGID |
SILC_SFTP_ATTR_ACMODTIME);
- attrs->size = stats.st_size;
+ attrs->size = stats.size;
attrs->uid = 0; /* We use always 0 UID and GID */
attrs->gid = 0;
- attrs->atime = stats.st_atime;
- attrs->mtime = stats.st_mtime;
+ attrs->atime = silc_time_epoch(&stats.last_access);
+ attrs->mtime = silc_time_epoch(&stats.last_mod);
/* Return attributes */
(*callback)(sftp, SILC_SFTP_STATUS_OK, (const SilcSFTPAttributes)attrs,
MemFS fs = (MemFS)context;
MemFSEntry entry;
SilcSFTPAttributes attrs;
- int ret;
- struct stat stats;
+ SilcFileStatStruct stats;
if (!path || !strlen(path))
path = (const char *)DIR_SEPARATOR;
}
/* Get real stat */
-#ifdef SILC_WIN32
- ret = stat(entry->data + 7, &stats);
-#endif /* SILC_WIN32 */
-#ifdef SILC_UNIX
- ret = lstat(entry->data + 7, &stats);
-#endif /* SILC_UNIX */
-#ifdef SILC_SYMBIAN
- ret = stat(entry->data + 7, &stats);
-#endif /* SILC_SYMBIAN */
- if (ret == -1) {
- (*callback)(sftp, silc_sftp_map_errno(errno), NULL, callback_context);
+ if (!silc_file_stat(entry->data + 7, FALSE, &stats)) {
+ (*callback)(sftp, silc_sftp_map_errno(silc_errno), NULL, callback_context);
return;
}
attrs->flags = (SILC_SFTP_ATTR_SIZE |
SILC_SFTP_ATTR_UIDGID |
SILC_SFTP_ATTR_ACMODTIME);
- attrs->size = stats.st_size;
+ attrs->size = stats.size;
attrs->uid = 0; /* We use always 0 UID and GID */
attrs->gid = 0;
- attrs->atime = stats.st_atime;
- attrs->mtime = stats.st_mtime;
+ attrs->atime = silc_time_epoch(&stats.last_access);
+ attrs->mtime = silc_time_epoch(&stats.last_mod);
/* Return attributes */
(*callback)(sftp, SILC_SFTP_STATUS_OK, (const SilcSFTPAttributes)attrs,
{
MemFSFileHandle h = (MemFSFileHandle)handle;
SilcSFTPAttributes attrs;
- int ret;
- struct stat stats;
+ SilcFileStatStruct stats;
if (h->entry->directory || !h->entry->data) {
(*callback)(sftp, SILC_SFTP_STATUS_FAILURE, NULL, callback_context);
}
/* Get real stat */
- ret = fstat(h->fd, &stats);
- if (ret == -1) {
- (*callback)(sftp, silc_sftp_map_errno(errno), NULL, callback_context);
+ if (!silc_file_fstat(h->fd, &stats)) {
+ (*callback)(sftp, silc_sftp_map_errno(silc_errno), NULL, callback_context);
return;
}
attrs->flags = (SILC_SFTP_ATTR_SIZE |
SILC_SFTP_ATTR_UIDGID |
SILC_SFTP_ATTR_ACMODTIME);
- attrs->size = stats.st_size;
+ attrs->size = stats.size;
attrs->uid = 0; /* We use always 0 UID and GID */
attrs->gid = 0;
- attrs->atime = stats.st_atime;
- attrs->mtime = stats.st_mtime;
+ attrs->atime = silc_time_epoch(&stats.last_access);
+ attrs->mtime = silc_time_epoch(&stats.last_mod);
/* Return attributes */
(*callback)(sftp, SILC_SFTP_STATUS_OK, (const SilcSFTPAttributes)attrs,
Author: Pekka Riikonen <priikone@silcnet.org>
- Copyright (C) 2001 - 2007 Pekka Riikonen
+ Copyright (C) 2001 - 2008 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
/* Maps errno to SFTP status message. */
-SilcSFTPStatus silc_sftp_map_errno(int err)
+SilcSFTPStatus silc_sftp_map_errno(SilcResult err)
{
SilcSFTPStatus ret;
case 0:
ret = SILC_SFTP_STATUS_OK;
break;
- case ENOENT:
- case ENOTDIR:
- case EBADF:
+ case SILC_ERR_NOT_DIRECTORY:
+ case SILC_ERR_NO_SUCH_FILE:
+ case SILC_ERR_BAD_FD:
ret = SILC_SFTP_STATUS_NO_SUCH_FILE;
break;
- case EPERM:
- case EACCES:
- case EFAULT:
+ case SILC_ERR_PERMISSION_DENIED:
ret = SILC_SFTP_STATUS_PERMISSION_DENIED;
break;
- case ENAMETOOLONG:
- case EINVAL:
+ case SILC_ERR_INVALID_ARGUMENT:
ret = SILC_SFTP_STATUS_BAD_MESSAGE;
break;
default:
/*
- sftp_util.h
+ sftp_util.h
Author: Pekka Riikonen <priikone@silcnet.org>
buffer. If `packet_buf' is non-NULL then the new packet data is put
to that buffer instead of allocating new one. If the new data cannot
fit to `packet_buf' will be reallocated. */
-SilcBuffer silc_sftp_packet_encode(SilcSFTPPacket packet,
+SilcBuffer silc_sftp_packet_encode(SilcSFTPPacket packet,
SilcBuffer packet_buf, SilcUInt32 len, ...);
/* Same as silc_sftp_packet_encode but takes the variable argument list
pointer as argument. */
-SilcBuffer silc_sftp_packet_encode_vp(SilcSFTPPacket packet,
- SilcBuffer packet_buf, SilcUInt32 len,
+SilcBuffer silc_sftp_packet_encode_vp(SilcSFTPPacket packet,
+ SilcBuffer packet_buf, SilcUInt32 len,
va_list vp);
/* Decodes the SFTP packet data `data' and return the SFTP packet type.
void silc_sftp_name_add(SilcSFTPName name, const char *short_name,
const char *long_name, SilcSFTPAttributes attrs);
-/* Encodes the SilcSFTPName to a buffer and returns the allocated buffer.
+/* Encodes the SilcSFTPName to a buffer and returns the allocated buffer.
The caller must free the buffer. */
SilcBuffer silc_sftp_name_encode(SilcSFTPName name);
void silc_sftp_name_free(SilcSFTPName name);
/* Maps errno to SFTP status message. */
-SilcSFTPStatus silc_sftp_map_errno(int err);
+SilcSFTPStatus silc_sftp_map_errno(SilcResult err);
#endif /* SFTP_UTIL_H */
SILC_STR_END);
/* Compute signature */
- op = silc_pkcs_sign(private_key, auth->data, silc_buffer_len(auth),
- TRUE, ske->prop->hash, ske->rng,
- silc_connauth_get_signature_cb, connauth);
+ op = silc_pkcs_sign_async(private_key, auth->data, silc_buffer_len(auth),
+ TRUE, ske->prop->hash, ske->rng,
+ silc_connauth_get_signature_cb, connauth);
silc_buffer_free(auth);
SILC_STR_END);
/* Verify signature */
- op = silc_pkcs_verify(pub_key, sign, sign_len, auth->data,
- silc_buffer_len(auth), ske->prop->hash,
- silc_connauth_verify_signature_cb, connauth);
+ op = silc_pkcs_verify_async(pub_key, sign, sign_len, auth->data,
+ silc_buffer_len(auth), TRUE, ske->prop->hash,
+ silc_connauth_verify_signature_cb, connauth);
silc_buffer_free(auth);
/* Sign the hash value */
SILC_FSM_CALL(ske->key_op =
- silc_pkcs_sign(ske->private_key, hash, hash_len, FALSE,
- ske->prop->hash, ske->rng,
- silc_ske_initiator_sign_cb, ske));
+ silc_pkcs_sign_async(ske->private_key, hash, hash_len, FALSE,
+ ske->prop->hash, ske->rng,
+ silc_ske_initiator_sign_cb, ske));
/* NOT REACHED */
}
/* Verify signature */
SILC_FSM_CALL(ske->key_op =
- silc_pkcs_verify(ske->prop->public_key, payload->sign_data,
- payload->sign_len, hash, hash_len, NULL,
- silc_ske_verify_cb, ske));
+ silc_pkcs_verify_async(ske->prop->public_key,
+ payload->sign_data,
+ payload->sign_len, hash,
+ hash_len, FALSE, NULL,
+ silc_ske_verify_cb, ske));
/* NOT REACHED */
}
/* Verify signature */
SILC_FSM_CALL(ske->key_op =
- silc_pkcs_verify(ske->prop->public_key,
- recv_payload->sign_data,
- recv_payload->sign_len,
- hash, hash_len, NULL,
- silc_ske_verify_cb, ske));
+ silc_pkcs_verify_async(ske->prop->public_key,
+ recv_payload->sign_data,
+ recv_payload->sign_len,
+ hash, hash_len, FALSE, NULL,
+ silc_ske_verify_cb, ske));
/* NOT REACHED */
}
/* Sign the hash value */
SILC_FSM_CALL(ske->key_op =
- silc_pkcs_sign(ske->private_key, hash, hash_len, FALSE,
- ske->prop->hash, ske->rng,
- silc_ske_responder_sign_cb, ske));
+ silc_pkcs_sign_async(ske->private_key, hash, hash_len, FALSE,
+ ske->prop->hash, ske->rng,
+ silc_ske_responder_sign_cb, ske));
/* NOT REACHED */
}