#include #include #include #include #include #include "libcryptsetup.h" #include "internal.h" int init_crypto(void) { return 0; } int hash(const char *backend_name, const char *hash_name, char *result, size_t size, const char *passphrase, size_t sizep) { EVP_MD_CTX *mdctx; const EVP_MD *md; size_t pad = 0; int r = -ENOENT; OpenSSL_add_all_digests(); md = EVP_get_digestbyname(hash_name); if (md == NULL) { set_error("Unknown hash type %s", hash_name); goto out; } if (EVP_MD_size(md) > size) { set_error("requested hash length (%zd) > key length (%zd)", EVP_MD_size(md), size); return -EINVAL; } pad = size - EVP_MD_size(md); mdctx = EVP_MD_CTX_new(); EVP_DigestInit(mdctx, md); EVP_DigestUpdate(mdctx, passphrase, sizep); r = !EVP_DigestFinal(mdctx, result, NULL); if (pad) { memset(result+size, 0, pad); } EVP_MD_CTX_free(mdctx); out: return r; }