Skip to content

Commit b422519

Browse files
committed
version 2.5.3
new sms4 api, go api and ciphersuites
1 parent 94f91c0 commit b422519

39 files changed

Lines changed: 23206 additions & 5690 deletions

.gitignore

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -215,3 +215,6 @@ apps/gmca/.ca
215215
include/openssl/srp.h
216216

217217
/*.sh
218+
219+
/rust
220+
/python

crypto/evp/build.info

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,3 +24,9 @@ INCLUDE[e_aes_cbc_hmac_sha256.o]=../modes
2424
INCLUDE[e_camellia.o]=.. ../modes
2525
INCLUDE[e_des.o]=..
2626
INCLUDE[e_des3.o]=..
27+
INCLUDE[e_sms4.o]=.. ../modes ../sms4
28+
INCLUDE[e_sms4_ccm.o]=.. ../modes
29+
INCLUDE[e_sms4_gcm.o]=.. ../modes
30+
INCLUDE[e_sms4_ocb.o]=.. ../modes
31+
INCLUDE[e_sms4_xts.o]=.. ../modes
32+
INCLUDE[e_sms4_wrap.o]=.. ../modes

crypto/evp/e_sms4.c

Lines changed: 32 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -60,20 +60,24 @@
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

7071
typedef 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;

crypto/evp/e_sms4_ccm.c

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -61,12 +61,12 @@
6161
#include <openssl/crypto.h>
6262
#include <openssl/objects.h>
6363
#include "evp_locl.h"
64-
# include "internal/evp_int.h"
65-
#include "../modes/modes_lcl.h"
64+
#include "internal/evp_int.h"
65+
#include "modes_lcl.h"
6666

6767
#ifndef OPENSSL_NO_SMS4
6868

69-
#include <openssl/sms4.h>
69+
# include <openssl/sms4.h>
7070

7171
typedef struct {
7272
union {
@@ -312,10 +312,10 @@ static int sms4_ccm_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out,
312312
}
313313
}
314314

315-
#define SMS4_CCM_BLOCK_SIZE 1
316-
#define SMS4_CCM_IV_LENGTH 7
315+
# define SMS4_CCM_BLOCK_SIZE 1
316+
# define SMS4_CCM_IV_LENGTH 7
317317

318-
#define SMS4_CCM_FLAGS (EVP_CIPH_FLAG_DEFAULT_ASN1 \
318+
# define SMS4_CCM_FLAGS (EVP_CIPH_FLAG_DEFAULT_ASN1 \
319319
| EVP_CIPH_CUSTOM_IV | EVP_CIPH_FLAG_CUSTOM_CIPHER \
320320
| EVP_CIPH_ALWAYS_CALL_INIT | EVP_CIPH_CTRL_INIT \
321321
| EVP_CIPH_CUSTOM_COPY \

crypto/evp/e_sms4_gcm.c

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -62,12 +62,12 @@
6262
#include <openssl/crypto.h>
6363
#include <openssl/objects.h>
6464
#include "evp_locl.h"
65-
# include "internal/evp_int.h"
66-
#include "../modes/modes_lcl.h"
65+
#include "internal/evp_int.h"
66+
#include "modes_lcl.h"
6767

6868
#ifndef OPENSSL_NO_SMS4
6969

70-
#include <openssl/sms4.h>
70+
# include <openssl/sms4.h>
7171

7272
typedef struct {
7373
union {
@@ -434,10 +434,10 @@ static int sms4_gcm_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out,
434434

435435
}
436436

437-
#define SMS4_GCM_BLOCK_SIZE 1
438-
#define SMS4_GCM_IV_LENGTH 12
437+
# define SMS4_GCM_BLOCK_SIZE 1
438+
# define SMS4_GCM_IV_LENGTH 12
439439

440-
#define SMS4_GCM_FLAGS (EVP_CIPH_FLAG_DEFAULT_ASN1 \
440+
# define SMS4_GCM_FLAGS (EVP_CIPH_FLAG_DEFAULT_ASN1 \
441441
| EVP_CIPH_CUSTOM_IV | EVP_CIPH_FLAG_CUSTOM_CIPHER \
442442
| EVP_CIPH_ALWAYS_CALL_INIT | EVP_CIPH_CTRL_INIT \
443443
| EVP_CIPH_CUSTOM_COPY | EVP_CIPH_GCM_MODE \

crypto/evp/e_sms4_ocb.c

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -61,8 +61,8 @@
6161
#include <openssl/crypto.h>
6262
#include <openssl/objects.h>
6363
#include "evp_locl.h"
64-
# include "internal/evp_int.h"
65-
#include "../modes/modes_lcl.h"
64+
#include "internal/evp_int.h"
65+
#include "modes_lcl.h"
6666

6767
#ifndef OPENSSL_NO_SMS4
6868

@@ -345,9 +345,9 @@ static int sms4_ocb_cleanup(EVP_CIPHER_CTX *c)
345345
return 1;
346346
}
347347

348-
#define SMS4_OCB_IV_LENGTH 12
348+
# define SMS4_OCB_IV_LENGTH 12
349349

350-
#define SMS4_OCB_FLAGS (EVP_CIPH_FLAG_DEFAULT_ASN1 \
350+
# define SMS4_OCB_FLAGS (EVP_CIPH_FLAG_DEFAULT_ASN1 \
351351
| EVP_CIPH_CUSTOM_IV | EVP_CIPH_FLAG_CUSTOM_CIPHER \
352352
| EVP_CIPH_ALWAYS_CALL_INIT | EVP_CIPH_CTRL_INIT \
353353
| EVP_CIPH_CUSTOM_COPY \

crypto/evp/e_sms4_wrap.c

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -61,8 +61,8 @@
6161
#include <openssl/crypto.h>
6262
#include <openssl/objects.h>
6363
#include "evp_locl.h"
64-
# include "internal/evp_int.h"
65-
#include "../modes/modes_lcl.h"
64+
#include "internal/evp_int.h"
65+
#include "modes_lcl.h"
6666

6767
#ifndef OPENSSL_NO_SMS4
6868
# include <openssl/sms4.h>
@@ -152,7 +152,7 @@ static int sms4_wrap_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out,
152152
return rv ? (int)rv : -1;
153153
}
154154

155-
#define SMS4_WRAP_FLAGS (EVP_CIPH_WRAP_MODE \
155+
# define SMS4_WRAP_FLAGS (EVP_CIPH_WRAP_MODE \
156156
| EVP_CIPH_CUSTOM_IV | EVP_CIPH_FLAG_CUSTOM_CIPHER \
157157
| EVP_CIPH_ALWAYS_CALL_INIT | EVP_CIPH_FLAG_DEFAULT_ASN1)
158158

crypto/evp/e_sms4_xts.c

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -61,8 +61,8 @@
6161
#include <openssl/crypto.h>
6262
#include <openssl/objects.h>
6363
#include "evp_locl.h"
64-
# include "internal/evp_int.h"
65-
#include "../modes/modes_lcl.h"
64+
#include "internal/evp_int.h"
65+
#include "modes_lcl.h"
6666

6767
#ifndef OPENSSL_NO_SMS4
6868
# include <openssl/sms4.h>
@@ -151,9 +151,9 @@ static int sms4_xts_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out,
151151
return 1;
152152
}
153153

154-
#define SMS4_XTS_BLOCK_SIZE 1
154+
# define SMS4_XTS_BLOCK_SIZE 1
155155

156-
#define SMS4_XTS_FLAGS (EVP_CIPH_FLAG_DEFAULT_ASN1 | EVP_CIPH_CUSTOM_IV \
156+
# define SMS4_XTS_FLAGS (EVP_CIPH_FLAG_DEFAULT_ASN1 | EVP_CIPH_CUSTOM_IV \
157157
| EVP_CIPH_ALWAYS_CALL_INIT | EVP_CIPH_CTRL_INIT \
158158
| EVP_CIPH_CUSTOM_COPY)
159159

crypto/evp/m_sm9hash2.c

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -62,17 +62,29 @@
6262

6363
static int sm9hash2_sm3_init(EVP_MD_CTX *ctx)
6464
{
65-
return 0;
65+
if (!ctx || !EVP_MD_CTX_md_data(ctx)) {
66+
return 0;
67+
}
68+
sm3_init(EVP_MD_CTX_md_data(ctx));
69+
return 1;
6670
}
6771

6872
static int sm9hash2_sm3_update(EVP_MD_CTX *ctx, const void *in, size_t inlen)
6973
{
70-
return 0;
74+
if (!ctx || !EVP_MD_CTX_md_data(ctx) || (!in && inlen != 0)) {
75+
return 0;
76+
}
77+
sm3_update(EVP_MD_CTX_md_data(ctx), in, inlen);
78+
return 1;
7179
}
7280

7381
static int sm9hash2_sm3_final(EVP_MD_CTX *ctx, unsigned char *md)
7482
{
75-
return 0;
83+
if (!ctx || !EVP_MD_CTX_md_data(ctx) || !md) {
84+
return 0;
85+
}
86+
sm3_final(EVP_MD_CTX_md_data(ctx), md);
87+
return 1;
7688
}
7789

7890
int sm9hash2_sm3_ctrl(EVP_MD_CTX *ctx, int cmd, int p1, void *p2)

crypto/include/internal/rotate.h

Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
/*
2+
* Copyright 1999-2016 The OpenSSL Project Authors. All Rights Reserved.
3+
*
4+
* Licensed under the OpenSSL license (the "License"). You may not use
5+
* this file except in compliance with the License. You can obtain a copy
6+
* in the file LICENSE in the source distribution or at
7+
* https://www.openssl.org/source/license.html
8+
*/
9+
10+
#include <openssl/crypto.h>
11+
12+
/*
13+
* Engage compiler specific rotate intrinsic function if available.
14+
*/
15+
#undef ROL32
16+
#ifndef PEDANTIC
17+
# if defined(_MSC_VER)
18+
# define ROL32(a,n) _lrotl(a,n)
19+
# elif defined(__ICC)
20+
# define ROL32(a,n) _rotl(a,n)
21+
# elif defined(__GNUC__) && __GNUC__>=2 && !defined(OPENSSL_NO_ASM) && !defined(OPENSSL_NO_INLINE_ASM)
22+
/*
23+
* Some GNU C inline assembler templates. Note that these are
24+
* rotates by *constant* number of bits! But that's exactly
25+
* what we need here...
26+
27+
*/
28+
# if defined(__i386) || defined(__i386__) || defined(__x86_64) || defined(__x86_64__)
29+
# define ROL32(a,n) ({ register unsigned int ret; \
30+
asm ( \
31+
"roll %1,%0" \
32+
: "=r"(ret) \
33+
: "I"(n), "0"((unsigned int)(a)) \
34+
: "cc"); \
35+
ret; \
36+
})
37+
# elif defined(_ARCH_PPC) || defined(_ARCH_PPC64) || \
38+
defined(__powerpc) || defined(__ppc__) || defined(__powerpc64__)
39+
# define ROL32(a,n) ({ register unsigned int ret; \
40+
asm ( \
41+
"rlwinm %0,%1,%2,0,31" \
42+
: "=r"(ret) \
43+
: "r"(a), "I"(n)); \
44+
ret; \
45+
})
46+
# elif defined(__s390x__)
47+
# define ROL32(a,n) ({ register unsigned int ret; \
48+
asm ("rll %0,%1,%2" \
49+
: "=r"(ret) \
50+
: "r"(a), "I"(n)); \
51+
ret; \
52+
})
53+
# endif
54+
# endif
55+
#endif /* PEDANTIC */
56+
57+
#ifndef ROL32
58+
# define ROL32(a,n) (((a)<<(n))|(((a)&0xffffffff)>>(32-(n))))
59+
#endif

0 commit comments

Comments
 (0)