1e1051a39Sopenharmony_ci/* 2e1051a39Sopenharmony_ci * Copyright 2017-2021 The OpenSSL Project Authors. All Rights Reserved. 3e1051a39Sopenharmony_ci * Copyright 2017 Ribose Inc. All Rights Reserved. 4e1051a39Sopenharmony_ci * Ported from Ribose contributions from Botan. 5e1051a39Sopenharmony_ci * 6e1051a39Sopenharmony_ci * Licensed under the Apache License 2.0 (the "License"). You may not use 7e1051a39Sopenharmony_ci * this file except in compliance with the License. You can obtain a copy 8e1051a39Sopenharmony_ci * in the file LICENSE in the source distribution or at 9e1051a39Sopenharmony_ci * https://www.openssl.org/source/license.html 10e1051a39Sopenharmony_ci */ 11e1051a39Sopenharmony_ci 12e1051a39Sopenharmony_ci#include "internal/deprecated.h" 13e1051a39Sopenharmony_ci 14e1051a39Sopenharmony_ci#include "internal/cryptlib.h" 15e1051a39Sopenharmony_ci#ifndef OPENSSL_NO_SM4 16e1051a39Sopenharmony_ci# include <openssl/evp.h> 17e1051a39Sopenharmony_ci# include <openssl/modes.h> 18e1051a39Sopenharmony_ci# include "crypto/sm4.h" 19e1051a39Sopenharmony_ci# include "crypto/evp.h" 20e1051a39Sopenharmony_ci# include "evp_local.h" 21e1051a39Sopenharmony_ci 22e1051a39Sopenharmony_citypedef struct { 23e1051a39Sopenharmony_ci SM4_KEY ks; 24e1051a39Sopenharmony_ci} EVP_SM4_KEY; 25e1051a39Sopenharmony_ci 26e1051a39Sopenharmony_cistatic int sm4_init_key(EVP_CIPHER_CTX *ctx, const unsigned char *key, 27e1051a39Sopenharmony_ci const unsigned char *iv, int enc) 28e1051a39Sopenharmony_ci{ 29e1051a39Sopenharmony_ci ossl_sm4_set_key(key, EVP_CIPHER_CTX_get_cipher_data(ctx)); 30e1051a39Sopenharmony_ci return 1; 31e1051a39Sopenharmony_ci} 32e1051a39Sopenharmony_ci 33e1051a39Sopenharmony_cistatic void sm4_cbc_encrypt(const unsigned char *in, unsigned char *out, 34e1051a39Sopenharmony_ci size_t len, const SM4_KEY *key, 35e1051a39Sopenharmony_ci unsigned char *ivec, const int enc) 36e1051a39Sopenharmony_ci{ 37e1051a39Sopenharmony_ci if (enc) 38e1051a39Sopenharmony_ci CRYPTO_cbc128_encrypt(in, out, len, key, ivec, 39e1051a39Sopenharmony_ci (block128_f)ossl_sm4_encrypt); 40e1051a39Sopenharmony_ci else 41e1051a39Sopenharmony_ci CRYPTO_cbc128_decrypt(in, out, len, key, ivec, 42e1051a39Sopenharmony_ci (block128_f)ossl_sm4_decrypt); 43e1051a39Sopenharmony_ci} 44e1051a39Sopenharmony_ci 45e1051a39Sopenharmony_cistatic void sm4_cfb128_encrypt(const unsigned char *in, unsigned char *out, 46e1051a39Sopenharmony_ci size_t length, const SM4_KEY *key, 47e1051a39Sopenharmony_ci unsigned char *ivec, int *num, const int enc) 48e1051a39Sopenharmony_ci{ 49e1051a39Sopenharmony_ci CRYPTO_cfb128_encrypt(in, out, length, key, ivec, num, enc, 50e1051a39Sopenharmony_ci (block128_f)ossl_sm4_encrypt); 51e1051a39Sopenharmony_ci} 52e1051a39Sopenharmony_ci 53e1051a39Sopenharmony_cistatic void sm4_ecb_encrypt(const unsigned char *in, unsigned char *out, 54e1051a39Sopenharmony_ci const SM4_KEY *key, const int enc) 55e1051a39Sopenharmony_ci{ 56e1051a39Sopenharmony_ci if (enc) 57e1051a39Sopenharmony_ci ossl_sm4_encrypt(in, out, key); 58e1051a39Sopenharmony_ci else 59e1051a39Sopenharmony_ci ossl_sm4_decrypt(in, out, key); 60e1051a39Sopenharmony_ci} 61e1051a39Sopenharmony_ci 62e1051a39Sopenharmony_cistatic void sm4_ofb128_encrypt(const unsigned char *in, unsigned char *out, 63e1051a39Sopenharmony_ci size_t length, const SM4_KEY *key, 64e1051a39Sopenharmony_ci unsigned char *ivec, int *num) 65e1051a39Sopenharmony_ci{ 66e1051a39Sopenharmony_ci CRYPTO_ofb128_encrypt(in, out, length, key, ivec, num, 67e1051a39Sopenharmony_ci (block128_f)ossl_sm4_encrypt); 68e1051a39Sopenharmony_ci} 69e1051a39Sopenharmony_ci 70e1051a39Sopenharmony_ciIMPLEMENT_BLOCK_CIPHER(sm4, ks, sm4, EVP_SM4_KEY, NID_sm4, 71e1051a39Sopenharmony_ci 16, 16, 16, 128, EVP_CIPH_FLAG_DEFAULT_ASN1, 72e1051a39Sopenharmony_ci sm4_init_key, 0, 0, 0, 0) 73e1051a39Sopenharmony_ci 74e1051a39Sopenharmony_cistatic int sm4_ctr_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out, 75e1051a39Sopenharmony_ci const unsigned char *in, size_t len) 76e1051a39Sopenharmony_ci{ 77e1051a39Sopenharmony_ci int n = EVP_CIPHER_CTX_get_num(ctx); 78e1051a39Sopenharmony_ci unsigned int num; 79e1051a39Sopenharmony_ci EVP_SM4_KEY *dat = EVP_C_DATA(EVP_SM4_KEY, ctx); 80e1051a39Sopenharmony_ci 81e1051a39Sopenharmony_ci if (n < 0) 82e1051a39Sopenharmony_ci return 0; 83e1051a39Sopenharmony_ci num = (unsigned int)n; 84e1051a39Sopenharmony_ci 85e1051a39Sopenharmony_ci CRYPTO_ctr128_encrypt(in, out, len, &dat->ks, ctx->iv, 86e1051a39Sopenharmony_ci EVP_CIPHER_CTX_buf_noconst(ctx), &num, 87e1051a39Sopenharmony_ci (block128_f)ossl_sm4_encrypt); 88e1051a39Sopenharmony_ci EVP_CIPHER_CTX_set_num(ctx, num); 89e1051a39Sopenharmony_ci return 1; 90e1051a39Sopenharmony_ci} 91e1051a39Sopenharmony_ci 92e1051a39Sopenharmony_cistatic const EVP_CIPHER sm4_ctr_mode = { 93e1051a39Sopenharmony_ci NID_sm4_ctr, 1, 16, 16, 94e1051a39Sopenharmony_ci EVP_CIPH_CTR_MODE, 95e1051a39Sopenharmony_ci EVP_ORIG_GLOBAL, 96e1051a39Sopenharmony_ci sm4_init_key, 97e1051a39Sopenharmony_ci sm4_ctr_cipher, 98e1051a39Sopenharmony_ci NULL, 99e1051a39Sopenharmony_ci sizeof(EVP_SM4_KEY), 100e1051a39Sopenharmony_ci NULL, NULL, NULL, NULL 101e1051a39Sopenharmony_ci}; 102e1051a39Sopenharmony_ci 103e1051a39Sopenharmony_ciconst EVP_CIPHER *EVP_sm4_ctr(void) 104e1051a39Sopenharmony_ci{ 105e1051a39Sopenharmony_ci return &sm4_ctr_mode; 106e1051a39Sopenharmony_ci} 107e1051a39Sopenharmony_ci 108e1051a39Sopenharmony_ci#endif 109