xref: /dflybsd-src/contrib/cryptsetup/lib/backends.c (revision 6f5ec8b51c959914fd0128aa84612579c0400168)
1bf114f1dSAlex Hornung #include <stdio.h>
2bf114f1dSAlex Hornung #include <string.h>
3bf114f1dSAlex Hornung #include <stdlib.h>
4bf114f1dSAlex Hornung #include <errno.h>
513af8cbeSAlex Hornung #include <openssl/evp.h>
6bf114f1dSAlex Hornung 
7bf114f1dSAlex Hornung #include "libcryptsetup.h"
8bf114f1dSAlex Hornung #include "internal.h"
9bf114f1dSAlex Hornung 
init_crypto(void)1013af8cbeSAlex Hornung int init_crypto(void)
11bf114f1dSAlex Hornung {
1213af8cbeSAlex Hornung 	return 0;
13bf114f1dSAlex Hornung }
14bf114f1dSAlex Hornung 
hash(const char * backend_name,const char * hash_name,char * result,size_t size,const char * passphrase,size_t sizep)15bf114f1dSAlex Hornung int hash(const char *backend_name, const char *hash_name,
16bf114f1dSAlex Hornung          char *result, size_t size,
17bf114f1dSAlex Hornung          const char *passphrase, size_t sizep)
18bf114f1dSAlex Hornung {
19*6f5ec8b5SAntonio Huete Jimenez 	EVP_MD_CTX *mdctx;
2013af8cbeSAlex Hornung 	const EVP_MD *md;
21bf114f1dSAlex Hornung 	size_t pad = 0;
22bf114f1dSAlex Hornung 	int r = -ENOENT;
23bf114f1dSAlex Hornung 
2413af8cbeSAlex Hornung 	OpenSSL_add_all_digests();
2513af8cbeSAlex Hornung 	md = EVP_get_digestbyname(hash_name);
2613af8cbeSAlex Hornung 	if (md == NULL) {
27bf114f1dSAlex Hornung 		set_error("Unknown hash type %s", hash_name);
28bf114f1dSAlex Hornung 		goto out;
29bf114f1dSAlex Hornung 	}
30bf114f1dSAlex Hornung 
3113af8cbeSAlex Hornung 	if (EVP_MD_size(md) > size) {
3213af8cbeSAlex Hornung 		set_error("requested hash length (%zd) > key length (%zd)", EVP_MD_size(md), size);
3313af8cbeSAlex Hornung 		return -EINVAL;
34bf114f1dSAlex Hornung 	}
35bf114f1dSAlex Hornung 
3613af8cbeSAlex Hornung 	pad = size - EVP_MD_size(md);
3713af8cbeSAlex Hornung 
38*6f5ec8b5SAntonio Huete Jimenez 	mdctx = EVP_MD_CTX_new();
39*6f5ec8b5SAntonio Huete Jimenez 	EVP_DigestInit(mdctx, md);
40*6f5ec8b5SAntonio Huete Jimenez 	EVP_DigestUpdate(mdctx, passphrase, sizep);
41*6f5ec8b5SAntonio Huete Jimenez 	r = !EVP_DigestFinal(mdctx, result, NULL);
4213af8cbeSAlex Hornung 
43bf114f1dSAlex Hornung 	if (pad) {
44bf114f1dSAlex Hornung 		memset(result+size, 0, pad);
45bf114f1dSAlex Hornung 	}
46bf114f1dSAlex Hornung 
47*6f5ec8b5SAntonio Huete Jimenez 	EVP_MD_CTX_free(mdctx);
48*6f5ec8b5SAntonio Huete Jimenez 
49bf114f1dSAlex Hornung out:
50bf114f1dSAlex Hornung 	return r;
51bf114f1dSAlex Hornung }
5213af8cbeSAlex Hornung 
53