#include "AI_AMP_2_5.h"
#include "mbedtls/base64.h"
#include "mbedtls/md5.h"
-static char * dev_key = "uKLrChwrxA1LklgBc3VwawYjUkbT3BgX" ;
-static char * dev_pid = "cqxJZi5CNgzjS3mX21Zw";
+#include <stdio.h>
+#include <string.h>
+#include "mbedtls/aes.h"
+#include "mbedtls/cipher.h"
+#define kb_malloc aic_malloc
+#define bk_free aic_free
+// static char * dev_key = "uKLrChwrxA1LklgBc3VwawYjUkbT3BgX" ;
+// static char * dev_pid = "cqxJZi5CNgzjS3mX21Zw";
+void ase_encrypt_dome(void);
//激活用的md5签名
static int active_md5_sign(const char *dev_id,const char *pid,const char *timestamp,const char *productSecret,char*md5_str)
{
if(strlen(timestamp)>256)
return -4;
char md5_buf[16]={0};
- char *sign_buf = malloc(1024);
+ char *sign_buf = kb_malloc(1024);
if(!sign_buf)
return -10;
}
md5_str[32] = '\0';
- free(sign_buf);
+ bk_free(sign_buf);
return 0;
}
char md5_buf[33]={0};
active_md5_sign(dev_id,pid,timestamp,productSecret,md5_buf);
bk_printf("md5_buf:%s",md5_buf);
+ ase_encrypt_dome();
+}
+#define AES_BLOCK_SIZE 16
+// PKCS5填充
+void pkcs5_padding(unsigned char *data, size_t data_len, size_t block_size) {
+ size_t padding_len = block_size - (data_len % block_size);
+ for (size_t i = 0; i < padding_len; i++) {
+ data[data_len + i] = (unsigned char)padding_len;
+ }
+}
+// 移除PKCS5填充
+size_t pkcs5_unpadding(unsigned char *data, size_t data_len,size_t block_size) {
+ size_t padding_len = data[data_len - 1];
+ if (padding_len > 0 && padding_len <= block_size) {
+ for (size_t i = 0; i < padding_len; i++) {
+ if (data[data_len - 1 - i] != (unsigned char)padding_len) {
+ return data_len;
+ }
+ }
+ return data_len - padding_len;
+ }
+ return data_len;
+}
+
+//登录用的aes256加密
+int aes_cbc_pkcs5_encrypt(const char *input,int input_len,const char* str_key,const char* str_iv,char *Base64_output,int *Base64_output_len)
+{
+
+ mbedtls_cipher_context_t ctx;
+ int ret;
+ unsigned char *aes_data =NULL;
+ unsigned char *padded_plaintext=NULL;
+ size_t aes_data_len = 0;
+ // 初始化上下文
+ mbedtls_cipher_init(&ctx);
+
+ // 设置加密算法
+ ret = mbedtls_cipher_setup(&ctx, mbedtls_cipher_info_from_type(MBEDTLS_CIPHER_AES_256_CBC));
+ if (ret != 0) {
+ bk_printf("mbedtls_cipher_setup failed: -0x%04x\n", -ret);
+ goto exit;
+ }
+
+ // 设置密钥和IV
+ ret = mbedtls_cipher_setkey(&ctx, str_key, strlen(str_key) * 8, MBEDTLS_ENCRYPT);
+ if (ret != 0) {
+ bk_printf("mbedtls_cipher_setkey failed: -0x%04x\n", -ret);
+ goto exit;
+ }
+
+ ret = mbedtls_cipher_set_iv(&ctx, str_iv, strlen(str_iv));
+ if (ret != 0) {
+ bk_printf("mbedtls_cipher_set_iv failed: -0x%04x\n", -ret);
+ goto exit;
+ }
+ //bk_printf("aes_cbc_pkcs5_encrypt2");
+ // 计算填充后的长度
+ size_t padded_len = input_len;
+ if (padded_len % AES_BLOCK_SIZE != 0) {
+ padded_len += AES_BLOCK_SIZE - (padded_len % AES_BLOCK_SIZE);
+ }else
+ padded_len+=AES_BLOCK_SIZE;
+ //bk_printf("aes_cbc_pkcs5_encrypt3");
+ // 复制明文并进行填充
+ padded_plaintext = (unsigned char *)kb_malloc(padded_len);
+ if (padded_plaintext == NULL) {
+ ret = MBEDTLS_ERR_CIPHER_ALLOC_FAILED;
+ bk_printf("Memory allocation failed\n");
+ goto exit;
+ }
+ //bk_printf("aes_cbc_pkcs5_encrypt4 padded_len :%d,input_len:%d",padded_len,input_len);
+ aes_data = (unsigned char *)kb_malloc(padded_len);
+ if (aes_data == NULL) {
+ ret = MBEDTLS_ERR_CIPHER_ALLOC_FAILED;
+ bk_printf("Memory allocation failed\n");
+ goto exit;
+ }
+ //bk_printf("aes_cbc_pkcs5_encrypt5");
+ memcpy(padded_plaintext, input, input_len);
+ pkcs5_padding(padded_plaintext, input_len, AES_BLOCK_SIZE);
+ bk_printf("aes_cbc_pkcs5_encrypt6");
+ // 加密
+ ret = mbedtls_cipher_update(&ctx, padded_plaintext, padded_len, aes_data, &aes_data_len);
+ if (ret != 0) {
+ bk_printf("mbedtls_cipher_update failed: -0x%04x\n", -ret);
+
+ goto exit;
+ }
+ //bk_printf("aes_cbc_pkcs5_encrypt7");
+ mbedtls_base64_encode(Base64_output, *Base64_output_len, Base64_output_len, aes_data, aes_data_len);
+ Base64_output[*Base64_output_len] = 0;
+ //bk_printf("aes_cbc_pkcs5_encrypt8.");
+ bk_free(padded_plaintext);
+ //bk_printf("aes_cbc_pkcs5_encrypt9");
+ bk_free(aes_data);
+
+ // 清理上下文
+ mbedtls_cipher_free(&ctx);
+ return 0;
+
+exit:
+ mbedtls_cipher_free(&ctx);
+ if(aes_data)
+ bk_free(aes_data);
+ if(padded_plaintext)
+ bk_free(padded_plaintext);
+ return ret;
+}
+// AES/CBC/PKCS5Padding解密
+int aes_cbc_pkcs5_decrypt(const char *Base64_str_input,const char* str_key,const char* str_iv,char *output,int *output_len)
+ // const unsigned char *key, size_t key_len,
+ // const unsigned char *iv, size_t iv_len,
+ // const unsigned char *ciphertext, size_t ciphertext_len,
+ // unsigned char *plaintext, size_t *plaintext_len)
+{
+ mbedtls_cipher_context_t ctx;
+ int ret;
+ char *input_buf = NULL;
+ // 初始化上下文
+ mbedtls_cipher_init(&ctx);
+
+ // 设置加密算法
+ ret = mbedtls_cipher_setup(&ctx, mbedtls_cipher_info_from_type(MBEDTLS_CIPHER_AES_256_CBC));
+ if (ret != 0) {
+ bk_printf("mbedtls_cipher_setup failed: -0x%04x\n", -ret);
+ goto exit;
+ }
+
+ // 设置密钥和IV
+ ret = mbedtls_cipher_setkey(&ctx, str_key, strlen(str_key) * 8, MBEDTLS_DECRYPT);
+ if (ret != 0) {
+ bk_printf("mbedtls_cipher_setkey failed: -0x%04x\n", -ret);
+ goto exit;
+ }
+
+ ret = mbedtls_cipher_set_iv(&ctx, str_iv, strlen(str_iv));
+ if (ret != 0) {
+ bk_printf("mbedtls_cipher_set_iv failed: -0x%04x\n", -ret);
+ goto exit;
+ }
+ size_t input_buf_len = strlen(Base64_str_input)+1;
+ input_buf = kb_malloc(input_buf_len);
+ memset(input_buf,0,input_buf_len);
+ mbedtls_base64_decode(input_buf, input_buf_len, &input_buf_len, Base64_str_input, strlen(Base64_str_input));
+ // 解密
+ ret = mbedtls_cipher_update(&ctx, input_buf, input_buf_len, output, output_len);
+ if (ret != 0) {
+ bk_printf("mbedtls_cipher_update failed: -0x%04x\n", -ret);
+ goto exit;
+ }
+
+ // 清理上下文
+ mbedtls_cipher_free(&ctx);
+
+ // 移除填充
+ *output_len = pkcs5_unpadding(output, *output_len,AES_BLOCK_SIZE);
+ output[*output_len] = 0;
+ if(input_buf)
+ bk_free(input_buf);
+ return 0;
+
+ exit:
+ if(input_buf)
+ bk_free(input_buf);
+ mbedtls_cipher_free(&ctx);
+ return ret;
+}
+
+void ase_encrypt_dome(void)
+{
+ const char *data = "11111111222222223333333344444444";
+ size_t Base64_data_len = strlen(data)*3+32;
+ char *Base64_data = kb_malloc(Base64_data_len);
+ memset(Base64_data,0,Base64_data_len);
+ aes_cbc_pkcs5_encrypt(data,strlen(data),"uKLrChwrxA1LklgBc3VwawYjUkbT3BgX","5555555566666666",Base64_data,&Base64_data_len);
+ bk_printf("ase_encrypt_dome:aes_cbc_pkcs5_encrypt:len:%d,Base64_data:%s",Base64_data_len,Base64_data);
+ char *decrypt_data = kb_malloc(Base64_data_len);
+ aes_cbc_pkcs5_decrypt(Base64_data,"uKLrChwrxA1LklgBc3VwawYjUkbT3BgX","5555555566666666",decrypt_data,&Base64_data_len);
+ bk_printf("ase_encrypt_dome:aes_cbc_pkcs5_decrypt:len:%d,decrypt_data:%s",Base64_data_len,decrypt_data);
+ if(Base64_data)
+ bk_free(Base64_data);
+ if(decrypt_data)
+ bk_free(decrypt_data);
}
\ No newline at end of file