STM32U585主打了数据安全,当然也提供了多种方式。我们这里用B-U585I-IOT02A开发板测试 PKA加密~也就是大家经常在计算机领域听到的公钥加密法~. T8 \; F7 T/ Q
我们先来看看一些导图:! H: n- `9 i. S9 \ @
应用场景:
5 I2 u( D; Z( P0 q$ q% k
7 }: f( p2 T: y' G) }
& G$ a) ^( U* X6 n完全硬件自发,无需CPU干预:4 e/ O) j' b5 z3 X' V
4 O: w5 I6 v9 a使用流程:/ M6 E5 J$ H( A$ j6 G+ p
2 a5 u5 }5 Q7 Z8 A. h
/ C5 B9 ]' m8 ]9 G, }好,由于全在MCU内部,这了也没有什么原理图,我们直接开始CUBEMC的配置:
; O- W1 K( H8 B% E% S$ w- G
9 l5 @5 I6 Q4 B2 Y, u
: x8 H* F5 Z! B5 z' R
B3 s+ L7 L: F. ^, ~
' N+ J+ ~1 |( ~" e% o6 ]& ]# [
& Q- l; z# t& f8 C% }
0 y" m% d& ~# O1 I" e7 V; q
, P" R) [0 s" E$ x* P' i f
9 o! b, o! b3 L$ o& }" z
自动生成代码,我们添加我们的私钥及公钥对,对其进行测试:$ v5 c: @; }& v6 x6 F1 @
- PKA_HandleTypeDef hpka;
- o. {2 `3 }0 b
$ d% q8 F6 k5 W+ f: h2 F9 v$ ^- RNG_HandleTypeDef hrng;
2 ~: M4 z1 \# h6 j3 h7 }* b7 @ - . D" [0 V" E7 K5 \9 p
- /* USER CODE BEGIN PV */
: b0 ^& |# f/ j - PKA_ModExpProtectModeInTypeDef in = {0};
1 f* p" D, M6 {: @8 ^
) y6 \6 W$ w) k. L% C2 P# K; j- /* Input vectors */' W: `) w3 t; K2 c# P; J2 R
- uint32_t input1_OpSize = 32;
" P" C) H4 ]; c% Z2 B) e( L - uint32_t input1_ExpSize = 32;
/ h3 Y9 B/ @. W - uint8_t input1_1[32] = {0xE4, 0x88, 0xD8, 0x11, 0x76, 0xE5, 0x06, 0xFA, 0xB7, 0xC2, 0xFC, 0x5D, 0xF3, 0xCB, 0x75, 0x55, 0x34, 0x3F, 0x45, 0xB4, 0x78, 0x52, 0xBA, 0x7E, 0xFB, 0xF5, 0xB1, 0x2A, 0xF4, 0x0B, 0xF4, 0xB3};
! q. R$ Q. C' { ?$ @ - uint8_t input1_2[32] = {0x12, 0x28, 0x49, 0x3A, 0x81, 0xFE, 0xCA, 0x62, 0x2B, 0x2D, 0x83, 0xCD, 0x97, 0x2C, 0x28, 0x23, 0x39, 0x76, 0xF1, 0xF3, 0x71, 0xCE, 0x16, 0x84, 0xA0, 0x37, 0x98, 0xE0, 0xC7, 0x0B, 0xF4, 0x39};
. C5 J4 B7 C. i! m6 Y9 ` - uint8_t input1_3[32] = {0x45, 0xAB, 0x14, 0x95, 0x48, 0x22, 0x69, 0xC4, 0x8F, 0x1E, 0xCA, 0x23, 0x0C, 0x1F, 0x5A, 0xB4, 0xBC, 0xE7, 0x12, 0xD8, 0x50, 0x09, 0x54, 0xBB, 0xE2, 0x1D, 0x2A, 0x39, 0x86, 0x3E, 0xDB, 0xFB};
, c- I4 Q& g" n& @ - uint8_t input1_4[32] = {0xE4, 0x88, 0xD8, 0x11, 0x76, 0xE5, 0x06, 0xFA, 0xB7, 0xC2, 0xFC, 0x5D, 0xF3, 0xCB, 0x75, 0x53, 0x50, 0x7D, 0xA2, 0xCD, 0x98, 0x24, 0x33, 0x76, 0x14, 0x8F, 0xCF, 0xA3, 0xF5, 0xCF, 0x4A, 0x88};! Y! M1 t/ l! ^
- uint8_t output1[32] = {0xD1, 0x2F, 0x36, 0x6C, 0x61, 0xB5, 0x66, 0x48, 0x61, 0x17, 0x8A, 0x1E, 0x6B, 0xD0, 0xE7, 0xBF, 0x66, 0x0A, 0x2B, 0x07, 0x9D, 0x4D, 0x82, 0x68, 0x7E, 0xB1, 0x9D, 0x29, 0x94, 0x43, 0x6D, 0x39};
$ J# ]5 Q& X" t' Y2 T9 \
. S! Q! _* M% S7 o5 S& Y- uint8_t buffer[32];3 x1 X# q2 W4 B. g* Y
- : A1 r! ^" o6 n
- __IO uint32_t hal_EndOfProcess = 0;
8 F2 M9 L% T8 L* Y3 W - __IO uint32_t hal_ErrorCallback = 0;
复制代码 计算结果与预制值得比较函数:
7 n& U; z' f; s: g; M. V- static uint16_t Buffercmp(uint8_t* pBuffer1, uint8_t* pBuffer2, uint16_t BufferLength);
复制代码 在main函数里面添加:5 x! b9 m$ ~+ S4 v/ {) ?
- /* Initialize all configured peripherals */" ?+ L. ^/ ]' k/ [+ n8 _
- MX_ICACHE_Init();
# S7 P$ f5 ?8 o/ {( r" t$ K' w - MX_RNG_Init();
' k( m$ ]; U4 N9 J0 x# a! T - MX_PKA_Init();
8 p# j, A- c3 C# ]; S% s# ?0 r - /* USER CODE BEGIN 2 */4 g6 `( [3 a+ Y* ^. N
$ s1 C5 V3 K4 g- /* Set input parameters */
% o- V6 N/ A6 Q+ ~; q - in.OpSize = input1_OpSize;
5 Y8 Q: q# x- b - in.expSize = input1_ExpSize;8 u! C- }( S0 r8 l6 f, J& `
- in.pMod = input1_1;: b- i. h/ _8 h* o9 f* K: `
- in.pExp = input1_2;
; h0 P9 K3 V! j+ w/ ^ - in.pOp1 = input1_3;( L/ O, l$ ~# u! n' v( F; j( X+ E
- in.pPhi = input1_4;% w: ]2 p7 H4 [
& L) [3 W( d; G& d. M- /* Start PKA protected Modular exponentiation operation */
0 j1 r0 [* p1 K* L8 [+ L; d - if (HAL_PKA_ModExpProtectMode_IT(&hpka, &in) != HAL_OK)
' o$ i2 n+ r# |5 ^( f - {8 n# b0 a+ l* i) z- U: X* N5 h
- /* HAL PKA Operation error */6 [$ h' g0 J) d
- Error_Handler();
6 S; W, {* A$ i' f3 x - } n: C2 ~# [. U! T, ], }. P
@2 _9 n: G, B0 K* n# Z- /* Wait until operation finish */
: e B% p6 m" q- w% p - while (!hal_EndOfProcess);
1 } a" G+ F A' {5 s! u - hal_EndOfProcess = 0;6 o1 m; n' | D# S
- ) t/ @7 I5 }0 t& r
- /* Retrieve computation result */9 [* U l; v* U; F/ T$ f
- HAL_PKA_ModExp_GetResult(&hpka, buffer); k+ y" B$ Z' A
- 6 v6 c7 \8 u4 f7 r, K) C5 Z- F
- /* Check retrieved result with expected result */
8 J5 j! P4 z2 v. r0 e! i4 C$ e2 i2 K - if ((Buffercmp((uint8_t*)buffer, (uint8_t*)output1, 32) != 0) || (hal_ErrorCallback == 1))
0 N% |5 @$ J+ g+ h) d; J* c6 A - {) F) A% K7 N. \" b3 d
- /* HAL PKA Operation error */+ R5 ] u* d* J; s* j! E! ~% M
- Error_Handler();) _/ ^2 w# p, ^$ T
- }
复制代码 一些回调函数:
( z4 Z% ]4 h) i' _1 s- /**/ z0 g4 b0 V8 ~7 ]
- * @brief Process completed callback.7 Q% w" t5 L* s- y
- * @param hpka PKA handle, _- {' ?, |+ P- V/ z
- * @retval None0 M1 ]& ^3 `4 U: [) r; ~$ f4 V, ]
- */% P! j z- {& A6 K! G0 c& D7 |
- void HAL_PKA_OperationCpltCallback(PKA_HandleTypeDef *hpka)
* W2 [4 l& Y7 W - {- S; Q! S$ R4 O' \6 A
- hal_EndOfProcess = 1;2 s. r, c7 G0 p# P
- }" @" ~% u. `/ t. Q
- * S2 C2 h. L; u, `; N3 _
- /**" ~( m. @/ p e. t \
- * @brief Error callback.* x6 F2 S( A+ w- {* w
- * @param hpka PKA handle
& Q1 f5 w4 ~$ K" b/ n2 \$ U/ } - * @retval None
" Q# C1 I- H( e3 ~, P - */
1 Q, Z* o% @3 p8 {( [" t( s% X - void HAL_PKA_ErrorCallback(PKA_HandleTypeDef *hpka)
- \- b0 f) h9 m - {
1 J1 W4 j* ^# {8 Z" H1 D* K - hal_ErrorCallback = 1;, S: i1 \8 j3 `/ h
- }
3 U* P$ i- o3 x6 J4 F8 A2 I
, O- _; b# h* }1 L0 X C, @- /**
- u U; B9 ?, M8 s9 e( o2 c - * @brief Compares two buffers.
; ~$ K5 T+ B3 Z5 _7 j, D- ]6 M - * @param pBuffer1, pBuffer2: buffers to be compared.
6 }0 c& Q! z3 _+ ]: v - * @param BufferLength: buffer's length
% M: ^; c" K2 y* n( C5 W& j5 j - * @retval 0 : pBuffer1 identical to pBuffer26 ^- r4 d9 W: }! s
- * >0 : pBuffer1 differs from pBuffer2
/ x0 n+ T* r7 H - */
/ K# V$ d9 F1 o3 s" \7 z - static uint16_t Buffercmp(uint8_t* pBuffer1, uint8_t* pBuffer2, uint16_t BufferLength)% S: w6 B0 q5 Q7 C4 X
- {
1 t; B+ i. \# x. O' S - while (BufferLength--)
) j0 e! G( K1 X. v - {
0 a# @/ n" f/ \3 ~ - if ((*pBuffer1) != *pBuffer2)
6 H# @7 u* j% g! F- v5 L" U: Z7 a - {' M8 X6 I( ?* l, [% @
- return BufferLength;, q% h) B1 Q0 ~- h, q
- }, m w6 R8 X6 h' a+ T, ?. J% Z
- pBuffer1++;
: Q' @: u& i1 r9 h' k - pBuffer2++;3 c1 m) }3 f* F. T" _6 J
- }
7 N1 q* B& C' B2 K1 s - 0 P$ M3 X |( s
- return 0;5 o5 T1 j4 | E4 Z" `5 X. n# a
- }* F" g: [3 O- S M
复制代码 我们在while开启LED循环,只有前面秘钥验证正确后,才能执行到该处~7 f$ ?( u0 W' f/ E
- /* USER CODE BEGIN WHILE */
5 U- M: v8 ~, [1 W: N- m) Z! I - while (1)
) q$ g+ L2 r' Y8 O9 j! E' ]& X) [ - {
( Q: x, a r' H0 s* \2 x# O; P - BSP_LED_Toggle(LED7);
6 @4 n, R2 ?" Y" Z& o; q - HAL_Delay(400);
6 O9 ]+ Q, a6 @& q6 r3 U, Z$ n - /* USER CODE END WHILE */* ?" v( W$ [* `3 ]+ A
- & c6 b- U; R, s9 |4 t4 q
- /* USER CODE BEGIN 3 */
7 v0 p$ E7 n' [4 j. Q4 \5 X - }
复制代码 编译,下载查看,测试通过LED闪烁:# ~- P3 B5 g; f: |% J |- p
9 V. j) \0 ]: c0 ?/ o I" @1 Y1 V! u* Y; k) }9 X5 }1 X& N$ g. d
用PKA加密的好处就是有多种模式可选,而且不用CPU干啥,也无需外围加密芯片~s是个不错的选择!. p: G6 \) l2 E J. M8 _
当然,这是有大量的兑换机制有ST及其他密码学人员帮我们弄好了,其实也是挺复杂的。对于我们开4 ^% p! E$ K4 B0 v7 T# H
发着而言,直接拿来用即可~无需知道下单的鸡长什么~当然有大神因此去读密码学也是不是不可能~ L: A; ~+ i+ K; B3 ~! ~/ k; L
|