xref: /dflybsd-src/contrib/cryptsetup/lib/backends.c (revision 13af8cbe6284cbda4dc449c84da098f9d4f181b0)
1bf114f1dSAlex Hornung #include <stdio.h>
2bf114f1dSAlex Hornung #include <string.h>
3bf114f1dSAlex Hornung #include <stdlib.h>
4bf114f1dSAlex Hornung #include <errno.h>
5*13af8cbeSAlex Hornung #include <openssl/evp.h>
6bf114f1dSAlex Hornung 
7bf114f1dSAlex Hornung #include "libcryptsetup.h"
8bf114f1dSAlex Hornung #include "internal.h"
9bf114f1dSAlex Hornung 
10*13af8cbeSAlex Hornung int init_crypto(void)
11bf114f1dSAlex Hornung {
12*13af8cbeSAlex Hornung 	return 0;
13bf114f1dSAlex Hornung }
14bf114f1dSAlex Hornung 
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*13af8cbeSAlex Hornung 	EVP_MD_CTX mdctx;
20*13af8cbeSAlex Hornung 	const EVP_MD *md;
21bf114f1dSAlex Hornung 	size_t pad = 0;
22bf114f1dSAlex Hornung 	int r = -ENOENT;
23bf114f1dSAlex Hornung 
24*13af8cbeSAlex Hornung 	OpenSSL_add_all_digests();
25*13af8cbeSAlex Hornung 	md = EVP_get_digestbyname(hash_name);
26*13af8cbeSAlex Hornung 	if (md == NULL) {
27bf114f1dSAlex Hornung 		set_error("Unknown hash type %s", hash_name);
28bf114f1dSAlex Hornung 		goto out;
29bf114f1dSAlex Hornung 	}
30bf114f1dSAlex Hornung 
31*13af8cbeSAlex Hornung 	if (EVP_MD_size(md) > size) {
32*13af8cbeSAlex Hornung 		set_error("requested hash length (%zd) > key length (%zd)", EVP_MD_size(md), size);
33*13af8cbeSAlex Hornung 		return -EINVAL;
34bf114f1dSAlex Hornung 	}
35bf114f1dSAlex Hornung 
36*13af8cbeSAlex Hornung 	pad = size - EVP_MD_size(md);
37*13af8cbeSAlex Hornung 
38*13af8cbeSAlex Hornung 	EVP_DigestInit(&mdctx, md);
39*13af8cbeSAlex Hornung 	EVP_DigestUpdate(&mdctx, passphrase, sizep);
40*13af8cbeSAlex Hornung 	EVP_DigestFinal(&mdctx, result, NULL);
41*13af8cbeSAlex Hornung 
42bf114f1dSAlex Hornung 	if (pad) {
43bf114f1dSAlex Hornung 		memset(result+size, 0, pad);
44bf114f1dSAlex Hornung 	}
45bf114f1dSAlex Hornung 
46bf114f1dSAlex Hornung out:
47bf114f1dSAlex Hornung 	return r;
48bf114f1dSAlex Hornung }
49*13af8cbeSAlex Hornung 
50