edhoc 1.3.2 → 1.4.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.
package/dist/crypto.d.ts CHANGED
@@ -15,8 +15,8 @@ export declare class DefaultEdhocCryptoManager implements EdhocCryptoManager {
15
15
  verify(edhoc: EDHOC, keyID: Buffer, input: Buffer, signature: Buffer): Promise<boolean>;
16
16
  extract(edhoc: EDHOC, keyID: Buffer, salt: Buffer, _keySize: number): Buffer;
17
17
  expand(edhoc: EDHOC, keyID: Buffer, info: Buffer, keySize: number): Buffer;
18
- encrypt(edhoc: EDHOC, keyID: Buffer, nonce: Buffer, aad: Buffer, plaintext: Buffer, _size: number): Buffer;
19
- decrypt(edhoc: EDHOC, keyID: Buffer, nonce: Buffer, aad: Buffer, ciphertext: Buffer, _size: number): Buffer;
18
+ encrypt(edhoc: EDHOC, keyID: Buffer, nonce: Buffer, aad: Buffer, plaintext: Buffer, _size: number): Promise<Buffer>;
19
+ decrypt(edhoc: EDHOC, keyID: Buffer, nonce: Buffer, aad: Buffer, ciphertext: Buffer, _size: number): Promise<Buffer>;
20
20
  hash(_edhoc: EDHOC, data: Buffer, _hashSize: number): Promise<Buffer>;
21
21
  getKey(keyID: Buffer): Buffer;
22
22
  private formatToBeSigned;
@@ -1 +1 @@
1
- {"version":3,"file":"crypto.d.ts","sourceRoot":"","sources":["../lib/crypto.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,kBAAkB,EAAE,YAAY,EAAc,MAAM,SAAS,CAAC;AAoB9E,qBAAa,yBAA0B,YAAW,kBAAkB;IAEhE,OAAO,CAAC,IAAI,CAAiB;IAC7B,OAAO,CAAC,aAAa,CAAgB;;IAM9B,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM;IAKlC,SAAS,CAAC,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,YAAY,EAAE,GAAG,EAAE,MAAM;IAsBhE,UAAU,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM;IAStC,WAAW,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM;;;;IAcxF,YAAY,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM;IAQpF,IAAI,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM;IAiBjE,MAAM,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAa7F,OAAO,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM;IAKnE,MAAM,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM;IAMjE,OAAO,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM;IAmBjG,OAAO,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM;IAiB5F,IAAI,CAAC,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM;IAIlD,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM;IAQpC,OAAO,CAAC,gBAAgB;IAYxB,OAAO,CAAC,eAAe;IAavB,OAAO,CAAC,oBAAoB;IAY5B,OAAO,CAAC,uBAAuB;IAY/B,OAAO,CAAC,YAAY;IAIpB,OAAO,CAAC,YAAY;CAiBvB"}
1
+ {"version":3,"file":"crypto.d.ts","sourceRoot":"","sources":["../lib/crypto.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,kBAAkB,EAAE,YAAY,EAAc,MAAM,SAAS,CAAC;AAoB9E,qBAAa,yBAA0B,YAAW,kBAAkB;IAEhE,OAAO,CAAC,IAAI,CAAiB;IAC7B,OAAO,CAAC,aAAa,CAAgB;;IAM9B,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM;IAKlC,SAAS,CAAC,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,YAAY,EAAE,GAAG,EAAE,MAAM;IAsBhE,UAAU,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM;IAStC,WAAW,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM;;;;IAcxF,YAAY,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM;IAQpF,IAAI,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM;IAiBjE,MAAM,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAa7F,OAAO,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM;IAKnE,MAAM,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM;IAM3D,OAAO,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAmBnH,OAAO,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAiBpH,IAAI,CAAC,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM;IAIlD,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM;IAQpC,OAAO,CAAC,gBAAgB;IAYxB,OAAO,CAAC,eAAe;IAavB,OAAO,CAAC,oBAAoB;IAY5B,OAAO,CAAC,uBAAuB;IAY/B,OAAO,CAAC,YAAY;IAIpB,OAAO,CAAC,YAAY;CAiBvB"}
package/dist/crypto.js CHANGED
@@ -98,7 +98,7 @@ class DefaultEdhocCryptoManager {
98
98
  const expanded = Buffer.from((0, hkdf_1.expand)(sha256_1.sha256, new Uint8Array(key), new Uint8Array(info), keySize));
99
99
  return expanded;
100
100
  }
101
- encrypt(edhoc, keyID, nonce, aad, plaintext, _size) {
101
+ async encrypt(edhoc, keyID, nonce, aad, plaintext, _size) {
102
102
  const key = this.getKey(keyID);
103
103
  const algorithm = this.getAlgorithm(edhoc.selectedSuite);
104
104
  const options = {
@@ -114,7 +114,7 @@ class DefaultEdhocCryptoManager {
114
114
  ]);
115
115
  return encrypted;
116
116
  }
117
- decrypt(edhoc, keyID, nonce, aad, ciphertext, _size) {
117
+ async decrypt(edhoc, keyID, nonce, aad, ciphertext, _size) {
118
118
  const key = this.getKey(keyID);
119
119
  const tagLength = this.getTagLength(edhoc.selectedSuite);
120
120
  const algorithm = this.getAlgorithm(edhoc.selectedSuite);
package/dist/edhoc.d.ts CHANGED
@@ -360,6 +360,13 @@ export declare class EDHOC {
360
360
  * @return A promise that resolves to the exported key.
361
361
  */
362
362
  exportKey(exporterLabel: number, length: number): Promise<Buffer> | never;
363
+ /**
364
+ * Exports the peer credentials used during the EDHOC exchange.
365
+ * This returns the (post-verify) credentials object returned by your credential manager's `verify(...)`.
366
+ *
367
+ * Returns `null` if the peer credentials haven't been verified yet, or after `reset()`.
368
+ */
369
+ exportUsedPeerCredentials(): EdhocCredentials | null;
363
370
  /**
364
371
  * Key update for the new OSCORE security session
365
372
  * Read Appendix H of RFC 9528 - https://www.rfc-editor.org/rfc/rfc9528.html#appendix-H
@@ -1 +1 @@
1
- {"version":3,"file":"edhoc.d.ts","sourceRoot":"","sources":["../lib/edhoc.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"edhoc.d.ts","sourceRoot":"","sources":["../lib/edhoc.ts"],"names":[],"mappings":"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"}
package/include/Binding.h CHANGED
@@ -282,6 +282,17 @@ class Edhoc : public Napi::ObjectWrap<Edhoc> {
282
282
  */
283
283
  Napi::Value ExportKey(const Napi::CallbackInfo& info);
284
284
 
285
+ /**
286
+ * @brief Exports the peer credentials used during the EDHOC exchange.
287
+ *
288
+ * Returns the last credentials object returned from the user-provided
289
+ * credential manager's verify() function. This is a synchronous call.
290
+ *
291
+ * @param info The Napi::CallbackInfo representing the callback information.
292
+ * @return Napi::Value The peer credentials object or Null if not available.
293
+ */
294
+ Napi::Value ExportUsedPeerCredentials(const Napi::CallbackInfo& info);
295
+
285
296
  /**
286
297
  * @brief Performs a key update.
287
298
  *
@@ -34,6 +34,22 @@ class EdhocCredentialManager {
34
34
  */
35
35
  ~EdhocCredentialManager();
36
36
 
37
+ /**
38
+ * @brief Clears any cached credential objects from the previous EDHOC run.
39
+ *
40
+ * This is intended to be called from EDHOC::reset() to avoid leaking
41
+ * credential references across sessions and to ensure exported values
42
+ * reflect only the current session.
43
+ */
44
+ void ClearCachedCredentials();
45
+
46
+ /**
47
+ * @brief Returns the last peer credentials object returned from JS verify().
48
+ *
49
+ * @return Napi::Value The cached credentials object, or null if not available.
50
+ */
51
+ Napi::Value GetCachedPeerCredentials(Napi::Env env);
52
+
37
53
  /**
38
54
  * @brief Static function to fetch the credentials.
39
55
  * @param user_context The user context.
@@ -84,6 +100,7 @@ class EdhocCredentialManager {
84
100
  std::vector<Napi::Reference<Napi::Object>> credentialReferences_; ///< References to the JS objects
85
101
  Napi::ObjectReference credentialManagerRef_; ///< Reference to the JS object
86
102
  Napi::ObjectReference edhocRef_;
103
+ Napi::ObjectReference cachedPeerCredentialsRef_; ///< Cached peer credential (post-verify)
87
104
  };
88
105
 
89
106
  #endif // EDHOC_CREDENTIAL_MANAGER_H
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "edhoc",
3
3
  "description": "A Node.js implementation of EDHOC (Ephemeral Diffie-Hellman Over COSE) protocol for lightweight authenticated key exchange in IoT and other constrained environments.",
4
- "version": "1.3.2",
4
+ "version": "1.4.0",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
7
7
  "author": "Marek Serafin <marek@serafin.email>",
Binary file
Binary file
Binary file
Binary file
Binary file
package/src/Binding.cpp CHANGED
@@ -53,6 +53,11 @@ void Edhoc::Reset(const Napi::CallbackInfo& info) {
53
53
  Napi::Env env = info.Env();
54
54
  Napi::HandleScope scope(env);
55
55
 
56
+ // Clear cached session state from previous run
57
+ if (this->credentialManager_ != nullptr) {
58
+ this->credentialManager_->ClearCachedCredentials();
59
+ }
60
+
56
61
  bool isInitialized = edhocContext_ != nullptr;
57
62
 
58
63
  // Get the Connection ID, Methods, and Suites
@@ -373,6 +378,12 @@ Napi::Value Edhoc::ExportKey(const Napi::CallbackInfo& info) {
373
378
  return this->runningContext_->GetPromise();
374
379
  }
375
380
 
381
+ Napi::Value Edhoc::ExportUsedPeerCredentials(const Napi::CallbackInfo& info) {
382
+ Napi::Env env = info.Env();
383
+ Napi::HandleScope scope(env);
384
+ return this->credentialManager_->GetCachedPeerCredentials(env);
385
+ }
386
+
376
387
  Napi::Value Edhoc::KeyUpdate(const Napi::CallbackInfo& info) {
377
388
  Napi::Env env = info.Env();
378
389
  Napi::HandleScope scope(env);
@@ -420,6 +431,7 @@ Napi::Object Edhoc::Init(Napi::Env env, Napi::Object exports) {
420
431
  InstanceMethod("processMessage4", &Edhoc::ProcessMessage4),
421
432
  InstanceMethod("exportOSCORE", &Edhoc::ExportOSCORE),
422
433
  InstanceMethod("exportKey", &Edhoc::ExportKey),
434
+ InstanceMethod("exportUsedPeerCredentials", &Edhoc::ExportUsedPeerCredentials),
423
435
  InstanceMethod("keyUpdate", &Edhoc::KeyUpdate),
424
436
  });
425
437
 
@@ -27,6 +27,89 @@ static constexpr const char* kInvalidInputDataErrorX509Chain = "Invalid input da
27
27
  static constexpr const char* kInvalidInputDataErrorX509Hash = "Invalid input data for X.509 hash";
28
28
  static constexpr const char* kErrorObjectExpected = "Object expected";
29
29
 
30
+ static Napi::Value copy_if_buffer(Napi::Env env, const Napi::Value& value) {
31
+ if (value.IsBuffer()) {
32
+ auto buf = value.As<Napi::Buffer<uint8_t>>();
33
+ return Napi::Buffer<uint8_t>::Copy(env, buf.Data(), buf.Length());
34
+ }
35
+ return value;
36
+ }
37
+
38
+ static Napi::Object clone_credentials_object(Napi::Env env, const Napi::Object& credsObj) {
39
+ if (!credsObj.Has(kFormat)) {
40
+ throw std::runtime_error(kInvalidInputCredentialTypeError);
41
+ }
42
+
43
+ Napi::Object out = Napi::Object::New(env);
44
+ out.Set(kFormat, credsObj.Get(kFormat));
45
+
46
+ // Optional fields that can appear on credentials object
47
+ if (credsObj.Has(kPrivateKeyId) && !credsObj.Get(kPrivateKeyId).IsNull() && !credsObj.Get(kPrivateKeyId).IsUndefined()) {
48
+ out.Set(kPrivateKeyId, copy_if_buffer(env, credsObj.Get(kPrivateKeyId)));
49
+ }
50
+ if (credsObj.Has(kPublicKey) && !credsObj.Get(kPublicKey).IsNull() && !credsObj.Get(kPublicKey).IsUndefined()) {
51
+ out.Set(kPublicKey, copy_if_buffer(env, credsObj.Get(kPublicKey)));
52
+ }
53
+
54
+ const int label = credsObj.Get(kFormat).As<Napi::Number>().Int32Value();
55
+ switch (label) {
56
+ case EDHOC_COSE_HEADER_KID: {
57
+ Napi::Object kidObj = credsObj.Get(kKid).As<Napi::Object>();
58
+ Napi::Object newKidObj = Napi::Object::New(env);
59
+
60
+ if (kidObj.Has(kIsCBOR)) {
61
+ newKidObj.Set(kIsCBOR, kidObj.Get(kIsCBOR));
62
+ }
63
+ if (kidObj.Has(kKid)) {
64
+ newKidObj.Set(kKid, copy_if_buffer(env, kidObj.Get(kKid)));
65
+ }
66
+ if (kidObj.Has(kCredentials)) {
67
+ newKidObj.Set(kCredentials, copy_if_buffer(env, kidObj.Get(kCredentials)));
68
+ }
69
+
70
+ out.Set(kKid, newKidObj);
71
+ break;
72
+ }
73
+ case EDHOC_COSE_HEADER_X509_CHAIN: {
74
+ Napi::Object x5chainObj = credsObj.Get(kX5chain).As<Napi::Object>();
75
+ Napi::Object newX5chainObj = Napi::Object::New(env);
76
+
77
+ if (x5chainObj.Has(kCertificates)) {
78
+ Napi::Array certArray = x5chainObj.Get(kCertificates).As<Napi::Array>();
79
+ Napi::Array newCertArray = Napi::Array::New(env, certArray.Length());
80
+ for (uint32_t i = 0; i < certArray.Length(); ++i) {
81
+ newCertArray.Set(i, copy_if_buffer(env, certArray.Get(i)));
82
+ }
83
+ newX5chainObj.Set(kCertificates, newCertArray);
84
+ }
85
+
86
+ out.Set(kX5chain, newX5chainObj);
87
+ break;
88
+ }
89
+ case EDHOC_COSE_HEADER_X509_HASH: {
90
+ Napi::Object x5tObj = credsObj.Get(kX5t).As<Napi::Object>();
91
+ Napi::Object newX5tObj = Napi::Object::New(env);
92
+
93
+ if (x5tObj.Has(kCertificate) && !x5tObj.Get(kCertificate).IsUndefined() && !x5tObj.Get(kCertificate).IsNull()) {
94
+ newX5tObj.Set(kCertificate, copy_if_buffer(env, x5tObj.Get(kCertificate)));
95
+ }
96
+ if (x5tObj.Has(kHash)) {
97
+ newX5tObj.Set(kHash, copy_if_buffer(env, x5tObj.Get(kHash)));
98
+ }
99
+ if (x5tObj.Has(kHashAlgorithm)) {
100
+ newX5tObj.Set(kHashAlgorithm, x5tObj.Get(kHashAlgorithm));
101
+ }
102
+
103
+ out.Set(kX5t, newX5tObj);
104
+ break;
105
+ }
106
+ default:
107
+ throw std::runtime_error(kUnsupportedCredentialTypeError);
108
+ }
109
+
110
+ return out;
111
+ }
112
+
30
113
  /*
31
114
  * Convert a JavaScript object to an edhoc_auth_cred_key_id
32
115
  */
@@ -172,12 +255,28 @@ EdhocCredentialManager::EdhocCredentialManager(Napi::Object& jsCredentialManager
172
255
  EdhocCredentialManager::~EdhocCredentialManager() {
173
256
  credentialManagerRef_.Reset();
174
257
  edhocRef_.Reset();
258
+ cachedPeerCredentialsRef_.Reset();
259
+ for (auto& ref : credentialReferences_) {
260
+ ref.Reset();
261
+ }
262
+ credentialReferences_.clear();
263
+ }
264
+
265
+ void EdhocCredentialManager::ClearCachedCredentials() {
266
+ cachedPeerCredentialsRef_.Reset();
175
267
  for (auto& ref : credentialReferences_) {
176
268
  ref.Reset();
177
269
  }
178
270
  credentialReferences_.clear();
179
271
  }
180
272
 
273
+ Napi::Value EdhocCredentialManager::GetCachedPeerCredentials(Napi::Env env) {
274
+ if (cachedPeerCredentialsRef_.IsEmpty()) {
275
+ return env.Null();
276
+ }
277
+ return cachedPeerCredentialsRef_.Value();
278
+ }
279
+
181
280
  /*
182
281
  * Static method to fetch credentials
183
282
  */
@@ -256,13 +355,21 @@ int EdhocCredentialManager::callVerifyCredentials(RunningContext* runningContext
256
355
 
257
356
  auto successHandler = [this, &credentials, &public_key_reference, &public_key_length](Napi::Env env, Napi::Value result) {
258
357
  Napi::HandleScope scope(env);
259
- Napi::Object credsObj = result.As<Napi::Object>();
260
- credentialReferences_.push_back(Napi::Persistent(credsObj));
358
+ // Clear cached peer credentials for this attempt. If verification fails below,
359
+ // exportUsedPeerCredentials() should not return stale/invalid data.
360
+ cachedPeerCredentialsRef_.Reset();
361
+
362
+ if (result.IsObject() == false) {
363
+ throw std::runtime_error(kInvalidInputCredentialTypeError);
364
+ }
261
365
 
262
- if (credsObj.IsObject() == false) {
366
+ Napi::Object credsObj = result.As<Napi::Object>();
367
+ if (credsObj.Has(kFormat) == false) {
263
368
  throw std::runtime_error(kInvalidInputCredentialTypeError);
264
369
  }
265
370
 
371
+ credentialReferences_.push_back(Napi::Persistent(credsObj));
372
+
266
373
  int label = credsObj.Get(kFormat).As<Napi::Number>().Int32Value();
267
374
  switch (label) {
268
375
  case EDHOC_COSE_HEADER_KID:
@@ -284,6 +391,10 @@ int EdhocCredentialManager::callVerifyCredentials(RunningContext* runningContext
284
391
  *public_key_length = publicKeyBuffer.Length();
285
392
  }
286
393
 
394
+ // Cache a deep copy of the validated peer credentials object for later export.
395
+ // (Deep copy prevents user-side mutations from affecting the cached value.)
396
+ cachedPeerCredentialsRef_ = Napi::Persistent(clone_credentials_object(env, credsObj));
397
+
287
398
  return EDHOC_SUCCESS;
288
399
  };
289
400
 
@@ -85,6 +85,15 @@ describe('EDHOC Handshake', () => {
85
85
  const initiatorKey = await initiator.exportKey(40001, 32);
86
86
  const responderKey = await responder.exportKey(40001, 32);
87
87
  expect(initiatorKey).toEqual(responderKey);
88
+
89
+ // Peer credentials should be available after peer verification
90
+ const initiatorPeerCreds = initiator.exportUsedPeerCredentials();
91
+ expect(initiatorPeerCreds).not.toBeNull();
92
+ expect((initiatorPeerCreds as { publicKey: Buffer }).publicKey).toBeInstanceOf(Buffer);
93
+
94
+ // reset() should clear cached peer credentials
95
+ initiator.reset();
96
+ expect(initiator.exportUsedPeerCredentials()).toBeNull();
88
97
  });
89
98
 
90
99
  test('should fail to generate message 1 twice', async () => {