From ebfae3bbce6fed0dece516307f537ce5e270e7e0 Mon Sep 17 00:00:00 2001 From: Pekka Riikonen Date: Thu, 19 Oct 2006 07:19:18 +0000 Subject: [PATCH] Added lib/silcapputil for SILC application specific util routines. --- lib/Makefile.ad | 4 +- lib/configure.ad | 11 +- lib/silcapputil/DIRECTORY | 22 ++ lib/silcapputil/Makefile.ad | 40 +++ lib/{silcutil => silcapputil}/silcapputil.c | 122 ++++++- lib/silcapputil/silcapputil.h | 300 +++++++++++++++++ lib/silcapputil/silcidcache.c | 341 ++++++++++++++++++++ lib/silcapputil/silcidcache.h | 335 +++++++++++++++++++ lib/silcutil/DIRECTORY | 1 - lib/silcutil/Makefile.ad | 2 - lib/silcutil/silcapputil.h | 151 --------- lib/silcutil/silclog.c | 4 +- lib/silcutil/silcstrutil.c | 120 ------- lib/silcutil/silcstrutil.h | 150 +-------- 14 files changed, 1165 insertions(+), 438 deletions(-) create mode 100644 lib/silcapputil/DIRECTORY create mode 100644 lib/silcapputil/Makefile.ad rename lib/{silcutil => silcapputil}/silcapputil.c (74%) create mode 100644 lib/silcapputil/silcapputil.h create mode 100644 lib/silcapputil/silcidcache.c create mode 100644 lib/silcapputil/silcidcache.h delete mode 100644 lib/silcutil/silcapputil.h diff --git a/lib/Makefile.ad b/lib/Makefile.ad index 4622541c..fbcaca3a 100644 --- a/lib/Makefile.ad +++ b/lib/Makefile.ad @@ -26,6 +26,7 @@ SILCLIB_DIRS = \ contrib \ silccore \ silcutil \ + silcapputil \ silccrypt \ #ifdef SILC_DIST_SKR silcskr \ @@ -43,9 +44,6 @@ SILCLIB_DIRS = \ #ifdef SILC_DIST_HTTP silchttp \ #endif SILC_DIST_HTTP -#ifdef SILC_DIST_IDCACHE - silcidcache \ -#endif SILC_DIST_IDCACHE #ifdef SILC_DIST_IDCACHE silcvcard \ #endif SILC_DIST_IDCACHE diff --git a/lib/configure.ad b/lib/configure.ad index c065b9b7..aae01802 100644 --- a/lib/configure.ad +++ b/lib/configure.ad @@ -31,6 +31,7 @@ SILC_LIB_INCLUDES="$SILC_LIB_INCLUDES -I$SILC_TOP_SRCDIR/lib/silccrypt" SILC_LIB_INCLUDES="$SILC_LIB_INCLUDES -I$SILC_TOP_SRCDIR/lib/silcmath" #endif SILC_DIST_MATH SILC_LIB_INCLUDES="$SILC_LIB_INCLUDES -I$SILC_TOP_SRCDIR/lib/silcutil" +SILC_LIB_INCLUDES="$SILC_LIB_INCLUDES -I$SILC_TOP_SRCDIR/lib/silcapputil" SILC_LIB_INCLUDES="$SILC_LIB_INCLUDES -I$SILC_TOP_SRCDIR/lib/silcske" #ifdef SILC_DIST_SFTP SILC_LIB_INCLUDES="$SILC_LIB_INCLUDES -I$SILC_TOP_SRCDIR/lib/silcsftp" @@ -53,9 +54,6 @@ SILC_LIB_INCLUDES="$SILC_LIB_INCLUDES -I$SILC_TOP_SRCDIR/lib/silcserver" #ifdef SILC_DIST_HTTP SILC_LIB_INCLUDES="$SILC_LIB_INCLUDES -I$SILC_TOP_SRCDIR/lib/silchttp" #endif SILC_DIST_HTTP -#ifdef SILC_DIST_IDCACHE -SILC_LIB_INCLUDES="$SILC_LIB_INCLUDES -I$SILC_TOP_SRCDIR/lib/silcidcache" -#endif SILC_DIST_IDCACHE #ifdef SILC_DIST_VCARD SILC_LIB_INCLUDES="$SILC_LIB_INCLUDES -I$SILC_TOP_SRCDIR/lib/silcvcard" #endif SILC_DIST_VCARD @@ -167,6 +165,7 @@ lib/silcutil/win32/Makefile lib/silcutil/beos/Makefile lib/silcutil/os2/Makefile lib/silcutil/epoc/Makefile +lib/silcapputil/Makefile #ifdef SILC_DIST_SFTP lib/silcsftp/Makefile #endif SILC_DIST_SFTP @@ -222,12 +221,6 @@ lib/silchttp/tests/Makefile ) #endif SILC_DIST_HTTP -#ifdef SILC_DIST_IDCACHE -AC_CONFIG_FILES( -lib/silcidcache/Makefile -) -#endif SILC_DIST_IDCACHE - #ifdef SILC_DIST_VCARD AC_CONFIG_FILES( lib/silcvcard/Makefile diff --git a/lib/silcapputil/DIRECTORY b/lib/silcapputil/DIRECTORY new file mode 100644 index 00000000..f58805c9 --- /dev/null +++ b/lib/silcapputil/DIRECTORY @@ -0,0 +1,22 @@ + + +SILC Application Utility Library +
+Directory: lib/silcapputil/ +
+Library: libsilc.a, libsilc.lib +

+Introduction + +

+SILC Application Utility library provides various SILC application +specific utility functions. For example, it provides routines for +creating and loading SILC key pair. + +

+@LINKS@ diff --git a/lib/silcapputil/Makefile.ad b/lib/silcapputil/Makefile.ad new file mode 100644 index 00000000..5bd58063 --- /dev/null +++ b/lib/silcapputil/Makefile.ad @@ -0,0 +1,40 @@ +# +# Makefile.ad +# +# Author: Pekka Riikonen +# +# Copyright (C) 2006 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 +# the Free Software Foundation; version 2 of the License. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# + +AUTOMAKE_OPTIONS = 1.0 no-dependencies foreign + +noinst_LTLIBRARIES = libsilcapputil.la + +libsilcapputil_la_SOURCES = \ + silcapputil.c \ +#ifdef SILC_DIST_IDCACHE + silcidcache.c +#endif SILC_DIST_IDCACHE + +#ifdef SILC_DIST_TOOLKIT +include_HEADERS = \ + silcapputil.h \ +#ifdef SILC_DIST_IDCACHE + silcidcache.h +#endif SILC_DIST_IDCACHE + +SILC_EXTRA_DIST = tests +#endif SILC_DIST_TOOLKIT + +EXTRA_DIST = *.h $(SILC_EXTRA_DIST) + +include $(top_srcdir)/Makefile.defines.in diff --git a/lib/silcutil/silcapputil.c b/lib/silcapputil/silcapputil.c similarity index 74% rename from lib/silcutil/silcapputil.c rename to lib/silcapputil/silcapputil.c index ff85ccf1..fe0ae540 100644 --- a/lib/silcutil/silcapputil.c +++ b/lib/silcapputil/silcapputil.c @@ -4,7 +4,7 @@ Author: Pekka Riikonen - Copyright (C) 2002 - 2005 Pekka Riikonen + Copyright (C) 2002 - 2006 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 @@ -389,3 +389,123 @@ SilcBool silc_change_private_key_passphrase(const char *prv_filename, return TRUE; } + +/* Checks that the 'identifier' string is valid identifier string + and does not contain any unassigned or prohibited character. This + function is used to check for valid nicknames, channel names, + server names, usernames, hostnames, service names, algorithm names, + other security property names, and SILC Public Key name. */ + +unsigned char *silc_identifier_check(const unsigned char *identifier, + SilcUInt32 identifier_len, + SilcStringEncoding identifier_encoding, + SilcUInt32 max_allowed_length, + SilcUInt32 *out_len) +{ + unsigned char *utf8s; + SilcUInt32 utf8s_len; + SilcStringprepStatus status; + + if (!identifier || !identifier_len) + return NULL; + + if (max_allowed_length && identifier_len > max_allowed_length) + return NULL; + + status = silc_stringprep(identifier, identifier_len, + identifier_encoding, SILC_IDENTIFIER_PREP, 0, + &utf8s, &utf8s_len, SILC_STRING_UTF8); + if (status != SILC_STRINGPREP_OK) { + SILC_LOG_DEBUG(("silc_stringprep() status error %d", status)); + return NULL; + } + + if (out_len) + *out_len = utf8s_len; + + return utf8s; +} + +/* Same as above but does not allocate memory, just checks the + validity of the string. */ + +SilcBool silc_identifier_verify(const unsigned char *identifier, + SilcUInt32 identifier_len, + SilcStringEncoding identifier_encoding, + SilcUInt32 max_allowed_length) +{ + SilcStringprepStatus status; + + if (!identifier || !identifier_len) + return FALSE; + + if (max_allowed_length && identifier_len > max_allowed_length) + return FALSE; + + status = silc_stringprep(identifier, identifier_len, + identifier_encoding, SILC_IDENTIFIER_PREP, 0, + NULL, NULL, SILC_STRING_UTF8); + if (status != SILC_STRINGPREP_OK) { + SILC_LOG_DEBUG(("silc_stringprep() status error %d", status)); + return FALSE; + } + + return TRUE; +} + +unsigned char *silc_channel_name_check(const unsigned char *identifier, + SilcUInt32 identifier_len, + SilcStringEncoding identifier_encoding, + SilcUInt32 max_allowed_length, + SilcUInt32 *out_len) +{ + unsigned char *utf8s; + SilcUInt32 utf8s_len; + SilcStringprepStatus status; + + if (!identifier || !identifier_len) + return NULL; + + if (max_allowed_length && identifier_len > max_allowed_length) + return NULL; + + status = silc_stringprep(identifier, identifier_len, + identifier_encoding, SILC_IDENTIFIER_CH_PREP, 0, + &utf8s, &utf8s_len, SILC_STRING_UTF8); + if (status != SILC_STRINGPREP_OK) { + SILC_LOG_DEBUG(("silc_stringprep() status error %d", status)); + return NULL; + } + + if (out_len) + *out_len = utf8s_len; + + return utf8s; +} + +/* Same as above but does not allocate memory, just checks the + validity of the string. */ + +SilcBool silc_channel_name_verify(const unsigned char *identifier, + SilcUInt32 identifier_len, + SilcStringEncoding identifier_encoding, + SilcUInt32 max_allowed_length) +{ + SilcStringprepStatus status; + + if (!identifier || !identifier_len) + return FALSE; + + if (max_allowed_length && identifier_len > max_allowed_length) + return FALSE; + + status = silc_stringprep(identifier, identifier_len, + identifier_encoding, SILC_IDENTIFIER_CH_PREP, 0, + NULL, NULL, SILC_STRING_UTF8); + if (status != SILC_STRINGPREP_OK) { + SILC_LOG_DEBUG(("silc_stringprep() status error %d", status)); + return FALSE; + } + + return TRUE; +} diff --git a/lib/silcapputil/silcapputil.h b/lib/silcapputil/silcapputil.h new file mode 100644 index 00000000..0519c133 --- /dev/null +++ b/lib/silcapputil/silcapputil.h @@ -0,0 +1,300 @@ +/* + + silcapputil.h + + Author: Pekka Riikonen + + Copyright (C) 2002 - 2006 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 + the Free Software Foundation; version 2 of the License. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + +*/ + +/****h* silcutil/SILC Application Utilities + * + * DESCRIPTION + * + * This interface provides utility functions for applications' + * convenience. It provides functions that may be used for example by + * command line applications but also other applications may find some + * routines helpful. None of these routines are mandatory in any other + * SILC routines or libraries, and are purely provided for convenience. + * These routines for example provide simple public key and private key + * pair generation, public key and private key file saving and loading + * for application, and other similar routines. + * + ***/ + +#ifndef SILCAPPUTIL_H +#define SILCAPPUTIL_H + +/****f* silcapputil/SilcAppUtil/silc_create_key_pair + * + * SYNOPSIS + * + * SilcBool silc_create_key_pair(const char *pkcs_name, + * SilcUInt32 key_len_bits, + * const char *pub_filename, + * const char *prv_filename, + * const char *pub_identifier, + * const char *passphrase, + * SilcPublicKey *return_public_key, + * SilcPrivateKey *return_private_key, + * SilcBool interactive); + * + * DESCRIPTION + * + * This routine can be used to generate new public key and private key + * pair. The `pkcs_name' is the name of public key algorithm, or if + * NULL it defaults to "rsa". The `key_len_bits' is the key length + * in bits and if zero (0) it defaults to 2048 bits. The `pub_filename' + * and `prv_filename' is the public key and private key filenames. + * The `pub_identifier' is the public key identifier (for example: + * "UN=foobar, HN=hostname"), or if NULL the routine generates it + * automatically. + * + * The `passphrase' is the passphrase that is used to encrypt the + * private key file. It is recommended that you would protect your + * private key file with a passphrase. + * + * If the `interactive' is TRUE then this asks the user (by blocking + * the process for input) some questions about key generation (like + * public key algorithm, key length, filenames, etc). If all + * arguments are provided to this function already then `interactive' + * has no effect. + * + * NOTES + * + * Before calling this function the application must have initialized + * the crypto library by registering the public key algorithms with + * silc_pkcs_register_default function. + * + ***/ +SilcBool silc_create_key_pair(const char *pkcs_name, + SilcUInt32 key_len_bits, + const char *pub_filename, + const char *prv_filename, + const char *pub_identifier, + const char *passphrase, + SilcPublicKey *return_public_key, + SilcPrivateKey *return_private_key, + SilcBool interactive); + +/****f* silcapputil/SilcAppUtil/silc_load_key_pair + * + * SYNOPSIS + * + * SilcBool silc_load_key_pair(const char *pub_filename, + * const char *prv_filename, + * const char *passphrase, + * SilcPublicKey *return_public_key, + * SilcPrivateKey *return_private_key); + * + * DESCRIPTION + * + * This routine can be used to load the public key and private key + * from files. This retuns FALSE it either of the key could not be + * loaded. This function returns TRUE on success and returns the + * public key into `return_public_key' pointer and private key into + * `return_private_key'. The `passphrase' is the passphrase which + * will be used to decrypt the private key file. + * + ***/ +SilcBool silc_load_key_pair(const char *pub_filename, + const char *prv_filename, + const char *passphrase, + SilcPublicKey *return_public_key, + SilcPrivateKey *return_private_key); + +/****f* silcapputil/SilcAppUtil/silc_show_public_key + * + * SYNOPSIS + * + * SilcBool silc_show_public_key(const char *pub_filename); + * + * DESCRIPTION + * + * This routine can be used to dump the contents of the public key + * in the public key file `pub_filename'. This dumps the public key + * into human readable form into stdout. Returns FALSE on error. + * + ***/ +SilcBool silc_show_public_key(const char *pub_filename); + +/****f* silcapputil/SilcAppUtil/silc_change_private_key_passphrase + * + * SYNOPSIS + * + * SilcBool silc_change_private_key_passphrase(const char *prv_filename, + * const char *old_passphrase, + * const char *new_passphrase); + * + * DESCRIPTION + * + * This routine can be used to change the passphrase of the private + * key file, which is used to encrypt the private key. If the old + * and new passphrase is not provided for this function this will + * prompt for them. + * + ***/ +SilcBool silc_change_private_key_passphrase(const char *prv_filename, + const char *old_passphrase, + const char *new_passphrase); + + +/****f* silcapputil/SilcAppUtil/silc_identifier_check + * + * SYNOPSIS + * + * unsigned char * + * silc_identifier_check(const unsigned char *identifier, + * SilcUInt32 identifier_len, + * SilcStringEncoding identifier_encoding, + * SilcUInt32 max_allowed_length, + * SilcUInt32 *out_len); + * + * DESCRIPTION + * + * Checks that the 'identifier' string is valid identifier string + * and does not contain any unassigned or prohibited character. This + * function is used to check for valid nicknames, server names, + * usernames, hostnames, service names, algorithm names, other security + * property names, and SILC Public Key name. + * + * If the 'max_allowed_length' is non-zero the identifier cannot be + * longer than that, and NULL is returned if it is. If zero (0), no + * length limit exist. For nicknames the max length must be 128 bytes. + * Other identifiers has no default limit, but application may choose + * one anyway. + * + * Returns the validated string, that the caller must free. Returns + * NULL if the identifier string is not valid or contain unassigned or + * prohibited characters. Such identifier strings must not be used + * SILC protocol. The returned string is always in UTF-8 encoding. + * The length of the returned string is in 'out_len'. + * + * NOTES + * + * In addition of validating the identifier string, this function + * may map characters to other characters or remove characters from the + * original string. This is done as defined in the SILC protocol. Error + * is returned only if the string contains unassigned or prohibited + * characters. The original 'identifier' is not modified at any point. + * + ***/ +unsigned char *silc_identifier_check(const unsigned char *identifier, + SilcUInt32 identifier_len, + SilcStringEncoding identifier_encoding, + SilcUInt32 max_allowed_length, + SilcUInt32 *out_len); + +/****f* silcapputil/SilcAppUtil/silc_identifier_verify + * + * SYNOPSIS + * + * SilcBool + * silc_identifier_check(const unsigned char *identifier, + * SilcUInt32 identifier_len, + * SilcStringEncoding identifier_encoding, + * SilcUInt32 max_allowed_length); + * + * DESCRIPTION + * + * Checks that the 'identifier' string is valid identifier string + * and does not contain any unassigned or prohibited character. This + * function is used to check for valid nicknames, server names, + * usernames, hostnames, service names, algorithm names, other security + * property names, and SILC Public Key name. + * + * If the 'max_allowed_length' is non-zero the identifier cannot be + * longer than that, and NULL is returned if it is. If zero (0), no + * length limit exist. For nicknames the max length must be 128 bytes. + * Other identifiers has no default limit, but application may choose + * one anyway. + * + * Returns TRUE if the string is valid and FALSE if it is prohibited. + * + ***/ +SilcBool silc_identifier_verify(const unsigned char *identifier, + SilcUInt32 identifier_len, + SilcStringEncoding identifier_encoding, + SilcUInt32 max_allowed_length); + +/****f* silcapputil/SilcAppUtil/silc_channel_name_check + * + * SYNOPSIS + * + * unsigned char * + * silc_channel_name_check(const unsigned char *identifier, + * SilcUInt32 identifier_len, + * SilcStringEncoding identifier_encoding, + * SilcUInt32 max_allowed_length, + * SilcUInt32 *out_len); + * + * DESCRIPTION + * + * Checks that the 'identifier' string is valid channel name string + * and does not contain any unassigned or prohibited character. + * + * If the 'max_allowed_length' is non-zero the identifier cannot be + * longer than that, and NULL is returned if it is. If zero (0), no + * length limit exist. For channel names the max length must be 256 + * bytes. + * + * Returns the validated string, that the caller must free. Returns + * NULL if the identifier string is not valid or contain unassigned or + * prohibited characters. Such identifier strings must not be used + * SILC protocol. The returned string is always in UTF-8 encoding. + * The length of the returned string is in 'out_len'. + * + * NOTES + * + * In addition of validating the channel name string, this function + * may map characters to other characters or remove characters from the + * original string. This is done as defined in the SILC protocol. Error + * is returned only if the string contains unassigned or prohibited + * characters. The original 'identifier' is not modified at any point. + * + ***/ +unsigned char *silc_channel_name_check(const unsigned char *identifier, + SilcUInt32 identifier_len, + SilcStringEncoding identifier_encoding, + SilcUInt32 max_allowed_length, + SilcUInt32 *out_len); + +/****f* silcapputil/SilcAppUtil/silc_channel_name_verify + * + * SYNOPSIS + * + * SilcBool + * silc_channel_name_check(const unsigned char *identifier, + * SilcUInt32 identifier_len, + * SilcStringEncoding identifier_encoding, + * SilcUInt32 max_allowed_length); + * + * DESCRIPTION + * + * Checks that the 'identifier' string is valid channel name string + * and does not contain any unassigned or prohibited character. + * + * If the 'max_allowed_length' is non-zero the identifier cannot be + * longer than that, and NULL is returned if it is. If zero (0), no + * length limit exist. For channel names the max length must be 256 + * bytes. + * + * Returns TRUE if the string is valid and FALSE if it is prohibited. + * + ***/ +SilcBool silc_channel_name_verify(const unsigned char *identifier, + SilcUInt32 identifier_len, + SilcStringEncoding identifier_encoding, + SilcUInt32 max_allowed_length); + +#endif /* SILCAPPUTIL_H */ diff --git a/lib/silcapputil/silcidcache.c b/lib/silcapputil/silcidcache.c new file mode 100644 index 00000000..05959388 --- /dev/null +++ b/lib/silcapputil/silcidcache.c @@ -0,0 +1,341 @@ +/* + + silcidcache.c + + Author: Pekka Riikonen + + Copyright (C) 2000 - 2006 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 + the Free Software Foundation; version 2 of the License. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + +*/ +/* $Id$ */ + +#include "silc.h" +#include "silcidcache.h" + +/************************** Types and definitions ***************************/ + +/* ID Cache context */ +struct SilcIDCacheStruct { + SilcHashTable id_table; /* ID hash table */ + SilcHashTable name_table; /* Name hash table */ + SilcHashTable context_table; /* Context hash table */ + SilcIDCacheDestructor destructor; /* Entry destructor */ + void *context; /* Destructor context */ + SilcIdType id_type; /* Type of ID cache */ +}; + + +/************************ Static utility functions **************************/ + +/* Callback that is called by the hash table routine when traversing + entries in the hash table. */ + +static void silc_idcache_get_all_foreach(void *key, void *context, + void *user_context) +{ + SilcList *list = user_context; + if (!context) + return; + silc_list_add(*list, context); +} + +/* Cache entry destructor */ + +static void silc_idcache_destructor(SilcIDCache cache, + SilcIDCacheEntry entry, + void *app_context) +{ + if (cache->destructor) + cache->destructor(cache, entry, cache->destructor, app_context); + + memset(entry, 'F', sizeof(*entry)); + silc_free(entry); +} + + +/****************************** Public API **********************************/ + +/* Allocates new ID cache object. */ + +SilcIDCache silc_idcache_alloc(SilcUInt32 count, SilcIdType id_type, + SilcIDCacheDestructor destructor, + void *destructor_context) +{ + SilcIDCache cache; + + SILC_LOG_DEBUG(("Allocating new cache")); + + cache = silc_calloc(1, sizeof(*cache)); + if (!cache) + return NULL; + + cache->id_table = silc_hash_table_alloc(count, silc_hash_id, + SILC_32_TO_PTR(id_type), + silc_hash_id_compare, + SILC_32_TO_PTR(id_type), + NULL, NULL, TRUE); + cache->name_table = silc_hash_table_alloc(count, silc_hash_utf8_string, NULL, + silc_hash_utf8_compare, NULL, + NULL, NULL, TRUE); + cache->context_table = silc_hash_table_alloc(count, silc_hash_ptr, NULL, + NULL, NULL, NULL, NULL, TRUE); + cache->destructor = destructor; + cache->context = destructor_context; + cache->id_type = id_type; + + if (!cache->id_table || !cache->name_table || !cache->context_table) { + if (cache->id_table) + silc_hash_table_free(cache->id_table); + if (cache->name_table) + silc_hash_table_free(cache->name_table); + if (cache->context_table) + silc_hash_table_free(cache->context_table); + silc_free(cache); + return NULL; + } + + return cache; +} + +/* Frees ID cache object and cache entries */ + +void silc_idcache_free(SilcIDCache cache) +{ + silc_hash_table_free(cache->id_table); + silc_hash_table_free(cache->name_table); + silc_hash_table_free(cache->context_table); + silc_free(cache); +} + +/* Add new entry to cache */ + +SilcIDCacheEntry +silc_idcache_add(SilcIDCache cache, char *name, void *id, void *context) +{ + SilcIDCacheEntry c; + + if (!id) + return NULL; + + /* Allocate new cache entry */ + c = silc_calloc(1, sizeof(*c)); + if (!c) + return NULL; + + c->id = id; + c->name = name; + c->context = context; + + SILC_LOG_DEBUG(("Adding cache entry %p", c)); + + /* Add the new entry to the hash tables */ + + if (id) { + if (silc_idcache_find_by_id_one(cache, id, NULL)) { + SILC_LOG_ERROR(("Attempted to add same ID twice to ID Cache")); + goto err; + } + if (!silc_hash_table_add(cache->id_table, id, c)) + goto err; + } + if (name) + if (!silc_hash_table_add(cache->name_table, name, c)) + goto err; + if (context) + if (!silc_hash_table_add(cache->context_table, context, c)) + goto err; + + return c; + + err: + if (c->name) + silc_hash_table_del_by_context(cache->name_table, c->name, c); + if (c->context) + silc_hash_table_del_by_context(cache->context_table, c->context, c); + if (c->id) + silc_hash_table_del_by_context(cache->id_table, c->id, c); + silc_free(c); + + return NULL; +} + +/* Delete cache entry from cache. */ + +SilcBool silc_idcache_del(SilcIDCache cache, SilcIDCacheEntry entry, + void *app_context) +{ + SilcBool ret = FALSE; + + SILC_LOG_DEBUG(("Deleting cache entry %p", entry)); + + if (entry->name) + ret = silc_hash_table_del_by_context(cache->name_table, entry->name, + entry); + if (entry->context) + ret = silc_hash_table_del_by_context(cache->context_table, entry->context, + entry); + if (entry->id) + ret = silc_hash_table_del_by_context(cache->id_table, entry->id, + entry); + + if (ret) + silc_idcache_destructor(cache, entry, app_context); + + return ret; +} + +/* Deletes ID cache entry by ID. */ + +SilcBool silc_idcache_del_by_id(SilcIDCache cache, void *id, + void *app_context) +{ + SilcIDCacheEntry c; + + if (!silc_hash_table_find(cache->id_table, id, NULL, (void **)&c)) + return FALSE; + + return silc_idcache_del(cache, c, app_context); +} + +/* Deletes ID cache entry by context. */ + +SilcBool silc_idcache_del_by_context(SilcIDCache cache, void *context, + void *app_context) +{ + SilcIDCacheEntry c; + + if (!silc_hash_table_find(cache->context_table, context, NULL, (void **)&c)) + return FALSE; + + return silc_idcache_del(cache, c, app_context); +} + +/* Update entry */ + +SilcBool silc_idcache_update(SilcIDCache cache, SilcIDCacheEntry entry, + void *old_id, void *new_id, + char *old_name, char *new_name) +{ + if (old_id && new_id) { + if (!silc_hash_table_del_by_context(cache->id_table, old_id, entry)) + return FALSE; + + if (cache->id_type == SILC_ID_CLIENT) + *(SilcClientID *)entry->id = *(SilcClientID *)new_id; + if (cache->id_type == SILC_ID_SERVER) + *(SilcServerID *)entry->id = *(SilcServerID *)new_id; + if (cache->id_type == SILC_ID_CHANNEL) + *(SilcChannelID *)entry->id = *(SilcChannelID *)new_id; + + if (!silc_hash_table_add(cache->id_table, entry->id, entry)) + return FALSE; + } + + if (old_name && new_name) { + if (!silc_hash_table_del_by_context(cache->name_table, old_name, entry)) + return FALSE; + + entry->name = new_name; + + if (!silc_hash_table_add(cache->name_table, entry->name, entry)) + return FALSE; + } + + return TRUE; +} + +/* Returns all cache entrys from the ID cache to the `ret' ID Cache List. */ + +SilcBool silc_idcache_get_all(SilcIDCache cache, SilcList *ret_list) +{ + if (!ret_list) + return FALSE; + + if (!silc_hash_table_count(cache->id_table)) + return FALSE; + + silc_hash_table_foreach(cache->id_table, silc_idcache_get_all_foreach, + ret_list); + + if (!silc_list_count(*ret_list)) + return FALSE; + + return TRUE; +} + +/* Find ID Cache entry by ID. May return multiple entries. */ + +SilcBool silc_idcache_find_by_id(SilcIDCache cache, void *id, + SilcList *ret_list) +{ + if (!ret_list) + return FALSE; + + if (!silc_hash_table_count(cache->id_table)) + return FALSE; + + silc_hash_table_find_foreach(cache->id_table, id, + silc_idcache_get_all_foreach, ret_list); + + if (!silc_list_count(*ret_list)) + return FALSE; + + return TRUE; +} + +/* Find one specific ID entry. Compare full IDs */ + +SilcBool silc_idcache_find_by_id_one(SilcIDCache cache, void *id, + SilcIDCacheEntry *ret) +{ + return silc_hash_table_find_ext(cache->id_table, id, NULL, (void *)ret, + NULL, NULL, + silc_hash_id_compare_full, + SILC_32_TO_PTR(cache->id_type)); +} + +/* Finds cache entry by context. */ + +SilcBool silc_idcache_find_by_context(SilcIDCache cache, void *context, + SilcIDCacheEntry *ret) +{ + return silc_hash_table_find(cache->context_table, context, NULL, + (void *)ret); +} + +/* Find ID Cache entry by name. Returns list of cache entries. */ + +SilcBool silc_idcache_find_by_name(SilcIDCache cache, char *name, + SilcList *ret_list) +{ + if (!ret_list) + return FALSE; + + if (!silc_hash_table_count(cache->name_table)) + return FALSE; + + silc_hash_table_find_foreach(cache->name_table, name, + silc_idcache_get_all_foreach, ret_list); + + if (!silc_list_count(*ret_list)) + return FALSE; + + return TRUE; +} + +/* Find ID Cache entry by name. Returns one cache entry. */ + +SilcBool silc_idcache_find_by_name_one(SilcIDCache cache, char *name, + SilcIDCacheEntry *ret) +{ + return silc_hash_table_find(cache->name_table, name, NULL, (void *)ret); +} diff --git a/lib/silcapputil/silcidcache.h b/lib/silcapputil/silcidcache.h new file mode 100644 index 00000000..d01b2f5e --- /dev/null +++ b/lib/silcapputil/silcidcache.h @@ -0,0 +1,335 @@ +/* + + silcidcache.h + + Author: Pekka Riikonen + + Copyright (C) 2000 - 2006 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 + the Free Software Foundation; version 2 of the License. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + +*/ + +/****h* silcidcache/SILC ID Cache Interface + * + * DESCRIPTION + * + * SILC ID Cache is an cache for all kinds of ID's used in the SILC + * protocol. Application can save here the ID's it uses and the interface + * provides fast retrieval of the ID's from the cache. + * + * SILC ID Cache is not thread-safe. If the same cache context must be + * used in multithreaded environment concurrency control must be employed. + * + ***/ + +#ifndef SILCIDCACHE_H +#define SILCIDCACHE_H + +/****s* silcidcache/SilcIDCacheAPI/SilcIDCacheEntry + * + * NAME + * + * typedef struct SilcIDCacheEntryStruct { ... } SilcIDCacheEntry; + * + * DESCRIPTION + * + * This is an entry in the SILC ID Cache system. This context is + * allocated by adding new entry to ID cache by calling silc_idcache_add. + * Each of the fields in the structure are allocated by the caller. + * + * SOURCE + */ +typedef struct SilcIDCacheEntryStruct { + struct SilcIDCacheEntryStruct *next; + void *id; /* Associated ID */ + char *name; /* Associated entry name */ + void *context; /* Associated context */ +} *SilcIDCacheEntry; +/***/ + +/****s* silcidcache/SilcIDCacheAPI/SilcIDCache + * + * NAME + * + * typedef struct SilcIDCacheStruct *SilcIDCache; + * + * DESCRIPTION + * + * This context is the actual ID Cache and is allocated by + * silc_idcache_alloc and given as argument usually to all + * silc_idcache_* functions. It is freed by the + * silc_idcache_free function. + * + ***/ +typedef struct SilcIDCacheStruct *SilcIDCache; + +/****f* silcidcache/SilcIDCacheAPI/SilcIDCacheDestructor + * + * SYNOPSIS + * + * typedef void (*SilcIDCacheDestructor)(SilcIDCache cache, + * const SilcIDCacheEntry entry, + * void *destructor_context, + * void *app_context); + * + * DESCRIPTION + * + * Destructor callback given as argument to silc_idcache_alloc. This + * is called when an entry is deleted from the cache. Application + * must free the contents of the `entry'. + * + ***/ +typedef void (*SilcIDCacheDestructor)(SilcIDCache cache, + const SilcIDCacheEntry entry, + void *destructor_context, + void *app_context); + +/* Prototypes */ + +/****f* silcidcache/SilcIDCacheAPI/silc_idcache_alloc + * + * SYNOPSIS + * + * SilcIDCache silc_idcache_alloc(SilcUInt32 count, SilcIdType id_type, + * SilcIDCacheDestructor destructor, + * void *destructor_context, + * SilcBool delete_id, SilcBool delete_name); + * + * DESCRIPTION + * + * Allocates new ID cache object. The initial amount of allocated entries + * can be sent as argument. If `count' is 0 the system uses default values. + * The `id_type' defines the types of the ID's that will be saved to the + * cache. + * + ***/ +SilcIDCache silc_idcache_alloc(SilcUInt32 count, SilcIdType id_type, + SilcIDCacheDestructor destructor, + void *destructor_context); + +/****f* silcidcache/SilcIDCacheAPI/silc_idcache_free + * + * SYNOPSIS + * + * void silc_idcache_free(SilcIDCache cache); + * + * DESCRIPTION + * + * Frees ID cache context and all cache entries. + * + ***/ +void silc_idcache_free(SilcIDCache cache); + +/****f* silcidcache/SilcIDCacheAPI/silc_idcache_add + * + * SYNOPSIS + * + * SilcIDCacheEntry + * silc_idcache_add(SilcIDCache cache, char *name, void *id, void *context); + * + * DESCRIPTION + * + * Add new entry to the cache. Returns the allocated cache entry if the + * entry was added successfully, or NULL if error occurred. The `name' is + * the name associated with the ID, the `id' the actual ID and the + * `context' a caller specific context. + * + * The `name', `id' and `context' pointers will be stored in the cache, + * and if the caller frees these pointers the caller is also responsible + * of deleting the cache entry. + * + ***/ +SilcIDCacheEntry +silc_idcache_add(SilcIDCache cache, char *name, void *id, void *context); + +/****f* silcidcache/SilcIDCacheAPI/silc_idcache_del + * + * SYNOPSIS + * + * SilcBool silc_idcache_del(SilcIDCache cache, SilcIDCacheEntry entry, + * void *app_context); + * + * DESCRIPTION + * + * Delete cache entry from cache. Returns TRUE if the entry was deleted. + * The destructor will be called for the entry. The `app_context' is + * delivered to the destructor. + * + ***/ +SilcBool silc_idcache_del(SilcIDCache cache, SilcIDCacheEntry entry, + void *app_context); + +/****f* silcidcache/SilcIDCacheAPI/silc_idcache_del_by_id + * + * SYNOPSIS + * + * SilcBool silc_idcache_del_by_id(SilcIDCache cache, void *id, + * void *app_context); + * + * DESCRIPTION + * + * Delete cache entry by ID. Returns TRUE if the entry was deleted. + * The destructor will be called for the entry. The `app_context' is + * delivered to the destructor. + * + ***/ +SilcBool silc_idcache_del_by_id(SilcIDCache cache, void *id, + void *app_context); + +/****f* silcidcache/SilcIDCacheAPI/silc_idcache_del_by_context + * + * SYNOPSIS + * + * SilcBool silc_idcache_del_by_context(SilcIDCache cache, void *context); + * + * DESCRIPTION + * + * Deletes cachen entry by the user specified context. Returns TRUE + * if the entry was deleted. The destructor will be called for the + * entry. The `app_context' is delivered to the destructor. + * + ***/ +SilcBool silc_idcache_del_by_context(SilcIDCache cache, void *context, + void *app_context); + +/****f* silcidcache/SilcIDCacheAPI/silc_idcache_update_id + * + * SYNOPSIS + * + * SilcBool silc_idcache_update(SilcIDCache cache, SilcIDCacheEntry entry, + * void *old_id, void *new_id, + * char *old_name, char *new_name); + * + * DESCRIPTION + * + * Updates cache `entry' with new values. If the `new_id' is non-NULL + * then the new value will be copied over the old value in the `entry'. + * If the `new_name' is non-NULL then the `entry' will be updated with + * `new_name'. The caller is responsible of freeing the old name if it + * was updated with new one. The old ID value does not need to be freed + * as the new value is copied over the old value. + * + ***/ +SilcBool silc_idcache_update(SilcIDCache cache, SilcIDCacheEntry entry, + void *old_id, void *new_id, + char *old_name, char *new_name); + +/****f* silcidcache/SilcIDCacheAPI/silc_idcache_get_all + * + * SYNOPSIS + * + * SilcBool silc_idcache_get_all(SilcIDCache cache, SilcList *ret_list); + * + * DESCRIPTION + * + * Returns all cache entries into the SilcList `ret_list' pointer. Each + * entry in the list is SilcIDCacheEntry. Returns FALSE if the cache + * is empty. + * + ***/ +SilcBool silc_idcache_get_all(SilcIDCache cache, SilcList *ret_list); + +/****f* silcidcache/SilcIDCacheAPI/silc_idcache_find_by_id + * + * SYNOPSIS + * + * SilcBool silc_idcache_find_by_id(SilcIDCache cache, void *id, + * SilcList *ret_list); + * + * DESCRIPTION + * + * Find ID Cache entry by ID. This may return multiple entries. + * The entires are returned into the `ret_list' SilcList context. + * Returns TRUE if entry was found. + * + * NOTES + * + * If this function is used to find Client ID (SilcClientID), only the + * hash portion of the Client ID is compared. Use the function + * silc_idcache_find_by_id_one to find exact match for Client ID (full + * ID is compared and not only the hash). + * + * Comparing only the hash portion of Client ID allows searching of + * Client ID's by nickname, because the hash is based on the nickname. + * As nicknames are not unique, multiple entries may be found. + * + ***/ +SilcBool silc_idcache_find_by_id(SilcIDCache cache, void *id, + SilcList *ret_list); + +/****f* silcidcache/SilcIDCacheAPI/silc_idcache_find_by_id_one + * + * SYNOPSIS + * + * SilcBool silc_idcache_find_by_id_one(SilcIDCache cache, void *id, + * SilcIDCacheEntry *ret); + * + * DESCRIPTION + * + * Find ID Cache entry by ID. Returns only one entry from the cache + * and the found entry is considered to be exact match. Returns TRUE + * if the entry was found. + * + ***/ +SilcBool silc_idcache_find_by_id_one(SilcIDCache cache, void *id, + SilcIDCacheEntry *ret); + +/****f* silcidcache/SilcIDCacheAPI/silc_idcache_find_by_context + * + * SYNOPSIS + * + * SilcBool silc_idcache_find_by_context(SilcIDCache cache, void *context, + * SilcIDCacheEntry *ret); + * + * DESCRIPTION + * + * Find cache entry by user specified context. Returns TRUE if the + * entry was found. + * + ***/ +SilcBool silc_idcache_find_by_context(SilcIDCache cache, void *context, + SilcIDCacheEntry *ret); + +/****f* silcidcache/SilcIDCacheAPI/silc_idcache_find_by_name + * + * SYNOPSIS + * + * SilcBool silc_idcache_find_by_name(SilcIDCache cache, char *name, + * SilcList *ret_list); + * + * DESCRIPTION + * + * Find cache entries by the name associated with the ID. This may + * return multiple entries to the `ret_list' SilcList context. Returns + * TRUE if the entry was found. + * + ***/ +SilcBool silc_idcache_find_by_name(SilcIDCache cache, char *name, + SilcList *ret_list); + +/****f* silcidcache/SilcIDCacheAPI/silc_idcache_find_by_name_one + * + * SYNOPSIS + * + * SilcBool silc_idcache_find_by_name_one(SilcIDCache cache, char *name, + * SilcIDCacheEntry *ret); + * + * DESCRIPTION + * + * Find cache entry by the name associated with the ID. This returns + * one entry and the found entry is considered to be exact match. + * Returns TRUE if the entry was found. + * + ***/ +SilcBool silc_idcache_find_by_name_one(SilcIDCache cache, char *name, + SilcIDCacheEntry *ret); + +#endif /* SILCIDCACHE_H */ diff --git a/lib/silcutil/DIRECTORY b/lib/silcutil/DIRECTORY index 79b2020f..3a7301ae 100644 --- a/lib/silcutil/DIRECTORY +++ b/lib/silcutil/DIRECTORY @@ -23,7 +23,6 @@ @LINK=silcutil.html:SILC Util Interface @LINK=silclist.html:SILC List Interface @LINK=silcdlist.html:SILC Dynamic List Interface -@LINK=silcapputil.html:SILC Application Utilities --> SILC Utility Library diff --git a/lib/silcutil/Makefile.ad b/lib/silcutil/Makefile.ad index fc3db585..76c73df8 100644 --- a/lib/silcutil/Makefile.ad +++ b/lib/silcutil/Makefile.ad @@ -56,7 +56,6 @@ libsilcutil_la_SOURCES = \ silcstrutil.c \ silcutil.c \ silchashtable.c \ - silcapputil.c \ silcutf8.c \ silcstringprep.c \ silcstream.c \ @@ -88,7 +87,6 @@ include_HEADERS = \ silcfileutil.h \ silcutil.h \ silcstrutil.h \ - silcapputil.h \ silcutf8.h \ silcstringprep.h \ silctypes.h \ diff --git a/lib/silcutil/silcapputil.h b/lib/silcutil/silcapputil.h deleted file mode 100644 index fd171735..00000000 --- a/lib/silcutil/silcapputil.h +++ /dev/null @@ -1,151 +0,0 @@ -/* - - silcapputil.h - - Author: Pekka Riikonen - - Copyright (C) 2002 - 2005 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 - the Free Software Foundation; version 2 of the License. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - -*/ - -/****h* silcutil/SILC Application Utilities - * - * DESCRIPTION - * - * This interface provides utility functions for applications' - * convenience. It provides functions that may be used for example by - * command line applications but also other applications may find some - * routines helpful. None of these routines are mandatory in any other - * SILC routines or libraries, and are purely provided for convenience. - * These routines for example provide simple public key and private key - * pair generation, public key and private key file saving and loading - * for application, and other similar routines. - * - ***/ - -#ifndef SILCAPPUTIL_H -#define SILCAPPUTIL_H - -/****f* silcutil/SilcAppUtil/silc_create_key_pair - * - * SYNOPSIS - * - * SilcBool silc_create_key_pair(const char *pkcs_name, - * SilcUInt32 key_len_bits, - * const char *pub_filename, - * const char *prv_filename, - * const char *pub_identifier, - * const char *passphrase, - * SilcPublicKey *return_public_key, - * SilcPrivateKey *return_private_key, - * SilcBool interactive); - * - * DESCRIPTION - * - * This routine can be used to generate new public key and private key - * pair. The `pkcs_name' is the name of public key algorithm, or if - * NULL it defaults to "rsa". The `key_len_bits' is the key length - * in bits and if zero (0) it defaults to 2048 bits. The `pub_filename' - * and `prv_filename' is the public key and private key filenames. - * The `pub_identifier' is the public key identifier (for example: - * "UN=foobar, HN=hostname"), or if NULL the routine generates it - * automatically. - * - * The `passphrase' is the passphrase that is used to encrypt the - * private key file. It is recommended that you would protect your - * private key file with a passphrase. - * - * If the `interactive' is TRUE then this asks the user (by blocking - * the process for input) some questions about key generation (like - * public key algorithm, key length, filenames, etc). If all - * arguments are provided to this function already then `interactive' - * has no effect. - * - * NOTES - * - * Before calling this function the application must have initialized - * the crypto library by registering the public key algorithms with - * silc_pkcs_register_default function. - * - ***/ -SilcBool silc_create_key_pair(const char *pkcs_name, - SilcUInt32 key_len_bits, - const char *pub_filename, - const char *prv_filename, - const char *pub_identifier, - const char *passphrase, - SilcPublicKey *return_public_key, - SilcPrivateKey *return_private_key, - SilcBool interactive); - -/****f* silcutil/SilcAppUtil/silc_load_key_pair - * - * SYNOPSIS - * - * SilcBool silc_load_key_pair(const char *pub_filename, - * const char *prv_filename, - * const char *passphrase, - * SilcPublicKey *return_public_key, - * SilcPrivateKey *return_private_key); - * - * DESCRIPTION - * - * This routine can be used to load the public key and private key - * from files. This retuns FALSE it either of the key could not be - * loaded. This function returns TRUE on success and returns the - * public key into `return_public_key' pointer and private key into - * `return_private_key'. The `passphrase' is the passphrase which - * will be used to decrypt the private key file. - * - ***/ -SilcBool silc_load_key_pair(const char *pub_filename, - const char *prv_filename, - const char *passphrase, - SilcPublicKey *return_public_key, - SilcPrivateKey *return_private_key); - -/****f* silcutil/SilcAppUtil/silc_show_public_key - * - * SYNOPSIS - * - * SilcBool silc_show_public_key(const char *pub_filename); - * - * DESCRIPTION - * - * This routine can be used to dump the contents of the public key - * in the public key file `pub_filename'. This dumps the public key - * into human readable form into stdout. Returns FALSE on error. - * - ***/ -SilcBool silc_show_public_key(const char *pub_filename); - -/****f* silcutil/SilcAppUtil/silc_change_private_key_passphrase - * - * SYNOPSIS - * - * SilcBool silc_change_private_key_passphrase(const char *prv_filename, - * const char *old_passphrase, - * const char *new_passphrase); - * - * DESCRIPTION - * - * This routine can be used to change the passphrase of the private - * key file, which is used to encrypt the private key. If the old - * and new passphrase is not provided for this function this will - * prompt for them. - * - ***/ -SilcBool silc_change_private_key_passphrase(const char *prv_filename, - const char *old_passphrase, - const char *new_passphrase); - -#endif /* SILCAPPUTIL_H */ diff --git a/lib/silcutil/silclog.c b/lib/silcutil/silclog.c index 53f70919..02e0281c 100644 --- a/lib/silcutil/silclog.c +++ b/lib/silcutil/silclog.c @@ -216,8 +216,8 @@ void silc_log_output(SilcLogType type, char *string) /* Set and initialize the specified log file. */ -SilcBool silc_log_set_file(SilcLogType type, char *filename, SilcUInt32 maxsize, - SilcSchedule scheduler) +SilcBool silc_log_set_file(SilcLogType type, char *filename, + SilcUInt32 maxsize, SilcSchedule scheduler) { FILE *fp = NULL; SilcLog log; diff --git a/lib/silcutil/silcstrutil.c b/lib/silcutil/silcstrutil.c index 348bdae0..614204db 100644 --- a/lib/silcutil/silcstrutil.c +++ b/lib/silcutil/silcstrutil.c @@ -191,123 +191,3 @@ char *silc_strncat(char *dest, SilcUInt32 dest_size, return dest; } - -/* Checks that the 'identifier' string is valid identifier string - and does not contain any unassigned or prohibited character. This - function is used to check for valid nicknames, channel names, - server names, usernames, hostnames, service names, algorithm names, - other security property names, and SILC Public Key name. */ - -unsigned char *silc_identifier_check(const unsigned char *identifier, - SilcUInt32 identifier_len, - SilcStringEncoding identifier_encoding, - SilcUInt32 max_allowed_length, - SilcUInt32 *out_len) -{ - unsigned char *utf8s; - SilcUInt32 utf8s_len; - SilcStringprepStatus status; - - if (!identifier || !identifier_len) - return NULL; - - if (max_allowed_length && identifier_len > max_allowed_length) - return NULL; - - status = silc_stringprep(identifier, identifier_len, - identifier_encoding, SILC_IDENTIFIER_PREP, 0, - &utf8s, &utf8s_len, SILC_STRING_UTF8); - if (status != SILC_STRINGPREP_OK) { - SILC_LOG_DEBUG(("silc_stringprep() status error %d", status)); - return NULL; - } - - if (out_len) - *out_len = utf8s_len; - - return utf8s; -} - -/* Same as above but does not allocate memory, just checks the - validity of the string. */ - -SilcBool silc_identifier_verify(const unsigned char *identifier, - SilcUInt32 identifier_len, - SilcStringEncoding identifier_encoding, - SilcUInt32 max_allowed_length) -{ - SilcStringprepStatus status; - - if (!identifier || !identifier_len) - return FALSE; - - if (max_allowed_length && identifier_len > max_allowed_length) - return FALSE; - - status = silc_stringprep(identifier, identifier_len, - identifier_encoding, SILC_IDENTIFIER_PREP, 0, - NULL, NULL, SILC_STRING_UTF8); - if (status != SILC_STRINGPREP_OK) { - SILC_LOG_DEBUG(("silc_stringprep() status error %d", status)); - return FALSE; - } - - return TRUE; -} - -unsigned char *silc_channel_name_check(const unsigned char *identifier, - SilcUInt32 identifier_len, - SilcStringEncoding identifier_encoding, - SilcUInt32 max_allowed_length, - SilcUInt32 *out_len) -{ - unsigned char *utf8s; - SilcUInt32 utf8s_len; - SilcStringprepStatus status; - - if (!identifier || !identifier_len) - return NULL; - - if (max_allowed_length && identifier_len > max_allowed_length) - return NULL; - - status = silc_stringprep(identifier, identifier_len, - identifier_encoding, SILC_IDENTIFIER_CH_PREP, 0, - &utf8s, &utf8s_len, SILC_STRING_UTF8); - if (status != SILC_STRINGPREP_OK) { - SILC_LOG_DEBUG(("silc_stringprep() status error %d", status)); - return NULL; - } - - if (out_len) - *out_len = utf8s_len; - - return utf8s; -} - -/* Same as above but does not allocate memory, just checks the - validity of the string. */ - -SilcBool silc_channel_name_verify(const unsigned char *identifier, - SilcUInt32 identifier_len, - SilcStringEncoding identifier_encoding, - SilcUInt32 max_allowed_length) -{ - SilcStringprepStatus status; - - if (!identifier || !identifier_len) - return FALSE; - - if (max_allowed_length && identifier_len > max_allowed_length) - return FALSE; - - status = silc_stringprep(identifier, identifier_len, - identifier_encoding, SILC_IDENTIFIER_CH_PREP, 0, - NULL, NULL, SILC_STRING_UTF8); - if (status != SILC_STRINGPREP_OK) { - SILC_LOG_DEBUG(("silc_stringprep() status error %d", status)); - return FALSE; - } - - return TRUE; -} diff --git a/lib/silcutil/silcstrutil.h b/lib/silcutil/silcstrutil.h index 3d96492f..9332d8da 100644 --- a/lib/silcutil/silcstrutil.h +++ b/lib/silcutil/silcstrutil.h @@ -4,7 +4,7 @@ Author: Pekka Riikonen - Copyright (C) 2002 - 2005 Pekka Riikonen + Copyright (C) 2002 - 2006 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 @@ -128,152 +128,4 @@ unsigned char *silc_pem_decode(unsigned char *pem, SilcUInt32 pem_len, char *silc_strncat(char *dest, SilcUInt32 dest_size, const char *src, SilcUInt32 src_len); -/****f* silcutil/SilcStrUtilAPI/silc_identifier_check - * - * SYNOPSIS - * - * unsigned char * - * silc_identifier_check(const unsigned char *identifier, - * SilcUInt32 identifier_len, - * SilcStringEncoding identifier_encoding, - * SilcUInt32 max_allowed_length, - * SilcUInt32 *out_len); - * - * DESCRIPTION - * - * Checks that the 'identifier' string is valid identifier string - * and does not contain any unassigned or prohibited character. This - * function is used to check for valid nicknames, server names, - * usernames, hostnames, service names, algorithm names, other security - * property names, and SILC Public Key name. - * - * If the 'max_allowed_length' is non-zero the identifier cannot be - * longer than that, and NULL is returned if it is. If zero (0), no - * length limit exist. For nicknames the max length must be 128 bytes. - * Other identifiers has no default limit, but application may choose -* one anyway. - * - * Returns the validated string, that the caller must free. Returns - * NULL if the identifier string is not valid or contain unassigned or - * prohibited characters. Such identifier strings must not be used - * SILC protocol. The returned string is always in UTF-8 encoding. - * The length of the returned string is in 'out_len'. - * - * NOTES - * - * In addition of validating the identifier string, this function - * may map characters to other characters or remove characters from the - * original string. This is done as defined in the SILC protocol. Error - * is returned only if the string contains unassigned or prohibited - * characters. The original 'identifier' is not modified at any point. - * - ***/ -unsigned char *silc_identifier_check(const unsigned char *identifier, - SilcUInt32 identifier_len, - SilcStringEncoding identifier_encoding, - SilcUInt32 max_allowed_length, - SilcUInt32 *out_len); - -/****f* silcutil/SilcStrUtilAPI/silc_identifier_verify - * - * SYNOPSIS - * - * SilcBool - * silc_identifier_check(const unsigned char *identifier, - * SilcUInt32 identifier_len, - * SilcStringEncoding identifier_encoding, - * SilcUInt32 max_allowed_length); - * - * DESCRIPTION - * - * Checks that the 'identifier' string is valid identifier string - * and does not contain any unassigned or prohibited character. This - * function is used to check for valid nicknames, server names, - * usernames, hostnames, service names, algorithm names, other security - * property names, and SILC Public Key name. - * - * If the 'max_allowed_length' is non-zero the identifier cannot be - * longer than that, and NULL is returned if it is. If zero (0), no - * length limit exist. For nicknames the max length must be 128 bytes. - * Other identifiers has no default limit, but application may choose - * one anyway. - * - * Returns TRUE if the string is valid and FALSE if it is prohibited. - * - ***/ -SilcBool silc_identifier_verify(const unsigned char *identifier, - SilcUInt32 identifier_len, - SilcStringEncoding identifier_encoding, - SilcUInt32 max_allowed_length); - -/****f* silcutil/SilcStrUtilAPI/silc_channel_name_check - * - * SYNOPSIS - * - * unsigned char * - * silc_channel_name_check(const unsigned char *identifier, - * SilcUInt32 identifier_len, - * SilcStringEncoding identifier_encoding, - * SilcUInt32 max_allowed_length, - * SilcUInt32 *out_len); - * - * DESCRIPTION - * - * Checks that the 'identifier' string is valid channel name string - * and does not contain any unassigned or prohibited character. - * - * If the 'max_allowed_length' is non-zero the identifier cannot be - * longer than that, and NULL is returned if it is. If zero (0), no - * length limit exist. For channel names the max length must be 256 - * bytes. - * - * Returns the validated string, that the caller must free. Returns - * NULL if the identifier string is not valid or contain unassigned or - * prohibited characters. Such identifier strings must not be used - * SILC protocol. The returned string is always in UTF-8 encoding. - * The length of the returned string is in 'out_len'. - * - * NOTES - * - * In addition of validating the channel name string, this function - * may map characters to other characters or remove characters from the - * original string. This is done as defined in the SILC protocol. Error - * is returned only if the string contains unassigned or prohibited - * characters. The original 'identifier' is not modified at any point. - * - ***/ -unsigned char *silc_channel_name_check(const unsigned char *identifier, - SilcUInt32 identifier_len, - SilcStringEncoding identifier_encoding, - SilcUInt32 max_allowed_length, - SilcUInt32 *out_len); - -/****f* silcutil/SilcStrUtilAPI/silc_channel_name_verify - * - * SYNOPSIS - * - * SilcBool - * silc_channel_name_check(const unsigned char *identifier, - * SilcUInt32 identifier_len, - * SilcStringEncoding identifier_encoding, - * SilcUInt32 max_allowed_length); - * - * DESCRIPTION - * - * Checks that the 'identifier' string is valid channel name string - * and does not contain any unassigned or prohibited character. - * - * If the 'max_allowed_length' is non-zero the identifier cannot be - * longer than that, and NULL is returned if it is. If zero (0), no - * length limit exist. For channel names the max length must be 256 - * bytes. - * - * Returns TRUE if the string is valid and FALSE if it is prohibited. - * - ***/ -SilcBool silc_channel_name_verify(const unsigned char *identifier, - SilcUInt32 identifier_len, - SilcStringEncoding identifier_encoding, - SilcUInt32 max_allowed_length); - #endif /* SILCSTRUTIL_H */ -- 2.24.0