STM32操作加密芯片源代码
STM32操作SMEC98SP加密芯片的事例代碼,如果需要完整代碼(包括加密芯片代碼),請到中巨偉業 http://www.sinormous.com/download.html下載
#include “stm32f10x.h”
#include “stdio.h”
#include “config.h”
#include “util.h”
#include <string.h>
#include <stdlib.h>
#include “stm32f10x_i2c.h”
#include “smec98sp.h”
#include “iic_smec98sp.h”
void RCC_Configuration(void);
void NVIC_Configuration(void);
void GPIO_Configuration(void);
//---------------------------------------------------------
//函數名: 獲取STM32的UID
//參數說明:
// pSTM32_UID - 存放STM32的UID,12字節
//返回值說明:
// void
//說明:
//---------------------------------------------------------
void GetStm32Uid(unsigned char *pSTM32_UID)
{
pSTM32_UID[0] = (unsigned char)(0x1FFFF7E8);
pSTM32_UID[1] = (unsigned char)(0x1FFFF7E9);
pSTM32_UID[2] = (unsigned char)(0x1FFFF7Ea);
pSTM32_UID[3] = (unsigned char)(0x1FFFF7Eb);
pSTM32_UID[4] = (unsigned char)(0x1FFFF7Ec);
pSTM32_UID[5] = (unsigned char)(0x1FFFF7Ed);
pSTM32_UID[6] = (unsigned char)(0x1FFFF7Ee);
pSTM32_UID[7] = (unsigned char)(0x1FFFF7Ef);
pSTM32_UID[8] = (unsigned char)(0x1FFFF7f0);
pSTM32_UID[9] = (unsigned char)(0x1FFFF7f1);
pSTM32_UID[10] = (unsigned char)(0x1FFFF7f2);
pSTM32_UID[11] = (unsigned char)(0x1FFFF7f3);
}
#include “stm32f10x_adc.h”
//---------------------------------------------------------
//函數名: 初始化ADC
//參數說明:
// void
//返回值說明:
// void
//說明: 利用ADC懸空引腳產生隨機數
// 將PA1 作為模擬通道輸入引腳(一定要用懸空腳,否則獲取的隨機數,不夠隨機),
//---------------------------------------------------------
void Adc_Init(void)
{
ADC_InitTypeDef ADC_InitStructure;
GPIO_InitTypeDef GPIO_InitStructure;
}
//---------------------------------------------------------
//函數名: 獲得ADC值,作為隨機數種子
//參數說明:
// void
//返回值說明:
// ADC懸空引腳產生的隨機數
//說明: 采集4次ADC的值,每次取采集的第四位,拼成16位作為種子
//---------------------------------------------------------
unsigned short Get_Adc_RandomSeek(void)
{
unsigned char Count;
unsigned short ADC_RandomSeek = 0;
}
/*
1.獲取SMEC98SP的UID號, 獲取STM32的ID, 獲取STM32隨機數
2.驗證PIN
3.內外部認證
4.SHA1=>前置數據^隨機數
5.密文讀
6.讀數據
7.寫數據
8.構造算法(PA口數據->密文送加密芯片, 密文返回)
如果直接引用,請將print的調試信息去除
*/
void SMEC_Test(void)
{
/*各種密鑰,不會在I2C線路上傳輸,可以使用同一組.應該將密鑰分散存儲,防止主控芯片被破解后,被攻擊者在二進制碼中找到密鑰 */
unsigned char InternalKey[16] = {0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0A,0x0B,0x0C,0x0D,0x0E,0x0F};//內部認證密鑰,必須和SMEC98SP一致
unsigned char ExternalKey[16] = {0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x18,0x19,0x1A,0x1B,0x1C,0x1D,0x1E,0x1F};//外部認證密鑰,必須和SMEC98SP一致
unsigned char SHA1_Key[16] = {0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27,0x28,0x29,0x2A,0x2B,0x2C,0x2D,0x2E,0x2F}; //哈希算法認證密鑰,必須和SMEC98SP一致
unsigned char MKey[16] = {0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x3A,0x3B,0x3C,0x3D,0x3E,0x3F}; //主控密鑰,用于產生過程密鑰,必須和SMEC98SP一致
}
/--------------///
/*******************************************************************************
-
Function Name : main
-
Description : Main program.
-
Input : None
-
Output : None
-
Return : None
*******************************************************************************/
int main(void)
{
RCC_Configuration(); // Configure the system clocks
NVIC_Configuration(); // NVIC Configuration
GPIO_Configuration();
USART1_Init();
SMEC_I2cInit(); //初始化加密芯片IIC IO
Delay_ms(10); //等待保證加密芯片已經運行printf(“Z\r\n”);
SMEC_Test(); //加密芯片功能演示
while(1);
}
void GPIO_Configuration(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
AFIO_TypeDef AFIO_InitStructure;
// Configure the USART1_Tx as Alternate function Push-Pull
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Pin = USART1_TX;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
}
/*******************************************************************************
-
Function Name : RCC_Configuration
-
Description : Configures the different system clocks.
-
Input : None
-
Output : None
-
Return : None
*******************************************************************************/
void RCC_Configuration(void)
{
ErrorStatus HSEStartUpStatus;/* RCC system reset(for debug purpose) */
RCC_DeInit();/* Enable HSE */
RCC_HSEConfig(RCC_HSE_ON);/* Wait till HSE is ready */
HSEStartUpStatus = RCC_WaitForHSEStartUp();if(HSEStartUpStatus == SUCCESS)
{
/* Enable Prefetch Buffer */
FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);/* Flash 2 wait state */
FLASH_SetLatency(FLASH_Latency_2);/* HCLK = SYSCLK */
RCC_HCLKConfig(RCC_SYSCLK_Div1);/* PCLK2 = HCLK */
RCC_PCLK2Config(RCC_HCLK_Div1);/* PCLK1 = HCLK/2 */
RCC_PCLK1Config(RCC_HCLK_Div2);/* PLLCLK = 8MHz * 9 = 72 MHz */
RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9);/* Enable PLL */
RCC_PLLCmd(ENABLE);/* Wait till PLL is ready */
while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET)
{
}/* Select PLL as system clock source */
RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);/* Wait till PLL is used as system clock source */
while(RCC_GetSYSCLKSource() != 0x08)
{
}
}/* TIM2 clock enable */
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_SPI1 | RCC_APB2Periph_GPIOB |RCC_APB2Periph_GPIOC
|RCC_APB2Periph_AFIO | RCC_APB2Periph_USART1, ENABLE);
}
/*******************************************************************************
- Function Name : NVIC_Configuration
- Description : Configures Vector Table base location.
- Input : None
- Output : None
- Return : None
*******************************************************************************/
void NVIC_Configuration(void)
{
NVIC_InitTypeDef NVIC_InitStructure;
#ifdef VECT_TAB_RAM
/* Set the Vector Table base location at 0x20000000 */
NVIC_SetVectorTable(NVIC_VectTab_RAM, 0x0);
#else /* VECT_TAB_FLASH /
/ Configure one bit for preemption priority */
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
/* Enable the USART1 Interrupt */
NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
// /* Enable the USART2 Interrupt */
// NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn;
// NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
// NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
// NVIC_Init(&NVIC_InitStructure);
/* Enable the USART3 Interrupt */
/* Enable the TIM2 global Interrupt */
NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
/* Enable the TIM2 global Interrupt */
NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
/* Set the Vector Table base location at 0x08000000 */
NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0);
/* Set the Vector Table base location at 0x08002000 -> USE AIP*/
// NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x2000);
// NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x4000);
#endif
}
總結
以上是生活随笔為你收集整理的STM32操作加密芯片源代码的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 企业wifi安全管家,贴身又暖心的wif
- 下一篇: Java全套课程修炼之Java小白入门篇