2 * Copyright 2017 The OpenSSL Project Authors. All Rights Reserved.
3 * Copyright 2017 Ribose Inc. All Rights Reserved.
4 * Ported from Ribose contributions from Botan.
6 * Licensed under the Apache License 2.0 (the "License"). You may not use
7 * this file except in compliance with the License. You can obtain a copy
8 * in the file LICENSE in the source distribution or at
9 * https://www.openssl.org/source/license.html
12 #include "internal/cryptlib.h"
13 #ifndef OPENSSL_NO_SM4
14 # include <openssl/evp.h>
15 # include <openssl/modes.h>
16 # include "crypto/sm4.h"
17 # include "crypto/evp.h"
18 # include "evp_local.h"
24 static int sm4_init_key(EVP_CIPHER_CTX
*ctx
, const unsigned char *key
,
25 const unsigned char *iv
, int enc
)
27 SM4_set_key(key
, EVP_CIPHER_CTX_get_cipher_data(ctx
));
31 static void sm4_cbc_encrypt(const unsigned char *in
, unsigned char *out
,
32 size_t len
, const SM4_KEY
*key
,
33 unsigned char *ivec
, const int enc
)
36 CRYPTO_cbc128_encrypt(in
, out
, len
, key
, ivec
,
37 (block128_f
)SM4_encrypt
);
39 CRYPTO_cbc128_decrypt(in
, out
, len
, key
, ivec
,
40 (block128_f
)SM4_decrypt
);
43 static void sm4_cfb128_encrypt(const unsigned char *in
, unsigned char *out
,
44 size_t length
, const SM4_KEY
*key
,
45 unsigned char *ivec
, int *num
, const int enc
)
47 CRYPTO_cfb128_encrypt(in
, out
, length
, key
, ivec
, num
, enc
,
48 (block128_f
)SM4_encrypt
);
51 static void sm4_ecb_encrypt(const unsigned char *in
, unsigned char *out
,
52 const SM4_KEY
*key
, const int enc
)
55 SM4_encrypt(in
, out
, key
);
57 SM4_decrypt(in
, out
, key
);
60 static void sm4_ofb128_encrypt(const unsigned char *in
, unsigned char *out
,
61 size_t length
, const SM4_KEY
*key
,
62 unsigned char *ivec
, int *num
)
64 CRYPTO_ofb128_encrypt(in
, out
, length
, key
, ivec
, num
,
65 (block128_f
)SM4_encrypt
);
68 IMPLEMENT_BLOCK_CIPHER(sm4
, ks
, sm4
, EVP_SM4_KEY
, NID_sm4
,
69 16, 16, 16, 128, EVP_CIPH_FLAG_DEFAULT_ASN1
,
70 sm4_init_key
, 0, 0, 0, 0)
72 static int sm4_ctr_cipher(EVP_CIPHER_CTX
*ctx
, unsigned char *out
,
73 const unsigned char *in
, size_t len
)
75 unsigned int num
= EVP_CIPHER_CTX_num(ctx
);
76 EVP_SM4_KEY
*dat
= EVP_C_DATA(EVP_SM4_KEY
, ctx
);
78 CRYPTO_ctr128_encrypt(in
, out
, len
, &dat
->ks
, ctx
->iv
,
79 EVP_CIPHER_CTX_buf_noconst(ctx
), &num
,
80 (block128_f
)SM4_encrypt
);
81 EVP_CIPHER_CTX_set_num(ctx
, num
);
85 static const EVP_CIPHER sm4_ctr_mode
= {
86 NID_sm4_ctr
, 1, 16, 16,
92 NULL
, NULL
, NULL
, NULL
95 const EVP_CIPHER
*EVP_sm4_ctr(void)