硬汉嵌入式论坛

 找回密码
 立即注册
查看: 3615|回复: 11
收起左侧

[算法] Embedded Studio集成的39种完整性校验算法调用方法

[复制链接]

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106738
QQ
发表于 2020-8-18 02:10:17 | 显示全部楼层 |阅读模式

UM20005_Linker.pdf (720.84 KB, 下载次数: 50)

封装好了API,直接调用即可。
  1. * main()
  2. *
  3. * Function description
  4. * Application entry point for integrity verification.
  5. */
  6. int main(void) {
  7. unsigned char *pTestData = __TestData_start__;
  8. unsigned char *pCheckData = __TestData_end__;
  9. unsigned TestDataLen = __TestData_end__ - __TestData_start__;
  10. U32 CalcCRC;
  11. static U8 aHash[512/8];
  12. //
  13. // Initialize CRYPTO.
  14. //
  15. CRYPTO_MD5_Install (&CRYPTO_HASH_MD5_SW, NULL);
  16. CRYPTO_RIPEMD160_Install(&CRYPTO_HASH_RIPEMD160_SW, NULL);
  17. CRYPTO_SM3_Install (&CRYPTO_HASH_SM3_SW, NULL);
  18. CRYPTO_SHA1_Install (&CRYPTO_HASH_SHA1_SW, NULL);
  19. CRYPTO_SHA224_Install (&CRYPTO_HASH_SHA224_SW, NULL);
  20. CRYPTO_SHA256_Install (&CRYPTO_HASH_SHA256_SW, NULL);
  21. CRYPTO_SHA512_Install (&CRYPTO_HASH_SHA512_SW, NULL);
  22. CRYPTO_SHA3_224_Install (&CRYPTO_HASH_SHA3_224_SW, NULL);
  23. CRYPTO_SHA3_256_Install (&CRYPTO_HASH_SHA3_256_SW, NULL);
  24. CRYPTO_SHA3_384_Install (&CRYPTO_HASH_SHA3_384_SW, NULL);
  25. CRYPTO_SHA3_512_Install (&CRYPTO_HASH_SHA3_512_SW, NULL);
  26. //
  27. // Get address and length of data to check.
  28. //
  29. pTestData = __TestData_start__;
  30. TestDataLen = __TestData_end__ - __TestData_start__;
  31. //
  32. // Get address of the list of corresponding integrity check
  33. // values.
  34. //
  35. pCheckData = __TestData_end__;
  36. //
  37. // CRC-7/MMC.
  38. //
  39. CalcCRC = SEGGER_CRC_Calc_MSB(pTestData, TestDataLen, 0x00, 0x09, 7);
  40. _Assert(CalcCRC == *pCheckData);
  41. pCheckData += 1;
  42. //
  43. // CRC-8
  44. //
  45. CalcCRC = SEGGER_CRC_Calc_MSB(pTestData, TestDataLen, 0x00, 0x07, 8);
  46. _Assert(CalcCRC == *pCheckData);
  47. pCheckData += 1;
  48. //
  49. // CRC-8/CDMA2000
  50. //
  51. CalcCRC = SEGGER_CRC_Calc_MSB(pTestData, TestDataLen, 0xFF, 0x9B, 8);
  52. _Assert(CalcCRC == *pCheckData);
  53. pCheckData += 1;
  54. //
  55. // CRC-8/DARC
  56. //
  57. CalcCRC = SEGGER_CRC_Calc(pTestData, TestDataLen, 0x00, 0x9C);
  58. _Assert(CalcCRC == *pCheckData);
  59. pCheckData += 1;
  60. //
  61. // CRC-8/MAXIM.
  62. //
  63. CalcCRC = SEGGER_CRC_Calc(pTestData, TestDataLen, 0x00, 0x8C);
  64. _Assert(CalcCRC == *pCheckData);
  65. pCheckData += 1;
  66. //
  67. // CRC-8/AUTOSAR
  68. //
  69. CalcCRC = SEGGER_CRC_Calc_MSB(pTestData, TestDataLen, 0xFF, 0x1D, 8) ^ 0xFF;
  70. _Assert(CalcCRC == *pCheckData);
  71. pCheckData += 1;
  72. //
  73. // CRC-8/BLUETOOTH
  74. //
  75. CalcCRC = SEGGER_CRC_Calc(pTestData, TestDataLen, 0x00, 0xE5);
  76. _Assert(CalcCRC == *pCheckData);

  77. pCheckData += 1;
  78. //
  79. // CRC-16/CCITT:AUG
  80. //
  81. CalcCRC = SEGGER_CRC_Calc_MSB(pTestData, TestDataLen, 0x1D0F, 0x1021, 16);
  82. _Assert(CalcCRC == _LoadU16(pCheckData));
  83. pCheckData += 2;
  84. //
  85. // CRC-16/CCITT:NOAUG
  86. //
  87. CalcCRC = SEGGER_CRC_Calc_MSB(pTestData, TestDataLen, 0xFFFF, 0x1021, 16);
  88. _Assert(CalcCRC == _LoadU16(pCheckData));
  89. pCheckData += 2;
  90. //
  91. // CRC-16/KERMIT
  92. //
  93. CalcCRC = SEGGER_CRC_Calc(pTestData, TestDataLen, 0x0000, 0x8408);
  94. _Assert(CalcCRC == _LoadU16(pCheckData));
  95. pCheckData += 2;
  96. //
  97. // CRC-16/X.25
  98. //
  99. CalcCRC = SEGGER_CRC_Calc(pTestData, TestDataLen, 0xFFFF, 0x8408) ^ 0xFFFF;
  100. _Assert(CalcCRC == _LoadU16(pCheckData));
  101. pCheckData += 2;
  102. //
  103. // CRC-16/XMODEM
  104. //
  105. CalcCRC = SEGGER_CRC_Calc_MSB(pTestData, TestDataLen, 0x0000, 0x1021, 16);
  106. _Assert(CalcCRC == _LoadU16(pCheckData));
  107. pCheckData += 2;
  108. //
  109. // CRC-16/MODBUS
  110. //
  111. CalcCRC = SEGGER_CRC_Calc(pTestData, TestDataLen, 0xFFFF, 0xA001);
  112. _Assert(CalcCRC == _LoadU16(pCheckData));
  113. pCheckData += 2;
  114. //
  115. // CRC-16/USB
  116. //
  117. CalcCRC = SEGGER_CRC_Calc(pTestData, TestDataLen, 0xFFFF, 0xA001) ^ 0xFFFF;
  118. _Assert(CalcCRC == _LoadU16(pCheckData));
  119. pCheckData += 2;
  120. //
  121. // CRC-16/ARC
  122. //
  123. CalcCRC = SEGGER_CRC_Calc(pTestData, TestDataLen, 0x0000, 0xA001);
  124. _Assert(CalcCRC == _LoadU16(pCheckData));
  125. pCheckData += 2;
  126. //
  127. // CRC-16/UMTS
  128. //
  129. CalcCRC = SEGGER_CRC_Calc_MSB(pTestData, TestDataLen, 0x0000, 0x8005, 16);
  130. _Assert(CalcCRC == _LoadU16(pCheckData));
  131. pCheckData += 2;
  132. //
  133. // CRC-16/CDMA2000
  134. //
  135. CalcCRC = SEGGER_CRC_Calc_MSB(pTestData, TestDataLen, 0xFFFF, 0xC867, 16);
  136. _Assert(CalcCRC == _LoadU16(pCheckData));
  137. pCheckData += 2;
  138. //
  139. // CRC-32
  140. //
  141. CalcCRC = SEGGER_CRC_Calc(pTestData, TestDataLen, 0xFFFFFFFF, 0xEDB88320) ^ 0xFFFFFFFF;
  142. _Assert(CalcCRC == _LoadU32(pCheckData));
  143. pCheckData += 4;
  144. //
  145. // CRC-32/BZIP2
  146. //
  147. CalcCRC = SEGGER_CRC_Calc_MSB(pTestData, TestDataLen, 0xFFFFFFFF, 0x04C11DB7, 32) ^ 0xFFFFFFFF;
  148. _Assert(CalcCRC == _LoadU32(pCheckData));
  149. pCheckData += 4;
  150. //
  151. // CRC-32/MPEG2
  152. //

  153. CalcCRC = SEGGER_CRC_Calc_MSB(pTestData, TestDataLen, 0xFFFFFFFF, 0x04C11DB7, 32);
  154. _Assert(CalcCRC == _LoadU32(pCheckData));
  155. pCheckData += 4;
  156. //
  157. // CRC-32/POSIX
  158. //
  159. CalcCRC = SEGGER_CRC_Calc_MSB(pTestData, TestDataLen, 0x00000000, 0x04C11DB7, 32) ^ 0xFFFFFFFF;
  160. _Assert(CalcCRC == _LoadU32(pCheckData));
  161. pCheckData += 4;
  162. //
  163. // CRC-32/XFER
  164. //
  165. CalcCRC = SEGGER_CRC_Calc_MSB(pTestData, TestDataLen, 0x00000000, 0x000000AF, 32);
  166. _Assert(CalcCRC == _LoadU32(pCheckData));
  167. pCheckData += 4;
  168. //
  169. // CRC-32C
  170. //
  171. CalcCRC = SEGGER_CRC_Calc(pTestData, TestDataLen, 0xFFFFFFFF, 0x82F63B78) ^ 0xFFFFFFFF;
  172. _Assert(CalcCRC == _LoadU32(pCheckData));
  173. pCheckData += 4;
  174. //
  175. // CRC-32D
  176. //
  177. CalcCRC = SEGGER_CRC_Calc(pTestData, TestDataLen, 0xFFFFFFFF, 0xD419CC15) ^ 0xFFFFFFFF;
  178. _Assert(CalcCRC == _LoadU32(pCheckData));
  179. pCheckData += 4;
  180. //
  181. // CRC-32Q
  182. //
  183. CalcCRC = SEGGER_CRC_Calc_MSB(pTestData, TestDataLen, 0x00000000, 0x814141AB, 32);
  184. _Assert(CalcCRC == _LoadU32(pCheckData));
  185. pCheckData += 4;
  186. //
  187. // MD5.
  188. //
  189. CRYPTO_MD5_Calc(aHash, CRYPTO_MD5_DIGEST_BYTE_COUNT, pTestData, TestDataLen);
  190. _Assert(memcmp(aHash, pCheckData, CRYPTO_MD5_DIGEST_BYTE_COUNT) == 0);
  191. pCheckData += CRYPTO_MD5_DIGEST_BYTE_COUNT;
  192. //
  193. // RIPEMD-160
  194. //
  195. CRYPTO_RIPEMD160_Calc(aHash, CRYPTO_RIPEMD160_DIGEST_BYTE_COUNT, pTestData, TestDataLen);
  196. _Assert(memcmp(aHash, pCheckData, CRYPTO_RIPEMD160_DIGEST_BYTE_COUNT) == 0);
  197. pCheckData += CRYPTO_RIPEMD160_DIGEST_BYTE_COUNT;
  198. //
  199. // SHA-1
  200. //
  201. CRYPTO_SHA1_Calc(aHash, CRYPTO_SHA1_DIGEST_BYTE_COUNT, pTestData, TestDataLen);
  202. _Assert(memcmp(aHash, pCheckData, CRYPTO_SHA1_DIGEST_BYTE_COUNT) == 0);
  203. pCheckData += CRYPTO_SHA1_DIGEST_BYTE_COUNT;
  204. //
  205. // SHA-224
  206. //
  207. CRYPTO_SHA224_Calc(aHash, CRYPTO_SHA224_DIGEST_BYTE_COUNT, pTestData, TestDataLen);
  208. _Assert(memcmp(aHash, pCheckData, CRYPTO_SHA224_DIGEST_BYTE_COUNT) == 0);
  209. pCheckData += CRYPTO_SHA224_DIGEST_BYTE_COUNT;
  210. //
  211. // SHA-256
  212. //
  213. CRYPTO_SHA256_Calc(aHash, CRYPTO_SHA256_DIGEST_BYTE_COUNT, pTestData, TestDataLen);
  214. _Assert(memcmp(aHash, pCheckData, CRYPTO_SHA256_DIGEST_BYTE_COUNT) == 0);
  215. pCheckData += CRYPTO_SHA256_DIGEST_BYTE_COUNT;
  216. //
  217. // SHA-384
  218. //
  219. CRYPTO_SHA384_Calc(aHash, CRYPTO_SHA384_DIGEST_BYTE_COUNT, pTestData, TestDataLen);
  220. _Assert(memcmp(aHash, pCheckData, CRYPTO_SHA384_DIGEST_BYTE_COUNT) == 0);
  221. pCheckData += CRYPTO_SHA384_DIGEST_BYTE_COUNT;
  222. //
  223. // SHA-512
  224. //
  225. CRYPTO_SHA512_Calc(aHash, CRYPTO_SHA512_DIGEST_BYTE_COUNT, pTestData, TestDataLen);
  226. _Assert(memcmp(aHash, pCheckData, CRYPTO_SHA512_DIGEST_BYTE_COUNT) == 0);
  227. pCheckData += CRYPTO_SHA512_DIGEST_BYTE_COUNT;
  228. //

  229. // SHA-512/224
  230. //
  231. CRYPTO_SHA512_224_Calc(aHash, CRYPTO_SHA512_224_DIGEST_BYTE_COUNT, pTestData, TestDataLen);
  232. _Assert(memcmp(aHash, pCheckData, CRYPTO_SHA512_224_DIGEST_BYTE_COUNT) == 0);
  233. pCheckData += CRYPTO_SHA512_224_DIGEST_BYTE_COUNT;
  234. //
  235. // SHA-512/256
  236. //
  237. CRYPTO_SHA512_256_Calc(aHash, CRYPTO_SHA512_256_DIGEST_BYTE_COUNT, pTestData, TestDataLen);
  238. _Assert(memcmp(aHash, pCheckData, CRYPTO_SHA512_256_DIGEST_BYTE_COUNT) == 0);
  239. pCheckData += CRYPTO_SHA512_256_DIGEST_BYTE_COUNT;
  240. //
  241. // SHA3-224
  242. //
  243. CRYPTO_SHA3_224_Calc(aHash, CRYPTO_SHA3_224_DIGEST_BYTE_COUNT, pTestData, TestDataLen);
  244. _Assert(memcmp(aHash, pCheckData, CRYPTO_SHA3_224_DIGEST_BYTE_COUNT) == 0);
  245. pCheckData += CRYPTO_SHA3_224_DIGEST_BYTE_COUNT;
  246. //
  247. // SHA3-256
  248. //
  249. CRYPTO_SHA3_256_Calc(aHash, CRYPTO_SHA3_256_DIGEST_BYTE_COUNT, pTestData, TestDataLen);
  250. _Assert(memcmp(aHash, pCheckData, CRYPTO_SHA3_256_DIGEST_BYTE_COUNT) == 0);
  251. pCheckData += CRYPTO_SHA3_256_DIGEST_BYTE_COUNT;
  252. //
  253. // SHA3-384
  254. //
  255. CRYPTO_SHA3_384_Calc(aHash, CRYPTO_SHA3_384_DIGEST_BYTE_COUNT, pTestData, TestDataLen);
  256. _Assert(memcmp(aHash, pCheckData, CRYPTO_SHA3_384_DIGEST_BYTE_COUNT) == 0);
  257. pCheckData += CRYPTO_SHA3_384_DIGEST_BYTE_COUNT;
  258. //
  259. // SHA3-512
  260. //
  261. CRYPTO_SHA3_512_Calc(aHash, CRYPTO_SHA3_512_DIGEST_BYTE_COUNT, pTestData, TestDataLen);
  262. _Assert(memcmp(aHash, pCheckData, CRYPTO_SHA3_512_DIGEST_BYTE_COUNT) == 0);
  263. pCheckData += CRYPTO_SHA3_512_DIGEST_BYTE_COUNT;
  264. //
  265. // SM3
  266. //
  267. CRYPTO_SM3_Calc(aHash, CRYPTO_SM3_DIGEST_BYTE_COUNT, pTestData, TestDataLen);
  268. _Assert(memcmp(aHash, pCheckData, CRYPTO_SM3_DIGEST_BYTE_COUNT) == 0);
  269. pCheckData += CRYPTO_SM3_DIGEST_BYTE_COUNT;
  270. //
  271. printf("All integrity checks passed!\n");
  272. asm("bkpt");
  273. }

复制代码


回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106738
QQ
 楼主| 发表于 2020-8-18 02:12:23 | 显示全部楼层
1.png

2.png

3.png
回复

使用道具 举报

56

主题

904

回帖

1072

积分

至尊会员

积分
1072
发表于 2020-8-18 08:12:30 | 显示全部楼层
不知道能不能库弄出来 mdk之类能用。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106738
QQ
 楼主| 发表于 2020-8-18 10:24:05 | 显示全部楼层
roguebear 发表于 2020-8-18 08:12
不知道能不能库弄出来 mdk之类能用。

貌似不太好整。
回复

使用道具 举报

2

主题

21

回帖

27

积分

新手上路

积分
27
发表于 2021-7-24 10:32:09 | 显示全部楼层
库在哪里    。。。。。。。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106738
QQ
 楼主| 发表于 2021-7-24 11:11:46 | 显示全部楼层
Ttf18610977782 发表于 2021-7-24 10:32
库在哪里    。。。。。。。

得下载Embedded Studio使用。
回复

使用道具 举报

4

主题

117

回帖

129

积分

初级会员

积分
129
发表于 2021-7-24 15:18:08 | 显示全部楼层
大部分新STM32都支持可以配置的硬件CRC计算(F1F4不行G0G4H7L5应该可以)。我使用过G4硬件计算CRC16 MODBUS
回复

使用道具 举报

2

主题

21

回帖

27

积分

新手上路

积分
27
发表于 2021-7-24 18:16:54 | 显示全部楼层
eric2013 发表于 2021-7-24 11:11
得下载Embedded Studio使用。

已经在用SES     还忘硬汉大佬出点  SES专题教程
回复

使用道具 举报

73

主题

1193

回帖

1412

积分

至尊会员

积分
1412
发表于 2021-7-24 20:02:13 | 显示全部楼层
Ttf18610977782 发表于 2021-7-24 18:16
已经在用SES     还忘硬汉大佬出点  SES专题教程

确实,教程是比较缺少
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106738
QQ
 楼主| 发表于 2021-7-25 09:17:52 | 显示全部楼层
Ttf18610977782 发表于 2021-7-24 18:16
已经在用SES     还忘硬汉大佬出点  SES专题教程

好,后面有精力了做下。
回复

使用道具 举报

2

主题

21

回帖

27

积分

新手上路

积分
27
发表于 2021-7-25 13:44:41 | 显示全部楼层
wdliming 发表于 2021-7-24 20:02
确实,教程是比较缺少

你可分享点
回复

使用道具 举报

2

主题

21

回帖

27

积分

新手上路

积分
27
发表于 2021-8-4 13:17:27 | 显示全部楼层
这个API需要购买吧
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-5-3 09:22 , Processed in 0.289005 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表