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"
21 #include "gcrypt_dh.h"
22 #include "gcrypt_rsa_private_key.h"
26 #include <utils/mutex.h>
31 typedef struct private_gcrypt_plugin_t private_gcrypt_plugin_t
;
34 * private data of gcrypt_plugin
36 struct private_gcrypt_plugin_t
{
41 gcrypt_plugin_t
public;
45 * gcrypt mutex initialization wrapper
47 static int mutex_init(void **lock
)
49 *lock
= mutex_create(MUTEX_DEFAULT
);
54 * gcrypt mutex cleanup wrapper
56 static int mutex_destroy(void **lock
)
58 mutex_t
*mutex
= *lock
;
60 mutex
->destroy(mutex
);
65 * gcrypt mutex lock wrapper
67 static int mutex_lock(void **lock
)
69 mutex_t
*mutex
= *lock
;
76 * gcrypt mutex unlock wrapper
78 static int mutex_unlock(void **lock
)
80 mutex_t
*mutex
= *lock
;
87 * gcrypt locking functions using our mutex_t
89 static struct gcry_thread_cbs thread_functions
= {
90 GCRY_THREAD_OPTION_USER
, NULL
,
91 mutex_init
, mutex_destroy
, mutex_lock
, mutex_unlock
,
92 NULL
, NULL
, NULL
, NULL
, NULL
, NULL
, NULL
, NULL
96 * Implementation of gcrypt_plugin_t.destroy
98 static void destroy(private_gcrypt_plugin_t
*this)
100 lib
->crypto
->remove_hasher(lib
->crypto
,
101 (hasher_constructor_t
)gcrypt_hasher_create
);
102 lib
->crypto
->remove_crypter(lib
->crypto
,
103 (crypter_constructor_t
)gcrypt_crypter_create
);
104 lib
->crypto
->remove_rng(lib
->crypto
,
105 (rng_constructor_t
)gcrypt_rng_create
);
106 lib
->crypto
->remove_dh(lib
->crypto
,
107 (dh_constructor_t
)gcrypt_dh_create
);
108 lib
->creds
->remove_builder(lib
->creds
,
109 (builder_constructor_t
)gcrypt_rsa_private_key_builder
);
116 plugin_t
*plugin_create()
118 private_gcrypt_plugin_t
*this;
120 gcry_control(GCRYCTL_SET_THREAD_CBS
, &thread_functions
);
122 if (!gcry_check_version(GCRYPT_VERSION
))
124 DBG1("libgcrypt version mismatch");
128 /* we currently do not use secure memory */
129 gcry_control(GCRYCTL_DISABLE_SECMEM
, 0);
130 gcry_control(GCRYCTL_INITIALIZATION_FINISHED
, 0);
132 this = malloc_thing(private_gcrypt_plugin_t
);
134 this->public.plugin
.destroy
= (void(*)(plugin_t
*))destroy
;
137 lib
->crypto
->add_hasher(lib
->crypto
, HASH_SHA1
,
138 (hasher_constructor_t
)gcrypt_hasher_create
);
139 lib
->crypto
->add_hasher(lib
->crypto
, HASH_MD2
,
140 (hasher_constructor_t
)gcrypt_hasher_create
);
141 lib
->crypto
->add_hasher(lib
->crypto
, HASH_MD4
,
142 (hasher_constructor_t
)gcrypt_hasher_create
);
143 lib
->crypto
->add_hasher(lib
->crypto
, HASH_MD5
,
144 (hasher_constructor_t
)gcrypt_hasher_create
);
145 lib
->crypto
->add_hasher(lib
->crypto
, HASH_SHA256
,
146 (hasher_constructor_t
)gcrypt_hasher_create
);
147 lib
->crypto
->add_hasher(lib
->crypto
, HASH_SHA384
,
148 (hasher_constructor_t
)gcrypt_hasher_create
);
149 lib
->crypto
->add_hasher(lib
->crypto
, HASH_SHA512
,
150 (hasher_constructor_t
)gcrypt_hasher_create
);
153 lib
->crypto
->add_crypter(lib
->crypto
, ENCR_3DES
,
154 (crypter_constructor_t
)gcrypt_crypter_create
);
155 lib
->crypto
->add_crypter(lib
->crypto
, ENCR_IDEA
,
156 (crypter_constructor_t
)gcrypt_crypter_create
);
157 lib
->crypto
->add_crypter(lib
->crypto
, ENCR_CAST
,
158 (crypter_constructor_t
)gcrypt_crypter_create
);
159 lib
->crypto
->add_crypter(lib
->crypto
, ENCR_BLOWFISH
,
160 (crypter_constructor_t
)gcrypt_crypter_create
);
161 lib
->crypto
->add_crypter(lib
->crypto
, ENCR_DES
,
162 (crypter_constructor_t
)gcrypt_crypter_create
);
163 lib
->crypto
->add_crypter(lib
->crypto
, ENCR_DES_ECB
,
164 (crypter_constructor_t
)gcrypt_crypter_create
);
165 lib
->crypto
->add_crypter(lib
->crypto
, ENCR_AES_CBC
,
166 (crypter_constructor_t
)gcrypt_crypter_create
);
167 lib
->crypto
->add_crypter(lib
->crypto
, ENCR_CAMELLIA_CBC
,
168 (crypter_constructor_t
)gcrypt_crypter_create
);
169 lib
->crypto
->add_crypter(lib
->crypto
, ENCR_SERPENT_CBC
,
170 (crypter_constructor_t
)gcrypt_crypter_create
);
171 lib
->crypto
->add_crypter(lib
->crypto
, ENCR_TWOFISH_CBC
,
172 (crypter_constructor_t
)gcrypt_crypter_create
);
175 lib
->crypto
->add_rng(lib
->crypto
, RNG_WEAK
,
176 (rng_constructor_t
)gcrypt_rng_create
);
177 lib
->crypto
->add_rng(lib
->crypto
, RNG_STRONG
,
178 (rng_constructor_t
)gcrypt_rng_create
);
179 lib
->crypto
->add_rng(lib
->crypto
, RNG_TRUE
,
180 (rng_constructor_t
)gcrypt_rng_create
);
182 /* diffie hellman groups, using modp */
183 lib
->crypto
->add_dh(lib
->crypto
, MODP_2048_BIT
,
184 (dh_constructor_t
)gcrypt_dh_create
);
185 lib
->crypto
->add_dh(lib
->crypto
, MODP_1536_BIT
,
186 (dh_constructor_t
)gcrypt_dh_create
);
187 lib
->crypto
->add_dh(lib
->crypto
, MODP_3072_BIT
,
188 (dh_constructor_t
)gcrypt_dh_create
);
189 lib
->crypto
->add_dh(lib
->crypto
, MODP_4096_BIT
,
190 (dh_constructor_t
)gcrypt_dh_create
);
191 lib
->crypto
->add_dh(lib
->crypto
, MODP_6144_BIT
,
192 (dh_constructor_t
)gcrypt_dh_create
);
193 lib
->crypto
->add_dh(lib
->crypto
, MODP_8192_BIT
,
194 (dh_constructor_t
)gcrypt_dh_create
);
195 lib
->crypto
->add_dh(lib
->crypto
, MODP_1024_BIT
,
196 (dh_constructor_t
)gcrypt_dh_create
);
197 lib
->crypto
->add_dh(lib
->crypto
, MODP_768_BIT
,
198 (dh_constructor_t
)gcrypt_dh_create
);
201 lib
->creds
->add_builder(lib
->creds
, CRED_PRIVATE_KEY
, KEY_RSA
,
202 (builder_constructor_t
)gcrypt_rsa_private_key_builder
);
204 return &this->public.plugin
;