CRYP簡(jiǎn)介
MCU加/解密可分為對(duì)稱加/解密、非對(duì)稱加/解密、以及HASH算法,以上加/解密算法均可通過(guò)CAVP FIPS認(rèn)證,用于各類安全相關(guān)應(yīng)用。其中,包含DES、三重DES(TDES)或AES(128、192或256)等算法的加密處理器(CRYP)即為對(duì)稱加/解密算法。通過(guò)CRYP,可實(shí)現(xiàn)對(duì)數(shù)據(jù)進(jìn)行加密或解密,且該加密處理器完全兼容下列標(biāo)準(zhǔn):
·聯(lián)邦信息處理標(biāo)準(zhǔn)出版物“FIPS PUB 46-3,1999年10月25日”規(guī)定的數(shù)據(jù)加密標(biāo)準(zhǔn)(DES和TDES)。它遵循美國(guó)國(guó)家標(biāo)準(zhǔn)協(xié)會(huì)(ANSI)X9.52標(biāo)準(zhǔn)。
·聯(lián)邦信息處理標(biāo)準(zhǔn)出版物(FIPS PUB 197,2001年11月26日)規(guī)定的高級(jí)加密標(biāo)準(zhǔn)(AES)。
CRYP處理器可在電子密碼本(ECB)模式或加密分組鏈接(CBC)模式下使用DES和TDES算法執(zhí)行數(shù)據(jù)加密和解密。
CRYP外設(shè)為32位AHB2外設(shè)。它支持傳入數(shù)據(jù)和已處理數(shù)據(jù)的DMA傳輸,并具有輸入和輸出FIFO(分別為8個(gè)字深),本次例程采用DES128 ECB算法進(jìn)行驗(yàn)證,文章將著重講解該部分,其余算法詳見(jiàn)參考手冊(cè)。
CRYP 主要特性
·適用于AES、DES和TDES加密和解密操作
·DES
-直接執(zhí)行簡(jiǎn)單DES算法(使用單一密鑰K1)
-支持ECB和CBC鏈接算法
-支持64位、128位和192位密鑰(包括奇偶校驗(yàn))
-支持在CBC模式下使用的2×32位初始化向量(IV)
-使用DES處理一個(gè)64位塊需要16個(gè)HCLK周期
CRYP功能說(shuō)明
加密處理器可實(shí)現(xiàn)TDES(同樣支持DES)內(nèi)核和AES加密內(nèi)核。
由于TDES和AES算法使用塊密碼,因此,加密前需對(duì)不完整的輸入數(shù)據(jù)塊進(jìn)行填充(應(yīng)將額外的位附加到數(shù)據(jù)串的尾端),解密后需要丟棄填充項(xiàng)。硬件不處理填充操作,需要通過(guò)軟件進(jìn)行處理。圖1顯示了加密處理器的框圖。
圖1加密處理器框圖
1.DES加密內(nèi)核
--DES加密內(nèi)核由三部分組成
·DES算法(DEA)
·初始化向量(在CBC模式中使用)
·DES模式:密鑰=[K1]
--DES和TDES電子密碼本(DES/TDES-ECB)模式
·DES-ECB模式加密
DES電子密碼本(DES/TDES-ECB)模式中的加密是通過(guò)64位明文數(shù)據(jù)塊(P)經(jīng)過(guò)位/字節(jié)/半字交換(請(qǐng)參見(jiàn)1.3.2節(jié):數(shù)據(jù)類型的表1)后作為輸入塊(I)。輸入塊通過(guò)DEA在加密狀態(tài)下使用K1進(jìn)行加密處理。
若是TDES,則會(huì)將上述處理過(guò)程的輸出會(huì)直接反饋到DEA的輸入,在解密狀態(tài)下使用K2執(zhí)行DES,然后重復(fù)將上一步處理的輸出反饋到DEA的輸入,在加密狀態(tài)下使用K3執(zhí)行DES,最后生成的64位輸出塊(O)在執(zhí)行位/字節(jié)/半字交換之后,以密文(C)形式推入OUT FIFO,加密流程如圖2所示。
圖2DES-ECB模式加密
①K:密鑰;C:密文;I:輸入塊;O:輸出塊;P:明文。
·DES/TDES-ECB模式解密
圖3介紹了DES-ECB解密流程,64位密文(C)經(jīng)過(guò)位/字節(jié)/半字交換后,作為輸入塊(I),而該密鑰序列將使用與加密過(guò)程相反的密鑰序列來(lái)實(shí)現(xiàn)。輸入塊通過(guò)DEA在解密狀態(tài)下使用K3進(jìn)行解密處理,然后,將上述處理過(guò)程的輸出會(huì)直接反饋到DEA的輸入,在加密狀態(tài)下使用K2執(zhí)行DES,使得新結(jié)果會(huì)直接反饋到DEA的輸入,在解密狀態(tài)下使用K1執(zhí)行DES,最后,將生成的64位輸出塊(O)再進(jìn)行位/字節(jié)/半字交換后,產(chǎn)生明文(P),以上便是解密過(guò)程。
圖3DES-ECB 模式解密
①K:密鑰;C:密文;I:輸入塊;O:輸出塊;P:明文
2.數(shù)據(jù)類型
將數(shù)據(jù)寫(xiě)入CRYP_DIN寄存器時(shí),會(huì)一次性向CRYP處理器輸入32位(字)數(shù)據(jù)。由于DES的原則是每隔64位對(duì)數(shù)據(jù)流進(jìn)行處理,因此,針對(duì)每個(gè)64位塊,DES都會(huì)對(duì)其進(jìn)行M1到M64的對(duì)位編號(hào),其中M1為塊最左側(cè)的位,M64為塊最右側(cè)的位。
系統(tǒng)存儲(chǔ)器結(jié)構(gòu)采用小端模式:即無(wú)論使用何種數(shù)據(jù)類型(位、字節(jié)、16位半字、32位字),最低有效數(shù)據(jù)均占用最低地址位置。因此,對(duì)于從IN FIFO中讀取的數(shù)據(jù),在其進(jìn)入CRYP處理器之前,必須對(duì)這些數(shù)據(jù)執(zhí)行位、字節(jié)或半字交換操作(取決于要加密的數(shù)據(jù)類型)。在CRYP數(shù)據(jù)寫(xiě)入OUT FIFO之前,需要對(duì)其執(zhí)行同樣的交換操作。例如,對(duì)ASCII文本流執(zhí)行字節(jié)交換操作。要處理的數(shù)據(jù)類型通過(guò)CRYP控制寄存器(CRYP_CR)中的DATATYPE位字段進(jìn)行配置。
表1數(shù)據(jù)類型
圖4展示了根據(jù)不同的DATATYPE值,CRYP處理器是如何將IN FIFO中彈出的兩個(gè)連續(xù)32位字構(gòu)建成64位數(shù)據(jù)塊M1...64的過(guò)程。同理,也可用該方法擴(kuò)展構(gòu)建用于AES加密算法的128位數(shù)據(jù)塊(對(duì)于AES,塊長(zhǎng)度為四個(gè)32位字,但由于交換僅發(fā)生在字級(jí)別,因此它與此處描述的TDES的交換過(guò)程相同),本文不再贅述。
注意:IN FIFO和CRYP數(shù)據(jù)塊之間,以及CRYP數(shù)據(jù)塊和OUT FIFO之間執(zhí)行相同的交換操作。
圖4根據(jù)DATATYPE構(gòu)建64位塊
3.初始化向量——CRYP_IV0...1(L/R)
初始化向量可視為兩個(gè)64位數(shù)據(jù)項(xiàng),因此,初始化向量在系統(tǒng)存儲(chǔ)器中的數(shù)據(jù)格式和表示形式均不同于明文或密碼數(shù)據(jù),而且它們不受DATATYPE值的影響。初始化向量采用兩個(gè)連續(xù)的32位字進(jìn)行定義,即CRYP_IVL(左部分,記為位IV1...32)和CRYP_IVR(右部分,記為位IV33...64)。
以DES CBC算法為例,加密期間,CRYP_IV0(L/R)位會(huì)與一個(gè)64位數(shù)據(jù)塊(即,數(shù)據(jù)塊的M1...64位)進(jìn)行異或運(yùn)算,這里的64位數(shù)據(jù)塊是根據(jù)DATATYPE值交換后從IN FIFO彈出的。當(dāng)DEA3塊的輸出可用時(shí),該輸出值會(huì)復(fù)制到CRYP_IV0(L/R)向量,之后,這個(gè)新值與IN FIFO彈出的下一個(gè)64位數(shù)據(jù)塊進(jìn)行異或運(yùn)算,以此類推。
在DES CBC解密期間,CRYP_IV0(L/R)位首先會(huì)與TDEA1塊輸出的64位數(shù)據(jù)塊(即,M1...64位)進(jìn)行異或運(yùn)算,然后異或運(yùn)算后的結(jié)果根據(jù)DATATYPE值進(jìn)行交換并壓入OUT FIFO。異或運(yùn)算后的結(jié)果進(jìn)行交換并壓入OUT FIFO后,IN FIFO的輸出會(huì)取代CRYP_IV0(L/R)值,然后IN FIFO執(zhí)行彈出操作,隨后可對(duì)新的64位數(shù)據(jù)塊進(jìn)行處理。
當(dāng)CRYP_SR寄存器的BUSY位=1b時(shí),針對(duì)CRYP_IV0...1(L/R)寄存器的任何寫(xiě)操作都會(huì)被忽略(CRYP_IV0...1(L/R)寄存器內(nèi)容不會(huì)被修改),因此,在修改初始化向量之前,必須檢查BUSY位是否等于0b。
4.CRYP忙碌狀態(tài)
當(dāng)輸入FIFO中有充足的數(shù)據(jù)(至少有2個(gè)字可用于DES算法模式時(shí))、輸出FIFO中有充足的自由空間(至少有2個(gè)(DES/TDES)字位置),以及CRYP_CR寄存器中的位CRYPEN=1時(shí),加密處理器會(huì)自動(dòng)開(kāi)始加密或解密過(guò)程(根據(jù)CRYP_CR寄存器中ALGODIR位的值)。
在此過(guò)程中,執(zhí)行簡(jiǎn)易DES算法需16個(gè)AHB2時(shí)鐘周期。在整個(gè)過(guò)程中,CRYP_SR寄存器的BUSY位始終置“1”。完成此過(guò)程后,CRYP內(nèi)核會(huì)將兩個(gè)(DES)字寫(xiě)入輸出FIFO,并將BUSY位清零。在CBC、CTR模式下,還會(huì)更新初始化向量CRYP_IVx(L/R)R(x=0..3)。
當(dāng)加密處理器繁忙時(shí)(CRYP_SR寄存器中的位BUSY=1b),會(huì)忽略針對(duì)密鑰寄存器(CRYP_Kx(L/R)R,x=0..3)、初始化寄存器(CRYP_IVx(L/R)R,x=0..3)或CRYP_CR寄存器的位[9:2]的寫(xiě)操作,且不會(huì)修改這些寄存器,因此,不能在加密處理器處理數(shù)據(jù)塊時(shí)修改其配置。不過(guò),可以在BUSY=1時(shí)將CRYPEN位清零,這種情況下,只有完成正在進(jìn)行的DES處理過(guò)程并將兩個(gè)字的結(jié)果寫(xiě)入輸出FIFO后才能將BUSY位清零。
注意:在DES模式下處理某個(gè)塊時(shí),如果輸出FIFO已滿并且輸入FIFO至少含一個(gè)新塊,則輸入FIFO會(huì)彈出新塊且BUSY位保持置1,直到有足夠的空間可將這個(gè)新塊存儲(chǔ)到輸出FIFO。
5.加密或解密執(zhí)行步驟
--初始化
1)初始化外設(shè)(在準(zhǔn)備密鑰之前必須輸入密鑰大小和密鑰值,準(zhǔn)備好密鑰后,必須立即配置相應(yīng)算法):
①將對(duì)稱密鑰寫(xiě)入CRYP_KxL/R寄存器(需寫(xiě)入2到8個(gè)寄存器,具體取決于算法);
②使用CRYP_CR寄存器中的DATATYPE位配置數(shù)據(jù)類型(1位、8位、16位或32位);
③使用CRYP_CR寄存器中的ALGOMODE位配置算法和鏈接(在ECB/CBC中為DES);
④使用CRYP_CR寄存器中的ALGODIR位配置方向(加密/解密);
2)向CRYP_CR寄存器中的FFLUSH位寫(xiě)入1,刷新IN和OUT FIFO。
--DMA用于存儲(chǔ)器數(shù)據(jù)傳入和傳出時(shí)的處理過(guò)程
1)將DMA控制器配置為傳輸存儲(chǔ)器中的輸入數(shù)據(jù),傳輸長(zhǎng)度為消息的長(zhǎng)度。當(dāng)消息填充并非由外設(shè)進(jìn)行管理時(shí),消息長(zhǎng)度必須為整個(gè)數(shù)量的數(shù)據(jù)塊,數(shù)據(jù)傳輸均在突發(fā)模式下進(jìn)行。DES中的突發(fā)長(zhǎng)度為2個(gè)字,應(yīng)將DMA配置為在完成輸出數(shù)據(jù)傳輸時(shí)設(shè)置一個(gè)中斷,以指示處理過(guò)程已結(jié)束;
2)通過(guò)向CRYPEN位寫(xiě)入1來(lái)使能加密處理器,將CRYP_DMACR寄存器中的DIEN和DOEN位置1,以使能DMA請(qǐng)求;
3)所有傳輸和處理過(guò)程均由DMA和加密處理器管理,DMA中斷表示處理過(guò)程已完成,兩個(gè)FIFO通常均為空,且BUSY=0;
--在中斷期間通過(guò)CPU傳輸數(shù)據(jù)的處理過(guò)程
1)將CRYP_IMSCR寄存器中的INIM和OUTIM位置1,以使能中斷;
2)將CRYP_CR寄存器中的CRYPEN位置1,以使能加密處理器;
3)在中斷中管理輸入數(shù)據(jù):將輸入消息加載到IN FIFO,一次性可加載2個(gè)字或4個(gè)字,或者加載數(shù)據(jù)直到FIFO已滿。當(dāng)消息的最后一個(gè)字進(jìn)入FIFO時(shí),可通過(guò)將INIM位清零來(lái)禁止中斷;
4)在中斷中管理輸出數(shù)據(jù):讀取OUT FIFO中的輸出消息。一次可讀取1個(gè)塊(2個(gè)字或4個(gè)字),或者讀取數(shù)據(jù)直到FIFO為空。讀取最后一個(gè)字后,INIM=0、BUSY=0且兩個(gè)FIFO均為空(IFEM=1且OFNE=0)。將OUTIM位清零可禁止中斷,而將CRYPEN位清零可禁止外設(shè)。
--不使用DMA也不使用中斷時(shí)的處理過(guò)程
1)將CRYP_CR寄存器中的CRYPEN位置1,以使能加密處理器;
2)將首個(gè)塊寫(xiě)入輸入FIFO(2到8個(gè)字);
3)重復(fù)以下步驟,直到處理完整個(gè)信息:
①等待OFNE=1,然后讀取輸出FIFO(讀取1個(gè)塊,或FIFO為空為止);
②等待IFNF=1,然后寫(xiě)入INFIFO(寫(xiě)入1個(gè)塊,或FIFO已滿為止;
處理過(guò)程結(jié)束時(shí),BUSY=0且兩個(gè)FIFO均為空(IFEM=1且OFNE=0),將CRYPEN位清零可禁止外設(shè)。
CRYP中斷
CRYP可產(chǎn)生兩個(gè)可單獨(dú)屏蔽的中斷源。這兩個(gè)中斷源共用同一個(gè)中斷信號(hào),且該中斷信號(hào)是CRYP發(fā)出的唯一中斷信號(hào),用于驅(qū)動(dòng)NVIC(嵌套向量中斷控制器)。這一組合中斷是兩個(gè)單獨(dú)屏蔽的中斷源的或運(yùn)算結(jié)果,如果下面列出的各個(gè)中斷中的任何一個(gè)中斷產(chǎn)生,則此組合中斷即會(huì)產(chǎn)生。
通過(guò)更改CRYP_IMSCR寄存器中的屏蔽位,可單獨(dú)使能或禁止各個(gè)中斷源,將相應(yīng)的屏蔽位置“1”以使能中斷。
關(guān)于各個(gè)中斷源的狀態(tài),通過(guò)CRYP_RISR寄存器可以讀取原始中斷狀態(tài),通過(guò)CRYP_MISR寄存器可以讀取屏蔽中斷狀態(tài)。
--輸出FIFO服務(wù)中斷–OUTMIS
當(dāng)輸出FIFO中存在一個(gè)或多個(gè)(32位字)數(shù)據(jù)項(xiàng)時(shí),即會(huì)產(chǎn)生輸出FIFO服務(wù)中斷。通過(guò)讀取輸出FIFO的數(shù)據(jù),直到讀完所有有效(32位)字,即可將此中斷清除(即該中斷的狀態(tài)與OFNE(輸出FIFO非空)標(biāo)志一致)。
輸出FIFO服務(wù)中斷OUTMIS不是通過(guò)CRYP使能位使能,因此,如果輸出FIFO非空,即使禁止CRYP之后也不會(huì)強(qiáng)制OUTMIS信號(hào)為低電平。
--輸入FIFO服務(wù)中斷–INMIS
當(dāng)輸入FIFO中少于四個(gè)字時(shí),會(huì)產(chǎn)生輸入FIFO服務(wù)中斷,對(duì)輸入FIFO執(zhí)行寫(xiě)操作直到其中所含字不小于四字,這樣即可將此中斷清除。
輸入FIFO服務(wù)中斷INMIS通過(guò)CRYP使能位使能,因此,禁止CRYP之后,即使輸入FIFO為空,INMIS信號(hào)也為低(無(wú)效)。
圖5CRYP中斷映射圖表
CRYP DMA接口
加密處理器可使用一個(gè)接口連接DMA控制器。DMA操作通過(guò)CRYP DMA控制寄存器CRYP_DMACR進(jìn)行控制。
突發(fā)傳輸請(qǐng)求信號(hào)和單次傳輸請(qǐng)求信號(hào)并不相互排斥。這兩種信號(hào)可同時(shí)產(chǎn)生。例如,當(dāng)OUTFIFO中存在6個(gè)字時(shí),會(huì)產(chǎn)生突發(fā)傳輸請(qǐng)求和單次傳輸請(qǐng)求。突發(fā)傳輸4個(gè)字之后,將只產(chǎn)生單次傳輸請(qǐng)求來(lái)傳輸余下的2個(gè)字。當(dāng)數(shù)據(jù)流中待接收的剩余字?jǐn)?shù)少于突發(fā)傳輸字?jǐn)?shù)時(shí),這一特性就非常有用。
在產(chǎn)生相關(guān)的DMA清除信號(hào)之前,仍會(huì)產(chǎn)生各個(gè)請(qǐng)求信號(hào)。禁止請(qǐng)求信號(hào)清除之后,可再次激活某個(gè)請(qǐng)求信號(hào),具體取決于上述條件。如果已禁止CRYP外設(shè)并且已將DMA使能位清零(CRYP_DMACR寄存器中的DIEN位用于IN FIFO,DOEN位用于OUT FIFO),則會(huì)禁止所有請(qǐng)求信號(hào)。
注意:DMA控制器必須配置為執(zhí)行不多余4字的突發(fā)傳輸。否則可能會(huì)丟失一些數(shù)據(jù)。為了在裝滿IN FIFO之前讓DMA控制器清空OUT FIFO,OUT DMA通道的優(yōu)先級(jí)應(yīng)高于INDMA通道。
CRYP原理部分介紹到此,下面介紹具體使用情況。
CRYP應(yīng)用實(shí)例
本節(jié),我們將針對(duì)CRYP部分與DMA部分共同完成一個(gè)實(shí)驗(yàn),首先需要在工程目錄下新建一個(gè)CRYP文件夾。CRYP為加密處理器,本節(jié)例程通過(guò)DES128EBC算法進(jìn)行驗(yàn)證,再使用軟件Debug的方式查看加密與解密數(shù)據(jù)的正確與否。
打開(kāi)本節(jié)實(shí)驗(yàn)工程可發(fā)現(xiàn),相較其他工程,新增了幾項(xiàng)相關(guān)文件:
①cks32f4xx_cryp.c
②cks32f4xx_cryp.h
③cks32f4xx_cryp_des.c
④cks32f4xx_cryp_tdes.c
⑤cks32f4xx_cryp_aes.c
由于例程是通過(guò)CRYP加密處理器中的DES算法對(duì)數(shù)據(jù)進(jìn)行加密/解密,且選用電子密碼本(ECB)模式執(zhí)行,因此,在例程中僅添加上述①②③三項(xiàng)即可,加密/解密流程詳解見(jiàn)1.3.1小節(jié),接下來(lái)介紹軟件層面的應(yīng)用。
代碼中將實(shí)現(xiàn)數(shù)據(jù)加密/解密功能,取下列功能為例:
1)軟件復(fù)位
2)DES128 ECB
為縮短篇幅,不一一贅述所有算法形式,其余算法的使用方式可查閱相關(guān)參考手冊(cè)與庫(kù)文件,下面正式進(jìn)入軟件代碼部分講解。
1)軟件復(fù)位功能
首先設(shè)置CRYP各個(gè)寄存器的軟件復(fù)位值與偏移地址,如下所示,具體寄存器功能如手冊(cè)所述。
uint32_t TABLE_RESETREG[][2] = { {0x0000, 0x00000000}, {0x0004, 0x00000003}, {0x0008, 0x00000000}, {0x000C, 0x00000000}, {0x0010, 0x00000000}, {0x0014, 0x00000000}, {0x0018, 0x00000001}, {0x001C, 0x00000000}, {0x0020, 0x00000000}, {0x0024, 0x00000000}, {0x0028, 0x00000000}, {0x002C, 0x00000000}, {0x0030, 0x00000000}, {0x0034, 0x00000000}, {0x0038, 0x00000000}, {0x003C, 0x00000000}, {0x0040, 0x00000000}, {0x0048, 0x00000000}, {0x004C, 0x00000000}, }; TestStatus Test1() { int i; for (i=0; i{ if(readl((uint8_t *)CRYP + TABLE_RESETREG[i][0]) != TABLE_RESETREG[i][1]) { return FAILED; } } return PASSED; }
通過(guò)代碼判定基地址+偏移地址是否為CRYP相應(yīng)地址,一致則正確,不一致則錯(cuò)誤。
1)DES128 ECB
根據(jù)手冊(cè),首先設(shè)置以下向量組
①設(shè)置密鑰;
②設(shè)置初始向量組;
③設(shè)置明文文本;
④設(shè)置密文文本;
下面進(jìn)行代碼講解:
由上可知,實(shí)驗(yàn)開(kāi)始前需要先設(shè)定DES-KEY密鑰、初始向量IV_1、明文Plaintext等一系列數(shù)組。
由于我們添加了cks32f4xx_cryp_des.c,因此可直接調(diào)用明文加密函數(shù),并發(fā)送加密后的密文。
uart2_fputc(3, DESkey, 8); uart2_fputc(3, IV_1, 16); uart2_fputc(3, Plaintext, AES_TEXT_SIZE); for (j=0; j<4; j++) { DataType = 0x40 * j; /* Encrypt the plaintext message*/ if(MYCRYP_DES_ECB(MODE_ENCRYPT, DESkey, Plaintext, AES_TEXT_SIZE, Encryptedtext, DataType) != SUCCESS) { return FAILED; } uart2_fputc(3, Encryptedtext, AES_TEXT_SIZE); /* Decrypt the plaintext message */ if(MYCRYP_DES_ECB(MODE_DECRYPT,DESkey, Encryptedtext,AES_TEXT_SIZE,Decryptedtext, DataType) != SUCCESS) { return FAILED; } for (i=0; i{ if (Decryptedtext[i] != Plaintext[i]) { return FAILED; } }
上述代碼中的MYCRYP_DES_ECB()不僅可作為加密入口函數(shù),同樣可作為解密算法的入口函數(shù),參數(shù)如下所示:
ErrorStatus MYCRYP_DES_ECB (uint8_t Mode, uint8_t Key[8], uint8_t *Input, uint32_t Ilength, uint8_t *Output, uint16_t DataType)
對(duì)于各個(gè)參數(shù),可根據(jù)需求配置:
① Mode:根據(jù)需求選擇加密(MODE_ENCRYPT)、解密(MODE_DECRYPT)
② Key[8]:本例成為DES128 ECB算法,所以選擇DESkey
③*Input:輸入,根據(jù)功能設(shè)定,當(dāng)功能為加密時(shí),輸入為明文;當(dāng)輸入為解密時(shí),輸入為密文
④ Ilength:輸入的buffer長(zhǎng)度,規(guī)定必須為8的倍數(shù)
⑤*Output:輸出,與第③條相反
⑥ DataType:默認(rèn)值
由于加密后的數(shù)據(jù)可通過(guò)DMA的突發(fā)模式進(jìn)行傳輸,因此也對(duì)DMA功能作簡(jiǎn)要介紹,如下所示,DMA配置與常規(guī)無(wú)異,僅在一句函數(shù)上需注意,入口函數(shù)如下所示:
void DES_Encrypt_DMA (uint32_t AlgoMode, uint8_t InitVectors[16], uint8_t *Key, uint8_t *Input, uint32_t Ilength, uint8_t *Output, uint16_t DataType, DMA_InitTypeDef *DMA_In_InitStructure, DMA_InitTypeDef *DMA_Out_InitStructure)
該函數(shù)用于CRYP加密處理器加密/解密的DMA傳輸,函數(shù)的各個(gè)參數(shù)根據(jù)使用需求決定:
① AlgoMode:根據(jù)選定的模式設(shè)置,由于例程是DES128 ECB算法,因此,該參數(shù)設(shè)定為CRYP_AlgoMode_DES_ECB
② InitVectors[16]:初始向量設(shè)定
③*Key:秘鑰方式,上文中已講解,本次例程為DESkey
④*Input:輸入,上文已講解
⑤ Ilength:輸入的buffer長(zhǎng)度
⑥*Output:輸出
⑦ DataType:默認(rèn)值
與加密函數(shù)類似,本節(jié)的DMA函數(shù)同樣分為加密和解密兩個(gè)過(guò)程,函數(shù)相應(yīng)更改*Input和*Output參數(shù)即可。
接下來(lái)講解main.c函數(shù),該函數(shù)相對(duì)不難。
在main.c中設(shè)定以下數(shù)組(具體數(shù)據(jù)如工程文件所示)
① DES密鑰;
②初始向量;
③明文/解密后的明文;
④加密計(jì)算后的密文;
Main.c函數(shù)如下所示:
int main(void) { NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); uart_init(115200); NVIC_Config(); while(1) { CRYP_DeInit(); RCC_AHB2PeriphClockCmd(RCC_AHB2Periph_CRYP, DISABLE); RCC_AHB2PeriphClockCmd(RCC_AHB2Periph_CRYP, ENABLE); if(func[(0)]() == PASSED) { uart2_fputc(0, 0, 0); } else { uart2_fputc(0, 0, 0); } RCC_AHB2PeriphClockCmd(RCC_AHB2Periph_CRYP, ENABLE); if(func[(1)]() == PASSED) { uart2_fputc(0, 0, 0); } else { CKS_EVAL_LEDToggle(LED1); CKS_EVAL_LEDToggle(LED2); } RCC_AHB2PeriphClockCmd(RCC_AHB2Periph_CRYP, ENABLE); if(func[(2)]() == PASSED) { uart2_fputc(0, 0, 0); } else { CKS_EVAL_LEDToggle(LED1); CKS_EVAL_LEDToggle(LED2); }
需注意的是,在驗(yàn)證CRYP功能時(shí),需要開(kāi)啟相應(yīng)的總線時(shí)鐘。具體的代碼可詳見(jiàn)工程。
RCC_AHB2PeriphClockCmd(RCC_AHB2Periph_CRYP, ENABLE);
以上即為CRYP加密處理器模塊代碼的大致講解,具體代碼詳見(jiàn)相關(guān)工程。將代碼下載到相應(yīng)電路板后,通過(guò)軟件Debug的方式進(jìn)行驗(yàn)證,驗(yàn)證成功則跳轉(zhuǎn)到相關(guān)的功能PASS位置。最后可得到明文數(shù)據(jù)(Plaintext),并將其與解密后的數(shù)據(jù)(Decrytedtext)相比對(duì),比對(duì)正確則成功,實(shí)驗(yàn)結(jié)果如下圖所示:
(a)明文數(shù)據(jù)
(b)解密后的數(shù)據(jù)
到此,CRYP加密處理器講解完成,其他算法的使用詳見(jiàn)參考手冊(cè)與庫(kù)文件。
審核編輯:湯梓紅
-
處理器
+關(guān)注
關(guān)注
68文章
19259瀏覽量
229649 -
mcu
+關(guān)注
關(guān)注
146文章
17123瀏覽量
350976 -
fifo
+關(guān)注
關(guān)注
3文章
387瀏覽量
43647 -
CRYP
+關(guān)注
關(guān)注
0文章
5瀏覽量
2480
原文標(biāo)題:MCU微課堂|CRYP加密處理器
文章出處:【微信號(hào):中科芯MCU,微信公眾號(hào):中科芯MCU】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論