STM32H5硬件配置有SHA1、SHA224、SHA256、SHA384、SHA512、HMAC 等更高级的运算硬件加速单元,SHA算法是常用的安全验证算法,在密码、加密等方面较为常用。如果使用单片机进行算法的演算会占用很长的机时,而且效率也较差。本次测试主要是测试SHA256的运算,同时也测试真随机数的生成和CRC16的计算加速等。
) t$ m! `' s m. u0 V& W
& Z! c# u- y+ K+ C- p
! q& a* ^/ @4 k, n2 c& }7 O; q( V
3 H! T3 A1 p5 v# e% _ J首先 打开HASH哈希、RNG随机数生成、CRC校验等功能,程序还需要将结果通过串口输出,打开了LED1和USART3端口。 代码生成后进入printf的定义和准备测试数据。 - ' Y; U" ~" R+ K9 R, F( X
- /* USER CODE BEGIN PTD */
/ W6 ?% n$ c5 _$ O, n% Q: a - __ALIGN_BEGIN const uint8_t aInput[] __ALIGN_END = "STM32H5 is a high-performance microcontrollers family based on Arm Cortex-M33 32-bit RISC core. It offers native and installable security services.";3 ]" D! g H; u# h/ W6 h. S+ t9 i
- __ALIGN_BEGIN static uint8_t aSHA256Digest[32] __ALIGN_END;
; A6 T4 M7 ^7 a: H0 t9 r L6 X+ f - __ALIGN_BEGIN static uint8_t aExpectSHA256Digest[32] __ALIGN_END = {0x02, 0xfc, 0xa4, 0x29, 0x66, 0x37, 0xc1, 0xb0, 0xc2,( U6 z/ c% k* S7 g$ s
- 0x8a, 0xbb, 0xe4, 0xc4, 0x15, 0x40, 0xfb, 0x8c, 0x0a,
5 i4 `) r; c# J - 0xb2, 0x48, 0xf1, 0xf9, 0x99, 0xa0, 0x16, 0x81, 0xd1,/ A! k9 U+ H* h7 {8 l* M5 x
- 0xe5, 0x1c, 0x70, 0xfe, 0x7c};
5 \) J; d0 j, B q7 A6 Y - /* USER CODE END PTD */0 I/ S7 |0 ^' v+ E# k! v5 J
- /* USER CODE BEGIN PV */
4 w6 w% G0 F! A: N0 l - __IO uint32_t uwCRCValue = 0;4 p* g5 r% w1 l9 V2 s' F9 E9 N7 K
- __IO uint32_t uwRNGValue = 0;
* T( e2 r4 m, x, x" R- }6 |9 v4 @ - /* USER CODE END PV */
复制代码 , |$ w8 k+ p$ k% v' p' I
准备数据时需要注意HASH算法的结果需要做对齐操作。初始化程序注意事项: 1 v, X& F) V1 O$ E. f, E
- % O3 X5 i; r( I9 v. [# S+ O
- /**4 X2 w! q, _: g* e9 O" I
- * @brief CRC Initialization Function
7 g$ o$ V. T) C$ g) D0 D9 G - * @param None! a0 b; c$ w9 y+ _
- * @retval None
) h, O( \1 V5 U" t" N - */
6 q; n8 }" z5 f - static void MX_CRC_Init(void)% Z) n, j S; x. {
- {
: t8 M- w4 y$ i# n - * u7 V. t2 g- r& m. t1 y
- /* USER CODE BEGIN CRC_Init 0 */5 Q+ S' y7 U: I! }/ V
- / ]4 ^* N0 s. _% G1 D
- /* USER CODE END CRC_Init 0 */7 G3 Z5 f3 o' e( Q0 p
% K# J9 g0 W; M9 e/ _- /* USER CODE BEGIN CRC_Init 1 */9 q# _/ C8 P5 m
, L0 T/ e5 f( L. d+ {% E- /* USER CODE END CRC_Init 1 */
U M8 n$ _6 L' s5 s: o+ O0 f2 |6 f& e1 n' B - hcrc.Instance = CRC;2 e. v! `: ]: |- X
- hcrc.Init.CRCLength = CRC_POLYLENGTH_16B; //as I have a 16bit polynome [! d5 p' V9 O; m. P% V
- hcrc.Init.DefaultPolynomialUse = DEFAULT_POLYNOMIAL_ENABLE;
- @) \1 s( S* ]/ z, I: D. V - hcrc.Init.DefaultInitValueUse = DEFAULT_INIT_VALUE_ENABLE;5 F1 H2 a3 B% @* H4 U
- hcrc.Init.InputDataInversionMode = CRC_INPUTDATA_INVERSION_NONE;, P+ Q! f6 t9 B8 S8 R
- hcrc.Init.OutputDataInversionMode = CRC_OUTPUTDATA_INVERSION_DISABLE;
/ H! X+ O$ g3 ^: ]) U3 @ - hcrc.InputDataFormat = CRC_INPUTDATA_FORMAT_BYTES;4 a0 V: u& P3 x' \
- if (HAL_CRC_Init(&hcrc) != HAL_OK)
8 a: y* m) n+ \* F! _ - {
& j) B; l6 }& C: z - Error_Handler();9 T8 ~0 v" `0 P
- }( s3 w- _2 @! X- x3 f8 C
- /* USER CODE BEGIN CRC_Init 2 */0 Z; ^- Z8 g6 S$ ^
0 K z% E) Y! n2 T9 K0 e t% K- /* USER CODE END CRC_Init 2 */
& _; v- Y1 } R+ V" p
3 I0 P* c' j! p; F% S4 Y- }
复制代码 CRC程序位数的设置通过hcrc.Init.CRCLength = CRC_POLYLENGTH_16B; //as I have a 16bit polynome 达成,如果使用其它的位数需更换定义。默认是32B,如果使用自定义的“校验和式”通过 hcrc.Init.GeneratingPolynomial=进行定义,这个CRC功能非常完善。
2 L, O8 k: Y* g1 i+ j* D. d9 h2 j: F( H/ K4 w* J$ c
- 5 }9 ~; _, c d$ @. N* p( ?
- /**
2 {4 l1 K: g: B$ q8 j# n - * @brief HASH Initialization Function' ?" P; R# V, o, I0 F8 T5 f, N6 G l
- * @param None. D% w; i( `7 E; ~! Z
- * @retval None
4 Z$ o" C( u. b% F$ C( d+ ^: x4 U - */static void MX_HASH_Init(void)
' K8 [0 L) E ~% {, i$ j - {5 @% j. _9 F' b4 K4 B x
1 j n- _0 C- G5 O0 Z- /* USER CODE BEGIN HASH_Init 0 */1 A3 T6 p- R( A) C" C6 l3 q
- ( V) s. u5 _$ z4 s0 g/ }
- /* USER CODE END HASH_Init 0 */
0 k M* y0 }6 S/ A
! C1 i0 ?2 d0 [% V9 M' V; E- /* USER CODE BEGIN HASH_Init 1 */
' E) G% i: w6 N- b - & x$ u9 e3 `: i& O6 S0 S
- /* USER CODE END HASH_Init 1 */
! R0 k* A1 i6 _% D4 F - hhash.Instance = HASH;' L9 ], H* z; u8 Z* U( L! W2 c
- hhash.Init.DataType = HASH_NO_SWAP;/ L3 T t3 z, C% {5 B Z, P
- hhash.Init.Algorithm = HASH_ALGOSELECTION_SHA1;
5 j$ S# {7 j' n g* R) w" i! S - if (HAL_HASH_Init(&hhash) != HAL_OK)$ L: j% m; s) N1 h9 t' K+ s
- {
' @" l0 q7 a0 s/ v9 D# e2 Y - Error_Handler();
& L+ ^* d. [/ W+ ~* F4 M - }
+ _. {" u! f2 g+ j - /* USER CODE BEGIN HASH_Init 2 */% N+ n6 z& f/ G4 G7 |7 _" D/ }
- 1 L' M8 o) G1 x3 ]" o
- /* USER CODE END HASH_Init 2 */5 ` L, V, C# Y% s
0 s+ f5 E5 k; Q- }
复制代码
$ G' J# C) X6 M3 q3 v7 J! c! W8 SHASH加速单元的设置,也是可以通过初始化来选择算法地。hhash.Init.Algorithm = HASH_ALGOSELECTION_SHA1; 定义使用何种算法,其它的可以更换。
3 U: ?4 }; S- Q3 I+ M; s0 [
* T+ u! A7 u7 }# R; v
8 p3 i7 [/ q3 ~- /** @defgroup HASH_Algorithm_Selection HASH algorithm selection
, U, N) [- ^( o. a& z( }; [1 t9 _ - * @{
. E. }5 U/ F+ ^' Z; g6 G; H- k% Q8 r - */
0 ^: R- B; K7 c. H* B - #define HASH_ALGOSELECTION_SHA1 0x00000000U /*!< HASH function is SHA1 */
" j" G. R4 s) ^$ H# ~2 N3 w9 M - #define HASH_ALGOSELECTION_SHA224 HASH_CR_ALGO_1 /*!< HASH function is SHA224 */
+ H* I7 z1 e3 O5 N: M - #define HASH_ALGOSELECTION_SHA256 (HASH_CR_ALGO_0 | HASH_CR_ALGO_1) /*!< HASH function is SHA256 */1 I$ E& e$ s& ]( l
- #if defined (HASH_CR_ALGO_2)
' M6 U# S8 t B# ]$ k s8 ?& J - #define HASH_ALGOSELECTION_SHA384 (HASH_CR_ALGO_2 | HASH_CR_ALGO_3) /*!< HASH function is SHA384 */
8 }' _0 E5 V1 O! [2 b2 H* l - #define HASH_ALGOSELECTION_SHA512_224 (HASH_CR_ALGO_0 | HASH_CR_ALGO_2 | HASH_CR_ALGO_3)+ k4 b$ T3 n/ q0 @) ?9 z
- /*!< HASH function is SHA512_224 */
# q% h+ x4 z+ r$ N9 Q' b8 G- w/ u - #define HASH_ALGOSELECTION_SHA512_256 (HASH_CR_ALGO_1 | HASH_CR_ALGO_2 | HASH_CR_ALGO_3)* }, i% y; t0 ~: R2 O" j
- /*!< HASH function is SHA512_256 */7 V1 R$ P) c b. D* t1 V0 M1 e: ^
- #define HASH_ALGOSELECTION_SHA512 HASH_CR_ALGO /*!< HASH function is SHA512 */
1 X: A+ B" p" U1 F7 b - #endif /* defined (HASH_CR_ALGO_2) */
复制代码 非常方便,hhash.Init.DataType = HASH_NO_SWAP; 是定义的数据格式。
7 w, t1 ?+ T: N+ I+ t" l随机数生成; z& F# [9 L4 N
- 0 s6 @/ f4 X: u( r. p. L
- /**
a" |: p# l0 \ y3 [% A6 Z1 C - * @brief RNG Initialization Function: g2 q, v! z# u; G9 V- W, G
- * @param None
+ Y( A2 m# T _+ J, m+ W0 ^ - * @retval None$ V9 B+ B3 q$ R0 `& c/ T8 d8 b& e
- */static void MX_RNG_Init(void)
, u# m8 p3 @2 F - {
1 T! i3 i1 J' j - % L P6 j; {9 H5 E
- /* USER CODE BEGIN RNG_Init 0 */5 g2 ^( H3 e8 e9 }! g& U0 Q
- ; c0 @: e: G) K/ r+ V! F
- /* USER CODE END RNG_Init 0 */4 _+ }4 Z- k0 E$ o6 z
- 2 C9 s7 b7 l$ U; g, ^
- /* USER CODE BEGIN RNG_Init 1 */( y5 o& I8 \, P4 t+ I
- 6 g9 J% D/ @1 q' d# q# a
- /* USER CODE END RNG_Init 1 */7 y5 e6 b0 s) p) k
- hrng.Instance = RNG;8 U5 i e. K0 D& P4 o/ T% y$ b
- hrng.Init.ClockErrorDetection = RNG_CED_ENABLE;
, r; U G6 [' g - if (HAL_RNG_Init(&hrng) != HAL_OK)
" V5 l2 Y4 A Z: q1 g4 N - {) G0 J3 u" l7 O0 g
- Error_Handler();
3 o8 q i Q; r0 q* ? - }
6 i* b+ j0 a1 g; K. b* d" U5 v - /* USER CODE BEGIN RNG_Init 2 */
) x& d) \5 V: d2 M& Y
: s; R+ A; ?! Y9 h- /* USER CODE END RNG_Init 2 */
* |8 E ^$ J$ @ - # B: g4 C& K" K/ K* O
- }
复制代码
0 W/ h- S6 u# `9 u* N3 m4 D D
6 u; f, E) O; Q; l6 n: W0 z/ O8 j然后是调用各功能。$ q8 x* k; s. a( D# O' i ?
7 `9 t2 B4 I8 m+ z0 a& ~3 f' j5 e+ Z: c
- /* USER CODE BEGIN 2 */
& G8 ~% q% M8 I1 H. [) J3 C. Z - printf("Start a sha256!\n");
3 Z: _5 F; v8 ]" y; L$ t) S - /* Start HASH computation using DMA transfer */
+ f" m+ s* B# {: a, k8 z - if (HAL_HASH_Start(&hhash, (uint8_t*)aInput, strlen((char const*)aInput), aSHA256Digest,0xFFFF) != HAL_OK)
$ Y; T5 d( j! g) T8 @% A% I+ u - {
\3 G2 m- P" U5 G v! R4 u" I; r - Error_Handler();2 L: d: ^; V( b( s2 o8 V+ {
- }
3 b; ?2 T# a0 Y' o! _ - while (HAL_HASH_GetState(&hhash) != HAL_HASH_STATE_READY);
; N7 O* v( D2 {0 m4 U( U+ W) r - , N" w1 Y3 d- o9 e E
- if(HAL_RNG_GenerateRandomNumber(&hrng,(uint32_t*)&uwRNGValue) != HAL_OK)
' \0 T/ h2 |, _. f - {
, [; b3 ]- S% M1 J) u - Error_Handler();9 ^; [2 J$ y! x5 @) @& H2 e+ f+ {) R
- }
$ m, j2 ^3 [- g3 C7 U% F - while (HAL_RNG_GetState(&hrng) != HAL_RNG_STATE_READY);
( [- r/ U/ d: p" A
& {( P, v3 A. ]* c4 f' v4 J& U- printf("Gnerate Random Number:0x%X\n",uwRNGValue);2 t: E1 W$ a* Z6 r+ P; M( i7 `( d) R
- uwCRCValue = HAL_CRC_Calculate(&hcrc,(uint32_t*)aInput,strlen((char const*)aInput)); & L6 Y8 Y. q9 e9 E# Z
3 ^. q) b! c! _- printf("Generate CRC Value:0x%X\n",uwCRCValue);" Q F3 _- y/ L' Q u
- ( ]6 J a2 z) F O8 b& a
- printf("Gnerate SHA256\n Diges:");
6 y! L" W' e1 B3 j - for(int i=0;i<32;i++)
+ O& b& N8 f8 r - {% d! O9 [) g( A- A# v0 \2 F$ u5 o
- printf("%02X",aSHA256Digest[i]);1 @- _3 R8 L( J6 a, L
- }
( J7 U2 ^' h5 `3 k1 d5 I - printf("\n");
复制代码 输出结果:# q2 _1 T) K2 u# {
6 j" a% d& {$ {) ^5 {! |: x
5 V! C& G0 F5 y5 W+ {2 X/ ~& k3 k
0 Y: B% ^0 d2 V) u: [: _
0 u7 }" d. W ^8 ^- T0 O' I. F2 J& Z来源:EEWORLD论坛网友 bigbat 版权归原作者所有" u! _2 f/ \( b% a7 G8 ]/ ?
- ~" v& z+ V' [5 W, D4 A! D; { |