+ EVP_MD_CTX *ctx = EVP_MD_CTX_new();
+ EVP_MD *sha256 = EVP_MD_fetch(libctx, "SHA256", NULL);
+ char msg[] = "Hello World!";
+ const unsigned char exptd[] = {
+ 0x7f, 0x83, 0xb1, 0x65, 0x7f, 0xf1, 0xfc, 0x53, 0xb9, 0x2d, 0xc1, 0x81,
+ 0x48, 0xa1, 0xd6, 0x5d, 0xfc, 0x2d, 0x4b, 0x1f, 0xa3, 0xd6, 0x77, 0x28,
+ 0x4a, 0xdd, 0xd2, 0x00, 0x12, 0x6d, 0x90, 0x69
+ };
+ unsigned int dgstlen = 0;
+ unsigned char dgst[SHA256_DIGEST_LENGTH];
+ int ret = 0;
+
+ if (ctx == NULL || sha256 == NULL)
+ goto err;
+
+ if (!EVP_DigestInit_ex(ctx, sha256, NULL))
+ goto err;
+ if (!EVP_DigestUpdate(ctx, msg, sizeof(msg) - 1))
+ goto err;
+ if (!EVP_DigestFinal(ctx, dgst, &dgstlen))
+ goto err;
+ if (dgstlen != sizeof(exptd) || memcmp(dgst, exptd, sizeof(exptd)) != 0)
+ goto err;
+
+ ret = 1;
+ err:
+ EVP_MD_CTX_free(ctx);
+ EVP_MD_meth_free(sha256);
+ return ret;