2 * Copyright (C) 2009 Martin Willi
3 * Hochschule fuer Technik Rapperswil
5 * This program is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License as published by the
7 * Free Software Foundation; either version 2 of the License, or (at your
8 * option) any later version. See <http://www.fsf.org/copyleft/gpl.txt>.
10 * This program is distributed in the hope that it will be useful, but
11 * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
12 * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
16 #include "gcrypt_plugin.h"
18 #include "gcrypt_hasher.h"
19 #include "gcrypt_crypter.h"
20 #include "gcrypt_rng.h"
24 #include <utils/mutex.h>
29 typedef struct private_gcrypt_plugin_t private_gcrypt_plugin_t
;
32 * private data of gcrypt_plugin
34 struct private_gcrypt_plugin_t
{
39 gcrypt_plugin_t
public;
43 * gcrypt mutex initialization wrapper
45 static int mutex_init(void **lock
)
47 *lock
= mutex_create(MUTEX_DEFAULT
);
52 * gcrypt mutex cleanup wrapper
54 static int mutex_destroy(void **lock
)
56 mutex_t
*mutex
= *lock
;
58 mutex
->destroy(mutex
);
63 * gcrypt mutex lock wrapper
65 static int mutex_lock(void **lock
)
67 mutex_t
*mutex
= *lock
;
74 * gcrypt mutex unlock wrapper
76 static int mutex_unlock(void **lock
)
78 mutex_t
*mutex
= *lock
;
85 * gcrypt locking functions using our mutex_t
87 static struct gcry_thread_cbs thread_functions
= {
88 GCRY_THREAD_OPTION_USER
, NULL
,
89 mutex_init
, mutex_destroy
, mutex_lock
, mutex_unlock
,
90 NULL
, NULL
, NULL
, NULL
, NULL
, NULL
, NULL
, NULL
94 * Implementation of gcrypt_plugin_t.destroy
96 static void destroy(private_gcrypt_plugin_t
*this)
98 lib
->crypto
->remove_hasher(lib
->crypto
,
99 (hasher_constructor_t
)gcrypt_hasher_create
);
100 lib
->crypto
->remove_crypter(lib
->crypto
,
101 (crypter_constructor_t
)gcrypt_crypter_create
);
102 lib
->crypto
->remove_rng(lib
->crypto
,
103 (rng_constructor_t
)gcrypt_rng_create
);
110 plugin_t
*plugin_create()
112 private_gcrypt_plugin_t
*this;
114 gcry_control(GCRYCTL_SET_THREAD_CBS
, &thread_functions
);
116 if (!gcry_check_version(GCRYPT_VERSION
))
118 DBG1("libgcrypt version mismatch");
122 /* we currently do not use secure memory */
123 gcry_control(GCRYCTL_DISABLE_SECMEM
, 0);
124 gcry_control(GCRYCTL_INITIALIZATION_FINISHED
, 0);
126 this = malloc_thing(private_gcrypt_plugin_t
);
128 this->public.plugin
.destroy
= (void(*)(plugin_t
*))destroy
;
131 lib
->crypto
->add_hasher(lib
->crypto
, HASH_SHA1
,
132 (hasher_constructor_t
)gcrypt_hasher_create
);
133 lib
->crypto
->add_hasher(lib
->crypto
, HASH_MD2
,
134 (hasher_constructor_t
)gcrypt_hasher_create
);
135 lib
->crypto
->add_hasher(lib
->crypto
, HASH_MD4
,
136 (hasher_constructor_t
)gcrypt_hasher_create
);
137 lib
->crypto
->add_hasher(lib
->crypto
, HASH_MD5
,
138 (hasher_constructor_t
)gcrypt_hasher_create
);
139 lib
->crypto
->add_hasher(lib
->crypto
, HASH_SHA256
,
140 (hasher_constructor_t
)gcrypt_hasher_create
);
141 lib
->crypto
->add_hasher(lib
->crypto
, HASH_SHA384
,
142 (hasher_constructor_t
)gcrypt_hasher_create
);
143 lib
->crypto
->add_hasher(lib
->crypto
, HASH_SHA512
,
144 (hasher_constructor_t
)gcrypt_hasher_create
);
147 lib
->crypto
->add_crypter(lib
->crypto
, ENCR_3DES
,
148 (crypter_constructor_t
)gcrypt_crypter_create
);
149 lib
->crypto
->add_crypter(lib
->crypto
, ENCR_IDEA
,
150 (crypter_constructor_t
)gcrypt_crypter_create
);
151 lib
->crypto
->add_crypter(lib
->crypto
, ENCR_CAST
,
152 (crypter_constructor_t
)gcrypt_crypter_create
);
153 lib
->crypto
->add_crypter(lib
->crypto
, ENCR_BLOWFISH
,
154 (crypter_constructor_t
)gcrypt_crypter_create
);
155 lib
->crypto
->add_crypter(lib
->crypto
, ENCR_DES
,
156 (crypter_constructor_t
)gcrypt_crypter_create
);
157 lib
->crypto
->add_crypter(lib
->crypto
, ENCR_DES_ECB
,
158 (crypter_constructor_t
)gcrypt_crypter_create
);
159 lib
->crypto
->add_crypter(lib
->crypto
, ENCR_AES_CBC
,
160 (crypter_constructor_t
)gcrypt_crypter_create
);
161 lib
->crypto
->add_crypter(lib
->crypto
, ENCR_CAMELLIA_CBC
,
162 (crypter_constructor_t
)gcrypt_crypter_create
);
163 lib
->crypto
->add_crypter(lib
->crypto
, ENCR_SERPENT_CBC
,
164 (crypter_constructor_t
)gcrypt_crypter_create
);
165 lib
->crypto
->add_crypter(lib
->crypto
, ENCR_TWOFISH_CBC
,
166 (crypter_constructor_t
)gcrypt_crypter_create
);
169 lib
->crypto
->add_rng(lib
->crypto
, RNG_WEAK
,
170 (rng_constructor_t
)gcrypt_rng_create
);
171 lib
->crypto
->add_rng(lib
->crypto
, RNG_STRONG
,
172 (rng_constructor_t
)gcrypt_rng_create
);
173 lib
->crypto
->add_rng(lib
->crypto
, RNG_TRUE
,
174 (rng_constructor_t
)gcrypt_rng_create
);
176 return &this->public.plugin
;