STM32U585主打了数据安全,当然也提供了多种方式。我们这里用B-U585I-IOT02A开发板测试 PKA加密~也就是大家经常在计算机领域听到的公钥加密法~
- J+ V+ S* M% S$ `我们先来看看一些导图:, y1 Y1 R7 h8 x5 ?$ J% u8 ]
应用场景:( f$ S1 W' p5 a& C ~: r8 H
% A9 J/ \" V V- k/ ]5 F
: s7 W2 v" k$ b3 z) g7 Z1 ^完全硬件自发,无需CPU干预:; Q" f: e# _( ]. G( d# f
: p: S6 ]/ F, e
使用流程:
1 S# f! W: e c
4 K t* y* | ^+ d1 [; T' c/ j
! c8 c! m, [7 h, H4 T! K t好,由于全在MCU内部,这了也没有什么原理图,我们直接开始CUBEMC的配置:
9 o9 i# b# C' V
) K" y$ I* G' f$ p
7 \4 S# P5 N# p: f( K3 X; k: a& y" {
- m+ J# w" b: a
2 t- h- c3 Q- u: K! a% P
2 D1 Q4 `1 h0 o1 Q8 ?' F
9 w7 b- Y7 Y- b
% {& p4 @/ z( x
& a+ y2 N7 v p! m6 _自动生成代码,我们添加我们的私钥及公钥对,对其进行测试:! p/ x5 f4 A' M( x8 D, Y
- PKA_HandleTypeDef hpka;/ m( H2 Y0 f# T" T
- : O* r5 q& S! {
- RNG_HandleTypeDef hrng;, _6 O4 o8 z/ g0 L! I! a
- % y6 a# R" j9 p! ~+ F6 s
- /* USER CODE BEGIN PV */0 p) C* _% k# c! m5 [" `5 [8 j, n: @
- PKA_ModExpProtectModeInTypeDef in = {0};
6 b: y/ t! W& l0 B/ `' b8 X6 T
& Z; e! o- C3 p, C: c" e- /* Input vectors */
7 t! o# r& K. C) p1 V( m$ A* c$ Z - uint32_t input1_OpSize = 32;
. o: E' d2 x% U3 t - uint32_t input1_ExpSize = 32;; [) D, m- l" O. @, q5 ?
- 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};
' ?7 C9 l1 j) ^' G8 a - 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};2 M1 m# y' S/ v
- 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};
$ L0 v- R& f( K1 `6 Z4 D - 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};/ a! x- S* s6 I1 r/ g
- 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};# C) j7 a+ c' U7 x
/ A( @' [! y( w; V3 O- uint8_t buffer[32];. i, W2 S4 A6 X7 _, W
- 2 H. c" L7 T2 k$ O' U9 i& t
- __IO uint32_t hal_EndOfProcess = 0;
( W. u; V/ E( _( @+ Z1 g - __IO uint32_t hal_ErrorCallback = 0;
复制代码 计算结果与预制值得比较函数:
1 S) [/ e6 z+ g1 W- static uint16_t Buffercmp(uint8_t* pBuffer1, uint8_t* pBuffer2, uint16_t BufferLength);
复制代码 在main函数里面添加:
% P. |! T0 M9 k) Y- /* Initialize all configured peripherals */
! J, b1 R- i4 J4 ]3 J# x8 l0 h - MX_ICACHE_Init();1 [2 \( z/ w! J8 r/ B: z, q
- MX_RNG_Init();, d: U& k7 I$ r9 i1 r
- MX_PKA_Init();
. G: b; y5 `7 B! e3 i3 D - /* USER CODE BEGIN 2 */
) c6 ^& v, M- K$ U - ( }: d. v+ m4 k1 L9 k
- /* Set input parameters */ U7 o' A5 ]. F; S; w
- in.OpSize = input1_OpSize;* |3 ]9 d! N1 r* E1 r- G
- in.expSize = input1_ExpSize;
: x7 v* L# O1 e7 ]. E - in.pMod = input1_1;
( b$ }7 p& a' o) g$ A - in.pExp = input1_2;
: n1 w# w$ j9 C7 @ - in.pOp1 = input1_3;
7 Z2 j4 I; |$ w" l! q/ k, } - in.pPhi = input1_4;0 r2 X4 j; @) B3 x
- ; _5 N4 t& L) F' U/ s6 U1 H) M
- /* Start PKA protected Modular exponentiation operation */
: `/ U; a0 A8 O4 i7 g - if (HAL_PKA_ModExpProtectMode_IT(&hpka, &in) != HAL_OK)' T- S3 v; b; @# F
- {
; ^/ t% v! D" u( ?# O% f) Y - /* HAL PKA Operation error */+ r; ^ c5 B( x9 a; z6 [
- Error_Handler();
3 m$ B6 h. _0 N - }, r* Y; G& ^1 v6 f; J
$ X$ ?8 r7 ]0 i4 t- /* Wait until operation finish */
: `7 R' p1 J+ a3 S - while (!hal_EndOfProcess);$ b- R; _& F! I; J* K# D, K* b6 K
- hal_EndOfProcess = 0;
6 T8 ~8 w2 O, A, t- t) H( k
8 b( x x" K5 J- /* Retrieve computation result */9 Q& i/ \! B& V1 }, P5 ^
- HAL_PKA_ModExp_GetResult(&hpka, buffer);# w E. S* S7 q4 B( a
9 b6 q. T8 H) I t% D4 p; C2 G) A* @- /* Check retrieved result with expected result */
6 o% ^5 v+ l+ e! [ - if ((Buffercmp((uint8_t*)buffer, (uint8_t*)output1, 32) != 0) || (hal_ErrorCallback == 1))5 m7 x7 S' N, J: X# [( p/ G. F
- {
. ~% a+ I* o! n/ c - /* HAL PKA Operation error */0 ~ i9 ]. C. Q. Z: q8 o
- Error_Handler();
" B; Y5 }! L8 w7 ~- o. g% i - }
复制代码 一些回调函数:5 l. V/ Y7 L/ O& v, r8 x
- /**
& t2 j: n8 h) x# `8 J - * @brief Process completed callback.9 M( Q2 L/ I8 l- m# ~1 d
- * @param hpka PKA handle+ e4 ^' u' U) d
- * @retval None
6 u- I7 F. p; K7 h: g' k7 w7 d! f - */0 j% C! w+ P/ v. y
- void HAL_PKA_OperationCpltCallback(PKA_HandleTypeDef *hpka)
7 m8 W& Z7 \1 }- ~" k - {& [% p. q" V. j( x
- hal_EndOfProcess = 1;5 ]( @' k6 d+ y$ v4 ^
- }" S7 j& Y2 E$ j* {% Z2 b9 _( L
- m# [, {+ u3 k7 }+ J- /**/ f, f$ ~, N! R6 l
- * @brief Error callback.
6 |& z0 H8 G, W) m3 U2 p - * @param hpka PKA handle
5 D: l. ~2 D& y+ P) c0 G - * @retval None+ L/ a5 I8 }: u
- */" H* O Q+ o7 K+ Y
- void HAL_PKA_ErrorCallback(PKA_HandleTypeDef *hpka) A- S2 |0 \9 i# g! g
- {( K( V& L5 f2 r& r9 X
- hal_ErrorCallback = 1;
6 ?0 u& }8 x9 B( c8 s& x - }6 a, `; H9 e3 D6 a
- 4 j7 F9 x. }% o7 [" W
- /**
! c+ X2 Y0 x2 S8 Z8 e6 z2 X- M2 t5 m - * @brief Compares two buffers.+ z: n' h4 O5 N9 \. x) i
- * @param pBuffer1, pBuffer2: buffers to be compared.
" ?& Q- f. O7 D6 O8 t* G - * @param BufferLength: buffer's length
) Q7 w8 _4 Z/ l. p7 }* i' o - * @retval 0 : pBuffer1 identical to pBuffer2
9 z% f. q0 Y1 c4 J$ | - * >0 : pBuffer1 differs from pBuffer2 A- T b" J7 s1 g% R& }) B
- */8 B: k# O- F, X9 l
- static uint16_t Buffercmp(uint8_t* pBuffer1, uint8_t* pBuffer2, uint16_t BufferLength)2 O% _8 N _' F. p- g3 g# w
- {
% q$ V) I; {9 P! N9 u. e, d* o - while (BufferLength--)' ~$ J+ f! |* B% f
- {
b8 B- q; S0 S( a8 G ~ - if ((*pBuffer1) != *pBuffer2)2 U$ T* B6 f& A0 y6 e# e0 }( q0 e' a
- {( C9 \# V: W' L K1 A7 M, D0 G
- return BufferLength;
7 y* H# h7 a0 X. b - }$ Z" H+ z" o! Q1 ?! x0 J
- pBuffer1++;
# a: p! y% a; A$ Q4 C8 x2 { o - pBuffer2++;
" M8 B$ D' r8 a6 @5 J J2 A4 n - }* P1 w0 {3 B3 X! i
- 5 y2 V2 {. o# g$ o
- return 0;
* o% D5 l" U7 J - }* a8 t* O- U- j4 p: P+ C7 E; E
复制代码 我们在while开启LED循环,只有前面秘钥验证正确后,才能执行到该处~5 W; D/ `; P( |. h# z6 }
- /* USER CODE BEGIN WHILE */
5 ?, }5 P3 |! a( |; u - while (1)- P6 q+ E' ], K6 [6 i
- {
0 B+ ^; ?: k. |$ f - BSP_LED_Toggle(LED7);
* }( M: g: e! F' Z3 h1 n8 b - HAL_Delay(400);, t! @$ t& q" U1 i6 K0 `. P
- /* USER CODE END WHILE */
! `4 J! D' v( b1 m* B
0 B4 H- \ C8 P! f E8 o$ ?- /* USER CODE BEGIN 3 */' X3 d/ ~$ x. @- C y @# o
- }
复制代码 编译,下载查看,测试通过LED闪烁:
f7 C1 Z! C$ X9 M
2 ^4 c7 t. J' r
# Y i: ?) K: N% {5 o& y, n
用PKA加密的好处就是有多种模式可选,而且不用CPU干啥,也无需外围加密芯片~s是个不错的选择!
0 n$ [" H1 H2 f3 m. J当然,这是有大量的兑换机制有ST及其他密码学人员帮我们弄好了,其实也是挺复杂的。对于我们开2 n% u/ I2 y- a) `3 J! { m# _1 q6 E
发着而言,直接拿来用即可~无需知道下单的鸡长什么~当然有大神因此去读密码学也是不是不可能~
) h4 ^& U/ N% o$ B- o U! a% W |
2 \1 |" z) E c* [/ m- l