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
@@ -1,600 +1,600 @@
1
- /**
2
- * \file cipher_suite_2.c
3
- * \author Kamil Kielbasa
4
- * \brief Example implementation of cipher suite 2.
5
- * \version 0.4
6
- * \date 2024-04-01
7
- *
8
- * \copyright Copyright (c) 2024
9
- *
10
- */
11
-
12
- /* Include files ----------------------------------------------------------- */
13
-
14
- /* Internal test header: */
15
- #include "cipher_suites/cipher_suite_2.h"
16
-
17
- /* Standard library header: */
18
- #include <stdint.h>
19
- #include <stddef.h>
20
- #include <string.h>
21
-
22
- /* EDHOC headers: */
23
- #include "edhoc_crypto.h"
24
- #include "edhoc_values.h"
25
- #include "edhoc_macros.h"
26
-
27
- /* PSA crypto header: */
28
- #include <psa/crypto.h>
29
-
30
- /* mbedTLS headers: */
31
- #include <mbedtls/ecp.h>
32
- #include <mbedtls/pk.h>
33
-
34
- /* Module defines ---------------------------------------------------------- */
35
- #define AEAD_TAG_LEN (8)
36
- #define AEAD_KEY_LEN (16)
37
-
38
- /* Module types and type definitiones -------------------------------------- */
39
- /* Module interface variables and constants -------------------------------- */
40
- /* Static variables and constants ------------------------------------------ */
41
- /* Static function declarations -------------------------------------------- */
42
-
43
- /**
44
- * \brief Ellipic curve poin decompression.
45
- *
46
- */
47
- static int mbedtls_ecp_decompress(const mbedtls_ecp_group *grp,
48
- const uint8_t *raw_key, size_t raw_key_len,
49
- uint8_t *decomp_key, size_t decomp_key_size,
50
- size_t *decomp_key_len);
51
-
52
- /* Static function definitions --------------------------------------------- */
53
-
54
- static int mbedtls_ecp_decompress(const mbedtls_ecp_group *grp,
55
- const uint8_t *raw_key, size_t raw_key_len,
56
- uint8_t *decomp_key, size_t decomp_key_size,
57
- size_t *decomp_key_len)
58
- {
59
- int ret = 0;
60
-
61
- const size_t p_len = mbedtls_mpi_size(&grp->P);
62
-
63
- *decomp_key_len = (2 * p_len) + 1;
64
-
65
- if (decomp_key_size < *decomp_key_len) {
66
- return MBEDTLS_ERR_ECP_BUFFER_TOO_SMALL;
67
- }
68
-
69
- /* decomp_key will consist of 0x04|X|Y */
70
- (void)memcpy(&decomp_key[1], raw_key, raw_key_len);
71
- decomp_key[0] = 0x04;
72
-
73
- mbedtls_mpi r;
74
- mbedtls_mpi x;
75
- mbedtls_mpi n;
76
-
77
- mbedtls_mpi_init(&r);
78
- mbedtls_mpi_init(&x);
79
- mbedtls_mpi_init(&n);
80
-
81
- /* x <= raw_key */
82
- MBEDTLS_MPI_CHK(mbedtls_mpi_read_binary(&x, raw_key, p_len));
83
-
84
- /* r = x^2 */
85
- MBEDTLS_MPI_CHK(mbedtls_mpi_mul_mpi(&r, &x, &x));
86
-
87
- /* r = x^2 + ad */
88
- if (NULL == grp->A.MBEDTLS_PRIVATE(p)) {
89
- // Special case where ad is -3
90
- MBEDTLS_MPI_CHK(mbedtls_mpi_sub_int(&r, &r, 3));
91
- } else {
92
- MBEDTLS_MPI_CHK(mbedtls_mpi_add_mpi(&r, &r, &grp->A));
93
- }
94
-
95
- /* r = x^3 + ax */
96
- MBEDTLS_MPI_CHK(mbedtls_mpi_mul_mpi(&r, &r, &x));
97
-
98
- /* r = x^3 + ax + b */
99
- MBEDTLS_MPI_CHK(mbedtls_mpi_add_mpi(&r, &r, &grp->B));
100
-
101
- /*
102
- * Calculate square root of r over finite field P:
103
- * r = sqrt(x^3 + ax + b) = (x^3 + ax + b) ^ ((P + 1) / 4) (mod P)
104
- */
105
-
106
- /* n = P + 1 */
107
- MBEDTLS_MPI_CHK(mbedtls_mpi_add_int(&n, &grp->P, 1));
108
-
109
- /* n = (P + 1) / 4 */
110
- MBEDTLS_MPI_CHK(mbedtls_mpi_shift_r(&n, 2));
111
-
112
- /* r ^ ((P + 1) / 4) (mod p) */
113
- MBEDTLS_MPI_CHK(mbedtls_mpi_exp_mod(&r, &r, &n, &grp->P, NULL));
114
-
115
- /* Select solution that has the correct "sign" (equals odd/even solution in finite group) */
116
- if ((raw_key[0] == 0x03) != mbedtls_mpi_get_bit(&r, 0)) {
117
- /* r = p - r */
118
- MBEDTLS_MPI_CHK(mbedtls_mpi_sub_mpi(&r, &grp->P, &r));
119
- }
120
-
121
- /* y => decomp_key */
122
- ret = mbedtls_mpi_write_binary(&r, decomp_key + 1 + p_len, p_len);
123
-
124
- // cppcheck-suppress unusedLabel
125
- cleanup:
126
- mbedtls_mpi_free(&r);
127
- mbedtls_mpi_free(&x);
128
- mbedtls_mpi_free(&n);
129
-
130
- return (ret);
131
- }
132
-
133
- /* Module interface function definitions ----------------------------------- */
134
-
135
- int cipher_suite_2_key_generate(void *user_ctx, enum edhoc_key_type key_type,
136
- const uint8_t *raw_key, size_t raw_key_len,
137
- void *kid)
138
- {
139
- (void)user_ctx;
140
-
141
- int ret = EDHOC_ERROR_GENERIC_ERROR;
142
-
143
- /*
144
- * 1. Generate key attr
145
- */
146
- psa_key_attributes_t attr = PSA_KEY_ATTRIBUTES_INIT;
147
- psa_set_key_lifetime(&attr, PSA_KEY_LIFETIME_VOLATILE);
148
-
149
- switch (key_type) {
150
- case EDHOC_KT_MAKE_KEY_PAIR:
151
- psa_set_key_usage_flags(&attr, PSA_KEY_USAGE_EXPORT);
152
- psa_set_key_algorithm(&attr, PSA_ALG_ECDH);
153
- psa_set_key_type(&attr, PSA_KEY_TYPE_ECC_KEY_PAIR(
154
- PSA_ECC_FAMILY_SECP_R1));
155
- psa_set_key_bits(&attr, PSA_BYTES_TO_BITS(ECC_COMP_KEY_LEN));
156
- break;
157
-
158
- case EDHOC_KT_KEY_AGREEMENT:
159
- psa_set_key_usage_flags(&attr, PSA_KEY_USAGE_DERIVE);
160
- psa_set_key_algorithm(&attr, PSA_ALG_ECDH);
161
- psa_set_key_type(&attr, PSA_KEY_TYPE_ECC_KEY_PAIR(
162
- PSA_ECC_FAMILY_SECP_R1));
163
- psa_set_key_bits(&attr, PSA_BYTES_TO_BITS(ECC_COMP_KEY_LEN));
164
- break;
165
-
166
- case EDHOC_KT_SIGNATURE:
167
- psa_set_key_usage_flags(&attr, PSA_KEY_USAGE_SIGN_MESSAGE |
168
- PSA_KEY_USAGE_SIGN_HASH);
169
- psa_set_key_algorithm(&attr, PSA_ALG_ECDSA(PSA_ALG_SHA_256));
170
- psa_set_key_type(&attr, PSA_KEY_TYPE_ECC_KEY_PAIR(
171
- PSA_ECC_FAMILY_SECP_R1));
172
- psa_set_key_bits(&attr, PSA_BYTES_TO_BITS(ECC_COMP_KEY_LEN));
173
- break;
174
-
175
- case EDHOC_KT_VERIFY:
176
- psa_set_key_usage_flags(&attr,
177
- PSA_KEY_USAGE_VERIFY_MESSAGE |
178
- PSA_KEY_USAGE_VERIFY_HASH);
179
- psa_set_key_algorithm(&attr, PSA_ALG_ECDSA(PSA_ALG_SHA_256));
180
- psa_set_key_type(&attr, PSA_KEY_TYPE_ECC_PUBLIC_KEY(
181
- PSA_ECC_FAMILY_SECP_R1));
182
- psa_set_key_bits(&attr, PSA_BYTES_TO_BITS(ECC_COMP_KEY_LEN));
183
- break;
184
-
185
- case EDHOC_KT_EXTRACT:
186
- psa_set_key_usage_flags(&attr, PSA_KEY_USAGE_DERIVE);
187
- psa_set_key_algorithm(&attr,
188
- PSA_ALG_HKDF_EXTRACT(PSA_ALG_SHA_256));
189
- psa_set_key_type(&attr, PSA_KEY_TYPE_DERIVE);
190
- psa_set_key_bits(&attr, PSA_BYTES_TO_BITS(raw_key_len));
191
- break;
192
-
193
- case EDHOC_KT_EXPAND:
194
- psa_set_key_usage_flags(&attr, PSA_KEY_USAGE_DERIVE);
195
- psa_set_key_algorithm(&attr,
196
- PSA_ALG_HKDF_EXPAND(PSA_ALG_SHA_256));
197
- psa_set_key_type(&attr, PSA_KEY_TYPE_DERIVE);
198
- psa_set_key_bits(&attr, PSA_BYTES_TO_BITS(raw_key_len));
199
- break;
200
-
201
- case EDHOC_KT_ENCRYPT:
202
- psa_set_key_usage_flags(&attr, PSA_KEY_USAGE_ENCRYPT);
203
- psa_set_key_algorithm(
204
- &attr, PSA_ALG_AEAD_WITH_SHORTENED_TAG(PSA_ALG_CCM,
205
- AEAD_TAG_LEN));
206
- psa_set_key_type(&attr, PSA_KEY_TYPE_AES);
207
- psa_set_key_bits(&attr, PSA_BYTES_TO_BITS(AEAD_KEY_LEN));
208
- break;
209
-
210
- case EDHOC_KT_DECRYPT:
211
- psa_set_key_usage_flags(&attr, PSA_KEY_USAGE_DECRYPT);
212
- psa_set_key_algorithm(
213
- &attr, PSA_ALG_AEAD_WITH_SHORTENED_TAG(PSA_ALG_CCM,
214
- AEAD_TAG_LEN));
215
- psa_set_key_type(&attr, PSA_KEY_TYPE_AES);
216
- psa_set_key_bits(&attr, PSA_BYTES_TO_BITS(AEAD_KEY_LEN));
217
- break;
218
-
219
- default:
220
- return EDHOC_ERROR_CRYPTO_FAILURE;
221
- }
222
-
223
- /*
224
- * 2. Import key identifier
225
- */
226
- psa_key_id_t *psa_kid = kid;
227
- *psa_kid = PSA_KEY_HANDLE_INIT;
228
-
229
- if (EDHOC_KT_MAKE_KEY_PAIR == key_type) {
230
- ret = psa_generate_key(&attr, psa_kid);
231
- } else {
232
- ret = psa_import_key(&attr, raw_key, raw_key_len, psa_kid);
233
- }
234
-
235
- return (PSA_SUCCESS == ret) ? EDHOC_SUCCESS :
236
- EDHOC_ERROR_CRYPTO_FAILURE;
237
- }
238
-
239
- int cipher_suite_2_key_destroy(void *user_ctx, void *kid)
240
- {
241
- (void)user_ctx;
242
-
243
- if (NULL == kid)
244
- return EDHOC_ERROR_INVALID_ARGUMENT;
245
-
246
- psa_key_id_t *psa_kid = kid;
247
- const psa_status_t ret = psa_destroy_key(*psa_kid);
248
- *psa_kid = PSA_KEY_HANDLE_INIT;
249
-
250
- return (PSA_SUCCESS == ret) ? EDHOC_SUCCESS :
251
- EDHOC_ERROR_CRYPTO_FAILURE;
252
- }
253
-
254
- int cipher_suite_2_make_key_pair(void *user_ctx, const void *kid,
255
- uint8_t *restrict priv_key,
256
- size_t priv_key_size,
257
- size_t *restrict priv_key_len,
258
- uint8_t *restrict pub_key, size_t pub_key_size,
259
- size_t *restrict pub_key_len)
260
- {
261
- (void)user_ctx;
262
-
263
- if (NULL == kid || NULL == priv_key || 0 == priv_key_size ||
264
- NULL == priv_key_len || NULL == pub_key || 0 == pub_key_size ||
265
- NULL == pub_key_len)
266
- return EDHOC_ERROR_INVALID_ARGUMENT;
267
-
268
- if (ECC_COMP_KEY_LEN != priv_key_size ||
269
- ECC_COMP_KEY_LEN != pub_key_size)
270
- return EDHOC_ERROR_CRYPTO_FAILURE;
271
-
272
- int ret = EDHOC_ERROR_GENERIC_ERROR;
273
- const psa_key_id_t *psa_kid = kid;
274
-
275
- ret = psa_export_key(*psa_kid, priv_key, priv_key_size, priv_key_len);
276
-
277
- if (PSA_SUCCESS != ret || ECC_COMP_KEY_LEN != *priv_key_len)
278
- return EDHOC_ERROR_CRYPTO_FAILURE;
279
-
280
- uint8_t uncomp_pub_key[ECC_UNCOMP_KEY_LEN] = { 0 };
281
- ret = psa_export_public_key(*psa_kid, uncomp_pub_key,
282
- sizeof(uncomp_pub_key), pub_key_len);
283
-
284
- if (PSA_SUCCESS != ret)
285
- return EDHOC_ERROR_CRYPTO_FAILURE;
286
-
287
- const size_t offset = 1;
288
- memcpy(pub_key, &uncomp_pub_key[offset], pub_key_size);
289
- *pub_key_len = pub_key_size;
290
-
291
- return EDHOC_SUCCESS;
292
- }
293
-
294
- int cipher_suite_2_key_agreement(void *user_ctx, const void *kid,
295
- const uint8_t *peer_pub_key,
296
- size_t peer_pub_key_len, uint8_t *shr_sec,
297
- size_t shr_sec_size, size_t *shr_sec_len)
298
- {
299
- (void)user_ctx;
300
-
301
- if (NULL == kid || NULL == peer_pub_key || 0 == peer_pub_key_len ||
302
- NULL == shr_sec || 0 == shr_sec_size || NULL == shr_sec_len)
303
- return EDHOC_ERROR_INVALID_ARGUMENT;
304
-
305
- if (ECC_COMP_KEY_LEN != peer_pub_key_len ||
306
- ECC_ECDH_KEY_AGREEMENT_LEN != shr_sec_size)
307
- return EDHOC_ERROR_CRYPTO_FAILURE;
308
-
309
- psa_status_t ret = PSA_ERROR_GENERIC_ERROR;
310
-
311
- size_t decom_pub_key_len = 0;
312
- uint8_t decom_pub_key[ECC_UNCOMP_KEY_LEN] = { 0 };
313
-
314
- mbedtls_pk_context pub_key_ctx = { 0 };
315
- mbedtls_pk_init(&pub_key_ctx);
316
-
317
- ret = mbedtls_pk_setup(&pub_key_ctx,
318
- mbedtls_pk_info_from_type(MBEDTLS_PK_ECKEY));
319
-
320
- if (PSA_SUCCESS != ret) {
321
- mbedtls_pk_free(&pub_key_ctx);
322
- return EDHOC_ERROR_CRYPTO_FAILURE;
323
- }
324
-
325
- ret = mbedtls_ecp_group_load(
326
- &mbedtls_pk_ec(pub_key_ctx)->MBEDTLS_PRIVATE(grp),
327
- MBEDTLS_ECP_DP_SECP256R1);
328
-
329
- if (PSA_SUCCESS != ret) {
330
- mbedtls_pk_free(&pub_key_ctx);
331
- return EDHOC_ERROR_CRYPTO_FAILURE;
332
- }
333
-
334
- ret = mbedtls_ecp_decompress(
335
- &mbedtls_pk_ec(pub_key_ctx)->MBEDTLS_PRIVATE(grp), peer_pub_key,
336
- peer_pub_key_len, decom_pub_key, ARRAY_SIZE(decom_pub_key),
337
- &decom_pub_key_len);
338
-
339
- if (PSA_SUCCESS != ret) {
340
- mbedtls_pk_free(&pub_key_ctx);
341
- return EDHOC_ERROR_CRYPTO_FAILURE;
342
- }
343
-
344
- mbedtls_pk_free(&pub_key_ctx);
345
-
346
- const psa_key_id_t *psa_kid = kid;
347
-
348
- psa_key_attributes_t attr = PSA_KEY_ATTRIBUTES_INIT;
349
- ret = psa_get_key_attributes(*psa_kid, &attr);
350
-
351
- if (PSA_SUCCESS != ret)
352
- return EDHOC_ERROR_CRYPTO_FAILURE;
353
-
354
- const psa_algorithm_t alg = psa_get_key_algorithm(&attr);
355
-
356
- ret = psa_raw_key_agreement(alg, *psa_kid, decom_pub_key,
357
- decom_pub_key_len, shr_sec, shr_sec_size,
358
- shr_sec_len);
359
-
360
- return (PSA_SUCCESS == ret) ? EDHOC_SUCCESS :
361
- EDHOC_ERROR_CRYPTO_FAILURE;
362
- }
363
-
364
- int cipher_suite_2_signature(void *user_ctx, const void *kid,
365
- const uint8_t *input, size_t input_len,
366
- uint8_t *sign, size_t sign_size, size_t *sign_len)
367
- {
368
- (void)user_ctx;
369
-
370
- if (NULL == kid || NULL == input || 0 == input_len || NULL == sign ||
371
- 0 == sign_size || NULL == sign_len)
372
- return EDHOC_ERROR_INVALID_ARGUMENT;
373
-
374
- if (ECC_ECDSA_SIGN_LEN != sign_size)
375
- return EDHOC_ERROR_CRYPTO_FAILURE;
376
-
377
- psa_status_t ret = PSA_ERROR_GENERIC_ERROR;
378
- const psa_key_id_t *psa_kid = kid;
379
-
380
- psa_key_attributes_t attr = PSA_KEY_ATTRIBUTES_INIT;
381
- ret = psa_get_key_attributes(*psa_kid, &attr);
382
-
383
- if (PSA_SUCCESS != ret)
384
- return EDHOC_ERROR_CRYPTO_FAILURE;
385
-
386
- ret = psa_sign_message(*psa_kid, psa_get_key_algorithm(&attr), input,
387
- input_len, sign, sign_size, sign_len);
388
-
389
- if (ECC_ECDSA_SIGN_LEN != *sign_len)
390
- return EDHOC_ERROR_CRYPTO_FAILURE;
391
-
392
- return (PSA_SUCCESS == ret) ? EDHOC_SUCCESS :
393
- EDHOC_ERROR_CRYPTO_FAILURE;
394
- }
395
-
396
- int cipher_suite_2_verify(void *user_ctx, const void *kid, const uint8_t *input,
397
- size_t input_len, const uint8_t *sign,
398
- size_t sign_len)
399
- {
400
- (void)user_ctx;
401
-
402
- if (NULL == kid || NULL == input || 0 == input_len || NULL == sign ||
403
- 0 == sign_len)
404
- return EDHOC_ERROR_INVALID_ARGUMENT;
405
-
406
- if (ECC_ECDSA_SIGN_LEN != sign_len)
407
- return EDHOC_ERROR_CRYPTO_FAILURE;
408
-
409
- psa_status_t ret = PSA_ERROR_GENERIC_ERROR;
410
- const psa_key_id_t *psa_kid = kid;
411
-
412
- psa_key_attributes_t attr = PSA_KEY_ATTRIBUTES_INIT;
413
- ret = psa_get_key_attributes(*psa_kid, &attr);
414
-
415
- if (PSA_SUCCESS != ret)
416
- return EDHOC_ERROR_CRYPTO_FAILURE;
417
-
418
- ret = psa_verify_message(*psa_kid, psa_get_key_algorithm(&attr), input,
419
- input_len, sign, sign_len);
420
-
421
- return (PSA_SUCCESS == ret) ? EDHOC_SUCCESS :
422
- EDHOC_ERROR_CRYPTO_FAILURE;
423
- }
424
-
425
- int cipher_suite_2_extract(void *user_ctx, const void *kid, const uint8_t *salt,
426
- size_t salt_len, uint8_t *prk, size_t prk_size,
427
- size_t *prk_len)
428
- {
429
- (void)user_ctx;
430
-
431
- if (NULL == kid || NULL == salt || 0 == salt_len || NULL == prk ||
432
- 0 == prk_size || NULL == prk_len)
433
- return EDHOC_ERROR_INVALID_ARGUMENT;
434
-
435
- psa_status_t ret = PSA_ERROR_GENERIC_ERROR;
436
-
437
- const psa_key_id_t psa_kid = *((const psa_key_id_t *)kid);
438
- psa_key_derivation_operation_t ctx = PSA_KEY_DERIVATION_OPERATION_INIT;
439
-
440
- psa_key_attributes_t attr = PSA_KEY_ATTRIBUTES_INIT;
441
- ret = psa_get_key_attributes(psa_kid, &attr);
442
- if (PSA_SUCCESS != ret)
443
- goto psa_error;
444
-
445
- ret = psa_key_derivation_setup(&ctx, psa_get_key_algorithm(&attr));
446
- if (PSA_SUCCESS != ret)
447
- goto psa_error;
448
-
449
- ret = psa_key_derivation_input_bytes(
450
- &ctx, PSA_KEY_DERIVATION_INPUT_SALT, salt, salt_len);
451
- if (PSA_SUCCESS != ret)
452
- goto psa_error;
453
-
454
- ret = psa_key_derivation_input_key(
455
- &ctx, PSA_KEY_DERIVATION_INPUT_SECRET, psa_kid);
456
- if (PSA_SUCCESS != ret)
457
- goto psa_error;
458
-
459
- ret = psa_key_derivation_set_capacity(&ctx, prk_size);
460
- if (PSA_SUCCESS != ret)
461
- goto psa_error;
462
-
463
- ret = psa_key_derivation_output_bytes(&ctx, prk, prk_size);
464
- if (PSA_SUCCESS != ret)
465
- goto psa_error;
466
-
467
- *prk_len = prk_size;
468
- psa_key_derivation_abort(&ctx);
469
-
470
- return EDHOC_SUCCESS;
471
-
472
- psa_error:
473
- psa_key_derivation_abort(&ctx);
474
- return EDHOC_ERROR_CRYPTO_FAILURE;
475
- }
476
-
477
- int cipher_suite_2_expand(void *user_ctx, const void *kid, const uint8_t *info,
478
- size_t info_len, uint8_t *okm, size_t okm_len)
479
- {
480
- (void)user_ctx;
481
-
482
- if (NULL == kid || NULL == info || 0 == info_len || NULL == okm ||
483
- 0 == okm_len)
484
- return EDHOC_ERROR_INVALID_ARGUMENT;
485
-
486
- psa_status_t ret = PSA_ERROR_GENERIC_ERROR;
487
-
488
- const psa_key_id_t psa_kid = *((const psa_key_id_t *)kid);
489
- psa_key_derivation_operation_t ctx = PSA_KEY_DERIVATION_OPERATION_INIT;
490
-
491
- psa_key_attributes_t attr = PSA_KEY_ATTRIBUTES_INIT;
492
- ret = psa_get_key_attributes(psa_kid, &attr);
493
- if (PSA_SUCCESS != ret)
494
- goto psa_error;
495
-
496
- ret = psa_key_derivation_setup(&ctx, psa_get_key_algorithm(&attr));
497
- if (PSA_SUCCESS != ret)
498
- goto psa_error;
499
-
500
- ret = psa_key_derivation_input_key(
501
- &ctx, PSA_KEY_DERIVATION_INPUT_SECRET, psa_kid);
502
- if (PSA_SUCCESS != ret)
503
- goto psa_error;
504
-
505
- ret = psa_key_derivation_input_bytes(
506
- &ctx, PSA_KEY_DERIVATION_INPUT_INFO, info, info_len);
507
- if (PSA_SUCCESS != ret)
508
- goto psa_error;
509
-
510
- ret = psa_key_derivation_set_capacity(&ctx, okm_len);
511
- if (PSA_SUCCESS != ret)
512
- goto psa_error;
513
-
514
- ret = psa_key_derivation_output_bytes(&ctx, okm, okm_len);
515
- if (PSA_SUCCESS != ret)
516
- goto psa_error;
517
-
518
- psa_key_derivation_abort(&ctx);
519
- return EDHOC_SUCCESS;
520
-
521
- psa_error:
522
- psa_key_derivation_abort(&ctx);
523
- return EDHOC_ERROR_CRYPTO_FAILURE;
524
- }
525
-
526
- int cipher_suite_2_encrypt(void *user_ctx, const void *kid,
527
- const uint8_t *nonce, size_t nonce_len,
528
- const uint8_t *ad, size_t ad_len,
529
- const uint8_t *ptxt, size_t ptxt_len, uint8_t *ctxt,
530
- size_t ctxt_size, size_t *ctxt_len)
531
- {
532
- (void)user_ctx;
533
-
534
- /* Plaintext might be zero length buffer. */
535
- if (NULL == kid || NULL == nonce || 0 == nonce_len || NULL == ad ||
536
- 0 == ad_len || NULL == ctxt || 0 == ctxt_size || NULL == ctxt_len)
537
- return EDHOC_ERROR_INVALID_ARGUMENT;
538
-
539
- psa_status_t ret = PSA_ERROR_GENERIC_ERROR;
540
- const psa_key_id_t *psa_kid = kid;
541
-
542
- psa_key_attributes_t attr = PSA_KEY_ATTRIBUTES_INIT;
543
- ret = psa_get_key_attributes(*psa_kid, &attr);
544
-
545
- if (PSA_SUCCESS != ret)
546
- return EDHOC_ERROR_CRYPTO_FAILURE;
547
-
548
- ret = psa_aead_encrypt(*psa_kid, psa_get_key_algorithm(&attr), nonce,
549
- nonce_len, ad, ad_len, ptxt, ptxt_len, ctxt,
550
- ctxt_size, ctxt_len);
551
-
552
- return (PSA_SUCCESS == ret) ? EDHOC_SUCCESS :
553
- EDHOC_ERROR_CRYPTO_FAILURE;
554
- }
555
-
556
- int cipher_suite_2_decrypt(void *user_ctx, const void *kid,
557
- const uint8_t *nonce, size_t nonce_len,
558
- const uint8_t *ad, size_t ad_len,
559
- const uint8_t *ctxt, size_t ctxt_len, uint8_t *ptxt,
560
- size_t ptxt_size, size_t *ptxt_len)
561
- {
562
- (void)user_ctx;
563
-
564
- /* Plaintext might be zero length buffer. */
565
- if (NULL == kid || NULL == nonce || 0 == nonce_len || NULL == ad ||
566
- 0 == ad_len || NULL == ctxt || 0 == ctxt_len || NULL == ptxt_len)
567
- return EDHOC_ERROR_INVALID_ARGUMENT;
568
-
569
- psa_status_t ret = PSA_ERROR_GENERIC_ERROR;
570
- const psa_key_id_t *psa_kid = kid;
571
-
572
- psa_key_attributes_t attr = PSA_KEY_ATTRIBUTES_INIT;
573
- ret = psa_get_key_attributes(*psa_kid, &attr);
574
-
575
- if (PSA_SUCCESS != ret)
576
- return EDHOC_ERROR_CRYPTO_FAILURE;
577
-
578
- ret = psa_aead_decrypt(*psa_kid, psa_get_key_algorithm(&attr), nonce,
579
- nonce_len, ad, ad_len, ctxt, ctxt_len, ptxt,
580
- ptxt_size, ptxt_len);
581
-
582
- return (PSA_SUCCESS == ret) ? EDHOC_SUCCESS :
583
- EDHOC_ERROR_CRYPTO_FAILURE;
584
- }
585
-
586
- int cipher_suite_2_hash(void *user_ctx, const uint8_t *input, size_t input_len,
587
- uint8_t *hash, size_t hash_size, size_t *hash_len)
588
- {
589
- (void)user_ctx;
590
-
591
- if (NULL == input || 0 == input_len || NULL == hash || 0 == hash_size ||
592
- NULL == hash_len)
593
- return EDHOC_ERROR_INVALID_ARGUMENT;
594
-
595
- const psa_status_t ret = psa_hash_compute(
596
- PSA_ALG_SHA_256, input, input_len, hash, hash_size, hash_len);
597
-
598
- return (PSA_SUCCESS == ret) ? EDHOC_SUCCESS :
599
- EDHOC_ERROR_CRYPTO_FAILURE;
600
- }
1
+ /**
2
+ * \file cipher_suite_2.c
3
+ * \author Kamil Kielbasa
4
+ * \brief Example implementation of cipher suite 2.
5
+ * \version 0.6
6
+ * \date 2024-08-05
7
+ *
8
+ * \copyright Copyright (c) 2024
9
+ *
10
+ */
11
+
12
+ /* Include files ----------------------------------------------------------- */
13
+
14
+ /* Internal test header: */
15
+ #include "cipher_suite_2.h"
16
+
17
+ /* Standard library header: */
18
+ #include <stdint.h>
19
+ #include <stddef.h>
20
+ #include <string.h>
21
+
22
+ /* EDHOC headers: */
23
+ #include "edhoc_crypto.h"
24
+ #include "edhoc_values.h"
25
+ #include "edhoc_macros.h"
26
+
27
+ /* PSA crypto header: */
28
+ #include <psa/crypto.h>
29
+
30
+ /* mbedTLS headers: */
31
+ #include <mbedtls/ecp.h>
32
+ #include <mbedtls/pk.h>
33
+
34
+ /* Module defines ---------------------------------------------------------- */
35
+ #define AEAD_TAG_LEN (8)
36
+ #define AEAD_KEY_LEN (16)
37
+
38
+ /* Module types and type definitiones -------------------------------------- */
39
+ /* Module interface variables and constants -------------------------------- */
40
+ /* Static variables and constants ------------------------------------------ */
41
+ /* Static function declarations -------------------------------------------- */
42
+
43
+ /**
44
+ * \brief Ellipic curve poin decompression.
45
+ *
46
+ */
47
+ static int mbedtls_ecp_decompress(const mbedtls_ecp_group *grp,
48
+ const uint8_t *raw_key, size_t raw_key_len,
49
+ uint8_t *decomp_key, size_t decomp_key_size,
50
+ size_t *decomp_key_len);
51
+
52
+ /* Static function definitions --------------------------------------------- */
53
+
54
+ static int mbedtls_ecp_decompress(const mbedtls_ecp_group *grp,
55
+ const uint8_t *raw_key, size_t raw_key_len,
56
+ uint8_t *decomp_key, size_t decomp_key_size,
57
+ size_t *decomp_key_len)
58
+ {
59
+ int ret = 0;
60
+
61
+ const size_t p_len = mbedtls_mpi_size(&grp->P);
62
+
63
+ *decomp_key_len = (2 * p_len) + 1;
64
+
65
+ if (decomp_key_size < *decomp_key_len) {
66
+ return MBEDTLS_ERR_ECP_BUFFER_TOO_SMALL;
67
+ }
68
+
69
+ /* decomp_key will consist of 0x04|X|Y */
70
+ (void)memcpy(&decomp_key[1], raw_key, raw_key_len);
71
+ decomp_key[0] = 0x04;
72
+
73
+ mbedtls_mpi r;
74
+ mbedtls_mpi x;
75
+ mbedtls_mpi n;
76
+
77
+ mbedtls_mpi_init(&r);
78
+ mbedtls_mpi_init(&x);
79
+ mbedtls_mpi_init(&n);
80
+
81
+ /* x <= raw_key */
82
+ MBEDTLS_MPI_CHK(mbedtls_mpi_read_binary(&x, raw_key, p_len));
83
+
84
+ /* r = x^2 */
85
+ MBEDTLS_MPI_CHK(mbedtls_mpi_mul_mpi(&r, &x, &x));
86
+
87
+ /* r = x^2 + ad */
88
+ if (NULL == grp->A.MBEDTLS_PRIVATE(p)) {
89
+ // Special case where ad is -3
90
+ MBEDTLS_MPI_CHK(mbedtls_mpi_sub_int(&r, &r, 3));
91
+ } else {
92
+ MBEDTLS_MPI_CHK(mbedtls_mpi_add_mpi(&r, &r, &grp->A));
93
+ }
94
+
95
+ /* r = x^3 + ax */
96
+ MBEDTLS_MPI_CHK(mbedtls_mpi_mul_mpi(&r, &r, &x));
97
+
98
+ /* r = x^3 + ax + b */
99
+ MBEDTLS_MPI_CHK(mbedtls_mpi_add_mpi(&r, &r, &grp->B));
100
+
101
+ /*
102
+ * Calculate square root of r over finite field P:
103
+ * r = sqrt(x^3 + ax + b) = (x^3 + ax + b) ^ ((P + 1) / 4) (mod P)
104
+ */
105
+
106
+ /* n = P + 1 */
107
+ MBEDTLS_MPI_CHK(mbedtls_mpi_add_int(&n, &grp->P, 1));
108
+
109
+ /* n = (P + 1) / 4 */
110
+ MBEDTLS_MPI_CHK(mbedtls_mpi_shift_r(&n, 2));
111
+
112
+ /* r ^ ((P + 1) / 4) (mod p) */
113
+ MBEDTLS_MPI_CHK(mbedtls_mpi_exp_mod(&r, &r, &n, &grp->P, NULL));
114
+
115
+ /* Select solution that has the correct "sign" (equals odd/even solution in finite group) */
116
+ if ((raw_key[0] == 0x03) != mbedtls_mpi_get_bit(&r, 0)) {
117
+ /* r = p - r */
118
+ MBEDTLS_MPI_CHK(mbedtls_mpi_sub_mpi(&r, &grp->P, &r));
119
+ }
120
+
121
+ /* y => decomp_key */
122
+ ret = mbedtls_mpi_write_binary(&r, decomp_key + 1 + p_len, p_len);
123
+
124
+ // cppcheck-suppress unusedLabel
125
+ cleanup:
126
+ mbedtls_mpi_free(&r);
127
+ mbedtls_mpi_free(&x);
128
+ mbedtls_mpi_free(&n);
129
+
130
+ return (ret);
131
+ }
132
+
133
+ /* Module interface function definitions ----------------------------------- */
134
+
135
+ int cipher_suite_2_key_import(void *user_ctx, enum edhoc_key_type key_type,
136
+ const uint8_t *raw_key, size_t raw_key_len,
137
+ void *kid)
138
+ {
139
+ (void)user_ctx;
140
+
141
+ int ret = EDHOC_ERROR_GENERIC_ERROR;
142
+
143
+ /*
144
+ * 1. Generate key attr
145
+ */
146
+ psa_key_attributes_t attr = PSA_KEY_ATTRIBUTES_INIT;
147
+ psa_set_key_lifetime(&attr, PSA_KEY_LIFETIME_VOLATILE);
148
+
149
+ switch (key_type) {
150
+ case EDHOC_KT_MAKE_KEY_PAIR:
151
+ psa_set_key_usage_flags(&attr, PSA_KEY_USAGE_EXPORT);
152
+ psa_set_key_algorithm(&attr, PSA_ALG_ECDH);
153
+ psa_set_key_type(&attr, PSA_KEY_TYPE_ECC_KEY_PAIR(
154
+ PSA_ECC_FAMILY_SECP_R1));
155
+ psa_set_key_bits(&attr, PSA_BYTES_TO_BITS(ECC_COMP_KEY_LEN));
156
+ break;
157
+
158
+ case EDHOC_KT_KEY_AGREEMENT:
159
+ psa_set_key_usage_flags(&attr, PSA_KEY_USAGE_DERIVE);
160
+ psa_set_key_algorithm(&attr, PSA_ALG_ECDH);
161
+ psa_set_key_type(&attr, PSA_KEY_TYPE_ECC_KEY_PAIR(
162
+ PSA_ECC_FAMILY_SECP_R1));
163
+ psa_set_key_bits(&attr, PSA_BYTES_TO_BITS(ECC_COMP_KEY_LEN));
164
+ break;
165
+
166
+ case EDHOC_KT_SIGNATURE:
167
+ psa_set_key_usage_flags(&attr, PSA_KEY_USAGE_SIGN_MESSAGE |
168
+ PSA_KEY_USAGE_SIGN_HASH);
169
+ psa_set_key_algorithm(&attr, PSA_ALG_ECDSA(PSA_ALG_SHA_256));
170
+ psa_set_key_type(&attr, PSA_KEY_TYPE_ECC_KEY_PAIR(
171
+ PSA_ECC_FAMILY_SECP_R1));
172
+ psa_set_key_bits(&attr, PSA_BYTES_TO_BITS(ECC_COMP_KEY_LEN));
173
+ break;
174
+
175
+ case EDHOC_KT_VERIFY:
176
+ psa_set_key_usage_flags(&attr,
177
+ PSA_KEY_USAGE_VERIFY_MESSAGE |
178
+ PSA_KEY_USAGE_VERIFY_HASH);
179
+ psa_set_key_algorithm(&attr, PSA_ALG_ECDSA(PSA_ALG_SHA_256));
180
+ psa_set_key_type(&attr, PSA_KEY_TYPE_ECC_PUBLIC_KEY(
181
+ PSA_ECC_FAMILY_SECP_R1));
182
+ psa_set_key_bits(&attr, PSA_BYTES_TO_BITS(ECC_COMP_KEY_LEN));
183
+ break;
184
+
185
+ case EDHOC_KT_EXTRACT:
186
+ psa_set_key_usage_flags(&attr, PSA_KEY_USAGE_DERIVE);
187
+ psa_set_key_algorithm(&attr,
188
+ PSA_ALG_HKDF_EXTRACT(PSA_ALG_SHA_256));
189
+ psa_set_key_type(&attr, PSA_KEY_TYPE_DERIVE);
190
+ psa_set_key_bits(&attr, PSA_BYTES_TO_BITS(raw_key_len));
191
+ break;
192
+
193
+ case EDHOC_KT_EXPAND:
194
+ psa_set_key_usage_flags(&attr, PSA_KEY_USAGE_DERIVE);
195
+ psa_set_key_algorithm(&attr,
196
+ PSA_ALG_HKDF_EXPAND(PSA_ALG_SHA_256));
197
+ psa_set_key_type(&attr, PSA_KEY_TYPE_DERIVE);
198
+ psa_set_key_bits(&attr, PSA_BYTES_TO_BITS(raw_key_len));
199
+ break;
200
+
201
+ case EDHOC_KT_ENCRYPT:
202
+ psa_set_key_usage_flags(&attr, PSA_KEY_USAGE_ENCRYPT);
203
+ psa_set_key_algorithm(
204
+ &attr, PSA_ALG_AEAD_WITH_SHORTENED_TAG(PSA_ALG_CCM,
205
+ AEAD_TAG_LEN));
206
+ psa_set_key_type(&attr, PSA_KEY_TYPE_AES);
207
+ psa_set_key_bits(&attr, PSA_BYTES_TO_BITS(AEAD_KEY_LEN));
208
+ break;
209
+
210
+ case EDHOC_KT_DECRYPT:
211
+ psa_set_key_usage_flags(&attr, PSA_KEY_USAGE_DECRYPT);
212
+ psa_set_key_algorithm(
213
+ &attr, PSA_ALG_AEAD_WITH_SHORTENED_TAG(PSA_ALG_CCM,
214
+ AEAD_TAG_LEN));
215
+ psa_set_key_type(&attr, PSA_KEY_TYPE_AES);
216
+ psa_set_key_bits(&attr, PSA_BYTES_TO_BITS(AEAD_KEY_LEN));
217
+ break;
218
+
219
+ default:
220
+ return EDHOC_ERROR_CRYPTO_FAILURE;
221
+ }
222
+
223
+ /*
224
+ * 2. Import key identifier
225
+ */
226
+ psa_key_id_t *psa_kid = kid;
227
+ *psa_kid = PSA_KEY_HANDLE_INIT;
228
+
229
+ if (EDHOC_KT_MAKE_KEY_PAIR == key_type) {
230
+ ret = psa_generate_key(&attr, psa_kid);
231
+ } else {
232
+ ret = psa_import_key(&attr, raw_key, raw_key_len, psa_kid);
233
+ }
234
+
235
+ return (PSA_SUCCESS == ret) ? EDHOC_SUCCESS :
236
+ EDHOC_ERROR_CRYPTO_FAILURE;
237
+ }
238
+
239
+ int cipher_suite_2_key_destroy(void *user_ctx, void *kid)
240
+ {
241
+ (void)user_ctx;
242
+
243
+ if (NULL == kid)
244
+ return EDHOC_ERROR_INVALID_ARGUMENT;
245
+
246
+ psa_key_id_t *psa_kid = kid;
247
+ const psa_status_t ret = psa_destroy_key(*psa_kid);
248
+ *psa_kid = PSA_KEY_HANDLE_INIT;
249
+
250
+ return (PSA_SUCCESS == ret) ? EDHOC_SUCCESS :
251
+ EDHOC_ERROR_CRYPTO_FAILURE;
252
+ }
253
+
254
+ int cipher_suite_2_make_key_pair(void *user_ctx, const void *kid,
255
+ uint8_t *restrict priv_key,
256
+ size_t priv_key_size,
257
+ size_t *restrict priv_key_len,
258
+ uint8_t *restrict pub_key, size_t pub_key_size,
259
+ size_t *restrict pub_key_len)
260
+ {
261
+ (void)user_ctx;
262
+
263
+ if (NULL == kid || NULL == priv_key || 0 == priv_key_size ||
264
+ NULL == priv_key_len || NULL == pub_key || 0 == pub_key_size ||
265
+ NULL == pub_key_len)
266
+ return EDHOC_ERROR_INVALID_ARGUMENT;
267
+
268
+ if (ECC_COMP_KEY_LEN != priv_key_size ||
269
+ ECC_COMP_KEY_LEN != pub_key_size)
270
+ return EDHOC_ERROR_CRYPTO_FAILURE;
271
+
272
+ int ret = EDHOC_ERROR_GENERIC_ERROR;
273
+ const psa_key_id_t *psa_kid = kid;
274
+
275
+ ret = psa_export_key(*psa_kid, priv_key, priv_key_size, priv_key_len);
276
+
277
+ if (PSA_SUCCESS != ret || ECC_COMP_KEY_LEN != *priv_key_len)
278
+ return EDHOC_ERROR_CRYPTO_FAILURE;
279
+
280
+ uint8_t uncomp_pub_key[ECC_UNCOMP_KEY_LEN] = { 0 };
281
+ ret = psa_export_public_key(*psa_kid, uncomp_pub_key,
282
+ sizeof(uncomp_pub_key), pub_key_len);
283
+
284
+ if (PSA_SUCCESS != ret)
285
+ return EDHOC_ERROR_CRYPTO_FAILURE;
286
+
287
+ const size_t offset = 1;
288
+ memcpy(pub_key, &uncomp_pub_key[offset], pub_key_size);
289
+ *pub_key_len = pub_key_size;
290
+
291
+ return EDHOC_SUCCESS;
292
+ }
293
+
294
+ int cipher_suite_2_key_agreement(void *user_ctx, const void *kid,
295
+ const uint8_t *peer_pub_key,
296
+ size_t peer_pub_key_len, uint8_t *shr_sec,
297
+ size_t shr_sec_size, size_t *shr_sec_len)
298
+ {
299
+ (void)user_ctx;
300
+
301
+ if (NULL == kid || NULL == peer_pub_key || 0 == peer_pub_key_len ||
302
+ NULL == shr_sec || 0 == shr_sec_size || NULL == shr_sec_len)
303
+ return EDHOC_ERROR_INVALID_ARGUMENT;
304
+
305
+ if (ECC_COMP_KEY_LEN != peer_pub_key_len ||
306
+ ECC_ECDH_KEY_AGREEMENT_LEN != shr_sec_size)
307
+ return EDHOC_ERROR_CRYPTO_FAILURE;
308
+
309
+ psa_status_t ret = PSA_ERROR_GENERIC_ERROR;
310
+
311
+ size_t decom_pub_key_len = 0;
312
+ uint8_t decom_pub_key[ECC_UNCOMP_KEY_LEN] = { 0 };
313
+
314
+ mbedtls_pk_context pub_key_ctx = { 0 };
315
+ mbedtls_pk_init(&pub_key_ctx);
316
+
317
+ ret = mbedtls_pk_setup(&pub_key_ctx,
318
+ mbedtls_pk_info_from_type(MBEDTLS_PK_ECKEY));
319
+
320
+ if (PSA_SUCCESS != ret) {
321
+ mbedtls_pk_free(&pub_key_ctx);
322
+ return EDHOC_ERROR_CRYPTO_FAILURE;
323
+ }
324
+
325
+ ret = mbedtls_ecp_group_load(
326
+ &mbedtls_pk_ec(pub_key_ctx)->MBEDTLS_PRIVATE(grp),
327
+ MBEDTLS_ECP_DP_SECP256R1);
328
+
329
+ if (PSA_SUCCESS != ret) {
330
+ mbedtls_pk_free(&pub_key_ctx);
331
+ return EDHOC_ERROR_CRYPTO_FAILURE;
332
+ }
333
+
334
+ ret = mbedtls_ecp_decompress(
335
+ &mbedtls_pk_ec(pub_key_ctx)->MBEDTLS_PRIVATE(grp), peer_pub_key,
336
+ peer_pub_key_len, decom_pub_key, ARRAY_SIZE(decom_pub_key),
337
+ &decom_pub_key_len);
338
+
339
+ if (PSA_SUCCESS != ret) {
340
+ mbedtls_pk_free(&pub_key_ctx);
341
+ return EDHOC_ERROR_CRYPTO_FAILURE;
342
+ }
343
+
344
+ mbedtls_pk_free(&pub_key_ctx);
345
+
346
+ const psa_key_id_t *psa_kid = kid;
347
+
348
+ psa_key_attributes_t attr = PSA_KEY_ATTRIBUTES_INIT;
349
+ ret = psa_get_key_attributes(*psa_kid, &attr);
350
+
351
+ if (PSA_SUCCESS != ret)
352
+ return EDHOC_ERROR_CRYPTO_FAILURE;
353
+
354
+ const psa_algorithm_t alg = psa_get_key_algorithm(&attr);
355
+
356
+ ret = psa_raw_key_agreement(alg, *psa_kid, decom_pub_key,
357
+ decom_pub_key_len, shr_sec, shr_sec_size,
358
+ shr_sec_len);
359
+
360
+ return (PSA_SUCCESS == ret) ? EDHOC_SUCCESS :
361
+ EDHOC_ERROR_CRYPTO_FAILURE;
362
+ }
363
+
364
+ int cipher_suite_2_signature(void *user_ctx, const void *kid,
365
+ const uint8_t *input, size_t input_len,
366
+ uint8_t *sign, size_t sign_size, size_t *sign_len)
367
+ {
368
+ (void)user_ctx;
369
+
370
+ if (NULL == kid || NULL == input || 0 == input_len || NULL == sign ||
371
+ 0 == sign_size || NULL == sign_len)
372
+ return EDHOC_ERROR_INVALID_ARGUMENT;
373
+
374
+ if (ECC_ECDSA_SIGN_LEN != sign_size)
375
+ return EDHOC_ERROR_CRYPTO_FAILURE;
376
+
377
+ psa_status_t ret = PSA_ERROR_GENERIC_ERROR;
378
+ const psa_key_id_t *psa_kid = kid;
379
+
380
+ psa_key_attributes_t attr = PSA_KEY_ATTRIBUTES_INIT;
381
+ ret = psa_get_key_attributes(*psa_kid, &attr);
382
+
383
+ if (PSA_SUCCESS != ret)
384
+ return EDHOC_ERROR_CRYPTO_FAILURE;
385
+
386
+ ret = psa_sign_message(*psa_kid, psa_get_key_algorithm(&attr), input,
387
+ input_len, sign, sign_size, sign_len);
388
+
389
+ if (ECC_ECDSA_SIGN_LEN != *sign_len)
390
+ return EDHOC_ERROR_CRYPTO_FAILURE;
391
+
392
+ return (PSA_SUCCESS == ret) ? EDHOC_SUCCESS :
393
+ EDHOC_ERROR_CRYPTO_FAILURE;
394
+ }
395
+
396
+ int cipher_suite_2_verify(void *user_ctx, const void *kid, const uint8_t *input,
397
+ size_t input_len, const uint8_t *sign,
398
+ size_t sign_len)
399
+ {
400
+ (void)user_ctx;
401
+
402
+ if (NULL == kid || NULL == input || 0 == input_len || NULL == sign ||
403
+ 0 == sign_len)
404
+ return EDHOC_ERROR_INVALID_ARGUMENT;
405
+
406
+ if (ECC_ECDSA_SIGN_LEN != sign_len)
407
+ return EDHOC_ERROR_CRYPTO_FAILURE;
408
+
409
+ psa_status_t ret = PSA_ERROR_GENERIC_ERROR;
410
+ const psa_key_id_t *psa_kid = kid;
411
+
412
+ psa_key_attributes_t attr = PSA_KEY_ATTRIBUTES_INIT;
413
+ ret = psa_get_key_attributes(*psa_kid, &attr);
414
+
415
+ if (PSA_SUCCESS != ret)
416
+ return EDHOC_ERROR_CRYPTO_FAILURE;
417
+
418
+ ret = psa_verify_message(*psa_kid, psa_get_key_algorithm(&attr), input,
419
+ input_len, sign, sign_len);
420
+
421
+ return (PSA_SUCCESS == ret) ? EDHOC_SUCCESS :
422
+ EDHOC_ERROR_CRYPTO_FAILURE;
423
+ }
424
+
425
+ int cipher_suite_2_extract(void *user_ctx, const void *kid, const uint8_t *salt,
426
+ size_t salt_len, uint8_t *prk, size_t prk_size,
427
+ size_t *prk_len)
428
+ {
429
+ (void)user_ctx;
430
+
431
+ if (NULL == kid || NULL == salt || 0 == salt_len || NULL == prk ||
432
+ 0 == prk_size || NULL == prk_len)
433
+ return EDHOC_ERROR_INVALID_ARGUMENT;
434
+
435
+ psa_status_t ret = PSA_ERROR_GENERIC_ERROR;
436
+
437
+ const psa_key_id_t psa_kid = *((const psa_key_id_t *)kid);
438
+ psa_key_derivation_operation_t ctx = PSA_KEY_DERIVATION_OPERATION_INIT;
439
+
440
+ psa_key_attributes_t attr = PSA_KEY_ATTRIBUTES_INIT;
441
+ ret = psa_get_key_attributes(psa_kid, &attr);
442
+ if (PSA_SUCCESS != ret)
443
+ goto psa_error;
444
+
445
+ ret = psa_key_derivation_setup(&ctx, psa_get_key_algorithm(&attr));
446
+ if (PSA_SUCCESS != ret)
447
+ goto psa_error;
448
+
449
+ ret = psa_key_derivation_input_bytes(
450
+ &ctx, PSA_KEY_DERIVATION_INPUT_SALT, salt, salt_len);
451
+ if (PSA_SUCCESS != ret)
452
+ goto psa_error;
453
+
454
+ ret = psa_key_derivation_input_key(
455
+ &ctx, PSA_KEY_DERIVATION_INPUT_SECRET, psa_kid);
456
+ if (PSA_SUCCESS != ret)
457
+ goto psa_error;
458
+
459
+ ret = psa_key_derivation_set_capacity(&ctx, prk_size);
460
+ if (PSA_SUCCESS != ret)
461
+ goto psa_error;
462
+
463
+ ret = psa_key_derivation_output_bytes(&ctx, prk, prk_size);
464
+ if (PSA_SUCCESS != ret)
465
+ goto psa_error;
466
+
467
+ *prk_len = prk_size;
468
+ psa_key_derivation_abort(&ctx);
469
+
470
+ return EDHOC_SUCCESS;
471
+
472
+ psa_error:
473
+ psa_key_derivation_abort(&ctx);
474
+ return EDHOC_ERROR_CRYPTO_FAILURE;
475
+ }
476
+
477
+ int cipher_suite_2_expand(void *user_ctx, const void *kid, const uint8_t *info,
478
+ size_t info_len, uint8_t *okm, size_t okm_len)
479
+ {
480
+ (void)user_ctx;
481
+
482
+ if (NULL == kid || NULL == info || 0 == info_len || NULL == okm ||
483
+ 0 == okm_len)
484
+ return EDHOC_ERROR_INVALID_ARGUMENT;
485
+
486
+ psa_status_t ret = PSA_ERROR_GENERIC_ERROR;
487
+
488
+ const psa_key_id_t psa_kid = *((const psa_key_id_t *)kid);
489
+ psa_key_derivation_operation_t ctx = PSA_KEY_DERIVATION_OPERATION_INIT;
490
+
491
+ psa_key_attributes_t attr = PSA_KEY_ATTRIBUTES_INIT;
492
+ ret = psa_get_key_attributes(psa_kid, &attr);
493
+ if (PSA_SUCCESS != ret)
494
+ goto psa_error;
495
+
496
+ ret = psa_key_derivation_setup(&ctx, psa_get_key_algorithm(&attr));
497
+ if (PSA_SUCCESS != ret)
498
+ goto psa_error;
499
+
500
+ ret = psa_key_derivation_input_key(
501
+ &ctx, PSA_KEY_DERIVATION_INPUT_SECRET, psa_kid);
502
+ if (PSA_SUCCESS != ret)
503
+ goto psa_error;
504
+
505
+ ret = psa_key_derivation_input_bytes(
506
+ &ctx, PSA_KEY_DERIVATION_INPUT_INFO, info, info_len);
507
+ if (PSA_SUCCESS != ret)
508
+ goto psa_error;
509
+
510
+ ret = psa_key_derivation_set_capacity(&ctx, okm_len);
511
+ if (PSA_SUCCESS != ret)
512
+ goto psa_error;
513
+
514
+ ret = psa_key_derivation_output_bytes(&ctx, okm, okm_len);
515
+ if (PSA_SUCCESS != ret)
516
+ goto psa_error;
517
+
518
+ psa_key_derivation_abort(&ctx);
519
+ return EDHOC_SUCCESS;
520
+
521
+ psa_error:
522
+ psa_key_derivation_abort(&ctx);
523
+ return EDHOC_ERROR_CRYPTO_FAILURE;
524
+ }
525
+
526
+ int cipher_suite_2_encrypt(void *user_ctx, const void *kid,
527
+ const uint8_t *nonce, size_t nonce_len,
528
+ const uint8_t *ad, size_t ad_len,
529
+ const uint8_t *ptxt, size_t ptxt_len, uint8_t *ctxt,
530
+ size_t ctxt_size, size_t *ctxt_len)
531
+ {
532
+ (void)user_ctx;
533
+
534
+ /* Plaintext might be zero length buffer. */
535
+ if (NULL == kid || NULL == nonce || 0 == nonce_len || NULL == ad ||
536
+ 0 == ad_len || NULL == ctxt || 0 == ctxt_size || NULL == ctxt_len)
537
+ return EDHOC_ERROR_INVALID_ARGUMENT;
538
+
539
+ psa_status_t ret = PSA_ERROR_GENERIC_ERROR;
540
+ const psa_key_id_t *psa_kid = kid;
541
+
542
+ psa_key_attributes_t attr = PSA_KEY_ATTRIBUTES_INIT;
543
+ ret = psa_get_key_attributes(*psa_kid, &attr);
544
+
545
+ if (PSA_SUCCESS != ret)
546
+ return EDHOC_ERROR_CRYPTO_FAILURE;
547
+
548
+ ret = psa_aead_encrypt(*psa_kid, psa_get_key_algorithm(&attr), nonce,
549
+ nonce_len, ad, ad_len, ptxt, ptxt_len, ctxt,
550
+ ctxt_size, ctxt_len);
551
+
552
+ return (PSA_SUCCESS == ret) ? EDHOC_SUCCESS :
553
+ EDHOC_ERROR_CRYPTO_FAILURE;
554
+ }
555
+
556
+ int cipher_suite_2_decrypt(void *user_ctx, const void *kid,
557
+ const uint8_t *nonce, size_t nonce_len,
558
+ const uint8_t *ad, size_t ad_len,
559
+ const uint8_t *ctxt, size_t ctxt_len, uint8_t *ptxt,
560
+ size_t ptxt_size, size_t *ptxt_len)
561
+ {
562
+ (void)user_ctx;
563
+
564
+ /* Plaintext might be zero length buffer. */
565
+ if (NULL == kid || NULL == nonce || 0 == nonce_len || NULL == ad ||
566
+ 0 == ad_len || NULL == ctxt || 0 == ctxt_len || NULL == ptxt_len)
567
+ return EDHOC_ERROR_INVALID_ARGUMENT;
568
+
569
+ psa_status_t ret = PSA_ERROR_GENERIC_ERROR;
570
+ const psa_key_id_t *psa_kid = kid;
571
+
572
+ psa_key_attributes_t attr = PSA_KEY_ATTRIBUTES_INIT;
573
+ ret = psa_get_key_attributes(*psa_kid, &attr);
574
+
575
+ if (PSA_SUCCESS != ret)
576
+ return EDHOC_ERROR_CRYPTO_FAILURE;
577
+
578
+ ret = psa_aead_decrypt(*psa_kid, psa_get_key_algorithm(&attr), nonce,
579
+ nonce_len, ad, ad_len, ctxt, ctxt_len, ptxt,
580
+ ptxt_size, ptxt_len);
581
+
582
+ return (PSA_SUCCESS == ret) ? EDHOC_SUCCESS :
583
+ EDHOC_ERROR_CRYPTO_FAILURE;
584
+ }
585
+
586
+ int cipher_suite_2_hash(void *user_ctx, const uint8_t *input, size_t input_len,
587
+ uint8_t *hash, size_t hash_size, size_t *hash_len)
588
+ {
589
+ (void)user_ctx;
590
+
591
+ if (NULL == input || 0 == input_len || NULL == hash || 0 == hash_size ||
592
+ NULL == hash_len)
593
+ return EDHOC_ERROR_INVALID_ARGUMENT;
594
+
595
+ const psa_status_t ret = psa_hash_compute(
596
+ PSA_ALG_SHA_256, input, input_len, hash, hash_size, hash_len);
597
+
598
+ return (PSA_SUCCESS == ret) ? EDHOC_SUCCESS :
599
+ EDHOC_ERROR_CRYPTO_FAILURE;
600
+ }