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

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

[复制链接]
guoyuli 发布时间:2023-9-11 10:36
STM32H5硬件配置有SHA1、SHA224、SHA256、SHA384、SHA512、HMAC 等更高级的运算硬件加速单元,SHA算法是常用的安全验证算法,在密码、加密等方面较为常用。如果使用单片机进行算法的演算会占用很长的机时,而且效率也较差。本次测试主要是测试SHA256的运算,同时也测试真随机数的生成和CRC16的计算加速等。
) t$ m! `' s  m. u0 V& W

& Z! c# u- y+ K+ C- p 649.jpg ! q& a* ^/ @4 k, n2 c& }7 O; q( V

3 H! T3 A1 p5 v# e% _  J
首先 打开HASH哈希、RNG随机数生成、CRC校验等功能,程序还需要将结果通过串口输出,打开了LED1和USART3端口。
代码生成后进入printf的定义和准备测试数据。
  1. ' Y; U" ~" R+ K9 R, F( X
  2. /* USER CODE BEGIN PTD */
    / W6 ?% n$ c5 _$ O, n% Q: a
  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.";3 ]" D! g  H; u# h/ W6 h. S+ t9 i
  4. __ALIGN_BEGIN static uint8_t aSHA256Digest[32] __ALIGN_END;
    ; A6 T4 M7 ^7 a: H0 t9 r  L6 X+ f
  5. __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
  6.                                                                     0x8a, 0xbb, 0xe4, 0xc4, 0x15, 0x40, 0xfb, 0x8c, 0x0a,
    5 i4 `) r; c# J
  7.                                                                     0xb2, 0x48, 0xf1, 0xf9, 0x99, 0xa0, 0x16, 0x81, 0xd1,/ A! k9 U+ H* h7 {8 l* M5 x
  8.                                                                     0xe5, 0x1c, 0x70, 0xfe, 0x7c};
    5 \) J; d0 j, B  q7 A6 Y
  9. /* USER CODE END PTD */0 I/ S7 |0 ^' v+ E# k! v5 J
  10. /* USER CODE BEGIN PV */
    4 w6 w% G0 F! A: N0 l
  11. __IO uint32_t uwCRCValue = 0;4 p* g5 r% w1 l9 V2 s' F9 E9 N7 K
  12. __IO uint32_t uwRNGValue = 0;
    * T( e2 r4 m, x, x" R- }6 |9 v4 @
  13. /* USER CODE END PV */
复制代码
, |$ w8 k+ p$ k% v' p' I
准备数据时需要注意HASH算法的结果需要做对齐操作。
初始化程序注意事项:
1 v, X& F) V1 O$ E. f, E
  1. % O3 X5 i; r( I9 v. [# S+ O
  2. /**4 X2 w! q, _: g* e9 O" I
  3.   * @brief CRC Initialization Function
    7 g$ o$ V. T) C$ g) D0 D9 G
  4.   * @param None! a0 b; c$ w9 y+ _
  5.   * @retval None
    ) h, O( \1 V5 U" t" N
  6.   */
    6 q; n8 }" z5 f
  7. static void MX_CRC_Init(void)% Z) n, j  S; x. {
  8. {
    : t8 M- w4 y$ i# n
  9. * u7 V. t2 g- r& m. t1 y
  10.   /* USER CODE BEGIN CRC_Init 0 */5 Q+ S' y7 U: I! }/ V
  11. / ]4 ^* N0 s. _% G1 D
  12.   /* USER CODE END CRC_Init 0 */7 G3 Z5 f3 o' e( Q0 p

  13. % K# J9 g0 W; M9 e/ _
  14.   /* USER CODE BEGIN CRC_Init 1 */9 q# _/ C8 P5 m

  15. , L0 T/ e5 f( L. d+ {% E
  16.   /* USER CODE END CRC_Init 1 */
      U  M8 n$ _6 L' s5 s: o+ O0 f2 |6 f& e1 n' B
  17.   hcrc.Instance = CRC;2 e. v! `: ]: |- X
  18.   hcrc.Init.CRCLength = CRC_POLYLENGTH_16B; //as I have a 16bit polynome  [! d5 p' V9 O; m. P% V
  19.   hcrc.Init.DefaultPolynomialUse = DEFAULT_POLYNOMIAL_ENABLE;
    - @) \1 s( S* ]/ z, I: D. V
  20.   hcrc.Init.DefaultInitValueUse = DEFAULT_INIT_VALUE_ENABLE;5 F1 H2 a3 B% @* H4 U
  21.   hcrc.Init.InputDataInversionMode = CRC_INPUTDATA_INVERSION_NONE;, P+ Q! f6 t9 B8 S8 R
  22.   hcrc.Init.OutputDataInversionMode = CRC_OUTPUTDATA_INVERSION_DISABLE;
    / H! X+ O$ g3 ^: ]) U3 @
  23.   hcrc.InputDataFormat = CRC_INPUTDATA_FORMAT_BYTES;4 a0 V: u& P3 x' \
  24.   if (HAL_CRC_Init(&hcrc) != HAL_OK)
    8 a: y* m) n+ \* F! _
  25.   {
    & j) B; l6 }& C: z
  26.     Error_Handler();9 T8 ~0 v" `0 P
  27.   }( s3 w- _2 @! X- x3 f8 C
  28.   /* USER CODE BEGIN CRC_Init 2 */0 Z; ^- Z8 g6 S$ ^

  29. 0 K  z% E) Y! n2 T9 K0 e  t% K
  30.   /* USER CODE END CRC_Init 2 */
    & _; v- Y1 }  R+ V" p

  31. 3 I0 P* c' j! p; F% S4 Y
  32. }
复制代码
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
  1. 5 }9 ~; _, c  d$ @. N* p( ?
  2. /**
    2 {4 l1 K: g: B$ q8 j# n
  3.   * @brief HASH Initialization Function' ?" P; R# V, o, I0 F8 T5 f, N6 G  l
  4.   * @param None. D% w; i( `7 E; ~! Z
  5.   * @retval None
    4 Z$ o" C( u. b% F$ C( d+ ^: x4 U
  6.   */static void MX_HASH_Init(void)
    ' K8 [0 L) E  ~% {, i$ j
  7. {5 @% j. _9 F' b4 K4 B  x

  8. 1 j  n- _0 C- G5 O0 Z
  9.   /* USER CODE BEGIN HASH_Init 0 */1 A3 T6 p- R( A) C" C6 l3 q
  10. ( V) s. u5 _$ z4 s0 g/ }
  11.   /* USER CODE END HASH_Init 0 */
    0 k  M* y0 }6 S/ A

  12. ! C1 i0 ?2 d0 [% V9 M' V; E
  13.   /* USER CODE BEGIN HASH_Init 1 */
    ' E) G% i: w6 N- b
  14. & x$ u9 e3 `: i& O6 S0 S
  15.   /* USER CODE END HASH_Init 1 */
    ! R0 k* A1 i6 _% D4 F
  16.   hhash.Instance = HASH;' L9 ], H* z; u8 Z* U( L! W2 c
  17.   hhash.Init.DataType = HASH_NO_SWAP;/ L3 T  t3 z, C% {5 B  Z, P
  18.   hhash.Init.Algorithm = HASH_ALGOSELECTION_SHA1;
    5 j$ S# {7 j' n  g* R) w" i! S
  19.   if (HAL_HASH_Init(&hhash) != HAL_OK)$ L: j% m; s) N1 h9 t' K+ s
  20.   {
    ' @" l0 q7 a0 s/ v9 D# e2 Y
  21.     Error_Handler();
    & L+ ^* d. [/ W+ ~* F4 M
  22.   }
    + _. {" u! f2 g+ j
  23.   /* USER CODE BEGIN HASH_Init 2 */% N+ n6 z& f/ G4 G7 |7 _" D/ }
  24. 1 L' M8 o) G1 x3 ]" o
  25.   /* USER CODE END HASH_Init 2 */5 `  L, V, C# Y% s

  26. 0 s+ f5 E5 k; Q
  27. }
复制代码

$ 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

  1. 8 p3 i7 [/ q3 ~
  2. /** @defgroup HASH_Algorithm_Selection   HASH algorithm selection
    , U, N) [- ^( o. a& z( }; [1 t9 _
  3.   * @{
    . E. }5 U/ F+ ^' Z; g6 G; H- k% Q8 r
  4.   */
    0 ^: R- B; K7 c. H* B
  5.   #define HASH_ALGOSELECTION_SHA1         0x00000000U                         /*!< HASH function is SHA1   */
    " j" G. R4 s) ^$ H# ~2 N3 w9 M
  6.   #define HASH_ALGOSELECTION_SHA224       HASH_CR_ALGO_1                      /*!< HASH function is SHA224 */
    + H* I7 z1 e3 O5 N: M
  7.   #define HASH_ALGOSELECTION_SHA256       (HASH_CR_ALGO_0 | HASH_CR_ALGO_1)     /*!< HASH function is SHA256 */1 I$ E& e$ s& ]( l
  8.   #if defined (HASH_CR_ALGO_2)
    ' M6 U# S8 t  B# ]$ k  s8 ?& J
  9.   #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
  10.   #define HASH_ALGOSELECTION_SHA512_224   (HASH_CR_ALGO_0 | HASH_CR_ALGO_2 |  HASH_CR_ALGO_3)+ k4 b$ T3 n/ q0 @) ?9 z
  11.   /*!< HASH function is SHA512_224 */
    # q% h+ x4 z+ r$ N9 Q' b8 G- w/ u
  12.   #define HASH_ALGOSELECTION_SHA512_256   (HASH_CR_ALGO_1 | HASH_CR_ALGO_2 |  HASH_CR_ALGO_3)* }, i% y; t0 ~: R2 O" j
  13.   /*!< HASH function is SHA512_256 */7 V1 R$ P) c  b. D* t1 V0 M1 e: ^
  14.   #define HASH_ALGOSELECTION_SHA512        HASH_CR_ALGO                       /*!< HASH function is SHA512 */
    1 X: A+ B" p" U1 F7 b
  15.   #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
  1. 0 s6 @/ f4 X: u( r. p. L
  2. /**
      a" |: p# l0 \  y3 [% A6 Z1 C
  3.   * @brief RNG Initialization Function: g2 q, v! z# u; G9 V- W, G
  4.   * @param None
    + Y( A2 m# T  _+ J, m+ W0 ^
  5.   * @retval None$ V9 B+ B3 q$ R0 `& c/ T8 d8 b& e
  6.   */static void MX_RNG_Init(void)
    , u# m8 p3 @2 F
  7. {
    1 T! i3 i1 J' j
  8. % L  P6 j; {9 H5 E
  9.   /* USER CODE BEGIN RNG_Init 0 */5 g2 ^( H3 e8 e9 }! g& U0 Q
  10. ; c0 @: e: G) K/ r+ V! F
  11.   /* USER CODE END RNG_Init 0 */4 _+ }4 Z- k0 E$ o6 z
  12. 2 C9 s7 b7 l$ U; g, ^
  13.   /* USER CODE BEGIN RNG_Init 1 */( y5 o& I8 \, P4 t+ I
  14. 6 g9 J% D/ @1 q' d# q# a
  15.   /* USER CODE END RNG_Init 1 */7 y5 e6 b0 s) p) k
  16.   hrng.Instance = RNG;8 U5 i  e. K0 D& P4 o/ T% y$ b
  17.   hrng.Init.ClockErrorDetection = RNG_CED_ENABLE;
    , r; U  G6 [' g
  18.   if (HAL_RNG_Init(&hrng) != HAL_OK)
    " V5 l2 Y4 A  Z: q1 g4 N
  19.   {) G0 J3 u" l7 O0 g
  20.     Error_Handler();
    3 o8 q  i  Q; r0 q* ?
  21.   }
    6 i* b+ j0 a1 g; K. b* d" U5 v
  22.   /* USER CODE BEGIN RNG_Init 2 */
    ) x& d) \5 V: d2 M& Y

  23. : s; R+ A; ?! Y9 h
  24.   /* USER CODE END RNG_Init 2 */
    * |8 E  ^$ J$ @
  25. # B: g4 C& K" K/ K* O
  26. }
复制代码

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
  1. /* USER CODE BEGIN 2 */
    & G8 ~% q% M8 I1 H. [) J3 C. Z
  2.   printf("Start a sha256!\n");
    3 Z: _5 F; v8 ]" y; L$ t) S
  3.   /* Start HASH computation using DMA transfer */
    + f" m+ s* B# {: a, k8 z
  4.   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
  5.   {
      \3 G2 m- P" U5 G  v! R4 u" I; r
  6.     Error_Handler();2 L: d: ^; V( b( s2 o8 V+ {
  7.   }
    3 b; ?2 T# a0 Y' o! _
  8.   while (HAL_HASH_GetState(&hhash) != HAL_HASH_STATE_READY);
    ; N7 O* v( D2 {0 m4 U( U+ W) r
  9. , N" w1 Y3 d- o9 e  E
  10.   if(HAL_RNG_GenerateRandomNumber(&hrng,(uint32_t*)&uwRNGValue) != HAL_OK)
    ' \0 T/ h2 |, _. f
  11.   {
    , [; b3 ]- S% M1 J) u
  12.     Error_Handler();9 ^; [2 J$ y! x5 @) @& H2 e+ f+ {) R
  13.   }
    $ m, j2 ^3 [- g3 C7 U% F
  14.   while (HAL_RNG_GetState(&hrng) != HAL_RNG_STATE_READY);
    ( [- r/ U/ d: p" A

  15. & {( P, v3 A. ]* c4 f' v4 J& U
  16.   printf("Gnerate Random Number:0x%X\n",uwRNGValue);2 t: E1 W$ a* Z6 r+ P; M( i7 `( d) R
  17.   uwCRCValue = HAL_CRC_Calculate(&hcrc,(uint32_t*)aInput,strlen((char const*)aInput));  & L6 Y8 Y. q9 e9 E# Z

  18. 3 ^. q) b! c! _
  19.   printf("Generate CRC Value:0x%X\n",uwCRCValue);" Q  F3 _- y/ L' Q  u
  20. ( ]6 J  a2 z) F  O8 b& a
  21.   printf("Gnerate SHA256\n Diges:");
    6 y! L" W' e1 B3 j
  22.   for(int i=0;i<32;i++)
    + O& b& N8 f8 r
  23.   {% d! O9 [) g( A- A# v0 \2 F$ u5 o
  24.     printf("%02X",aSHA256Digest[i]);1 @- _3 R8 L( J6 a, L
  25.   }
    ( J7 U2 ^' h5 `3 k1 d5 I
  26.   printf("\n");
复制代码
输出结果:# q2 _1 T) K2 u# {

6 j" a% d& {$ {) ^5 {! |: x 650.jpg
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; {
收藏 评论0 发布时间:2023-9-11 10:36

举报

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