summaryrefslogtreecommitdiff
path: root/src/lib
diff options
context:
space:
mode:
authorjsing <>2022-09-03 20:02:17 +0000
committerjsing <>2022-09-03 20:02:17 +0000
commit5f08472f8305c7336ca9acc5587cebd87a292439 (patch)
tree47d7a86903b7a03d8823013956c6369288f17066 /src/lib
parentae7e95885a19d88915cffbfaa9b7f832f0c0c7e9 (diff)
downloadopenbsd-5f08472f8305c7336ca9acc5587cebd87a292439.tar.gz
openbsd-5f08472f8305c7336ca9acc5587cebd87a292439.tar.bz2
openbsd-5f08472f8305c7336ca9acc5587cebd87a292439.zip
Mechanically expand IMPLEMENT_BLOCK_CIPHER macro.
No change in generated assembly.
Diffstat (limited to 'src/lib')
-rw-r--r--src/lib/libcrypto/evp/e_sm4.c166
1 files changed, 162 insertions, 4 deletions
diff --git a/src/lib/libcrypto/evp/e_sm4.c b/src/lib/libcrypto/evp/e_sm4.c
index 554915b29c..9003abccc3 100644
--- a/src/lib/libcrypto/evp/e_sm4.c
+++ b/src/lib/libcrypto/evp/e_sm4.c
@@ -1,4 +1,4 @@
1/* $OpenBSD: e_sm4.c,v 1.1 2019/03/17 17:42:37 tb Exp $ */ 1/* $OpenBSD: e_sm4.c,v 1.2 2022/09/03 20:02:17 jsing Exp $ */
2/* 2/*
3 * Copyright (c) 2017, 2019 Ribose Inc 3 * Copyright (c) 2017, 2019 Ribose Inc
4 * 4 *
@@ -74,14 +74,172 @@ sm4_ofb128_encrypt(const unsigned char *in, unsigned char *out, size_t length,
74 (block128_f)SM4_encrypt); 74 (block128_f)SM4_encrypt);
75} 75}
76 76
77IMPLEMENT_BLOCK_CIPHER(sm4, ks, sm4, EVP_SM4_KEY, NID_sm4, 16, 16, 16, 128, 77static int
78 EVP_CIPH_FLAG_DEFAULT_ASN1, sm4_init_key, NULL, 0, 0, 0) 78sm4_cbc_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out, const unsigned char *in, size_t inl)
79{
80 while (inl >= EVP_MAXCHUNK) {
81 sm4_cbc_encrypt(in, out, (long)EVP_MAXCHUNK, &((EVP_SM4_KEY *)ctx->cipher_data)->ks, ctx->iv, ctx->encrypt);
82 inl -= EVP_MAXCHUNK;
83 in += EVP_MAXCHUNK;
84 out += EVP_MAXCHUNK;
85 }
86
87 if (inl)
88 sm4_cbc_encrypt(in, out, (long)inl, &((EVP_SM4_KEY *)ctx->cipher_data)->ks, ctx->iv, ctx->encrypt);
89
90 return 1;
91}
92
93static int
94sm4_cfb128_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out, const unsigned char *in, size_t inl)
95{
96 size_t chunk = EVP_MAXCHUNK;
97
98 if (128 == 1)
99 chunk >>= 3;
100
101 if (inl < chunk)
102 chunk = inl;
103
104 while (inl && inl >= chunk) {
105 sm4_cfb128_encrypt(in, out, (long)((128 == 1) && !(ctx->flags & EVP_CIPH_FLAG_LENGTH_BITS) ? inl * 8 : inl), &((EVP_SM4_KEY *)ctx->cipher_data)->ks, ctx->iv, &ctx->num, ctx->encrypt);
106 inl -= chunk;
107 in += chunk;
108 out += chunk;
109 if (inl < chunk)
110 chunk = inl;
111 }
112
113 return 1;
114}
115
116static int
117sm4_ecb_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out, const unsigned char *in, size_t inl)
118{
119 size_t i, bl;
120
121 bl = ctx->cipher->block_size;
122
123 if (inl < bl)
124 return 1;
125
126 inl -= bl;
127
128 for (i = 0; i <= inl; i += bl)
129 sm4_ecb_encrypt(in + i, out + i, &((EVP_SM4_KEY *)ctx->cipher_data)->ks, ctx->encrypt);
130
131 return 1;
132}
133
134static int
135sm4_ofb_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out, const unsigned char *in, size_t inl)
136{
137 while (inl >= EVP_MAXCHUNK) {
138 sm4_ofb128_encrypt(in, out, (long)EVP_MAXCHUNK, &((EVP_SM4_KEY *)ctx->cipher_data)->ks, ctx->iv, &ctx->num);
139 inl -= EVP_MAXCHUNK;
140 in += EVP_MAXCHUNK;
141 out += EVP_MAXCHUNK;
142 }
143
144 if (inl)
145 sm4_ofb128_encrypt(in, out, (long)inl, &((EVP_SM4_KEY *)ctx->cipher_data)->ks, ctx->iv, &ctx->num);
146
147 return 1;
148}
149
150static const EVP_CIPHER sm4_cbc = {
151 .nid = NID_sm4_cbc,
152 .block_size = 16,
153 .key_len = 16,
154 .iv_len = 16,
155 .flags = EVP_CIPH_FLAG_DEFAULT_ASN1 | EVP_CIPH_CBC_MODE,
156 .init = sm4_init_key,
157 .do_cipher = sm4_cbc_cipher,
158 .cleanup = NULL,
159 .ctx_size = sizeof(EVP_SM4_KEY),
160 .set_asn1_parameters = 0,
161 .get_asn1_parameters = 0,
162 .ctrl = 0,
163 .app_data = NULL,
164};
165
166const EVP_CIPHER *
167EVP_sm4_cbc(void)
168{
169 return &sm4_cbc;
170}
171
172static const EVP_CIPHER sm4_cfb128 = {
173 .nid = NID_sm4_cfb128,
174 .block_size = 1,
175 .key_len = 16,
176 .iv_len = 16,
177 .flags = EVP_CIPH_FLAG_DEFAULT_ASN1 | EVP_CIPH_CFB_MODE,
178 .init = sm4_init_key,
179 .do_cipher = sm4_cfb128_cipher,
180 .cleanup = NULL,
181 .ctx_size = sizeof(EVP_SM4_KEY),
182 .set_asn1_parameters = 0,
183 .get_asn1_parameters = 0,
184 .ctrl = 0,
185 .app_data = NULL,
186};
187
188const EVP_CIPHER *
189EVP_sm4_cfb128(void)
190{
191 return &sm4_cfb128;
192}
193
194static const EVP_CIPHER sm4_ofb = {
195 .nid = NID_sm4_ofb128,
196 .block_size = 1,
197 .key_len = 16,
198 .iv_len = 16,
199 .flags = EVP_CIPH_FLAG_DEFAULT_ASN1 | EVP_CIPH_OFB_MODE,
200 .init = sm4_init_key,
201 .do_cipher = sm4_ofb_cipher,
202 .cleanup = NULL,
203 .ctx_size = sizeof(EVP_SM4_KEY),
204 .set_asn1_parameters = 0,
205 .get_asn1_parameters = 0,
206 .ctrl = 0,
207 .app_data = NULL,
208};
209
210const EVP_CIPHER *
211EVP_sm4_ofb(void)
212{
213 return &sm4_ofb;
214}
215
216static const EVP_CIPHER sm4_ecb = {
217 .nid = NID_sm4_ecb,
218 .block_size = 16,
219 .key_len = 16,
220 .iv_len = 0,
221 .flags = EVP_CIPH_FLAG_DEFAULT_ASN1 | EVP_CIPH_ECB_MODE,
222 .init = sm4_init_key,
223 .do_cipher = sm4_ecb_cipher,
224 .cleanup = NULL,
225 .ctx_size = sizeof(EVP_SM4_KEY),
226 .set_asn1_parameters = 0,
227 .get_asn1_parameters = 0,
228 .ctrl = 0,
229 .app_data = NULL,
230};
231
232const EVP_CIPHER *
233EVP_sm4_ecb(void)
234{
235 return &sm4_ecb;
236}
79 237
80static int 238static int
81sm4_ctr_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out, const unsigned char *in, 239sm4_ctr_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out, const unsigned char *in,
82 size_t len) 240 size_t len)
83{ 241{
84 EVP_SM4_KEY *key = EVP_C_DATA(EVP_SM4_KEY, ctx); 242 EVP_SM4_KEY *key = ((EVP_SM4_KEY *)(ctx)->cipher_data);
85 243
86 CRYPTO_ctr128_encrypt(in, out, len, &key->ks, ctx->iv, ctx->buf, 244 CRYPTO_ctr128_encrypt(in, out, len, &key->ks, ctx->iv, ctx->buf,
87 &ctx->num, (block128_f)SM4_encrypt); 245 &ctx->num, (block128_f)SM4_encrypt);