6 #include "libcryptsetup.h"
9 extern struct hash_backend hash_gcrypt_backend;
10 extern struct setup_backend setup_libdevmapper_backend;
13 static void init_plugins(void)
16 #else /* USE_PLUGINS */
17 # define init_plugins() do { } while(0)
18 #endif /* USE_PLUGINS */
20 static struct hash_backend *hash_backends[] = {
27 static struct setup_backend *setup_backends[] = {
28 #ifdef BUILTIN_LIBDEVMAPPER
29 &setup_libdevmapper_backend,
34 struct hash_backend *get_hash_backend(const char *name)
36 struct hash_backend **backend;
40 for(backend = hash_backends; *backend; backend++)
41 if (!name || strcmp(name, (*backend)->name) == 0)
47 void put_hash_backend(struct hash_backend *backend)
51 int hash(const char *backend_name, const char *hash_name,
52 char *result, size_t size,
53 const char *passphrase, size_t sizep)
55 struct hash_backend *backend;
56 struct hash_type *hashes = NULL, *hash;
57 char hash_name_buf[256], *s;
61 if (strlen(hash_name) >= sizeof(hash_name_buf)) {
62 set_error("hash name too long: %s", hash_name);
66 if ((s = strchr(hash_name, ':'))) {
68 strcpy(hash_name_buf, hash_name);
69 hash_name_buf[s-hash_name] = '\0';
70 hash_name = hash_name_buf;
73 set_error("requested hash length (%zd) > key length (%zd)", hlen, size);
80 backend = get_hash_backend(backend_name);
82 set_error("No hash backend found");
86 hashes = backend->get_hashes();
88 set_error("No hash functions available");
92 for(hash = hashes; hash->name; hash++)
93 if (strcmp(hash->name, hash_name) == 0)
96 set_error("Unknown hash type %s", hash_name);
100 r = hash->fn(hash->private, size, result, sizep, passphrase);
102 set_error("Error hashing passphrase");
107 memset(result+size, 0, pad);
112 backend->free_hashes(hashes);
113 put_hash_backend(backend);
118 struct setup_backend *get_setup_backend(const char *name)
120 struct setup_backend **backend;
124 for(backend = setup_backends; *backend; backend++)
125 if (!name || strcmp(name, (*backend)->name) == 0)
131 void put_setup_backend(struct setup_backend *backend)