EVP_MD *digest_gost2012_512(void) { if (_hidden_GostR3411_2012_512_md == NULL) { EVP_MD *md; if ((md = EVP_MD_meth_new(NID_id_GostR3411_2012_512, NID_undef)) == NULL || !EVP_MD_meth_set_result_size(md, 64) || !EVP_MD_meth_set_input_blocksize(md, 64) || !EVP_MD_meth_set_app_datasize(md, sizeof(gost2012_hash_ctx)) || !EVP_MD_meth_set_init(md, gost_digest_init512) || !EVP_MD_meth_set_update(md, gost_digest_update) || !EVP_MD_meth_set_final(md, gost_digest_final) || !EVP_MD_meth_set_copy(md, gost_digest_copy) || !EVP_MD_meth_set_ctrl(md, gost_digest_ctrl_512) || !EVP_MD_meth_set_cleanup(md, gost_digest_cleanup)) { EVP_MD_meth_free(md); md = NULL; } _hidden_GostR3411_2012_512_md = md; } return _hidden_GostR3411_2012_512_md; }
EVP_MD *digest_gost(void) { if (_hidden_GostR3411_94_md == NULL) { EVP_MD *md; if ((md = EVP_MD_meth_new(NID_id_GostR3411_94, NID_undef)) == NULL || !EVP_MD_meth_set_result_size(md, 32) || !EVP_MD_meth_set_input_blocksize(md, 32) || !EVP_MD_meth_set_app_datasize(md, sizeof(struct ossl_gost_digest_ctx)) || !EVP_MD_meth_set_init(md, gost_digest_init) || !EVP_MD_meth_set_update(md, gost_digest_update) || !EVP_MD_meth_set_final(md, gost_digest_final) || !EVP_MD_meth_set_copy(md, gost_digest_copy) || !EVP_MD_meth_set_cleanup(md, gost_digest_cleanup)) { EVP_MD_meth_free(md); md = NULL; } _hidden_GostR3411_94_md = md; } return _hidden_GostR3411_94_md; }
static void prepare_digest_methods(void) { size_t i; struct session_op sess1, sess2; #ifdef CIOCGSESSINFO struct session_info_op siop; #endif struct cphash_op cphash; memset(&digest_driver_info, 0, sizeof(digest_driver_info)); memset(&sess1, 0, sizeof(sess1)); memset(&sess2, 0, sizeof(sess2)); for (i = 0, known_digest_nids_amount = 0; i < OSSL_NELEM(digest_data); i++) { selected_digests[i] = 1; /* * Check that the digest is usable */ sess1.mac = digest_data[i].devcryptoid; sess2.ses = 0; if (ioctl(cfd, CIOCGSESSION, &sess1) < 0) { digest_driver_info[i].status = DEVCRYPTO_STATUS_NO_CIOCGSESSION; goto finish; } #ifdef CIOCGSESSINFO /* gather hardware acceleration info from the driver */ siop.ses = sess1.ses; if (ioctl(cfd, CIOCGSESSINFO, &siop) < 0) { digest_driver_info[i].accelerated = DEVCRYPTO_ACCELERATION_UNKNOWN; } else { digest_driver_info[i].driver_name = OPENSSL_strndup(siop.hash_info.cra_driver_name, CRYPTODEV_MAX_ALG_NAME); if (siop.flags & SIOP_FLAG_KERNEL_DRIVER_ONLY) digest_driver_info[i].accelerated = DEVCRYPTO_ACCELERATED; else digest_driver_info[i].accelerated = DEVCRYPTO_NOT_ACCELERATED; } #endif /* digest must be capable of hash state copy */ sess2.mac = sess1.mac; if (ioctl(cfd, CIOCGSESSION, &sess2) < 0) { digest_driver_info[i].status = DEVCRYPTO_STATUS_FAILURE; goto finish; } cphash.src_ses = sess1.ses; cphash.dst_ses = sess2.ses; if (ioctl(cfd, CIOCCPHASH, &cphash) < 0) { digest_driver_info[i].status = DEVCRYPTO_STATUS_NO_CIOCCPHASH; goto finish; } if ((known_digest_methods[i] = EVP_MD_meth_new(digest_data[i].nid, NID_undef)) == NULL || !EVP_MD_meth_set_input_blocksize(known_digest_methods[i], digest_data[i].blocksize) || !EVP_MD_meth_set_result_size(known_digest_methods[i], digest_data[i].digestlen) || !EVP_MD_meth_set_init(known_digest_methods[i], digest_init) || !EVP_MD_meth_set_update(known_digest_methods[i], digest_update) || !EVP_MD_meth_set_final(known_digest_methods[i], digest_final) || !EVP_MD_meth_set_copy(known_digest_methods[i], digest_copy) || !EVP_MD_meth_set_cleanup(known_digest_methods[i], digest_cleanup) || !EVP_MD_meth_set_app_datasize(known_digest_methods[i], sizeof(struct digest_ctx))) { digest_driver_info[i].status = DEVCRYPTO_STATUS_FAILURE; EVP_MD_meth_free(known_digest_methods[i]); known_digest_methods[i] = NULL; goto finish; } digest_driver_info[i].status = DEVCRYPTO_STATUS_USABLE; finish: ioctl(cfd, CIOCFSESSION, &sess1.ses); if (sess2.ses != 0) ioctl(cfd, CIOCFSESSION, &sess2.ses); if (devcrypto_test_digest(i)) known_digest_nids[known_digest_nids_amount++] = digest_data[i].nid; } }