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