edhoc 1.0.4 → 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 (314) hide show
  1. package/README.md +170 -0
  2. package/binding.gyp +13 -11
  3. package/dist/bindings.d.ts +5 -0
  4. package/dist/bindings.d.ts.map +1 -0
  5. package/dist/bindings.js +10 -0
  6. package/dist/crypto.d.ts +29 -0
  7. package/dist/crypto.d.ts.map +1 -0
  8. package/dist/crypto.js +205 -0
  9. package/dist/edhoc.d.ts +368 -0
  10. package/dist/edhoc.d.ts.map +1 -0
  11. package/dist/edhoc.js +76 -0
  12. package/dist/index.d.ts +4 -0
  13. package/dist/index.d.ts.map +1 -0
  14. package/dist/index.js +19 -0
  15. package/dist/x509credentials.d.ts +20 -0
  16. package/dist/x509credentials.d.ts.map +1 -0
  17. package/dist/x509credentials.js +140 -0
  18. package/external/libedhoc/backends/cbor/include/backend_cbor_bstr_type_decode.h +1 -1
  19. package/external/libedhoc/backends/cbor/include/backend_cbor_bstr_type_encode.h +1 -1
  20. package/external/libedhoc/backends/cbor/include/backend_cbor_bstr_type_types.h +1 -1
  21. package/external/libedhoc/backends/cbor/include/backend_cbor_ead_decode.h +2 -2
  22. package/external/libedhoc/backends/cbor/include/backend_cbor_ead_encode.h +2 -2
  23. package/external/libedhoc/backends/cbor/include/backend_cbor_edhoc_types.h +48 -43
  24. package/external/libedhoc/backends/cbor/include/backend_cbor_enc_structure_decode.h +1 -1
  25. package/external/libedhoc/backends/cbor/include/backend_cbor_enc_structure_encode.h +1 -1
  26. package/external/libedhoc/backends/cbor/include/backend_cbor_enc_structure_types.h +3 -3
  27. package/external/libedhoc/backends/cbor/include/backend_cbor_id_cred_x_decode.h +1 -1
  28. package/external/libedhoc/backends/cbor/include/backend_cbor_id_cred_x_encode.h +1 -1
  29. package/external/libedhoc/backends/cbor/include/backend_cbor_info_decode.h +1 -1
  30. package/external/libedhoc/backends/cbor/include/backend_cbor_info_encode.h +1 -1
  31. package/external/libedhoc/backends/cbor/include/backend_cbor_int_type_decode.h +1 -1
  32. package/external/libedhoc/backends/cbor/include/backend_cbor_int_type_encode.h +1 -1
  33. package/external/libedhoc/backends/cbor/include/backend_cbor_int_type_types.h +1 -1
  34. package/external/libedhoc/backends/cbor/include/backend_cbor_message_1_decode.h +1 -1
  35. package/external/libedhoc/backends/cbor/include/backend_cbor_message_1_encode.h +1 -1
  36. package/external/libedhoc/backends/cbor/include/backend_cbor_message_2_decode.h +1 -1
  37. package/external/libedhoc/backends/cbor/include/backend_cbor_message_2_encode.h +1 -1
  38. package/external/libedhoc/backends/cbor/include/backend_cbor_message_3_decode.h +1 -1
  39. package/external/libedhoc/backends/cbor/include/backend_cbor_message_3_encode.h +1 -1
  40. package/external/libedhoc/backends/cbor/include/backend_cbor_message_4_decode.h +1 -1
  41. package/external/libedhoc/backends/cbor/include/backend_cbor_message_4_encode.h +1 -1
  42. package/external/libedhoc/backends/cbor/include/backend_cbor_message_error_decode.h +1 -1
  43. package/external/libedhoc/backends/cbor/include/backend_cbor_message_error_encode.h +1 -1
  44. package/external/libedhoc/backends/cbor/include/backend_cbor_plaintext_2_decode.h +1 -1
  45. package/external/libedhoc/backends/cbor/include/backend_cbor_plaintext_2_encode.h +1 -1
  46. package/external/libedhoc/backends/cbor/include/backend_cbor_plaintext_3_decode.h +1 -1
  47. package/external/libedhoc/backends/cbor/include/backend_cbor_plaintext_3_encode.h +1 -1
  48. package/external/libedhoc/backends/cbor/include/backend_cbor_plaintext_4_decode.h +3 -3
  49. package/external/libedhoc/backends/cbor/include/backend_cbor_plaintext_4_encode.h +3 -3
  50. package/external/libedhoc/backends/cbor/include/backend_cbor_sig_structure_decode.h +1 -1
  51. package/external/libedhoc/backends/cbor/include/backend_cbor_sig_structure_encode.h +1 -1
  52. package/external/libedhoc/backends/cbor/include/backend_cbor_sig_structure_types.h +4 -4
  53. package/external/libedhoc/backends/cbor/include/backend_cbor_x509_types.h +93 -83
  54. package/external/libedhoc/backends/cbor/src/backend_cbor_bstr_type_decode.c +11 -20
  55. package/external/libedhoc/backends/cbor/src/backend_cbor_bstr_type_encode.c +11 -20
  56. package/external/libedhoc/backends/cbor/src/backend_cbor_ead_decode.c +27 -32
  57. package/external/libedhoc/backends/cbor/src/backend_cbor_ead_encode.c +27 -32
  58. package/external/libedhoc/backends/cbor/src/backend_cbor_enc_structure_decode.c +14 -23
  59. package/external/libedhoc/backends/cbor/src/backend_cbor_enc_structure_encode.c +14 -23
  60. package/external/libedhoc/backends/cbor/src/backend_cbor_id_cred_x_decode.c +63 -52
  61. package/external/libedhoc/backends/cbor/src/backend_cbor_id_cred_x_encode.c +62 -51
  62. package/external/libedhoc/backends/cbor/src/backend_cbor_info_decode.c +14 -23
  63. package/external/libedhoc/backends/cbor/src/backend_cbor_info_encode.c +14 -23
  64. package/external/libedhoc/backends/cbor/src/backend_cbor_int_type_decode.c +11 -20
  65. package/external/libedhoc/backends/cbor/src/backend_cbor_int_type_encode.c +11 -20
  66. package/external/libedhoc/backends/cbor/src/backend_cbor_message_1_decode.c +54 -51
  67. package/external/libedhoc/backends/cbor/src/backend_cbor_message_1_encode.c +54 -51
  68. package/external/libedhoc/backends/cbor/src/backend_cbor_message_2_decode.c +11 -20
  69. package/external/libedhoc/backends/cbor/src/backend_cbor_message_2_encode.c +11 -20
  70. package/external/libedhoc/backends/cbor/src/backend_cbor_message_3_decode.c +11 -20
  71. package/external/libedhoc/backends/cbor/src/backend_cbor_message_3_encode.c +11 -20
  72. package/external/libedhoc/backends/cbor/src/backend_cbor_message_4_decode.c +11 -20
  73. package/external/libedhoc/backends/cbor/src/backend_cbor_message_4_encode.c +11 -20
  74. package/external/libedhoc/backends/cbor/src/backend_cbor_message_error_decode.c +36 -37
  75. package/external/libedhoc/backends/cbor/src/backend_cbor_message_error_encode.c +36 -37
  76. package/external/libedhoc/backends/cbor/src/backend_cbor_plaintext_2_decode.c +103 -80
  77. package/external/libedhoc/backends/cbor/src/backend_cbor_plaintext_2_encode.c +102 -79
  78. package/external/libedhoc/backends/cbor/src/backend_cbor_plaintext_3_decode.c +99 -76
  79. package/external/libedhoc/backends/cbor/src/backend_cbor_plaintext_3_encode.c +98 -75
  80. package/external/libedhoc/backends/cbor/src/backend_cbor_plaintext_4_decode.c +40 -41
  81. package/external/libedhoc/backends/cbor/src/backend_cbor_plaintext_4_encode.c +40 -41
  82. package/external/libedhoc/backends/cbor/src/backend_cbor_sig_structure_decode.c +15 -24
  83. package/external/libedhoc/backends/cbor/src/backend_cbor_sig_structure_encode.c +15 -24
  84. package/external/libedhoc/externals/Unity/examples/example_1/src/ProductionCode.c +31 -0
  85. package/external/libedhoc/externals/Unity/examples/example_1/src/ProductionCode.h +10 -0
  86. package/external/libedhoc/externals/Unity/examples/example_1/src/ProductionCode2.c +18 -0
  87. package/external/libedhoc/externals/Unity/examples/example_1/src/ProductionCode2.h +9 -0
  88. package/external/libedhoc/externals/Unity/examples/example_1/test/TestProductionCode.c +69 -0
  89. package/external/libedhoc/externals/Unity/examples/example_1/test/TestProductionCode2.c +38 -0
  90. package/external/libedhoc/externals/Unity/examples/example_1/test/test_runners/TestProductionCode2_Runner.c +53 -0
  91. package/external/libedhoc/externals/Unity/examples/example_1/test/test_runners/TestProductionCode_Runner.c +57 -0
  92. package/external/libedhoc/externals/Unity/examples/example_2/src/ProductionCode.c +31 -0
  93. package/external/libedhoc/externals/Unity/examples/example_2/src/ProductionCode.h +10 -0
  94. package/external/libedhoc/externals/Unity/examples/example_2/src/ProductionCode2.c +18 -0
  95. package/external/libedhoc/externals/Unity/examples/example_2/src/ProductionCode2.h +9 -0
  96. package/external/libedhoc/externals/Unity/examples/example_2/test/TestProductionCode.c +71 -0
  97. package/external/libedhoc/externals/Unity/examples/example_2/test/TestProductionCode2.c +40 -0
  98. package/external/libedhoc/externals/Unity/examples/example_2/test/test_runners/TestProductionCode2_Runner.c +16 -0
  99. package/external/libedhoc/externals/Unity/examples/example_2/test/test_runners/TestProductionCode_Runner.c +18 -0
  100. package/external/libedhoc/externals/Unity/examples/example_2/test/test_runners/all_tests.c +19 -0
  101. package/external/libedhoc/externals/Unity/examples/example_3/helper/UnityHelper.c +17 -0
  102. package/external/libedhoc/externals/Unity/examples/example_3/helper/UnityHelper.h +19 -0
  103. package/external/libedhoc/externals/Unity/examples/example_3/src/ProductionCode.c +31 -0
  104. package/external/libedhoc/externals/Unity/examples/example_3/src/ProductionCode.h +10 -0
  105. package/external/libedhoc/externals/Unity/examples/example_3/src/ProductionCode2.c +18 -0
  106. package/external/libedhoc/externals/Unity/examples/example_3/src/ProductionCode2.h +9 -0
  107. package/external/libedhoc/externals/Unity/examples/example_3/test/TestProductionCode.c +69 -0
  108. package/external/libedhoc/externals/Unity/examples/example_3/test/TestProductionCode2.c +38 -0
  109. package/external/libedhoc/externals/Unity/examples/example_4/src/ProductionCode.c +31 -0
  110. package/external/libedhoc/externals/Unity/examples/example_4/src/ProductionCode.h +10 -0
  111. package/external/libedhoc/externals/Unity/examples/example_4/src/ProductionCode2.c +18 -0
  112. package/external/libedhoc/externals/Unity/examples/example_4/src/ProductionCode2.h +9 -0
  113. package/external/libedhoc/externals/Unity/examples/example_4/test/TestProductionCode.c +70 -0
  114. package/external/libedhoc/externals/Unity/examples/example_4/test/TestProductionCode2.c +42 -0
  115. package/external/libedhoc/externals/Unity/examples/example_4/test/test_runners/TestProductionCode2_Runner.c +53 -0
  116. package/external/libedhoc/externals/Unity/examples/example_4/test/test_runners/TestProductionCode_Runner.c +57 -0
  117. package/external/libedhoc/externals/Unity/examples/unity_config.h +251 -0
  118. package/external/libedhoc/externals/Unity/extras/bdd/src/unity_bdd.h +44 -0
  119. package/external/libedhoc/externals/Unity/extras/bdd/test/test_bdd.c +129 -0
  120. package/external/libedhoc/externals/Unity/extras/fixture/src/unity_fixture.c +310 -0
  121. package/external/libedhoc/externals/Unity/extras/fixture/src/unity_fixture.h +95 -0
  122. package/external/libedhoc/externals/Unity/extras/fixture/src/unity_fixture_internals.h +51 -0
  123. package/external/libedhoc/externals/Unity/extras/fixture/test/main/AllTests.c +20 -0
  124. package/external/libedhoc/externals/Unity/extras/fixture/test/template_fixture_tests.c +40 -0
  125. package/external/libedhoc/externals/Unity/extras/fixture/test/unity_fixture_Test.c +246 -0
  126. package/external/libedhoc/externals/Unity/extras/fixture/test/unity_fixture_TestRunner.c +33 -0
  127. package/external/libedhoc/externals/Unity/extras/memory/src/unity_memory.c +203 -0
  128. package/external/libedhoc/externals/Unity/extras/memory/src/unity_memory.h +61 -0
  129. package/external/libedhoc/externals/Unity/extras/memory/test/unity_memory_Test.c +326 -0
  130. package/external/libedhoc/externals/Unity/extras/memory/test/unity_memory_TestRunner.c +50 -0
  131. package/external/libedhoc/externals/Unity/extras/memory/test/unity_output_Spy.c +57 -0
  132. package/external/libedhoc/externals/Unity/extras/memory/test/unity_output_Spy.h +17 -0
  133. package/external/libedhoc/externals/Unity/src/unity.c +2501 -0
  134. package/external/libedhoc/externals/Unity/src/unity.h +698 -0
  135. package/external/libedhoc/externals/Unity/src/unity_internals.h +1183 -0
  136. package/external/libedhoc/externals/Unity/test/expectdata/testsample_cmd.c +61 -0
  137. package/external/libedhoc/externals/Unity/test/expectdata/testsample_def.c +57 -0
  138. package/external/libedhoc/externals/Unity/test/expectdata/testsample_head1.c +55 -0
  139. package/external/libedhoc/externals/Unity/test/expectdata/testsample_head1.h +15 -0
  140. package/external/libedhoc/externals/Unity/test/expectdata/testsample_mock_cmd.c +80 -0
  141. package/external/libedhoc/externals/Unity/test/expectdata/testsample_mock_def.c +76 -0
  142. package/external/libedhoc/externals/Unity/test/expectdata/testsample_mock_head1.c +75 -0
  143. package/external/libedhoc/externals/Unity/test/expectdata/testsample_mock_head1.h +13 -0
  144. package/external/libedhoc/externals/Unity/test/expectdata/testsample_mock_new1.c +89 -0
  145. package/external/libedhoc/externals/Unity/test/expectdata/testsample_mock_new2.c +89 -0
  146. package/external/libedhoc/externals/Unity/test/expectdata/testsample_mock_param.c +77 -0
  147. package/external/libedhoc/externals/Unity/test/expectdata/testsample_mock_run1.c +89 -0
  148. package/external/libedhoc/externals/Unity/test/expectdata/testsample_mock_run2.c +89 -0
  149. package/external/libedhoc/externals/Unity/test/expectdata/testsample_mock_yaml.c +90 -0
  150. package/external/libedhoc/externals/Unity/test/expectdata/testsample_new1.c +67 -0
  151. package/external/libedhoc/externals/Unity/test/expectdata/testsample_new2.c +70 -0
  152. package/external/libedhoc/externals/Unity/test/expectdata/testsample_param.c +58 -0
  153. package/external/libedhoc/externals/Unity/test/expectdata/testsample_run1.c +67 -0
  154. package/external/libedhoc/externals/Unity/test/expectdata/testsample_run2.c +70 -0
  155. package/external/libedhoc/externals/Unity/test/expectdata/testsample_yaml.c +71 -0
  156. package/external/libedhoc/externals/Unity/test/testdata/CException.h +18 -0
  157. package/external/libedhoc/externals/Unity/test/testdata/Defs.h +16 -0
  158. package/external/libedhoc/externals/Unity/test/testdata/cmock.h +21 -0
  159. package/external/libedhoc/externals/Unity/test/testdata/mockMock.h +20 -0
  160. package/external/libedhoc/externals/Unity/test/testdata/testRunnerGenerator.c +204 -0
  161. package/external/libedhoc/externals/Unity/test/testdata/testRunnerGeneratorSmall.c +73 -0
  162. package/external/libedhoc/externals/Unity/test/testdata/testRunnerGeneratorWithMocks.c +200 -0
  163. package/external/libedhoc/externals/Unity/test/tests/self_assessment_utils.h +151 -0
  164. package/external/libedhoc/externals/Unity/test/tests/test_unity_arrays.c +2941 -0
  165. package/external/libedhoc/externals/Unity/test/tests/test_unity_core.c +375 -0
  166. package/external/libedhoc/externals/Unity/test/tests/test_unity_doubles.c +1285 -0
  167. package/external/libedhoc/externals/Unity/test/tests/test_unity_floats.c +1395 -0
  168. package/external/libedhoc/externals/Unity/test/tests/test_unity_integers.c +2863 -0
  169. package/external/libedhoc/externals/Unity/test/tests/test_unity_integers_64.c +783 -0
  170. package/external/libedhoc/externals/Unity/test/tests/test_unity_memory.c +82 -0
  171. package/external/libedhoc/externals/Unity/test/tests/test_unity_parameterized.c +309 -0
  172. package/external/libedhoc/externals/Unity/test/tests/test_unity_parameterizedDemo.c +28 -0
  173. package/external/libedhoc/externals/Unity/test/tests/test_unity_strings.c +330 -0
  174. package/external/libedhoc/externals/Unity/test/tests/types_for_test.h +21 -0
  175. package/external/libedhoc/externals/zcbor/include/zcbor_common.h +147 -60
  176. package/external/libedhoc/externals/zcbor/include/zcbor_decode.h +291 -202
  177. package/external/libedhoc/externals/zcbor/include/zcbor_encode.h +100 -156
  178. package/external/libedhoc/externals/zcbor/include/zcbor_print.h +165 -0
  179. package/external/libedhoc/externals/zcbor/samples/hello_world/src/main.c +1 -1
  180. package/external/libedhoc/externals/zcbor/samples/pet/include/pet_decode.h +1 -1
  181. package/external/libedhoc/externals/zcbor/samples/pet/include/pet_encode.h +1 -1
  182. package/external/libedhoc/externals/zcbor/samples/pet/include/pet_types.h +4 -4
  183. package/external/libedhoc/externals/zcbor/samples/pet/src/main.c +4 -4
  184. package/external/libedhoc/externals/zcbor/samples/pet/src/pet_decode.c +15 -24
  185. package/external/libedhoc/externals/zcbor/samples/pet/src/pet_encode.c +14 -23
  186. package/external/libedhoc/externals/zcbor/src/zcbor_common.c +202 -29
  187. package/external/libedhoc/externals/zcbor/src/zcbor_decode.c +633 -173
  188. package/external/libedhoc/externals/zcbor/src/zcbor_encode.c +71 -184
  189. package/external/libedhoc/externals/zcbor/tests/decode/test1_suit_old_formats/src/main.c +152 -153
  190. package/external/libedhoc/externals/zcbor/tests/decode/test2_suit/src/main.c +64 -64
  191. package/external/libedhoc/externals/zcbor/tests/decode/test3_simple/src/main.c +15 -16
  192. package/external/libedhoc/externals/zcbor/tests/decode/test5_corner_cases/src/main.c +228 -84
  193. package/external/libedhoc/externals/zcbor/tests/decode/test7_suit9_simple/src/main.c +9 -9
  194. package/external/libedhoc/externals/zcbor/tests/decode/test8_suit12/src/main.c +0 -1
  195. package/external/libedhoc/externals/zcbor/tests/decode/test9_manifest14/src/main.c +172 -173
  196. package/external/libedhoc/externals/zcbor/tests/encode/test1_suit/src/main.c +73 -73
  197. package/external/libedhoc/externals/zcbor/tests/encode/test2_simple/src/main.c +1 -2
  198. package/external/libedhoc/externals/zcbor/tests/encode/test3_corner_cases/src/main.c +83 -56
  199. package/external/libedhoc/externals/zcbor/tests/encode/test4_senml/src/main.c +15 -16
  200. package/external/libedhoc/externals/zcbor/tests/fuzz/fuzz_everything.c +12 -0
  201. package/external/libedhoc/externals/zcbor/tests/fuzz/fuzz_manifest12.c +69 -69
  202. package/external/libedhoc/externals/zcbor/tests/unit/test1_unit_tests/src/main.c +448 -55
  203. package/external/libedhoc/externals/zcbor/tests/unit/test3_float16/src/main.c +49 -48
  204. package/external/libedhoc/include/edhoc.h +348 -54
  205. package/external/libedhoc/include/edhoc_common.h +289 -0
  206. package/external/libedhoc/include/edhoc_context.h +60 -35
  207. package/external/libedhoc/include/edhoc_credentials.h +55 -7
  208. package/external/libedhoc/include/edhoc_crypto.h +10 -10
  209. package/external/libedhoc/include/edhoc_ead.h +13 -10
  210. package/external/libedhoc/include/edhoc_macros.h +20 -11
  211. package/external/libedhoc/include/edhoc_values.h +2 -2
  212. package/external/libedhoc/library/edhoc.c +70 -36
  213. package/external/libedhoc/library/edhoc_common.c +1314 -0
  214. package/external/libedhoc/library/edhoc_exporter.c +45 -46
  215. package/external/libedhoc/library/edhoc_message_1.c +107 -72
  216. package/external/libedhoc/library/edhoc_message_2.c +396 -1693
  217. package/external/libedhoc/library/edhoc_message_3.c +465 -1656
  218. package/external/libedhoc/library/edhoc_message_4.c +93 -91
  219. package/external/libedhoc/library/edhoc_message_error.c +41 -41
  220. package/external/libedhoc/tests/include/{cipher_suites/cipher_suite_0.h → cipher_suite_0.h} +131 -134
  221. package/external/libedhoc/tests/include/{cipher_suites/cipher_suite_2.h → cipher_suite_2.h} +139 -140
  222. package/external/libedhoc/tests/include/{edhoc_trace_1/test_vector_1.h → test_vector_rfc9529_chapter_2.h} +786 -738
  223. package/external/libedhoc/tests/include/{edhoc_trace_2/test_vector_2.h → test_vector_rfc9529_chapter_3.h} +14 -10
  224. 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
  225. 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
  226. 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
  227. 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
  228. package/external/libedhoc/tests/src/{cipher_suites/cipher_suite_0.c → cipher_suite_0.c} +445 -447
  229. package/external/libedhoc/tests/src/{cipher_suites/cipher_suite_2.c → cipher_suite_2.c} +600 -600
  230. package/external/libedhoc/tests/src/module_test_api.c +430 -0
  231. package/external/libedhoc/tests/src/module_test_cipher_suite_0.c +395 -0
  232. package/external/libedhoc/tests/src/module_test_cipher_suite_2.c +392 -0
  233. package/external/libedhoc/tests/src/{error_message/test_edhoc_error_message.c → module_test_error_message.c} +94 -69
  234. package/external/libedhoc/tests/src/module_test_main.c +49 -0
  235. package/external/libedhoc/tests/src/{cipher_suite_negotiation/test_edhoc_cipher_suite_negotiation.c → module_test_rfc9528_suites_negotiation.c} +224 -227
  236. package/external/libedhoc/tests/src/module_test_rfc9529_chapter_2.c +2681 -0
  237. package/external/libedhoc/tests/src/module_test_rfc9529_chapter_3.c +1635 -0
  238. package/external/libedhoc/tests/src/module_test_x5chain_sign_keys_suite_0.c +1135 -0
  239. package/external/libedhoc/tests/src/module_test_x5chain_sign_keys_suite_2.c +1249 -0
  240. package/external/libedhoc/tests/src/module_test_x5chain_static_dh_keys_suite_2.c +798 -0
  241. package/external/libedhoc/tests/src/module_test_x5t_sign_keys_suite_2.c +956 -0
  242. package/include/EdhocComposeAsyncWorker.h +8 -6
  243. package/include/EdhocCredentialManager.h +16 -11
  244. package/include/EdhocCryptoManager.h +28 -21
  245. package/include/EdhocEadManager.h +3 -6
  246. package/include/{EdhocExportAsyncWorker.h → EdhocExportOscoreAsyncWorker.h} +20 -17
  247. package/include/EdhocKeyExporterAsyncWorker.h +76 -0
  248. package/include/EdhocKeyUpdateAsyncWorker.h +72 -0
  249. package/include/EdhocProcessAsyncWorker.h +14 -10
  250. package/include/LibEDHOC.h +44 -20
  251. package/include/UserContext.h +7 -9
  252. package/include/Utils.h +31 -27
  253. package/package.json +14 -3
  254. package/prebuilds/android-arm/edhoc.armv7.node +0 -0
  255. package/prebuilds/android-arm64/edhoc.armv8.node +0 -0
  256. package/prebuilds/darwin-arm64/edhoc.node +0 -0
  257. package/prebuilds/darwin-x64/edhoc.node +0 -0
  258. package/prebuilds/linux-arm/edhoc.armv6.node +0 -0
  259. package/prebuilds/linux-arm/edhoc.armv7.node +0 -0
  260. package/prebuilds/linux-arm64/edhoc.armv8.node +0 -0
  261. package/prebuilds/linux-x64/edhoc.glibc.node +0 -0
  262. package/prebuilds/linux-x64/edhoc.musl.node +0 -0
  263. package/prebuilds/win32-ia32/edhoc.node +0 -0
  264. package/prebuilds/win32-x64/edhoc.node +0 -0
  265. package/src/EdhocComposeAsyncWorker.cpp +18 -35
  266. package/src/EdhocCredentialManager.cpp +160 -187
  267. package/src/EdhocCryptoManager.cpp +386 -586
  268. package/src/EdhocEadManager.cpp +10 -18
  269. package/src/EdhocExportOscoreAsyncWorker.cpp +77 -0
  270. package/src/EdhocKeyExporterAsyncWorker.cpp +49 -0
  271. package/src/EdhocKeyUpdateAsyncWorker.cpp +41 -0
  272. package/src/EdhocProcessAsyncWorker.cpp +72 -19
  273. package/src/LibEDHOC.cpp +213 -174
  274. package/src/Suites.cpp +39 -72
  275. package/src/Utils.cpp +32 -56
  276. package/test/basic.test.ts +64 -0
  277. package/test/vectors.test.ts +111 -0
  278. package/external/libedhoc/externals/zcbor/include/zcbor_debug.h +0 -69
  279. package/external/libedhoc/tests/include/cipher_suite_negotiation/test_edhoc_cipher_suite_negotiation.h +0 -37
  280. package/external/libedhoc/tests/include/cipher_suites/test_cipher_suite_0.h +0 -48
  281. package/external/libedhoc/tests/include/cipher_suites/test_cipher_suite_2.h +0 -48
  282. package/external/libedhoc/tests/include/edhoc_trace_1/authentication_credentials_1.h +0 -60
  283. package/external/libedhoc/tests/include/edhoc_trace_1/test_edhoc_handshake_1.h +0 -208
  284. package/external/libedhoc/tests/include/edhoc_trace_1/test_edhoc_handshake_ead_1.h +0 -59
  285. package/external/libedhoc/tests/include/edhoc_trace_2/authentication_credentials_2.h +0 -60
  286. package/external/libedhoc/tests/include/edhoc_trace_2/test_edhoc_handshake_2.h +0 -199
  287. package/external/libedhoc/tests/include/error_message/test_edhoc_error_message.h +0 -48
  288. package/external/libedhoc/tests/include/x509_chain_cs_0/authentication_credentials_x5chain_cs_0.h +0 -92
  289. package/external/libedhoc/tests/include/x509_chain_cs_0/test_edhoc_handshake_x5chain_cs_0.h +0 -96
  290. package/external/libedhoc/tests/include/x509_chain_cs_2/authentication_credentials_x5chain_cs_2.h +0 -58
  291. package/external/libedhoc/tests/include/x509_chain_cs_2/test_edhoc_handshake_x5chain_cs_2.h +0 -56
  292. package/external/libedhoc/tests/include/x509_chain_cs_2/test_edhoc_handshake_x5chain_cs_2_ead.h +0 -57
  293. package/external/libedhoc/tests/include/x509_chain_cs_2_static_dh/authentication_credentials_x5chain_cs_2_static_dh.h +0 -59
  294. package/external/libedhoc/tests/include/x509_chain_cs_2_static_dh/test_edhoc_handshake_x5chain_cs_2_static_dh_ead.h +0 -57
  295. package/external/libedhoc/tests/include/x509_hash_cs_2/authentication_credentials_x5t_cs_2.h +0 -60
  296. package/external/libedhoc/tests/include/x509_hash_cs_2/test_edhoc_handshake_x5t_cs_2_ead.h +0 -57
  297. package/external/libedhoc/tests/src/cipher_suites/test_cipher_suite_0.c +0 -475
  298. package/external/libedhoc/tests/src/cipher_suites/test_cipher_suite_2.c +0 -473
  299. package/external/libedhoc/tests/src/edhoc_trace_1/authentication_credentials_1.c +0 -252
  300. package/external/libedhoc/tests/src/edhoc_trace_1/test_edhoc_handshake_1.c +0 -1829
  301. package/external/libedhoc/tests/src/edhoc_trace_1/test_edhoc_handshake_ead_1.c +0 -1247
  302. package/external/libedhoc/tests/src/edhoc_trace_2/authentication_credentials_2.c +0 -170
  303. package/external/libedhoc/tests/src/edhoc_trace_2/test_edhoc_handshake_2.c +0 -1783
  304. package/external/libedhoc/tests/src/tests.c +0 -228
  305. package/external/libedhoc/tests/src/x509_chain_cs_0/authentication_credentials_x5chain_cs_0.c +0 -332
  306. package/external/libedhoc/tests/src/x509_chain_cs_0/test_edhoc_handshake_x5chain_cs_0.c +0 -936
  307. package/external/libedhoc/tests/src/x509_chain_cs_2/authentication_credentials_x5chain_cs_2.c +0 -166
  308. package/external/libedhoc/tests/src/x509_chain_cs_2/test_edhoc_handshake_x5chain_cs_2.c +0 -587
  309. package/external/libedhoc/tests/src/x509_chain_cs_2/test_edhoc_handshake_x5chain_cs_2_ead.c +0 -917
  310. package/external/libedhoc/tests/src/x509_chain_cs_2_static_dh/authentication_credentials_x5chain_cs_2_static_dh.c +0 -186
  311. package/external/libedhoc/tests/src/x509_chain_cs_2_static_dh/test_edhoc_handshake_x5chain_cs_2_static_dh_ead.c +0 -743
  312. package/external/libedhoc/tests/src/x509_hash_cs_2/authentication_credentials_x5t_cs_2.c +0 -261
  313. package/external/libedhoc/tests/src/x509_hash_cs_2/test_edhoc_handshake_x5t_cs_2_ead.c +0 -854
  314. package/src/EdhocExportAsyncWorker.cpp +0 -82
@@ -0,0 +1,1249 @@
1
+ /**
2
+ * \file module_test_x5chain_sign_keys_suite_2.c
3
+ * \author Kamil Kielbasa
4
+ * \brief Module tests for EDHOC handshake with:
5
+ * - X.509 chain.
6
+ * - signature keys.
7
+ * - cipher suite 2.
8
+ * - multiple EAD tokens.
9
+ * \version 0.6
10
+ * \date 2024-08-05
11
+ *
12
+ * \copyright Copyright (c) 2024
13
+ *
14
+ */
15
+
16
+ /* Include files ----------------------------------------------------------- */
17
+
18
+ /* Test vector header: */
19
+ #include "test_vector_x5chain_sign_keys_suite_2.h"
20
+
21
+ /* Cipher suite 2 header: */
22
+ #include "cipher_suite_2.h"
23
+
24
+ /* Standard library headers: */
25
+ #include <stdio.h>
26
+ #include <string.h>
27
+ #include <stdint.h>
28
+ #include <stddef.h>
29
+ #include <stdbool.h>
30
+
31
+ /* EDHOC header: */
32
+ #define EDHOC_ALLOW_PRIVATE_ACCESS
33
+ #include <edhoc.h>
34
+
35
+ /* PSA crypto header: */
36
+ #include <psa/crypto.h>
37
+
38
+ /* Unity headers: */
39
+ #include <unity.h>
40
+ #include <unity_fixture.h>
41
+
42
+ /* Module defines ---------------------------------------------------------- */
43
+
44
+ #define OSCORE_MASTER_SECRET_LENGTH (16)
45
+ #define OSCORE_MASTER_SALT_LENGTH (8)
46
+ #define DH_KEY_AGREEMENT_LENGTH (32)
47
+ #define ENTROPY_LENGTH (16)
48
+ #define EAD_TOKEN_BUFFER_LEN (300)
49
+ #define MAX_NR_OF_EAD_TOKENS (3)
50
+
51
+ /* Module types and type definitiones -------------------------------------- */
52
+
53
+ struct ead_token_buf {
54
+ int32_t label;
55
+ uint8_t value[EAD_TOKEN_BUFFER_LEN];
56
+ size_t value_len;
57
+ };
58
+
59
+ struct ead_context {
60
+ enum edhoc_message msg;
61
+ size_t recv_tokens;
62
+ struct ead_token_buf token[MAX_NR_OF_EAD_TOKENS];
63
+ };
64
+
65
+ /* Module interface variables and constants -------------------------------- */
66
+ /* Static function declarations -------------------------------------------- */
67
+
68
+ /**
69
+ * \brief Authentication credentials fetch callback for initiator
70
+ * for single certificate.
71
+ */
72
+ static int auth_cred_fetch_init_single_cert(void *user_ctx,
73
+ struct edhoc_auth_creds *auth_cred);
74
+
75
+ /**
76
+ * \brief Authentication credentials fetch callback for responder
77
+ * for single certificate.
78
+ */
79
+ static int auth_cred_fetch_resp_single_cert(void *user_ctx,
80
+ struct edhoc_auth_creds *auth_cred);
81
+
82
+ /**
83
+ * \brief Authentication credentials verify callback for initiator
84
+ * for single certificate.
85
+ */
86
+ static int auth_cred_verify_init_single_cert(void *user_ctx,
87
+ struct edhoc_auth_creds *auth_cred,
88
+ const uint8_t **pub_key,
89
+ size_t *pub_key_len);
90
+
91
+ /**
92
+ * \brief Authentication credentials verify callback for responder
93
+ * for single certificate.
94
+ */
95
+ static int auth_cred_verify_resp_single_cert(void *user_ctx,
96
+ struct edhoc_auth_creds *auth_cred,
97
+ const uint8_t **pub_key,
98
+ size_t *pub_key_len);
99
+
100
+ /**
101
+ * \brief Example EAD compose for multiple tokens.
102
+ */
103
+ static int ead_compose_multiple_tokens(void *user_context,
104
+ enum edhoc_message message,
105
+ struct edhoc_ead_token *ead_token,
106
+ size_t ead_token_size,
107
+ size_t *ead_token_len);
108
+
109
+ /**
110
+ * \brief Example EAD process for multiple tokens.
111
+ */
112
+ static int ead_process_multiple_tokens(void *user_context,
113
+ enum edhoc_message message,
114
+ const struct edhoc_ead_token *ead_token,
115
+ size_t ead_token_size);
116
+
117
+ /**
118
+ * \brief Helper function for printing arrays.
119
+ */
120
+ static inline void print_array(void *user_context, const char *name,
121
+ const uint8_t *buffer, size_t buffer_length);
122
+
123
+ /* Static variables and constants ------------------------------------------ */
124
+
125
+ static int ret = EDHOC_ERROR_GENERIC_ERROR;
126
+ static enum edhoc_error_code error_code_recv =
127
+ EDHOC_ERROR_CODE_UNSPECIFIED_ERROR;
128
+
129
+ static struct edhoc_context edhoc_initiator_context = { 0 };
130
+ static struct edhoc_context *init_ctx = &edhoc_initiator_context;
131
+
132
+ static struct edhoc_context edhoc_responder_context = { 0 };
133
+ static struct edhoc_context *resp_ctx = &edhoc_responder_context;
134
+
135
+ static const uint8_t ead_val_msg_1[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
136
+ static const uint8_t ead_val_msg_2[] = { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05,
137
+ 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b,
138
+ 0x0c, 0x0d, 0x0e, 0x0f };
139
+ static const uint8_t ead_val_msg_3[] = {
140
+ 0x55, 0x9a, 0xea, 0xd0, 0x82, 0x64, 0xd5, 0x79, 0x5d, 0x39, 0x09, 0x71,
141
+ 0x8c, 0xdd, 0x05, 0xab, 0xd4, 0x95, 0x72, 0xe8, 0x4f, 0xe5, 0x55, 0x90,
142
+ 0xee, 0xf3, 0x1a, 0x88, 0xa0, 0x8f, 0xdf, 0xfd, 0x3c, 0xb2, 0x5f, 0x25,
143
+ 0xfa, 0xac, 0xd5, 0x7a, 0x90, 0x43, 0x4f, 0x64, 0xd0, 0x36, 0x2f, 0x2a,
144
+ 0x2d, 0x2d, 0x0a, 0x90, 0xcf, 0x1a, 0x5a, 0x4c, 0x5d, 0xb0, 0x2d, 0x56,
145
+ 0xec, 0xc4, 0xc5, 0xbf, 0x34, 0x00, 0x72, 0x08, 0xd5, 0xb8, 0x87, 0x18,
146
+ 0x58, 0x65, 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8, 0xf9,
147
+ 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b,
148
+ 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b,
149
+ };
150
+
151
+ static const uint8_t ead_val_msg_4[] = { 0xff, 0xee, 0xdd, 0xcc,
152
+ 0xbb, 0xaa, 0x00 };
153
+
154
+ static const struct edhoc_ead_token ead_single_token_msg_1 = {
155
+ .label = 0,
156
+ .value = ead_val_msg_1,
157
+ .value_len = ARRAY_SIZE(ead_val_msg_1),
158
+ };
159
+
160
+ static const struct edhoc_ead_token ead_single_token_msg_2 = {
161
+ .label = 24,
162
+ .value = ead_val_msg_2,
163
+ .value_len = ARRAY_SIZE(ead_val_msg_2),
164
+ };
165
+
166
+ static const struct edhoc_ead_token ead_single_token_msg_3 = {
167
+ .label = 65535,
168
+ .value = ead_val_msg_3,
169
+ .value_len = ARRAY_SIZE(ead_val_msg_3),
170
+ };
171
+
172
+ static const struct edhoc_ead_token ead_single_token_msg_4 = {
173
+ .label = -830,
174
+ .value = ead_val_msg_4,
175
+ .value_len = ARRAY_SIZE(ead_val_msg_4),
176
+ };
177
+
178
+ static const struct edhoc_ead_token ead_multiple_tokens_msg_1[] = {
179
+ ead_single_token_msg_1,
180
+ ead_single_token_msg_2,
181
+ ead_single_token_msg_3,
182
+ };
183
+
184
+ static const struct edhoc_ead_token ead_multiple_tokens_msg_2[] = {
185
+ ead_single_token_msg_3,
186
+ ead_single_token_msg_1,
187
+ };
188
+
189
+ static const struct edhoc_ead_token ead_multiple_tokens_msg_3[] = {
190
+ ead_single_token_msg_3,
191
+ ead_single_token_msg_2,
192
+ ead_single_token_msg_1,
193
+ };
194
+
195
+ static const struct edhoc_ead_token ead_multiple_tokens_msg_4[] = {
196
+ ead_single_token_msg_1,
197
+ ead_single_token_msg_4,
198
+ ead_single_token_msg_3,
199
+ };
200
+
201
+ static const struct edhoc_cipher_suite edhoc_cipher_suite_2 = {
202
+ .value = 2,
203
+ .aead_key_length = 16,
204
+ .aead_tag_length = 8,
205
+ .aead_iv_length = 13,
206
+ .hash_length = 32,
207
+ .mac_length = 32,
208
+ .ecc_key_length = 32,
209
+ .ecc_sign_length = 64,
210
+ };
211
+
212
+ static const struct edhoc_keys edhoc_keys = {
213
+ .import_key = cipher_suite_2_key_import,
214
+ .destroy_key = cipher_suite_2_key_destroy,
215
+ };
216
+
217
+ static const struct edhoc_crypto edhoc_crypto = {
218
+ .make_key_pair = cipher_suite_2_make_key_pair,
219
+ .key_agreement = cipher_suite_2_key_agreement,
220
+ .signature = cipher_suite_2_signature,
221
+ .verify = cipher_suite_2_verify,
222
+ .extract = cipher_suite_2_extract,
223
+ .expand = cipher_suite_2_expand,
224
+ .encrypt = cipher_suite_2_encrypt,
225
+ .decrypt = cipher_suite_2_decrypt,
226
+ .hash = cipher_suite_2_hash,
227
+ };
228
+
229
+ static const struct edhoc_credentials edhoc_auth_cred_single_cert_mocked_init = {
230
+ .fetch = auth_cred_fetch_init_single_cert,
231
+ .verify = auth_cred_verify_init_single_cert,
232
+ };
233
+
234
+ static const struct edhoc_credentials edhoc_auth_cred_single_cert_mocked_resp = {
235
+ .fetch = auth_cred_fetch_resp_single_cert,
236
+ .verify = auth_cred_verify_resp_single_cert,
237
+ };
238
+
239
+ static const struct edhoc_ead edhoc_ead_multiple_tokens = {
240
+ .compose = ead_compose_multiple_tokens,
241
+ .process = ead_process_multiple_tokens,
242
+ };
243
+
244
+ /* Static function definitions --------------------------------------------- */
245
+
246
+ static int auth_cred_fetch_init_single_cert(void *user_ctx,
247
+ struct edhoc_auth_creds *auth_cred)
248
+ {
249
+ (void)user_ctx;
250
+
251
+ if (NULL == auth_cred)
252
+ return EDHOC_ERROR_INVALID_ARGUMENT;
253
+
254
+ auth_cred->label = EDHOC_COSE_HEADER_X509_CHAIN;
255
+ auth_cred->x509_chain.nr_of_certs = 1;
256
+ auth_cred->x509_chain.cert[0] = CRED_I;
257
+ auth_cred->x509_chain.cert_len[0] = ARRAY_SIZE(CRED_I);
258
+
259
+ const int ret = cipher_suite_2_key_import(NULL, EDHOC_KT_SIGNATURE,
260
+ SK_I, ARRAY_SIZE(SK_I),
261
+ auth_cred->priv_key_id);
262
+
263
+ if (EDHOC_SUCCESS != ret)
264
+ return EDHOC_ERROR_CREDENTIALS_FAILURE;
265
+
266
+ return EDHOC_SUCCESS;
267
+ }
268
+
269
+ static int auth_cred_fetch_resp_single_cert(void *user_ctx,
270
+ struct edhoc_auth_creds *auth_cred)
271
+ {
272
+ (void)user_ctx;
273
+
274
+ if (NULL == auth_cred)
275
+ return EDHOC_ERROR_INVALID_ARGUMENT;
276
+
277
+ auth_cred->label = EDHOC_COSE_HEADER_X509_CHAIN;
278
+ auth_cred->x509_chain.nr_of_certs = 1;
279
+ auth_cred->x509_chain.cert[0] = CRED_R;
280
+ auth_cred->x509_chain.cert_len[0] = ARRAY_SIZE(CRED_R);
281
+
282
+ const int ret = cipher_suite_2_key_import(NULL, EDHOC_KT_SIGNATURE,
283
+ SK_R, ARRAY_SIZE(SK_R),
284
+ auth_cred->priv_key_id);
285
+
286
+ if (EDHOC_SUCCESS != ret)
287
+ return EDHOC_ERROR_CREDENTIALS_FAILURE;
288
+
289
+ return EDHOC_SUCCESS;
290
+ }
291
+
292
+ static int auth_cred_verify_init_single_cert(void *user_ctx,
293
+ struct edhoc_auth_creds *auth_cred,
294
+ const uint8_t **pub_key,
295
+ size_t *pub_key_len)
296
+ {
297
+ (void)user_ctx;
298
+
299
+ if (NULL == auth_cred || NULL == pub_key || NULL == pub_key_len)
300
+ return EDHOC_ERROR_INVALID_ARGUMENT;
301
+
302
+ /**
303
+ * \brief Verify COSE header label value.
304
+ */
305
+ if (EDHOC_COSE_HEADER_X509_CHAIN != auth_cred->label)
306
+ return EDHOC_ERROR_CREDENTIALS_FAILURE;
307
+
308
+ /**
309
+ * \brief Verify received number of certificates.
310
+ */
311
+ if (1 != auth_cred->x509_chain.nr_of_certs)
312
+ return EDHOC_ERROR_CREDENTIALS_FAILURE;
313
+
314
+ /**
315
+ * \brief Verify received peer certificate length.
316
+ */
317
+ if (auth_cred->x509_chain.cert_len[0] != ARRAY_SIZE(CRED_R))
318
+ return EDHOC_ERROR_CREDENTIALS_FAILURE;
319
+
320
+ /**
321
+ * \brief Verify received peer certificate.
322
+ */
323
+ if (0 != memcmp(CRED_R, auth_cred->x509_chain.cert[0],
324
+ auth_cred->x509_chain.cert_len[0]))
325
+ return EDHOC_ERROR_CREDENTIALS_FAILURE;
326
+
327
+ /**
328
+ * \brief If successful then assign public key.
329
+ */
330
+ *pub_key = PK_R;
331
+ *pub_key_len = ARRAY_SIZE(PK_R);
332
+
333
+ return EDHOC_SUCCESS;
334
+ }
335
+
336
+ static int auth_cred_verify_resp_single_cert(void *user_ctx,
337
+ struct edhoc_auth_creds *auth_cred,
338
+ const uint8_t **pub_key,
339
+ size_t *pub_key_len)
340
+ {
341
+ (void)user_ctx;
342
+
343
+ if (NULL == auth_cred || NULL == pub_key || NULL == pub_key_len)
344
+ return EDHOC_ERROR_INVALID_ARGUMENT;
345
+
346
+ /**
347
+ * \brief Verify COSE header label value.
348
+ */
349
+ if (EDHOC_COSE_HEADER_X509_CHAIN != auth_cred->label)
350
+ return EDHOC_ERROR_CREDENTIALS_FAILURE;
351
+
352
+ /**
353
+ * \brief Verify received number of certificates.
354
+ */
355
+ if (1 != auth_cred->x509_chain.nr_of_certs)
356
+ return EDHOC_ERROR_CREDENTIALS_FAILURE;
357
+
358
+ /**
359
+ * \brief Verify received peer certificate length.
360
+ */
361
+ if (auth_cred->x509_chain.cert_len[0] != ARRAY_SIZE(CRED_I))
362
+ return EDHOC_ERROR_CREDENTIALS_FAILURE;
363
+
364
+ /**
365
+ * \brief Verify received peer certificate.
366
+ */
367
+ if (0 != memcmp(CRED_I, auth_cred->x509_chain.cert[0],
368
+ auth_cred->x509_chain.cert_len[0]))
369
+ return EDHOC_ERROR_CREDENTIALS_FAILURE;
370
+
371
+ /**
372
+ * \brief If successful then assign public key.
373
+ */
374
+ *pub_key = PK_I;
375
+ *pub_key_len = ARRAY_SIZE(PK_I);
376
+
377
+ return EDHOC_SUCCESS;
378
+ }
379
+
380
+ static int ead_compose_multiple_tokens(void *user_ctx, enum edhoc_message msg,
381
+ struct edhoc_ead_token *ead_token,
382
+ size_t ead_token_size,
383
+ size_t *ead_token_len)
384
+ {
385
+ if (NULL == user_ctx || NULL == ead_token || 0 == ead_token_size ||
386
+ NULL == ead_token_len)
387
+ return EDHOC_ERROR_EAD_PROCESS_FAILURE;
388
+
389
+ size_t len = 0;
390
+ const struct edhoc_ead_token *token = NULL;
391
+
392
+ switch (msg) {
393
+ case EDHOC_MSG_1:
394
+ token = ead_multiple_tokens_msg_1;
395
+ len = ARRAY_SIZE(ead_multiple_tokens_msg_1);
396
+ break;
397
+ case EDHOC_MSG_2:
398
+ token = ead_multiple_tokens_msg_2;
399
+ len = ARRAY_SIZE(ead_multiple_tokens_msg_2);
400
+ break;
401
+ case EDHOC_MSG_3:
402
+ token = ead_multiple_tokens_msg_3;
403
+ len = ARRAY_SIZE(ead_multiple_tokens_msg_3);
404
+ break;
405
+ case EDHOC_MSG_4:
406
+ token = ead_multiple_tokens_msg_4;
407
+ len = ARRAY_SIZE(ead_multiple_tokens_msg_4);
408
+ break;
409
+ default:
410
+ return EDHOC_ERROR_EAD_COMPOSE_FAILURE;
411
+ }
412
+
413
+ *ead_token_len = len;
414
+
415
+ for (size_t i = 0; i < len; ++i)
416
+ ead_token[i] = token[i];
417
+
418
+ struct ead_context *ead_ctx = user_ctx;
419
+
420
+ ead_ctx->msg = msg;
421
+ ead_ctx->recv_tokens = len;
422
+
423
+ for (size_t i = 0; i < ead_ctx->recv_tokens; ++i) {
424
+ ead_ctx->token[i].label = ead_token[i].label;
425
+ ead_ctx->token[i].value_len = ead_token[i].value_len;
426
+ memcpy(ead_ctx->token[i].value, ead_token[i].value,
427
+ ead_token[i].value_len);
428
+ }
429
+
430
+ return EDHOC_SUCCESS;
431
+ }
432
+
433
+ static int ead_process_multiple_tokens(void *user_ctx, enum edhoc_message msg,
434
+ const struct edhoc_ead_token *ead_token,
435
+ size_t ead_token_size)
436
+ {
437
+ if (NULL == user_ctx || NULL == ead_token || 0 == ead_token_size)
438
+ return EDHOC_ERROR_EAD_PROCESS_FAILURE;
439
+
440
+ struct ead_context *ead_ctx = user_ctx;
441
+
442
+ ead_ctx->msg = msg;
443
+ ead_ctx->recv_tokens = ead_token_size;
444
+
445
+ for (size_t i = 0; i < ead_token_size; ++i) {
446
+ ead_ctx->token[i].label = ead_token[i].label;
447
+ ead_ctx->token[i].value_len = ead_token[i].value_len;
448
+ memcpy(ead_ctx->token[i].value, ead_token[i].value,
449
+ ead_token[i].value_len);
450
+ }
451
+
452
+ return EDHOC_SUCCESS;
453
+ }
454
+
455
+ static inline void print_array(void *user_context, const char *name,
456
+ const uint8_t *buffer, size_t buffer_length)
457
+ {
458
+ (void)user_context;
459
+
460
+ printf("%s:\tLEN( %zu )\n", name, buffer_length);
461
+
462
+ for (size_t i = 0; i < buffer_length; ++i) {
463
+ if (0 == i % 16 && i > 0) {
464
+ printf("\n");
465
+ }
466
+
467
+ printf("%02x ", buffer[i]);
468
+ }
469
+
470
+ printf("\n\n");
471
+ }
472
+
473
+ /* Module interface function definitions ----------------------------------- */
474
+
475
+ TEST_GROUP(x5chain_sign_keys_suite_2);
476
+
477
+ TEST_SETUP(x5chain_sign_keys_suite_2)
478
+ {
479
+ ret = psa_crypto_init();
480
+ TEST_ASSERT_EQUAL(PSA_SUCCESS, ret);
481
+
482
+ const enum edhoc_method methods[] = { METHOD };
483
+ const struct edhoc_cipher_suite cipher_suites[] = {
484
+ edhoc_cipher_suite_2,
485
+ };
486
+
487
+ const struct edhoc_connection_id init_cid = {
488
+ .encode_type = EDHOC_CID_TYPE_ONE_BYTE_INTEGER,
489
+ .int_value = (int8_t)C_I[0],
490
+ };
491
+
492
+ struct edhoc_connection_id resp_cid = {
493
+ .encode_type = EDHOC_CID_TYPE_BYTE_STRING,
494
+ .bstr_length = ARRAY_SIZE(C_R),
495
+ };
496
+ memcpy(&resp_cid.bstr_value, C_R, ARRAY_SIZE(C_R));
497
+
498
+ ret = edhoc_context_init(init_ctx);
499
+ TEST_ASSERT_EQUAL(EDHOC_SUCCESS, ret);
500
+
501
+ ret = edhoc_set_methods(init_ctx, methods, ARRAY_SIZE(methods));
502
+ TEST_ASSERT_EQUAL(EDHOC_SUCCESS, ret);
503
+
504
+ ret = edhoc_set_cipher_suites(init_ctx, cipher_suites,
505
+ ARRAY_SIZE(cipher_suites));
506
+ TEST_ASSERT_EQUAL(EDHOC_SUCCESS, ret);
507
+
508
+ ret = edhoc_set_connection_id(init_ctx, &init_cid);
509
+ TEST_ASSERT_EQUAL(EDHOC_SUCCESS, ret);
510
+
511
+ ret = edhoc_bind_keys(init_ctx, &edhoc_keys);
512
+ TEST_ASSERT_EQUAL(EDHOC_SUCCESS, ret);
513
+
514
+ ret = edhoc_bind_crypto(init_ctx, &edhoc_crypto);
515
+ TEST_ASSERT_EQUAL(EDHOC_SUCCESS, ret);
516
+
517
+ ret = edhoc_bind_credentials(init_ctx,
518
+ &edhoc_auth_cred_single_cert_mocked_init);
519
+ TEST_ASSERT_EQUAL(EDHOC_SUCCESS, ret);
520
+
521
+ ret = edhoc_context_init(resp_ctx);
522
+ TEST_ASSERT_EQUAL(EDHOC_SUCCESS, ret);
523
+
524
+ ret = edhoc_set_methods(resp_ctx, methods, ARRAY_SIZE(methods));
525
+ TEST_ASSERT_EQUAL(EDHOC_SUCCESS, ret);
526
+
527
+ ret = edhoc_set_cipher_suites(resp_ctx, cipher_suites,
528
+ ARRAY_SIZE(cipher_suites));
529
+ TEST_ASSERT_EQUAL(EDHOC_SUCCESS, ret);
530
+
531
+ ret = edhoc_set_connection_id(resp_ctx, &resp_cid);
532
+ TEST_ASSERT_EQUAL(EDHOC_SUCCESS, ret);
533
+
534
+ ret = edhoc_bind_keys(resp_ctx, &edhoc_keys);
535
+ TEST_ASSERT_EQUAL(EDHOC_SUCCESS, ret);
536
+
537
+ ret = edhoc_bind_crypto(resp_ctx, &edhoc_crypto);
538
+ TEST_ASSERT_EQUAL(EDHOC_SUCCESS, ret);
539
+
540
+ ret = edhoc_bind_credentials(resp_ctx,
541
+ &edhoc_auth_cred_single_cert_mocked_resp);
542
+ TEST_ASSERT_EQUAL(EDHOC_SUCCESS, ret);
543
+
544
+ #if defined(TEST_TRACES)
545
+ init_ctx->logger = print_array;
546
+ resp_ctx->logger = print_array;
547
+ #endif
548
+ }
549
+
550
+ TEST_TEAR_DOWN(x5chain_sign_keys_suite_2)
551
+ {
552
+ mbedtls_psa_crypto_free();
553
+
554
+ ret = edhoc_context_deinit(init_ctx);
555
+ TEST_ASSERT_EQUAL(EDHOC_SUCCESS, ret);
556
+
557
+ ret = edhoc_context_deinit(resp_ctx);
558
+ TEST_ASSERT_EQUAL(EDHOC_SUCCESS, ret);
559
+ }
560
+
561
+ TEST(x5chain_sign_keys_suite_2, one_cert_in_chain)
562
+ {
563
+ uint8_t buffer[1000] = { 0 };
564
+
565
+ memset(buffer, 0, sizeof(buffer));
566
+ size_t msg_1_len = 0;
567
+ uint8_t *msg_1 = buffer;
568
+
569
+ /* EDHOC message 1 compose. */
570
+ ret = edhoc_message_1_compose(init_ctx, msg_1, ARRAY_SIZE(buffer),
571
+ &msg_1_len);
572
+ TEST_ASSERT_EQUAL(EDHOC_SUCCESS, ret);
573
+ TEST_ASSERT_EQUAL(EDHOC_SM_WAIT_M2, init_ctx->status);
574
+ TEST_ASSERT_EQUAL(false, init_ctx->is_oscore_export_allowed);
575
+ TEST_ASSERT_EQUAL(EDHOC_PRK_STATE_INVALID, init_ctx->prk_state);
576
+ TEST_ASSERT_EQUAL(EDHOC_TH_STATE_1, init_ctx->th_state);
577
+
578
+ ret = edhoc_error_get_code(init_ctx, &error_code_recv);
579
+ TEST_ASSERT_EQUAL(EDHOC_SUCCESS, ret);
580
+ TEST_ASSERT_EQUAL(EDHOC_ERROR_CODE_SUCCESS, error_code_recv);
581
+
582
+ /* EDHOC message 1 process. */
583
+ ret = edhoc_message_1_process(resp_ctx, msg_1, msg_1_len);
584
+ TEST_ASSERT_EQUAL(EDHOC_SUCCESS, ret);
585
+ TEST_ASSERT_EQUAL(EDHOC_SM_RECEIVED_M1, resp_ctx->status);
586
+ TEST_ASSERT_EQUAL(false, resp_ctx->is_oscore_export_allowed);
587
+ TEST_ASSERT_EQUAL(EDHOC_TH_STATE_1, resp_ctx->th_state);
588
+ TEST_ASSERT_EQUAL(EDHOC_PRK_STATE_INVALID, resp_ctx->prk_state);
589
+
590
+ ret = edhoc_error_get_code(resp_ctx, &error_code_recv);
591
+ TEST_ASSERT_EQUAL(EDHOC_SUCCESS, ret);
592
+ TEST_ASSERT_EQUAL(EDHOC_ERROR_CODE_SUCCESS, error_code_recv);
593
+
594
+ TEST_ASSERT_EQUAL(EDHOC_CID_TYPE_ONE_BYTE_INTEGER,
595
+ resp_ctx->peer_cid.encode_type);
596
+ TEST_ASSERT_EQUAL((int8_t)C_I[0], resp_ctx->peer_cid.int_value);
597
+
598
+ memset(buffer, 0, sizeof(buffer));
599
+ size_t msg_2_len = 0;
600
+ uint8_t *msg_2 = buffer;
601
+
602
+ /* EDHOC message 2 compose. */
603
+ ret = edhoc_message_2_compose(resp_ctx, msg_2, ARRAY_SIZE(buffer),
604
+ &msg_2_len);
605
+ TEST_ASSERT_EQUAL(EDHOC_SUCCESS, ret);
606
+ TEST_ASSERT_EQUAL(EDHOC_SM_WAIT_M3, resp_ctx->status);
607
+ TEST_ASSERT_EQUAL(false, resp_ctx->is_oscore_export_allowed);
608
+ TEST_ASSERT_EQUAL(EDHOC_TH_STATE_3, resp_ctx->th_state);
609
+ TEST_ASSERT_EQUAL(EDHOC_PRK_STATE_3E2M, resp_ctx->prk_state);
610
+
611
+ ret = edhoc_error_get_code(resp_ctx, &error_code_recv);
612
+ TEST_ASSERT_EQUAL(EDHOC_SUCCESS, ret);
613
+ TEST_ASSERT_EQUAL(EDHOC_ERROR_CODE_SUCCESS, error_code_recv);
614
+
615
+ /* EDHOC message 2 process. */
616
+ ret = edhoc_message_2_process(init_ctx, msg_2, msg_2_len);
617
+ TEST_ASSERT_EQUAL(EDHOC_SUCCESS, ret);
618
+ TEST_ASSERT_EQUAL(EDHOC_SM_VERIFIED_M2, init_ctx->status);
619
+ TEST_ASSERT_EQUAL(false, init_ctx->is_oscore_export_allowed);
620
+ TEST_ASSERT_EQUAL(EDHOC_TH_STATE_3, init_ctx->th_state);
621
+ TEST_ASSERT_EQUAL(EDHOC_PRK_STATE_3E2M, init_ctx->prk_state);
622
+
623
+ ret = edhoc_error_get_code(init_ctx, &error_code_recv);
624
+ TEST_ASSERT_EQUAL(EDHOC_SUCCESS, ret);
625
+ TEST_ASSERT_EQUAL(EDHOC_ERROR_CODE_SUCCESS, error_code_recv);
626
+
627
+ TEST_ASSERT_EQUAL(EDHOC_CID_TYPE_BYTE_STRING,
628
+ init_ctx->peer_cid.encode_type);
629
+ TEST_ASSERT_EQUAL(ARRAY_SIZE(C_R), init_ctx->peer_cid.bstr_length);
630
+ TEST_ASSERT_EQUAL_UINT8_ARRAY(C_R, init_ctx->peer_cid.bstr_value,
631
+ init_ctx->peer_cid.bstr_length);
632
+
633
+ TEST_ASSERT_EQUAL(DH_KEY_AGREEMENT_LENGTH, init_ctx->dh_secret_len);
634
+ TEST_ASSERT_EQUAL(DH_KEY_AGREEMENT_LENGTH, resp_ctx->dh_secret_len);
635
+ TEST_ASSERT_EQUAL(init_ctx->dh_secret_len, resp_ctx->dh_secret_len);
636
+ TEST_ASSERT_EQUAL_UINT8_ARRAY(init_ctx->dh_secret, resp_ctx->dh_secret,
637
+ DH_KEY_AGREEMENT_LENGTH);
638
+
639
+ memset(buffer, 0, sizeof(buffer));
640
+ size_t msg_3_len = 0;
641
+ uint8_t *msg_3 = buffer;
642
+
643
+ /* EDHOC message 3 compose. */
644
+ ret = edhoc_message_3_compose(init_ctx, msg_3, ARRAY_SIZE(buffer),
645
+ &msg_3_len);
646
+ TEST_ASSERT_EQUAL(EDHOC_SUCCESS, ret);
647
+ TEST_ASSERT_EQUAL(EDHOC_SM_COMPLETED, init_ctx->status);
648
+ TEST_ASSERT_EQUAL(true, init_ctx->is_oscore_export_allowed);
649
+ TEST_ASSERT_EQUAL(EDHOC_TH_STATE_4, init_ctx->th_state);
650
+ TEST_ASSERT_EQUAL(EDHOC_PRK_STATE_4E3M, init_ctx->prk_state);
651
+
652
+ ret = edhoc_error_get_code(init_ctx, &error_code_recv);
653
+ TEST_ASSERT_EQUAL(EDHOC_SUCCESS, ret);
654
+ TEST_ASSERT_EQUAL(EDHOC_ERROR_CODE_SUCCESS, error_code_recv);
655
+
656
+ /* EDHOC message 3 process. */
657
+ ret = edhoc_message_3_process(resp_ctx, msg_3, msg_3_len);
658
+ TEST_ASSERT_EQUAL(EDHOC_SUCCESS, ret);
659
+ TEST_ASSERT_EQUAL(EDHOC_SM_COMPLETED, resp_ctx->status);
660
+ TEST_ASSERT_EQUAL(true, resp_ctx->is_oscore_export_allowed);
661
+ TEST_ASSERT_EQUAL(EDHOC_TH_STATE_4, resp_ctx->th_state);
662
+ TEST_ASSERT_EQUAL(EDHOC_PRK_STATE_4E3M, resp_ctx->prk_state);
663
+
664
+ ret = edhoc_error_get_code(resp_ctx, &error_code_recv);
665
+ TEST_ASSERT_EQUAL(EDHOC_SUCCESS, ret);
666
+ TEST_ASSERT_EQUAL(EDHOC_ERROR_CODE_SUCCESS, error_code_recv);
667
+
668
+ memset(buffer, 0, sizeof(buffer));
669
+ size_t msg_4_len = 0;
670
+ uint8_t *msg_4 = buffer;
671
+
672
+ /* EDHOC message 4 compose. */
673
+ ret = edhoc_message_4_compose(resp_ctx, msg_4, ARRAY_SIZE(buffer),
674
+ &msg_4_len);
675
+ TEST_ASSERT_EQUAL(EDHOC_SUCCESS, ret);
676
+ TEST_ASSERT_EQUAL(EDHOC_SM_PERSISTED, resp_ctx->status);
677
+ TEST_ASSERT_EQUAL(true, resp_ctx->is_oscore_export_allowed);
678
+ TEST_ASSERT_EQUAL(EDHOC_TH_STATE_4, resp_ctx->th_state);
679
+ TEST_ASSERT_EQUAL(EDHOC_PRK_STATE_4E3M, resp_ctx->prk_state);
680
+
681
+ ret = edhoc_error_get_code(resp_ctx, &error_code_recv);
682
+ TEST_ASSERT_EQUAL(EDHOC_SUCCESS, ret);
683
+ TEST_ASSERT_EQUAL(EDHOC_ERROR_CODE_SUCCESS, error_code_recv);
684
+
685
+ /* EDHOC message 4 process. */
686
+ ret = edhoc_message_4_process(init_ctx, msg_4, msg_4_len);
687
+ TEST_ASSERT_EQUAL(EDHOC_SUCCESS, ret);
688
+ TEST_ASSERT_EQUAL(EDHOC_SM_PERSISTED, init_ctx->status);
689
+ TEST_ASSERT_EQUAL(true, init_ctx->is_oscore_export_allowed);
690
+ TEST_ASSERT_EQUAL(EDHOC_TH_STATE_4, init_ctx->th_state);
691
+ TEST_ASSERT_EQUAL(EDHOC_PRK_STATE_4E3M, init_ctx->prk_state);
692
+
693
+ ret = edhoc_error_get_code(init_ctx, &error_code_recv);
694
+ TEST_ASSERT_EQUAL(EDHOC_SUCCESS, ret);
695
+ TEST_ASSERT_EQUAL(EDHOC_ERROR_CODE_SUCCESS, error_code_recv);
696
+
697
+ /* Derive OSCORE master secret and master salt. */
698
+ uint8_t init_master_secret[OSCORE_MASTER_SECRET_LENGTH] = { 0 };
699
+ uint8_t init_master_salt[OSCORE_MASTER_SALT_LENGTH] = { 0 };
700
+ size_t init_sender_id_len = 0;
701
+ uint8_t init_sender_id[ARRAY_SIZE(C_R)] = { 0 };
702
+ size_t init_recipient_id_len = 0;
703
+ uint8_t init_recipient_id[ARRAY_SIZE(C_I)] = { 0 };
704
+
705
+ ret = edhoc_export_oscore_session(
706
+ init_ctx, init_master_secret, ARRAY_SIZE(init_master_secret),
707
+ init_master_salt, ARRAY_SIZE(init_master_salt), init_sender_id,
708
+ ARRAY_SIZE(init_sender_id), &init_sender_id_len,
709
+ init_recipient_id, ARRAY_SIZE(init_recipient_id),
710
+ &init_recipient_id_len);
711
+ TEST_ASSERT_EQUAL(EDHOC_SUCCESS, ret);
712
+ TEST_ASSERT_EQUAL(EDHOC_SM_PERSISTED, init_ctx->status);
713
+ TEST_ASSERT_EQUAL(false, init_ctx->is_oscore_export_allowed);
714
+ TEST_ASSERT_EQUAL(EDHOC_PRK_STATE_OUT, init_ctx->prk_state);
715
+
716
+ /* Derive OSCORE master secret and master salt. */
717
+ uint8_t resp_master_secret[OSCORE_MASTER_SECRET_LENGTH] = { 0 };
718
+ uint8_t resp_master_salt[OSCORE_MASTER_SALT_LENGTH] = { 0 };
719
+ size_t resp_sender_id_len = 0;
720
+ uint8_t resp_sender_id[ARRAY_SIZE(C_I)] = { 0 };
721
+ size_t resp_recipient_id_len = 0;
722
+ uint8_t resp_recipient_id[ARRAY_SIZE(C_R)] = { 0 };
723
+
724
+ ret = edhoc_export_oscore_session(
725
+ resp_ctx, resp_master_secret, ARRAY_SIZE(resp_master_secret),
726
+ resp_master_salt, ARRAY_SIZE(resp_master_salt), resp_sender_id,
727
+ ARRAY_SIZE(resp_sender_id), &resp_sender_id_len,
728
+ resp_recipient_id, ARRAY_SIZE(resp_recipient_id),
729
+ &resp_recipient_id_len);
730
+ TEST_ASSERT_EQUAL(EDHOC_SUCCESS, ret);
731
+ TEST_ASSERT_EQUAL(EDHOC_SM_PERSISTED, resp_ctx->status);
732
+ TEST_ASSERT_EQUAL(false, resp_ctx->is_oscore_export_allowed);
733
+ TEST_ASSERT_EQUAL(EDHOC_PRK_STATE_OUT, resp_ctx->prk_state);
734
+
735
+ TEST_ASSERT_EQUAL_UINT8_ARRAY(init_master_secret, resp_master_secret,
736
+ ARRAY_SIZE(resp_master_secret));
737
+
738
+ TEST_ASSERT_EQUAL_UINT8_ARRAY(init_master_salt, resp_master_salt,
739
+ ARRAY_SIZE(resp_master_salt));
740
+
741
+ TEST_ASSERT_EQUAL(init_sender_id_len, resp_recipient_id_len);
742
+ TEST_ASSERT_EQUAL_UINT8_ARRAY(init_sender_id, resp_recipient_id,
743
+ init_sender_id_len);
744
+ TEST_ASSERT_EQUAL(init_recipient_id_len, resp_sender_id_len);
745
+ TEST_ASSERT_EQUAL_UINT8_ARRAY(init_recipient_id, resp_sender_id,
746
+ resp_sender_id_len);
747
+
748
+ uint8_t entropy[ENTROPY_LENGTH] = { 0 };
749
+ ret = psa_generate_random(entropy, sizeof(entropy));
750
+ TEST_ASSERT_EQUAL(PSA_SUCCESS, ret);
751
+
752
+ /* EDHOC key update method. */
753
+ ret = edhoc_export_key_update(init_ctx, entropy, ARRAY_SIZE(entropy));
754
+ TEST_ASSERT_EQUAL(EDHOC_SUCCESS, ret);
755
+ TEST_ASSERT_EQUAL(EDHOC_SM_PERSISTED, init_ctx->status);
756
+ TEST_ASSERT_EQUAL(true, init_ctx->is_oscore_export_allowed);
757
+
758
+ /* EDHOC key update method. */
759
+ ret = edhoc_export_key_update(resp_ctx, entropy, ARRAY_SIZE(entropy));
760
+ TEST_ASSERT_EQUAL(EDHOC_SUCCESS, ret);
761
+ TEST_ASSERT_EQUAL(EDHOC_SM_PERSISTED, resp_ctx->status);
762
+ TEST_ASSERT_EQUAL(true, resp_ctx->is_oscore_export_allowed);
763
+
764
+ TEST_ASSERT_EQUAL(init_ctx->prk_state, resp_ctx->prk_state);
765
+ TEST_ASSERT_EQUAL(EDHOC_PRK_STATE_OUT, init_ctx->prk_state);
766
+ TEST_ASSERT_EQUAL(EDHOC_PRK_STATE_OUT, resp_ctx->prk_state);
767
+
768
+ TEST_ASSERT_EQUAL(init_ctx->prk_len, resp_ctx->prk_len);
769
+ TEST_ASSERT_EQUAL_UINT8_ARRAY(init_ctx->prk, resp_ctx->prk,
770
+ resp_ctx->prk_len);
771
+
772
+ /* Derive OSCORE master secret and master salt. */
773
+ memset(init_master_secret, 0, sizeof(init_master_secret));
774
+ memset(init_master_salt, 0, sizeof(init_master_salt));
775
+ init_sender_id_len = 0;
776
+ memset(init_sender_id, 0, sizeof(init_sender_id));
777
+ init_recipient_id_len = 0;
778
+ memset(init_recipient_id, 0, sizeof(init_recipient_id));
779
+
780
+ ret = edhoc_export_oscore_session(
781
+ init_ctx, init_master_secret, ARRAY_SIZE(init_master_secret),
782
+ init_master_salt, ARRAY_SIZE(init_master_salt), init_sender_id,
783
+ ARRAY_SIZE(init_sender_id), &init_sender_id_len,
784
+ init_recipient_id, ARRAY_SIZE(init_recipient_id),
785
+ &init_recipient_id_len);
786
+ TEST_ASSERT_EQUAL(EDHOC_SUCCESS, ret);
787
+ TEST_ASSERT_EQUAL(EDHOC_SM_PERSISTED, init_ctx->status);
788
+ TEST_ASSERT_EQUAL(false, init_ctx->is_oscore_export_allowed);
789
+ TEST_ASSERT_EQUAL(EDHOC_PRK_STATE_OUT, init_ctx->prk_state);
790
+
791
+ /* Derive OSCORE master secret and master salt. */
792
+ memset(resp_master_secret, 0, sizeof(resp_master_secret));
793
+ memset(resp_master_salt, 0, sizeof(resp_master_salt));
794
+ resp_sender_id_len = 0;
795
+ memset(resp_sender_id, 0, sizeof(resp_sender_id));
796
+ resp_recipient_id_len = 0;
797
+ memset(resp_recipient_id, 0, sizeof(resp_recipient_id));
798
+
799
+ ret = edhoc_export_oscore_session(
800
+ resp_ctx, resp_master_secret, ARRAY_SIZE(resp_master_secret),
801
+ resp_master_salt, ARRAY_SIZE(resp_master_salt), resp_sender_id,
802
+ ARRAY_SIZE(resp_sender_id), &resp_sender_id_len,
803
+ resp_recipient_id, ARRAY_SIZE(resp_recipient_id),
804
+ &resp_recipient_id_len);
805
+ TEST_ASSERT_EQUAL(EDHOC_SUCCESS, ret);
806
+ TEST_ASSERT_EQUAL(EDHOC_SM_PERSISTED, resp_ctx->status);
807
+ TEST_ASSERT_EQUAL(false, resp_ctx->is_oscore_export_allowed);
808
+ TEST_ASSERT_EQUAL(EDHOC_PRK_STATE_OUT, resp_ctx->prk_state);
809
+
810
+ TEST_ASSERT_EQUAL_UINT8_ARRAY(init_master_secret, resp_master_secret,
811
+ ARRAY_SIZE(resp_master_secret));
812
+
813
+ TEST_ASSERT_EQUAL_UINT8_ARRAY(init_master_salt, resp_master_salt,
814
+ ARRAY_SIZE(resp_master_salt));
815
+
816
+ TEST_ASSERT_EQUAL(init_sender_id_len, resp_recipient_id_len);
817
+ TEST_ASSERT_EQUAL_UINT8_ARRAY(init_sender_id, resp_recipient_id,
818
+ init_sender_id_len);
819
+ TEST_ASSERT_EQUAL(init_recipient_id_len, resp_sender_id_len);
820
+ TEST_ASSERT_EQUAL_UINT8_ARRAY(init_recipient_id, resp_sender_id,
821
+ resp_sender_id_len);
822
+ }
823
+
824
+ TEST(x5chain_sign_keys_suite_2, one_cert_in_chain_with_multiple_ead)
825
+ {
826
+ uint8_t buffer[1000] = { 0 };
827
+
828
+ /* Required missing setup. */
829
+ struct ead_context init_ead_ctx = { 0 };
830
+ struct ead_context resp_ead_ctx = { 0 };
831
+
832
+ ret = edhoc_set_user_context(init_ctx, &init_ead_ctx);
833
+ TEST_ASSERT_EQUAL(EDHOC_SUCCESS, ret);
834
+
835
+ ret = edhoc_bind_ead(init_ctx, &edhoc_ead_multiple_tokens);
836
+ TEST_ASSERT_EQUAL(EDHOC_SUCCESS, ret);
837
+
838
+ ret = edhoc_set_user_context(resp_ctx, &resp_ead_ctx);
839
+ TEST_ASSERT_EQUAL(EDHOC_SUCCESS, ret);
840
+
841
+ ret = edhoc_bind_ead(resp_ctx, &edhoc_ead_multiple_tokens);
842
+ TEST_ASSERT_EQUAL(EDHOC_SUCCESS, ret);
843
+
844
+ memset(buffer, 0, sizeof(buffer));
845
+ size_t msg_1_len = 0;
846
+ uint8_t *msg_1 = buffer;
847
+
848
+ /* EDHOC message 1 compose. */
849
+ ret = edhoc_message_1_compose(init_ctx, msg_1, ARRAY_SIZE(buffer),
850
+ &msg_1_len);
851
+ TEST_ASSERT_EQUAL(EDHOC_SUCCESS, ret);
852
+ TEST_ASSERT_EQUAL(EDHOC_SM_WAIT_M2, init_ctx->status);
853
+ TEST_ASSERT_EQUAL(false, init_ctx->is_oscore_export_allowed);
854
+ TEST_ASSERT_EQUAL(EDHOC_PRK_STATE_INVALID, init_ctx->prk_state);
855
+ TEST_ASSERT_EQUAL(EDHOC_TH_STATE_1, init_ctx->th_state);
856
+
857
+ ret = edhoc_error_get_code(init_ctx, &error_code_recv);
858
+ TEST_ASSERT_EQUAL(EDHOC_SUCCESS, ret);
859
+ TEST_ASSERT_EQUAL(EDHOC_ERROR_CODE_SUCCESS, error_code_recv);
860
+
861
+ /* Verify EAD_1 compose. */
862
+ TEST_ASSERT_EQUAL(EDHOC_MSG_1, init_ead_ctx.msg);
863
+ TEST_ASSERT_EQUAL(ARRAY_SIZE(ead_multiple_tokens_msg_1),
864
+ init_ead_ctx.recv_tokens);
865
+
866
+ for (size_t i = 0; i < init_ead_ctx.recv_tokens; ++i) {
867
+ TEST_ASSERT_EQUAL(ead_multiple_tokens_msg_1[i].label,
868
+ init_ead_ctx.token[i].label);
869
+ TEST_ASSERT_EQUAL(ead_multiple_tokens_msg_1[i].value_len,
870
+ init_ead_ctx.token[i].value_len);
871
+ TEST_ASSERT_EQUAL_UINT8_ARRAY(
872
+ ead_multiple_tokens_msg_1[i].value,
873
+ init_ead_ctx.token[i].value,
874
+ init_ead_ctx.token[i].value_len);
875
+ }
876
+
877
+ /* EDHOC message 1 process. */
878
+ ret = edhoc_message_1_process(resp_ctx, msg_1, msg_1_len);
879
+ TEST_ASSERT_EQUAL(EDHOC_SUCCESS, ret);
880
+ TEST_ASSERT_EQUAL(EDHOC_SM_RECEIVED_M1, resp_ctx->status);
881
+ TEST_ASSERT_EQUAL(false, resp_ctx->is_oscore_export_allowed);
882
+ TEST_ASSERT_EQUAL(EDHOC_TH_STATE_1, resp_ctx->th_state);
883
+ TEST_ASSERT_EQUAL(EDHOC_PRK_STATE_INVALID, resp_ctx->prk_state);
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_CID_TYPE_ONE_BYTE_INTEGER,
890
+ resp_ctx->peer_cid.encode_type);
891
+ TEST_ASSERT_EQUAL((int8_t)C_I[0], resp_ctx->peer_cid.int_value);
892
+
893
+ /* Verify EAD_1 process. */
894
+ TEST_ASSERT_EQUAL(EDHOC_MSG_1, resp_ead_ctx.msg);
895
+ TEST_ASSERT_EQUAL(ARRAY_SIZE(ead_multiple_tokens_msg_1),
896
+ resp_ead_ctx.recv_tokens);
897
+
898
+ for (size_t i = 0; i < resp_ead_ctx.recv_tokens; ++i) {
899
+ TEST_ASSERT_EQUAL(ead_multiple_tokens_msg_1[i].label,
900
+ resp_ead_ctx.token[i].label);
901
+ TEST_ASSERT_EQUAL(ead_multiple_tokens_msg_1[i].value_len,
902
+ resp_ead_ctx.token[i].value_len);
903
+ TEST_ASSERT_EQUAL_UINT8_ARRAY(
904
+ ead_multiple_tokens_msg_1[i].value,
905
+ resp_ead_ctx.token[i].value,
906
+ resp_ead_ctx.token[i].value_len);
907
+ }
908
+
909
+ memset(&init_ead_ctx, 0, sizeof(init_ead_ctx));
910
+ memset(&resp_ead_ctx, 0, sizeof(resp_ead_ctx));
911
+
912
+ memset(buffer, 0, sizeof(buffer));
913
+ size_t msg_2_len = 0;
914
+ uint8_t *msg_2 = buffer;
915
+
916
+ /* EDHOC message 2 compose. */
917
+ ret = edhoc_message_2_compose(resp_ctx, msg_2, ARRAY_SIZE(buffer),
918
+ &msg_2_len);
919
+ TEST_ASSERT_EQUAL(EDHOC_SUCCESS, ret);
920
+ TEST_ASSERT_EQUAL(EDHOC_SM_WAIT_M3, resp_ctx->status);
921
+ TEST_ASSERT_EQUAL(false, resp_ctx->is_oscore_export_allowed);
922
+ TEST_ASSERT_EQUAL(EDHOC_TH_STATE_3, resp_ctx->th_state);
923
+ TEST_ASSERT_EQUAL(EDHOC_PRK_STATE_3E2M, resp_ctx->prk_state);
924
+
925
+ ret = edhoc_error_get_code(resp_ctx, &error_code_recv);
926
+ TEST_ASSERT_EQUAL(EDHOC_SUCCESS, ret);
927
+ TEST_ASSERT_EQUAL(EDHOC_ERROR_CODE_SUCCESS, error_code_recv);
928
+
929
+ /* Verify EAD_2 compose. */
930
+ TEST_ASSERT_EQUAL(EDHOC_MSG_2, resp_ead_ctx.msg);
931
+ TEST_ASSERT_EQUAL(ARRAY_SIZE(ead_multiple_tokens_msg_2),
932
+ resp_ead_ctx.recv_tokens);
933
+
934
+ for (size_t i = 0; i < resp_ead_ctx.recv_tokens; ++i) {
935
+ TEST_ASSERT_EQUAL(ead_multiple_tokens_msg_2[i].label,
936
+ resp_ead_ctx.token[i].label);
937
+ TEST_ASSERT_EQUAL(ead_multiple_tokens_msg_2[i].value_len,
938
+ resp_ead_ctx.token[i].value_len);
939
+ TEST_ASSERT_EQUAL_UINT8_ARRAY(
940
+ ead_multiple_tokens_msg_2[i].value,
941
+ resp_ead_ctx.token[i].value,
942
+ resp_ead_ctx.token[i].value_len);
943
+ }
944
+
945
+ /* EDHOC message 2 process. */
946
+ ret = edhoc_message_2_process(init_ctx, msg_2, msg_2_len);
947
+ TEST_ASSERT_EQUAL(EDHOC_SUCCESS, ret);
948
+ TEST_ASSERT_EQUAL(EDHOC_SM_VERIFIED_M2, init_ctx->status);
949
+ TEST_ASSERT_EQUAL(false, init_ctx->is_oscore_export_allowed);
950
+ TEST_ASSERT_EQUAL(EDHOC_TH_STATE_3, init_ctx->th_state);
951
+ TEST_ASSERT_EQUAL(EDHOC_PRK_STATE_3E2M, init_ctx->prk_state);
952
+
953
+ ret = edhoc_error_get_code(init_ctx, &error_code_recv);
954
+ TEST_ASSERT_EQUAL(EDHOC_SUCCESS, ret);
955
+ TEST_ASSERT_EQUAL(EDHOC_ERROR_CODE_SUCCESS, error_code_recv);
956
+
957
+ TEST_ASSERT_EQUAL(EDHOC_CID_TYPE_BYTE_STRING,
958
+ init_ctx->peer_cid.encode_type);
959
+ TEST_ASSERT_EQUAL(ARRAY_SIZE(C_R), init_ctx->peer_cid.bstr_length);
960
+ TEST_ASSERT_EQUAL_UINT8_ARRAY(C_R, init_ctx->peer_cid.bstr_value,
961
+ init_ctx->peer_cid.bstr_length);
962
+
963
+ /* Verify EAD_2 process. */
964
+ TEST_ASSERT_EQUAL(EDHOC_MSG_2, init_ead_ctx.msg);
965
+ TEST_ASSERT_EQUAL(ARRAY_SIZE(ead_multiple_tokens_msg_2),
966
+ init_ead_ctx.recv_tokens);
967
+
968
+ for (size_t i = 0; i < init_ead_ctx.recv_tokens; ++i) {
969
+ TEST_ASSERT_EQUAL(ead_multiple_tokens_msg_2[i].label,
970
+ init_ead_ctx.token[i].label);
971
+ TEST_ASSERT_EQUAL(ead_multiple_tokens_msg_2[i].value_len,
972
+ init_ead_ctx.token[i].value_len);
973
+ TEST_ASSERT_EQUAL_UINT8_ARRAY(
974
+ ead_multiple_tokens_msg_2[i].value,
975
+ init_ead_ctx.token[i].value,
976
+ init_ead_ctx.token[i].value_len);
977
+ }
978
+
979
+ TEST_ASSERT_EQUAL(DH_KEY_AGREEMENT_LENGTH, init_ctx->dh_secret_len);
980
+ TEST_ASSERT_EQUAL(DH_KEY_AGREEMENT_LENGTH, resp_ctx->dh_secret_len);
981
+ TEST_ASSERT_EQUAL(init_ctx->dh_secret_len, resp_ctx->dh_secret_len);
982
+ TEST_ASSERT_EQUAL_UINT8_ARRAY(init_ctx->dh_secret, resp_ctx->dh_secret,
983
+ DH_KEY_AGREEMENT_LENGTH);
984
+
985
+ memset(&init_ead_ctx, 0, sizeof(init_ead_ctx));
986
+ memset(&resp_ead_ctx, 0, sizeof(resp_ead_ctx));
987
+
988
+ memset(buffer, 0, sizeof(buffer));
989
+ size_t msg_3_len = 0;
990
+ uint8_t *msg_3 = buffer;
991
+
992
+ /* EDHOC message 3 compose. */
993
+ ret = edhoc_message_3_compose(init_ctx, msg_3, ARRAY_SIZE(buffer),
994
+ &msg_3_len);
995
+ TEST_ASSERT_EQUAL(EDHOC_SUCCESS, ret);
996
+ TEST_ASSERT_EQUAL(EDHOC_SM_COMPLETED, init_ctx->status);
997
+ TEST_ASSERT_EQUAL(true, init_ctx->is_oscore_export_allowed);
998
+ TEST_ASSERT_EQUAL(EDHOC_TH_STATE_4, init_ctx->th_state);
999
+ TEST_ASSERT_EQUAL(EDHOC_PRK_STATE_4E3M, init_ctx->prk_state);
1000
+
1001
+ ret = edhoc_error_get_code(init_ctx, &error_code_recv);
1002
+ TEST_ASSERT_EQUAL(EDHOC_SUCCESS, ret);
1003
+ TEST_ASSERT_EQUAL(EDHOC_ERROR_CODE_SUCCESS, error_code_recv);
1004
+
1005
+ /* Verify EAD_3 compose. */
1006
+ TEST_ASSERT_EQUAL(EDHOC_MSG_3, init_ead_ctx.msg);
1007
+ TEST_ASSERT_EQUAL(ARRAY_SIZE(ead_multiple_tokens_msg_3),
1008
+ init_ead_ctx.recv_tokens);
1009
+
1010
+ for (size_t i = 0; i < init_ead_ctx.recv_tokens; ++i) {
1011
+ TEST_ASSERT_EQUAL(ead_multiple_tokens_msg_3[i].label,
1012
+ init_ead_ctx.token[i].label);
1013
+ TEST_ASSERT_EQUAL(ead_multiple_tokens_msg_3[i].value_len,
1014
+ init_ead_ctx.token[i].value_len);
1015
+ TEST_ASSERT_EQUAL_UINT8_ARRAY(
1016
+ ead_multiple_tokens_msg_3[i].value,
1017
+ init_ead_ctx.token[i].value,
1018
+ init_ead_ctx.token[i].value_len);
1019
+ }
1020
+
1021
+ /* EDHOC message 3 process. */
1022
+ ret = edhoc_message_3_process(resp_ctx, msg_3, msg_3_len);
1023
+ TEST_ASSERT_EQUAL(EDHOC_SUCCESS, ret);
1024
+ TEST_ASSERT_EQUAL(EDHOC_SM_COMPLETED, resp_ctx->status);
1025
+ TEST_ASSERT_EQUAL(true, resp_ctx->is_oscore_export_allowed);
1026
+ TEST_ASSERT_EQUAL(EDHOC_TH_STATE_4, resp_ctx->th_state);
1027
+ TEST_ASSERT_EQUAL(EDHOC_PRK_STATE_4E3M, resp_ctx->prk_state);
1028
+
1029
+ ret = edhoc_error_get_code(resp_ctx, &error_code_recv);
1030
+ TEST_ASSERT_EQUAL(EDHOC_SUCCESS, ret);
1031
+ TEST_ASSERT_EQUAL(EDHOC_ERROR_CODE_SUCCESS, error_code_recv);
1032
+
1033
+ /* Verify EAD_3 process. */
1034
+ TEST_ASSERT_EQUAL(EDHOC_MSG_3, resp_ead_ctx.msg);
1035
+ TEST_ASSERT_EQUAL(ARRAY_SIZE(ead_multiple_tokens_msg_3),
1036
+ resp_ead_ctx.recv_tokens);
1037
+
1038
+ for (size_t i = 0; i < resp_ead_ctx.recv_tokens; ++i) {
1039
+ TEST_ASSERT_EQUAL(ead_multiple_tokens_msg_3[i].label,
1040
+ resp_ead_ctx.token[i].label);
1041
+ TEST_ASSERT_EQUAL(ead_multiple_tokens_msg_3[i].value_len,
1042
+ resp_ead_ctx.token[i].value_len);
1043
+ TEST_ASSERT_EQUAL_UINT8_ARRAY(
1044
+ ead_multiple_tokens_msg_3[i].value,
1045
+ resp_ead_ctx.token[i].value,
1046
+ resp_ead_ctx.token[i].value_len);
1047
+ }
1048
+
1049
+ memset(&init_ead_ctx, 0, sizeof(init_ead_ctx));
1050
+ memset(&resp_ead_ctx, 0, sizeof(resp_ead_ctx));
1051
+
1052
+ memset(buffer, 0, sizeof(buffer));
1053
+ size_t msg_4_len = 0;
1054
+ uint8_t *msg_4 = buffer;
1055
+
1056
+ /* EDHOC message 4 compose. */
1057
+ ret = edhoc_message_4_compose(resp_ctx, msg_4, ARRAY_SIZE(buffer),
1058
+ &msg_4_len);
1059
+ TEST_ASSERT_EQUAL(EDHOC_SUCCESS, ret);
1060
+ TEST_ASSERT_EQUAL(EDHOC_SM_PERSISTED, resp_ctx->status);
1061
+ TEST_ASSERT_EQUAL(true, resp_ctx->is_oscore_export_allowed);
1062
+ TEST_ASSERT_EQUAL(EDHOC_TH_STATE_4, resp_ctx->th_state);
1063
+ TEST_ASSERT_EQUAL(EDHOC_PRK_STATE_4E3M, resp_ctx->prk_state);
1064
+
1065
+ ret = edhoc_error_get_code(resp_ctx, &error_code_recv);
1066
+ TEST_ASSERT_EQUAL(EDHOC_SUCCESS, ret);
1067
+ TEST_ASSERT_EQUAL(EDHOC_ERROR_CODE_SUCCESS, error_code_recv);
1068
+
1069
+ /* Verify EAD_4 compose. */
1070
+ TEST_ASSERT_EQUAL(EDHOC_MSG_4, resp_ead_ctx.msg);
1071
+ TEST_ASSERT_EQUAL(ARRAY_SIZE(ead_multiple_tokens_msg_4),
1072
+ resp_ead_ctx.recv_tokens);
1073
+
1074
+ for (size_t i = 0; i < resp_ead_ctx.recv_tokens; ++i) {
1075
+ TEST_ASSERT_EQUAL(ead_multiple_tokens_msg_4[i].label,
1076
+ resp_ead_ctx.token[i].label);
1077
+ TEST_ASSERT_EQUAL(ead_multiple_tokens_msg_4[i].value_len,
1078
+ resp_ead_ctx.token[i].value_len);
1079
+ TEST_ASSERT_EQUAL_UINT8_ARRAY(
1080
+ ead_multiple_tokens_msg_4[i].value,
1081
+ resp_ead_ctx.token[i].value,
1082
+ resp_ead_ctx.token[i].value_len);
1083
+ }
1084
+
1085
+ /* EDHOC message 4 process. */
1086
+ ret = edhoc_message_4_process(init_ctx, msg_4, msg_4_len);
1087
+
1088
+ TEST_ASSERT_EQUAL(EDHOC_SUCCESS, ret);
1089
+ TEST_ASSERT_EQUAL(EDHOC_SM_PERSISTED, init_ctx->status);
1090
+ TEST_ASSERT_EQUAL(true, init_ctx->is_oscore_export_allowed);
1091
+ TEST_ASSERT_EQUAL(EDHOC_TH_STATE_4, init_ctx->th_state);
1092
+ TEST_ASSERT_EQUAL(EDHOC_PRK_STATE_4E3M, init_ctx->prk_state);
1093
+
1094
+ ret = edhoc_error_get_code(init_ctx, &error_code_recv);
1095
+ TEST_ASSERT_EQUAL(EDHOC_SUCCESS, ret);
1096
+ TEST_ASSERT_EQUAL(EDHOC_ERROR_CODE_SUCCESS, error_code_recv);
1097
+
1098
+ /* Verify EAD_4 process. */
1099
+ TEST_ASSERT_EQUAL(EDHOC_MSG_4, init_ead_ctx.msg);
1100
+ TEST_ASSERT_EQUAL(ARRAY_SIZE(ead_multiple_tokens_msg_4),
1101
+ init_ead_ctx.recv_tokens);
1102
+
1103
+ for (size_t i = 0; i < init_ead_ctx.recv_tokens; ++i) {
1104
+ TEST_ASSERT_EQUAL(ead_multiple_tokens_msg_4[i].label,
1105
+ init_ead_ctx.token[i].label);
1106
+ TEST_ASSERT_EQUAL(ead_multiple_tokens_msg_4[i].value_len,
1107
+ init_ead_ctx.token[i].value_len);
1108
+ TEST_ASSERT_EQUAL_UINT8_ARRAY(
1109
+ ead_multiple_tokens_msg_4[i].value,
1110
+ init_ead_ctx.token[i].value,
1111
+ init_ead_ctx.token[i].value_len);
1112
+ }
1113
+
1114
+ memset(&init_ead_ctx, 0, sizeof(init_ead_ctx));
1115
+ memset(&resp_ead_ctx, 0, sizeof(resp_ead_ctx));
1116
+
1117
+ /* Derive OSCORE master secret and master salt. */
1118
+ uint8_t init_master_secret[OSCORE_MASTER_SECRET_LENGTH] = { 0 };
1119
+ uint8_t init_master_salt[OSCORE_MASTER_SALT_LENGTH] = { 0 };
1120
+ size_t init_sender_id_len = 0;
1121
+ uint8_t init_sender_id[ARRAY_SIZE(C_R)] = { 0 };
1122
+ size_t init_recipient_id_len = 0;
1123
+ uint8_t init_recipient_id[ARRAY_SIZE(C_I)] = { 0 };
1124
+
1125
+ ret = edhoc_export_oscore_session(
1126
+ init_ctx, init_master_secret, ARRAY_SIZE(init_master_secret),
1127
+ init_master_salt, ARRAY_SIZE(init_master_salt), init_sender_id,
1128
+ ARRAY_SIZE(init_sender_id), &init_sender_id_len,
1129
+ init_recipient_id, ARRAY_SIZE(init_recipient_id),
1130
+ &init_recipient_id_len);
1131
+ TEST_ASSERT_EQUAL(EDHOC_SUCCESS, ret);
1132
+ TEST_ASSERT_EQUAL(EDHOC_SM_PERSISTED, init_ctx->status);
1133
+ TEST_ASSERT_EQUAL(false, init_ctx->is_oscore_export_allowed);
1134
+ TEST_ASSERT_EQUAL(EDHOC_PRK_STATE_OUT, init_ctx->prk_state);
1135
+
1136
+ /* Derive OSCORE master secret and master salt. */
1137
+ uint8_t resp_master_secret[OSCORE_MASTER_SECRET_LENGTH] = { 0 };
1138
+ uint8_t resp_master_salt[OSCORE_MASTER_SALT_LENGTH] = { 0 };
1139
+ size_t resp_sender_id_len = 0;
1140
+ uint8_t resp_sender_id[ARRAY_SIZE(C_I)] = { 0 };
1141
+ size_t resp_recipient_id_len = 0;
1142
+ uint8_t resp_recipient_id[ARRAY_SIZE(C_R)] = { 0 };
1143
+
1144
+ ret = edhoc_export_oscore_session(
1145
+ resp_ctx, resp_master_secret, ARRAY_SIZE(resp_master_secret),
1146
+ resp_master_salt, ARRAY_SIZE(resp_master_salt), resp_sender_id,
1147
+ ARRAY_SIZE(resp_sender_id), &resp_sender_id_len,
1148
+ resp_recipient_id, ARRAY_SIZE(resp_recipient_id),
1149
+ &resp_recipient_id_len);
1150
+ TEST_ASSERT_EQUAL(EDHOC_SUCCESS, ret);
1151
+ TEST_ASSERT_EQUAL(EDHOC_SM_PERSISTED, resp_ctx->status);
1152
+ TEST_ASSERT_EQUAL(false, resp_ctx->is_oscore_export_allowed);
1153
+ TEST_ASSERT_EQUAL(EDHOC_PRK_STATE_OUT, resp_ctx->prk_state);
1154
+
1155
+ TEST_ASSERT_EQUAL_UINT8_ARRAY(init_master_secret, resp_master_secret,
1156
+ ARRAY_SIZE(resp_master_secret));
1157
+
1158
+ TEST_ASSERT_EQUAL_UINT8_ARRAY(init_master_salt, resp_master_salt,
1159
+ ARRAY_SIZE(resp_master_salt));
1160
+
1161
+ TEST_ASSERT_EQUAL(init_sender_id_len, resp_recipient_id_len);
1162
+ TEST_ASSERT_EQUAL_UINT8_ARRAY(init_sender_id, resp_recipient_id,
1163
+ init_sender_id_len);
1164
+ TEST_ASSERT_EQUAL(init_recipient_id_len, resp_sender_id_len);
1165
+ TEST_ASSERT_EQUAL_UINT8_ARRAY(init_recipient_id, resp_sender_id,
1166
+ resp_sender_id_len);
1167
+
1168
+ uint8_t entropy[ENTROPY_LENGTH] = { 0 };
1169
+ ret = psa_generate_random(entropy, sizeof(entropy));
1170
+ TEST_ASSERT_EQUAL(PSA_SUCCESS, ret);
1171
+
1172
+ /* EDHOC key update method. */
1173
+ ret = edhoc_export_key_update(init_ctx, entropy, ARRAY_SIZE(entropy));
1174
+ TEST_ASSERT_EQUAL(EDHOC_SUCCESS, ret);
1175
+ TEST_ASSERT_EQUAL(EDHOC_SM_PERSISTED, init_ctx->status);
1176
+ TEST_ASSERT_EQUAL(true, init_ctx->is_oscore_export_allowed);
1177
+
1178
+ /* EDHOC key update method. */
1179
+ ret = edhoc_export_key_update(resp_ctx, entropy, ARRAY_SIZE(entropy));
1180
+ TEST_ASSERT_EQUAL(EDHOC_SUCCESS, ret);
1181
+ TEST_ASSERT_EQUAL(EDHOC_SM_PERSISTED, resp_ctx->status);
1182
+ TEST_ASSERT_EQUAL(true, resp_ctx->is_oscore_export_allowed);
1183
+
1184
+ TEST_ASSERT_EQUAL(init_ctx->prk_state, resp_ctx->prk_state);
1185
+ TEST_ASSERT_EQUAL(EDHOC_PRK_STATE_OUT, init_ctx->prk_state);
1186
+ TEST_ASSERT_EQUAL(EDHOC_PRK_STATE_OUT, resp_ctx->prk_state);
1187
+
1188
+ TEST_ASSERT_EQUAL(init_ctx->prk_len, resp_ctx->prk_len);
1189
+ TEST_ASSERT_EQUAL_UINT8_ARRAY(init_ctx->prk, resp_ctx->prk,
1190
+ resp_ctx->prk_len);
1191
+
1192
+ /* Derive OSCORE master secret and master salt. */
1193
+ memset(init_master_secret, 0, sizeof(init_master_secret));
1194
+ memset(init_master_salt, 0, sizeof(init_master_salt));
1195
+ init_sender_id_len = 0;
1196
+ memset(init_sender_id, 0, sizeof(init_sender_id));
1197
+ init_recipient_id_len = 0;
1198
+ memset(init_recipient_id, 0, sizeof(init_recipient_id));
1199
+
1200
+ ret = edhoc_export_oscore_session(
1201
+ init_ctx, init_master_secret, ARRAY_SIZE(init_master_secret),
1202
+ init_master_salt, ARRAY_SIZE(init_master_salt), init_sender_id,
1203
+ ARRAY_SIZE(init_sender_id), &init_sender_id_len,
1204
+ init_recipient_id, ARRAY_SIZE(init_recipient_id),
1205
+ &init_recipient_id_len);
1206
+ TEST_ASSERT_EQUAL(EDHOC_SUCCESS, ret);
1207
+ TEST_ASSERT_EQUAL(EDHOC_SM_PERSISTED, init_ctx->status);
1208
+ TEST_ASSERT_EQUAL(false, init_ctx->is_oscore_export_allowed);
1209
+ TEST_ASSERT_EQUAL(EDHOC_PRK_STATE_OUT, init_ctx->prk_state);
1210
+
1211
+ /* Derive OSCORE master secret and master salt. */
1212
+ memset(resp_master_secret, 0, sizeof(resp_master_secret));
1213
+ memset(resp_master_salt, 0, sizeof(resp_master_salt));
1214
+ resp_sender_id_len = 0;
1215
+ memset(resp_sender_id, 0, sizeof(resp_sender_id));
1216
+ resp_recipient_id_len = 0;
1217
+ memset(resp_recipient_id, 0, sizeof(resp_recipient_id));
1218
+
1219
+ ret = edhoc_export_oscore_session(
1220
+ resp_ctx, resp_master_secret, ARRAY_SIZE(resp_master_secret),
1221
+ resp_master_salt, ARRAY_SIZE(resp_master_salt), resp_sender_id,
1222
+ ARRAY_SIZE(resp_sender_id), &resp_sender_id_len,
1223
+ resp_recipient_id, ARRAY_SIZE(resp_recipient_id),
1224
+ &resp_recipient_id_len);
1225
+ TEST_ASSERT_EQUAL(EDHOC_SUCCESS, ret);
1226
+ TEST_ASSERT_EQUAL(EDHOC_SM_PERSISTED, resp_ctx->status);
1227
+ TEST_ASSERT_EQUAL(false, resp_ctx->is_oscore_export_allowed);
1228
+ TEST_ASSERT_EQUAL(EDHOC_PRK_STATE_OUT, resp_ctx->prk_state);
1229
+
1230
+ TEST_ASSERT_EQUAL_UINT8_ARRAY(init_master_secret, resp_master_secret,
1231
+ ARRAY_SIZE(resp_master_secret));
1232
+
1233
+ TEST_ASSERT_EQUAL_UINT8_ARRAY(init_master_salt, resp_master_salt,
1234
+ ARRAY_SIZE(resp_master_salt));
1235
+
1236
+ TEST_ASSERT_EQUAL(init_sender_id_len, resp_recipient_id_len);
1237
+ TEST_ASSERT_EQUAL_UINT8_ARRAY(init_sender_id, resp_recipient_id,
1238
+ init_sender_id_len);
1239
+ TEST_ASSERT_EQUAL(init_recipient_id_len, resp_sender_id_len);
1240
+ TEST_ASSERT_EQUAL_UINT8_ARRAY(init_recipient_id, resp_sender_id,
1241
+ resp_sender_id_len);
1242
+ }
1243
+
1244
+ TEST_GROUP_RUNNER(x5chain_sign_keys_suite_2)
1245
+ {
1246
+ RUN_TEST_CASE(x5chain_sign_keys_suite_2, one_cert_in_chain);
1247
+ RUN_TEST_CASE(x5chain_sign_keys_suite_2,
1248
+ one_cert_in_chain_with_multiple_ead);
1249
+ }