你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

开箱测评-STM32H5内部算法硬件加速测试

[复制链接]
guoyuli 发布时间:2023-9-11 10:36
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
649.jpg
1 n7 x+ z4 T: e8 }, j  W/ ~) e8 n' p
5 M3 ~6 R0 z2 F: {
首先 打开HASH哈希、RNG随机数生成、CRC校验等功能,程序还需要将结果通过串口输出,打开了LED1和USART3端口。
代码生成后进入printf的定义和准备测试数据。

  1. 0 z1 Y& C. f2 e/ P, `2 `# l. w  W
  2. /* USER CODE BEGIN PTD */
    . K" I- g! B8 B0 ?. F* p( K
  3. __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 |
  4. __ALIGN_BEGIN static uint8_t aSHA256Digest[32] __ALIGN_END;
    ! f4 F) Y" s" P( o. j" B3 b
  5. __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
  6.                                                                     0x8a, 0xbb, 0xe4, 0xc4, 0x15, 0x40, 0xfb, 0x8c, 0x0a,
    5 h3 N1 }: m3 I& W( K3 ~% V
  7.                                                                     0xb2, 0x48, 0xf1, 0xf9, 0x99, 0xa0, 0x16, 0x81, 0xd1,
    8 N. w/ F& `: V; X
  8.                                                                     0xe5, 0x1c, 0x70, 0xfe, 0x7c};  D! V, N( m  H$ M1 X
  9. /* USER CODE END PTD */: \; X, X8 V  c2 n
  10. /* USER CODE BEGIN PV */
    ( b$ c* L& L0 b
  11. __IO uint32_t uwCRCValue = 0;1 v  X/ F8 a& G1 Z2 J& X6 t; f4 [
  12. __IO uint32_t uwRNGValue = 0;" m! _/ S6 o  O; {3 }- Y
  13. /* USER CODE END PV */
复制代码

: v' t( r" l8 w: U2 ~) Z' O准备数据时需要注意HASH算法的结果需要做对齐操作。
初始化程序注意事项:

1 M# x( n; H* E6 Z- y) G+ l" ?- W
  1. 4 ]) l! a* v6 w
  2. /**5 n0 |. d" O- c
  3.   * @brief CRC Initialization Function( q4 R% C/ v: v# ~( I+ r
  4.   * @param None
    ! D& c. a* @$ U8 t' U( x
  5.   * @retval None
    9 H# w( U, E2 I( Z" {7 z8 x3 ^: O1 Y
  6.   */
    . @  q$ L4 Z( Q7 w2 c+ F$ M% V6 e
  7. static void MX_CRC_Init(void)
    , k' E5 N& e' S0 Q& U
  8. {$ A  N& S9 V5 }/ ^% n" [
  9. " o+ Z" ~6 {8 Q
  10.   /* USER CODE BEGIN CRC_Init 0 */, V# U$ \/ L7 ^" Z

  11. 3 w) d5 _7 }, C4 w( D4 Z5 e% S
  12.   /* USER CODE END CRC_Init 0 */
    3 ^; Z9 t7 Y( _  z+ U9 x! r. H

  13. ( w  x2 X5 i/ W" x( S
  14.   /* USER CODE BEGIN CRC_Init 1 */. a( e$ v" s9 ~

  15. ) `7 ~- q. m4 q. d+ L" R; B6 ?1 ]
  16.   /* USER CODE END CRC_Init 1 */
    9 T; E4 V9 m3 _( Z$ a
  17.   hcrc.Instance = CRC;
    + M) K# W# ^! f* R' w
  18.   hcrc.Init.CRCLength = CRC_POLYLENGTH_16B; //as I have a 16bit polynome
    - H  G7 X& l8 i# \/ e. x& K5 [
  19.   hcrc.Init.DefaultPolynomialUse = DEFAULT_POLYNOMIAL_ENABLE;$ O8 p( P5 ?8 S" X+ X8 B2 S7 k
  20.   hcrc.Init.DefaultInitValueUse = DEFAULT_INIT_VALUE_ENABLE;; t2 B1 @3 M  Z$ @) h& L
  21.   hcrc.Init.InputDataInversionMode = CRC_INPUTDATA_INVERSION_NONE;
    6 J: D0 I7 s6 n
  22.   hcrc.Init.OutputDataInversionMode = CRC_OUTPUTDATA_INVERSION_DISABLE;- s( R! j$ l# `1 s
  23.   hcrc.InputDataFormat = CRC_INPUTDATA_FORMAT_BYTES;
    + ^0 f; F, I- F$ c1 N  t3 p
  24.   if (HAL_CRC_Init(&hcrc) != HAL_OK)
    , @  f. g6 Q$ O, C" ?) }$ ?5 T
  25.   {
    + W9 n" j0 ]6 C8 v: P0 r6 g* q1 n
  26.     Error_Handler();' p9 |' Z5 e4 `" |5 h" O8 I8 f
  27.   }% W. F# b& T  f, ~  k$ E3 A
  28.   /* USER CODE BEGIN CRC_Init 2 */
    - a) S2 k  h: F

  29. 6 _6 o. J  Y7 B1 `2 R  k, T4 F- j
  30.   /* USER CODE END CRC_Init 2 */
    : _$ q0 B$ q! L$ e8 \2 `- K

  31. 7 ]* ^6 j, k* [6 R/ E
  32. }
复制代码
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

  1. 6 J! B. g2 r# J+ ~
  2. /**% s* _# T! I# N. w8 K  r
  3.   * @brief HASH Initialization Function
    ! `* p, q. i2 o( c1 z  {& y2 h
  4.   * @param None* w9 w( {% ]) b8 h2 B
  5.   * @retval None
    $ b  e5 |9 D# H' p
  6.   */static void MX_HASH_Init(void)
    % P0 n2 A" b$ ?# }
  7. {  Q) w" [, j0 z3 ]: ~% i

  8. ! w5 `6 i$ d/ q. I
  9.   /* USER CODE BEGIN HASH_Init 0 */( r7 n& N3 s: n. v( o

  10. 4 R4 [% \+ X. Z1 ~2 t' D5 S5 }( D
  11.   /* USER CODE END HASH_Init 0 */
    ( D9 P/ U" [: {& N( K

  12. : I) h/ n+ G9 S" e1 O  Q1 j
  13.   /* USER CODE BEGIN HASH_Init 1 */; d* D- n& T8 S* N, B2 V2 V- G

  14. 2 h* h! o5 ?/ Q8 [4 B" i8 R) a
  15.   /* USER CODE END HASH_Init 1 */
    8 c+ P  u0 H  O$ g
  16.   hhash.Instance = HASH;
    1 T0 `: k3 v. w8 ?$ @0 G& r
  17.   hhash.Init.DataType = HASH_NO_SWAP;
    + U( z/ P) A2 \/ [; ?, V$ T% V  L
  18.   hhash.Init.Algorithm = HASH_ALGOSELECTION_SHA1;
    6 b/ X$ D9 P) D3 D# J* z
  19.   if (HAL_HASH_Init(&hhash) != HAL_OK)
    + n- Z# J! y0 j; r
  20.   {
    . \0 d6 y) b- T( p
  21.     Error_Handler();# W& }3 T7 v: ~  Q" S
  22.   }
    6 v$ [% P1 [) u2 J5 f
  23.   /* USER CODE BEGIN HASH_Init 2 */( v& ^0 \: s2 J$ W

  24. 6 |8 B, k7 _- a& ~
  25.   /* USER CODE END HASH_Init 2 */
    , J2 u2 e, R) R, I1 O" R" R2 L

  26. / K1 E3 d# l# c$ [& ^
  27. }
复制代码

. 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
  1. . v; Y/ I9 z3 t- g+ g8 s
  2. /** @defgroup HASH_Algorithm_Selection   HASH algorithm selection
      g  }5 Q3 k7 ^0 s
  3.   * @{
    , Z- ~1 a/ b: I) L& Y4 r
  4.   */
    6 a4 e: }0 J( E; u3 m$ O
  5.   #define HASH_ALGOSELECTION_SHA1         0x00000000U                         /*!< HASH function is SHA1   */6 ~* I# C5 ^% R
  6.   #define HASH_ALGOSELECTION_SHA224       HASH_CR_ALGO_1                      /*!< HASH function is SHA224 */
    $ c: o; i# j6 P: T6 s7 [! ?. F) z
  7.   #define HASH_ALGOSELECTION_SHA256       (HASH_CR_ALGO_0 | HASH_CR_ALGO_1)     /*!< HASH function is SHA256 */$ F( @& |2 R; f5 _/ u- V
  8.   #if defined (HASH_CR_ALGO_2)/ ^& M6 m) [$ h2 T
  9.   #define HASH_ALGOSELECTION_SHA384       (HASH_CR_ALGO_2 |  HASH_CR_ALGO_3)  /*!< HASH function is SHA384 */! I" x8 e2 d& V3 ?0 h
  10.   #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
  11.   /*!< HASH function is SHA512_224 */
    ' i: [- N. @( Y0 Q
  12.   #define HASH_ALGOSELECTION_SHA512_256   (HASH_CR_ALGO_1 | HASH_CR_ALGO_2 |  HASH_CR_ALGO_3)
    ( `- k5 B, a: G1 v
  13.   /*!< HASH function is SHA512_256 */
      i+ m0 I3 p5 I; g, S# w1 ?8 I, u
  14.   #define HASH_ALGOSELECTION_SHA512        HASH_CR_ALGO                       /*!< HASH function is SHA512 */- @! T7 X& Z; E" X
  15.   #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
  1. 6 Q* e! t0 p( M' o: t2 e9 O
  2. /**7 a$ m2 q& |. T( o* v
  3.   * @brief RNG Initialization Function
    : u5 r, f0 J  \' l& e
  4.   * @param None
    1 p8 w( Z/ g' [3 D2 c  {( F/ o$ A
  5.   * @retval None, T* j$ ?  q2 q+ a
  6.   */static void MX_RNG_Init(void)6 t# L* w# q7 }8 b! B
  7. {( n* z( a: u: J
  8. 4 P0 c6 p# {' X! |1 F
  9.   /* USER CODE BEGIN RNG_Init 0 */  M: B; p2 B, _; X" O" K: z
  10. 1 E2 a( }  E3 [
  11.   /* USER CODE END RNG_Init 0 */
    1 p8 L3 Y7 D' j1 g  \. i
  12. ; G4 H* C& N6 J4 L. a
  13.   /* USER CODE BEGIN RNG_Init 1 */
    5 ]$ y0 n$ c3 x( F" O5 P

  14.   S9 A; g6 F0 Q+ ]! Z4 _* b
  15.   /* USER CODE END RNG_Init 1 */
    3 a1 S8 b( C+ m" O( ^! A. {: m
  16.   hrng.Instance = RNG;
    % k' u; \: p% [* ^
  17.   hrng.Init.ClockErrorDetection = RNG_CED_ENABLE;; y: Z' j6 }8 s" ?! l6 ~4 z: Q9 c9 W! A
  18.   if (HAL_RNG_Init(&hrng) != HAL_OK)' }% O7 }1 r" N: ~
  19.   {
    + s- ^0 _# J3 \" W: H( q
  20.     Error_Handler();
    " b5 N( P5 y5 i: i3 G
  21.   }
    2 n4 O5 o" n- \' s- S
  22.   /* USER CODE BEGIN RNG_Init 2 */1 _. G! {% r/ N+ U

  23. ) l7 j6 R. x. Q* `  z! m6 s
  24.   /* USER CODE END RNG_Init 2 */
    - _. e& l9 Q4 A/ P$ i( Q

  25. 1 t1 \" G1 [* k1 N7 I
  26. }
复制代码

! 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
  1. /* USER CODE BEGIN 2 */' N# L9 N9 s# R. o( n5 r
  2.   printf("Start a sha256!\n");
    5 M; x8 _2 A8 P, C3 D# @
  3.   /* Start HASH computation using DMA transfer */
    + e& B" w" ^2 x' O+ \/ n. S
  4.   if (HAL_HASH_Start(&hhash, (uint8_t*)aInput, strlen((char const*)aInput), aSHA256Digest,0xFFFF) != HAL_OK)& O4 g) A2 @3 A
  5.   {4 ?% Z6 D; Q+ ^( c) K
  6.     Error_Handler();
    : T' x7 @) \! ^; P
  7.   }
    ) b7 s% q$ |5 x+ Q7 ^9 ]6 E2 F! x! f
  8.   while (HAL_HASH_GetState(&hhash) != HAL_HASH_STATE_READY);. H8 D3 }+ t9 D3 G( s$ ~) m6 Y

  9. $ {) L( L. u5 _
  10.   if(HAL_RNG_GenerateRandomNumber(&hrng,(uint32_t*)&uwRNGValue) != HAL_OK)- p: w3 {! z' w+ c7 ?8 D; j6 }
  11.   {
    - @4 \: I# S8 ^% A0 d
  12.     Error_Handler();# U5 C7 B8 y! E8 w. Y
  13.   }; R% ]' R' H! x/ v0 B
  14.   while (HAL_RNG_GetState(&hrng) != HAL_RNG_STATE_READY);
    : F% J' Z7 f3 A8 S+ j; @4 v
  15. 2 W$ @- O: c+ Y: l* k, C
  16.   printf("Gnerate Random Number:0x%X\n",uwRNGValue);$ D* D" G/ X. m. O2 n2 w
  17.   uwCRCValue = HAL_CRC_Calculate(&hcrc,(uint32_t*)aInput,strlen((char const*)aInput));  2 g9 O- @4 u( t0 Q& e% ^2 Y$ O
  18. : s8 Y5 |' b( }6 }5 u* h
  19.   printf("Generate CRC Value:0x%X\n",uwCRCValue);) V6 ~8 O) y- B2 w' C' d4 ]( y9 H" S, K( v
  20.   H% Q. l: p( @- F
  21.   printf("Gnerate SHA256\n Diges:");
    $ C, g1 |3 C6 Y  A/ ^
  22.   for(int i=0;i<32;i++)6 z2 Y% e- q1 t4 {
  23.   {
    7 _! f/ G0 X, d2 c% N
  24.     printf("%02X",aSHA256Digest[i]);
    + N1 B/ L* o- S5 x2 m
  25.   }
    1 M8 x4 y, X4 [' ?& b& J
  26.   printf("\n");
复制代码
输出结果:5 O. A) T& b0 i0 _2 n
5 i& w8 P2 p0 X3 h  {
650.jpg 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! {
收藏 评论0 发布时间:2023-9-11 10:36

举报

0个回答
关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版