edhoc 1.0.5 → 1.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (313) hide show
  1. package/README.md +170 -0
  2. package/binding.gyp +13 -11
  3. package/dist/crypto.d.ts +9 -2
  4. package/dist/crypto.d.ts.map +1 -1
  5. package/dist/crypto.js +112 -84
  6. package/dist/edhoc.d.ts +31 -9
  7. package/dist/edhoc.d.ts.map +1 -1
  8. package/dist/index.d.ts +1 -1
  9. package/dist/index.d.ts.map +1 -1
  10. package/dist/index.js +1 -1
  11. package/dist/x509credentials.d.ts +20 -0
  12. package/dist/x509credentials.d.ts.map +1 -0
  13. package/dist/x509credentials.js +140 -0
  14. package/external/libedhoc/backends/cbor/include/backend_cbor_bstr_type_decode.h +1 -1
  15. package/external/libedhoc/backends/cbor/include/backend_cbor_bstr_type_encode.h +1 -1
  16. package/external/libedhoc/backends/cbor/include/backend_cbor_bstr_type_types.h +1 -1
  17. package/external/libedhoc/backends/cbor/include/backend_cbor_ead_decode.h +2 -2
  18. package/external/libedhoc/backends/cbor/include/backend_cbor_ead_encode.h +2 -2
  19. package/external/libedhoc/backends/cbor/include/backend_cbor_edhoc_types.h +48 -43
  20. package/external/libedhoc/backends/cbor/include/backend_cbor_enc_structure_decode.h +1 -1
  21. package/external/libedhoc/backends/cbor/include/backend_cbor_enc_structure_encode.h +1 -1
  22. package/external/libedhoc/backends/cbor/include/backend_cbor_enc_structure_types.h +3 -3
  23. package/external/libedhoc/backends/cbor/include/backend_cbor_id_cred_x_decode.h +1 -1
  24. package/external/libedhoc/backends/cbor/include/backend_cbor_id_cred_x_encode.h +1 -1
  25. package/external/libedhoc/backends/cbor/include/backend_cbor_info_decode.h +1 -1
  26. package/external/libedhoc/backends/cbor/include/backend_cbor_info_encode.h +1 -1
  27. package/external/libedhoc/backends/cbor/include/backend_cbor_int_type_decode.h +1 -1
  28. package/external/libedhoc/backends/cbor/include/backend_cbor_int_type_encode.h +1 -1
  29. package/external/libedhoc/backends/cbor/include/backend_cbor_int_type_types.h +1 -1
  30. package/external/libedhoc/backends/cbor/include/backend_cbor_message_1_decode.h +1 -1
  31. package/external/libedhoc/backends/cbor/include/backend_cbor_message_1_encode.h +1 -1
  32. package/external/libedhoc/backends/cbor/include/backend_cbor_message_2_decode.h +1 -1
  33. package/external/libedhoc/backends/cbor/include/backend_cbor_message_2_encode.h +1 -1
  34. package/external/libedhoc/backends/cbor/include/backend_cbor_message_3_decode.h +1 -1
  35. package/external/libedhoc/backends/cbor/include/backend_cbor_message_3_encode.h +1 -1
  36. package/external/libedhoc/backends/cbor/include/backend_cbor_message_4_decode.h +1 -1
  37. package/external/libedhoc/backends/cbor/include/backend_cbor_message_4_encode.h +1 -1
  38. package/external/libedhoc/backends/cbor/include/backend_cbor_message_error_decode.h +1 -1
  39. package/external/libedhoc/backends/cbor/include/backend_cbor_message_error_encode.h +1 -1
  40. package/external/libedhoc/backends/cbor/include/backend_cbor_plaintext_2_decode.h +1 -1
  41. package/external/libedhoc/backends/cbor/include/backend_cbor_plaintext_2_encode.h +1 -1
  42. package/external/libedhoc/backends/cbor/include/backend_cbor_plaintext_3_decode.h +1 -1
  43. package/external/libedhoc/backends/cbor/include/backend_cbor_plaintext_3_encode.h +1 -1
  44. package/external/libedhoc/backends/cbor/include/backend_cbor_plaintext_4_decode.h +3 -3
  45. package/external/libedhoc/backends/cbor/include/backend_cbor_plaintext_4_encode.h +3 -3
  46. package/external/libedhoc/backends/cbor/include/backend_cbor_sig_structure_decode.h +1 -1
  47. package/external/libedhoc/backends/cbor/include/backend_cbor_sig_structure_encode.h +1 -1
  48. package/external/libedhoc/backends/cbor/include/backend_cbor_sig_structure_types.h +4 -4
  49. package/external/libedhoc/backends/cbor/include/backend_cbor_x509_types.h +93 -83
  50. package/external/libedhoc/backends/cbor/src/backend_cbor_bstr_type_decode.c +11 -20
  51. package/external/libedhoc/backends/cbor/src/backend_cbor_bstr_type_encode.c +11 -20
  52. package/external/libedhoc/backends/cbor/src/backend_cbor_ead_decode.c +27 -32
  53. package/external/libedhoc/backends/cbor/src/backend_cbor_ead_encode.c +27 -32
  54. package/external/libedhoc/backends/cbor/src/backend_cbor_enc_structure_decode.c +14 -23
  55. package/external/libedhoc/backends/cbor/src/backend_cbor_enc_structure_encode.c +14 -23
  56. package/external/libedhoc/backends/cbor/src/backend_cbor_id_cred_x_decode.c +63 -52
  57. package/external/libedhoc/backends/cbor/src/backend_cbor_id_cred_x_encode.c +62 -51
  58. package/external/libedhoc/backends/cbor/src/backend_cbor_info_decode.c +14 -23
  59. package/external/libedhoc/backends/cbor/src/backend_cbor_info_encode.c +14 -23
  60. package/external/libedhoc/backends/cbor/src/backend_cbor_int_type_decode.c +11 -20
  61. package/external/libedhoc/backends/cbor/src/backend_cbor_int_type_encode.c +11 -20
  62. package/external/libedhoc/backends/cbor/src/backend_cbor_message_1_decode.c +54 -51
  63. package/external/libedhoc/backends/cbor/src/backend_cbor_message_1_encode.c +54 -51
  64. package/external/libedhoc/backends/cbor/src/backend_cbor_message_2_decode.c +11 -20
  65. package/external/libedhoc/backends/cbor/src/backend_cbor_message_2_encode.c +11 -20
  66. package/external/libedhoc/backends/cbor/src/backend_cbor_message_3_decode.c +11 -20
  67. package/external/libedhoc/backends/cbor/src/backend_cbor_message_3_encode.c +11 -20
  68. package/external/libedhoc/backends/cbor/src/backend_cbor_message_4_decode.c +11 -20
  69. package/external/libedhoc/backends/cbor/src/backend_cbor_message_4_encode.c +11 -20
  70. package/external/libedhoc/backends/cbor/src/backend_cbor_message_error_decode.c +36 -37
  71. package/external/libedhoc/backends/cbor/src/backend_cbor_message_error_encode.c +36 -37
  72. package/external/libedhoc/backends/cbor/src/backend_cbor_plaintext_2_decode.c +103 -80
  73. package/external/libedhoc/backends/cbor/src/backend_cbor_plaintext_2_encode.c +102 -79
  74. package/external/libedhoc/backends/cbor/src/backend_cbor_plaintext_3_decode.c +99 -76
  75. package/external/libedhoc/backends/cbor/src/backend_cbor_plaintext_3_encode.c +98 -75
  76. package/external/libedhoc/backends/cbor/src/backend_cbor_plaintext_4_decode.c +40 -41
  77. package/external/libedhoc/backends/cbor/src/backend_cbor_plaintext_4_encode.c +40 -41
  78. package/external/libedhoc/backends/cbor/src/backend_cbor_sig_structure_decode.c +15 -24
  79. package/external/libedhoc/backends/cbor/src/backend_cbor_sig_structure_encode.c +15 -24
  80. package/external/libedhoc/externals/Unity/examples/example_1/src/ProductionCode.c +31 -0
  81. package/external/libedhoc/externals/Unity/examples/example_1/src/ProductionCode.h +10 -0
  82. package/external/libedhoc/externals/Unity/examples/example_1/src/ProductionCode2.c +18 -0
  83. package/external/libedhoc/externals/Unity/examples/example_1/src/ProductionCode2.h +9 -0
  84. package/external/libedhoc/externals/Unity/examples/example_1/test/TestProductionCode.c +69 -0
  85. package/external/libedhoc/externals/Unity/examples/example_1/test/TestProductionCode2.c +38 -0
  86. package/external/libedhoc/externals/Unity/examples/example_1/test/test_runners/TestProductionCode2_Runner.c +53 -0
  87. package/external/libedhoc/externals/Unity/examples/example_1/test/test_runners/TestProductionCode_Runner.c +57 -0
  88. package/external/libedhoc/externals/Unity/examples/example_2/src/ProductionCode.c +31 -0
  89. package/external/libedhoc/externals/Unity/examples/example_2/src/ProductionCode.h +10 -0
  90. package/external/libedhoc/externals/Unity/examples/example_2/src/ProductionCode2.c +18 -0
  91. package/external/libedhoc/externals/Unity/examples/example_2/src/ProductionCode2.h +9 -0
  92. package/external/libedhoc/externals/Unity/examples/example_2/test/TestProductionCode.c +71 -0
  93. package/external/libedhoc/externals/Unity/examples/example_2/test/TestProductionCode2.c +40 -0
  94. package/external/libedhoc/externals/Unity/examples/example_2/test/test_runners/TestProductionCode2_Runner.c +16 -0
  95. package/external/libedhoc/externals/Unity/examples/example_2/test/test_runners/TestProductionCode_Runner.c +18 -0
  96. package/external/libedhoc/externals/Unity/examples/example_2/test/test_runners/all_tests.c +19 -0
  97. package/external/libedhoc/externals/Unity/examples/example_3/helper/UnityHelper.c +17 -0
  98. package/external/libedhoc/externals/Unity/examples/example_3/helper/UnityHelper.h +19 -0
  99. package/external/libedhoc/externals/Unity/examples/example_3/src/ProductionCode.c +31 -0
  100. package/external/libedhoc/externals/Unity/examples/example_3/src/ProductionCode.h +10 -0
  101. package/external/libedhoc/externals/Unity/examples/example_3/src/ProductionCode2.c +18 -0
  102. package/external/libedhoc/externals/Unity/examples/example_3/src/ProductionCode2.h +9 -0
  103. package/external/libedhoc/externals/Unity/examples/example_3/test/TestProductionCode.c +69 -0
  104. package/external/libedhoc/externals/Unity/examples/example_3/test/TestProductionCode2.c +38 -0
  105. package/external/libedhoc/externals/Unity/examples/example_4/src/ProductionCode.c +31 -0
  106. package/external/libedhoc/externals/Unity/examples/example_4/src/ProductionCode.h +10 -0
  107. package/external/libedhoc/externals/Unity/examples/example_4/src/ProductionCode2.c +18 -0
  108. package/external/libedhoc/externals/Unity/examples/example_4/src/ProductionCode2.h +9 -0
  109. package/external/libedhoc/externals/Unity/examples/example_4/test/TestProductionCode.c +70 -0
  110. package/external/libedhoc/externals/Unity/examples/example_4/test/TestProductionCode2.c +42 -0
  111. package/external/libedhoc/externals/Unity/examples/example_4/test/test_runners/TestProductionCode2_Runner.c +53 -0
  112. package/external/libedhoc/externals/Unity/examples/example_4/test/test_runners/TestProductionCode_Runner.c +57 -0
  113. package/external/libedhoc/externals/Unity/examples/unity_config.h +251 -0
  114. package/external/libedhoc/externals/Unity/extras/bdd/src/unity_bdd.h +44 -0
  115. package/external/libedhoc/externals/Unity/extras/bdd/test/test_bdd.c +129 -0
  116. package/external/libedhoc/externals/Unity/extras/fixture/src/unity_fixture.c +310 -0
  117. package/external/libedhoc/externals/Unity/extras/fixture/src/unity_fixture.h +95 -0
  118. package/external/libedhoc/externals/Unity/extras/fixture/src/unity_fixture_internals.h +51 -0
  119. package/external/libedhoc/externals/Unity/extras/fixture/test/main/AllTests.c +20 -0
  120. package/external/libedhoc/externals/Unity/extras/fixture/test/template_fixture_tests.c +40 -0
  121. package/external/libedhoc/externals/Unity/extras/fixture/test/unity_fixture_Test.c +246 -0
  122. package/external/libedhoc/externals/Unity/extras/fixture/test/unity_fixture_TestRunner.c +33 -0
  123. package/external/libedhoc/externals/Unity/extras/memory/src/unity_memory.c +203 -0
  124. package/external/libedhoc/externals/Unity/extras/memory/src/unity_memory.h +61 -0
  125. package/external/libedhoc/externals/Unity/extras/memory/test/unity_memory_Test.c +326 -0
  126. package/external/libedhoc/externals/Unity/extras/memory/test/unity_memory_TestRunner.c +50 -0
  127. package/external/libedhoc/externals/Unity/extras/memory/test/unity_output_Spy.c +57 -0
  128. package/external/libedhoc/externals/Unity/extras/memory/test/unity_output_Spy.h +17 -0
  129. package/external/libedhoc/externals/Unity/src/unity.c +2501 -0
  130. package/external/libedhoc/externals/Unity/src/unity.h +698 -0
  131. package/external/libedhoc/externals/Unity/src/unity_internals.h +1183 -0
  132. package/external/libedhoc/externals/Unity/test/expectdata/testsample_cmd.c +61 -0
  133. package/external/libedhoc/externals/Unity/test/expectdata/testsample_def.c +57 -0
  134. package/external/libedhoc/externals/Unity/test/expectdata/testsample_head1.c +55 -0
  135. package/external/libedhoc/externals/Unity/test/expectdata/testsample_head1.h +15 -0
  136. package/external/libedhoc/externals/Unity/test/expectdata/testsample_mock_cmd.c +80 -0
  137. package/external/libedhoc/externals/Unity/test/expectdata/testsample_mock_def.c +76 -0
  138. package/external/libedhoc/externals/Unity/test/expectdata/testsample_mock_head1.c +75 -0
  139. package/external/libedhoc/externals/Unity/test/expectdata/testsample_mock_head1.h +13 -0
  140. package/external/libedhoc/externals/Unity/test/expectdata/testsample_mock_new1.c +89 -0
  141. package/external/libedhoc/externals/Unity/test/expectdata/testsample_mock_new2.c +89 -0
  142. package/external/libedhoc/externals/Unity/test/expectdata/testsample_mock_param.c +77 -0
  143. package/external/libedhoc/externals/Unity/test/expectdata/testsample_mock_run1.c +89 -0
  144. package/external/libedhoc/externals/Unity/test/expectdata/testsample_mock_run2.c +89 -0
  145. package/external/libedhoc/externals/Unity/test/expectdata/testsample_mock_yaml.c +90 -0
  146. package/external/libedhoc/externals/Unity/test/expectdata/testsample_new1.c +67 -0
  147. package/external/libedhoc/externals/Unity/test/expectdata/testsample_new2.c +70 -0
  148. package/external/libedhoc/externals/Unity/test/expectdata/testsample_param.c +58 -0
  149. package/external/libedhoc/externals/Unity/test/expectdata/testsample_run1.c +67 -0
  150. package/external/libedhoc/externals/Unity/test/expectdata/testsample_run2.c +70 -0
  151. package/external/libedhoc/externals/Unity/test/expectdata/testsample_yaml.c +71 -0
  152. package/external/libedhoc/externals/Unity/test/testdata/CException.h +18 -0
  153. package/external/libedhoc/externals/Unity/test/testdata/Defs.h +16 -0
  154. package/external/libedhoc/externals/Unity/test/testdata/cmock.h +21 -0
  155. package/external/libedhoc/externals/Unity/test/testdata/mockMock.h +20 -0
  156. package/external/libedhoc/externals/Unity/test/testdata/testRunnerGenerator.c +204 -0
  157. package/external/libedhoc/externals/Unity/test/testdata/testRunnerGeneratorSmall.c +73 -0
  158. package/external/libedhoc/externals/Unity/test/testdata/testRunnerGeneratorWithMocks.c +200 -0
  159. package/external/libedhoc/externals/Unity/test/tests/self_assessment_utils.h +151 -0
  160. package/external/libedhoc/externals/Unity/test/tests/test_unity_arrays.c +2941 -0
  161. package/external/libedhoc/externals/Unity/test/tests/test_unity_core.c +375 -0
  162. package/external/libedhoc/externals/Unity/test/tests/test_unity_doubles.c +1285 -0
  163. package/external/libedhoc/externals/Unity/test/tests/test_unity_floats.c +1395 -0
  164. package/external/libedhoc/externals/Unity/test/tests/test_unity_integers.c +2863 -0
  165. package/external/libedhoc/externals/Unity/test/tests/test_unity_integers_64.c +783 -0
  166. package/external/libedhoc/externals/Unity/test/tests/test_unity_memory.c +82 -0
  167. package/external/libedhoc/externals/Unity/test/tests/test_unity_parameterized.c +309 -0
  168. package/external/libedhoc/externals/Unity/test/tests/test_unity_parameterizedDemo.c +28 -0
  169. package/external/libedhoc/externals/Unity/test/tests/test_unity_strings.c +330 -0
  170. package/external/libedhoc/externals/Unity/test/tests/types_for_test.h +21 -0
  171. package/external/libedhoc/externals/zcbor/include/zcbor_common.h +147 -60
  172. package/external/libedhoc/externals/zcbor/include/zcbor_decode.h +291 -202
  173. package/external/libedhoc/externals/zcbor/include/zcbor_encode.h +100 -156
  174. package/external/libedhoc/externals/zcbor/include/zcbor_print.h +165 -0
  175. package/external/libedhoc/externals/zcbor/samples/hello_world/src/main.c +1 -1
  176. package/external/libedhoc/externals/zcbor/samples/pet/include/pet_decode.h +1 -1
  177. package/external/libedhoc/externals/zcbor/samples/pet/include/pet_encode.h +1 -1
  178. package/external/libedhoc/externals/zcbor/samples/pet/include/pet_types.h +4 -4
  179. package/external/libedhoc/externals/zcbor/samples/pet/src/main.c +4 -4
  180. package/external/libedhoc/externals/zcbor/samples/pet/src/pet_decode.c +15 -24
  181. package/external/libedhoc/externals/zcbor/samples/pet/src/pet_encode.c +14 -23
  182. package/external/libedhoc/externals/zcbor/src/zcbor_common.c +202 -29
  183. package/external/libedhoc/externals/zcbor/src/zcbor_decode.c +633 -173
  184. package/external/libedhoc/externals/zcbor/src/zcbor_encode.c +71 -184
  185. package/external/libedhoc/externals/zcbor/tests/decode/test1_suit_old_formats/src/main.c +152 -153
  186. package/external/libedhoc/externals/zcbor/tests/decode/test2_suit/src/main.c +64 -64
  187. package/external/libedhoc/externals/zcbor/tests/decode/test3_simple/src/main.c +15 -16
  188. package/external/libedhoc/externals/zcbor/tests/decode/test5_corner_cases/src/main.c +228 -84
  189. package/external/libedhoc/externals/zcbor/tests/decode/test7_suit9_simple/src/main.c +9 -9
  190. package/external/libedhoc/externals/zcbor/tests/decode/test8_suit12/src/main.c +0 -1
  191. package/external/libedhoc/externals/zcbor/tests/decode/test9_manifest14/src/main.c +172 -173
  192. package/external/libedhoc/externals/zcbor/tests/encode/test1_suit/src/main.c +73 -73
  193. package/external/libedhoc/externals/zcbor/tests/encode/test2_simple/src/main.c +1 -2
  194. package/external/libedhoc/externals/zcbor/tests/encode/test3_corner_cases/src/main.c +83 -56
  195. package/external/libedhoc/externals/zcbor/tests/encode/test4_senml/src/main.c +15 -16
  196. package/external/libedhoc/externals/zcbor/tests/fuzz/fuzz_everything.c +12 -0
  197. package/external/libedhoc/externals/zcbor/tests/fuzz/fuzz_manifest12.c +69 -69
  198. package/external/libedhoc/externals/zcbor/tests/unit/test1_unit_tests/src/main.c +448 -55
  199. package/external/libedhoc/externals/zcbor/tests/unit/test3_float16/src/main.c +49 -48
  200. package/external/libedhoc/include/edhoc.h +348 -54
  201. package/external/libedhoc/include/edhoc_common.h +289 -0
  202. package/external/libedhoc/include/edhoc_context.h +60 -35
  203. package/external/libedhoc/include/edhoc_credentials.h +55 -7
  204. package/external/libedhoc/include/edhoc_crypto.h +10 -10
  205. package/external/libedhoc/include/edhoc_ead.h +13 -10
  206. package/external/libedhoc/include/edhoc_macros.h +20 -11
  207. package/external/libedhoc/include/edhoc_values.h +2 -2
  208. package/external/libedhoc/library/edhoc.c +70 -36
  209. package/external/libedhoc/library/edhoc_common.c +1314 -0
  210. package/external/libedhoc/library/edhoc_exporter.c +45 -46
  211. package/external/libedhoc/library/edhoc_message_1.c +107 -72
  212. package/external/libedhoc/library/edhoc_message_2.c +396 -1693
  213. package/external/libedhoc/library/edhoc_message_3.c +465 -1656
  214. package/external/libedhoc/library/edhoc_message_4.c +93 -91
  215. package/external/libedhoc/library/edhoc_message_error.c +41 -41
  216. package/external/libedhoc/tests/include/{cipher_suites/cipher_suite_0.h → cipher_suite_0.h} +131 -134
  217. package/external/libedhoc/tests/include/{cipher_suites/cipher_suite_2.h → cipher_suite_2.h} +139 -140
  218. package/external/libedhoc/tests/include/{edhoc_trace_1/test_vector_1.h → test_vector_rfc9529_chapter_2.h} +786 -738
  219. package/external/libedhoc/tests/include/{edhoc_trace_2/test_vector_2.h → test_vector_rfc9529_chapter_3.h} +14 -10
  220. package/external/libedhoc/tests/include/{x509_chain_cs_0/test_vector_x5chain_cs_0.h → test_vector_x5chain_sign_keys_suite_0.h} +137 -140
  221. package/external/libedhoc/tests/include/{x509_chain_cs_2/test_vector_x5chain_cs_2.h → test_vector_x5chain_sign_keys_suite_2.h} +7 -8
  222. package/external/libedhoc/tests/include/{x509_chain_cs_2_static_dh/test_vector_x5chain_cs_2_static_dh.h → test_vector_x5chain_static_dh_keys_suite_2.h} +7 -8
  223. package/external/libedhoc/tests/include/{x509_hash_cs_2/test_vector_x5t_cs_2.h → test_vector_x5t_sign_keys_suite_2.h} +6 -7
  224. package/external/libedhoc/tests/src/{cipher_suites/cipher_suite_0.c → cipher_suite_0.c} +445 -447
  225. package/external/libedhoc/tests/src/{cipher_suites/cipher_suite_2.c → cipher_suite_2.c} +600 -600
  226. package/external/libedhoc/tests/src/module_test_api.c +430 -0
  227. package/external/libedhoc/tests/src/module_test_cipher_suite_0.c +395 -0
  228. package/external/libedhoc/tests/src/module_test_cipher_suite_2.c +392 -0
  229. package/external/libedhoc/tests/src/{error_message/test_edhoc_error_message.c → module_test_error_message.c} +94 -69
  230. package/external/libedhoc/tests/src/module_test_main.c +49 -0
  231. package/external/libedhoc/tests/src/{cipher_suite_negotiation/test_edhoc_cipher_suite_negotiation.c → module_test_rfc9528_suites_negotiation.c} +224 -227
  232. package/external/libedhoc/tests/src/module_test_rfc9529_chapter_2.c +2681 -0
  233. package/external/libedhoc/tests/src/module_test_rfc9529_chapter_3.c +1635 -0
  234. package/external/libedhoc/tests/src/module_test_x5chain_sign_keys_suite_0.c +1135 -0
  235. package/external/libedhoc/tests/src/module_test_x5chain_sign_keys_suite_2.c +1249 -0
  236. package/external/libedhoc/tests/src/module_test_x5chain_static_dh_keys_suite_2.c +798 -0
  237. package/external/libedhoc/tests/src/module_test_x5t_sign_keys_suite_2.c +956 -0
  238. package/include/EdhocComposeAsyncWorker.h +8 -6
  239. package/include/EdhocCredentialManager.h +16 -11
  240. package/include/EdhocCryptoManager.h +28 -21
  241. package/include/EdhocEadManager.h +3 -6
  242. package/include/{EdhocExportAsyncWorker.h → EdhocExportOscoreAsyncWorker.h} +20 -17
  243. package/include/EdhocKeyExporterAsyncWorker.h +76 -0
  244. package/include/EdhocKeyUpdateAsyncWorker.h +72 -0
  245. package/include/EdhocProcessAsyncWorker.h +14 -10
  246. package/include/LibEDHOC.h +44 -20
  247. package/include/UserContext.h +7 -9
  248. package/include/Utils.h +31 -27
  249. package/package.json +14 -3
  250. package/prebuilds/android-arm/edhoc.armv7.node +0 -0
  251. package/prebuilds/android-arm64/edhoc.armv8.node +0 -0
  252. package/prebuilds/darwin-arm64/edhoc.node +0 -0
  253. package/prebuilds/darwin-x64/edhoc.node +0 -0
  254. package/prebuilds/linux-arm/edhoc.armv6.node +0 -0
  255. package/prebuilds/linux-arm/edhoc.armv7.node +0 -0
  256. package/prebuilds/linux-arm64/edhoc.armv8.node +0 -0
  257. package/prebuilds/linux-x64/edhoc.glibc.node +0 -0
  258. package/prebuilds/linux-x64/edhoc.musl.node +0 -0
  259. package/prebuilds/win32-ia32/edhoc.node +0 -0
  260. package/prebuilds/win32-x64/edhoc.node +0 -0
  261. package/src/EdhocComposeAsyncWorker.cpp +18 -35
  262. package/src/EdhocCredentialManager.cpp +160 -187
  263. package/src/EdhocCryptoManager.cpp +386 -586
  264. package/src/EdhocEadManager.cpp +10 -18
  265. package/src/EdhocExportOscoreAsyncWorker.cpp +77 -0
  266. package/src/EdhocKeyExporterAsyncWorker.cpp +49 -0
  267. package/src/EdhocKeyUpdateAsyncWorker.cpp +41 -0
  268. package/src/EdhocProcessAsyncWorker.cpp +72 -19
  269. package/src/LibEDHOC.cpp +213 -174
  270. package/src/Suites.cpp +39 -72
  271. package/src/Utils.cpp +32 -56
  272. package/test/basic.test.ts +64 -0
  273. package/test/vectors.test.ts +111 -0
  274. package/dist/credentials.d.ts +0 -16
  275. package/dist/credentials.d.ts.map +0 -1
  276. package/dist/credentials.js +0 -84
  277. package/external/libedhoc/externals/zcbor/include/zcbor_debug.h +0 -69
  278. package/external/libedhoc/tests/include/cipher_suite_negotiation/test_edhoc_cipher_suite_negotiation.h +0 -37
  279. package/external/libedhoc/tests/include/cipher_suites/test_cipher_suite_0.h +0 -48
  280. package/external/libedhoc/tests/include/cipher_suites/test_cipher_suite_2.h +0 -48
  281. package/external/libedhoc/tests/include/edhoc_trace_1/authentication_credentials_1.h +0 -60
  282. package/external/libedhoc/tests/include/edhoc_trace_1/test_edhoc_handshake_1.h +0 -208
  283. package/external/libedhoc/tests/include/edhoc_trace_1/test_edhoc_handshake_ead_1.h +0 -59
  284. package/external/libedhoc/tests/include/edhoc_trace_2/authentication_credentials_2.h +0 -60
  285. package/external/libedhoc/tests/include/edhoc_trace_2/test_edhoc_handshake_2.h +0 -199
  286. package/external/libedhoc/tests/include/error_message/test_edhoc_error_message.h +0 -48
  287. package/external/libedhoc/tests/include/x509_chain_cs_0/authentication_credentials_x5chain_cs_0.h +0 -92
  288. package/external/libedhoc/tests/include/x509_chain_cs_0/test_edhoc_handshake_x5chain_cs_0.h +0 -96
  289. package/external/libedhoc/tests/include/x509_chain_cs_2/authentication_credentials_x5chain_cs_2.h +0 -58
  290. package/external/libedhoc/tests/include/x509_chain_cs_2/test_edhoc_handshake_x5chain_cs_2.h +0 -56
  291. package/external/libedhoc/tests/include/x509_chain_cs_2/test_edhoc_handshake_x5chain_cs_2_ead.h +0 -57
  292. package/external/libedhoc/tests/include/x509_chain_cs_2_static_dh/authentication_credentials_x5chain_cs_2_static_dh.h +0 -59
  293. package/external/libedhoc/tests/include/x509_chain_cs_2_static_dh/test_edhoc_handshake_x5chain_cs_2_static_dh_ead.h +0 -57
  294. package/external/libedhoc/tests/include/x509_hash_cs_2/authentication_credentials_x5t_cs_2.h +0 -60
  295. package/external/libedhoc/tests/include/x509_hash_cs_2/test_edhoc_handshake_x5t_cs_2_ead.h +0 -57
  296. package/external/libedhoc/tests/src/cipher_suites/test_cipher_suite_0.c +0 -475
  297. package/external/libedhoc/tests/src/cipher_suites/test_cipher_suite_2.c +0 -473
  298. package/external/libedhoc/tests/src/edhoc_trace_1/authentication_credentials_1.c +0 -252
  299. package/external/libedhoc/tests/src/edhoc_trace_1/test_edhoc_handshake_1.c +0 -1829
  300. package/external/libedhoc/tests/src/edhoc_trace_1/test_edhoc_handshake_ead_1.c +0 -1247
  301. package/external/libedhoc/tests/src/edhoc_trace_2/authentication_credentials_2.c +0 -170
  302. package/external/libedhoc/tests/src/edhoc_trace_2/test_edhoc_handshake_2.c +0 -1783
  303. package/external/libedhoc/tests/src/tests.c +0 -228
  304. package/external/libedhoc/tests/src/x509_chain_cs_0/authentication_credentials_x5chain_cs_0.c +0 -332
  305. package/external/libedhoc/tests/src/x509_chain_cs_0/test_edhoc_handshake_x5chain_cs_0.c +0 -936
  306. package/external/libedhoc/tests/src/x509_chain_cs_2/authentication_credentials_x5chain_cs_2.c +0 -166
  307. package/external/libedhoc/tests/src/x509_chain_cs_2/test_edhoc_handshake_x5chain_cs_2.c +0 -587
  308. package/external/libedhoc/tests/src/x509_chain_cs_2/test_edhoc_handshake_x5chain_cs_2_ead.c +0 -917
  309. package/external/libedhoc/tests/src/x509_chain_cs_2_static_dh/authentication_credentials_x5chain_cs_2_static_dh.c +0 -186
  310. package/external/libedhoc/tests/src/x509_chain_cs_2_static_dh/test_edhoc_handshake_x5chain_cs_2_static_dh_ead.c +0 -743
  311. package/external/libedhoc/tests/src/x509_hash_cs_2/authentication_credentials_x5t_cs_2.c +0 -261
  312. package/external/libedhoc/tests/src/x509_hash_cs_2/test_edhoc_handshake_x5t_cs_2_ead.c +0 -854
  313. package/src/EdhocExportAsyncWorker.cpp +0 -82
@@ -0,0 +1,2681 @@
1
+ /**
2
+ * \file module_test_rfc9529_chapter_2.c
3
+ * \author Kamil Kielbasa
4
+ * \brief Module tests according to RFC 9529, chapter 2.
5
+ * \version 0.6
6
+ * \date 2024-08-05
7
+ *
8
+ * \copyright Copyright (c) 2024
9
+ *
10
+ */
11
+
12
+ /* Include files ----------------------------------------------------------- */
13
+
14
+ /* Test vector header: */
15
+ #include "test_vector_rfc9529_chapter_2.h"
16
+
17
+ /* Cipher suite 0 header: */
18
+ #include "cipher_suite_0.h"
19
+
20
+ /* Standard library headers: */
21
+ #include <stdio.h>
22
+ #include <stdint.h>
23
+ #include <stddef.h>
24
+ #include <string.h>
25
+ #include <stdbool.h>
26
+
27
+ /* EDHOC header: */
28
+ #define EDHOC_ALLOW_PRIVATE_ACCESS
29
+ #include <edhoc.h>
30
+
31
+ /* PSA crypto header: */
32
+ #include <psa/crypto.h>
33
+
34
+ /* Unity headers: */
35
+ #include <unity.h>
36
+ #include <unity_fixture.h>
37
+
38
+ /* Module defines ---------------------------------------------------------- */
39
+
40
+ #define COSE_ALG_SHA_256_64 (-15)
41
+ #define CBOR_ENC_COSE_ALG_SHA_256_64 (0x2e)
42
+
43
+ #define EAD_TOKEN_BUFFER_LEN (300)
44
+ #define MAX_NR_OF_EAD_TOKENS (3)
45
+
46
+ /* Module types and type definitiones -------------------------------------- */
47
+
48
+ struct ead_token_buf {
49
+ int32_t label;
50
+ uint8_t value[EAD_TOKEN_BUFFER_LEN];
51
+ size_t value_len;
52
+ };
53
+
54
+ struct ead_context {
55
+ enum edhoc_message msg;
56
+ size_t recv_tokens;
57
+ struct ead_token_buf token[MAX_NR_OF_EAD_TOKENS];
58
+ };
59
+
60
+ /* Module interface variables and constants -------------------------------- */
61
+ /* Static function declarations -------------------------------------------- */
62
+
63
+ /**
64
+ * \brief Mocked EDHOC crypto function ECDH make key pair for initiator.
65
+ */
66
+ static int cipher_suite_0_make_key_pair_init(
67
+ void *user_context, const void *key_id, uint8_t *private_key,
68
+ size_t private_key_size, size_t *private_key_length,
69
+ uint8_t *public_key, size_t public_key_size, size_t *public_key_length);
70
+
71
+ /**
72
+ * \brief Mocked EDHOC crypto function ECDH make key pair for responder.
73
+ */
74
+ static int cipher_suite_0_make_key_pair_resp(
75
+ void *user_context, const void *key_id, uint8_t *private_key,
76
+ size_t private_key_size, size_t *private_key_length,
77
+ uint8_t *public_key, size_t public_key_size, size_t *public_key_length);
78
+
79
+ /**
80
+ * \brief Authentication credentials fetch callback for initiator.
81
+ */
82
+ static int auth_cred_fetch_init(void *user_ctx,
83
+ struct edhoc_auth_creds *auth_cred);
84
+
85
+ /**
86
+ * \brief Authentication credentials fetch callback for initiator.
87
+ *
88
+ * \note It will use already cborised credentials.
89
+ */
90
+ static int auth_cred_fetch_init_any(void *user_ctx,
91
+ struct edhoc_auth_creds *auth_cred);
92
+
93
+ /**
94
+ * \brief Authentication credentials fetch callback for responder.
95
+ */
96
+ static int auth_cred_fetch_resp(void *user_ctx,
97
+ struct edhoc_auth_creds *auth_cred);
98
+
99
+ /**
100
+ * \brief Authentication credentials fetch callback for responder.
101
+ *
102
+ * \note It will use already cborised credentials.
103
+ */
104
+ static int auth_cred_fetch_resp_any(void *user_ctx,
105
+ struct edhoc_auth_creds *auth_cred);
106
+
107
+ /**
108
+ * \brief Authentication credentials verify callback for initiator.
109
+ */
110
+ static int auth_cred_verify_init(void *user_ctx,
111
+ struct edhoc_auth_creds *auth_cred,
112
+ const uint8_t **pub_key, size_t *pub_key_len);
113
+
114
+ /**
115
+ * \brief Authentication credentials verify callback for responder.
116
+ */
117
+ static int auth_cred_verify_resp(void *user_ctx,
118
+ struct edhoc_auth_creds *auth_cred,
119
+ const uint8_t **pub_key, size_t *pub_key_len);
120
+
121
+ /**
122
+ * \brief Example EAD compose for single token.
123
+ */
124
+ static int ead_compose_single_token(void *user_context,
125
+ enum edhoc_message message,
126
+ struct edhoc_ead_token *ead_token,
127
+ size_t ead_token_size,
128
+ size_t *ead_token_len);
129
+
130
+ /**
131
+ * \brief Example EAD process for single token.
132
+ */
133
+ static int ead_process_single_token(void *user_context,
134
+ enum edhoc_message message,
135
+ const struct edhoc_ead_token *ead_token,
136
+ size_t ead_token_size);
137
+
138
+ /**
139
+ * \brief Example EAD compose for multiple tokens.
140
+ */
141
+ static int ead_compose_multiple_tokens(void *user_context,
142
+ enum edhoc_message message,
143
+ struct edhoc_ead_token *ead_token,
144
+ size_t ead_token_size,
145
+ size_t *ead_token_len);
146
+
147
+ /**
148
+ * \brief Example EAD process for multiple tokens.
149
+ */
150
+ static int ead_process_multiple_tokens(void *user_context,
151
+ enum edhoc_message message,
152
+ const struct edhoc_ead_token *ead_token,
153
+ size_t ead_token_size);
154
+
155
+ /**
156
+ * \brief Helper function for printing arrays.
157
+ */
158
+ static inline void print_array(void *user_context, const char *name,
159
+ const uint8_t *buffer, size_t buffer_length);
160
+
161
+ /* Static variables and constants ------------------------------------------ */
162
+
163
+ static int ret = EDHOC_ERROR_GENERIC_ERROR;
164
+ static enum edhoc_error_code error_code_recv =
165
+ EDHOC_ERROR_CODE_UNSPECIFIED_ERROR;
166
+
167
+ static struct edhoc_context edhoc_initiator_context = { 0 };
168
+ static struct edhoc_context *init_ctx = &edhoc_initiator_context;
169
+
170
+ static struct edhoc_context edhoc_responder_context = { 0 };
171
+ static struct edhoc_context *resp_ctx = &edhoc_responder_context;
172
+
173
+ static const struct edhoc_cipher_suite edhoc_cipher_suite_0 = {
174
+ .value = 0,
175
+ .aead_key_length = 16,
176
+ .aead_tag_length = 8,
177
+ .aead_iv_length = 13,
178
+ .hash_length = 32,
179
+ .mac_length = 32,
180
+ .ecc_key_length = 32,
181
+ .ecc_sign_length = 64,
182
+ };
183
+
184
+ static const struct edhoc_keys edhoc_keys = {
185
+ .import_key = cipher_suite_0_key_import,
186
+ .destroy_key = cipher_suite_0_key_destroy,
187
+ };
188
+
189
+ static const struct edhoc_crypto edhoc_crypto_mocked_init = {
190
+ .make_key_pair = cipher_suite_0_make_key_pair_init,
191
+ .key_agreement = cipher_suite_0_key_agreement,
192
+ .signature = cipher_suite_0_signature,
193
+ .verify = cipher_suite_0_verify,
194
+ .extract = cipher_suite_0_extract,
195
+ .expand = cipher_suite_0_expand,
196
+ .encrypt = cipher_suite_0_encrypt,
197
+ .decrypt = cipher_suite_0_decrypt,
198
+ .hash = cipher_suite_0_hash,
199
+ };
200
+
201
+ static const struct edhoc_crypto edhoc_crypto_mocked_resp = {
202
+ .make_key_pair = cipher_suite_0_make_key_pair_resp,
203
+ .key_agreement = cipher_suite_0_key_agreement,
204
+ .signature = cipher_suite_0_signature,
205
+ .verify = cipher_suite_0_verify,
206
+ .extract = cipher_suite_0_extract,
207
+ .expand = cipher_suite_0_expand,
208
+ .encrypt = cipher_suite_0_encrypt,
209
+ .decrypt = cipher_suite_0_decrypt,
210
+ .hash = cipher_suite_0_hash,
211
+ };
212
+
213
+ static const struct edhoc_crypto edhoc_crypto = {
214
+ .make_key_pair = cipher_suite_0_make_key_pair,
215
+ .key_agreement = cipher_suite_0_key_agreement,
216
+ .signature = cipher_suite_0_signature,
217
+ .verify = cipher_suite_0_verify,
218
+ .extract = cipher_suite_0_extract,
219
+ .expand = cipher_suite_0_expand,
220
+ .encrypt = cipher_suite_0_encrypt,
221
+ .decrypt = cipher_suite_0_decrypt,
222
+ .hash = cipher_suite_0_hash,
223
+ };
224
+
225
+ static const struct edhoc_credentials edhoc_auth_cred_mocked_init = {
226
+ .fetch = auth_cred_fetch_init,
227
+ .verify = auth_cred_verify_init,
228
+ };
229
+
230
+ static const struct edhoc_credentials edhoc_auth_cred_mocked_init_any = {
231
+ .fetch = auth_cred_fetch_init_any,
232
+ .verify = auth_cred_verify_init,
233
+ };
234
+
235
+ static const struct edhoc_credentials edhoc_auth_cred_mocked_resp = {
236
+ .fetch = auth_cred_fetch_resp,
237
+ .verify = auth_cred_verify_resp,
238
+ };
239
+
240
+ static const struct edhoc_credentials edhoc_auth_cred_mocked_resp_any = {
241
+ .fetch = auth_cred_fetch_resp_any,
242
+ .verify = auth_cred_verify_resp,
243
+ };
244
+
245
+ static const struct edhoc_ead edhoc_ead_single_token = {
246
+ .compose = ead_compose_single_token,
247
+ .process = ead_process_single_token,
248
+ };
249
+
250
+ static const struct edhoc_ead edhoc_ead_multiple_tokens = {
251
+ .compose = ead_compose_multiple_tokens,
252
+ .process = ead_process_multiple_tokens,
253
+ };
254
+
255
+ static const uint8_t ead_val_msg_1[] = {
256
+ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,
257
+ };
258
+ static const uint8_t ead_val_msg_2[] = {
259
+ 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
260
+ 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
261
+ };
262
+ static const uint8_t ead_val_msg_3[] = {
263
+ 0x55, 0x9a, 0xea, 0xd0, 0x82, 0x64, 0xd5, 0x79, 0x5d, 0x39, 0x09, 0x71,
264
+ 0x8c, 0xdd, 0x05, 0xab, 0xd4, 0x95, 0x72, 0xe8, 0x4f, 0xe5, 0x55, 0x90,
265
+ 0xee, 0xf3, 0x1a, 0x88, 0xa0, 0x8f, 0xdf, 0xfd, 0x3c, 0xb2, 0x5f, 0x25,
266
+ 0xfa, 0xac, 0xd5, 0x7a, 0x90, 0x43, 0x4f, 0x64, 0xd0, 0x36, 0x2f, 0x2a,
267
+ 0x2d, 0x2d, 0x0a, 0x90, 0xcf, 0x1a, 0x5a, 0x4c, 0x5d, 0xb0, 0x2d, 0x56,
268
+ 0xec, 0xc4, 0xc5, 0xbf, 0x34, 0x00, 0x72, 0x08, 0xd5, 0xb8, 0x87, 0x18,
269
+ 0x58, 0x65, 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8, 0xf9,
270
+ 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b,
271
+ 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b,
272
+ };
273
+
274
+ static const uint8_t ead_val_msg_4[] = {
275
+ 0xff, 0xee, 0xdd, 0xcc, 0xbb, 0xaa, 0x00,
276
+ };
277
+
278
+ static const struct edhoc_ead_token ead_single_token_msg_1 = {
279
+ .label = 0,
280
+ .value = ead_val_msg_1,
281
+ .value_len = ARRAY_SIZE(ead_val_msg_1),
282
+ };
283
+
284
+ static const struct edhoc_ead_token ead_single_token_msg_2 = {
285
+ .label = 24,
286
+ .value = ead_val_msg_2,
287
+ .value_len = ARRAY_SIZE(ead_val_msg_2),
288
+ };
289
+
290
+ static const struct edhoc_ead_token ead_single_token_msg_3 = {
291
+ .label = 65535,
292
+ .value = ead_val_msg_3,
293
+ .value_len = ARRAY_SIZE(ead_val_msg_3),
294
+ };
295
+
296
+ static const struct edhoc_ead_token ead_single_token_msg_4 = {
297
+ .label = -830,
298
+ .value = ead_val_msg_4,
299
+ .value_len = ARRAY_SIZE(ead_val_msg_4),
300
+ };
301
+
302
+ static const struct edhoc_ead_token ead_multiple_tokens_msg_1[] = {
303
+ ead_single_token_msg_1,
304
+ ead_single_token_msg_2,
305
+ ead_single_token_msg_3,
306
+ };
307
+
308
+ static const struct edhoc_ead_token ead_multiple_tokens_msg_2[] = {
309
+ ead_single_token_msg_3,
310
+ ead_single_token_msg_1,
311
+ };
312
+
313
+ static const struct edhoc_ead_token ead_multiple_tokens_msg_3[] = {
314
+ ead_single_token_msg_3,
315
+ ead_single_token_msg_2,
316
+ ead_single_token_msg_1,
317
+ };
318
+
319
+ static const struct edhoc_ead_token ead_multiple_tokens_msg_4[] = {
320
+ ead_single_token_msg_1,
321
+ ead_single_token_msg_4,
322
+ ead_single_token_msg_3,
323
+ };
324
+
325
+ /* Static function definitions --------------------------------------------- */
326
+
327
+ static int
328
+ cipher_suite_0_make_key_pair_init(void *user_ctx, const void *kid,
329
+ uint8_t *priv_key, size_t priv_key_size,
330
+ size_t *priv_key_len, uint8_t *pub_key,
331
+ size_t pub_key_size, size_t *pub_key_len)
332
+ {
333
+ (void)user_ctx;
334
+
335
+ if (NULL == kid || NULL == priv_key || 0 == priv_key_size ||
336
+ NULL == priv_key_len || NULL == pub_key || 0 == pub_key_size ||
337
+ NULL == pub_key_len)
338
+ return EDHOC_ERROR_INVALID_ARGUMENT;
339
+
340
+ *priv_key_len = ARRAY_SIZE(X);
341
+ memcpy(priv_key, X, ARRAY_SIZE(X));
342
+
343
+ *pub_key_len = ARRAY_SIZE(G_X);
344
+ memcpy(pub_key, G_X, ARRAY_SIZE(G_X));
345
+
346
+ return EDHOC_SUCCESS;
347
+ }
348
+
349
+ static int
350
+ cipher_suite_0_make_key_pair_resp(void *user_ctx, const void *kid,
351
+ uint8_t *priv_key, size_t priv_key_size,
352
+ size_t *priv_key_len, uint8_t *pub_key,
353
+ size_t pub_key_size, size_t *pub_key_len)
354
+ {
355
+ (void)user_ctx;
356
+
357
+ if (NULL == kid || NULL == priv_key || 0 == priv_key_size ||
358
+ NULL == priv_key_len || NULL == pub_key || 0 == pub_key_size ||
359
+ NULL == pub_key_len)
360
+ return EDHOC_ERROR_INVALID_ARGUMENT;
361
+
362
+ *priv_key_len = ARRAY_SIZE(Y);
363
+ memcpy(priv_key, Y, ARRAY_SIZE(Y));
364
+
365
+ *pub_key_len = ARRAY_SIZE(G_X);
366
+ memcpy(pub_key, G_Y, ARRAY_SIZE(G_Y));
367
+
368
+ return EDHOC_SUCCESS;
369
+ }
370
+
371
+ static int auth_cred_fetch_init(void *user_ctx,
372
+ struct edhoc_auth_creds *auth_cred)
373
+ {
374
+ (void)user_ctx;
375
+
376
+ if (NULL == auth_cred)
377
+ return EDHOC_ERROR_INVALID_ARGUMENT;
378
+
379
+ /**
380
+ * \brief Here we check algorithm for certificate fingerprint.
381
+ * - 0x2e is CBOR encoding of the integer -15.
382
+ */
383
+ if (CBOR_ENC_COSE_ALG_SHA_256_64 != ID_CRED_I_cborised[4])
384
+ return EDHOC_ERROR_INVALID_ARGUMENT;
385
+
386
+ auth_cred->label = EDHOC_COSE_HEADER_X509_HASH;
387
+ auth_cred->x509_hash.cert = CRED_I;
388
+ auth_cred->x509_hash.cert_len = ARRAY_SIZE(CRED_I);
389
+ auth_cred->x509_hash.cert_fp = &ID_CRED_I_cborised[6];
390
+ auth_cred->x509_hash.cert_fp_len = ARRAY_SIZE(ID_CRED_I_cborised) - 6;
391
+ auth_cred->x509_hash.encode_type = EDHOC_ENCODE_TYPE_INTEGER;
392
+ auth_cred->x509_hash.alg_int = COSE_ALG_SHA_256_64;
393
+
394
+ const int ret = cipher_suite_0_key_import(NULL, EDHOC_KT_SIGNATURE,
395
+ SK_I, ARRAY_SIZE(SK_I),
396
+ auth_cred->priv_key_id);
397
+
398
+ if (EDHOC_SUCCESS != ret)
399
+ return EDHOC_ERROR_CREDENTIALS_FAILURE;
400
+
401
+ return EDHOC_SUCCESS;
402
+ }
403
+
404
+ static int auth_cred_fetch_init_any(void *user_ctx,
405
+ struct edhoc_auth_creds *auth_cred)
406
+ {
407
+ (void)user_ctx;
408
+
409
+ if (NULL == auth_cred)
410
+ return EDHOC_ERROR_INVALID_ARGUMENT;
411
+
412
+ auth_cred->label = EDHOC_COSE_ANY;
413
+ auth_cred->any.id_cred = ID_CRED_I_cborised;
414
+ auth_cred->any.id_cred_len = ARRAY_SIZE(ID_CRED_I_cborised);
415
+ auth_cred->any.cred = CRED_I_cborised;
416
+ auth_cred->any.cred_len = ARRAY_SIZE(CRED_I_cborised);
417
+
418
+ const int ret = cipher_suite_0_key_import(NULL, EDHOC_KT_SIGNATURE,
419
+ SK_I, ARRAY_SIZE(SK_I),
420
+ auth_cred->priv_key_id);
421
+
422
+ if (EDHOC_SUCCESS != ret)
423
+ return EDHOC_ERROR_CREDENTIALS_FAILURE;
424
+
425
+ return EDHOC_SUCCESS;
426
+ }
427
+
428
+ static int auth_cred_fetch_resp(void *user_ctx,
429
+ struct edhoc_auth_creds *auth_cred)
430
+ {
431
+ (void)user_ctx;
432
+
433
+ if (NULL == auth_cred)
434
+ return EDHOC_ERROR_INVALID_ARGUMENT;
435
+
436
+ /**
437
+ * \brief Here we check algorithm for certificate fingerprint.
438
+ * - 0x2e is CBOR encoding of the integer -15.
439
+ */
440
+ if (CBOR_ENC_COSE_ALG_SHA_256_64 != ID_CRED_R_cborised[4])
441
+ return EDHOC_ERROR_INVALID_ARGUMENT;
442
+
443
+ auth_cred->label = EDHOC_COSE_HEADER_X509_HASH;
444
+ auth_cred->x509_hash.cert = CRED_R;
445
+ auth_cred->x509_hash.cert_len = ARRAY_SIZE(CRED_R);
446
+ auth_cred->x509_hash.cert_fp = &ID_CRED_R_cborised[6];
447
+ auth_cred->x509_hash.cert_fp_len = ARRAY_SIZE(ID_CRED_R_cborised) - 6;
448
+ auth_cred->x509_hash.encode_type = EDHOC_ENCODE_TYPE_INTEGER;
449
+ auth_cred->x509_hash.alg_int = COSE_ALG_SHA_256_64;
450
+
451
+ const int ret = cipher_suite_0_key_import(NULL, EDHOC_KT_SIGNATURE,
452
+ SK_R, ARRAY_SIZE(SK_R),
453
+ auth_cred->priv_key_id);
454
+
455
+ if (EDHOC_SUCCESS != ret)
456
+ return EDHOC_ERROR_CREDENTIALS_FAILURE;
457
+
458
+ return EDHOC_SUCCESS;
459
+ }
460
+
461
+ static int auth_cred_fetch_resp_any(void *user_ctx,
462
+ struct edhoc_auth_creds *auth_cred)
463
+ {
464
+ (void)user_ctx;
465
+
466
+ if (NULL == auth_cred)
467
+ return EDHOC_ERROR_INVALID_ARGUMENT;
468
+
469
+ auth_cred->label = EDHOC_COSE_ANY;
470
+ auth_cred->any.id_cred = ID_CRED_R_cborised;
471
+ auth_cred->any.id_cred_len = ARRAY_SIZE(ID_CRED_R_cborised);
472
+ auth_cred->any.cred = CRED_R_cborised;
473
+ auth_cred->any.cred_len = ARRAY_SIZE(CRED_R_cborised);
474
+
475
+ const int ret = cipher_suite_0_key_import(NULL, EDHOC_KT_SIGNATURE,
476
+ SK_R, ARRAY_SIZE(SK_R),
477
+ auth_cred->priv_key_id);
478
+
479
+ if (EDHOC_SUCCESS != ret)
480
+ return EDHOC_ERROR_CREDENTIALS_FAILURE;
481
+
482
+ return EDHOC_SUCCESS;
483
+ }
484
+
485
+ static int auth_cred_verify_init(void *user_ctx,
486
+ struct edhoc_auth_creds *auth_cred,
487
+ const uint8_t **pub_key, size_t *pub_key_len)
488
+ {
489
+ (void)user_ctx;
490
+
491
+ if (NULL == auth_cred || NULL == pub_key || NULL == pub_key_len)
492
+ return EDHOC_ERROR_INVALID_ARGUMENT;
493
+
494
+ /**
495
+ * \brief Verify COSE header label value.
496
+ */
497
+ if (EDHOC_COSE_HEADER_X509_HASH != auth_cred->label)
498
+ return EDHOC_ERROR_CREDENTIALS_FAILURE;
499
+
500
+ /**
501
+ * \brief Verify received COSE IANA hash algorithm value.
502
+ */
503
+ if (EDHOC_ENCODE_TYPE_INTEGER != auth_cred->x509_hash.encode_type ||
504
+ COSE_ALG_SHA_256_64 != auth_cred->x509_hash.alg_int)
505
+ return EDHOC_ERROR_CREDENTIALS_FAILURE;
506
+
507
+ /**
508
+ * \brief Verify if received certificate fingerprint matches.
509
+ */
510
+ size_t hash_len = 0;
511
+ uint8_t hash[32] = { 0 };
512
+ const psa_status_t status =
513
+ psa_hash_compute(PSA_ALG_SHA_256, CRED_R, ARRAY_SIZE(CRED_R),
514
+ hash, ARRAY_SIZE(hash), &hash_len);
515
+
516
+ if (PSA_SUCCESS != status || ARRAY_SIZE(hash) != hash_len)
517
+ return EDHOC_ERROR_CREDENTIALS_FAILURE;
518
+
519
+ uint8_t cert_fp[8] = { 0 };
520
+ memcpy(cert_fp, hash, sizeof(cert_fp));
521
+
522
+ if (ARRAY_SIZE(cert_fp) != auth_cred->x509_hash.cert_fp_len)
523
+ return EDHOC_ERROR_CREDENTIALS_FAILURE;
524
+
525
+ if (0 != memcmp(cert_fp, auth_cred->x509_hash.cert_fp,
526
+ auth_cred->x509_hash.cert_fp_len))
527
+ return EDHOC_ERROR_CREDENTIALS_FAILURE;
528
+
529
+ /**
530
+ * \brief If successful then assign certificate and public key.
531
+ */
532
+ auth_cred->x509_hash.cert = CRED_R;
533
+ auth_cred->x509_hash.cert_len = ARRAY_SIZE(CRED_R);
534
+
535
+ *pub_key = PK_R;
536
+ *pub_key_len = ARRAY_SIZE(PK_R);
537
+
538
+ return EDHOC_SUCCESS;
539
+ }
540
+
541
+ static int auth_cred_verify_resp(void *user_ctx,
542
+ struct edhoc_auth_creds *auth_cred,
543
+ const uint8_t **pub_key, size_t *pub_key_len)
544
+ {
545
+ (void)user_ctx;
546
+
547
+ if (NULL == auth_cred || NULL == pub_key || NULL == pub_key_len)
548
+ return EDHOC_ERROR_INVALID_ARGUMENT;
549
+
550
+ /**
551
+ * \brief Verify COSE header label value.
552
+ */
553
+ if (EDHOC_COSE_HEADER_X509_HASH != auth_cred->label)
554
+ return EDHOC_ERROR_CREDENTIALS_FAILURE;
555
+
556
+ /**
557
+ * \brief Verify received COSE IANA hash algorithm value.
558
+ */
559
+ if (EDHOC_ENCODE_TYPE_INTEGER != auth_cred->x509_hash.encode_type ||
560
+ COSE_ALG_SHA_256_64 != auth_cred->x509_hash.alg_int)
561
+ return EDHOC_ERROR_CREDENTIALS_FAILURE;
562
+
563
+ /**
564
+ * \brief Verify if received certificate fingerprint matches.
565
+ */
566
+ size_t hash_len = 0;
567
+ uint8_t hash[32] = { 0 };
568
+ const psa_status_t status =
569
+ psa_hash_compute(PSA_ALG_SHA_256, CRED_I, ARRAY_SIZE(CRED_I),
570
+ hash, ARRAY_SIZE(hash), &hash_len);
571
+
572
+ if (PSA_SUCCESS != status || ARRAY_SIZE(hash) != hash_len)
573
+ return EDHOC_ERROR_CREDENTIALS_FAILURE;
574
+
575
+ uint8_t cert_fp[8] = { 0 };
576
+ memcpy(cert_fp, hash, sizeof(cert_fp));
577
+
578
+ if (ARRAY_SIZE(cert_fp) != auth_cred->x509_hash.cert_fp_len)
579
+ return EDHOC_ERROR_CREDENTIALS_FAILURE;
580
+
581
+ if (0 != memcmp(cert_fp, auth_cred->x509_hash.cert_fp,
582
+ auth_cred->x509_hash.cert_fp_len))
583
+ return EDHOC_ERROR_CREDENTIALS_FAILURE;
584
+
585
+ /**
586
+ * \brief If successful then assign certificate and public key.
587
+ */
588
+ auth_cred->x509_hash.cert = CRED_I;
589
+ auth_cred->x509_hash.cert_len = ARRAY_SIZE(CRED_I);
590
+
591
+ *pub_key = PK_I;
592
+ *pub_key_len = ARRAY_SIZE(PK_I);
593
+
594
+ return EDHOC_SUCCESS;
595
+ }
596
+
597
+ static int ead_compose_single_token(void *user_ctx, enum edhoc_message msg,
598
+ struct edhoc_ead_token *ead_token,
599
+ size_t ead_token_size,
600
+ size_t *ead_token_len)
601
+ {
602
+ if (NULL == user_ctx || NULL == ead_token || 0 == ead_token_size ||
603
+ NULL == ead_token_len)
604
+ return EDHOC_ERROR_EAD_PROCESS_FAILURE;
605
+
606
+ const struct edhoc_ead_token *token = NULL;
607
+
608
+ switch (msg) {
609
+ case EDHOC_MSG_1:
610
+ token = &ead_single_token_msg_1;
611
+ break;
612
+ case EDHOC_MSG_2:
613
+ token = &ead_single_token_msg_2;
614
+ break;
615
+ case EDHOC_MSG_3:
616
+ token = &ead_single_token_msg_3;
617
+ break;
618
+ case EDHOC_MSG_4:
619
+ token = &ead_single_token_msg_4;
620
+ break;
621
+ default:
622
+ return EDHOC_ERROR_EAD_COMPOSE_FAILURE;
623
+ }
624
+
625
+ ead_token[0] = *token;
626
+ *ead_token_len = 1;
627
+
628
+ struct ead_context *ead_ctx = user_ctx;
629
+
630
+ ead_ctx->msg = msg;
631
+ ead_ctx->recv_tokens = 1;
632
+
633
+ for (size_t i = 0; i < ead_ctx->recv_tokens; ++i) {
634
+ ead_ctx->token[i].label = ead_token[i].label;
635
+ ead_ctx->token[i].value_len = ead_token[i].value_len;
636
+ memcpy(ead_ctx->token[i].value, ead_token[i].value,
637
+ ead_token[i].value_len);
638
+ }
639
+
640
+ return EDHOC_SUCCESS;
641
+ }
642
+
643
+ static int ead_process_single_token(void *user_ctx, enum edhoc_message msg,
644
+ const struct edhoc_ead_token *ead_token,
645
+ size_t ead_token_size)
646
+ {
647
+ if (NULL == user_ctx || NULL == ead_token || 0 == ead_token_size)
648
+ return EDHOC_ERROR_EAD_PROCESS_FAILURE;
649
+
650
+ struct ead_context *ead_ctx = user_ctx;
651
+
652
+ ead_ctx->msg = msg;
653
+ ead_ctx->recv_tokens = ead_token_size;
654
+
655
+ for (size_t i = 0; i < ead_token_size; ++i) {
656
+ ead_ctx->token[i].label = ead_token[i].label;
657
+ ead_ctx->token[i].value_len = ead_token[i].value_len;
658
+ memcpy(ead_ctx->token[i].value, ead_token[i].value,
659
+ ead_token[i].value_len);
660
+ }
661
+
662
+ return EDHOC_SUCCESS;
663
+ }
664
+
665
+ static int ead_compose_multiple_tokens(void *user_ctx, enum edhoc_message msg,
666
+ struct edhoc_ead_token *ead_token,
667
+ size_t ead_token_size,
668
+ size_t *ead_token_len)
669
+ {
670
+ if (NULL == user_ctx || NULL == ead_token || 0 == ead_token_size ||
671
+ NULL == ead_token_len)
672
+ return EDHOC_ERROR_EAD_PROCESS_FAILURE;
673
+
674
+ size_t len = 0;
675
+ const struct edhoc_ead_token *token = NULL;
676
+
677
+ switch (msg) {
678
+ case EDHOC_MSG_1:
679
+ token = ead_multiple_tokens_msg_1;
680
+ len = ARRAY_SIZE(ead_multiple_tokens_msg_1);
681
+ break;
682
+ case EDHOC_MSG_2:
683
+ token = ead_multiple_tokens_msg_2;
684
+ len = ARRAY_SIZE(ead_multiple_tokens_msg_2);
685
+ break;
686
+ case EDHOC_MSG_3:
687
+ token = ead_multiple_tokens_msg_3;
688
+ len = ARRAY_SIZE(ead_multiple_tokens_msg_3);
689
+ break;
690
+ case EDHOC_MSG_4:
691
+ token = ead_multiple_tokens_msg_4;
692
+ len = ARRAY_SIZE(ead_multiple_tokens_msg_4);
693
+ break;
694
+ default:
695
+ return EDHOC_ERROR_EAD_COMPOSE_FAILURE;
696
+ }
697
+
698
+ *ead_token_len = len;
699
+
700
+ for (size_t i = 0; i < len; ++i)
701
+ ead_token[i] = token[i];
702
+
703
+ struct ead_context *ead_ctx = user_ctx;
704
+
705
+ ead_ctx->msg = msg;
706
+ ead_ctx->recv_tokens = len;
707
+
708
+ for (size_t i = 0; i < ead_ctx->recv_tokens; ++i) {
709
+ ead_ctx->token[i].label = ead_token[i].label;
710
+ ead_ctx->token[i].value_len = ead_token[i].value_len;
711
+ memcpy(ead_ctx->token[i].value, ead_token[i].value,
712
+ ead_token[i].value_len);
713
+ }
714
+
715
+ return EDHOC_SUCCESS;
716
+ }
717
+
718
+ static int ead_process_multiple_tokens(void *user_ctx, enum edhoc_message msg,
719
+ const struct edhoc_ead_token *ead_token,
720
+ size_t ead_token_size)
721
+ {
722
+ if (NULL == user_ctx || NULL == ead_token || 0 == ead_token_size)
723
+ return EDHOC_ERROR_EAD_PROCESS_FAILURE;
724
+
725
+ struct ead_context *ead_ctx = user_ctx;
726
+
727
+ ead_ctx->msg = msg;
728
+ ead_ctx->recv_tokens = ead_token_size;
729
+
730
+ for (size_t i = 0; i < ead_token_size; ++i) {
731
+ ead_ctx->token[i].label = ead_token[i].label;
732
+ ead_ctx->token[i].value_len = ead_token[i].value_len;
733
+ memcpy(ead_ctx->token[i].value, ead_token[i].value,
734
+ ead_token[i].value_len);
735
+ }
736
+
737
+ return EDHOC_SUCCESS;
738
+ }
739
+
740
+ static inline void print_array(void *user_context, const char *name,
741
+ const uint8_t *buffer, size_t buffer_length)
742
+ {
743
+ (void)user_context;
744
+
745
+ printf("%s:\tLEN( %zu )\n", name, buffer_length);
746
+
747
+ for (size_t i = 0; i < buffer_length; ++i) {
748
+ if (0 == i % 16 && i > 0) {
749
+ printf("\n");
750
+ }
751
+
752
+ printf("%02x ", buffer[i]);
753
+ }
754
+
755
+ printf("\n\n");
756
+ }
757
+
758
+ /* Module interface function definitions ----------------------------------- */
759
+
760
+ TEST_GROUP(rfc9529_chapter_2);
761
+
762
+ TEST_SETUP(rfc9529_chapter_2)
763
+ {
764
+ ret = psa_crypto_init();
765
+ TEST_ASSERT_EQUAL(PSA_SUCCESS, ret);
766
+
767
+ const enum edhoc_method methods[] = { METHOD };
768
+ const struct edhoc_cipher_suite cipher_suites[] = {
769
+ edhoc_cipher_suite_0,
770
+ };
771
+
772
+ const struct edhoc_connection_id init_cid = {
773
+ .encode_type = EDHOC_CID_TYPE_ONE_BYTE_INTEGER,
774
+ .int_value = (int8_t)C_I[0],
775
+ };
776
+
777
+ struct edhoc_connection_id resp_cid = {
778
+ .encode_type = EDHOC_CID_TYPE_BYTE_STRING,
779
+ .bstr_length = ARRAY_SIZE(C_R),
780
+ };
781
+ memcpy(&resp_cid.bstr_value, C_R, ARRAY_SIZE(C_R));
782
+
783
+ ret = edhoc_context_init(init_ctx);
784
+ TEST_ASSERT_EQUAL(EDHOC_SUCCESS, ret);
785
+
786
+ ret = edhoc_set_methods(init_ctx, methods, ARRAY_SIZE(methods));
787
+ TEST_ASSERT_EQUAL(EDHOC_SUCCESS, ret);
788
+
789
+ ret = edhoc_set_cipher_suites(init_ctx, cipher_suites,
790
+ ARRAY_SIZE(cipher_suites));
791
+ TEST_ASSERT_EQUAL(EDHOC_SUCCESS, ret);
792
+
793
+ ret = edhoc_set_connection_id(init_ctx, &init_cid);
794
+ TEST_ASSERT_EQUAL(EDHOC_SUCCESS, ret);
795
+
796
+ ret = edhoc_bind_keys(init_ctx, &edhoc_keys);
797
+ TEST_ASSERT_EQUAL(EDHOC_SUCCESS, ret);
798
+
799
+ ret = edhoc_bind_crypto(init_ctx, &edhoc_crypto_mocked_init);
800
+ TEST_ASSERT_EQUAL(EDHOC_SUCCESS, ret);
801
+
802
+ ret = edhoc_bind_credentials(init_ctx, &edhoc_auth_cred_mocked_init);
803
+ TEST_ASSERT_EQUAL(EDHOC_SUCCESS, ret);
804
+
805
+ ret = edhoc_context_init(resp_ctx);
806
+ TEST_ASSERT_EQUAL(EDHOC_SUCCESS, ret);
807
+
808
+ ret = edhoc_set_methods(resp_ctx, methods, ARRAY_SIZE(methods));
809
+ TEST_ASSERT_EQUAL(EDHOC_SUCCESS, ret);
810
+
811
+ ret = edhoc_set_cipher_suites(resp_ctx, cipher_suites,
812
+ ARRAY_SIZE(cipher_suites));
813
+ TEST_ASSERT_EQUAL(EDHOC_SUCCESS, ret);
814
+
815
+ ret = edhoc_set_connection_id(resp_ctx, &resp_cid);
816
+ TEST_ASSERT_EQUAL(EDHOC_SUCCESS, ret);
817
+
818
+ ret = edhoc_bind_keys(resp_ctx, &edhoc_keys);
819
+ TEST_ASSERT_EQUAL(EDHOC_SUCCESS, ret);
820
+
821
+ ret = edhoc_bind_crypto(resp_ctx, &edhoc_crypto_mocked_resp);
822
+ TEST_ASSERT_EQUAL(EDHOC_SUCCESS, ret);
823
+
824
+ ret = edhoc_bind_credentials(resp_ctx, &edhoc_auth_cred_mocked_resp);
825
+ TEST_ASSERT_EQUAL(EDHOC_SUCCESS, ret);
826
+
827
+ #if defined(TEST_TRACES)
828
+ init_ctx->logger = print_array;
829
+ resp_ctx->logger = print_array;
830
+ #endif
831
+ }
832
+
833
+ TEST_TEAR_DOWN(rfc9529_chapter_2)
834
+ {
835
+ mbedtls_psa_crypto_free();
836
+
837
+ ret = edhoc_context_deinit(init_ctx);
838
+ TEST_ASSERT_EQUAL(EDHOC_SUCCESS, ret);
839
+
840
+ ret = edhoc_context_deinit(resp_ctx);
841
+ TEST_ASSERT_EQUAL(EDHOC_SUCCESS, ret);
842
+ }
843
+
844
+ TEST(rfc9529_chapter_2, message_1_compose)
845
+ {
846
+ size_t msg_1_len = 0;
847
+ uint8_t msg_1[ARRAY_SIZE(message_1)] = { 0 };
848
+
849
+ ret = edhoc_message_1_compose(init_ctx, msg_1, ARRAY_SIZE(msg_1),
850
+ &msg_1_len);
851
+
852
+ TEST_ASSERT_EQUAL(EDHOC_SUCCESS, ret);
853
+ TEST_ASSERT_EQUAL(EDHOC_SM_WAIT_M2, init_ctx->status);
854
+ TEST_ASSERT_EQUAL(false, init_ctx->is_oscore_export_allowed);
855
+
856
+ ret = edhoc_error_get_code(init_ctx, &error_code_recv);
857
+ TEST_ASSERT_EQUAL(EDHOC_SUCCESS, ret);
858
+ TEST_ASSERT_EQUAL(EDHOC_ERROR_CODE_SUCCESS, error_code_recv);
859
+
860
+ TEST_ASSERT_EQUAL(ARRAY_SIZE(message_1), msg_1_len);
861
+ TEST_ASSERT_EQUAL_UINT8_ARRAY(message_1, msg_1, msg_1_len);
862
+
863
+ TEST_ASSERT_EQUAL(EDHOC_TH_STATE_1, init_ctx->th_state);
864
+ TEST_ASSERT_EQUAL(ARRAY_SIZE(H_message_1), init_ctx->th_len);
865
+ TEST_ASSERT_EQUAL_UINT8_ARRAY(H_message_1, init_ctx->th,
866
+ init_ctx->th_len);
867
+
868
+ TEST_ASSERT_EQUAL(EDHOC_PRK_STATE_INVALID, init_ctx->prk_state);
869
+ TEST_ASSERT_EQUAL(0, init_ctx->prk_len);
870
+
871
+ TEST_ASSERT_EQUAL(ARRAY_SIZE(X), init_ctx->dh_priv_key_len);
872
+ TEST_ASSERT_EQUAL_UINT8_ARRAY(X, init_ctx->dh_priv_key,
873
+ init_ctx->dh_priv_key_len);
874
+ }
875
+
876
+ TEST(rfc9529_chapter_2, message_1_process)
877
+ {
878
+ ret = edhoc_message_1_process(resp_ctx, message_1,
879
+ ARRAY_SIZE(message_1));
880
+
881
+ TEST_ASSERT_EQUAL(EDHOC_SUCCESS, ret);
882
+ TEST_ASSERT_EQUAL(EDHOC_SM_RECEIVED_M1, resp_ctx->status);
883
+ TEST_ASSERT_EQUAL(false, resp_ctx->is_oscore_export_allowed);
884
+
885
+ ret = edhoc_error_get_code(resp_ctx, &error_code_recv);
886
+ TEST_ASSERT_EQUAL(EDHOC_SUCCESS, ret);
887
+ TEST_ASSERT_EQUAL(EDHOC_ERROR_CODE_SUCCESS, error_code_recv);
888
+
889
+ TEST_ASSERT_EQUAL(EDHOC_TH_STATE_1, resp_ctx->th_state);
890
+ TEST_ASSERT_EQUAL(ARRAY_SIZE(H_message_1), resp_ctx->th_len);
891
+ TEST_ASSERT_EQUAL_UINT8_ARRAY(H_message_1, resp_ctx->th,
892
+ resp_ctx->th_len);
893
+
894
+ TEST_ASSERT_EQUAL(EDHOC_PRK_STATE_INVALID, resp_ctx->prk_state);
895
+ TEST_ASSERT_EQUAL(0, resp_ctx->prk_len);
896
+
897
+ TEST_ASSERT_EQUAL(EDHOC_CID_TYPE_ONE_BYTE_INTEGER,
898
+ resp_ctx->peer_cid.encode_type);
899
+ TEST_ASSERT_EQUAL((int8_t)C_I[0], resp_ctx->peer_cid.int_value);
900
+
901
+ TEST_ASSERT_EQUAL(ARRAY_SIZE(G_X), resp_ctx->dh_peer_pub_key_len);
902
+ TEST_ASSERT_EQUAL_UINT8_ARRAY(G_X, resp_ctx->dh_peer_pub_key,
903
+ resp_ctx->dh_peer_pub_key_len);
904
+ }
905
+
906
+ TEST(rfc9529_chapter_2, message_2_compose)
907
+ {
908
+ /* Required injections. */
909
+ resp_ctx->status = EDHOC_SM_RECEIVED_M1;
910
+ resp_ctx->chosen_method = METHOD;
911
+
912
+ resp_ctx->th_state = EDHOC_TH_STATE_1;
913
+ resp_ctx->th_len = ARRAY_SIZE(H_message_1);
914
+ memcpy(resp_ctx->th, H_message_1, sizeof(H_message_1));
915
+
916
+ resp_ctx->dh_peer_pub_key_len = ARRAY_SIZE(G_X);
917
+ memcpy(resp_ctx->dh_peer_pub_key, G_X, ARRAY_SIZE(G_X));
918
+
919
+ resp_ctx->peer_cid.encode_type = EDHOC_CID_TYPE_ONE_BYTE_INTEGER;
920
+ resp_ctx->peer_cid.int_value = (int8_t)C_I[0];
921
+
922
+ size_t msg_2_len = 0;
923
+ uint8_t msg_2[ARRAY_SIZE(message_2)] = { 0 };
924
+
925
+ ret = edhoc_message_2_compose(resp_ctx, msg_2, ARRAY_SIZE(msg_2),
926
+ &msg_2_len);
927
+
928
+ TEST_ASSERT_EQUAL(EDHOC_SUCCESS, ret);
929
+ TEST_ASSERT_EQUAL(EDHOC_SM_WAIT_M3, resp_ctx->status);
930
+ TEST_ASSERT_EQUAL(false, resp_ctx->is_oscore_export_allowed);
931
+
932
+ ret = edhoc_error_get_code(resp_ctx, &error_code_recv);
933
+ TEST_ASSERT_EQUAL(EDHOC_SUCCESS, ret);
934
+ TEST_ASSERT_EQUAL(EDHOC_ERROR_CODE_SUCCESS, error_code_recv);
935
+
936
+ TEST_ASSERT_EQUAL(ARRAY_SIZE(message_2), msg_2_len);
937
+ TEST_ASSERT_EQUAL_UINT8_ARRAY(msg_2, message_2, msg_2_len);
938
+
939
+ TEST_ASSERT_EQUAL(EDHOC_TH_STATE_3, resp_ctx->th_state);
940
+ TEST_ASSERT_EQUAL(ARRAY_SIZE(TH_3), resp_ctx->th_len);
941
+ TEST_ASSERT_EQUAL_UINT8_ARRAY(resp_ctx->th, TH_3, resp_ctx->th_len);
942
+
943
+ TEST_ASSERT_EQUAL(EDHOC_PRK_STATE_3E2M, resp_ctx->prk_state);
944
+ TEST_ASSERT_EQUAL(ARRAY_SIZE(PRK_3e2m), resp_ctx->prk_len);
945
+ TEST_ASSERT_EQUAL_UINT8_ARRAY(PRK_3e2m, resp_ctx->prk,
946
+ resp_ctx->prk_len);
947
+
948
+ TEST_ASSERT_EQUAL(ARRAY_SIZE(G_XY), resp_ctx->dh_secret_len);
949
+ TEST_ASSERT_EQUAL_UINT8_ARRAY(G_XY, resp_ctx->dh_secret,
950
+ resp_ctx->dh_secret_len);
951
+ }
952
+
953
+ TEST(rfc9529_chapter_2, message_2_compose_any)
954
+ {
955
+ ret = edhoc_bind_credentials(resp_ctx,
956
+ &edhoc_auth_cred_mocked_resp_any);
957
+ TEST_ASSERT_EQUAL(EDHOC_SUCCESS, ret);
958
+
959
+ /* Required injections. */
960
+ resp_ctx->status = EDHOC_SM_RECEIVED_M1;
961
+ resp_ctx->chosen_method = METHOD;
962
+
963
+ resp_ctx->th_state = EDHOC_TH_STATE_1;
964
+ resp_ctx->th_len = ARRAY_SIZE(H_message_1);
965
+ memcpy(resp_ctx->th, H_message_1, sizeof(H_message_1));
966
+
967
+ resp_ctx->dh_peer_pub_key_len = ARRAY_SIZE(G_X);
968
+ memcpy(resp_ctx->dh_peer_pub_key, G_X, ARRAY_SIZE(G_X));
969
+
970
+ resp_ctx->peer_cid.encode_type = EDHOC_CID_TYPE_ONE_BYTE_INTEGER;
971
+ resp_ctx->peer_cid.int_value = (int8_t)C_I[0];
972
+
973
+ size_t msg_2_len = 0;
974
+ uint8_t msg_2[ARRAY_SIZE(message_2)] = { 0 };
975
+
976
+ ret = edhoc_message_2_compose(resp_ctx, msg_2, ARRAY_SIZE(msg_2),
977
+ &msg_2_len);
978
+
979
+ TEST_ASSERT_EQUAL(EDHOC_SUCCESS, ret);
980
+ TEST_ASSERT_EQUAL(EDHOC_SM_WAIT_M3, resp_ctx->status);
981
+ TEST_ASSERT_EQUAL(false, resp_ctx->is_oscore_export_allowed);
982
+
983
+ ret = edhoc_error_get_code(resp_ctx, &error_code_recv);
984
+ TEST_ASSERT_EQUAL(EDHOC_SUCCESS, ret);
985
+ TEST_ASSERT_EQUAL(EDHOC_ERROR_CODE_SUCCESS, error_code_recv);
986
+
987
+ TEST_ASSERT_EQUAL(ARRAY_SIZE(message_2), msg_2_len);
988
+ TEST_ASSERT_EQUAL_UINT8_ARRAY(msg_2, message_2, msg_2_len);
989
+
990
+ TEST_ASSERT_EQUAL(EDHOC_TH_STATE_3, resp_ctx->th_state);
991
+ TEST_ASSERT_EQUAL(ARRAY_SIZE(TH_3), resp_ctx->th_len);
992
+ TEST_ASSERT_EQUAL_UINT8_ARRAY(resp_ctx->th, TH_3, resp_ctx->th_len);
993
+
994
+ TEST_ASSERT_EQUAL(EDHOC_PRK_STATE_3E2M, resp_ctx->prk_state);
995
+ TEST_ASSERT_EQUAL(ARRAY_SIZE(PRK_3e2m), resp_ctx->prk_len);
996
+ TEST_ASSERT_EQUAL_UINT8_ARRAY(PRK_3e2m, resp_ctx->prk,
997
+ resp_ctx->prk_len);
998
+
999
+ TEST_ASSERT_EQUAL(ARRAY_SIZE(G_XY), resp_ctx->dh_secret_len);
1000
+ TEST_ASSERT_EQUAL_UINT8_ARRAY(G_XY, resp_ctx->dh_secret,
1001
+ resp_ctx->dh_secret_len);
1002
+ }
1003
+
1004
+ TEST(rfc9529_chapter_2, message_2_process)
1005
+ {
1006
+ /* Required injections. */
1007
+ init_ctx->status = EDHOC_SM_WAIT_M2;
1008
+ init_ctx->chosen_method = METHOD;
1009
+
1010
+ init_ctx->th_state = EDHOC_TH_STATE_1;
1011
+ init_ctx->th_len = ARRAY_SIZE(H_message_1);
1012
+ memcpy(init_ctx->th, H_message_1, ARRAY_SIZE(H_message_1));
1013
+
1014
+ init_ctx->dh_priv_key_len = ARRAY_SIZE(X);
1015
+ memcpy(init_ctx->dh_priv_key, X, ARRAY_SIZE(X));
1016
+
1017
+ ret = edhoc_message_2_process(init_ctx, message_2,
1018
+ ARRAY_SIZE(message_2));
1019
+
1020
+ TEST_ASSERT_EQUAL(EDHOC_SUCCESS, ret);
1021
+ TEST_ASSERT_EQUAL(EDHOC_SM_VERIFIED_M2, init_ctx->status);
1022
+ TEST_ASSERT_EQUAL(false, init_ctx->is_oscore_export_allowed);
1023
+
1024
+ ret = edhoc_error_get_code(init_ctx, &error_code_recv);
1025
+ TEST_ASSERT_EQUAL(EDHOC_SUCCESS, ret);
1026
+ TEST_ASSERT_EQUAL(EDHOC_ERROR_CODE_SUCCESS, error_code_recv);
1027
+
1028
+ TEST_ASSERT_EQUAL(EDHOC_TH_STATE_3, init_ctx->th_state);
1029
+ TEST_ASSERT_EQUAL(ARRAY_SIZE(TH_3), init_ctx->th_len);
1030
+ TEST_ASSERT_EQUAL_UINT8_ARRAY(init_ctx->th, TH_3, init_ctx->th_len);
1031
+
1032
+ TEST_ASSERT_EQUAL(EDHOC_PRK_STATE_3E2M, init_ctx->prk_state);
1033
+ TEST_ASSERT_EQUAL(ARRAY_SIZE(PRK_3e2m), init_ctx->prk_len);
1034
+ TEST_ASSERT_EQUAL_UINT8_ARRAY(PRK_3e2m, init_ctx->prk,
1035
+ init_ctx->prk_len);
1036
+
1037
+ TEST_ASSERT_EQUAL(ARRAY_SIZE(G_XY), init_ctx->dh_secret_len);
1038
+ TEST_ASSERT_EQUAL_UINT8_ARRAY(init_ctx->dh_secret, G_XY,
1039
+ sizeof(init_ctx->dh_secret));
1040
+
1041
+ TEST_ASSERT_EQUAL(EDHOC_CID_TYPE_BYTE_STRING,
1042
+ init_ctx->peer_cid.encode_type);
1043
+ TEST_ASSERT_EQUAL(ARRAY_SIZE(C_R), init_ctx->peer_cid.bstr_length);
1044
+ TEST_ASSERT_EQUAL_UINT8_ARRAY(C_R, init_ctx->peer_cid.bstr_value,
1045
+ init_ctx->peer_cid.bstr_length);
1046
+ }
1047
+
1048
+ TEST(rfc9529_chapter_2, message_3_compose)
1049
+ {
1050
+ /* Required injections. */
1051
+ init_ctx->status = EDHOC_SM_VERIFIED_M2;
1052
+ init_ctx->chosen_method = METHOD;
1053
+
1054
+ init_ctx->th_state = EDHOC_TH_STATE_3;
1055
+ init_ctx->th_len = ARRAY_SIZE(TH_3);
1056
+ memcpy(init_ctx->th, TH_3, ARRAY_SIZE(TH_3));
1057
+
1058
+ init_ctx->prk_state = EDHOC_PRK_STATE_3E2M;
1059
+ init_ctx->prk_len = ARRAY_SIZE(PRK_3e2m);
1060
+ memcpy(init_ctx->prk, PRK_3e2m, ARRAY_SIZE(PRK_3e2m));
1061
+
1062
+ init_ctx->dh_secret_len = ARRAY_SIZE(G_XY);
1063
+ memcpy(init_ctx->dh_secret, G_XY, ARRAY_SIZE(G_XY));
1064
+
1065
+ size_t msg_3_len = 0;
1066
+ uint8_t msg_3[ARRAY_SIZE(message_3)] = { 0 };
1067
+
1068
+ ret = edhoc_message_3_compose(init_ctx, msg_3, ARRAY_SIZE(msg_3),
1069
+ &msg_3_len);
1070
+
1071
+ TEST_ASSERT_EQUAL(EDHOC_SUCCESS, ret);
1072
+ TEST_ASSERT_EQUAL(EDHOC_SM_COMPLETED, init_ctx->status);
1073
+ TEST_ASSERT_EQUAL(true, init_ctx->is_oscore_export_allowed);
1074
+
1075
+ ret = edhoc_error_get_code(init_ctx, &error_code_recv);
1076
+ TEST_ASSERT_EQUAL(EDHOC_SUCCESS, ret);
1077
+ TEST_ASSERT_EQUAL(EDHOC_ERROR_CODE_SUCCESS, error_code_recv);
1078
+
1079
+ TEST_ASSERT_EQUAL(ARRAY_SIZE(message_3), msg_3_len);
1080
+ TEST_ASSERT_EQUAL_UINT8_ARRAY(message_3, msg_3, msg_3_len);
1081
+
1082
+ TEST_ASSERT_EQUAL(EDHOC_TH_STATE_4, init_ctx->th_state);
1083
+ TEST_ASSERT_EQUAL(ARRAY_SIZE(TH_4), init_ctx->th_len);
1084
+ TEST_ASSERT_EQUAL_UINT8_ARRAY(TH_4, init_ctx->th, init_ctx->th_len);
1085
+
1086
+ TEST_ASSERT_EQUAL(EDHOC_PRK_STATE_4E3M, init_ctx->prk_state);
1087
+ TEST_ASSERT_EQUAL(ARRAY_SIZE(PRK_4e3m), init_ctx->prk_len);
1088
+ TEST_ASSERT_EQUAL_UINT8_ARRAY(PRK_4e3m, init_ctx->prk,
1089
+ init_ctx->prk_len);
1090
+ }
1091
+
1092
+ TEST(rfc9529_chapter_2, message_3_compose_any)
1093
+ {
1094
+ ret = edhoc_bind_credentials(init_ctx,
1095
+ &edhoc_auth_cred_mocked_init_any);
1096
+ TEST_ASSERT_EQUAL(EDHOC_SUCCESS, ret);
1097
+
1098
+ /* Required injections. */
1099
+ init_ctx->status = EDHOC_SM_VERIFIED_M2;
1100
+ init_ctx->chosen_method = METHOD;
1101
+
1102
+ init_ctx->th_state = EDHOC_TH_STATE_3;
1103
+ init_ctx->th_len = ARRAY_SIZE(TH_3);
1104
+ memcpy(init_ctx->th, TH_3, ARRAY_SIZE(TH_3));
1105
+
1106
+ init_ctx->prk_state = EDHOC_PRK_STATE_3E2M;
1107
+ init_ctx->prk_len = ARRAY_SIZE(PRK_3e2m);
1108
+ memcpy(init_ctx->prk, PRK_3e2m, ARRAY_SIZE(PRK_3e2m));
1109
+
1110
+ init_ctx->dh_secret_len = ARRAY_SIZE(G_XY);
1111
+ memcpy(init_ctx->dh_secret, G_XY, ARRAY_SIZE(G_XY));
1112
+
1113
+ size_t msg_3_len = 0;
1114
+ uint8_t msg_3[ARRAY_SIZE(message_3)] = { 0 };
1115
+
1116
+ ret = edhoc_message_3_compose(init_ctx, msg_3, ARRAY_SIZE(msg_3),
1117
+ &msg_3_len);
1118
+
1119
+ TEST_ASSERT_EQUAL(EDHOC_SUCCESS, ret);
1120
+ TEST_ASSERT_EQUAL(EDHOC_SM_COMPLETED, init_ctx->status);
1121
+ TEST_ASSERT_EQUAL(true, init_ctx->is_oscore_export_allowed);
1122
+
1123
+ ret = edhoc_error_get_code(init_ctx, &error_code_recv);
1124
+ TEST_ASSERT_EQUAL(EDHOC_SUCCESS, ret);
1125
+ TEST_ASSERT_EQUAL(EDHOC_ERROR_CODE_SUCCESS, error_code_recv);
1126
+
1127
+ TEST_ASSERT_EQUAL(ARRAY_SIZE(message_3), msg_3_len);
1128
+ TEST_ASSERT_EQUAL_UINT8_ARRAY(message_3, msg_3, msg_3_len);
1129
+
1130
+ TEST_ASSERT_EQUAL(EDHOC_TH_STATE_4, init_ctx->th_state);
1131
+ TEST_ASSERT_EQUAL(ARRAY_SIZE(TH_4), init_ctx->th_len);
1132
+ TEST_ASSERT_EQUAL_UINT8_ARRAY(TH_4, init_ctx->th, init_ctx->th_len);
1133
+
1134
+ TEST_ASSERT_EQUAL(EDHOC_PRK_STATE_4E3M, init_ctx->prk_state);
1135
+ TEST_ASSERT_EQUAL(ARRAY_SIZE(PRK_4e3m), init_ctx->prk_len);
1136
+ TEST_ASSERT_EQUAL_UINT8_ARRAY(PRK_4e3m, init_ctx->prk,
1137
+ init_ctx->prk_len);
1138
+ }
1139
+
1140
+ TEST(rfc9529_chapter_2, message_3_process)
1141
+ {
1142
+ /* Required injections. */
1143
+ resp_ctx->status = EDHOC_SM_WAIT_M3;
1144
+ resp_ctx->chosen_method = METHOD;
1145
+
1146
+ resp_ctx->th_state = EDHOC_TH_STATE_3;
1147
+ resp_ctx->th_len = ARRAY_SIZE(TH_3);
1148
+ memcpy(resp_ctx->th, TH_3, ARRAY_SIZE(TH_3));
1149
+
1150
+ resp_ctx->prk_state = EDHOC_PRK_STATE_3E2M;
1151
+ resp_ctx->prk_len = ARRAY_SIZE(PRK_3e2m);
1152
+ memcpy(resp_ctx->prk, PRK_3e2m, ARRAY_SIZE(PRK_3e2m));
1153
+
1154
+ resp_ctx->dh_secret_len = ARRAY_SIZE(G_XY);
1155
+ memcpy(resp_ctx->dh_secret, G_XY, ARRAY_SIZE(G_XY));
1156
+
1157
+ ret = edhoc_message_3_process(resp_ctx, message_3,
1158
+ ARRAY_SIZE(message_3));
1159
+
1160
+ TEST_ASSERT_EQUAL(EDHOC_SUCCESS, ret);
1161
+ TEST_ASSERT_EQUAL(EDHOC_SM_COMPLETED, resp_ctx->status);
1162
+ TEST_ASSERT_EQUAL(true, resp_ctx->is_oscore_export_allowed);
1163
+
1164
+ ret = edhoc_error_get_code(resp_ctx, &error_code_recv);
1165
+ TEST_ASSERT_EQUAL(EDHOC_SUCCESS, ret);
1166
+ TEST_ASSERT_EQUAL(EDHOC_ERROR_CODE_SUCCESS, error_code_recv);
1167
+
1168
+ TEST_ASSERT_EQUAL(EDHOC_TH_STATE_4, resp_ctx->th_state);
1169
+ TEST_ASSERT_EQUAL(ARRAY_SIZE(TH_4), resp_ctx->th_len);
1170
+ TEST_ASSERT_EQUAL_UINT8_ARRAY(TH_4, resp_ctx->th, resp_ctx->th_len);
1171
+
1172
+ TEST_ASSERT_EQUAL(EDHOC_PRK_STATE_4E3M, resp_ctx->prk_state);
1173
+ TEST_ASSERT_EQUAL(ARRAY_SIZE(PRK_4e3m), resp_ctx->prk_len);
1174
+ TEST_ASSERT_EQUAL_UINT8_ARRAY(PRK_4e3m, resp_ctx->prk,
1175
+ resp_ctx->prk_len);
1176
+ }
1177
+
1178
+ TEST(rfc9529_chapter_2, message_4_compose)
1179
+ {
1180
+ /* Required injections. */
1181
+ resp_ctx->status = EDHOC_SM_COMPLETED;
1182
+ resp_ctx->is_oscore_export_allowed = true;
1183
+
1184
+ resp_ctx->th_state = EDHOC_TH_STATE_4;
1185
+ resp_ctx->th_len = ARRAY_SIZE(TH_4);
1186
+ memcpy(resp_ctx->th, TH_4, ARRAY_SIZE(TH_4));
1187
+
1188
+ resp_ctx->prk_state = EDHOC_PRK_STATE_4E3M;
1189
+ resp_ctx->prk_len = ARRAY_SIZE(PRK_4e3m);
1190
+ memcpy(resp_ctx->prk, PRK_4e3m, ARRAY_SIZE(PRK_4e3m));
1191
+
1192
+ size_t msg_4_len = 0;
1193
+ uint8_t msg_4[ARRAY_SIZE(message_4) + 1] = { 0 };
1194
+
1195
+ ret = edhoc_message_4_compose(resp_ctx, msg_4, ARRAY_SIZE(msg_4),
1196
+ &msg_4_len);
1197
+
1198
+ TEST_ASSERT_EQUAL(EDHOC_SUCCESS, ret);
1199
+ TEST_ASSERT_EQUAL(EDHOC_SM_PERSISTED, resp_ctx->status);
1200
+ TEST_ASSERT_EQUAL(true, resp_ctx->is_oscore_export_allowed);
1201
+
1202
+ ret = edhoc_error_get_code(resp_ctx, &error_code_recv);
1203
+ TEST_ASSERT_EQUAL(EDHOC_SUCCESS, ret);
1204
+ TEST_ASSERT_EQUAL(EDHOC_ERROR_CODE_SUCCESS, error_code_recv);
1205
+
1206
+ TEST_ASSERT_EQUAL(ARRAY_SIZE(message_4), msg_4_len);
1207
+ TEST_ASSERT_EQUAL_UINT8_ARRAY(message_4, msg_4, msg_4_len);
1208
+
1209
+ TEST_ASSERT_EQUAL(EDHOC_TH_STATE_4, resp_ctx->th_state);
1210
+ TEST_ASSERT_EQUAL(ARRAY_SIZE(TH_4), resp_ctx->th_len);
1211
+ TEST_ASSERT_EQUAL_UINT8_ARRAY(TH_4, resp_ctx->th, resp_ctx->th_len);
1212
+
1213
+ TEST_ASSERT_EQUAL(EDHOC_PRK_STATE_4E3M, resp_ctx->prk_state);
1214
+ TEST_ASSERT_EQUAL(ARRAY_SIZE(PRK_4e3m), resp_ctx->prk_len);
1215
+ TEST_ASSERT_EQUAL_UINT8_ARRAY(PRK_4e3m, resp_ctx->prk,
1216
+ resp_ctx->prk_len);
1217
+ }
1218
+
1219
+ TEST(rfc9529_chapter_2, message_4_process)
1220
+ {
1221
+ /* Required injections. */
1222
+ init_ctx->status = EDHOC_SM_COMPLETED;
1223
+ init_ctx->is_oscore_export_allowed = true;
1224
+
1225
+ init_ctx->th_state = EDHOC_TH_STATE_4;
1226
+ init_ctx->th_len = ARRAY_SIZE(TH_4);
1227
+ memcpy(init_ctx->th, TH_4, ARRAY_SIZE(TH_4));
1228
+
1229
+ init_ctx->prk_state = EDHOC_PRK_STATE_4E3M;
1230
+ init_ctx->prk_len = ARRAY_SIZE(PRK_4e3m);
1231
+ memcpy(init_ctx->prk, PRK_4e3m, ARRAY_SIZE(PRK_4e3m));
1232
+
1233
+ ret = edhoc_message_4_process(init_ctx, message_4,
1234
+ ARRAY_SIZE(message_4));
1235
+
1236
+ TEST_ASSERT_EQUAL(EDHOC_SUCCESS, ret);
1237
+ TEST_ASSERT_EQUAL(EDHOC_SM_PERSISTED, init_ctx->status);
1238
+ TEST_ASSERT_EQUAL(true, init_ctx->is_oscore_export_allowed);
1239
+
1240
+ ret = edhoc_error_get_code(init_ctx, &error_code_recv);
1241
+ TEST_ASSERT_EQUAL(EDHOC_SUCCESS, ret);
1242
+ TEST_ASSERT_EQUAL(EDHOC_ERROR_CODE_SUCCESS, error_code_recv);
1243
+
1244
+ TEST_ASSERT_EQUAL(EDHOC_TH_STATE_4, init_ctx->th_state);
1245
+ TEST_ASSERT_EQUAL(ARRAY_SIZE(TH_4), init_ctx->th_len);
1246
+ TEST_ASSERT_EQUAL_UINT8_ARRAY(TH_4, init_ctx->th, init_ctx->th_len);
1247
+
1248
+ TEST_ASSERT_EQUAL(EDHOC_PRK_STATE_4E3M, init_ctx->prk_state);
1249
+ TEST_ASSERT_EQUAL(ARRAY_SIZE(PRK_4e3m), init_ctx->prk_len);
1250
+ TEST_ASSERT_EQUAL_UINT8_ARRAY(PRK_4e3m, init_ctx->prk,
1251
+ init_ctx->prk_len);
1252
+ }
1253
+
1254
+ TEST(rfc9529_chapter_2, handshake)
1255
+ {
1256
+ uint8_t buffer[200] = { 0 };
1257
+
1258
+ memset(buffer, 0, sizeof(buffer));
1259
+ size_t msg_1_len = 0;
1260
+ uint8_t *msg_1 = buffer;
1261
+
1262
+ /* EDHOC message 1 compose. */
1263
+ ret = edhoc_message_1_compose(init_ctx, msg_1, ARRAY_SIZE(buffer),
1264
+ &msg_1_len);
1265
+
1266
+ TEST_ASSERT_EQUAL(EDHOC_SUCCESS, ret);
1267
+ TEST_ASSERT_EQUAL(EDHOC_SM_WAIT_M2, init_ctx->status);
1268
+ TEST_ASSERT_EQUAL(false, init_ctx->is_oscore_export_allowed);
1269
+
1270
+ ret = edhoc_error_get_code(init_ctx, &error_code_recv);
1271
+ TEST_ASSERT_EQUAL(EDHOC_SUCCESS, ret);
1272
+ TEST_ASSERT_EQUAL(EDHOC_ERROR_CODE_SUCCESS, error_code_recv);
1273
+
1274
+ TEST_ASSERT_EQUAL(ARRAY_SIZE(message_1), msg_1_len);
1275
+ TEST_ASSERT_EQUAL_UINT8_ARRAY(message_1, msg_1, msg_1_len);
1276
+
1277
+ TEST_ASSERT_EQUAL(EDHOC_PRK_STATE_INVALID, init_ctx->prk_state);
1278
+ TEST_ASSERT_EQUAL(0, init_ctx->prk_len);
1279
+
1280
+ TEST_ASSERT_EQUAL(EDHOC_TH_STATE_1, init_ctx->th_state);
1281
+ TEST_ASSERT_EQUAL(ARRAY_SIZE(H_message_1), init_ctx->th_len);
1282
+ TEST_ASSERT_EQUAL_UINT8_ARRAY(H_message_1, init_ctx->th,
1283
+ init_ctx->th_len);
1284
+
1285
+ TEST_ASSERT_EQUAL(ARRAY_SIZE(X), init_ctx->dh_priv_key_len);
1286
+ TEST_ASSERT_EQUAL_UINT8_ARRAY(X, init_ctx->dh_priv_key,
1287
+ init_ctx->dh_priv_key_len);
1288
+
1289
+ /* EDHOC message 1 process. */
1290
+ ret = edhoc_message_1_process(resp_ctx, msg_1, msg_1_len);
1291
+
1292
+ TEST_ASSERT_EQUAL(EDHOC_SUCCESS, ret);
1293
+ TEST_ASSERT_EQUAL(EDHOC_SM_RECEIVED_M1, resp_ctx->status);
1294
+ TEST_ASSERT_EQUAL(false, resp_ctx->is_oscore_export_allowed);
1295
+
1296
+ ret = edhoc_error_get_code(resp_ctx, &error_code_recv);
1297
+ TEST_ASSERT_EQUAL(EDHOC_SUCCESS, ret);
1298
+ TEST_ASSERT_EQUAL(EDHOC_ERROR_CODE_SUCCESS, error_code_recv);
1299
+
1300
+ TEST_ASSERT_EQUAL(EDHOC_TH_STATE_1, resp_ctx->th_state);
1301
+ TEST_ASSERT_EQUAL(ARRAY_SIZE(H_message_1), resp_ctx->th_len);
1302
+ TEST_ASSERT_EQUAL_UINT8_ARRAY(H_message_1, resp_ctx->th,
1303
+ resp_ctx->th_len);
1304
+
1305
+ TEST_ASSERT_EQUAL(EDHOC_PRK_STATE_INVALID, resp_ctx->prk_state);
1306
+ TEST_ASSERT_EQUAL(0, resp_ctx->prk_len);
1307
+
1308
+ TEST_ASSERT_EQUAL(EDHOC_CID_TYPE_ONE_BYTE_INTEGER,
1309
+ resp_ctx->peer_cid.encode_type);
1310
+ TEST_ASSERT_EQUAL((int8_t)C_I[0], resp_ctx->peer_cid.int_value);
1311
+
1312
+ TEST_ASSERT_EQUAL(ARRAY_SIZE(G_X), resp_ctx->dh_peer_pub_key_len);
1313
+ TEST_ASSERT_EQUAL_UINT8_ARRAY(G_X, resp_ctx->dh_peer_pub_key,
1314
+ resp_ctx->dh_peer_pub_key_len);
1315
+
1316
+ memset(buffer, 0, sizeof(buffer));
1317
+ size_t msg_2_len = 0;
1318
+ uint8_t *msg_2 = buffer;
1319
+
1320
+ /* EDHOC message 2 compose. */
1321
+ ret = edhoc_message_2_compose(resp_ctx, msg_2, ARRAY_SIZE(buffer),
1322
+ &msg_2_len);
1323
+
1324
+ TEST_ASSERT_EQUAL(EDHOC_SUCCESS, ret);
1325
+ TEST_ASSERT_EQUAL(EDHOC_SM_WAIT_M3, resp_ctx->status);
1326
+ TEST_ASSERT_EQUAL(false, resp_ctx->is_oscore_export_allowed);
1327
+
1328
+ ret = edhoc_error_get_code(resp_ctx, &error_code_recv);
1329
+ TEST_ASSERT_EQUAL(EDHOC_SUCCESS, ret);
1330
+ TEST_ASSERT_EQUAL(EDHOC_ERROR_CODE_SUCCESS, error_code_recv);
1331
+
1332
+ TEST_ASSERT_EQUAL(ARRAY_SIZE(message_2), msg_2_len);
1333
+ TEST_ASSERT_EQUAL_UINT8_ARRAY(message_2, msg_2, msg_2_len);
1334
+
1335
+ TEST_ASSERT_EQUAL(EDHOC_TH_STATE_3, resp_ctx->th_state);
1336
+ TEST_ASSERT_EQUAL(ARRAY_SIZE(TH_3), resp_ctx->th_len);
1337
+ TEST_ASSERT_EQUAL_UINT8_ARRAY(TH_3, resp_ctx->th, resp_ctx->th_len);
1338
+
1339
+ TEST_ASSERT_EQUAL(EDHOC_PRK_STATE_3E2M, resp_ctx->prk_state);
1340
+ TEST_ASSERT_EQUAL(ARRAY_SIZE(PRK_3e2m), resp_ctx->prk_len);
1341
+ TEST_ASSERT_EQUAL_UINT8_ARRAY(PRK_3e2m, resp_ctx->prk,
1342
+ resp_ctx->prk_len);
1343
+
1344
+ TEST_ASSERT_EQUAL(ARRAY_SIZE(G_XY), resp_ctx->dh_secret_len);
1345
+ TEST_ASSERT_EQUAL_UINT8_ARRAY(G_XY, resp_ctx->dh_secret,
1346
+ resp_ctx->dh_secret_len);
1347
+
1348
+ /* EDHOC message 2 process. */
1349
+ ret = edhoc_message_2_process(init_ctx, msg_2, msg_2_len);
1350
+
1351
+ TEST_ASSERT_EQUAL(EDHOC_SUCCESS, ret);
1352
+ TEST_ASSERT_EQUAL(EDHOC_SM_VERIFIED_M2, init_ctx->status);
1353
+
1354
+ ret = edhoc_error_get_code(init_ctx, &error_code_recv);
1355
+ TEST_ASSERT_EQUAL(EDHOC_SUCCESS, ret);
1356
+ TEST_ASSERT_EQUAL(EDHOC_ERROR_CODE_SUCCESS, error_code_recv);
1357
+
1358
+ TEST_ASSERT_EQUAL(EDHOC_TH_STATE_3, init_ctx->th_state);
1359
+ TEST_ASSERT_EQUAL(ARRAY_SIZE(TH_3), init_ctx->th_len);
1360
+ TEST_ASSERT_EQUAL_UINT8_ARRAY(TH_3, init_ctx->th, init_ctx->th_len);
1361
+ TEST_ASSERT_EQUAL(false, init_ctx->is_oscore_export_allowed);
1362
+
1363
+ TEST_ASSERT_EQUAL(EDHOC_PRK_STATE_3E2M, init_ctx->prk_state);
1364
+ TEST_ASSERT_EQUAL(ARRAY_SIZE(PRK_3e2m), init_ctx->prk_len);
1365
+ TEST_ASSERT_EQUAL_UINT8_ARRAY(PRK_3e2m, init_ctx->prk,
1366
+ init_ctx->prk_len);
1367
+
1368
+ TEST_ASSERT_EQUAL(ARRAY_SIZE(G_XY), init_ctx->dh_secret_len);
1369
+ TEST_ASSERT_EQUAL_UINT8_ARRAY(G_XY, init_ctx->dh_secret,
1370
+ init_ctx->dh_secret_len);
1371
+
1372
+ TEST_ASSERT_EQUAL(EDHOC_CID_TYPE_BYTE_STRING,
1373
+ init_ctx->peer_cid.encode_type);
1374
+ TEST_ASSERT_EQUAL(ARRAY_SIZE(C_R), init_ctx->peer_cid.bstr_length);
1375
+ TEST_ASSERT_EQUAL_UINT8_ARRAY(C_R, init_ctx->peer_cid.bstr_value,
1376
+ init_ctx->peer_cid.bstr_length);
1377
+
1378
+ memset(buffer, 0, sizeof(buffer));
1379
+ size_t msg_3_len = 0;
1380
+ uint8_t *msg_3 = buffer;
1381
+
1382
+ /* EDHOC message 3 compose. */
1383
+ ret = edhoc_message_3_compose(init_ctx, msg_3, ARRAY_SIZE(buffer),
1384
+ &msg_3_len);
1385
+
1386
+ TEST_ASSERT_EQUAL(EDHOC_SUCCESS, ret);
1387
+ TEST_ASSERT_EQUAL(EDHOC_SM_COMPLETED, init_ctx->status);
1388
+ TEST_ASSERT_EQUAL(true, init_ctx->is_oscore_export_allowed);
1389
+
1390
+ ret = edhoc_error_get_code(init_ctx, &error_code_recv);
1391
+ TEST_ASSERT_EQUAL(EDHOC_SUCCESS, ret);
1392
+ TEST_ASSERT_EQUAL(EDHOC_ERROR_CODE_SUCCESS, error_code_recv);
1393
+
1394
+ TEST_ASSERT_EQUAL(ARRAY_SIZE(message_3), msg_3_len);
1395
+ TEST_ASSERT_EQUAL_UINT8_ARRAY(message_3, msg_3, msg_3_len);
1396
+
1397
+ TEST_ASSERT_EQUAL(EDHOC_TH_STATE_4, init_ctx->th_state);
1398
+ TEST_ASSERT_EQUAL(ARRAY_SIZE(TH_4), init_ctx->th_len);
1399
+ TEST_ASSERT_EQUAL_UINT8_ARRAY(TH_4, init_ctx->th, init_ctx->th_len);
1400
+
1401
+ TEST_ASSERT_EQUAL(EDHOC_PRK_STATE_4E3M, init_ctx->prk_state);
1402
+ TEST_ASSERT_EQUAL(ARRAY_SIZE(PRK_4e3m), init_ctx->prk_len);
1403
+ TEST_ASSERT_EQUAL_UINT8_ARRAY(PRK_4e3m, init_ctx->prk,
1404
+ init_ctx->prk_len);
1405
+
1406
+ /* EDHOC message 3 process. */
1407
+ ret = edhoc_message_3_process(resp_ctx, msg_3, msg_3_len);
1408
+
1409
+ TEST_ASSERT_EQUAL(EDHOC_SUCCESS, ret);
1410
+ TEST_ASSERT_EQUAL(EDHOC_SM_COMPLETED, resp_ctx->status);
1411
+ TEST_ASSERT_EQUAL(true, resp_ctx->is_oscore_export_allowed);
1412
+
1413
+ ret = edhoc_error_get_code(resp_ctx, &error_code_recv);
1414
+ TEST_ASSERT_EQUAL(EDHOC_SUCCESS, ret);
1415
+ TEST_ASSERT_EQUAL(EDHOC_ERROR_CODE_SUCCESS, error_code_recv);
1416
+
1417
+ TEST_ASSERT_EQUAL(EDHOC_TH_STATE_4, resp_ctx->th_state);
1418
+ TEST_ASSERT_EQUAL(ARRAY_SIZE(TH_4), resp_ctx->th_len);
1419
+ TEST_ASSERT_EQUAL_UINT8_ARRAY(TH_4, resp_ctx->th, resp_ctx->th_len);
1420
+
1421
+ TEST_ASSERT_EQUAL(EDHOC_PRK_STATE_4E3M, resp_ctx->prk_state);
1422
+ TEST_ASSERT_EQUAL(ARRAY_SIZE(PRK_4e3m), resp_ctx->prk_len);
1423
+ TEST_ASSERT_EQUAL_UINT8_ARRAY(PRK_4e3m, resp_ctx->prk,
1424
+ resp_ctx->prk_len);
1425
+
1426
+ memset(buffer, 0, sizeof(buffer));
1427
+ size_t msg_4_len = 0;
1428
+ uint8_t *msg_4 = buffer;
1429
+
1430
+ /* EDHOC message 4 compose. */
1431
+ ret = edhoc_message_4_compose(resp_ctx, msg_4, ARRAY_SIZE(buffer),
1432
+ &msg_4_len);
1433
+
1434
+ TEST_ASSERT_EQUAL(EDHOC_SUCCESS, ret);
1435
+ TEST_ASSERT_EQUAL(EDHOC_SM_PERSISTED, resp_ctx->status);
1436
+ TEST_ASSERT_EQUAL(true, resp_ctx->is_oscore_export_allowed);
1437
+
1438
+ ret = edhoc_error_get_code(resp_ctx, &error_code_recv);
1439
+ TEST_ASSERT_EQUAL(EDHOC_SUCCESS, ret);
1440
+ TEST_ASSERT_EQUAL(EDHOC_ERROR_CODE_SUCCESS, error_code_recv);
1441
+
1442
+ TEST_ASSERT_EQUAL(ARRAY_SIZE(message_4), msg_4_len);
1443
+ TEST_ASSERT_EQUAL_UINT8_ARRAY(message_4, msg_4, msg_4_len);
1444
+
1445
+ TEST_ASSERT_EQUAL(EDHOC_TH_STATE_4, resp_ctx->th_state);
1446
+ TEST_ASSERT_EQUAL(ARRAY_SIZE(TH_4), resp_ctx->th_len);
1447
+ TEST_ASSERT_EQUAL_UINT8_ARRAY(TH_4, resp_ctx->th, resp_ctx->th_len);
1448
+
1449
+ TEST_ASSERT_EQUAL(EDHOC_PRK_STATE_4E3M, resp_ctx->prk_state);
1450
+ TEST_ASSERT_EQUAL(ARRAY_SIZE(PRK_4e3m), resp_ctx->prk_len);
1451
+ TEST_ASSERT_EQUAL_UINT8_ARRAY(PRK_4e3m, resp_ctx->prk,
1452
+ resp_ctx->prk_len);
1453
+
1454
+ /* EDHOC message 4 process. */
1455
+ ret = edhoc_message_4_process(init_ctx, msg_4, msg_4_len);
1456
+
1457
+ TEST_ASSERT_EQUAL(EDHOC_SUCCESS, ret);
1458
+ TEST_ASSERT_EQUAL(EDHOC_SM_PERSISTED, init_ctx->status);
1459
+ TEST_ASSERT_EQUAL(true, init_ctx->is_oscore_export_allowed);
1460
+
1461
+ ret = edhoc_error_get_code(init_ctx, &error_code_recv);
1462
+ TEST_ASSERT_EQUAL(EDHOC_SUCCESS, ret);
1463
+ TEST_ASSERT_EQUAL(EDHOC_ERROR_CODE_SUCCESS, error_code_recv);
1464
+
1465
+ TEST_ASSERT_EQUAL(EDHOC_TH_STATE_4, init_ctx->th_state);
1466
+ TEST_ASSERT_EQUAL(ARRAY_SIZE(TH_4), init_ctx->th_len);
1467
+ TEST_ASSERT_EQUAL_UINT8_ARRAY(TH_4, init_ctx->th, init_ctx->th_len);
1468
+
1469
+ TEST_ASSERT_EQUAL(EDHOC_PRK_STATE_4E3M, init_ctx->prk_state);
1470
+ TEST_ASSERT_EQUAL(ARRAY_SIZE(PRK_4e3m), init_ctx->prk_len);
1471
+ TEST_ASSERT_EQUAL_UINT8_ARRAY(PRK_4e3m, init_ctx->prk,
1472
+ init_ctx->prk_len);
1473
+
1474
+ uint8_t init_master_secret[ARRAY_SIZE(OSCORE_Master_Secret)] = { 0 };
1475
+ uint8_t init_master_salt[ARRAY_SIZE(OSCORE_Master_Salt)] = { 0 };
1476
+ size_t init_sender_id_len = 0;
1477
+ uint8_t init_sender_id[ARRAY_SIZE(C_R)] = { 0 };
1478
+ size_t init_recipient_id_len = 0;
1479
+ uint8_t init_recipient_id[ARRAY_SIZE(C_I)] = { 0 };
1480
+
1481
+ /* Derive OSCORE master secret and master salt. */
1482
+ ret = edhoc_export_oscore_session(
1483
+ init_ctx, init_master_secret, ARRAY_SIZE(init_master_secret),
1484
+ init_master_salt, ARRAY_SIZE(init_master_salt), init_sender_id,
1485
+ ARRAY_SIZE(init_sender_id), &init_sender_id_len,
1486
+ init_recipient_id, ARRAY_SIZE(init_recipient_id),
1487
+ &init_recipient_id_len);
1488
+
1489
+ TEST_ASSERT_EQUAL(EDHOC_SUCCESS, ret);
1490
+ TEST_ASSERT_EQUAL(EDHOC_SM_PERSISTED, init_ctx->status);
1491
+ TEST_ASSERT_EQUAL(false, init_ctx->is_oscore_export_allowed);
1492
+
1493
+ TEST_ASSERT_EQUAL(EDHOC_PRK_STATE_OUT, init_ctx->prk_state);
1494
+ TEST_ASSERT_EQUAL(ARRAY_SIZE(PRK_out), init_ctx->prk_len);
1495
+ TEST_ASSERT_EQUAL_UINT8_ARRAY(PRK_out, init_ctx->prk,
1496
+ init_ctx->prk_len);
1497
+
1498
+ uint8_t resp_master_secret[ARRAY_SIZE(OSCORE_Master_Secret)] = { 0 };
1499
+ uint8_t resp_master_salt[ARRAY_SIZE(OSCORE_Master_Salt)] = { 0 };
1500
+ size_t resp_sender_id_len = 0;
1501
+ uint8_t resp_sender_id[ARRAY_SIZE(C_I)] = { 0 };
1502
+ size_t resp_recipient_id_len = 0;
1503
+ uint8_t resp_recipient_id[ARRAY_SIZE(C_R)] = { 0 };
1504
+
1505
+ /* Derive OSCORE master secret and master salt. */
1506
+ ret = edhoc_export_oscore_session(
1507
+ resp_ctx, resp_master_secret, ARRAY_SIZE(resp_master_secret),
1508
+ resp_master_salt, ARRAY_SIZE(resp_master_salt), resp_sender_id,
1509
+ ARRAY_SIZE(resp_sender_id), &resp_sender_id_len,
1510
+ resp_recipient_id, ARRAY_SIZE(resp_recipient_id),
1511
+ &resp_recipient_id_len);
1512
+
1513
+ TEST_ASSERT_EQUAL(EDHOC_SUCCESS, ret);
1514
+ TEST_ASSERT_EQUAL(EDHOC_SM_PERSISTED, resp_ctx->status);
1515
+ TEST_ASSERT_EQUAL(false, resp_ctx->is_oscore_export_allowed);
1516
+
1517
+ TEST_ASSERT_EQUAL(EDHOC_PRK_STATE_OUT, resp_ctx->prk_state);
1518
+ TEST_ASSERT_EQUAL(ARRAY_SIZE(PRK_out), resp_ctx->prk_len);
1519
+ TEST_ASSERT_EQUAL_UINT8_ARRAY(PRK_out, resp_ctx->prk,
1520
+ resp_ctx->prk_len);
1521
+
1522
+ TEST_ASSERT_EQUAL_UINT8_ARRAY(init_master_secret, resp_master_secret,
1523
+ ARRAY_SIZE(resp_master_secret));
1524
+ TEST_ASSERT_EQUAL_UINT8_ARRAY(OSCORE_Master_Secret, init_master_secret,
1525
+ ARRAY_SIZE(init_master_secret));
1526
+ TEST_ASSERT_EQUAL_UINT8_ARRAY(OSCORE_Master_Secret, resp_master_secret,
1527
+ ARRAY_SIZE(resp_master_secret));
1528
+
1529
+ TEST_ASSERT_EQUAL_UINT8_ARRAY(init_master_salt, resp_master_salt,
1530
+ ARRAY_SIZE(resp_master_salt));
1531
+ TEST_ASSERT_EQUAL_UINT8_ARRAY(OSCORE_Master_Salt, init_master_salt,
1532
+ ARRAY_SIZE(init_master_salt));
1533
+ TEST_ASSERT_EQUAL_UINT8_ARRAY(OSCORE_Master_Salt, resp_master_salt,
1534
+ ARRAY_SIZE(resp_master_salt));
1535
+
1536
+ TEST_ASSERT_EQUAL(ARRAY_SIZE(C_I), init_recipient_id_len);
1537
+ TEST_ASSERT_EQUAL_UINT8_ARRAY(C_I, init_recipient_id,
1538
+ init_recipient_id_len);
1539
+ TEST_ASSERT_EQUAL(ARRAY_SIZE(C_I), resp_sender_id_len);
1540
+ TEST_ASSERT_EQUAL_UINT8_ARRAY(C_I, resp_sender_id, resp_sender_id_len);
1541
+
1542
+ TEST_ASSERT_EQUAL(ARRAY_SIZE(C_R), init_sender_id_len);
1543
+ TEST_ASSERT_EQUAL_UINT8_ARRAY(C_R, init_sender_id, init_sender_id_len);
1544
+ TEST_ASSERT_EQUAL(ARRAY_SIZE(C_R), resp_recipient_id_len);
1545
+ TEST_ASSERT_EQUAL_UINT8_ARRAY(C_R, resp_recipient_id,
1546
+ resp_recipient_id_len);
1547
+
1548
+ TEST_ASSERT_EQUAL(init_sender_id_len, resp_recipient_id_len);
1549
+ TEST_ASSERT_EQUAL_UINT8_ARRAY(init_sender_id, resp_recipient_id,
1550
+ init_sender_id_len);
1551
+ TEST_ASSERT_EQUAL(init_recipient_id_len, resp_sender_id_len);
1552
+ TEST_ASSERT_EQUAL_UINT8_ARRAY(init_recipient_id, resp_sender_id,
1553
+ resp_sender_id_len);
1554
+
1555
+ /* EDHOC key update method. */
1556
+ ret = edhoc_export_key_update(init_ctx, keyUpdate_context,
1557
+ ARRAY_SIZE(keyUpdate_context));
1558
+
1559
+ TEST_ASSERT_EQUAL(EDHOC_SUCCESS, ret);
1560
+ TEST_ASSERT_EQUAL(EDHOC_SM_PERSISTED, init_ctx->status);
1561
+ TEST_ASSERT_EQUAL(true, init_ctx->is_oscore_export_allowed);
1562
+
1563
+ TEST_ASSERT_EQUAL(EDHOC_PRK_STATE_OUT, init_ctx->prk_state);
1564
+ TEST_ASSERT_EQUAL(ARRAY_SIZE(keyUpdate_PRK_out), init_ctx->prk_len);
1565
+ TEST_ASSERT_EQUAL_UINT8_ARRAY(keyUpdate_PRK_out, init_ctx->prk,
1566
+ init_ctx->prk_len);
1567
+
1568
+ /* EDHOC key update method. */
1569
+ ret = edhoc_export_key_update(resp_ctx, keyUpdate_context,
1570
+ ARRAY_SIZE(keyUpdate_context));
1571
+
1572
+ TEST_ASSERT_EQUAL(EDHOC_SUCCESS, ret);
1573
+ TEST_ASSERT_EQUAL(EDHOC_SM_PERSISTED, resp_ctx->status);
1574
+ TEST_ASSERT_EQUAL(true, resp_ctx->is_oscore_export_allowed);
1575
+
1576
+ TEST_ASSERT_EQUAL(EDHOC_PRK_STATE_OUT, resp_ctx->prk_state);
1577
+ TEST_ASSERT_EQUAL(ARRAY_SIZE(keyUpdate_PRK_out), resp_ctx->prk_len);
1578
+ TEST_ASSERT_EQUAL_UINT8_ARRAY(keyUpdate_PRK_out, resp_ctx->prk,
1579
+ resp_ctx->prk_len);
1580
+
1581
+ memset(init_master_secret, 0, sizeof(init_master_secret));
1582
+ memset(init_master_salt, 0, sizeof(init_master_salt));
1583
+ init_sender_id_len = 0;
1584
+ memset(init_sender_id, 0, sizeof(init_sender_id));
1585
+ init_recipient_id_len = 0;
1586
+ memset(init_recipient_id, 0, sizeof(init_recipient_id));
1587
+
1588
+ /* Derive OSCORE master secret and master salt. */
1589
+ ret = edhoc_export_oscore_session(
1590
+ init_ctx, init_master_secret, ARRAY_SIZE(init_master_secret),
1591
+ init_master_salt, ARRAY_SIZE(init_master_salt), init_sender_id,
1592
+ ARRAY_SIZE(init_sender_id), &init_sender_id_len,
1593
+ init_recipient_id, ARRAY_SIZE(init_recipient_id),
1594
+ &init_recipient_id_len);
1595
+
1596
+ TEST_ASSERT_EQUAL(EDHOC_SUCCESS, ret);
1597
+ TEST_ASSERT_EQUAL(EDHOC_SM_PERSISTED, init_ctx->status);
1598
+ TEST_ASSERT_EQUAL(false, init_ctx->is_oscore_export_allowed);
1599
+
1600
+ memset(resp_master_secret, 0, sizeof(resp_master_secret));
1601
+ memset(resp_master_salt, 0, sizeof(resp_master_salt));
1602
+ resp_sender_id_len = 0;
1603
+ memset(resp_sender_id, 0, sizeof(resp_sender_id));
1604
+ resp_recipient_id_len = 0;
1605
+ memset(resp_recipient_id, 0, sizeof(resp_recipient_id));
1606
+
1607
+ /* Derive OSCORE master secret and master salt. */
1608
+ ret = edhoc_export_oscore_session(
1609
+ resp_ctx, resp_master_secret, ARRAY_SIZE(resp_master_secret),
1610
+ resp_master_salt, ARRAY_SIZE(resp_master_salt), resp_sender_id,
1611
+ ARRAY_SIZE(resp_sender_id), &resp_sender_id_len,
1612
+ resp_recipient_id, ARRAY_SIZE(resp_recipient_id),
1613
+ &resp_recipient_id_len);
1614
+
1615
+ TEST_ASSERT_EQUAL(EDHOC_SUCCESS, ret);
1616
+ TEST_ASSERT_EQUAL(EDHOC_SM_PERSISTED, resp_ctx->status);
1617
+ TEST_ASSERT_EQUAL(false, resp_ctx->is_oscore_export_allowed);
1618
+
1619
+ TEST_ASSERT_EQUAL_UINT8_ARRAY(init_master_secret, resp_master_secret,
1620
+ ARRAY_SIZE(resp_master_secret));
1621
+ TEST_ASSERT_EQUAL_UINT8_ARRAY(keyUpdate_OSCORE_Master_Secret,
1622
+ init_master_secret,
1623
+ ARRAY_SIZE(init_master_secret));
1624
+ TEST_ASSERT_EQUAL_UINT8_ARRAY(keyUpdate_OSCORE_Master_Secret,
1625
+ resp_master_secret,
1626
+ ARRAY_SIZE(resp_master_secret));
1627
+
1628
+ TEST_ASSERT_EQUAL_UINT8_ARRAY(init_master_salt, resp_master_salt,
1629
+ ARRAY_SIZE(resp_master_salt));
1630
+ TEST_ASSERT_EQUAL_UINT8_ARRAY(keyUpdate_OSCORE_Master_Salt,
1631
+ init_master_salt,
1632
+ ARRAY_SIZE(init_master_salt));
1633
+ TEST_ASSERT_EQUAL_UINT8_ARRAY(keyUpdate_OSCORE_Master_Salt,
1634
+ resp_master_salt,
1635
+ ARRAY_SIZE(resp_master_salt));
1636
+
1637
+ TEST_ASSERT_EQUAL(ARRAY_SIZE(C_I), init_recipient_id_len);
1638
+ TEST_ASSERT_EQUAL_UINT8_ARRAY(C_I, init_recipient_id,
1639
+ init_recipient_id_len);
1640
+ TEST_ASSERT_EQUAL(ARRAY_SIZE(C_I), resp_sender_id_len);
1641
+ TEST_ASSERT_EQUAL_UINT8_ARRAY(C_I, resp_sender_id, resp_sender_id_len);
1642
+
1643
+ TEST_ASSERT_EQUAL(ARRAY_SIZE(C_R), init_sender_id_len);
1644
+ TEST_ASSERT_EQUAL_UINT8_ARRAY(C_R, init_sender_id, init_sender_id_len);
1645
+ TEST_ASSERT_EQUAL(ARRAY_SIZE(C_R), resp_recipient_id_len);
1646
+ TEST_ASSERT_EQUAL_UINT8_ARRAY(C_R, resp_recipient_id,
1647
+ resp_recipient_id_len);
1648
+
1649
+ TEST_ASSERT_EQUAL(init_sender_id_len, resp_recipient_id_len);
1650
+ TEST_ASSERT_EQUAL_UINT8_ARRAY(init_sender_id, resp_recipient_id,
1651
+ init_sender_id_len);
1652
+ TEST_ASSERT_EQUAL(init_recipient_id_len, resp_sender_id_len);
1653
+ TEST_ASSERT_EQUAL_UINT8_ARRAY(init_recipient_id, resp_sender_id,
1654
+ resp_sender_id_len);
1655
+ }
1656
+
1657
+ TEST(rfc9529_chapter_2, prk_exporter)
1658
+ {
1659
+ /* Required injections. */
1660
+ init_ctx->status = EDHOC_SM_COMPLETED;
1661
+
1662
+ init_ctx->th_state = EDHOC_TH_STATE_4;
1663
+ init_ctx->th_len = ARRAY_SIZE(TH_4);
1664
+ memcpy(init_ctx->th, TH_4, ARRAY_SIZE(TH_4));
1665
+
1666
+ init_ctx->prk_state = EDHOC_PRK_STATE_4E3M;
1667
+ init_ctx->prk_len = ARRAY_SIZE(PRK_4e3m);
1668
+ memcpy(init_ctx->prk, PRK_4e3m, ARRAY_SIZE(PRK_4e3m));
1669
+
1670
+ uint8_t master_secret[ARRAY_SIZE(OSCORE_Master_Secret)] = { 0 };
1671
+
1672
+ /* EDHOC PRK exporter - OSCORE master secret. */
1673
+ ret = edhoc_export_prk_exporter(init_ctx,
1674
+ OSCORE_EXTRACT_LABEL_MASTER_SECRET,
1675
+ master_secret,
1676
+ ARRAY_SIZE(master_secret));
1677
+ TEST_ASSERT_EQUAL(EDHOC_SUCCESS, ret);
1678
+ TEST_ASSERT_EQUAL_UINT8_ARRAY(OSCORE_Master_Secret, master_secret,
1679
+ ARRAY_SIZE(OSCORE_Master_Secret));
1680
+
1681
+ uint8_t master_salt[ARRAY_SIZE(OSCORE_Master_Salt)] = { 0 };
1682
+
1683
+ /* EDHOC PRK exporter - OSCORE master salt. */
1684
+ ret = edhoc_export_prk_exporter(init_ctx,
1685
+ OSCORE_EXTRACT_LABEL_MASTER_SALT,
1686
+ master_salt, ARRAY_SIZE(master_salt));
1687
+ TEST_ASSERT_EQUAL(EDHOC_SUCCESS, ret);
1688
+ TEST_ASSERT_EQUAL_UINT8_ARRAY(OSCORE_Master_Salt, master_salt,
1689
+ ARRAY_SIZE(OSCORE_Master_Salt));
1690
+
1691
+ /* Export private usage secrets (label: minimum, middle, maximum). */
1692
+ uint8_t secret_1[13] = { 0 };
1693
+ uint8_t secret_2[32] = { 0 };
1694
+ uint8_t secret_3[64] = { 0 };
1695
+
1696
+ ret = edhoc_export_prk_exporter(
1697
+ init_ctx, EDHOC_PRK_EXPORTER_PRIVATE_LABEL_MINIMUM, secret_1,
1698
+ ARRAY_SIZE(secret_1));
1699
+ TEST_ASSERT_EQUAL(EDHOC_SUCCESS, ret);
1700
+
1701
+ #if defined(TEST_TRACES)
1702
+ print_array(NULL, "Secret 1", secret_1, ARRAY_SIZE(secret_1));
1703
+ #endif
1704
+
1705
+ ret = edhoc_export_prk_exporter(
1706
+ init_ctx, EDHOC_PRK_EXPORTER_PRIVATE_LABEL_MAXIMUM, secret_2,
1707
+ ARRAY_SIZE(secret_2));
1708
+ TEST_ASSERT_EQUAL(EDHOC_SUCCESS, ret);
1709
+
1710
+ #if defined(TEST_TRACES)
1711
+ print_array(NULL, "Secret 2", secret_2, ARRAY_SIZE(secret_2));
1712
+ #endif
1713
+
1714
+ const size_t label = 45737;
1715
+ ret = edhoc_export_prk_exporter(init_ctx, label, secret_3,
1716
+ ARRAY_SIZE(secret_3));
1717
+ TEST_ASSERT_EQUAL(EDHOC_SUCCESS, ret);
1718
+
1719
+ #if defined(TEST_TRACES)
1720
+ print_array(NULL, "Secret 3", secret_3, ARRAY_SIZE(secret_3));
1721
+ #endif
1722
+ }
1723
+
1724
+ TEST(rfc9529_chapter_2, handshake_real_crypto)
1725
+ {
1726
+ uint8_t buffer[200] = { 0 };
1727
+
1728
+ /* Required injections. */
1729
+ ret = edhoc_bind_crypto(init_ctx, &edhoc_crypto);
1730
+ TEST_ASSERT_EQUAL(EDHOC_SUCCESS, ret);
1731
+
1732
+ ret = edhoc_bind_crypto(resp_ctx, &edhoc_crypto);
1733
+ TEST_ASSERT_EQUAL(EDHOC_SUCCESS, ret);
1734
+
1735
+ memset(buffer, 0, sizeof(buffer));
1736
+ size_t msg_1_len = 0;
1737
+ uint8_t *msg_1 = buffer;
1738
+
1739
+ /* EDHOC message 1 compose. */
1740
+ ret = edhoc_message_1_compose(init_ctx, msg_1, ARRAY_SIZE(buffer),
1741
+ &msg_1_len);
1742
+ TEST_ASSERT_EQUAL(EDHOC_SUCCESS, ret);
1743
+ TEST_ASSERT_EQUAL(EDHOC_SM_WAIT_M2, init_ctx->status);
1744
+ TEST_ASSERT_EQUAL(false, init_ctx->is_oscore_export_allowed);
1745
+ TEST_ASSERT_EQUAL(EDHOC_PRK_STATE_INVALID, init_ctx->prk_state);
1746
+ TEST_ASSERT_EQUAL(EDHOC_TH_STATE_1, init_ctx->th_state);
1747
+
1748
+ ret = edhoc_error_get_code(init_ctx, &error_code_recv);
1749
+ TEST_ASSERT_EQUAL(EDHOC_SUCCESS, ret);
1750
+ TEST_ASSERT_EQUAL(EDHOC_ERROR_CODE_SUCCESS, error_code_recv);
1751
+
1752
+ /* EDHOC message 1 process. */
1753
+ ret = edhoc_message_1_process(resp_ctx, msg_1, msg_1_len);
1754
+ TEST_ASSERT_EQUAL(EDHOC_SUCCESS, ret);
1755
+ TEST_ASSERT_EQUAL(EDHOC_SM_RECEIVED_M1, resp_ctx->status);
1756
+ TEST_ASSERT_EQUAL(false, resp_ctx->is_oscore_export_allowed);
1757
+ TEST_ASSERT_EQUAL(EDHOC_TH_STATE_1, resp_ctx->th_state);
1758
+ TEST_ASSERT_EQUAL(EDHOC_PRK_STATE_INVALID, resp_ctx->prk_state);
1759
+
1760
+ ret = edhoc_error_get_code(resp_ctx, &error_code_recv);
1761
+ TEST_ASSERT_EQUAL(EDHOC_SUCCESS, ret);
1762
+ TEST_ASSERT_EQUAL(EDHOC_ERROR_CODE_SUCCESS, error_code_recv);
1763
+
1764
+ TEST_ASSERT_EQUAL(EDHOC_CID_TYPE_ONE_BYTE_INTEGER,
1765
+ resp_ctx->peer_cid.encode_type);
1766
+ TEST_ASSERT_EQUAL((int8_t)C_I[0], resp_ctx->peer_cid.int_value);
1767
+
1768
+ memset(buffer, 0, sizeof(buffer));
1769
+ size_t msg_2_len = 0;
1770
+ uint8_t *msg_2 = buffer;
1771
+
1772
+ /* EDHOC message 2 compose. */
1773
+ ret = edhoc_message_2_compose(resp_ctx, msg_2, ARRAY_SIZE(buffer),
1774
+ &msg_2_len);
1775
+
1776
+ TEST_ASSERT_EQUAL(EDHOC_SUCCESS, ret);
1777
+ TEST_ASSERT_EQUAL(EDHOC_SM_WAIT_M3, resp_ctx->status);
1778
+ TEST_ASSERT_EQUAL(false, resp_ctx->is_oscore_export_allowed);
1779
+ TEST_ASSERT_EQUAL(EDHOC_TH_STATE_3, resp_ctx->th_state);
1780
+ TEST_ASSERT_EQUAL(EDHOC_PRK_STATE_3E2M, resp_ctx->prk_state);
1781
+
1782
+ ret = edhoc_error_get_code(resp_ctx, &error_code_recv);
1783
+ TEST_ASSERT_EQUAL(EDHOC_SUCCESS, ret);
1784
+ TEST_ASSERT_EQUAL(EDHOC_ERROR_CODE_SUCCESS, error_code_recv);
1785
+
1786
+ /* EDHOC message 2 compose. */
1787
+ ret = edhoc_message_2_process(init_ctx, msg_2, msg_2_len);
1788
+
1789
+ TEST_ASSERT_EQUAL(EDHOC_SUCCESS, ret);
1790
+ TEST_ASSERT_EQUAL(EDHOC_SM_VERIFIED_M2, init_ctx->status);
1791
+ TEST_ASSERT_EQUAL(false, init_ctx->is_oscore_export_allowed);
1792
+ TEST_ASSERT_EQUAL(EDHOC_TH_STATE_3, init_ctx->th_state);
1793
+ TEST_ASSERT_EQUAL(EDHOC_PRK_STATE_3E2M, init_ctx->prk_state);
1794
+
1795
+ ret = edhoc_error_get_code(init_ctx, &error_code_recv);
1796
+ TEST_ASSERT_EQUAL(EDHOC_SUCCESS, ret);
1797
+ TEST_ASSERT_EQUAL(EDHOC_ERROR_CODE_SUCCESS, error_code_recv);
1798
+
1799
+ TEST_ASSERT_EQUAL(EDHOC_CID_TYPE_BYTE_STRING,
1800
+ init_ctx->peer_cid.encode_type);
1801
+ TEST_ASSERT_EQUAL(ARRAY_SIZE(C_R), init_ctx->peer_cid.bstr_length);
1802
+ TEST_ASSERT_EQUAL_UINT8_ARRAY(C_R, init_ctx->peer_cid.bstr_value,
1803
+ init_ctx->peer_cid.bstr_length);
1804
+
1805
+ TEST_ASSERT_EQUAL(edhoc_cipher_suite_0.ecc_key_length,
1806
+ init_ctx->dh_secret_len);
1807
+ TEST_ASSERT_EQUAL(edhoc_cipher_suite_0.ecc_key_length,
1808
+ resp_ctx->dh_secret_len);
1809
+ TEST_ASSERT_EQUAL(init_ctx->dh_secret_len, resp_ctx->dh_secret_len);
1810
+ TEST_ASSERT_EQUAL_UINT8_ARRAY(init_ctx->dh_secret, resp_ctx->dh_secret,
1811
+ edhoc_cipher_suite_0.ecc_key_length);
1812
+
1813
+ memset(buffer, 0, sizeof(buffer));
1814
+ size_t msg_3_len = 0;
1815
+ uint8_t *msg_3 = buffer;
1816
+
1817
+ /* EDHOC message 3 compose. */
1818
+ ret = edhoc_message_3_compose(init_ctx, msg_3, ARRAY_SIZE(buffer),
1819
+ &msg_3_len);
1820
+
1821
+ TEST_ASSERT_EQUAL(EDHOC_SUCCESS, ret);
1822
+ TEST_ASSERT_EQUAL(EDHOC_SM_COMPLETED, init_ctx->status);
1823
+ TEST_ASSERT_EQUAL(true, init_ctx->is_oscore_export_allowed);
1824
+ TEST_ASSERT_EQUAL(EDHOC_TH_STATE_4, init_ctx->th_state);
1825
+ TEST_ASSERT_EQUAL(EDHOC_PRK_STATE_4E3M, init_ctx->prk_state);
1826
+
1827
+ ret = edhoc_error_get_code(init_ctx, &error_code_recv);
1828
+ TEST_ASSERT_EQUAL(EDHOC_SUCCESS, ret);
1829
+ TEST_ASSERT_EQUAL(EDHOC_ERROR_CODE_SUCCESS, error_code_recv);
1830
+
1831
+ /* EDHOC message 3 process. */
1832
+ ret = edhoc_message_3_process(resp_ctx, msg_3, msg_3_len);
1833
+
1834
+ TEST_ASSERT_EQUAL(EDHOC_SUCCESS, ret);
1835
+ TEST_ASSERT_EQUAL(EDHOC_SM_COMPLETED, resp_ctx->status);
1836
+ TEST_ASSERT_EQUAL(true, resp_ctx->is_oscore_export_allowed);
1837
+ TEST_ASSERT_EQUAL(EDHOC_TH_STATE_4, resp_ctx->th_state);
1838
+ TEST_ASSERT_EQUAL(EDHOC_PRK_STATE_4E3M, resp_ctx->prk_state);
1839
+
1840
+ ret = edhoc_error_get_code(resp_ctx, &error_code_recv);
1841
+ TEST_ASSERT_EQUAL(EDHOC_SUCCESS, ret);
1842
+ TEST_ASSERT_EQUAL(EDHOC_ERROR_CODE_SUCCESS, error_code_recv);
1843
+
1844
+ TEST_ASSERT_EQUAL(edhoc_cipher_suite_0.hash_length, init_ctx->th_len);
1845
+ TEST_ASSERT_EQUAL(edhoc_cipher_suite_0.hash_length, resp_ctx->th_len);
1846
+ TEST_ASSERT_EQUAL_UINT8_ARRAY(init_ctx->th, resp_ctx->th,
1847
+ edhoc_cipher_suite_0.hash_length);
1848
+
1849
+ TEST_ASSERT_EQUAL(edhoc_cipher_suite_0.mac_length, init_ctx->prk_len);
1850
+ TEST_ASSERT_EQUAL(edhoc_cipher_suite_0.mac_length, resp_ctx->prk_len);
1851
+ TEST_ASSERT_EQUAL_UINT8_ARRAY(init_ctx->prk, resp_ctx->prk,
1852
+ edhoc_cipher_suite_0.mac_length);
1853
+
1854
+ memset(buffer, 0, sizeof(buffer));
1855
+ size_t msg_4_len = 0;
1856
+ uint8_t *msg_4 = buffer;
1857
+
1858
+ /* EDHOC message 4 compose. */
1859
+ ret = edhoc_message_4_compose(resp_ctx, msg_4, ARRAY_SIZE(buffer),
1860
+ &msg_4_len);
1861
+
1862
+ TEST_ASSERT_EQUAL(EDHOC_SUCCESS, ret);
1863
+ TEST_ASSERT_EQUAL(EDHOC_SM_PERSISTED, resp_ctx->status);
1864
+ TEST_ASSERT_EQUAL(true, resp_ctx->is_oscore_export_allowed);
1865
+ TEST_ASSERT_EQUAL(EDHOC_TH_STATE_4, resp_ctx->th_state);
1866
+ TEST_ASSERT_EQUAL(EDHOC_PRK_STATE_4E3M, resp_ctx->prk_state);
1867
+
1868
+ ret = edhoc_error_get_code(resp_ctx, &error_code_recv);
1869
+ TEST_ASSERT_EQUAL(EDHOC_SUCCESS, ret);
1870
+ TEST_ASSERT_EQUAL(EDHOC_ERROR_CODE_SUCCESS, error_code_recv);
1871
+
1872
+ /* EDHOC message 4 process. */
1873
+ ret = edhoc_message_4_process(init_ctx, msg_4, msg_4_len);
1874
+
1875
+ TEST_ASSERT_EQUAL(EDHOC_SUCCESS, ret);
1876
+ TEST_ASSERT_EQUAL(EDHOC_SM_PERSISTED, init_ctx->status);
1877
+ TEST_ASSERT_EQUAL(true, init_ctx->is_oscore_export_allowed);
1878
+ TEST_ASSERT_EQUAL(EDHOC_TH_STATE_4, init_ctx->th_state);
1879
+ TEST_ASSERT_EQUAL(EDHOC_PRK_STATE_4E3M, init_ctx->prk_state);
1880
+
1881
+ ret = edhoc_error_get_code(init_ctx, &error_code_recv);
1882
+ TEST_ASSERT_EQUAL(EDHOC_SUCCESS, ret);
1883
+ TEST_ASSERT_EQUAL(EDHOC_ERROR_CODE_SUCCESS, error_code_recv);
1884
+
1885
+ uint8_t init_master_secret[ARRAY_SIZE(OSCORE_Master_Secret)] = { 0 };
1886
+ uint8_t init_master_salt[ARRAY_SIZE(OSCORE_Master_Salt)] = { 0 };
1887
+ size_t init_sender_id_len = 0;
1888
+ uint8_t init_sender_id[ARRAY_SIZE(C_R)] = { 0 };
1889
+ size_t init_recipient_id_len = 0;
1890
+ uint8_t init_recipient_id[ARRAY_SIZE(C_I)] = { 0 };
1891
+
1892
+ /* Derive OSCORE master secret and master salt. */
1893
+ ret = edhoc_export_oscore_session(
1894
+ init_ctx, init_master_secret, ARRAY_SIZE(init_master_secret),
1895
+ init_master_salt, ARRAY_SIZE(init_master_salt), init_sender_id,
1896
+ ARRAY_SIZE(init_sender_id), &init_sender_id_len,
1897
+ init_recipient_id, ARRAY_SIZE(init_recipient_id),
1898
+ &init_recipient_id_len);
1899
+ TEST_ASSERT_EQUAL(EDHOC_SUCCESS, ret);
1900
+ TEST_ASSERT_EQUAL(EDHOC_SM_PERSISTED, init_ctx->status);
1901
+ TEST_ASSERT_EQUAL(false, init_ctx->is_oscore_export_allowed);
1902
+ TEST_ASSERT_EQUAL(EDHOC_PRK_STATE_OUT, init_ctx->prk_state);
1903
+
1904
+ uint8_t resp_master_secret[ARRAY_SIZE(OSCORE_Master_Secret)] = { 0 };
1905
+ uint8_t resp_master_salt[ARRAY_SIZE(OSCORE_Master_Salt)] = { 0 };
1906
+ size_t resp_sender_id_len = 0;
1907
+ uint8_t resp_sender_id[ARRAY_SIZE(C_I)] = { 0 };
1908
+ size_t resp_recipient_id_len = 0;
1909
+ uint8_t resp_recipient_id[ARRAY_SIZE(C_R)] = { 0 };
1910
+
1911
+ /* Derive OSCORE master secret and master salt. */
1912
+ ret = edhoc_export_oscore_session(
1913
+ resp_ctx, resp_master_secret, ARRAY_SIZE(resp_master_secret),
1914
+ resp_master_salt, ARRAY_SIZE(resp_master_salt), resp_sender_id,
1915
+ ARRAY_SIZE(resp_sender_id), &resp_sender_id_len,
1916
+ resp_recipient_id, ARRAY_SIZE(resp_recipient_id),
1917
+ &resp_recipient_id_len);
1918
+ TEST_ASSERT_EQUAL(EDHOC_SUCCESS, ret);
1919
+ TEST_ASSERT_EQUAL(EDHOC_SM_PERSISTED, resp_ctx->status);
1920
+ TEST_ASSERT_EQUAL(false, resp_ctx->is_oscore_export_allowed);
1921
+ TEST_ASSERT_EQUAL(EDHOC_PRK_STATE_OUT, resp_ctx->prk_state);
1922
+
1923
+ TEST_ASSERT_EQUAL_UINT8_ARRAY(init_master_secret, resp_master_secret,
1924
+ ARRAY_SIZE(resp_master_secret));
1925
+
1926
+ TEST_ASSERT_EQUAL_UINT8_ARRAY(init_master_salt, resp_master_salt,
1927
+ ARRAY_SIZE(resp_master_salt));
1928
+
1929
+ TEST_ASSERT_EQUAL(init_sender_id_len, resp_recipient_id_len);
1930
+ TEST_ASSERT_EQUAL_UINT8_ARRAY(init_sender_id, resp_recipient_id,
1931
+ init_sender_id_len);
1932
+ TEST_ASSERT_EQUAL(init_recipient_id_len, resp_sender_id_len);
1933
+ TEST_ASSERT_EQUAL_UINT8_ARRAY(init_recipient_id, resp_sender_id,
1934
+ resp_sender_id_len);
1935
+
1936
+ /* EDHOC key update method. */
1937
+ ret = edhoc_export_key_update(init_ctx, keyUpdate_context,
1938
+ ARRAY_SIZE(keyUpdate_context));
1939
+ TEST_ASSERT_EQUAL(EDHOC_SUCCESS, ret);
1940
+ TEST_ASSERT_EQUAL(EDHOC_SM_PERSISTED, init_ctx->status);
1941
+ TEST_ASSERT_EQUAL(true, init_ctx->is_oscore_export_allowed);
1942
+
1943
+ /* EDHOC key update method. */
1944
+ ret = edhoc_export_key_update(resp_ctx, keyUpdate_context,
1945
+ ARRAY_SIZE(keyUpdate_context));
1946
+ TEST_ASSERT_EQUAL(EDHOC_SUCCESS, ret);
1947
+ TEST_ASSERT_EQUAL(EDHOC_SM_PERSISTED, resp_ctx->status);
1948
+ TEST_ASSERT_EQUAL(true, resp_ctx->is_oscore_export_allowed);
1949
+
1950
+ TEST_ASSERT_EQUAL(init_ctx->prk_state, resp_ctx->prk_state);
1951
+ TEST_ASSERT_EQUAL(EDHOC_PRK_STATE_OUT, init_ctx->prk_state);
1952
+ TEST_ASSERT_EQUAL(EDHOC_PRK_STATE_OUT, resp_ctx->prk_state);
1953
+
1954
+ TEST_ASSERT_EQUAL(init_ctx->prk_len, resp_ctx->prk_len);
1955
+ TEST_ASSERT_EQUAL_UINT8_ARRAY(init_ctx->prk, resp_ctx->prk,
1956
+ resp_ctx->prk_len);
1957
+
1958
+ memset(init_master_secret, 0, sizeof(init_master_secret));
1959
+ memset(init_master_salt, 0, sizeof(init_master_salt));
1960
+ init_sender_id_len = 0;
1961
+ memset(init_sender_id, 0, sizeof(init_sender_id));
1962
+ init_recipient_id_len = 0;
1963
+ memset(init_recipient_id, 0, sizeof(init_recipient_id));
1964
+
1965
+ /* Derive OSCORE master secret and master salt. */
1966
+ ret = edhoc_export_oscore_session(
1967
+ init_ctx, init_master_secret, ARRAY_SIZE(init_master_secret),
1968
+ init_master_salt, ARRAY_SIZE(init_master_salt), init_sender_id,
1969
+ ARRAY_SIZE(init_sender_id), &init_sender_id_len,
1970
+ init_recipient_id, ARRAY_SIZE(init_recipient_id),
1971
+ &init_recipient_id_len);
1972
+ TEST_ASSERT_EQUAL(EDHOC_SUCCESS, ret);
1973
+ TEST_ASSERT_EQUAL(EDHOC_SM_PERSISTED, init_ctx->status);
1974
+ TEST_ASSERT_EQUAL(false, init_ctx->is_oscore_export_allowed);
1975
+ TEST_ASSERT_EQUAL(EDHOC_PRK_STATE_OUT, init_ctx->prk_state);
1976
+
1977
+ memset(resp_master_secret, 0, sizeof(resp_master_secret));
1978
+ memset(resp_master_salt, 0, sizeof(resp_master_salt));
1979
+ resp_sender_id_len = 0;
1980
+ memset(resp_sender_id, 0, sizeof(resp_sender_id));
1981
+ resp_recipient_id_len = 0;
1982
+ memset(resp_recipient_id, 0, sizeof(resp_recipient_id));
1983
+
1984
+ /* Derive OSCORE master secret and master salt. */
1985
+ ret = edhoc_export_oscore_session(
1986
+ resp_ctx, resp_master_secret, ARRAY_SIZE(resp_master_secret),
1987
+ resp_master_salt, ARRAY_SIZE(resp_master_salt), resp_sender_id,
1988
+ ARRAY_SIZE(resp_sender_id), &resp_sender_id_len,
1989
+ resp_recipient_id, ARRAY_SIZE(resp_recipient_id),
1990
+ &resp_recipient_id_len);
1991
+ TEST_ASSERT_EQUAL(EDHOC_SUCCESS, ret);
1992
+ TEST_ASSERT_EQUAL(EDHOC_SM_PERSISTED, resp_ctx->status);
1993
+ TEST_ASSERT_EQUAL(false, resp_ctx->is_oscore_export_allowed);
1994
+ TEST_ASSERT_EQUAL(EDHOC_PRK_STATE_OUT, resp_ctx->prk_state);
1995
+
1996
+ TEST_ASSERT_EQUAL_UINT8_ARRAY(init_master_secret, resp_master_secret,
1997
+ ARRAY_SIZE(resp_master_secret));
1998
+
1999
+ TEST_ASSERT_EQUAL_UINT8_ARRAY(init_master_salt, resp_master_salt,
2000
+ ARRAY_SIZE(resp_master_salt));
2001
+
2002
+ TEST_ASSERT_EQUAL(init_sender_id_len, resp_recipient_id_len);
2003
+ TEST_ASSERT_EQUAL_UINT8_ARRAY(init_sender_id, resp_recipient_id,
2004
+ init_sender_id_len);
2005
+ TEST_ASSERT_EQUAL(init_recipient_id_len, resp_sender_id_len);
2006
+ TEST_ASSERT_EQUAL_UINT8_ARRAY(init_recipient_id, resp_sender_id,
2007
+ resp_sender_id_len);
2008
+ }
2009
+
2010
+ TEST(rfc9529_chapter_2, handshake_real_crypto_ead_single)
2011
+ {
2012
+ uint8_t buffer[500] = { 0 };
2013
+
2014
+ /* Required injections. */
2015
+ struct ead_context init_ead_ctx = { 0 };
2016
+ ret = edhoc_set_user_context(init_ctx, &init_ead_ctx);
2017
+ TEST_ASSERT_EQUAL(EDHOC_SUCCESS, ret);
2018
+
2019
+ ret = edhoc_bind_ead(init_ctx, &edhoc_ead_single_token);
2020
+ TEST_ASSERT_EQUAL(EDHOC_SUCCESS, ret);
2021
+
2022
+ struct ead_context resp_ead_ctx = { 0 };
2023
+ ret = edhoc_set_user_context(resp_ctx, &resp_ead_ctx);
2024
+ TEST_ASSERT_EQUAL(EDHOC_SUCCESS, ret);
2025
+
2026
+ ret = edhoc_bind_ead(resp_ctx, &edhoc_ead_single_token);
2027
+ TEST_ASSERT_EQUAL(EDHOC_SUCCESS, ret);
2028
+
2029
+ memset(&init_ead_ctx, 0, sizeof(init_ead_ctx));
2030
+ memset(&resp_ead_ctx, 0, sizeof(resp_ead_ctx));
2031
+
2032
+ memset(buffer, 0, sizeof(buffer));
2033
+ size_t msg_1_len = 0;
2034
+ uint8_t *msg_1 = buffer;
2035
+
2036
+ /* EDHOC message 1 compose. */
2037
+ ret = edhoc_message_1_compose(init_ctx, msg_1, ARRAY_SIZE(buffer),
2038
+ &msg_1_len);
2039
+
2040
+ TEST_ASSERT_EQUAL(EDHOC_SUCCESS, ret);
2041
+ TEST_ASSERT_EQUAL(EDHOC_SM_WAIT_M2, init_ctx->status);
2042
+ TEST_ASSERT_EQUAL(false, init_ctx->is_oscore_export_allowed);
2043
+ TEST_ASSERT_EQUAL(EDHOC_PRK_STATE_INVALID, init_ctx->prk_state);
2044
+ TEST_ASSERT_EQUAL(EDHOC_TH_STATE_1, init_ctx->th_state);
2045
+
2046
+ ret = edhoc_error_get_code(init_ctx, &error_code_recv);
2047
+ TEST_ASSERT_EQUAL(EDHOC_SUCCESS, ret);
2048
+ TEST_ASSERT_EQUAL(EDHOC_ERROR_CODE_SUCCESS, error_code_recv);
2049
+
2050
+ /* Verify EAD_1 compose. */
2051
+ TEST_ASSERT_EQUAL(EDHOC_MSG_1, init_ead_ctx.msg);
2052
+ TEST_ASSERT_EQUAL(1, init_ead_ctx.recv_tokens);
2053
+ TEST_ASSERT_EQUAL(ead_single_token_msg_1.label,
2054
+ init_ead_ctx.token[0].label);
2055
+ TEST_ASSERT_EQUAL(ead_single_token_msg_1.value_len,
2056
+ init_ead_ctx.token[0].value_len);
2057
+ TEST_ASSERT_EQUAL_UINT8_ARRAY(ead_single_token_msg_1.value,
2058
+ init_ead_ctx.token[0].value,
2059
+ init_ead_ctx.token[0].value_len);
2060
+
2061
+ /* EDHOC message 1 process. */
2062
+ ret = edhoc_message_1_process(resp_ctx, msg_1, msg_1_len);
2063
+
2064
+ TEST_ASSERT_EQUAL(EDHOC_SUCCESS, ret);
2065
+ TEST_ASSERT_EQUAL(EDHOC_SM_RECEIVED_M1, resp_ctx->status);
2066
+ TEST_ASSERT_EQUAL(false, resp_ctx->is_oscore_export_allowed);
2067
+ TEST_ASSERT_EQUAL(EDHOC_TH_STATE_1, resp_ctx->th_state);
2068
+ TEST_ASSERT_EQUAL(EDHOC_PRK_STATE_INVALID, resp_ctx->prk_state);
2069
+
2070
+ ret = edhoc_error_get_code(resp_ctx, &error_code_recv);
2071
+ TEST_ASSERT_EQUAL(EDHOC_SUCCESS, ret);
2072
+ TEST_ASSERT_EQUAL(EDHOC_ERROR_CODE_SUCCESS, error_code_recv);
2073
+
2074
+ /* Verify EAD_1 process. */
2075
+ TEST_ASSERT_EQUAL(EDHOC_MSG_1, resp_ead_ctx.msg);
2076
+ TEST_ASSERT_EQUAL(1, resp_ead_ctx.recv_tokens);
2077
+ TEST_ASSERT_EQUAL(ead_single_token_msg_1.label,
2078
+ resp_ead_ctx.token[0].label);
2079
+ TEST_ASSERT_EQUAL(ead_single_token_msg_1.value_len,
2080
+ resp_ead_ctx.token[0].value_len);
2081
+ TEST_ASSERT_EQUAL_UINT8_ARRAY(ead_single_token_msg_1.value,
2082
+ resp_ead_ctx.token[0].value,
2083
+ resp_ead_ctx.token[0].value_len);
2084
+
2085
+ memset(&init_ead_ctx, 0, sizeof(init_ead_ctx));
2086
+ memset(&resp_ead_ctx, 0, sizeof(resp_ead_ctx));
2087
+
2088
+ memset(buffer, 0, sizeof(buffer));
2089
+ size_t msg_2_len = 0;
2090
+ uint8_t *msg_2 = buffer;
2091
+
2092
+ /* EDHOC message 2 compose. */
2093
+ ret = edhoc_message_2_compose(resp_ctx, msg_2, ARRAY_SIZE(buffer),
2094
+ &msg_2_len);
2095
+
2096
+ TEST_ASSERT_EQUAL(EDHOC_SUCCESS, ret);
2097
+ TEST_ASSERT_EQUAL(EDHOC_SM_WAIT_M3, resp_ctx->status);
2098
+ TEST_ASSERT_EQUAL(false, resp_ctx->is_oscore_export_allowed);
2099
+ TEST_ASSERT_EQUAL(EDHOC_TH_STATE_3, resp_ctx->th_state);
2100
+ TEST_ASSERT_EQUAL(EDHOC_PRK_STATE_3E2M, resp_ctx->prk_state);
2101
+
2102
+ ret = edhoc_error_get_code(resp_ctx, &error_code_recv);
2103
+ TEST_ASSERT_EQUAL(EDHOC_SUCCESS, ret);
2104
+ TEST_ASSERT_EQUAL(EDHOC_ERROR_CODE_SUCCESS, error_code_recv);
2105
+
2106
+ /* Verify EAD_2 compose. */
2107
+ TEST_ASSERT_EQUAL(EDHOC_MSG_2, resp_ead_ctx.msg);
2108
+ TEST_ASSERT_EQUAL(1, resp_ead_ctx.recv_tokens);
2109
+ TEST_ASSERT_EQUAL(ead_single_token_msg_2.label,
2110
+ resp_ead_ctx.token[0].label);
2111
+ TEST_ASSERT_EQUAL(ead_single_token_msg_2.value_len,
2112
+ resp_ead_ctx.token[0].value_len);
2113
+ TEST_ASSERT_EQUAL_UINT8_ARRAY(ead_single_token_msg_2.value,
2114
+ resp_ead_ctx.token[0].value,
2115
+ resp_ead_ctx.token[0].value_len);
2116
+
2117
+ /* EDHOC message 2 process. */
2118
+ ret = edhoc_message_2_process(init_ctx, msg_2, msg_2_len);
2119
+
2120
+ TEST_ASSERT_EQUAL(EDHOC_SUCCESS, ret);
2121
+ TEST_ASSERT_EQUAL(EDHOC_SM_VERIFIED_M2, init_ctx->status);
2122
+ TEST_ASSERT_EQUAL(false, init_ctx->is_oscore_export_allowed);
2123
+ TEST_ASSERT_EQUAL(EDHOC_TH_STATE_3, init_ctx->th_state);
2124
+ TEST_ASSERT_EQUAL(EDHOC_PRK_STATE_3E2M, init_ctx->prk_state);
2125
+
2126
+ ret = edhoc_error_get_code(init_ctx, &error_code_recv);
2127
+ TEST_ASSERT_EQUAL(EDHOC_SUCCESS, ret);
2128
+ TEST_ASSERT_EQUAL(EDHOC_ERROR_CODE_SUCCESS, error_code_recv);
2129
+
2130
+ /* Verify EAD_2 process. */
2131
+ TEST_ASSERT_EQUAL(EDHOC_MSG_2, init_ead_ctx.msg);
2132
+ TEST_ASSERT_EQUAL(1, init_ead_ctx.recv_tokens);
2133
+ TEST_ASSERT_EQUAL(ead_single_token_msg_2.label,
2134
+ init_ead_ctx.token[0].label);
2135
+ TEST_ASSERT_EQUAL(ead_single_token_msg_2.value_len,
2136
+ init_ead_ctx.token[0].value_len);
2137
+ TEST_ASSERT_EQUAL_UINT8_ARRAY(ead_single_token_msg_2.value,
2138
+ init_ead_ctx.token[0].value,
2139
+ init_ead_ctx.token[0].value_len);
2140
+
2141
+ TEST_ASSERT_EQUAL(edhoc_cipher_suite_0.ecc_key_length,
2142
+ init_ctx->dh_secret_len);
2143
+ TEST_ASSERT_EQUAL(edhoc_cipher_suite_0.ecc_key_length,
2144
+ resp_ctx->dh_secret_len);
2145
+ TEST_ASSERT_EQUAL(init_ctx->dh_secret_len, resp_ctx->dh_secret_len);
2146
+ TEST_ASSERT_EQUAL_UINT8_ARRAY(init_ctx->dh_secret, resp_ctx->dh_secret,
2147
+ edhoc_cipher_suite_0.ecc_key_length);
2148
+
2149
+ memset(&init_ead_ctx, 0, sizeof(init_ead_ctx));
2150
+ memset(&resp_ead_ctx, 0, sizeof(resp_ead_ctx));
2151
+
2152
+ memset(buffer, 0, sizeof(buffer));
2153
+ size_t msg_3_len = 0;
2154
+ uint8_t *msg_3 = buffer;
2155
+
2156
+ /* EDHOC message 3 compose. */
2157
+ ret = edhoc_message_3_compose(init_ctx, msg_3, ARRAY_SIZE(buffer),
2158
+ &msg_3_len);
2159
+
2160
+ TEST_ASSERT_EQUAL(EDHOC_SUCCESS, ret);
2161
+ TEST_ASSERT_EQUAL(EDHOC_SM_COMPLETED, init_ctx->status);
2162
+ TEST_ASSERT_EQUAL(true, init_ctx->is_oscore_export_allowed);
2163
+ TEST_ASSERT_EQUAL(EDHOC_TH_STATE_4, init_ctx->th_state);
2164
+ TEST_ASSERT_EQUAL(EDHOC_PRK_STATE_4E3M, init_ctx->prk_state);
2165
+
2166
+ ret = edhoc_error_get_code(init_ctx, &error_code_recv);
2167
+ TEST_ASSERT_EQUAL(EDHOC_SUCCESS, ret);
2168
+ TEST_ASSERT_EQUAL(EDHOC_ERROR_CODE_SUCCESS, error_code_recv);
2169
+
2170
+ /* Verify EAD_3 compose. */
2171
+ TEST_ASSERT_EQUAL(EDHOC_MSG_3, init_ead_ctx.msg);
2172
+ TEST_ASSERT_EQUAL(1, init_ead_ctx.recv_tokens);
2173
+ TEST_ASSERT_EQUAL(ead_single_token_msg_3.label,
2174
+ init_ead_ctx.token[0].label);
2175
+ TEST_ASSERT_EQUAL(ead_single_token_msg_3.value_len,
2176
+ init_ead_ctx.token[0].value_len);
2177
+ TEST_ASSERT_EQUAL_UINT8_ARRAY(ead_single_token_msg_3.value,
2178
+ init_ead_ctx.token[0].value,
2179
+ init_ead_ctx.token[0].value_len);
2180
+
2181
+ /* EDHOC message 3 process. */
2182
+ ret = edhoc_message_3_process(resp_ctx, msg_3, msg_3_len);
2183
+
2184
+ TEST_ASSERT_EQUAL(EDHOC_SUCCESS, ret);
2185
+ TEST_ASSERT_EQUAL(EDHOC_SM_COMPLETED, resp_ctx->status);
2186
+ TEST_ASSERT_EQUAL(true, resp_ctx->is_oscore_export_allowed);
2187
+ TEST_ASSERT_EQUAL(EDHOC_TH_STATE_4, resp_ctx->th_state);
2188
+ TEST_ASSERT_EQUAL(EDHOC_PRK_STATE_4E3M, resp_ctx->prk_state);
2189
+
2190
+ error_code_recv = EDHOC_ERROR_CODE_UNSPECIFIED_ERROR;
2191
+ ret = edhoc_error_get_code(resp_ctx, &error_code_recv);
2192
+ TEST_ASSERT_EQUAL(EDHOC_SUCCESS, ret);
2193
+ TEST_ASSERT_EQUAL(EDHOC_ERROR_CODE_SUCCESS, error_code_recv);
2194
+
2195
+ /* Verify EAD_3 process. */
2196
+ TEST_ASSERT_EQUAL(EDHOC_MSG_3, resp_ead_ctx.msg);
2197
+ TEST_ASSERT_EQUAL(1, resp_ead_ctx.recv_tokens);
2198
+ TEST_ASSERT_EQUAL(ead_single_token_msg_3.label,
2199
+ resp_ead_ctx.token[0].label);
2200
+ TEST_ASSERT_EQUAL(ead_single_token_msg_3.value_len,
2201
+ resp_ead_ctx.token[0].value_len);
2202
+ TEST_ASSERT_EQUAL_UINT8_ARRAY(ead_single_token_msg_3.value,
2203
+ resp_ead_ctx.token[0].value,
2204
+ resp_ead_ctx.token[0].value_len);
2205
+
2206
+ memset(&init_ead_ctx, 0, sizeof(init_ead_ctx));
2207
+ memset(&resp_ead_ctx, 0, sizeof(resp_ead_ctx));
2208
+
2209
+ memset(buffer, 0, sizeof(buffer));
2210
+ size_t msg_4_len = 0;
2211
+ uint8_t *msg_4 = buffer;
2212
+
2213
+ /* EDHOC message 4 compose. */
2214
+ ret = edhoc_message_4_compose(resp_ctx, msg_4, ARRAY_SIZE(buffer),
2215
+ &msg_4_len);
2216
+
2217
+ TEST_ASSERT_EQUAL(EDHOC_SUCCESS, ret);
2218
+ TEST_ASSERT_EQUAL(EDHOC_SM_PERSISTED, resp_ctx->status);
2219
+ TEST_ASSERT_EQUAL(true, resp_ctx->is_oscore_export_allowed);
2220
+ TEST_ASSERT_EQUAL(EDHOC_TH_STATE_4, resp_ctx->th_state);
2221
+ TEST_ASSERT_EQUAL(EDHOC_PRK_STATE_4E3M, resp_ctx->prk_state);
2222
+
2223
+ error_code_recv = EDHOC_ERROR_CODE_UNSPECIFIED_ERROR;
2224
+ ret = edhoc_error_get_code(resp_ctx, &error_code_recv);
2225
+ TEST_ASSERT_EQUAL(EDHOC_SUCCESS, ret);
2226
+ TEST_ASSERT_EQUAL(EDHOC_ERROR_CODE_SUCCESS, error_code_recv);
2227
+
2228
+ /* Verify EAD_4 compose. */
2229
+ TEST_ASSERT_EQUAL(EDHOC_MSG_4, resp_ead_ctx.msg);
2230
+ TEST_ASSERT_EQUAL(1, resp_ead_ctx.recv_tokens);
2231
+ TEST_ASSERT_EQUAL(ead_single_token_msg_4.label,
2232
+ resp_ead_ctx.token[0].label);
2233
+ TEST_ASSERT_EQUAL(ead_single_token_msg_4.value_len,
2234
+ resp_ead_ctx.token[0].value_len);
2235
+ TEST_ASSERT_EQUAL_UINT8_ARRAY(ead_single_token_msg_4.value,
2236
+ resp_ead_ctx.token[0].value,
2237
+ resp_ead_ctx.token[0].value_len);
2238
+
2239
+ /* EDHOC message 4 process. */
2240
+ ret = edhoc_message_4_process(init_ctx, msg_4, msg_4_len);
2241
+
2242
+ TEST_ASSERT_EQUAL(EDHOC_SUCCESS, ret);
2243
+ TEST_ASSERT_EQUAL(EDHOC_SM_PERSISTED, init_ctx->status);
2244
+ TEST_ASSERT_EQUAL(true, init_ctx->is_oscore_export_allowed);
2245
+ TEST_ASSERT_EQUAL(EDHOC_TH_STATE_4, init_ctx->th_state);
2246
+ TEST_ASSERT_EQUAL(EDHOC_PRK_STATE_4E3M, init_ctx->prk_state);
2247
+
2248
+ ret = edhoc_error_get_code(init_ctx, &error_code_recv);
2249
+ TEST_ASSERT_EQUAL(EDHOC_SUCCESS, ret);
2250
+ TEST_ASSERT_EQUAL(EDHOC_ERROR_CODE_SUCCESS, error_code_recv);
2251
+
2252
+ /* Verify EAD_4 process. */
2253
+ TEST_ASSERT_EQUAL(EDHOC_MSG_4, init_ead_ctx.msg);
2254
+ TEST_ASSERT_EQUAL(1, init_ead_ctx.recv_tokens);
2255
+
2256
+ TEST_ASSERT_EQUAL(ead_single_token_msg_4.label,
2257
+ init_ead_ctx.token[0].label);
2258
+ TEST_ASSERT_EQUAL(ead_single_token_msg_4.value_len,
2259
+ init_ead_ctx.token[0].value_len);
2260
+ TEST_ASSERT_EQUAL_UINT8_ARRAY(ead_single_token_msg_4.value,
2261
+ init_ead_ctx.token[0].value,
2262
+ init_ead_ctx.token[0].value_len);
2263
+
2264
+ /* Derive OSCORE master secret and master salt. */
2265
+ uint8_t init_master_secret[ARRAY_SIZE(OSCORE_Master_Secret)] = { 0 };
2266
+ uint8_t init_master_salt[ARRAY_SIZE(OSCORE_Master_Salt)] = { 0 };
2267
+ size_t init_sender_id_len = 0;
2268
+ uint8_t init_sender_id[ARRAY_SIZE(C_R)] = { 0 };
2269
+ size_t init_recipient_id_len = 0;
2270
+ uint8_t init_recipient_id[ARRAY_SIZE(C_I)] = { 0 };
2271
+
2272
+ ret = edhoc_export_oscore_session(
2273
+ init_ctx, init_master_secret, ARRAY_SIZE(init_master_secret),
2274
+ init_master_salt, ARRAY_SIZE(init_master_salt), init_sender_id,
2275
+ ARRAY_SIZE(init_sender_id), &init_sender_id_len,
2276
+ init_recipient_id, ARRAY_SIZE(init_recipient_id),
2277
+ &init_recipient_id_len);
2278
+
2279
+ TEST_ASSERT_EQUAL(EDHOC_SUCCESS, ret);
2280
+ TEST_ASSERT_EQUAL(EDHOC_SM_PERSISTED, init_ctx->status);
2281
+ TEST_ASSERT_EQUAL(false, init_ctx->is_oscore_export_allowed);
2282
+ TEST_ASSERT_EQUAL(EDHOC_PRK_STATE_OUT, init_ctx->prk_state);
2283
+
2284
+ /* Derive OSCORE master secret and master salt. */
2285
+ uint8_t resp_master_secret[ARRAY_SIZE(OSCORE_Master_Secret)] = { 0 };
2286
+ uint8_t resp_master_salt[ARRAY_SIZE(OSCORE_Master_Salt)] = { 0 };
2287
+ size_t resp_sender_id_len = 0;
2288
+ uint8_t resp_sender_id[ARRAY_SIZE(C_I)] = { 0 };
2289
+ size_t resp_recipient_id_len = 0;
2290
+ uint8_t resp_recipient_id[ARRAY_SIZE(C_R)] = { 0 };
2291
+
2292
+ ret = edhoc_export_oscore_session(
2293
+ resp_ctx, resp_master_secret, ARRAY_SIZE(resp_master_secret),
2294
+ resp_master_salt, ARRAY_SIZE(resp_master_salt), resp_sender_id,
2295
+ ARRAY_SIZE(resp_sender_id), &resp_sender_id_len,
2296
+ resp_recipient_id, ARRAY_SIZE(resp_recipient_id),
2297
+ &resp_recipient_id_len);
2298
+
2299
+ TEST_ASSERT_EQUAL(EDHOC_SUCCESS, ret);
2300
+ TEST_ASSERT_EQUAL(EDHOC_SM_PERSISTED, resp_ctx->status);
2301
+ TEST_ASSERT_EQUAL(false, resp_ctx->is_oscore_export_allowed);
2302
+ TEST_ASSERT_EQUAL(EDHOC_PRK_STATE_OUT, resp_ctx->prk_state);
2303
+
2304
+ TEST_ASSERT_EQUAL_UINT8_ARRAY(init_master_secret, resp_master_secret,
2305
+ ARRAY_SIZE(resp_master_secret));
2306
+
2307
+ TEST_ASSERT_EQUAL_UINT8_ARRAY(init_master_salt, resp_master_salt,
2308
+ ARRAY_SIZE(resp_master_salt));
2309
+
2310
+ TEST_ASSERT_EQUAL(init_sender_id_len, resp_recipient_id_len);
2311
+ TEST_ASSERT_EQUAL_UINT8_ARRAY(init_sender_id, resp_recipient_id,
2312
+ init_sender_id_len);
2313
+ TEST_ASSERT_EQUAL(init_recipient_id_len, resp_sender_id_len);
2314
+ TEST_ASSERT_EQUAL_UINT8_ARRAY(init_recipient_id, resp_sender_id,
2315
+ resp_sender_id_len);
2316
+ }
2317
+
2318
+ TEST(rfc9529_chapter_2, handshake_real_crypto_ead_many)
2319
+ {
2320
+ uint8_t buffer[1000] = { 0 };
2321
+
2322
+ /* Required injections. */
2323
+ struct ead_context init_ead_ctx = { 0 };
2324
+ struct ead_context resp_ead_ctx = { 0 };
2325
+
2326
+ ret = edhoc_set_user_context(init_ctx, &init_ead_ctx);
2327
+ TEST_ASSERT_EQUAL(EDHOC_SUCCESS, ret);
2328
+
2329
+ ret = edhoc_bind_ead(init_ctx, &edhoc_ead_multiple_tokens);
2330
+ TEST_ASSERT_EQUAL(EDHOC_SUCCESS, ret);
2331
+
2332
+ ret = edhoc_set_user_context(resp_ctx, &resp_ead_ctx);
2333
+ TEST_ASSERT_EQUAL(EDHOC_SUCCESS, ret);
2334
+
2335
+ ret = edhoc_bind_ead(resp_ctx, &edhoc_ead_multiple_tokens);
2336
+ TEST_ASSERT_EQUAL(EDHOC_SUCCESS, ret);
2337
+
2338
+ memset(&init_ead_ctx, 0, sizeof(init_ead_ctx));
2339
+ memset(&resp_ead_ctx, 0, sizeof(resp_ead_ctx));
2340
+
2341
+ memset(buffer, 0, sizeof(buffer));
2342
+ size_t msg_1_len = 0;
2343
+ uint8_t *msg_1 = buffer;
2344
+
2345
+ /* EDHOC message 1 compose. */
2346
+ ret = edhoc_message_1_compose(init_ctx, msg_1, ARRAY_SIZE(buffer),
2347
+ &msg_1_len);
2348
+
2349
+ TEST_ASSERT_EQUAL(EDHOC_SUCCESS, ret);
2350
+ TEST_ASSERT_EQUAL(EDHOC_SM_WAIT_M2, init_ctx->status);
2351
+ TEST_ASSERT_EQUAL(false, init_ctx->is_oscore_export_allowed);
2352
+ TEST_ASSERT_EQUAL(EDHOC_PRK_STATE_INVALID, init_ctx->prk_state);
2353
+ TEST_ASSERT_EQUAL(EDHOC_TH_STATE_1, init_ctx->th_state);
2354
+
2355
+ ret = edhoc_error_get_code(init_ctx, &error_code_recv);
2356
+ TEST_ASSERT_EQUAL(EDHOC_SUCCESS, ret);
2357
+ TEST_ASSERT_EQUAL(EDHOC_ERROR_CODE_SUCCESS, error_code_recv);
2358
+
2359
+ /* Verify EAD_1 compose. */
2360
+ TEST_ASSERT_EQUAL(EDHOC_MSG_1, init_ead_ctx.msg);
2361
+ TEST_ASSERT_EQUAL(ARRAY_SIZE(ead_multiple_tokens_msg_1),
2362
+ init_ead_ctx.recv_tokens);
2363
+
2364
+ for (size_t i = 0; i < init_ead_ctx.recv_tokens; ++i) {
2365
+ TEST_ASSERT_EQUAL(ead_multiple_tokens_msg_1[i].label,
2366
+ init_ead_ctx.token[i].label);
2367
+ TEST_ASSERT_EQUAL(ead_multiple_tokens_msg_1[i].value_len,
2368
+ init_ead_ctx.token[i].value_len);
2369
+ TEST_ASSERT_EQUAL_UINT8_ARRAY(
2370
+ ead_multiple_tokens_msg_1[i].value,
2371
+ init_ead_ctx.token[i].value,
2372
+ init_ead_ctx.token[i].value_len);
2373
+ }
2374
+
2375
+ /* EDHOC message 1 process. */
2376
+ ret = edhoc_message_1_process(resp_ctx, msg_1, msg_1_len);
2377
+
2378
+ TEST_ASSERT_EQUAL(EDHOC_SUCCESS, ret);
2379
+ TEST_ASSERT_EQUAL(EDHOC_SM_RECEIVED_M1, resp_ctx->status);
2380
+ TEST_ASSERT_EQUAL(false, resp_ctx->is_oscore_export_allowed);
2381
+ TEST_ASSERT_EQUAL(EDHOC_TH_STATE_1, resp_ctx->th_state);
2382
+ TEST_ASSERT_EQUAL(EDHOC_PRK_STATE_INVALID, resp_ctx->prk_state);
2383
+
2384
+ ret = edhoc_error_get_code(resp_ctx, &error_code_recv);
2385
+ TEST_ASSERT_EQUAL(EDHOC_SUCCESS, ret);
2386
+ TEST_ASSERT_EQUAL(EDHOC_ERROR_CODE_SUCCESS, error_code_recv);
2387
+
2388
+ /* Verify EAD_1 process. */
2389
+ TEST_ASSERT_EQUAL(EDHOC_MSG_1, resp_ead_ctx.msg);
2390
+ TEST_ASSERT_EQUAL(ARRAY_SIZE(ead_multiple_tokens_msg_1),
2391
+ resp_ead_ctx.recv_tokens);
2392
+
2393
+ for (size_t i = 0; i < resp_ead_ctx.recv_tokens; ++i) {
2394
+ TEST_ASSERT_EQUAL(ead_multiple_tokens_msg_1[i].label,
2395
+ resp_ead_ctx.token[i].label);
2396
+ TEST_ASSERT_EQUAL(ead_multiple_tokens_msg_1[i].value_len,
2397
+ resp_ead_ctx.token[i].value_len);
2398
+ TEST_ASSERT_EQUAL_UINT8_ARRAY(
2399
+ ead_multiple_tokens_msg_1[i].value,
2400
+ resp_ead_ctx.token[i].value,
2401
+ resp_ead_ctx.token[i].value_len);
2402
+ }
2403
+
2404
+ memset(&init_ead_ctx, 0, sizeof(init_ead_ctx));
2405
+ memset(&resp_ead_ctx, 0, sizeof(resp_ead_ctx));
2406
+
2407
+ memset(buffer, 0, sizeof(buffer));
2408
+ size_t msg_2_len = 0;
2409
+ uint8_t *msg_2 = buffer;
2410
+
2411
+ /* EDHOC message 2 compose. */
2412
+ ret = edhoc_message_2_compose(resp_ctx, msg_2, ARRAY_SIZE(buffer),
2413
+ &msg_2_len);
2414
+
2415
+ TEST_ASSERT_EQUAL(EDHOC_SUCCESS, ret);
2416
+ TEST_ASSERT_EQUAL(EDHOC_SM_WAIT_M3, resp_ctx->status);
2417
+ TEST_ASSERT_EQUAL(false, resp_ctx->is_oscore_export_allowed);
2418
+ TEST_ASSERT_EQUAL(EDHOC_TH_STATE_3, resp_ctx->th_state);
2419
+ TEST_ASSERT_EQUAL(EDHOC_PRK_STATE_3E2M, resp_ctx->prk_state);
2420
+
2421
+ ret = edhoc_error_get_code(resp_ctx, &error_code_recv);
2422
+ TEST_ASSERT_EQUAL(EDHOC_SUCCESS, ret);
2423
+ TEST_ASSERT_EQUAL(EDHOC_ERROR_CODE_SUCCESS, error_code_recv);
2424
+
2425
+ /* Verify EAD_2 compose. */
2426
+ TEST_ASSERT_EQUAL(EDHOC_MSG_2, resp_ead_ctx.msg);
2427
+ TEST_ASSERT_EQUAL(ARRAY_SIZE(ead_multiple_tokens_msg_2),
2428
+ resp_ead_ctx.recv_tokens);
2429
+
2430
+ for (size_t i = 0; i < resp_ead_ctx.recv_tokens; ++i) {
2431
+ TEST_ASSERT_EQUAL(ead_multiple_tokens_msg_2[i].label,
2432
+ resp_ead_ctx.token[i].label);
2433
+ TEST_ASSERT_EQUAL(ead_multiple_tokens_msg_2[i].value_len,
2434
+ resp_ead_ctx.token[i].value_len);
2435
+ TEST_ASSERT_EQUAL_UINT8_ARRAY(
2436
+ ead_multiple_tokens_msg_2[i].value,
2437
+ resp_ead_ctx.token[i].value,
2438
+ resp_ead_ctx.token[i].value_len);
2439
+ }
2440
+
2441
+ /* EDHOC message 2 process. */
2442
+ ret = edhoc_message_2_process(init_ctx, msg_2, msg_2_len);
2443
+
2444
+ TEST_ASSERT_EQUAL(EDHOC_SUCCESS, ret);
2445
+ TEST_ASSERT_EQUAL(EDHOC_SM_VERIFIED_M2, init_ctx->status);
2446
+ TEST_ASSERT_EQUAL(false, init_ctx->is_oscore_export_allowed);
2447
+ TEST_ASSERT_EQUAL(EDHOC_TH_STATE_3, init_ctx->th_state);
2448
+ TEST_ASSERT_EQUAL(EDHOC_PRK_STATE_3E2M, init_ctx->prk_state);
2449
+
2450
+ ret = edhoc_error_get_code(init_ctx, &error_code_recv);
2451
+ TEST_ASSERT_EQUAL(EDHOC_SUCCESS, ret);
2452
+ TEST_ASSERT_EQUAL(EDHOC_ERROR_CODE_SUCCESS, error_code_recv);
2453
+
2454
+ /* Verify EAD_2 process. */
2455
+ TEST_ASSERT_EQUAL(EDHOC_MSG_2, init_ead_ctx.msg);
2456
+ TEST_ASSERT_EQUAL(ARRAY_SIZE(ead_multiple_tokens_msg_2),
2457
+ init_ead_ctx.recv_tokens);
2458
+
2459
+ for (size_t i = 0; i < init_ead_ctx.recv_tokens; ++i) {
2460
+ TEST_ASSERT_EQUAL(ead_multiple_tokens_msg_2[i].label,
2461
+ init_ead_ctx.token[i].label);
2462
+ TEST_ASSERT_EQUAL(ead_multiple_tokens_msg_2[i].value_len,
2463
+ init_ead_ctx.token[i].value_len);
2464
+ TEST_ASSERT_EQUAL_UINT8_ARRAY(
2465
+ ead_multiple_tokens_msg_2[i].value,
2466
+ init_ead_ctx.token[i].value,
2467
+ init_ead_ctx.token[i].value_len);
2468
+ }
2469
+
2470
+ TEST_ASSERT_EQUAL(edhoc_cipher_suite_0.ecc_key_length,
2471
+ init_ctx->dh_secret_len);
2472
+ TEST_ASSERT_EQUAL(edhoc_cipher_suite_0.ecc_key_length,
2473
+ resp_ctx->dh_secret_len);
2474
+ TEST_ASSERT_EQUAL(init_ctx->dh_secret_len, resp_ctx->dh_secret_len);
2475
+ TEST_ASSERT_EQUAL_UINT8_ARRAY(init_ctx->dh_secret, resp_ctx->dh_secret,
2476
+ edhoc_cipher_suite_0.ecc_key_length);
2477
+
2478
+ memset(&init_ead_ctx, 0, sizeof(init_ead_ctx));
2479
+ memset(&resp_ead_ctx, 0, sizeof(resp_ead_ctx));
2480
+
2481
+ memset(buffer, 0, sizeof(buffer));
2482
+ size_t msg_3_len = 0;
2483
+ uint8_t *msg_3 = buffer;
2484
+
2485
+ /* EDHOC message 3 compose. */
2486
+ ret = edhoc_message_3_compose(init_ctx, msg_3, ARRAY_SIZE(buffer),
2487
+ &msg_3_len);
2488
+
2489
+ TEST_ASSERT_EQUAL(EDHOC_SUCCESS, ret);
2490
+ TEST_ASSERT_EQUAL(EDHOC_SM_COMPLETED, init_ctx->status);
2491
+ TEST_ASSERT_EQUAL(true, init_ctx->is_oscore_export_allowed);
2492
+ TEST_ASSERT_EQUAL(EDHOC_TH_STATE_4, init_ctx->th_state);
2493
+ TEST_ASSERT_EQUAL(EDHOC_PRK_STATE_4E3M, init_ctx->prk_state);
2494
+
2495
+ ret = edhoc_error_get_code(init_ctx, &error_code_recv);
2496
+ TEST_ASSERT_EQUAL(EDHOC_SUCCESS, ret);
2497
+ TEST_ASSERT_EQUAL(EDHOC_ERROR_CODE_SUCCESS, error_code_recv);
2498
+
2499
+ /* Verify EAD_3 compose. */
2500
+ TEST_ASSERT_EQUAL(EDHOC_MSG_3, init_ead_ctx.msg);
2501
+ TEST_ASSERT_EQUAL(ARRAY_SIZE(ead_multiple_tokens_msg_3),
2502
+ init_ead_ctx.recv_tokens);
2503
+
2504
+ for (size_t i = 0; i < init_ead_ctx.recv_tokens; ++i) {
2505
+ TEST_ASSERT_EQUAL(ead_multiple_tokens_msg_3[i].label,
2506
+ init_ead_ctx.token[i].label);
2507
+ TEST_ASSERT_EQUAL(ead_multiple_tokens_msg_3[i].value_len,
2508
+ init_ead_ctx.token[i].value_len);
2509
+ TEST_ASSERT_EQUAL_UINT8_ARRAY(
2510
+ ead_multiple_tokens_msg_3[i].value,
2511
+ init_ead_ctx.token[i].value,
2512
+ init_ead_ctx.token[i].value_len);
2513
+ }
2514
+
2515
+ /* EDHOC message 3 process. */
2516
+ ret = edhoc_message_3_process(resp_ctx, msg_3, msg_3_len);
2517
+
2518
+ TEST_ASSERT_EQUAL(EDHOC_SUCCESS, ret);
2519
+ TEST_ASSERT_EQUAL(EDHOC_SM_COMPLETED, resp_ctx->status);
2520
+ TEST_ASSERT_EQUAL(true, resp_ctx->is_oscore_export_allowed);
2521
+ TEST_ASSERT_EQUAL(EDHOC_TH_STATE_4, resp_ctx->th_state);
2522
+ TEST_ASSERT_EQUAL(EDHOC_PRK_STATE_4E3M, resp_ctx->prk_state);
2523
+
2524
+ ret = edhoc_error_get_code(resp_ctx, &error_code_recv);
2525
+ TEST_ASSERT_EQUAL(EDHOC_SUCCESS, ret);
2526
+ TEST_ASSERT_EQUAL(EDHOC_ERROR_CODE_SUCCESS, error_code_recv);
2527
+
2528
+ /* Verify EAD_3 process. */
2529
+ TEST_ASSERT_EQUAL(EDHOC_MSG_3, resp_ead_ctx.msg);
2530
+ TEST_ASSERT_EQUAL(ARRAY_SIZE(ead_multiple_tokens_msg_3),
2531
+ resp_ead_ctx.recv_tokens);
2532
+
2533
+ for (size_t i = 0; i < resp_ead_ctx.recv_tokens; ++i) {
2534
+ TEST_ASSERT_EQUAL(ead_multiple_tokens_msg_3[i].label,
2535
+ resp_ead_ctx.token[i].label);
2536
+ TEST_ASSERT_EQUAL(ead_multiple_tokens_msg_3[i].value_len,
2537
+ resp_ead_ctx.token[i].value_len);
2538
+ TEST_ASSERT_EQUAL_UINT8_ARRAY(
2539
+ ead_multiple_tokens_msg_3[i].value,
2540
+ resp_ead_ctx.token[i].value,
2541
+ resp_ead_ctx.token[i].value_len);
2542
+ }
2543
+
2544
+ memset(&init_ead_ctx, 0, sizeof(init_ead_ctx));
2545
+ memset(&resp_ead_ctx, 0, sizeof(resp_ead_ctx));
2546
+
2547
+ memset(buffer, 0, sizeof(buffer));
2548
+ size_t msg_4_len = 0;
2549
+ uint8_t *msg_4 = buffer;
2550
+
2551
+ /* EDHOC message 4 compose. */
2552
+ ret = edhoc_message_4_compose(resp_ctx, msg_4, ARRAY_SIZE(buffer),
2553
+ &msg_4_len);
2554
+
2555
+ TEST_ASSERT_EQUAL(EDHOC_SUCCESS, ret);
2556
+ TEST_ASSERT_EQUAL(EDHOC_SM_PERSISTED, resp_ctx->status);
2557
+ TEST_ASSERT_EQUAL(true, resp_ctx->is_oscore_export_allowed);
2558
+ TEST_ASSERT_EQUAL(EDHOC_TH_STATE_4, resp_ctx->th_state);
2559
+ TEST_ASSERT_EQUAL(EDHOC_PRK_STATE_4E3M, resp_ctx->prk_state);
2560
+
2561
+ ret = edhoc_error_get_code(resp_ctx, &error_code_recv);
2562
+ TEST_ASSERT_EQUAL(EDHOC_SUCCESS, ret);
2563
+ TEST_ASSERT_EQUAL(EDHOC_ERROR_CODE_SUCCESS, error_code_recv);
2564
+
2565
+ /* Verify EAD_4 compose. */
2566
+ TEST_ASSERT_EQUAL(EDHOC_MSG_4, resp_ead_ctx.msg);
2567
+ TEST_ASSERT_EQUAL(ARRAY_SIZE(ead_multiple_tokens_msg_4),
2568
+ resp_ead_ctx.recv_tokens);
2569
+
2570
+ for (size_t i = 0; i < resp_ead_ctx.recv_tokens; ++i) {
2571
+ TEST_ASSERT_EQUAL(ead_multiple_tokens_msg_4[i].label,
2572
+ resp_ead_ctx.token[i].label);
2573
+ TEST_ASSERT_EQUAL(ead_multiple_tokens_msg_4[i].value_len,
2574
+ resp_ead_ctx.token[i].value_len);
2575
+ TEST_ASSERT_EQUAL_UINT8_ARRAY(
2576
+ ead_multiple_tokens_msg_4[i].value,
2577
+ resp_ead_ctx.token[i].value,
2578
+ resp_ead_ctx.token[i].value_len);
2579
+ }
2580
+
2581
+ /* EDHOC message 4 process. */
2582
+ ret = edhoc_message_4_process(init_ctx, msg_4, msg_4_len);
2583
+
2584
+ TEST_ASSERT_EQUAL(EDHOC_SUCCESS, ret);
2585
+ TEST_ASSERT_EQUAL(EDHOC_SM_PERSISTED, init_ctx->status);
2586
+ TEST_ASSERT_EQUAL(true, init_ctx->is_oscore_export_allowed);
2587
+ TEST_ASSERT_EQUAL(EDHOC_TH_STATE_4, init_ctx->th_state);
2588
+ TEST_ASSERT_EQUAL(EDHOC_PRK_STATE_4E3M, init_ctx->prk_state);
2589
+
2590
+ ret = edhoc_error_get_code(init_ctx, &error_code_recv);
2591
+ TEST_ASSERT_EQUAL(EDHOC_SUCCESS, ret);
2592
+ TEST_ASSERT_EQUAL(EDHOC_ERROR_CODE_SUCCESS, error_code_recv);
2593
+
2594
+ /* Verify EAD_4 process. */
2595
+ TEST_ASSERT_EQUAL(EDHOC_MSG_4, init_ead_ctx.msg);
2596
+ TEST_ASSERT_EQUAL(ARRAY_SIZE(ead_multiple_tokens_msg_4),
2597
+ init_ead_ctx.recv_tokens);
2598
+
2599
+ for (size_t i = 0; i < init_ead_ctx.recv_tokens; ++i) {
2600
+ TEST_ASSERT_EQUAL(ead_multiple_tokens_msg_4[i].label,
2601
+ init_ead_ctx.token[i].label);
2602
+ TEST_ASSERT_EQUAL(ead_multiple_tokens_msg_4[i].value_len,
2603
+ init_ead_ctx.token[i].value_len);
2604
+ TEST_ASSERT_EQUAL_UINT8_ARRAY(
2605
+ ead_multiple_tokens_msg_4[i].value,
2606
+ init_ead_ctx.token[i].value,
2607
+ init_ead_ctx.token[i].value_len);
2608
+ }
2609
+
2610
+ /* Derive OSCORE master secret and master salt. */
2611
+ uint8_t init_master_secret[ARRAY_SIZE(OSCORE_Master_Secret)] = { 0 };
2612
+ uint8_t init_master_salt[ARRAY_SIZE(OSCORE_Master_Salt)] = { 0 };
2613
+ size_t init_sender_id_len = 0;
2614
+ uint8_t init_sender_id[ARRAY_SIZE(C_R)] = { 0 };
2615
+ size_t init_recipient_id_len = 0;
2616
+ uint8_t init_recipient_id[ARRAY_SIZE(C_I)] = { 0 };
2617
+
2618
+ ret = edhoc_export_oscore_session(
2619
+ init_ctx, init_master_secret, ARRAY_SIZE(init_master_secret),
2620
+ init_master_salt, ARRAY_SIZE(init_master_salt), init_sender_id,
2621
+ ARRAY_SIZE(init_sender_id), &init_sender_id_len,
2622
+ init_recipient_id, ARRAY_SIZE(init_recipient_id),
2623
+ &init_recipient_id_len);
2624
+
2625
+ TEST_ASSERT_EQUAL(EDHOC_SUCCESS, ret);
2626
+ TEST_ASSERT_EQUAL(EDHOC_SM_PERSISTED, init_ctx->status);
2627
+ TEST_ASSERT_EQUAL(false, init_ctx->is_oscore_export_allowed);
2628
+ TEST_ASSERT_EQUAL(EDHOC_PRK_STATE_OUT, init_ctx->prk_state);
2629
+
2630
+ /* Derive OSCORE master secret and master salt. */
2631
+ uint8_t resp_master_secret[ARRAY_SIZE(OSCORE_Master_Secret)] = { 0 };
2632
+ uint8_t resp_master_salt[ARRAY_SIZE(OSCORE_Master_Salt)] = { 0 };
2633
+ size_t resp_sender_id_len = 0;
2634
+ uint8_t resp_sender_id[ARRAY_SIZE(C_I)] = { 0 };
2635
+ size_t resp_recipient_id_len = 0;
2636
+ uint8_t resp_recipient_id[ARRAY_SIZE(C_R)] = { 0 };
2637
+
2638
+ ret = edhoc_export_oscore_session(
2639
+ resp_ctx, resp_master_secret, ARRAY_SIZE(resp_master_secret),
2640
+ resp_master_salt, ARRAY_SIZE(resp_master_salt), resp_sender_id,
2641
+ ARRAY_SIZE(resp_sender_id), &resp_sender_id_len,
2642
+ resp_recipient_id, ARRAY_SIZE(resp_recipient_id),
2643
+ &resp_recipient_id_len);
2644
+
2645
+ TEST_ASSERT_EQUAL(EDHOC_SUCCESS, ret);
2646
+ TEST_ASSERT_EQUAL(EDHOC_SM_PERSISTED, resp_ctx->status);
2647
+ TEST_ASSERT_EQUAL(false, resp_ctx->is_oscore_export_allowed);
2648
+ TEST_ASSERT_EQUAL(EDHOC_PRK_STATE_OUT, resp_ctx->prk_state);
2649
+
2650
+ TEST_ASSERT_EQUAL_UINT8_ARRAY(init_master_secret, resp_master_secret,
2651
+ ARRAY_SIZE(resp_master_secret));
2652
+
2653
+ TEST_ASSERT_EQUAL_UINT8_ARRAY(init_master_salt, resp_master_salt,
2654
+ ARRAY_SIZE(resp_master_salt));
2655
+
2656
+ TEST_ASSERT_EQUAL(init_sender_id_len, resp_recipient_id_len);
2657
+ TEST_ASSERT_EQUAL_UINT8_ARRAY(init_sender_id, resp_recipient_id,
2658
+ init_sender_id_len);
2659
+ TEST_ASSERT_EQUAL(init_recipient_id_len, resp_sender_id_len);
2660
+ TEST_ASSERT_EQUAL_UINT8_ARRAY(init_recipient_id, resp_sender_id,
2661
+ resp_sender_id_len);
2662
+ }
2663
+
2664
+ TEST_GROUP_RUNNER(rfc9529_chapter_2)
2665
+ {
2666
+ RUN_TEST_CASE(rfc9529_chapter_2, message_1_compose);
2667
+ RUN_TEST_CASE(rfc9529_chapter_2, message_1_process);
2668
+ RUN_TEST_CASE(rfc9529_chapter_2, message_2_compose);
2669
+ RUN_TEST_CASE(rfc9529_chapter_2, message_2_compose_any);
2670
+ RUN_TEST_CASE(rfc9529_chapter_2, message_2_process);
2671
+ RUN_TEST_CASE(rfc9529_chapter_2, message_3_compose);
2672
+ RUN_TEST_CASE(rfc9529_chapter_2, message_3_compose_any);
2673
+ RUN_TEST_CASE(rfc9529_chapter_2, message_3_process);
2674
+ RUN_TEST_CASE(rfc9529_chapter_2, message_4_compose);
2675
+ RUN_TEST_CASE(rfc9529_chapter_2, message_4_process);
2676
+ RUN_TEST_CASE(rfc9529_chapter_2, handshake);
2677
+ RUN_TEST_CASE(rfc9529_chapter_2, prk_exporter);
2678
+ RUN_TEST_CASE(rfc9529_chapter_2, handshake_real_crypto);
2679
+ RUN_TEST_CASE(rfc9529_chapter_2, handshake_real_crypto_ead_single);
2680
+ RUN_TEST_CASE(rfc9529_chapter_2, handshake_real_crypto_ead_many);
2681
+ }