edhoc 1.2.3 → 1.3.1

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 (41) hide show
  1. package/binding.gyp +2 -2
  2. package/dist/edhoc.d.ts +4 -0
  3. package/dist/edhoc.d.ts.map +1 -1
  4. package/include/{LibEDHOC.h → Binding.h} +60 -40
  5. package/include/EdhocComposeAsyncWorker.h +8 -22
  6. package/include/EdhocCredentialManager.h +9 -25
  7. package/include/EdhocCryptoManager.h +27 -43
  8. package/include/EdhocEadManager.h +3 -4
  9. package/include/EdhocExportOscoreAsyncWorker.h +10 -27
  10. package/include/EdhocKeyExporterAsyncWorker.h +8 -28
  11. package/include/EdhocKeyUpdateAsyncWorker.h +7 -24
  12. package/include/EdhocProcessAsyncWorker.h +11 -36
  13. package/include/RunningContext.h +102 -0
  14. package/include/Utils.h +2 -46
  15. package/package.json +1 -2
  16. package/prebuilds/android-arm/edhoc.armv7.node +0 -0
  17. package/prebuilds/android-arm64/edhoc.armv8.node +0 -0
  18. package/prebuilds/darwin-arm64/edhoc.node +0 -0
  19. package/prebuilds/darwin-x64/edhoc.node +0 -0
  20. package/prebuilds/linux-arm/edhoc.armv6.node +0 -0
  21. package/prebuilds/linux-arm/edhoc.armv7.node +0 -0
  22. package/prebuilds/linux-arm64/edhoc.armv8.node +0 -0
  23. package/prebuilds/linux-x64/edhoc.glibc.node +0 -0
  24. package/prebuilds/linux-x64/edhoc.musl.node +0 -0
  25. package/prebuilds/win32-ia32/edhoc.node +0 -0
  26. package/prebuilds/win32-x64/edhoc.node +0 -0
  27. package/src/Binding.cpp +434 -0
  28. package/src/EdhocComposeAsyncWorker.cpp +39 -57
  29. package/src/EdhocCredentialManager.cpp +58 -93
  30. package/src/EdhocCryptoManager.cpp +181 -400
  31. package/src/EdhocEadManager.cpp +13 -13
  32. package/src/EdhocExportOscoreAsyncWorker.cpp +29 -45
  33. package/src/EdhocKeyExporterAsyncWorker.cpp +19 -37
  34. package/src/EdhocKeyUpdateAsyncWorker.cpp +15 -33
  35. package/src/EdhocProcessAsyncWorker.cpp +82 -96
  36. package/src/RunningContext.cpp +95 -0
  37. package/src/Utils.cpp +2 -34
  38. package/test/basic.test.ts +57 -3
  39. package/include/UserContext.h +0 -78
  40. package/src/LibEDHOC.cpp +0 -418
  41. package/test/errors.test.ts +0 -129
@@ -5,7 +5,7 @@
5
5
  #include <iostream>
6
6
  #include <stdexcept>
7
7
 
8
- #include "UserContext.h"
8
+ #include "RunningContext.h"
9
9
  #include "Utils.h"
10
10
 
11
11
  static constexpr const char* kErrorExpectedObject = "Expected an object as element in the input array";
@@ -21,11 +21,11 @@ EdhocEadManager::EdhocEadManager() {
21
21
  }
22
22
 
23
23
  EdhocEadManager::~EdhocEadManager() {
24
- eadBuffers.clear();
24
+ eadBuffers_.clear();
25
25
  }
26
26
 
27
27
  void EdhocEadManager::StoreEad(enum edhoc_message message, int label, const std::vector<uint8_t>& ead) {
28
- auto& vecOfMaps = eadBuffers[message];
28
+ auto& vecOfMaps = eadBuffers_[message];
29
29
  EadMap newMap;
30
30
  newMap[label] = ead;
31
31
  vecOfMaps.push_back(std::move(newMap));
@@ -36,7 +36,7 @@ void EdhocEadManager::StoreEad(enum edhoc_message message, const Napi::Array& ea
36
36
  for (size_t i = 0; i < eadArray.Length(); i++) {
37
37
  Napi::Value element = eadArray.Get(i);
38
38
  if (!element.IsObject()) {
39
- Napi::TypeError::New(env, kErrorExpectedObject).ThrowAsJavaScriptException();
39
+ throw Napi::TypeError::New(env, kErrorExpectedObject);
40
40
  }
41
41
 
42
42
  Napi::Object obj = element.As<Napi::Object>();
@@ -44,7 +44,7 @@ void EdhocEadManager::StoreEad(enum edhoc_message message, const Napi::Array& ea
44
44
  Napi::Value bufferValue = obj.Get(kPropValue);
45
45
 
46
46
  if (!labelValue.IsNumber() || !bufferValue.IsBuffer()) {
47
- Napi::TypeError::New(env, kErrorExpectedLabelNumberAndValueBuffer).ThrowAsJavaScriptException();
47
+ throw Napi::TypeError::New(env, kErrorExpectedLabelNumberAndValueBuffer);
48
48
  }
49
49
 
50
50
  int label = labelValue.As<Napi::Number>().Int32Value();
@@ -56,8 +56,8 @@ void EdhocEadManager::StoreEad(enum edhoc_message message, const Napi::Array& ea
56
56
  }
57
57
 
58
58
  const EadMapVector* EdhocEadManager::GetEadByMessage(enum edhoc_message message) const {
59
- auto it = eadBuffers.find(message);
60
- return it != eadBuffers.end() ? &it->second : nullptr;
59
+ auto it = eadBuffers_.find(message);
60
+ return it != eadBuffers_.end() ? &it->second : nullptr;
61
61
  }
62
62
 
63
63
  Napi::Array EdhocEadManager::GetEadByMessage(Napi::Env& env, enum edhoc_message message) const {
@@ -81,7 +81,7 @@ Napi::Array EdhocEadManager::GetEadByMessage(Napi::Env& env, enum edhoc_message
81
81
  }
82
82
 
83
83
  void EdhocEadManager::ClearEadByMessage(enum edhoc_message message) {
84
- eadBuffers.erase(message);
84
+ eadBuffers_.erase(message);
85
85
  }
86
86
 
87
87
  int EdhocEadManager::ComposeEad(void* user_context,
@@ -89,7 +89,7 @@ int EdhocEadManager::ComposeEad(void* user_context,
89
89
  struct edhoc_ead_token* ead_token,
90
90
  size_t ead_token_size,
91
91
  size_t* ead_token_len) {
92
- UserContext* context = static_cast<UserContext*>(user_context);
92
+ RunningContext* context = static_cast<RunningContext*>(const_cast<void*>(user_context));
93
93
  EdhocEadManager* manager = context->GetEadManager();
94
94
  return manager->callComposeEad(message, ead_token, ead_token_size, ead_token_len);
95
95
  }
@@ -98,7 +98,7 @@ int EdhocEadManager::ProcessEad(void* user_context,
98
98
  enum edhoc_message message,
99
99
  const struct edhoc_ead_token* ead_token,
100
100
  size_t ead_token_size) {
101
- UserContext* context = static_cast<UserContext*>(user_context);
101
+ RunningContext* context = static_cast<RunningContext*>(const_cast<void*>(user_context));
102
102
  EdhocEadManager* manager = context->GetEadManager();
103
103
  return manager->callProcessEad(message, ead_token, ead_token_size);
104
104
  }
@@ -107,15 +107,15 @@ int EdhocEadManager::callComposeEad(enum edhoc_message message,
107
107
  struct edhoc_ead_token* ead_token,
108
108
  size_t ead_token_size,
109
109
  size_t* ead_token_len) {
110
- const EadMapVector* eadBuffers = GetEadByMessage(message);
111
- if (!eadBuffers) {
110
+ const EadMapVector* eadBuffers_ = GetEadByMessage(message);
111
+ if (!eadBuffers_) {
112
112
  *ead_token_len = 0;
113
113
  return EDHOC_SUCCESS;
114
114
  }
115
115
 
116
116
  size_t count = 0;
117
117
 
118
- for (const auto& map : *eadBuffers) {
118
+ for (const auto& map : *eadBuffers_) {
119
119
  for (const auto& [label, buffer] : map) {
120
120
  if (count >= ead_token_size) {
121
121
  break;
@@ -10,34 +10,35 @@ static constexpr size_t kMasterSecrectSize = 16;
10
10
  static constexpr size_t kMasterSaltSize = 8;
11
11
  static constexpr size_t kConnectionIdSize = 7;
12
12
 
13
- EdhocExportOscoreAsyncWorker::EdhocExportOscoreAsyncWorker(Napi::Env& env,
14
- struct edhoc_context& context,
15
- CallbackType callback)
16
- : Napi::AsyncWorker(env),
17
- deferred(Napi::Promise::Deferred::New(env)),
18
- context(context),
19
- masterSecret(kMasterSecrectSize),
20
- masterSalt(kMasterSaltSize),
21
- senderId(kConnectionIdSize),
22
- recipientId(kConnectionIdSize),
23
- callback(std::move(callback)) {}
13
+ EdhocExportOscoreAsyncWorker::EdhocExportOscoreAsyncWorker(RunningContext* runningContext)
14
+ : Napi::AsyncWorker(runningContext->GetEnv()),
15
+ runningContext_(runningContext),
16
+ masterSecret_(kMasterSecrectSize),
17
+ masterSalt_(kMasterSaltSize),
18
+ senderId_(kConnectionIdSize),
19
+ recipientId_(kConnectionIdSize) {}
24
20
 
25
21
  EdhocExportOscoreAsyncWorker::~EdhocExportOscoreAsyncWorker() {}
26
22
 
27
23
  void EdhocExportOscoreAsyncWorker::Execute() {
28
- size_t sender_id_length, recipient_id_length;
24
+ try {
25
+ size_t sender_id_length, recipient_id_length;
29
26
 
30
- int ret = edhoc_export_oscore_session(&context, masterSecret.data(), masterSecret.size(), masterSalt.data(),
31
- masterSalt.size(), senderId.data(), senderId.size(), &sender_id_length,
32
- recipientId.data(), recipientId.size(), &recipient_id_length);
27
+ int ret = edhoc_export_oscore_session(runningContext_->GetEdhocContext(), masterSecret_.data(), masterSecret_.size(), masterSalt_.data(),
28
+ masterSalt_.size(), senderId_.data(), senderId_.size(), &sender_id_length,
29
+ recipientId_.data(), recipientId_.size(), &recipient_id_length);
33
30
 
34
- if (ret != EDHOC_SUCCESS) {
35
- char errorMessage[kErrorBufferSize];
36
- std::snprintf(errorMessage, kErrorBufferSize, kErrorMessageFormat, ret);
37
- SetError(errorMessage);
38
- } else {
39
- senderId.resize(sender_id_length);
40
- recipientId.resize(recipient_id_length);
31
+ if (ret != EDHOC_SUCCESS) {
32
+ char errorMessage[kErrorBufferSize];
33
+ std::snprintf(errorMessage, kErrorBufferSize, kErrorMessageFormat, ret);
34
+ SetError(errorMessage);
35
+ } else {
36
+ senderId_.resize(sender_id_length);
37
+ recipientId_.resize(recipient_id_length);
38
+ }
39
+
40
+ } catch (const std::exception& e) {
41
+ SetError(e.what());
41
42
  }
42
43
  }
43
44
 
@@ -45,10 +46,10 @@ void EdhocExportOscoreAsyncWorker::OnOK() {
45
46
  Napi::Env env = Env();
46
47
  Napi::HandleScope scope(env);
47
48
 
48
- auto masterSecretBuffer = Napi::Buffer<uint8_t>::Copy(env, masterSecret.data(), masterSecret.size());
49
- auto masterSaltBuffer = Napi::Buffer<uint8_t>::Copy(env, masterSalt.data(), masterSalt.size());
50
- auto senderIdBuffer = Napi::Buffer<uint8_t>::Copy(env, senderId.data(), senderId.size());
51
- auto recipientIdBuffer = Napi::Buffer<uint8_t>::Copy(env, recipientId.data(), recipientId.size());
49
+ auto masterSecretBuffer = Napi::Buffer<uint8_t>::Copy(env, masterSecret_.data(), masterSecret_.size());
50
+ auto masterSaltBuffer = Napi::Buffer<uint8_t>::Copy(env, masterSalt_.data(), masterSalt_.size());
51
+ auto senderIdBuffer = Napi::Buffer<uint8_t>::Copy(env, senderId_.data(), senderId_.size());
52
+ auto recipientIdBuffer = Napi::Buffer<uint8_t>::Copy(env, recipientId_.data(), recipientId_.size());
52
53
 
53
54
  Napi::Object resultObj = Napi::Object::New(env);
54
55
  resultObj.Set(kPropMasterSecret, masterSecretBuffer);
@@ -56,28 +57,11 @@ void EdhocExportOscoreAsyncWorker::OnOK() {
56
57
  resultObj.Set(kPropSenderId, senderIdBuffer);
57
58
  resultObj.Set(kPropRecipientId, recipientIdBuffer);
58
59
 
59
- callback(env);
60
-
61
- if (env.IsExceptionPending()) {
62
- deferred.Reject(env.GetAndClearPendingException().Value());
63
- } else {
64
- deferred.Resolve(resultObj);
65
- }
60
+ runningContext_->Resolve(resultObj);
66
61
  }
67
62
 
68
63
  void EdhocExportOscoreAsyncWorker::OnError(const Napi::Error& error) {
69
64
  Napi::Env env = Env();
70
65
  Napi::HandleScope scope(env);
71
-
72
- callback(env);
73
-
74
- if (env.IsExceptionPending()) {
75
- deferred.Reject(env.GetAndClearPendingException().Value());
76
- } else {
77
- deferred.Reject(error.Value());
78
- }
79
- }
80
-
81
- Napi::Promise EdhocExportOscoreAsyncWorker::GetPromise() {
82
- return deferred.Promise();
66
+ runningContext_->Reject(error.Value());
83
67
  }
@@ -3,55 +3,37 @@
3
3
  static constexpr const char* kErrorMessageFormat = "Failed to export the key. Error code: %d.";
4
4
  static constexpr size_t kErrorBufferSize = 100;
5
5
 
6
- EdhocKeyExporterAsyncWorker::EdhocKeyExporterAsyncWorker(Napi::Env& env,
7
- struct edhoc_context& context,
6
+ EdhocKeyExporterAsyncWorker::EdhocKeyExporterAsyncWorker(RunningContext* runningContext,
8
7
  uint16_t label,
9
- uint8_t desiredLength,
10
- CallbackType callback)
11
- : Napi::AsyncWorker(env),
12
- deferred(Napi::Promise::Deferred::New(env)),
13
- context(context),
14
- label(label),
15
- desiredLength(desiredLength),
16
- output(desiredLength),
17
- callback(std::move(callback)) {}
8
+ uint8_t desiredLength)
9
+ : Napi::AsyncWorker(runningContext->GetEnv()),
10
+ runningContext_(runningContext),
11
+ label_(label),
12
+ desiredLength_(desiredLength),
13
+ output_(desiredLength) {}
18
14
 
19
15
  void EdhocKeyExporterAsyncWorker::Execute() {
20
- int ret = edhoc_export_prk_exporter(&context, label, output.data(), desiredLength);
21
- if (ret != EDHOC_SUCCESS) {
22
- char errorMessage[kErrorBufferSize];
23
- std::snprintf(errorMessage, kErrorBufferSize, kErrorMessageFormat, ret);
24
- SetError(errorMessage);
16
+ try {
17
+ int ret = edhoc_export_prk_exporter(runningContext_->GetEdhocContext(), label_, output_.data(), desiredLength_);
18
+ if (ret != EDHOC_SUCCESS) {
19
+ char errorMessage[kErrorBufferSize];
20
+ std::snprintf(errorMessage, kErrorBufferSize, kErrorMessageFormat, ret);
21
+ SetError(errorMessage);
22
+ }
23
+ } catch (const std::exception& e) {
24
+ SetError(e.what());
25
25
  }
26
26
  }
27
27
 
28
28
  void EdhocKeyExporterAsyncWorker::OnOK() {
29
29
  Napi::Env env = Env();
30
30
  Napi::HandleScope scope(env);
31
- auto outputBuffer = Napi::Buffer<uint8_t>::Copy(env, output.data(), output.size());
32
-
33
- callback(env);
34
-
35
- if (env.IsExceptionPending()) {
36
- deferred.Reject(env.GetAndClearPendingException().Value());
37
- } else {
38
- deferred.Resolve(outputBuffer);
39
- }
31
+ auto outputBuffer = Napi::Buffer<uint8_t>::Copy(env, output_.data(), output_.size());
32
+ runningContext_->Resolve(outputBuffer);
40
33
  }
41
34
 
42
35
  void EdhocKeyExporterAsyncWorker::OnError(const Napi::Error& error) {
43
36
  Napi::Env env = Env();
44
37
  Napi::HandleScope scope(env);
45
-
46
- callback(env);
47
-
48
- if (env.IsExceptionPending()) {
49
- deferred.Reject(env.GetAndClearPendingException().Value());
50
- } else {
51
- deferred.Reject(error.Value());
52
- }
53
- }
54
-
55
- Napi::Promise EdhocKeyExporterAsyncWorker::GetPromise() {
56
- return deferred.Promise();
38
+ runningContext_->Reject(error.Value());
57
39
  }
@@ -1,49 +1,31 @@
1
1
  #include "EdhocKeyUpdateAsyncWorker.h"
2
2
 
3
- EdhocKeyUpdateAsyncWorker::EdhocKeyUpdateAsyncWorker(Napi::Env& env,
4
- struct edhoc_context& context,
5
- std::vector<uint8_t> contextBuffer,
6
- CallbackType callback)
7
- : Napi::AsyncWorker(env),
8
- deferred(Napi::Promise::Deferred::New(env)),
9
- context(context),
10
- contextBuffer(contextBuffer),
11
- callback(std::move(callback)) {}
3
+ EdhocKeyUpdateAsyncWorker::EdhocKeyUpdateAsyncWorker(RunningContext* runningContext,
4
+ std::vector<uint8_t> contextBuffer)
5
+ : Napi::AsyncWorker(runningContext->GetEnv()),
6
+ runningContext_(runningContext),
7
+ contextBuffer_(contextBuffer) {}
12
8
 
13
9
  void EdhocKeyUpdateAsyncWorker::Execute() {
14
- int ret = edhoc_export_key_update(&context, contextBuffer.data(), contextBuffer.size());
15
-
16
- if (ret != EDHOC_SUCCESS) {
17
- SetError("Failed to update key.");
10
+ try {
11
+ int ret = edhoc_export_key_update(runningContext_->GetEdhocContext(), contextBuffer_.data(), contextBuffer_.size());
12
+
13
+ if (ret != EDHOC_SUCCESS) {
14
+ SetError("Failed to update key.");
15
+ }
16
+ } catch (const std::exception& e) {
17
+ SetError(e.what());
18
18
  }
19
19
  }
20
20
 
21
21
  void EdhocKeyUpdateAsyncWorker::OnOK() {
22
22
  Napi::Env env = Env();
23
23
  Napi::HandleScope scope(env);
24
-
25
- callback(env);
26
-
27
- if (env.IsExceptionPending()) {
28
- deferred.Reject(env.GetAndClearPendingException().Value());
29
- } else {
30
- deferred.Resolve(env.Undefined());
31
- }
24
+ runningContext_->Resolve(env.Undefined());
32
25
  }
33
26
 
34
27
  void EdhocKeyUpdateAsyncWorker::OnError(const Napi::Error& error) {
35
28
  Napi::Env env = Env();
36
29
  Napi::HandleScope scope(env);
37
-
38
- callback(env);
39
-
40
- if (env.IsExceptionPending()) {
41
- deferred.Reject(env.GetAndClearPendingException().Value());
42
- } else {
43
- deferred.Reject(error.Value());
44
- }
45
- }
46
-
47
- Napi::Promise EdhocKeyUpdateAsyncWorker::GetPromise() {
48
- return deferred.Promise();
30
+ runningContext_->Reject(error.Value());
49
31
  }
@@ -1,134 +1,120 @@
1
1
  #include "EdhocProcessAsyncWorker.h"
2
2
 
3
- #include <iostream>
4
3
  static constexpr const char* kErrorInvalidMessageNumber = "Invalid message number";
5
4
  static constexpr const char* kErrorMessageFormat = "Failed to process EDHOC message %d. Error code: %d";
6
5
  static constexpr const char* kErrorWrongSelectedCipherSuiteFormat =
7
6
  "Wrong selected cipher suite. Supported: %s, Received: %s";
8
7
  static constexpr size_t kErrorBufferSize = 100;
9
8
 
10
- EdhocProcessAsyncWorker::EdhocProcessAsyncWorker(Napi::Env& env,
11
- struct edhoc_context& context,
9
+ EdhocProcessAsyncWorker::EdhocProcessAsyncWorker(RunningContext* runningContext,
12
10
  int messageNumber,
13
- Napi::Buffer<uint8_t> buffer,
14
- CallbackType callback)
15
- : Napi::AsyncWorker(env),
16
- deferred(Napi::Promise::Deferred::New(env)),
17
- context(context),
18
- messageNumber(messageNumber),
19
- messageBuffer(buffer.Data(), buffer.Data() + buffer.Length()),
20
- callback(std::move(callback)),
21
- peerCipherSuites() {}
11
+ Napi::Buffer<uint8_t> buffer)
12
+ : Napi::AsyncWorker(runningContext->GetEnv()),
13
+ runningContext_(runningContext),
14
+ messageNumber_(messageNumber),
15
+ messageBuffer_(buffer.Data(), buffer.Data() + buffer.Length()),
16
+ peerCipherSuites_() {}
22
17
 
23
18
  void EdhocProcessAsyncWorker::Execute() {
24
- uint8_t* message = messageBuffer.data();
25
- size_t message_length = messageBuffer.size();
26
-
27
- int ret = EDHOC_ERROR_GENERIC_ERROR;
28
- switch (messageNumber) {
29
- case EDHOC_MSG_1:
30
- ret = edhoc_message_1_process(&context, message, message_length);
31
- break;
32
- case EDHOC_MSG_2:
33
- ret = edhoc_message_2_process(&context, message, message_length);
34
- break;
35
- case EDHOC_MSG_3:
36
- ret = edhoc_message_3_process(&context, message, message_length);
37
- break;
38
- case EDHOC_MSG_4:
39
- ret = edhoc_message_4_process(&context, message, message_length);
40
- break;
41
- default:
42
- SetError(kErrorInvalidMessageNumber);
43
- return;
44
- }
19
+ try {
20
+ uint8_t* message = messageBuffer_.data();
21
+ size_t message_length = messageBuffer_.size();
22
+
23
+ int ret = EDHOC_ERROR_GENERIC_ERROR;
24
+ switch (messageNumber_) {
25
+ case EDHOC_MSG_1:
26
+ ret = edhoc_message_1_process(runningContext_->GetEdhocContext(), message, message_length);
27
+ break;
28
+ case EDHOC_MSG_2:
29
+ ret = edhoc_message_2_process(runningContext_->GetEdhocContext(), message, message_length);
30
+ break;
31
+ case EDHOC_MSG_3:
32
+ ret = edhoc_message_3_process(runningContext_->GetEdhocContext(), message, message_length);
33
+ break;
34
+ case EDHOC_MSG_4:
35
+ ret = edhoc_message_4_process(runningContext_->GetEdhocContext(), message, message_length);
36
+ break;
37
+ default:
38
+ SetError(kErrorInvalidMessageNumber);
39
+ return;
40
+ }
45
41
 
46
- if (ret != EDHOC_SUCCESS) {
47
- enum edhoc_error_code error_code = EDHOC_ERROR_CODE_SUCCESS;
48
- ret = edhoc_error_get_code(&context, &error_code);
49
- switch (error_code) {
50
- case EDHOC_ERROR_CODE_WRONG_SELECTED_CIPHER_SUITE: {
51
- size_t csuites_len = 0;
52
- int32_t csuites[10] = {0};
53
- size_t peer_csuites_len = 0;
54
- int32_t peer_csuites[10] = {0};
55
-
56
- ret = edhoc_error_get_cipher_suites(&context, csuites, ARRAY_SIZE(csuites), &csuites_len, peer_csuites,
57
- ARRAY_SIZE(peer_csuites), &peer_csuites_len);
58
- if (ret == EDHOC_SUCCESS) {
59
- std::string suites_str = "[";
60
- for (size_t i = 0; i < csuites_len; i++) {
61
- suites_str += std::to_string(csuites[i]);
62
- if (i < csuites_len - 1) {
63
- suites_str += ", ";
42
+ if (ret != EDHOC_SUCCESS) {
43
+ enum edhoc_error_code error_code = EDHOC_ERROR_CODE_SUCCESS;
44
+ ret = edhoc_error_get_code(runningContext_->GetEdhocContext(), &error_code);
45
+ switch (error_code) {
46
+ case EDHOC_ERROR_CODE_WRONG_SELECTED_CIPHER_SUITE: {
47
+ size_t csuites_len = 0;
48
+ int32_t csuites[10] = {0};
49
+ size_t peer_csuites_len = 0;
50
+ int32_t peer_csuites[10] = {0};
51
+
52
+ ret = edhoc_error_get_cipher_suites(runningContext_->GetEdhocContext(), csuites, ARRAY_SIZE(csuites), &csuites_len, peer_csuites,
53
+ ARRAY_SIZE(peer_csuites), &peer_csuites_len);
54
+ if (ret == EDHOC_SUCCESS) {
55
+ std::string suites_str = "[";
56
+ for (size_t i = 0; i < csuites_len; i++) {
57
+ suites_str += std::to_string(csuites[i]);
58
+ if (i < csuites_len - 1) {
59
+ suites_str += ", ";
60
+ }
64
61
  }
65
- }
66
- suites_str += "*]";
67
-
68
- std::string peer_suites_str = "[";
69
- for (size_t i = 0; i < peer_csuites_len; i++) {
70
- peer_suites_str += std::to_string(peer_csuites[i]);
71
- if (i < peer_csuites_len - 1) {
72
- peer_suites_str += ", ";
62
+ suites_str += "*]";
63
+
64
+ std::string peer_suites_str = "[";
65
+ for (size_t i = 0; i < peer_csuites_len; i++) {
66
+ peer_suites_str += std::to_string(peer_csuites[i]);
67
+ if (i < peer_csuites_len - 1) {
68
+ peer_suites_str += ", ";
69
+ }
73
70
  }
74
- }
75
- peer_suites_str += "*]";
71
+ peer_suites_str += "*]";
76
72
 
77
- peerCipherSuites.assign(peer_csuites, peer_csuites + peer_csuites_len);
73
+ peerCipherSuites_.assign(peer_csuites, peer_csuites + peer_csuites_len);
78
74
 
79
- char errorMessage[kErrorBufferSize];
80
- std::snprintf(errorMessage, kErrorBufferSize, kErrorWrongSelectedCipherSuiteFormat, suites_str.c_str(),
81
- peer_suites_str.c_str());
82
- SetError(errorMessage);
83
- return;
75
+ char errorMessage[kErrorBufferSize];
76
+ std::snprintf(errorMessage, kErrorBufferSize, kErrorWrongSelectedCipherSuiteFormat, suites_str.c_str(),
77
+ peer_suites_str.c_str());
78
+ SetError(errorMessage);
79
+ return;
80
+ }
81
+ break;
84
82
  }
85
- break;
83
+ default:
84
+ break;
86
85
  }
87
- default:
88
- break;
86
+
87
+ char errorMessage[kErrorBufferSize];
88
+ std::snprintf(errorMessage, kErrorBufferSize, kErrorMessageFormat, messageNumber_ + 1, error_code);
89
+ SetError(errorMessage);
89
90
  }
90
91
 
91
- char errorMessage[kErrorBufferSize];
92
- std::snprintf(errorMessage, kErrorBufferSize, kErrorMessageFormat, messageNumber + 1, error_code);
93
- SetError(errorMessage);
92
+ } catch (const std::exception& e) {
93
+ SetError(e.what());
94
94
  }
95
95
  }
96
96
 
97
97
  void EdhocProcessAsyncWorker::OnOK() {
98
98
  Napi::Env env = Env();
99
99
  Napi::HandleScope scope(env);
100
- Napi::Array result = callback(env);
101
-
102
- callback(env);
100
+
101
+ Napi::Array EADs = runningContext_->GetEadManager()->GetEadByMessage(env, static_cast<enum edhoc_message>(messageNumber_));
102
+ runningContext_->GetEadManager()->ClearEadByMessage(static_cast<enum edhoc_message>(messageNumber_));
103
103
 
104
- if (env.IsExceptionPending()) {
105
- deferred.Reject(env.GetAndClearPendingException().Value());
106
- } else {
107
- deferred.Resolve(result);
108
- }
104
+ runningContext_->Resolve(EADs);
109
105
  }
110
106
 
111
107
  void EdhocProcessAsyncWorker::OnError(const Napi::Error& error) {
112
108
  Napi::Env env = Env();
113
109
  Napi::HandleScope scope(env);
114
110
 
115
- if (peerCipherSuites.size() > 0) {
116
- Napi::Array result = Napi::Array::New(env, peerCipherSuites.size());
117
- for (size_t i = 0; i < peerCipherSuites.size(); i++) {
118
- result.Set(i, Napi::Number::New(env, peerCipherSuites[i]));
111
+ if (peerCipherSuites_.size() > 0) {
112
+ Napi::Array result = Napi::Array::New(env, peerCipherSuites_.size());
113
+ for (size_t i = 0; i < peerCipherSuites_.size(); i++) {
114
+ result.Set(i, Napi::Number::New(env, peerCipherSuites_[i]));
119
115
  }
120
116
  error.Set("peerCipherSuites", result);
121
117
  }
122
118
 
123
- callback(env);
124
-
125
- if (env.IsExceptionPending()) {
126
- deferred.Reject(env.GetAndClearPendingException().Value());
127
- } else {
128
- deferred.Reject(error.Value());
129
- }
130
- }
131
-
132
- Napi::Promise EdhocProcessAsyncWorker::GetPromise() {
133
- return deferred.Promise();
119
+ runningContext_->Reject(error.Value());
134
120
  }
@@ -0,0 +1,95 @@
1
+ #include "RunningContext.h"
2
+ #include <iostream>
3
+ RunningContext::RunningContext(Napi::Env env,
4
+ struct edhoc_context* edhoc_context,
5
+ EdhocCryptoManager* cryptoManager,
6
+ EdhocEadManager* eadManager,
7
+ EdhocCredentialManager* credentialManager,
8
+ const Napi::Function& logger)
9
+ : edhoc_context_(edhoc_context)
10
+ , cryptoManager_(cryptoManager)
11
+ , eadManager_(eadManager)
12
+ , credentialManager_(credentialManager)
13
+ , tsfn_()
14
+ , deferred_(Napi::Promise::Deferred::New(env))
15
+ , loggerRef_(Napi::Weak(logger))
16
+ , isResolved_(false)
17
+ {
18
+ Napi::Function jsCallback = Napi::Function::New(env, [](const Napi::CallbackInfo& info) { return Napi::Value(); });
19
+ this->tsfn_ = Napi::ThreadSafeFunction::New(env, jsCallback, "jsCallback", 0, 1, this);
20
+ }
21
+
22
+ int RunningContext::ThreadSafeBlockingCall(
23
+ Napi::ObjectReference& jsObjectRef,
24
+ const std::string& jsFunctionName,
25
+ ArgumentsHandler argumentsHandler,
26
+ CompletionHandler completionHandler)
27
+ {
28
+ std::promise<int> promise;
29
+ std::future<int> future = promise.get_future();
30
+
31
+ this->tsfn_.BlockingCall(&promise, [this, &jsObjectRef, jsFunctionName, argumentsHandler, completionHandler](Napi::Env env, Napi::Function jsCallback, std::promise<int>* promise) {
32
+ Napi::HandleScope scope(env);
33
+ auto deferred = Napi::Promise::Deferred::New(env);
34
+ try {
35
+ const std::vector<napi_value> arguments = argumentsHandler(env);
36
+ Napi::Function jsFunction = jsObjectRef.Value().Get(jsFunctionName).As<Napi::Function>();
37
+ Napi::Value result = jsFunction.Call(jsObjectRef.Value(), arguments);
38
+ deferred.Resolve(result);
39
+ } catch (const Napi::Error& e) {
40
+ deferred.Reject(e.Value());
41
+ } catch (const std::exception& e) {
42
+ deferred.Reject(Napi::Error::New(env, e.what()).Value());
43
+ }
44
+
45
+ auto thenCallback = Napi::Function::New(env, [this, promise, completionHandler](const Napi::CallbackInfo& info) {
46
+ Napi::Env env = info.Env();
47
+ Napi::HandleScope scope(env);
48
+ try {
49
+ int result = completionHandler(env, info[0].As<Napi::Value>());
50
+ promise->set_value(result);
51
+ } catch (const Napi::Error& e) {
52
+ this->Reject(info[0].As<Napi::Error>().Value());
53
+ promise->set_value(EDHOC_ERROR_GENERIC_ERROR);
54
+ } catch (const std::exception& e) {
55
+ this->Reject(Napi::Error::New(env, e.what()).Value());
56
+ promise->set_value(EDHOC_ERROR_GENERIC_ERROR);
57
+ }
58
+ });
59
+
60
+ auto catchCallback = Napi::Function::New(env, [this, promise](const Napi::CallbackInfo& info) {
61
+ Napi::Env env = info.Env();
62
+ Napi::HandleScope scope(env);
63
+ this->Reject(info[0].As<Napi::Error>().Value());
64
+ promise->set_value(EDHOC_ERROR_GENERIC_ERROR);
65
+ });
66
+
67
+ Napi::Promise promise_ = deferred.Promise();
68
+ promise_.Get("then").As<Napi::Function>().Call(promise_, { thenCallback, catchCallback });
69
+ });
70
+
71
+ future.wait();
72
+ return future.get();
73
+ }
74
+
75
+ void RunningContext::Resolve(Napi::Value value) {
76
+ if (isResolved_) {
77
+ return;
78
+ }
79
+ deferred_.Resolve(value);
80
+ tsfn_.Release();
81
+ isResolved_ = true;
82
+ }
83
+
84
+ void RunningContext::Reject(Napi::Value value) {
85
+ if (isResolved_) {
86
+ return;
87
+ }
88
+ deferred_.Reject(value);
89
+ tsfn_.Release();
90
+ isResolved_ = true;
91
+ }
92
+
93
+ Napi::Promise RunningContext::GetPromise() const {
94
+ return deferred_.Promise();
95
+ }