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