Added cipher acceleration to SILC Accelerator. Added cipher softacc.
[crypto.git] / lib / silcacc / silcacc.c
1 /*
2
3   silcacc.c
4
5   Author: Pekka Riikonen <priikone@silcnet.org>
6
7   Copyright (C) 2007 - 2008 Pekka Riikonen
8
9   This program is free software; you can redistribute it and/or modify
10   it under the terms of the GNU General Public License as published by
11   the Free Software Foundation; version 2 of the License.
12
13   This program is distributed in the hope that it will be useful,
14   but WITHOUT ANY WARRANTY; without even the implied warranty of
15   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16   GNU General Public License for more details.
17
18 */
19
20 #include "silccrypto.h"
21 #include "softacc.h"
22
23 /************************** Types and definitions ***************************/
24
25 /* Static list of accelerators */
26 const SilcAcceleratorStruct *silc_default_accs[] =
27 {
28 #ifndef SILC_SYMBIAN
29   /* Software accelerator */
30   &softacc,
31 #endif /* SILC_SYMBIAN */
32   NULL
33 };
34
35 /*************************** SILC Accelerator API ***************************/
36
37 /* Register accelerator */
38
39 SilcBool silc_acc_register(const SilcAccelerator acc)
40 {
41   SilcDList silc_acc_list;
42
43   if (!acc)
44     return FALSE;
45
46   silc_acc_list = silc_global_get_var("silc_acc_list", FALSE);
47   if (!silc_acc_list) {
48     silc_acc_list = silc_global_set_var("silc_acc_list",
49                                         sizeof(*silc_acc_list), NULL, FALSE);
50     if (!silc_acc_list)
51       return FALSE;
52     silc_dlist_init_static(silc_acc_list);
53   }
54
55   SILC_LOG_DEBUG(("Register accelerator %p, name %s", acc, acc->name));
56   silc_dlist_add(silc_acc_list, acc);
57
58   return TRUE;
59 }
60
61 /* Unregister accelerator */
62
63 void silc_acc_unregister(SilcAccelerator acc)
64 {
65   SilcDList silc_acc_list;
66
67   if (!acc)
68     return;
69
70   silc_acc_list = silc_global_get_var("silc_acc_list", FALSE);
71   if (!silc_acc_list)
72     return;
73
74   SILC_LOG_DEBUG(("Unregister accelerator %p, name %s", acc, acc->name));
75   silc_dlist_del(silc_acc_list, acc);
76
77   if (!silc_dlist_count(silc_acc_list))
78     silc_global_del_var("silc_acc_list", FALSE);
79 }
80
81 /* Initialize accelerator */
82
83 SilcBool silc_acc_init(SilcAccelerator acc, SilcSchedule schedule, ...)
84 {
85   va_list va;
86   SilcBool ret;
87
88   if (!acc || !schedule)
89     return FALSE;
90
91   SILC_LOG_DEBUG(("Initialize accelerator %p, name %s", acc, acc->name));
92
93   va_start(va, schedule);
94   ret = acc->init(schedule, va);
95   va_end(va);
96
97   return ret;
98 }
99
100 /* Uninitialize accelerator */
101
102 SilcBool silc_acc_uninit(SilcAccelerator acc)
103 {
104   if (!acc)
105     return FALSE;
106
107   SILC_LOG_DEBUG(("Uninitialize accelerator %p, name %s", acc, acc->name));
108   return acc->uninit();
109 }
110
111 /* Get list of registered accelerator */
112
113 SilcDList silc_acc_get_supported(void)
114 {
115   SilcDList silc_acc_list;
116   SilcDList list;
117   SilcAccelerator acc;
118   int i;
119
120   list = silc_dlist_init();
121   if (!list)
122     return NULL;
123
124   silc_acc_list = silc_global_get_var("silc_acc_list", FALSE);
125   if (silc_acc_list) {
126     silc_dlist_start(silc_acc_list);
127     while ((acc = silc_dlist_get(silc_acc_list)))
128       silc_dlist_add(list, acc);
129   }
130
131   for (i = 0; silc_default_accs[i]->name; i++)
132     silc_dlist_add(list, (void *)silc_default_accs[i]);
133
134   return list;
135 }
136
137 /* Get accelerator */
138
139 SilcAccelerator silc_acc_find(const char *name)
140 {
141   SilcDList silc_acc_list;
142   SilcAccelerator acc;
143   int i;
144
145   if (!name)
146     return NULL;
147
148   SILC_LOG_DEBUG(("Find accelerator %s", name));
149
150   silc_acc_list = silc_global_get_var("silc_acc_list", FALSE);
151   if (silc_acc_list) {
152     silc_dlist_start(silc_acc_list);
153     while ((acc = silc_dlist_get(silc_acc_list))) {
154       if (!strcmp(acc->name, name)) {
155         SILC_LOG_DEBUG(("Found accelerator %p", acc));
156         return acc;
157       }
158     }
159   }
160
161   for (i = 0; silc_default_accs[i]->name; i++) {
162     if (!strcmp(silc_default_accs[i]->name, name)) {
163       SILC_LOG_DEBUG(("Found accelerator %p", silc_default_accs[i]));
164       return (SilcAccelerator)silc_default_accs[i];
165     }
166   }
167
168   SILC_LOG_DEBUG(("Accelerator %s does not exist", name));
169   return NULL;
170 }
171
172 /* Get accelerator name */
173
174 const char *silc_acc_get_name(SilcAccelerator acc)
175 {
176   if (!acc)
177     return NULL;
178   return acc->name;
179 }