STM32H5硬件配置有SHA1、SHA224、SHA256、SHA384、SHA512、HMAC 等更高级的运算硬件加速单元,SHA算法是常用的安全验证算法,在密码、加密等方面较为常用。如果使用单片机进行算法的演算会占用很长的机时,而且效率也较差。本次测试主要是测试SHA256的运算,同时也测试真随机数的生成和CRC16的计算加速等。8 h! R& c4 ]- b. v& w/ f; U2 N4 B
( d) q5 y' A' y, _. i9 S& Q( t
1 n7 x+ z4 T: e8 }, j W/ ~) e8 n' p
5 M3 ~6 R0 z2 F: {首先 打开HASH哈希、RNG随机数生成、CRC校验等功能,程序还需要将结果通过串口输出,打开了LED1和USART3端口。 代码生成后进入printf的定义和准备测试数据。
0 z1 Y& C. f2 e/ P, `2 `# l. w W- /* USER CODE BEGIN PTD */
. K" I- g! B8 B0 ?. F* p( K - __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.";5 ?5 p* d% F( w4 N: T' \- {/ G, D4 ]0 |
- __ALIGN_BEGIN static uint8_t aSHA256Digest[32] __ALIGN_END;
! f4 F) Y" s" P( o. j" B3 b - __ALIGN_BEGIN static uint8_t aExpectSHA256Digest[32] __ALIGN_END = {0x02, 0xfc, 0xa4, 0x29, 0x66, 0x37, 0xc1, 0xb0, 0xc2,0 }0 r: x3 q( }1 ?9 V2 V
- 0x8a, 0xbb, 0xe4, 0xc4, 0x15, 0x40, 0xfb, 0x8c, 0x0a,
5 h3 N1 }: m3 I& W( K3 ~% V - 0xb2, 0x48, 0xf1, 0xf9, 0x99, 0xa0, 0x16, 0x81, 0xd1,
8 N. w/ F& `: V; X - 0xe5, 0x1c, 0x70, 0xfe, 0x7c}; D! V, N( m H$ M1 X
- /* USER CODE END PTD */: \; X, X8 V c2 n
- /* USER CODE BEGIN PV */
( b$ c* L& L0 b - __IO uint32_t uwCRCValue = 0;1 v X/ F8 a& G1 Z2 J& X6 t; f4 [
- __IO uint32_t uwRNGValue = 0;" m! _/ S6 o O; {3 }- Y
- /* USER CODE END PV */
复制代码
: v' t( r" l8 w: U2 ~) Z' O准备数据时需要注意HASH算法的结果需要做对齐操作。初始化程序注意事项:
1 M# x( n; H* E6 Z- y) G+ l" ?- W- 4 ]) l! a* v6 w
- /**5 n0 |. d" O- c
- * @brief CRC Initialization Function( q4 R% C/ v: v# ~( I+ r
- * @param None
! D& c. a* @$ U8 t' U( x - * @retval None
9 H# w( U, E2 I( Z" {7 z8 x3 ^: O1 Y - */
. @ q$ L4 Z( Q7 w2 c+ F$ M% V6 e - static void MX_CRC_Init(void)
, k' E5 N& e' S0 Q& U - {$ A N& S9 V5 }/ ^% n" [
- " o+ Z" ~6 {8 Q
- /* USER CODE BEGIN CRC_Init 0 */, V# U$ \/ L7 ^" Z
3 w) d5 _7 }, C4 w( D4 Z5 e% S- /* USER CODE END CRC_Init 0 */
3 ^; Z9 t7 Y( _ z+ U9 x! r. H
( w x2 X5 i/ W" x( S- /* USER CODE BEGIN CRC_Init 1 */. a( e$ v" s9 ~
) `7 ~- q. m4 q. d+ L" R; B6 ?1 ]- /* USER CODE END CRC_Init 1 */
9 T; E4 V9 m3 _( Z$ a - hcrc.Instance = CRC;
+ M) K# W# ^! f* R' w - hcrc.Init.CRCLength = CRC_POLYLENGTH_16B; //as I have a 16bit polynome
- H G7 X& l8 i# \/ e. x& K5 [ - hcrc.Init.DefaultPolynomialUse = DEFAULT_POLYNOMIAL_ENABLE;$ O8 p( P5 ?8 S" X+ X8 B2 S7 k
- hcrc.Init.DefaultInitValueUse = DEFAULT_INIT_VALUE_ENABLE;; t2 B1 @3 M Z$ @) h& L
- hcrc.Init.InputDataInversionMode = CRC_INPUTDATA_INVERSION_NONE;
6 J: D0 I7 s6 n - hcrc.Init.OutputDataInversionMode = CRC_OUTPUTDATA_INVERSION_DISABLE;- s( R! j$ l# `1 s
- hcrc.InputDataFormat = CRC_INPUTDATA_FORMAT_BYTES;
+ ^0 f; F, I- F$ c1 N t3 p - if (HAL_CRC_Init(&hcrc) != HAL_OK)
, @ f. g6 Q$ O, C" ?) }$ ?5 T - {
+ W9 n" j0 ]6 C8 v: P0 r6 g* q1 n - Error_Handler();' p9 |' Z5 e4 `" |5 h" O8 I8 f
- }% W. F# b& T f, ~ k$ E3 A
- /* USER CODE BEGIN CRC_Init 2 */
- a) S2 k h: F
6 _6 o. J Y7 B1 `2 R k, T4 F- j- /* USER CODE END CRC_Init 2 */
: _$ q0 B$ q! L$ e8 \2 `- K
7 ]* ^6 j, k* [6 R/ E- }
复制代码 CRC程序位数的设置通过hcrc.Init.CRCLength = CRC_POLYLENGTH_16B; //as I have a 16bit polynome 达成,如果使用其它的位数需更换定义。默认是32B,如果使用自定义的“校验和式”通过 hcrc.Init.GeneratingPolynomial=进行定义,这个CRC功能非常完善。1 F* Y3 }" ^6 Y& }$ @1 F1 Y: J( F
3 E: n F# d5 U8 f$ N
6 J! B. g2 r# J+ ~- /**% s* _# T! I# N. w8 K r
- * @brief HASH Initialization Function
! `* p, q. i2 o( c1 z {& y2 h - * @param None* w9 w( {% ]) b8 h2 B
- * @retval None
$ b e5 |9 D# H' p - */static void MX_HASH_Init(void)
% P0 n2 A" b$ ?# } - { Q) w" [, j0 z3 ]: ~% i
! w5 `6 i$ d/ q. I- /* USER CODE BEGIN HASH_Init 0 */( r7 n& N3 s: n. v( o
4 R4 [% \+ X. Z1 ~2 t' D5 S5 }( D- /* USER CODE END HASH_Init 0 */
( D9 P/ U" [: {& N( K
: I) h/ n+ G9 S" e1 O Q1 j- /* USER CODE BEGIN HASH_Init 1 */; d* D- n& T8 S* N, B2 V2 V- G
2 h* h! o5 ?/ Q8 [4 B" i8 R) a- /* USER CODE END HASH_Init 1 */
8 c+ P u0 H O$ g - hhash.Instance = HASH;
1 T0 `: k3 v. w8 ?$ @0 G& r - hhash.Init.DataType = HASH_NO_SWAP;
+ U( z/ P) A2 \/ [; ?, V$ T% V L - hhash.Init.Algorithm = HASH_ALGOSELECTION_SHA1;
6 b/ X$ D9 P) D3 D# J* z - if (HAL_HASH_Init(&hhash) != HAL_OK)
+ n- Z# J! y0 j; r - {
. \0 d6 y) b- T( p - Error_Handler();# W& }3 T7 v: ~ Q" S
- }
6 v$ [% P1 [) u2 J5 f - /* USER CODE BEGIN HASH_Init 2 */( v& ^0 \: s2 J$ W
6 |8 B, k7 _- a& ~- /* USER CODE END HASH_Init 2 */
, J2 u2 e, R) R, I1 O" R" R2 L
/ K1 E3 d# l# c$ [& ^- }
复制代码
. p" \' q3 |0 | {HASH加速单元的设置,也是可以通过初始化来选择算法地。hhash.Init.Algorithm = HASH_ALGOSELECTION_SHA1; 定义使用何种算法,其它的可以更换。+ z# k, u: t l( }! F
4 K q( {( D8 u- E6 `( b$ y- x5 h- . v; Y/ I9 z3 t- g+ g8 s
- /** @defgroup HASH_Algorithm_Selection HASH algorithm selection
g }5 Q3 k7 ^0 s - * @{
, Z- ~1 a/ b: I) L& Y4 r - */
6 a4 e: }0 J( E; u3 m$ O - #define HASH_ALGOSELECTION_SHA1 0x00000000U /*!< HASH function is SHA1 */6 ~* I# C5 ^% R
- #define HASH_ALGOSELECTION_SHA224 HASH_CR_ALGO_1 /*!< HASH function is SHA224 */
$ c: o; i# j6 P: T6 s7 [! ?. F) z - #define HASH_ALGOSELECTION_SHA256 (HASH_CR_ALGO_0 | HASH_CR_ALGO_1) /*!< HASH function is SHA256 */$ F( @& |2 R; f5 _/ u- V
- #if defined (HASH_CR_ALGO_2)/ ^& M6 m) [$ h2 T
- #define HASH_ALGOSELECTION_SHA384 (HASH_CR_ALGO_2 | HASH_CR_ALGO_3) /*!< HASH function is SHA384 */! I" x8 e2 d& V3 ?0 h
- #define HASH_ALGOSELECTION_SHA512_224 (HASH_CR_ALGO_0 | HASH_CR_ALGO_2 | HASH_CR_ALGO_3)$ Q. ~3 V" p& n: `' ~7 t. A2 e
- /*!< HASH function is SHA512_224 */
' i: [- N. @( Y0 Q - #define HASH_ALGOSELECTION_SHA512_256 (HASH_CR_ALGO_1 | HASH_CR_ALGO_2 | HASH_CR_ALGO_3)
( `- k5 B, a: G1 v - /*!< HASH function is SHA512_256 */
i+ m0 I3 p5 I; g, S# w1 ?8 I, u - #define HASH_ALGOSELECTION_SHA512 HASH_CR_ALGO /*!< HASH function is SHA512 */- @! T7 X& Z; E" X
- #endif /* defined (HASH_CR_ALGO_2) */
复制代码 非常方便,hhash.Init.DataType = HASH_NO_SWAP; 是定义的数据格式。7 A# s2 K4 A/ U5 l. g, u1 W+ G# Z
随机数生成
, V1 X8 [9 u9 g# U! r$ ~$ j- 6 Q* e! t0 p( M' o: t2 e9 O
- /**7 a$ m2 q& |. T( o* v
- * @brief RNG Initialization Function
: u5 r, f0 J \' l& e - * @param None
1 p8 w( Z/ g' [3 D2 c {( F/ o$ A - * @retval None, T* j$ ? q2 q+ a
- */static void MX_RNG_Init(void)6 t# L* w# q7 }8 b! B
- {( n* z( a: u: J
- 4 P0 c6 p# {' X! |1 F
- /* USER CODE BEGIN RNG_Init 0 */ M: B; p2 B, _; X" O" K: z
- 1 E2 a( } E3 [
- /* USER CODE END RNG_Init 0 */
1 p8 L3 Y7 D' j1 g \. i - ; G4 H* C& N6 J4 L. a
- /* USER CODE BEGIN RNG_Init 1 */
5 ]$ y0 n$ c3 x( F" O5 P
S9 A; g6 F0 Q+ ]! Z4 _* b- /* USER CODE END RNG_Init 1 */
3 a1 S8 b( C+ m" O( ^! A. {: m - hrng.Instance = RNG;
% k' u; \: p% [* ^ - hrng.Init.ClockErrorDetection = RNG_CED_ENABLE;; y: Z' j6 }8 s" ?! l6 ~4 z: Q9 c9 W! A
- if (HAL_RNG_Init(&hrng) != HAL_OK)' }% O7 }1 r" N: ~
- {
+ s- ^0 _# J3 \" W: H( q - Error_Handler();
" b5 N( P5 y5 i: i3 G - }
2 n4 O5 o" n- \' s- S - /* USER CODE BEGIN RNG_Init 2 */1 _. G! {% r/ N+ U
) l7 j6 R. x. Q* ` z! m6 s- /* USER CODE END RNG_Init 2 */
- _. e& l9 Q4 A/ P$ i( Q
1 t1 \" G1 [* k1 N7 I- }
复制代码
! G( _5 F" X6 D. ?, g+ H, [! E$ L
0 j- ~, ?" q8 F# a然后是调用各功能。
* x. X% A" s+ a5 U) ]+ w
2 |- q! F0 Z6 [; Y l% |+ |; |7 u# V0 n: E& D
- /* USER CODE BEGIN 2 */' N# L9 N9 s# R. o( n5 r
- printf("Start a sha256!\n");
5 M; x8 _2 A8 P, C3 D# @ - /* Start HASH computation using DMA transfer */
+ e& B" w" ^2 x' O+ \/ n. S - if (HAL_HASH_Start(&hhash, (uint8_t*)aInput, strlen((char const*)aInput), aSHA256Digest,0xFFFF) != HAL_OK)& O4 g) A2 @3 A
- {4 ?% Z6 D; Q+ ^( c) K
- Error_Handler();
: T' x7 @) \! ^; P - }
) b7 s% q$ |5 x+ Q7 ^9 ]6 E2 F! x! f - while (HAL_HASH_GetState(&hhash) != HAL_HASH_STATE_READY);. H8 D3 }+ t9 D3 G( s$ ~) m6 Y
$ {) L( L. u5 _- if(HAL_RNG_GenerateRandomNumber(&hrng,(uint32_t*)&uwRNGValue) != HAL_OK)- p: w3 {! z' w+ c7 ?8 D; j6 }
- {
- @4 \: I# S8 ^% A0 d - Error_Handler();# U5 C7 B8 y! E8 w. Y
- }; R% ]' R' H! x/ v0 B
- while (HAL_RNG_GetState(&hrng) != HAL_RNG_STATE_READY);
: F% J' Z7 f3 A8 S+ j; @4 v - 2 W$ @- O: c+ Y: l* k, C
- printf("Gnerate Random Number:0x%X\n",uwRNGValue);$ D* D" G/ X. m. O2 n2 w
- uwCRCValue = HAL_CRC_Calculate(&hcrc,(uint32_t*)aInput,strlen((char const*)aInput)); 2 g9 O- @4 u( t0 Q& e% ^2 Y$ O
- : s8 Y5 |' b( }6 }5 u* h
- printf("Generate CRC Value:0x%X\n",uwCRCValue);) V6 ~8 O) y- B2 w' C' d4 ]( y9 H" S, K( v
- H% Q. l: p( @- F
- printf("Gnerate SHA256\n Diges:");
$ C, g1 |3 C6 Y A/ ^ - for(int i=0;i<32;i++)6 z2 Y% e- q1 t4 {
- {
7 _! f/ G0 X, d2 c% N - printf("%02X",aSHA256Digest[i]);
+ N1 B/ L* o- S5 x2 m - }
1 M8 x4 y, X4 [' ?& b& J - printf("\n");
复制代码 输出结果:5 O. A) T& b0 i0 _2 n
5 i& w8 P2 p0 X3 h {
6 D/ i r- F! P; g" x1 L3 M
0 c. ^; z" ?% D+ P$ V. q& `- `( ]7 Y4 i$ Z6 ^
来源:EEWORLD论坛网友 bigbat 版权归原作者所有) R, V% {! T7 X( @" H9 N
2 A- T, ~0 k4 P5 L0 @1 _; j/ f" ^& J! { |