+/* compute the hash of a password */
+void digest_message(const unsigned char *message,
+ size_t message_len, unsigned char **digest, unsigned int *digest_len)
+{
+ EVP_MD_CTX *mdctx;
+
+ if((mdctx = EVP_MD_CTX_new()) == NULL)
+ goto err;
+
+ if(1 != EVP_DigestInit_ex(mdctx, EVP_sha256(), NULL))
+ goto err;
+
+ if(1 != EVP_DigestUpdate(mdctx, message, message_len))
+ goto err;
+
+ if((*digest = (unsigned char *)
+ OPENSSL_malloc(EVP_MD_size(EVP_sha256()))) == NULL)
+ goto err;
+
+ if(1 != EVP_DigestFinal_ex(mdctx, *digest, digest_len))
+ goto err;
+
+ EVP_MD_CTX_free(mdctx);
+ return;
+err:
+ EVP_MD_CTX_free(mdctx);
+ ERR_print_errors_fp(stderr);
+ exit (2);
+}