Merge branch 'vendor/GCC44'
[dragonfly.git] / contrib / cryptsetup / lib / backends.c
1 #include <stdio.h>
2 #include <string.h>
3 #include <stdlib.h>
4 #include <errno.h>
5 #include <openssl/evp.h>
6
7 #include "libcryptsetup.h"
8 #include "internal.h"
9
10 int init_crypto(void)
11 {
12         return 0;
13 }
14
15 int hash(const char *backend_name, const char *hash_name,
16          char *result, size_t size,
17          const char *passphrase, size_t sizep)
18 {
19         EVP_MD_CTX mdctx;
20         const EVP_MD *md;
21         size_t pad = 0;
22         int r = -ENOENT;
23
24         OpenSSL_add_all_digests();
25         md = EVP_get_digestbyname(hash_name);
26         if (md == NULL) {
27                 set_error("Unknown hash type %s", hash_name);
28                 goto out;
29         }
30
31         if (EVP_MD_size(md) > size) {
32                 set_error("requested hash length (%zd) > key length (%zd)", EVP_MD_size(md), size);
33                 return -EINVAL;
34         }
35
36         pad = size - EVP_MD_size(md);
37
38         EVP_DigestInit(&mdctx, md);
39         EVP_DigestUpdate(&mdctx, passphrase, sizep);
40         r = !EVP_DigestFinal(&mdctx, result, NULL);
41
42         if (pad) {
43                 memset(result+size, 0, pad);
44         }
45
46 out:
47         return r;
48 }
49