6060#include <openssl/crypto.h>
6161#include <openssl/objects.h>
6262#include "evp_locl.h"
63- # include "internal/evp_int.h"
64- #include "../modes/ modes_lcl.h"
63+ #include "internal/evp_int.h"
64+ #include "modes_lcl.h"
6565
6666#ifndef OPENSSL_NO_SMS4
6767
6868# include <openssl/sms4.h>
69+ # include "sms4_lcl.h"
6970
7071typedef struct {
7172 block128_f block ;
7273 union {
7374 cbc128_f cbc ;
7475 ctr128_f ctr ;
7576 } stream ;
76- sms4_key_t ks ;
77+ union {
78+ double align ;
79+ sms4_key_t ks ;
80+ } ks ;
7781} EVP_SMS4_KEY ;
7882
7983
@@ -85,12 +89,19 @@ static int sms4_init_key(EVP_CIPHER_CTX *ctx, const unsigned char *key,
8589 mode = EVP_CIPHER_CTX_mode (ctx );
8690
8791 if ((mode == EVP_CIPH_ECB_MODE || mode == EVP_CIPH_CBC_MODE ) && !enc ) {
88- sms4_set_decrypt_key (& dat -> ks , key );
92+ sms4_set_decrypt_key (& dat -> ks . ks , key );
8993 } else {
90- sms4_set_encrypt_key (& dat -> ks , key );
94+ sms4_set_encrypt_key (& dat -> ks . ks , key );
9195 }
9296 dat -> block = (block128_f )sms4_encrypt ;
93- dat -> stream .cbc = mode == EVP_CIPH_CBC_MODE ? (cbc128_f ) sms4_cbc_encrypt : NULL ;
97+
98+ if (mode == EVP_CIPH_CTR_MODE ) {
99+ # ifdef SMS4_AVX2
100+ dat -> stream .ctr = (ctr128_f ) sms4_avx2_ctr32_encrypt_blocks ;
101+ # else
102+ dat -> stream .ctr = (ctr128_f ) sms4_ctr32_encrypt_blocks ;
103+ # endif
104+ }
94105
95106 return 1 ;
96107}
@@ -106,7 +117,7 @@ static int sms4_ctrl(EVP_CIPHER_CTX *c, int type, int arg, void *ptr)
106117 }
107118}
108119
109- IMPLEMENT_BLOCK_CIPHER (sms4 , ks , sms4 , EVP_SMS4_KEY , NID_sms4 ,
120+ IMPLEMENT_BLOCK_CIPHER (sms4 , ks . ks , sms4 , EVP_SMS4_KEY , NID_sms4 ,
110121 SMS4_BLOCK_SIZE , SMS4_KEY_LENGTH , SMS4_IV_LENGTH , 128 ,
111122 EVP_CIPH_FLAG_DEFAULT_ASN1 , sms4_init_key , NULL , NULL , NULL , sms4_ctrl )
112123
@@ -118,19 +129,19 @@ static int sms4_cfb1_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out,
118129 EVP_SMS4_KEY * sms4_key = (EVP_SMS4_KEY * )ctx -> cipher_data ;
119130
120131 if (ctx -> flags & EVP_CIPH_FLAG_LENGTH_BITS ) {
121- CRYPTO_cfb128_1_encrypt (in , out , len , & sms4_key -> ks ,
132+ CRYPTO_cfb128_1_encrypt (in , out , len , & sms4_key -> ks . ks ,
122133 ctx -> iv , & ctx -> num , ctx -> encrypt , (block128_f )sms4_encrypt );
123134 return 1 ;
124135 }
125136
126137 while (len >= MAXBITCHUNK ) {
127- CRYPTO_cfb128_1_encrypt (in , out , MAXBITCHUNK * 8 , & sms4_key -> ks ,
138+ CRYPTO_cfb128_1_encrypt (in , out , MAXBITCHUNK * 8 , & sms4_key -> ks . ks ,
128139 ctx -> iv , & ctx -> num , ctx -> encrypt , (block128_f )sms4_encrypt );
129140 len -= MAXBITCHUNK ;
130141 }
131142
132143 if (len ) {
133- CRYPTO_cfb128_1_encrypt (in , out , len * 8 , & sms4_key -> ks ,
144+ CRYPTO_cfb128_1_encrypt (in , out , len * 8 , & sms4_key -> ks . ks ,
134145 ctx -> iv , & ctx -> num , ctx -> encrypt , (block128_f )sms4_encrypt );
135146 }
136147
@@ -160,7 +171,7 @@ static int sms4_cfb8_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out,
160171{
161172 EVP_SMS4_KEY * sms4_key = (EVP_SMS4_KEY * )ctx -> cipher_data ;
162173
163- CRYPTO_cfb128_8_encrypt (in , out , len , & sms4_key -> ks ,
174+ CRYPTO_cfb128_8_encrypt (in , out , len , & sms4_key -> ks . ks ,
164175 ctx -> iv , & ctx -> num , ctx -> encrypt , (block128_f )sms4_encrypt );
165176
166177 return 1 ;
@@ -190,10 +201,16 @@ static int sms4_ctr_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out,
190201 unsigned int num = EVP_CIPHER_CTX_num (ctx );
191202 EVP_SMS4_KEY * sms4 = (EVP_SMS4_KEY * )ctx -> cipher_data ;
192203
193- CRYPTO_ctr128_encrypt (in , out , len , & sms4 -> ks ,
194- EVP_CIPHER_CTX_iv_noconst (ctx ),
195- EVP_CIPHER_CTX_buf_noconst (ctx ), & num ,
196- sms4 -> block );
204+ if (sms4 -> stream .ctr )
205+ CRYPTO_ctr128_encrypt_ctr32 (in , out , len , & sms4 -> ks .ks ,
206+ EVP_CIPHER_CTX_iv_noconst (ctx ),
207+ EVP_CIPHER_CTX_buf_noconst (ctx ),
208+ & num , sms4 -> stream .ctr );
209+ else
210+ CRYPTO_ctr128_encrypt (in , out , len , & sms4 -> ks .ks ,
211+ EVP_CIPHER_CTX_iv_noconst (ctx ),
212+ EVP_CIPHER_CTX_buf_noconst (ctx ), & num ,
213+ sms4 -> block );
197214
198215 EVP_CIPHER_CTX_set_num (ctx , num );
199216 return 1 ;
0 commit comments