341 lines
		
	
	
		
			11 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
		
		
			
		
	
	
			341 lines
		
	
	
		
			11 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
|  | /****************************************************************************
 | |||
|  | 
 | |||
|  | Copyright(c) 2019 by Aerospace C.Power (Chongqing) Microelectronics. ALL RIGHTS RESERVED. | |||
|  | 
 | |||
|  | This Information is proprietary to Aerospace C.Power (Chongqing) Microelectronics and MAY NOT | |||
|  | be copied by any method or incorporated into another program without | |||
|  | the express written consent of Aerospace C.Power. This Information or any portion | |||
|  | thereof remains the property of Aerospace C.Power. The Information contained herein | |||
|  | is believed to be accurate and Aerospace C.Power assumes no responsibility or | |||
|  | liability for its use in any way and conveys no license or title under | |||
|  | any patent or copyright and makes no representation or warranty that this | |||
|  | Information is free from patent or copyright infringement. | |||
|  | 
 | |||
|  | ****************************************************************************/ | |||
|  | #include "chip_reg_base.h"
 | |||
|  | #include "hw_reg_api.h"
 | |||
|  | #include "iot_bitops.h"
 | |||
|  | #include "flash.h"
 | |||
|  | #include "os_lock.h"
 | |||
|  | #include "iot_config.h"
 | |||
|  | #include "ahb_rf.h"
 | |||
|  | #include "ahb.h"
 | |||
|  | #include "clk.h"
 | |||
|  | #include "sfc.h"
 | |||
|  | 
 | |||
|  | #include "sec_glb.h"
 | |||
|  | 
 | |||
|  | #include "platform.h"
 | |||
|  | #include "dbg_io.h"
 | |||
|  | #include "sha1.h"
 | |||
|  | #include "sha256.h"
 | |||
|  | #include "aes.h"
 | |||
|  | #include "md5.h"
 | |||
|  | #include "sha512.h"
 | |||
|  | #include "gp_timer.h"
 | |||
|  | #include "sec_sys.h"
 | |||
|  | #include "iot_string.h"
 | |||
|  | #include "pk.h"
 | |||
|  | #include "oid.h"
 | |||
|  | #include "init.h"
 | |||
|  | 
 | |||
|  | int32_t iot_printf(const char *fmt, ...); | |||
|  | 
 | |||
|  | void p_buf(unsigned char *b, uint32_t l) | |||
|  | { | |||
|  |     uint32_t i; | |||
|  |     for (i = 0; i < l; i++) { | |||
|  |         iot_printf("%02x", b[i]); | |||
|  |     }; | |||
|  |     iot_printf("\n"); | |||
|  | } | |||
|  | 
 | |||
|  | unsigned char test_data[] = "admin"; | |||
|  | 
 | |||
|  | void rom_aes_test() | |||
|  | { | |||
|  |     mbedtls_aes_context aes_ctx; | |||
|  |     /* 密钥数值  */ | |||
|  |     unsigned char key[16] = { 0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0A,0x0B,0x0C,0x0D,0x0E,0x0F,0x00 }; | |||
|  |     /* 明文空间  */ | |||
|  |     unsigned char plain[16] = "helloworld"; | |||
|  |     /* 解密后明文的空间  */ | |||
|  |     unsigned char dec_plain[16] = { 0 }; | |||
|  |     /* 密文空间  */ | |||
|  |     unsigned char cipher[16] = { 0 }; | |||
|  |     iot_printf("\n>>>>mbedtls_aes<<<<\n"); | |||
|  |     iot_printf("func:%s line:%d mbedtls_aes_init:%p\n", __func__, __LINE__, mbedtls_aes_init); | |||
|  |     mbedtls_aes_init(&aes_ctx); | |||
|  |     /* 设置加密密钥 */ | |||
|  |     mbedtls_aes_setkey_enc(&aes_ctx, key, 128); | |||
|  |     iot_printf("raw data:%s\n", plain); | |||
|  |     mbedtls_aes_crypt_ecb(&aes_ctx, MBEDTLS_AES_ENCRYPT, plain, cipher); | |||
|  |     iot_printf("crypt data:%s\n", cipher); | |||
|  |     /* 设置解密密钥  */ | |||
|  |     mbedtls_aes_setkey_dec(&aes_ctx, key, 128); | |||
|  |     mbedtls_aes_crypt_ecb(&aes_ctx, MBEDTLS_AES_DECRYPT, cipher, dec_plain); | |||
|  |     iot_printf("decrypt data:%s\n", dec_plain); | |||
|  |     mbedtls_aes_free(&aes_ctx); | |||
|  | } | |||
|  | 
 | |||
|  | void rom_sha1_test(void) | |||
|  | { | |||
|  |     unsigned char sha1_result[20]; | |||
|  |     mbedtls_sha1_context sha1_ctx; | |||
|  |     iot_printf("\n>>>>mbedtls_sha1<<<<\n"); | |||
|  |     mbedtls_sha1_init(&sha1_ctx); | |||
|  |     mbedtls_sha1_starts(&sha1_ctx); | |||
|  |     mbedtls_sha1_update(&sha1_ctx, test_data, strlen((const char *)test_data)); | |||
|  |     mbedtls_sha1_finish(&sha1_ctx, sha1_result); | |||
|  |     mbedtls_sha1_free(&sha1_ctx); | |||
|  |     iot_printf("mbedtls_sha1_finish addr:%p sha1: ", mbedtls_sha1_finish); | |||
|  |     p_buf(sha1_result, 20); | |||
|  |     memset(sha1_result, 0, 20); | |||
|  |     mbedtls_sha1(test_data, strlen((const char *)test_data), sha1_result); | |||
|  |     iot_printf("mbedtls_sha1 addr:%p sha1: ", mbedtls_sha1); | |||
|  |     p_buf(sha1_result, 20); | |||
|  | } | |||
|  | 
 | |||
|  | void rom_md5_test(void) | |||
|  | { | |||
|  |     unsigned char md5_result[16]; | |||
|  |     mbedtls_md5_context md5_ctx; | |||
|  |     iot_printf("\n>>>>mbedtls_md5<<<<\n"); | |||
|  |     mbedtls_md5_init(&md5_ctx); | |||
|  |     mbedtls_md5_starts(&md5_ctx); | |||
|  |     mbedtls_md5_update(&md5_ctx, test_data, strlen((char *)test_data)); | |||
|  |     mbedtls_md5_finish(&md5_ctx, md5_result); | |||
|  |     mbedtls_md5_free(&md5_ctx); | |||
|  |     iot_printf("mbedtls_md5_finish addr: %p md5: ", mbedtls_md5_finish); | |||
|  | 
 | |||
|  |     memset(md5_result, 0, 16); | |||
|  |     mbedtls_md5(test_data, strlen((const char *)test_data), md5_result); | |||
|  |     iot_printf("mbedtls_md5 addr: %p md5: ", mbedtls_md5); | |||
|  |     p_buf(md5_result, 16); | |||
|  | } | |||
|  | 
 | |||
|  | void rom_sha256_test(void) | |||
|  | { | |||
|  |     mbedtls_sha256_context sha256_ctx; | |||
|  |     unsigned char sha256_result[32]; | |||
|  |     iot_printf("\n>>>>mbedtls_sha256<<<<\n"); | |||
|  |     mbedtls_sha256_init(&sha256_ctx); | |||
|  |     mbedtls_sha256_starts(&sha256_ctx, 0); | |||
|  |     mbedtls_sha256_update(&sha256_ctx, test_data, strlen((char *)test_data)); | |||
|  |     mbedtls_sha256_finish(&sha256_ctx, sha256_result); | |||
|  |     mbedtls_sha256_free(&sha256_ctx); | |||
|  |     iot_printf("mbedtls_sha256_finish addr: %p sha256 1: ", mbedtls_sha256_finish); | |||
|  |     p_buf(sha256_result, 32); | |||
|  | 
 | |||
|  |     memset(sha256_result, 0, 32); | |||
|  |     memset(&sha256_ctx, 0, sizeof(sha256_ctx)); | |||
|  | 
 | |||
|  |     mbedtls_sha256(test_data, strlen((char *)test_data), sha256_result, 0); | |||
|  |     iot_printf("mbedtls_sha256 addr: %p sha256 2: ", mbedtls_sha256); | |||
|  |     p_buf(sha256_result, 32); | |||
|  | } | |||
|  | 
 | |||
|  | void rom_sha512_test(void) | |||
|  | { | |||
|  |     mbedtls_sha512_context sha512_ctx; | |||
|  |     unsigned char sha512_result[64]; | |||
|  |     iot_printf("\n>>>>mbedtls_sha512<<<<\n"); | |||
|  |     mbedtls_sha512_init(&sha512_ctx); | |||
|  |     mbedtls_sha512_starts(&sha512_ctx, 0); | |||
|  |     mbedtls_sha512_update(&sha512_ctx, test_data, strlen((char *)test_data)); | |||
|  |     mbedtls_sha512_finish(&sha512_ctx, sha512_result); | |||
|  |     mbedtls_sha512_free(&sha512_ctx); | |||
|  |     iot_printf("mbedtls_sha512_finish addr: %p sha512: ", mbedtls_sha512_finish); | |||
|  |     p_buf(sha512_result, 64); | |||
|  | } | |||
|  | 
 | |||
|  | /* md 系列是对摘要算法的一种通用调用方式 */ | |||
|  | void rom_md_test(const char *md_type) | |||
|  | { | |||
|  |     unsigned char result[64]; | |||
|  |     int ret; | |||
|  |     mbedtls_md_context_t mdctx; | |||
|  |     iot_printf("\n>>>>mbedtls_md<<<<\n"); | |||
|  |     mbedtls_md_init(&mdctx); | |||
|  |     const mbedtls_md_info_t *md_info = mbedtls_md_info_from_string(md_type); | |||
|  |     if (NULL == md_info) iot_printf("xxxxxxx\n"); | |||
|  |     ret = mbedtls_md_setup(&mdctx, md_info, 0); | |||
|  |     if (ret) { | |||
|  |         iot_printf("%d ret = %d\n", __LINE__, ret); | |||
|  |         goto n1; | |||
|  |     } | |||
|  |     ret = mbedtls_md_starts(&mdctx); | |||
|  |     if (ret) iot_printf("%d\n", __LINE__); | |||
|  |     ret = mbedtls_md_update(&mdctx, test_data, strlen((char *)test_data)); | |||
|  |     if (ret) iot_printf("%d\n", __LINE__); | |||
|  |     ret = mbedtls_md_finish(&mdctx, result); | |||
|  |     if (ret) iot_printf("%d\n", __LINE__); | |||
|  |     mbedtls_md_free(&mdctx); | |||
|  | 
 | |||
|  |     iot_printf("mbedtls_md_finish addr: %p md5: ", mbedtls_md_finish); | |||
|  |     p_buf(result, 16); | |||
|  | n1: | |||
|  |     mbedtls_md(md_info, test_data, strlen((char *)test_data), result); | |||
|  |     iot_printf("mbedtls_md addr: %p md5: ", mbedtls_md); | |||
|  |     p_buf(result, 16); | |||
|  | } | |||
|  | 
 | |||
|  | 
 | |||
|  | void rom_oid_test(void) | |||
|  | { | |||
|  |     const char *oid = NULL; | |||
|  |     size_t olen = 0; | |||
|  |     iot_printf("\n>>>>mbedtls_oid<<<<\n"); | |||
|  |     /* 1 */ | |||
|  |     oid = NULL; olen = 0; | |||
|  |     mbedtls_oid_get_oid_by_cipher_alg(MBEDTLS_CIPHER_AES_256_CBC, &oid, &olen); | |||
|  |     iot_printf("mbedtls_oid_get_oid_by_cipher_alg addr: %p olen: %d MBEDTLS_CIPHER_AES_256_CBC oid: ", | |||
|  |     mbedtls_oid_get_oid_by_cipher_alg, olen); | |||
|  |     p_buf((unsigned char*)oid, olen); | |||
|  | 
 | |||
|  |     /* 2*/ | |||
|  |     oid = NULL; olen = 0; | |||
|  |     mbedtls_oid_get_oid_by_ec_grp(MBEDTLS_ECP_DP_SECP192R1, &oid, &olen); | |||
|  |     iot_printf("mbedtls_oid_get_oid_by_ec_grp addr: %p olen: %d MBEDTLS_ECP_DP_SECP192R1 oid: ", | |||
|  |         mbedtls_oid_get_oid_by_ec_grp, olen); | |||
|  |     p_buf((unsigned char*)oid, olen); | |||
|  | 
 | |||
|  |     /* 3 */ | |||
|  |     oid = NULL; olen = 0; | |||
|  |     mbedtls_oid_get_oid_by_kdf_alg(MBEDTLS_KDF_KDF1, &oid, &olen); | |||
|  |     iot_printf("mbedtls_oid_get_oid_by_kdf_alg addr: %p olen: %d MBEDTLS_KDF_KDF1 oid: ", | |||
|  |         mbedtls_oid_get_oid_by_kdf_alg, olen); | |||
|  |     p_buf((unsigned char*)oid, olen); | |||
|  | 
 | |||
|  |     /* 4 */ | |||
|  |     oid = NULL; olen = 0; | |||
|  |     mbedtls_oid_get_oid_by_md(MBEDTLS_MD_MD5, &oid, &olen); | |||
|  |     iot_printf("mbedtls_oid_get_oid_by_md addr: %p olen: %d MBEDTLS_MD_MD5 oid: ", | |||
|  |     mbedtls_oid_get_oid_by_md, olen); | |||
|  |     p_buf((unsigned char*)oid, olen); | |||
|  | 
 | |||
|  |     /* 5 */ | |||
|  |     oid = NULL; olen = 0; | |||
|  |     mbedtls_oid_get_oid_by_pk_alg(MBEDTLS_PK_RSA, &oid, &olen); | |||
|  |     iot_printf("mbedtls_oid_get_oid_by_pk_alg addr: %p olen: %d MBEDTLS_PK_RSA oid: ", | |||
|  |         mbedtls_oid_get_oid_by_pk_alg, olen); | |||
|  |     p_buf((unsigned char*)oid, olen); | |||
|  | 
 | |||
|  |     /* 6 */ | |||
|  |     oid = NULL; olen = 0; | |||
|  |     mbedtls_oid_get_oid_by_sig_alg(MBEDTLS_PK_RSA, MBEDTLS_MD_MD5, &oid, &olen); | |||
|  |     iot_printf("mbedtls_oid_get_oid_by_sig_alg addr: %p olen: %d MBEDTLS_PK_RSA,MBEDTLS_MD_MD5  oid: ", | |||
|  |         mbedtls_oid_get_oid_by_sig_alg, olen); | |||
|  |     p_buf((unsigned char*)oid, olen); | |||
|  | 
 | |||
|  |     /* 7 */ | |||
|  |     char r[32] = {0}; | |||
|  |     unsigned char t1[] = {0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01}; | |||
|  |     int ret = 0; | |||
|  |     mbedtls_asn1_buf asn1_oid = {0}; | |||
|  |     asn1_oid.len = 9; | |||
|  |     asn1_oid.p = t1; | |||
|  |     ret = mbedtls_oid_get_numeric_string(r, sizeof(r), &asn1_oid); | |||
|  |     iot_printf("mbedtls_oid_get_numeric_string addr: %p ret: %d buf:%s\n", | |||
|  |         mbedtls_oid_get_numeric_string, ret, r); | |||
|  | 
 | |||
|  |     /* 8 */ | |||
|  |     unsigned char t2[] = {0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x01, 0x2a}; | |||
|  |     mbedtls_cipher_type_t cipher_alg; | |||
|  |     asn1_oid.len = 9; | |||
|  |     asn1_oid.p = t2; | |||
|  |     mbedtls_oid_get_cipher_alg(&asn1_oid, &cipher_alg); | |||
|  |     iot_printf("mbedtls_cipher_type_t = %d\n", cipher_alg); | |||
|  | 
 | |||
|  |     /* 9 */ | |||
|  |     unsigned char t3[] = {0x2a, 0x86, 0x48, 0xce, 0x3d, 0x03, 0x01, 0x01}; | |||
|  |     mbedtls_ecp_group_id grp_id; | |||
|  |     asn1_oid.len = 8; | |||
|  |     asn1_oid.p = t3; | |||
|  |     mbedtls_oid_get_ec_grp(&asn1_oid, &grp_id); | |||
|  |     iot_printf("mbedtls_ecp_group_id = %d\n", grp_id); | |||
|  | 
 | |||
|  |     /* 10 */ | |||
|  |     unsigned char t4[] = {0x28, 0x81, 0x8c, 0x71, 0x02, 0x05, 0x01}; | |||
|  |     mbedtls_kdf_type_t kdf_alg; | |||
|  |     asn1_oid.len = 7; | |||
|  |     asn1_oid.p = t4; | |||
|  |     mbedtls_oid_get_kdf_alg(&asn1_oid, &kdf_alg); | |||
|  |     iot_printf("mbedtls_kdf_type_t = %d\n", kdf_alg); | |||
|  | 
 | |||
|  |     /* 11 */ | |||
|  |     unsigned char t5[] = {0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x02, 0x05}; | |||
|  |     mbedtls_md_type_t md_alg; | |||
|  |     asn1_oid.len = 8; | |||
|  |     asn1_oid.p = t5; | |||
|  |     mbedtls_oid_get_md_alg(&asn1_oid, &md_alg); | |||
|  |     iot_printf("mbedtls_md_type_t = %d\n", md_alg); | |||
|  | 
 | |||
|  |     /* 12 */ | |||
|  |     mbedtls_pk_type_t pk_alg; | |||
|  |     asn1_oid.p = t1; | |||
|  |     asn1_oid.len = 9; | |||
|  |     mbedtls_oid_get_pk_alg(&asn1_oid, &pk_alg); | |||
|  |     iot_printf("mbedtls_pk_type_t = %d\n", pk_alg); | |||
|  | 
 | |||
|  |     /* 13 */ | |||
|  |     unsigned char t6[] = {0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x04}; | |||
|  |     asn1_oid.p = t6; | |||
|  |     asn1_oid.len = 9; | |||
|  |     mbedtls_oid_get_sig_alg(&asn1_oid, &md_alg, &pk_alg); | |||
|  |     iot_printf("mbedtls_pk_type_t md_alg = %d pk_alg = %d\n", md_alg, pk_alg); | |||
|  | //    mbedtls_oid_get_pkcs12_pbe_alg(const mbedtls_asn1_buf * oid, mbedtls_md_type_t * md_alg, mbedtls_cipher_type_t * cipher_alg)
 | |||
|  | //    mbedtls_oid_get_sig_alg_desc(const mbedtls_asn1_buf * oid, const char * * desc)这两个接口没有对应的id,没有验证
 | |||
|  | } | |||
|  | 
 | |||
|  | int crypto_app_start (void); | |||
|  | void rom_pk_test() | |||
|  | { | |||
|  |     iot_printf("\n>>>>mbedtls_pk<<<<\n"); | |||
|  |     crypto_app_start(); | |||
|  | } | |||
|  | void rom_mbedtls_init() | |||
|  | { | |||
|  |     mbedtls_platform_set_printf((void *)iot_printf); | |||
|  |     mbedtls_platform_set_snprintf((void*)iot_snprintf); | |||
|  | } | |||
|  | 
 | |||
|  | void mbed_main() { | |||
|  |     uint32_t loop = 0x10000; | |||
|  | 
 | |||
|  |     dbg_uart_init(); | |||
|  |     gp_timer_init(); | |||
|  |     gp_timer_set(0, 0xffffffff, 0); | |||
|  |     gp_timer_start(0); | |||
|  |     while (gp_timer_get_current_val(0) < 1000000); | |||
|  |     gp_timer_stop(0); | |||
|  |     /* 硬件使能 */ | |||
|  |     sec_glb_enable(SEC_GLB_SEC); | |||
|  |     /* mbedtls 库初始化 */ | |||
|  |     crypto_init(); | |||
|  |     /* 设置打印的回调函数 */ | |||
|  |     rom_mbedtls_init(); | |||
|  | 
 | |||
|  |     rom_sha1_test(); | |||
|  |     rom_md5_test(); | |||
|  |     rom_md_test("MD5"); | |||
|  |     rom_oid_test(); | |||
|  |     rom_sha256_test(); | |||
|  |     rom_sha512_test(); | |||
|  |     rom_aes_test(); | |||
|  |     rom_pk_test(); | |||
|  | 
 | |||
|  |     loop = 0x10000; | |||
|  |     while(loop--); | |||
|  |     return; | |||
|  | } | |||
|  | 
 | |||
|  | #ifdef __GNUC__
 | |||
|  | 
 | |||
|  | int main(void) { | |||
|  |     mbed_main(); | |||
|  |     return 0; | |||
|  | } | |||
|  | #endif // __GCC__
 | |||
|  | 
 |