1
0
Fork 0
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

217 lines
5.8 KiB

/*
* Copyright (c) 2022 Rockchip Electronics Co. Ltd.
*/
#include "c_model.h"
#include "cmode_adapter.h"
RK_RES soft_cipher(uint32_t algo, uint32_t mode, uint32_t operation,
uint8_t *key, uint32_t key_len, uint8_t *iv,
uint8_t *in, uint32_t in_len, uint8_t *out)
{
int ret;
int is_enc = (operation == RK_OP_CIPHER_ENC) ? 1 : 0;
if (algo == RK_ALGO_DES || algo == RK_ALGO_TDES) {
switch (mode) {
case RK_CIPHER_MODE_ECB:
ret = rk_des_ecb_encrypt(in, out, in_len, key, key_len, is_enc);
break;
case RK_CIPHER_MODE_CBC:
ret = rk_des_cbc_encrypt(in, out, in_len, key, key_len, iv, is_enc);
break;
case RK_CIPHER_MODE_CFB:
ret = rk_des_cfb_encrypt(in, out, in_len, key, key_len, iv, is_enc);
break;
case RK_CIPHER_MODE_OFB:
ret = rk_des_ofb_encrypt(in, out, in_len, key, key_len, iv, is_enc);
break;
default:
return RK_CRYPTO_ERR_PARAMETER;
}
} else if (algo == RK_ALGO_AES) {
switch (mode) {
case RK_CIPHER_MODE_ECB:
ret = rk_aes_ecb_encrypt(in, out, in_len, key, key_len, is_enc);
break;
case RK_CIPHER_MODE_CBC:
ret = rk_aes_cbc_encrypt(in, out, in_len, key, key_len, iv, is_enc);
break;
case RK_CIPHER_MODE_CFB:
ret = rk_aes_cfb_encrypt(in, out, in_len, key, key_len, iv, is_enc);
break;
case RK_CIPHER_MODE_OFB:
ret = rk_aes_ofb_encrypt(in, out, in_len, key, key_len, iv, is_enc);
break;
case RK_CIPHER_MODE_CTS:
ret = rk_aes_cts_encrypt(in, out, in_len, key, key_len, iv, is_enc);
break;
case RK_CIPHER_MODE_CTR:
ret = rk_aes_ctr_encrypt(in, out, in_len, key, key_len, iv, is_enc);
break;
case RK_CIPHER_MODE_XTS:
ret = rk_aes_xts_encrypt(in, out, in_len, key, key_len, iv, is_enc);
break;
default:
return RK_CRYPTO_ERR_PARAMETER;
}
} else if (algo == RK_ALGO_SM4) {
switch (mode) {
case RK_CIPHER_MODE_ECB:
ret = rk_sm4_ecb_encrypt(in, out, in_len, key, key_len, is_enc);
break;
case RK_CIPHER_MODE_CBC:
ret = rk_sm4_cbc_encrypt(in, out, in_len, key, key_len, iv, is_enc);
break;
case RK_CIPHER_MODE_CFB:
ret = rk_sm4_cfb_encrypt(in, out, in_len, key, key_len, iv, is_enc);
break;
case RK_CIPHER_MODE_OFB:
ret = rk_sm4_ofb_encrypt(in, out, in_len, key, key_len, iv, is_enc);
break;
case RK_CIPHER_MODE_CTS:
ret = rk_sm4_cts_encrypt(in, out, in_len, key, key_len, iv, is_enc);
break;
case RK_CIPHER_MODE_CTR:
ret = rk_sm4_ctr_encrypt(in, out, in_len, key, key_len, iv, is_enc);
break;
case RK_CIPHER_MODE_XTS:
ret = rk_sm4_xts_encrypt(in, out, in_len, key, key_len, iv, is_enc);
break;
default:
return RK_CRYPTO_ERR_PARAMETER;
}
} else {
return RK_CRYPTO_ERR_PARAMETER;
}
return ret == 0 ? RK_CRYPTO_SUCCESS : RK_CRYPTO_ERR_GENERIC;
}
RK_RES soft_ae(uint32_t algo, uint32_t mode, uint32_t operation,
uint8_t *key, uint32_t key_len, uint8_t *iv, uint32_t iv_len,
uint8_t *aad, uint32_t aad_len, uint32_t tag_len,
uint8_t *in, uint32_t in_len, uint8_t *out, uint8_t *tag)
{
int ret;
int is_enc = (operation == RK_OP_CIPHER_ENC) ? 1 : 0;
struct aes_ae_in aes_in;
struct aes_ae_out aes_out;
struct sm4_ae_in sm4_in;
struct sm4_ae_out sm4_out;
aes_in.key = key;
aes_in.src = in;
aes_in.iv = iv;
aes_in.aad = aad;
aes_in.key_len = key_len;
aes_in.src_len = in_len;
aes_in.iv_len = iv_len;
aes_in.aad_len = aad_len;
aes_in.tag_size = tag_len;
aes_out.dest = out;
aes_out.tag = tag;
memcpy(&sm4_in, &aes_in, sizeof(aes_in));
memcpy(&sm4_out, &aes_out, sizeof(aes_out));
if (algo == RK_ALGO_AES) {
switch (mode) {
case RK_CIPHER_MODE_GCM:
ret = rk_aes_gcm_encrypt(&aes_in, &aes_out, is_enc);
break;
case RK_CIPHER_MODE_CCM:
ret = rk_aes_ccm_encrypt(&aes_in, &aes_out, is_enc);
break;
default:
return RK_CRYPTO_ERR_PARAMETER;
}
} else if (algo == RK_ALGO_SM4) {
switch (mode) {
case RK_CIPHER_MODE_GCM:
ret = rk_sm4_gcm_encrypt(&sm4_in, &sm4_out, is_enc);
break;
case RK_CIPHER_MODE_CCM:
ret = rk_sm4_ccm_op(&sm4_in, &sm4_out, is_enc);
break;
default:
return RK_CRYPTO_ERR_PARAMETER;
}
} else {
return RK_CRYPTO_ERR_PARAMETER;
}
return ret == 0 ? RK_CRYPTO_SUCCESS : RK_CRYPTO_ERR_GENERIC;
}
RK_RES soft_hash(uint32_t algo, const uint8_t *in, uint32_t in_len, uint8_t *out, uint32_t *out_len)
{
int ret = -1;
switch (algo) {
case RK_ALGO_MD5:
ret = rk_hash_md5(in, in_len, out, out_len);
break;
case RK_ALGO_SHA1:
ret = rk_hash_sha1(in, in_len, out, out_len);
break;
case RK_ALGO_SHA256:
ret = rk_hash_sha256(in, in_len, out, out_len);
break;
case RK_ALGO_SHA224:
ret = rk_hash_sha224(in, in_len, out, out_len);
break;
case RK_ALGO_SHA384:
ret = rk_hash_sha384(in, in_len, out, out_len);
break;
case RK_ALGO_SHA512:
ret = rk_hash_sha512(in, in_len, out, out_len);
break;
case RK_ALGO_SHA512_224:
ret = rk_hash_sha512_224(in, in_len, out, out_len);
break;
case RK_ALGO_SHA512_256:
ret = rk_hash_sha512_256(in, in_len, out, out_len);
break;
case RK_ALGO_SM3:
ret = rk_hash_sm3(in, in_len, out, out_len);
break;
default:
return RK_CRYPTO_ERR_PARAMETER;
}
return ret == 0 ? RK_CRYPTO_SUCCESS : RK_CRYPTO_ERR_GENERIC;
}
RK_RES soft_hmac(uint32_t algo, const uint8_t *key, uint32_t key_len,
const uint8_t *in, uint32_t in_len, uint8_t *out, uint32_t *out_len)
{
int ret = -1;
switch (algo) {
case RK_ALGO_HMAC_MD5:
ret = rk_hmac_md5(key, key_len, in, in_len, out, out_len);
break;
case RK_ALGO_HMAC_SHA1:
ret = rk_hmac_sha1(key, key_len, in, in_len, out, out_len);
break;
case RK_ALGO_HMAC_SHA256:
ret = rk_hmac_sha256(key, key_len, in, in_len, out, out_len);
break;
case RK_ALGO_HMAC_SHA512:
ret = rk_hmac_sha512(key, key_len, in, in_len, out, out_len);
break;
case RK_ALGO_HMAC_SM3:
ret = rk_hmac_sm3(key, key_len, in, in_len, out, out_len);
break;
default:
return RK_CRYPTO_ERR_PARAMETER;
}
return ret == 0 ? RK_CRYPTO_SUCCESS : RK_CRYPTO_ERR_GENERIC;
}