static void prepare_digest_methods() { size_t i; struct session_op sess; int cfd; if ((cfd = open("/dev/crypto", O_RDWR, 0)) < 0) return; memset(&sess, 0, sizeof(sess)); for (i = 0, known_digest_nids_amount = 0; i < OSSL_NELEM(digest_data); i++) { /* * Check that the algo is really availably by trying to open and close * a session. */ sess.mac = digest_data[i].devcryptoid; if (ioctl(cfd, CIOCGSESSION, &sess) < 0 || ioctl(cfd, CIOCFSESSION, &sess) < 0) continue; if ((known_digest_methods[i] = EVP_MD_meth_new(digest_data[i].nid, NID_undef)) == NULL || !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_cleanup(known_digest_methods[i], digest_cleanup) || !EVP_MD_meth_set_app_datasize(known_digest_methods[i], sizeof(struct digest_ctx))) { EVP_MD_meth_free(known_digest_methods[i]); known_digest_methods[i] = NULL; } else { known_digest_nids[known_digest_nids_amount++] = digest_data[i].nid; } } close(cfd); }
static const EVP_MD *digest_md5(void) { if (_hidden_md5_md == NULL) { EVP_MD *md; if ((md = EVP_MD_meth_new(NID_md5, NID_md5WithRSAEncryption)) == NULL || !EVP_MD_meth_set_result_size(md, MD5_DIGEST_LENGTH) || !EVP_MD_meth_set_input_blocksize(md, MD5_CBLOCK) || !EVP_MD_meth_set_app_datasize(md, sizeof(EVP_MD *) + sizeof(MD5_CTX)) || !EVP_MD_meth_set_flags(md, 0) || !EVP_MD_meth_set_init(md, digest_md5_init) || !EVP_MD_meth_set_update(md, digest_md5_update) || !EVP_MD_meth_set_final(md, digest_md5_final)) { EVP_MD_meth_free(md); md = NULL; } _hidden_md5_md = md; } return _hidden_md5_md; }
static const EVP_MD *digest_sha512(void) { if (_hidden_sha512_md == NULL) { EVP_MD *md; if ((md = EVP_MD_meth_new(NID_sha512, NID_sha512WithRSAEncryption)) == NULL || !EVP_MD_meth_set_result_size(md, SHA512_DIGEST_LENGTH) || !EVP_MD_meth_set_input_blocksize(md, SHA512_CBLOCK) || !EVP_MD_meth_set_app_datasize(md, sizeof(EVP_MD *) + sizeof(SHA512_CTX)) || !EVP_MD_meth_set_flags(md, EVP_MD_FLAG_DIGALGID_ABSENT) || !EVP_MD_meth_set_init(md, digest_sha512_init) || !EVP_MD_meth_set_update(md, digest_sha512_update) || !EVP_MD_meth_set_final(md, digest_sha512_final)) { EVP_MD_meth_free(md); md = NULL; } _hidden_sha512_md = md; } return _hidden_sha512_md; }
static const EVP_MD *test_sha_md(void) { if (sha1_md == NULL) { EVP_MD *md; if ((md = EVP_MD_meth_new(NID_sha1, NID_sha1WithRSAEncryption)) == NULL || !EVP_MD_meth_set_result_size(md, SHA_DIGEST_LENGTH) || !EVP_MD_meth_set_input_blocksize(md, SHA_CBLOCK) || !EVP_MD_meth_set_app_datasize(md, sizeof(EVP_MD *) + sizeof(SHA_CTX)) || !EVP_MD_meth_set_flags(md, 0) || !EVP_MD_meth_set_init(md, test_sha1_init) || !EVP_MD_meth_set_update(md, test_sha1_update) || !EVP_MD_meth_set_final(md, test_sha1_final)) { EVP_MD_meth_free(md); md = NULL; } sha1_md = md; } return sha1_md; }
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 int bind_dasync(ENGINE *e) { /* Setup RSA_METHOD */ if ((dasync_rsa_method = RSA_meth_new("Dummy Async RSA method", 0)) == NULL || RSA_meth_set_pub_enc(dasync_rsa_method, dasync_pub_enc) == 0 || RSA_meth_set_pub_dec(dasync_rsa_method, dasync_pub_dec) == 0 || RSA_meth_set_priv_enc(dasync_rsa_method, dasync_rsa_priv_enc) == 0 || RSA_meth_set_priv_dec(dasync_rsa_method, dasync_rsa_priv_dec) == 0 || RSA_meth_set_mod_exp(dasync_rsa_method, dasync_rsa_mod_exp) == 0 || RSA_meth_set_bn_mod_exp(dasync_rsa_method, BN_mod_exp_mont) == 0 || RSA_meth_set_init(dasync_rsa_method, dasync_rsa_init) == 0 || RSA_meth_set_finish(dasync_rsa_method, dasync_rsa_finish) == 0) { DASYNCerr(DASYNC_F_BIND_DASYNC, DASYNC_R_INIT_FAILED); return 0; } /* Ensure the dasync error handling is set up */ ERR_load_DASYNC_strings(); if (!ENGINE_set_id(e, engine_dasync_id) || !ENGINE_set_name(e, engine_dasync_name) || !ENGINE_set_RSA(e, dasync_rsa_method) || !ENGINE_set_digests(e, dasync_digests) || !ENGINE_set_ciphers(e, dasync_ciphers) || !ENGINE_set_destroy_function(e, dasync_destroy) || !ENGINE_set_init_function(e, dasync_init) || !ENGINE_set_finish_function(e, dasync_finish)) { DASYNCerr(DASYNC_F_BIND_DASYNC, DASYNC_R_INIT_FAILED); return 0; } /* * Set up the EVP_CIPHER and EVP_MD objects for the ciphers/digests * supplied by this engine */ _hidden_sha1_md = EVP_MD_meth_new(NID_sha1, NID_sha1WithRSAEncryption); if (_hidden_sha1_md == NULL || !EVP_MD_meth_set_result_size(_hidden_sha1_md, SHA_DIGEST_LENGTH) || !EVP_MD_meth_set_input_blocksize(_hidden_sha1_md, SHA_CBLOCK) || !EVP_MD_meth_set_app_datasize(_hidden_sha1_md, sizeof(EVP_MD *) + sizeof(SHA_CTX)) || !EVP_MD_meth_set_flags(_hidden_sha1_md, EVP_MD_FLAG_DIGALGID_ABSENT) || !EVP_MD_meth_set_init(_hidden_sha1_md, dasync_sha1_init) || !EVP_MD_meth_set_update(_hidden_sha1_md, dasync_sha1_update) || !EVP_MD_meth_set_final(_hidden_sha1_md, dasync_sha1_final)) { EVP_MD_meth_free(_hidden_sha1_md); _hidden_sha1_md = NULL; } _hidden_aes_128_cbc = EVP_CIPHER_meth_new(NID_aes_128_cbc, 16 /* block size */, 16 /* key len */); if (_hidden_aes_128_cbc == NULL || !EVP_CIPHER_meth_set_iv_length(_hidden_aes_128_cbc,16) || !EVP_CIPHER_meth_set_flags(_hidden_aes_128_cbc, EVP_CIPH_FLAG_DEFAULT_ASN1 | EVP_CIPH_CBC_MODE | EVP_CIPH_FLAG_PIPELINE) || !EVP_CIPHER_meth_set_init(_hidden_aes_128_cbc, dasync_aes128_init_key) || !EVP_CIPHER_meth_set_do_cipher(_hidden_aes_128_cbc, dasync_aes128_cbc_cipher) || !EVP_CIPHER_meth_set_cleanup(_hidden_aes_128_cbc, dasync_aes128_cbc_cleanup) || !EVP_CIPHER_meth_set_ctrl(_hidden_aes_128_cbc, dasync_aes128_cbc_ctrl) || !EVP_CIPHER_meth_set_impl_ctx_size(_hidden_aes_128_cbc, sizeof(struct dasync_pipeline_ctx))) { EVP_CIPHER_meth_free(_hidden_aes_128_cbc); _hidden_aes_128_cbc = NULL; } _hidden_aes_128_cbc_hmac_sha1 = EVP_CIPHER_meth_new( NID_aes_128_cbc_hmac_sha1, 16 /* block size */, 16 /* key len */); if (_hidden_aes_128_cbc_hmac_sha1 == NULL || !EVP_CIPHER_meth_set_iv_length(_hidden_aes_128_cbc_hmac_sha1,16) || !EVP_CIPHER_meth_set_flags(_hidden_aes_128_cbc_hmac_sha1, EVP_CIPH_CBC_MODE | EVP_CIPH_FLAG_DEFAULT_ASN1 | EVP_CIPH_FLAG_AEAD_CIPHER | EVP_CIPH_FLAG_PIPELINE) || !EVP_CIPHER_meth_set_init(_hidden_aes_128_cbc_hmac_sha1, dasync_aes128_cbc_hmac_sha1_init_key) || !EVP_CIPHER_meth_set_do_cipher(_hidden_aes_128_cbc_hmac_sha1, dasync_aes128_cbc_hmac_sha1_cipher) || !EVP_CIPHER_meth_set_cleanup(_hidden_aes_128_cbc_hmac_sha1, dasync_aes128_cbc_hmac_sha1_cleanup) || !EVP_CIPHER_meth_set_ctrl(_hidden_aes_128_cbc_hmac_sha1, dasync_aes128_cbc_hmac_sha1_ctrl) || !EVP_CIPHER_meth_set_impl_ctx_size(_hidden_aes_128_cbc_hmac_sha1, sizeof(struct dasync_pipeline_ctx))) { EVP_CIPHER_meth_free(_hidden_aes_128_cbc_hmac_sha1); _hidden_aes_128_cbc_hmac_sha1 = NULL; } return 1; }
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; } }