- if (_hidden_Gost28147_89_cipher == NULL
- && ((_hidden_Gost28147_89_cipher =
- EVP_CIPHER_meth_new(NID_id_Gost28147_89, 1 /* block_size */ ,
- 32 /* key_size */ )) == NULL
- || !EVP_CIPHER_meth_set_iv_length(_hidden_Gost28147_89_cipher, 8)
- || !EVP_CIPHER_meth_set_flags(_hidden_Gost28147_89_cipher,
- EVP_CIPH_CFB_MODE |
- EVP_CIPH_NO_PADDING |
- EVP_CIPH_CUSTOM_IV |
- EVP_CIPH_RAND_KEY |
- EVP_CIPH_ALWAYS_CALL_INIT)
- || !EVP_CIPHER_meth_set_init(_hidden_Gost28147_89_cipher,
- gost_cipher_init)
- || !EVP_CIPHER_meth_set_do_cipher(_hidden_Gost28147_89_cipher,
- gost_cipher_do_cfb)
- || !EVP_CIPHER_meth_set_cleanup(_hidden_Gost28147_89_cipher,
- gost_cipher_cleanup)
- || !EVP_CIPHER_meth_set_impl_ctx_size(_hidden_Gost28147_89_cipher,
- sizeof(struct
- ossl_gost_cipher_ctx))
- ||
- !EVP_CIPHER_meth_set_set_asn1_params(_hidden_Gost28147_89_cipher,
- gost89_set_asn1_parameters)
- ||
- !EVP_CIPHER_meth_set_get_asn1_params(_hidden_Gost28147_89_cipher,
- gost89_get_asn1_parameters)
- || !EVP_CIPHER_meth_set_ctrl(_hidden_Gost28147_89_cipher,
- gost_cipher_ctl))) {
- EVP_CIPHER_meth_free(_hidden_Gost28147_89_cipher);
- _hidden_Gost28147_89_cipher = NULL;
+ if (c->cipher)
+ return c->cipher;
+
+ EVP_CIPHER *cipher;
+ if (!(cipher = EVP_CIPHER_meth_new(c->nid, c->block_size, c->key_len))
+ || !EVP_CIPHER_meth_set_iv_length(cipher, c->iv_len)
+ || !EVP_CIPHER_meth_set_flags(cipher, c->flags)
+ || !EVP_CIPHER_meth_set_init(cipher, c->init)
+ || !EVP_CIPHER_meth_set_do_cipher(cipher, c->do_cipher)
+ || !EVP_CIPHER_meth_set_cleanup(cipher, c->cleanup)
+ || !EVP_CIPHER_meth_set_impl_ctx_size(cipher, c->ctx_size)
+ || !EVP_CIPHER_meth_set_set_asn1_params(cipher, c->set_asn1_parameters)
+ || !EVP_CIPHER_meth_set_get_asn1_params(cipher, c->get_asn1_parameters)
+ || !EVP_CIPHER_meth_set_ctrl(cipher, c->ctrl)) {
+ EVP_CIPHER_meth_free(cipher);
+ cipher = NULL;
+ }
+ c->cipher = cipher;
+ return c->cipher;
+}
+
+void GOST_deinit_cipher(GOST_cipher *c)
+{
+ if (c->cipher) {
+ EVP_CIPHER_meth_free(c->cipher);
+ c->cipher = NULL;