@@ -54,6 +54,8 @@ static int magma_cipher_init(EVP_CIPHER_CTX *ctx, const unsigned char *key,
5454static int magma_cipher_init_ctr_acpkm_omac (EVP_CIPHER_CTX * ctx , const unsigned char * key ,
5555 const unsigned char * iv , int enc );
5656/* Handles block of data in CBC mode */
57+ static int magma_cipher_do_ecb (EVP_CIPHER_CTX * ctx , unsigned char * out ,
58+ const unsigned char * in , size_t inl );
5759static int magma_cipher_do_cbc (EVP_CIPHER_CTX * ctx , unsigned char * out ,
5860 const unsigned char * in , size_t inl );
5961static int magma_cipher_do_ctr (EVP_CIPHER_CTX * ctx , unsigned char * out ,
@@ -187,8 +189,7 @@ GOST_cipher Gost28147_89_cnt_12_cipher = {
187189static GOST_cipher magma_template_cipher = {
188190 .block_size = 8 ,
189191 .key_len = 32 ,
190- .iv_len = 8 ,
191- .flags = EVP_CIPH_CUSTOM_IV |
192+ .flags =
192193 EVP_CIPH_RAND_KEY |
193194 EVP_CIPH_ALWAYS_CALL_INIT ,
194195 .cleanup = gost_cipher_cleanup ,
@@ -205,6 +206,7 @@ GOST_cipher magma_ctr_cipher = {
205206 .block_size = 1 ,
206207 .iv_len = 4 ,
207208 .flags = EVP_CIPH_CTR_MODE |
209+ EVP_CIPH_CUSTOM_IV |
208210 EVP_CIPH_NO_PADDING ,
209211 .init = magma_cipher_init ,
210212};
@@ -215,6 +217,7 @@ GOST_cipher magma_ctr_acpkm_cipher = {
215217 .block_size = 1 ,
216218 .iv_len = 4 ,
217219 .flags = EVP_CIPH_CTR_MODE |
220+ EVP_CIPH_CUSTOM_IV |
218221 EVP_CIPH_NO_PADDING ,
219222 .init = magma_cipher_init ,
220223};
@@ -225,6 +228,7 @@ GOST_cipher magma_ctr_acpkm_omac_cipher = {
225228 .block_size = 1 ,
226229 .iv_len = 4 ,
227230 .flags = EVP_CIPH_CTR_MODE |
231+ EVP_CIPH_CUSTOM_IV |
228232 EVP_CIPH_NO_PADDING |
229233 EVP_CIPH_CUSTOM_COPY |
230234 EVP_CIPH_FLAG_CUSTOM_CIPHER |
@@ -234,10 +238,20 @@ GOST_cipher magma_ctr_acpkm_omac_cipher = {
234238 .ctrl = magma_cipher_ctl_acpkm_omac ,
235239};
236240
241+ GOST_cipher magma_ecb_cipher = {
242+ .nid = NID_magma_ecb ,
243+ .template = & magma_template_cipher ,
244+ .flags = EVP_CIPH_ECB_MODE ,
245+ .init = magma_cipher_init ,
246+ .do_cipher = magma_cipher_do_ecb ,
247+ };
248+
237249GOST_cipher magma_cbc_cipher = {
238250 .nid = NID_magma_cbc ,
239251 .template = & gost_template_cipher ,
240- .flags = EVP_CIPH_CBC_MODE ,
252+ .iv_len = 8 ,
253+ .flags = EVP_CIPH_CBC_MODE |
254+ EVP_CIPH_CUSTOM_IV ,
241255 .init = magma_cipher_init ,
242256 .do_cipher = magma_cipher_do_cbc ,
243257};
@@ -592,6 +606,29 @@ static int gost_cipher_do_cbc(EVP_CIPHER_CTX *ctx, unsigned char *out,
592606 return 1 ;
593607}
594608
609+ /* MAGMA encryption in ECB mode */
610+ static int magma_cipher_do_ecb (EVP_CIPHER_CTX * ctx , unsigned char * out ,
611+ const unsigned char * in , size_t inl )
612+ {
613+ struct ossl_gost_cipher_ctx * c = EVP_CIPHER_CTX_get_cipher_data (ctx );
614+ if (EVP_CIPHER_CTX_encrypting (ctx )) {
615+ while (inl > 0 ) {
616+ magmacrypt (& (c -> cctx ), in , out );
617+ out += 8 ;
618+ in += 8 ;
619+ inl -= 8 ;
620+ }
621+ } else {
622+ while (inl > 0 ) {
623+ magmadecrypt (& (c -> cctx ), in , out );
624+ out += 8 ;
625+ in += 8 ;
626+ inl -= 8 ;
627+ }
628+ }
629+ return 1 ;
630+ }
631+
595632/* MAGMA encryption in CBC mode */
596633static int magma_cipher_do_cbc (EVP_CIPHER_CTX * ctx , unsigned char * out ,
597634 const unsigned char * in , size_t inl )
0 commit comments