+ GRASSHOPPER_CIPHER_CTRACPKMOMAC,
+};
+
+static GOST_cipher grasshopper_template_cipher = {
+ .block_size = GRASSHOPPER_BLOCK_SIZE,
+ .key_len = GRASSHOPPER_KEY_SIZE,
+ .flags = EVP_CIPH_RAND_KEY |
+ EVP_CIPH_ALWAYS_CALL_INIT,
+ .cleanup = gost_grasshopper_cipher_cleanup,
+ .ctx_size = sizeof(gost_grasshopper_cipher_ctx),
+ .set_asn1_parameters = gost_grasshopper_set_asn1_parameters,
+ .get_asn1_parameters = gost_grasshopper_get_asn1_parameters,
+ .ctrl = gost_grasshopper_cipher_ctl,
+};
+
+GOST_cipher grasshopper_ecb_cipher = {
+ .nid = NID_grasshopper_ecb,
+ .template = &grasshopper_template_cipher,
+ .flags = EVP_CIPH_ECB_MODE,
+ .init = gost_grasshopper_cipher_init_ecb,
+ .do_cipher = gost_grasshopper_cipher_do_ecb,
+};
+
+GOST_cipher grasshopper_cbc_cipher = {
+ .nid = NID_grasshopper_cbc,
+ .template = &grasshopper_template_cipher,
+ .iv_len = 16,
+ .flags = EVP_CIPH_CBC_MODE |
+ EVP_CIPH_CUSTOM_IV,
+ .init = gost_grasshopper_cipher_init_cbc,
+ .do_cipher = gost_grasshopper_cipher_do_cbc,
+};
+
+GOST_cipher grasshopper_ofb_cipher = {
+ .nid = NID_grasshopper_ofb,
+ .template = &grasshopper_template_cipher,
+ .block_size = 1,
+ .iv_len = 16,
+ .flags = EVP_CIPH_OFB_MODE |
+ EVP_CIPH_NO_PADDING |
+ EVP_CIPH_CUSTOM_IV,
+ .init = gost_grasshopper_cipher_init_ofb,
+ .do_cipher = gost_grasshopper_cipher_do_ofb,
+};
+
+GOST_cipher grasshopper_cfb_cipher = {
+ .nid = NID_grasshopper_cfb,
+ .template = &grasshopper_template_cipher,
+ .block_size = 1,
+ .iv_len = 16,
+ .flags = EVP_CIPH_CFB_MODE |
+ EVP_CIPH_NO_PADDING |
+ EVP_CIPH_CUSTOM_IV,
+ .init = gost_grasshopper_cipher_init_cfb,
+ .do_cipher = gost_grasshopper_cipher_do_cfb,