190 lines
		
	
	
		
			6.3 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
		
		
			
		
	
	
			190 lines
		
	
	
		
			6.3 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.
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * ****************************************************************************/
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#ifndef SEC_SYS_H
							 | 
						||
| 
								 | 
							
								#define SEC_SYS_H
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#ifdef __cplusplus
							 | 
						||
| 
								 | 
							
								extern "C" {
							 | 
						||
| 
								 | 
							
								#endif
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#include "os_types.h"
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#define AES_ENCRYPT     1
							 | 
						||
| 
								 | 
							
								#define AES_DECRYPT     0
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								typedef enum{
							 | 
						||
| 
								 | 
							
								    MOD_MUL = 0,
							 | 
						||
| 
								 | 
							
								    MONT_MUL,
							 | 
						||
| 
								 | 
							
								    MOD,
							 | 
						||
| 
								 | 
							
								}SEC_SYS_MUL;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								typedef enum{
							 | 
						||
| 
								 | 
							
								    SEC_LITTLE_ENDIAN = 0,
							 | 
						||
| 
								 | 
							
								    SEC_BIG_ENDIAN,
							 | 
						||
| 
								 | 
							
								}SEC_SYS_EDNIAN;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								extern const uint8_t sha256_padding[64];
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								int sec_sys_init();
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/* RNG APIs*/
							 | 
						||
| 
								 | 
							
								int sec_sys_rng_init();
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								int sec_sys_rng_get_random(uint8_t *buf, uint32_t len);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/*AES APIs*/
							 | 
						||
| 
								 | 
							
								int sec_sys_aes_init();
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								int sec_sys_sm4_init();
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								int sec_sys_sm4_ind_init();
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								void sec_sys_aes_config_mode(int mode);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								void sec_sys_aes_config_encrypt(int mode);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								int sec_sys_aes_set_iv(const uint8_t *iv);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								int sec_sys_aes_get_iv(uint8_t *iv);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								void sec_sys_aes_crypt_run(uint32_t len, const uint8_t *input, uint8_t *output,
							 | 
						||
| 
								 | 
							
								    uint32_t *olen, uint32_t round);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								int sec_sys_aes_setkey_enc(const uint8_t *key, uint32_t keybits );
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								int sec_sys_aes_setkey_dec(const uint8_t *key, uint32_t keybits );
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								int sec_sys_aes_crypt_ecb(int mode, uint32_t len, const uint8_t *input,
							 | 
						||
| 
								 | 
							
								                        uint8_t *output, uint32_t *olen);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								int sec_sys_aes_crypt_cbc(int mode, uint32_t len, uint8_t *iv,
							 | 
						||
| 
								 | 
							
								                        const uint8_t *input, uint8_t *output, uint32_t *olen);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								int sec_sys_aes_crypt_ctr( int len, size_t *nc_off, uint8_t *nonce_counter,
							 | 
						||
| 
								 | 
							
								                        uint8_t *stream_block, const uint8_t *input,
							 | 
						||
| 
								 | 
							
								                        uint8_t *output, uint32_t *olen );
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								int sec_sys_aes_gcm_setkey(const uint8_t *key, uint32_t keybits );
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								int sec_sys_aes_crypt_gcm(int mode,
							 | 
						||
| 
								 | 
							
								                       uint32_t len,
							 | 
						||
| 
								 | 
							
								                       const uint8_t *iv,
							 | 
						||
| 
								 | 
							
								                       uint32_t iv_len,
							 | 
						||
| 
								 | 
							
								                       const uint8_t *add,
							 | 
						||
| 
								 | 
							
								                       uint32_t add_len,
							 | 
						||
| 
								 | 
							
								                       const uint8_t *input,
							 | 
						||
| 
								 | 
							
								                       uint8_t *output,
							 | 
						||
| 
								 | 
							
								                       uint32_t tag_len,
							 | 
						||
| 
								 | 
							
								                       uint8_t *tag );
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								int sec_sys_gcm_starts( int mode,
							 | 
						||
| 
								 | 
							
								                const uint8_t *iv,
							 | 
						||
| 
								 | 
							
								                uint32_t iv_len,
							 | 
						||
| 
								 | 
							
								                const uint8_t *add,
							 | 
						||
| 
								 | 
							
								                uint32_t add_len );
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								int sec_sys_gcm_update(uint32_t len,
							 | 
						||
| 
								 | 
							
								                const uint8_t *input,
							 | 
						||
| 
								 | 
							
								                uint8_t *output );
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								int sec_sys_gcm_finish(uint8_t *tag,
							 | 
						||
| 
								 | 
							
								                uint32_t tag_len );
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								void sec_sys_aes_gcm_cert_encrypt(uint8_t *key, uint32_t keybits,
							 | 
						||
| 
								 | 
							
								    uint8_t *plain, uint32_t plain_len, uint8_t *iv, uint32_t iv_len,
							 | 
						||
| 
								 | 
							
								    uint8_t *add, uint32_t add_len, uint8_t *ciphertext, uint8_t *tag,
							 | 
						||
| 
								 | 
							
								    uint32_t round);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								void sec_sys_aes_gcm_with_key(uint8_t is_encrypt, uint8_t *key,
							 | 
						||
| 
								 | 
							
								   uint32_t keybits, uint8_t *input, uint32_t input_len, uint8_t *iv,
							 | 
						||
| 
								 | 
							
								   uint32_t iv_len, uint8_t *add, uint32_t add_len, uint8_t *output,
							 | 
						||
| 
								 | 
							
								   uint8_t *tag);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/* SHA APIs*/
							 | 
						||
| 
								 | 
							
								int sec_sys_sha224_init(uint32_t endian);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								void sec_sys_sha224(const uint8_t *input, uint32_t ilen,
							 | 
						||
| 
								 | 
							
								                    uint8_t output[28]);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								int sec_sys_sha256_init(uint32_t endian);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								void sec_sys_sha256(const uint8_t *input, uint32_t ilen,
							 | 
						||
| 
								 | 
							
								                    uint8_t output[32]);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								int sec_sys_sha384_init(uint32_t endian);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								void sec_sys_sha384( const uint8_t *input, size_t ilen,
							 | 
						||
| 
								 | 
							
								                    uint8_t output[48]);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								int sec_sys_sha512_init(uint32_t endian);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								void sec_sys_sha512( const uint8_t *input, size_t ilen,
							 | 
						||
| 
								 | 
							
								                    uint8_t output[64]);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								void sec_sys_sha2(int hash, const uint8_t *input, uint32_t len,
							 | 
						||
| 
								 | 
							
								                uint8_t *output, int olen);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/*CHACHA20 APIs*/
							 | 
						||
| 
								 | 
							
								int sec_sys_chacha20_init();
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								int sec_sys_itef_chacha20(uint8_t *c, const uint8_t *m,
							 | 
						||
| 
								 | 
							
								                    unsigned long long mlen, const uint8_t *n,
							 | 
						||
| 
								 | 
							
								                    uint32_t ic, const uint8_t *k);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								int sec_sys_chacha20(uint8_t *c, const uint8_t *m,
							 | 
						||
| 
								 | 
							
								                    unsigned long long mlen, const uint8_t *n,
							 | 
						||
| 
								 | 
							
								                    uint64_t ic, const uint8_t *k);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								int sec_sys_sm2_init();
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								int sec_sys_sm2(uint32_t mul_type, uint32_t x_n, uint32_t *x, uint32_t y_n, uint32_t *y, uint32_t m_n, uint32_t *m, uint32_t z_n, uint32_t *z);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								int sec_sys_sm2_set_dash(uint32_t m);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								int sec_sys_sm3_sha_init();
							 | 
						||
| 
								 | 
							
								void sec_sys_sm3_config(void);
							 | 
						||
| 
								 | 
							
								void sec_sys_sm3(int hash, uint8_t *indata, uint32_t indata_len,
							 | 
						||
| 
								 | 
							
								    uint8_t *outdata, uint32_t outdata_len);
							 | 
						||
| 
								 | 
							
								uint32_t sec_sys_sm3_pading(const uint8_t *input, uint32_t ilen, uint8_t *pad);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								void sec_sys_sm4_config(uint8_t sm4_key[16], uint8_t iv[16], uint32_t mode);
							 | 
						||
| 
								 | 
							
								void sec_sys_sm4_calc(uint8_t *indata, uint32_t indata_len,
							 | 
						||
| 
								 | 
							
								    uint8_t *outdata, uint32_t *outdata_len, uint32_t opt_mode, uint32_t round);
							 | 
						||
| 
								 | 
							
								void sec_sys_sm4_ind_config(uint8_t sm4_key[16], uint8_t iv[16], uint32_t mode);
							 | 
						||
| 
								 | 
							
								void sec_sys_sm4_ind_calc(uint8_t *indata, uint32_t indata_len,
							 | 
						||
| 
								 | 
							
								    uint8_t *outdata, uint32_t *outdata_len, uint32_t opt_mode, uint32_t round);
							 | 
						||
| 
								 | 
							
								void sec_sys_des_init(void);
							 | 
						||
| 
								 | 
							
								void sec_sys_des_config(uint8_t des_key[24], uint8_t iv[8], uint32_t mode, uint8_t tdes);
							 | 
						||
| 
								 | 
							
								void sec_sys_des(uint8_t *indata, uint32_t indata_len,
							 | 
						||
| 
								 | 
							
								    uint8_t *outdata, uint32_t *outdata_len, uint32_t opt_mode);
							 | 
						||
| 
								 | 
							
								int sec_sys_bignum_init();
							 | 
						||
| 
								 | 
							
								int sec_sys_bignum_mul(uint32_t *X, uint32_t X_len, uint32_t *A, uint32_t A_len,
							 | 
						||
| 
								 | 
							
								    uint32_t *B, uint32_t B_len);
							 | 
						||
| 
								 | 
							
								int sec_sys_bignum_mod(uint32_t *X, uint32_t X_len, uint32_t *A, uint32_t A_len,
							 | 
						||
| 
								 | 
							
								    uint32_t *B, uint32_t B_len);
							 | 
						||
| 
								 | 
							
								void sec_sys_aes_ind_init();
							 | 
						||
| 
								 | 
							
								void sec_sys_aes_ind_config(uint8_t *key, uint32_t key_len, uint8_t iv[16],
							 | 
						||
| 
								 | 
							
								        uint32_t mode);
							 | 
						||
| 
								 | 
							
								void sec_sys_aes_ind_calc(uint8_t *indata, uint32_t indata_len, uint8_t *outdata,
							 | 
						||
| 
								 | 
							
								    uint32_t *outdata_len, uint32_t opt_mode);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#ifdef __cplusplus
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								#endif
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#endif //SEC_SYS_H
							 |