--- /dev/null
+/*
+
+ silccrypto.c
+
+ Author: Pekka Riikonen <priikone@silcnet.org>
+
+ Copyright (C) 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
+ 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.
+
+*/
+
+#include "silc.h"
+
+#ifndef SILC_SYMBIAN
+SilcStack crypto_stack = NULL; /* Crypto Toolkit's global stack */
+#endif /* SILC_SYMBIAN */
+
+/* Init crypto */
+
+SilcBool silc_crypto_init(SilcStack stack)
+{
+ SILC_LOG_DEBUG(("Initializing crypto"));
+
+#ifndef SILC_SYMBIAN
+ /* Stack allocation is allowed to fail */
+ crypto_stack = silc_stack_alloc(0, stack);
+#endif /* SILC_SYMBIAN */
+
+ /* Init crypto library */
+ if (!silc_cipher_register_default()) {
+ SILC_LOG_ERROR(("Error registering ciphers"));
+ goto err;
+ }
+ if (!silc_hash_register_default()) {
+ SILC_LOG_ERROR(("Error registering hash functions"));
+ goto err;
+ }
+ if (!silc_hmac_register_default()) {
+ SILC_LOG_ERROR(("Error registering hash HMACs"));
+ goto err;
+ }
+ if (!silc_pkcs_register_default()) {
+ SILC_LOG_ERROR(("Error registering hash PKCSs"));
+ goto err;
+ }
+
+#ifdef SILC_DIST_ACC
+ /* Initialize accelerator library */
+#endif /* SILC_DIST_ACC */
+
+ return TRUE;
+
+ err:
+ silc_crypto_uninit();
+ return FALSE;
+}
+
+/* Uninit crypto */
+
+void silc_crypto_uninit(void)
+{
+ SILC_LOG_DEBUG(("Uninitializing crypto"));
+
+#ifdef SILC_DIST_ACC
+ /* Uninit accelerator library */
+#endif /* SILC_DIST_ACC */
+
+ /* Uninit crypto library */
+ silc_pkcs_unregister_all();
+ silc_hmac_unregister_all();
+ silc_hash_unregister_all();
+ silc_cipher_unregister_all();
+
+#ifndef SILC_SYMBIAN
+ silc_stack_free(crypto_stack);
+#endif /* SILC_SYMBIAN */
+}
+
+/* Return stack */
+
+SilcStack silc_crypto_stack(void)
+{
+#ifndef SILC_SYMBIAN
+ return crypto_stack;
+#else
+ return NULL;
+#endif /* SILC_SYMBIAN */
+}