xref: /dragonfly/contrib/cryptsetup/lib/backends.c (revision 6f5ec8b5)
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 
init_crypto(void)10 int init_crypto(void)
11 {
12 	return 0;
13 }
14 
hash(const char * backend_name,const char * hash_name,char * result,size_t size,const char * passphrase,size_t sizep)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 	mdctx = EVP_MD_CTX_new();
39 	EVP_DigestInit(mdctx, md);
40 	EVP_DigestUpdate(mdctx, passphrase, sizep);
41 	r = !EVP_DigestFinal(mdctx, result, NULL);
42 
43 	if (pad) {
44 		memset(result+size, 0, pad);
45 	}
46 
47 	EVP_MD_CTX_free(mdctx);
48 
49 out:
50 	return r;
51 }
52 
53