@derec-alliance/react-native 0.0.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 (65) hide show
  1. package/DeRec.podspec +25 -0
  2. package/LICENSE +201 -0
  3. package/README.md +222 -0
  4. package/android/CMakeLists.txt +38 -0
  5. package/android/build.gradle +79 -0
  6. package/android/src/main/AndroidManifest.xml +12 -0
  7. package/android/src/main/java/org/derec/DeRecModule.kt +56 -0
  8. package/android/src/main/java/org/derec/DeRecPackage.kt +24 -0
  9. package/android/src/main/jni/OnLoad.cpp +39 -0
  10. package/android/src/main/jniLibs/arm64-v8a/libderec_library.a +0 -0
  11. package/android/src/main/jniLibs/armeabi-v7a/libderec_library.a +0 -0
  12. package/android/src/main/jniLibs/x86_64/libderec_library.a +0 -0
  13. package/cpp/Convert.cpp +50 -0
  14. package/cpp/Convert.h +38 -0
  15. package/cpp/DeRecInstaller.cpp +186 -0
  16. package/cpp/DeRecInstaller.h +28 -0
  17. package/cpp/Invoker.h +20 -0
  18. package/cpp/JsCallbackBridge.cpp +144 -0
  19. package/cpp/JsCallbackBridge.h +148 -0
  20. package/cpp/Primitives.cpp +1193 -0
  21. package/cpp/Primitives.h +39 -0
  22. package/cpp/ProtocolHost.cpp +613 -0
  23. package/cpp/ProtocolHost.h +88 -0
  24. package/cpp/RuntimeInvoker.h +29 -0
  25. package/cpp/StoreCallbacks.cpp +1293 -0
  26. package/cpp/StoreCallbacks.h +111 -0
  27. package/cpp/WorkerThread.cpp +74 -0
  28. package/cpp/WorkerThread.h +54 -0
  29. package/cpp/derec_ffi.h +2145 -0
  30. package/ios/DeRec.h +23 -0
  31. package/ios/DeRec.mm +39 -0
  32. package/ios/DeRecFFI.xcframework/Info.plist +48 -0
  33. package/ios/DeRecFFI.xcframework/ios-arm64/Headers/derec_ffi.h +2145 -0
  34. package/ios/DeRecFFI.xcframework/ios-arm64/libderec_library.a +0 -0
  35. package/ios/DeRecFFI.xcframework/ios-arm64_x86_64-simulator/Headers/derec_ffi.h +2145 -0
  36. package/ios/DeRecFFI.xcframework/ios-arm64_x86_64-simulator/libderec_library.a +0 -0
  37. package/lib/binary.d.ts +19 -0
  38. package/lib/binary.js +164 -0
  39. package/lib/codec.d.ts +16 -0
  40. package/lib/codec.js +80 -0
  41. package/lib/errors.d.ts +23 -0
  42. package/lib/errors.js +35 -0
  43. package/lib/index.d.ts +4 -0
  44. package/lib/index.js +27 -0
  45. package/lib/messages.d.ts +41 -0
  46. package/lib/messages.js +192 -0
  47. package/lib/native.d.ts +11 -0
  48. package/lib/native.js +40 -0
  49. package/lib/primitives.d.ts +137 -0
  50. package/lib/primitives.js +329 -0
  51. package/lib/protocol.d.ts +188 -0
  52. package/lib/protocol.js +514 -0
  53. package/lib/types.d.ts +1014 -0
  54. package/lib/types.js +63 -0
  55. package/package.json +55 -0
  56. package/react-native.config.js +19 -0
  57. package/src/binary.ts +182 -0
  58. package/src/codec.ts +79 -0
  59. package/src/errors.ts +45 -0
  60. package/src/index.ts +7 -0
  61. package/src/messages.ts +192 -0
  62. package/src/native.ts +52 -0
  63. package/src/primitives.ts +770 -0
  64. package/src/protocol.ts +621 -0
  65. package/src/types.ts +1040 -0
@@ -0,0 +1,1193 @@
1
+ // SPDX-License-Identifier: Apache-2.0
2
+ // Copyright (c) 2026 DeRec Alliance. All rights reserved.
3
+
4
+ #include "Primitives.h"
5
+
6
+ #include <cstring>
7
+ #include <string>
8
+ #include <vector>
9
+
10
+ #include "Convert.h"
11
+
12
+ using namespace facebook;
13
+
14
+ namespace derec {
15
+
16
+ void throwDeRecError(jsi::Runtime& rt, const DeRecError& error) {
17
+ auto names = errorName(error.category, error.code);
18
+ // `message` and `peer_memo` are Rust-owned strings; copy before releasing.
19
+ std::string message =
20
+ error.message == nullptr ? std::string() : std::string(error.message);
21
+ std::string memo =
22
+ error.peer_memo == nullptr ? std::string() : std::string(error.peer_memo);
23
+ int32_t peerStatus = error.peer_status;
24
+ uint32_t expected = error.expected;
25
+ uint32_t got = error.got;
26
+
27
+ // Release both owned strings in one call, matching the ABI contract.
28
+ DeRecError owned = error;
29
+ derec_free_error(&owned);
30
+
31
+ auto payload = jsi::Object(rt);
32
+ payload.setProperty(rt, "category", jsi::String::createFromUtf8(rt, names.first));
33
+ payload.setProperty(rt, "code", jsi::String::createFromUtf8(rt, names.second));
34
+ payload.setProperty(rt, "message", jsi::String::createFromUtf8(rt, message));
35
+ if (peerStatus != 0) {
36
+ payload.setProperty(rt, "status", jsi::Value(static_cast<int>(peerStatus)));
37
+ }
38
+ if (!memo.empty()) {
39
+ payload.setProperty(rt, "memo", jsi::String::createFromUtf8(rt, memo));
40
+ }
41
+ if (expected != 0 || got != 0) {
42
+ payload.setProperty(rt, "expected", jsi::Value(static_cast<int>(expected)));
43
+ payload.setProperty(rt, "got", jsi::Value(static_cast<int>(got)));
44
+ }
45
+ throw jsi::JSError(rt, jsi::Value(rt, payload));
46
+ }
47
+
48
+ ByteView asBytes(jsi::Runtime& rt, const jsi::Value& value) {
49
+ if (value.isNull() || value.isUndefined()) {
50
+ return ByteView{nullptr, 0};
51
+ }
52
+ auto object = value.asObject(rt);
53
+ if (object.isArrayBuffer(rt)) {
54
+ auto buffer = object.getArrayBuffer(rt);
55
+ return ByteView{buffer.data(rt), buffer.size(rt)};
56
+ }
57
+ // Typed arrays expose their backing store via `buffer` plus offsets.
58
+ auto backing = object.getProperty(rt, "buffer").asObject(rt).getArrayBuffer(rt);
59
+ auto offset =
60
+ static_cast<size_t>(object.getProperty(rt, "byteOffset").asNumber());
61
+ auto length =
62
+ static_cast<size_t>(object.getProperty(rt, "byteLength").asNumber());
63
+ return ByteView{backing.data(rt) + offset, length};
64
+ }
65
+
66
+ jsi::Value toArrayBuffer(jsi::Runtime& rt, const uint8_t* bytes, size_t len) {
67
+ auto constructor = rt.global().getPropertyAsFunction(rt, "ArrayBuffer");
68
+ auto result = constructor.callAsConstructor(rt, jsi::Value(static_cast<double>(len)))
69
+ .asObject(rt)
70
+ .getArrayBuffer(rt);
71
+ if (len > 0 && bytes != nullptr) {
72
+ std::memcpy(result.data(rt), bytes, len);
73
+ }
74
+ return jsi::Value(rt, result);
75
+ }
76
+
77
+ uint64_t asU64(jsi::Runtime& rt, const jsi::Value& value) {
78
+ if (value.isBigInt()) {
79
+ return value.asBigInt(rt).asUint64(rt);
80
+ }
81
+ return static_cast<uint64_t>(value.asNumber());
82
+ }
83
+
84
+ namespace {
85
+
86
+ /// Read a JS array of `bigint`/`number` elements as a `uint64_t` vector.
87
+ /// Used for `protect_secret`'s `channels` argument.
88
+ std::vector<uint64_t> asU64Array(jsi::Runtime& rt, const jsi::Value& value) {
89
+ std::vector<uint64_t> out;
90
+ if (value.isNull() || value.isUndefined()) {
91
+ return out;
92
+ }
93
+ auto array = value.asObject(rt).asArray(rt);
94
+ size_t length = array.size(rt);
95
+ out.reserve(length);
96
+ for (size_t i = 0; i < length; ++i) {
97
+ out.push_back(asU64(rt, array.getValueAtIndex(rt, i)));
98
+ }
99
+ return out;
100
+ }
101
+
102
+ /// Read a JS array of `number` elements as a `uint32_t` vector. Used for
103
+ /// `produce_store_share_request_message`'s `keep_list` argument.
104
+ std::vector<uint32_t> asU32Array(jsi::Runtime& rt, const jsi::Value& value) {
105
+ std::vector<uint32_t> out;
106
+ if (value.isNull() || value.isUndefined()) {
107
+ return out;
108
+ }
109
+ auto array = value.asObject(rt).asArray(rt);
110
+ size_t length = array.size(rt);
111
+ out.reserve(length);
112
+ for (size_t i = 0; i < length; ++i) {
113
+ out.push_back(static_cast<uint32_t>(array.getValueAtIndex(rt, i).asNumber()));
114
+ }
115
+ return out;
116
+ }
117
+
118
+ void requireArgs(jsi::Runtime& rt, const char* name, size_t count, size_t required) {
119
+ if (count < required) {
120
+ throw jsi::JSError(rt, std::string(name) + " expects " +
121
+ std::to_string(required) + " arguments");
122
+ }
123
+ }
124
+
125
+ /// `produce_get_secret_ids_versions_request_message(channelId: bigint,
126
+ /// sharedKey: ArrayBuffer, replyTo: ArrayBuffer|null) -> ArrayBuffer`
127
+ jsi::Value produceGetSecretIdsVersionsRequestMessage(jsi::Runtime& rt,
128
+ const jsi::Value&,
129
+ const jsi::Value* args,
130
+ size_t count) {
131
+ requireArgs(rt, "produce_get_secret_ids_versions_request_message", count, 3);
132
+ uint64_t channelId = asU64(rt, args[0]);
133
+ ByteView sharedKey = asBytes(rt, args[1]);
134
+ ByteView replyTo = asBytes(rt, args[2]);
135
+ ProduceGetSecretIdsVersionsRequestMessageResult result =
136
+ produce_get_secret_ids_versions_request_message(
137
+ channelId, sharedKey.ptr, sharedKey.len, replyTo.ptr, replyTo.len);
138
+ if (result.error.code != 0) {
139
+ throwDeRecError(rt, result.error);
140
+ }
141
+ std::vector<uint8_t> bytes = takeBuffer(result.envelope_wire_bytes);
142
+ return toArrayBuffer(rt, bytes.data(), bytes.size());
143
+ }
144
+
145
+ /// `extract_get_secret_ids_versions_request(request: ArrayBuffer,
146
+ /// sharedKey: ArrayBuffer) -> { channel_id, request_proto_bytes }`
147
+ jsi::Value extractGetSecretIdsVersionsRequest(jsi::Runtime& rt,
148
+ const jsi::Value&,
149
+ const jsi::Value* args,
150
+ size_t count) {
151
+ requireArgs(rt, "extract_get_secret_ids_versions_request", count, 2);
152
+ ByteView request = asBytes(rt, args[0]);
153
+ ByteView sharedKey = asBytes(rt, args[1]);
154
+ ExtractGetSecretIdsVersionsRequestResult result =
155
+ extract_get_secret_ids_versions_request(request.ptr, request.len,
156
+ sharedKey.ptr, sharedKey.len);
157
+ if (result.error.code != 0) {
158
+ throwDeRecError(rt, result.error);
159
+ }
160
+ std::vector<uint8_t> bytes = takeBuffer(result.request_proto_bytes);
161
+ auto payload = jsi::Object(rt);
162
+ payload.setProperty(rt, "channel_id",
163
+ jsi::Value(rt, jsi::BigInt::fromUint64(rt, result.channel_id)));
164
+ payload.setProperty(rt, "request_proto_bytes",
165
+ toArrayBuffer(rt, bytes.data(), bytes.size()));
166
+ return jsi::Value(rt, payload);
167
+ }
168
+
169
+ /// `produce_get_secret_ids_versions_response_message(channelId: bigint,
170
+ /// secretList: ArrayBuffer, sharedKey: ArrayBuffer) -> ArrayBuffer`
171
+ jsi::Value produceGetSecretIdsVersionsResponseMessage(jsi::Runtime& rt,
172
+ const jsi::Value&,
173
+ const jsi::Value* args,
174
+ size_t count) {
175
+ requireArgs(rt, "produce_get_secret_ids_versions_response_message", count, 3);
176
+ uint64_t channelId = asU64(rt, args[0]);
177
+ ByteView secretList = asBytes(rt, args[1]);
178
+ ByteView sharedKey = asBytes(rt, args[2]);
179
+ ProduceGetSecretIdsVersionsResponseMessageResult result =
180
+ produce_get_secret_ids_versions_response_message(
181
+ channelId, secretList.ptr, secretList.len, sharedKey.ptr, sharedKey.len);
182
+ if (result.error.code != 0) {
183
+ throwDeRecError(rt, result.error);
184
+ }
185
+ std::vector<uint8_t> bytes = takeBuffer(result.envelope_wire_bytes);
186
+ return toArrayBuffer(rt, bytes.data(), bytes.size());
187
+ }
188
+
189
+ /// `extract_get_secret_ids_versions_response(response: ArrayBuffer,
190
+ /// sharedKey: ArrayBuffer) -> { channel_id, response_proto_bytes }`
191
+ jsi::Value extractGetSecretIdsVersionsResponse(jsi::Runtime& rt,
192
+ const jsi::Value&,
193
+ const jsi::Value* args,
194
+ size_t count) {
195
+ requireArgs(rt, "extract_get_secret_ids_versions_response", count, 2);
196
+ ByteView response = asBytes(rt, args[0]);
197
+ ByteView sharedKey = asBytes(rt, args[1]);
198
+ ExtractGetSecretIdsVersionsResponseResult result =
199
+ extract_get_secret_ids_versions_response(response.ptr, response.len,
200
+ sharedKey.ptr, sharedKey.len);
201
+ if (result.error.code != 0) {
202
+ throwDeRecError(rt, result.error);
203
+ }
204
+ std::vector<uint8_t> bytes = takeBuffer(result.response_proto_bytes);
205
+ auto payload = jsi::Object(rt);
206
+ payload.setProperty(rt, "channel_id",
207
+ jsi::Value(rt, jsi::BigInt::fromUint64(rt, result.channel_id)));
208
+ payload.setProperty(rt, "response_proto_bytes",
209
+ toArrayBuffer(rt, bytes.data(), bytes.size()));
210
+ return jsi::Value(rt, payload);
211
+ }
212
+
213
+ /// `process_get_secret_ids_versions_response_message(responseProto:
214
+ /// ArrayBuffer) -> ArrayBuffer`
215
+ jsi::Value processGetSecretIdsVersionsResponseMessage(jsi::Runtime& rt,
216
+ const jsi::Value&,
217
+ const jsi::Value* args,
218
+ size_t count) {
219
+ requireArgs(rt, "process_get_secret_ids_versions_response_message", count, 1);
220
+ ByteView responseProto = asBytes(rt, args[0]);
221
+ ProcessGetSecretIdsVersionsResponseMessageResult result =
222
+ process_get_secret_ids_versions_response_message(responseProto.ptr,
223
+ responseProto.len);
224
+ if (result.error.code != 0) {
225
+ throwDeRecError(rt, result.error);
226
+ }
227
+ std::vector<uint8_t> bytes = takeBuffer(result.secret_list_bytes);
228
+ return toArrayBuffer(rt, bytes.data(), bytes.size());
229
+ }
230
+
231
+ /// `apply_trace_id_to_envelope(envelope: ArrayBuffer, traceId: bigint)
232
+ /// -> ArrayBuffer`
233
+ jsi::Value applyTraceId(jsi::Runtime& rt,
234
+ const jsi::Value&,
235
+ const jsi::Value* args,
236
+ size_t count) {
237
+ requireArgs(rt, "apply_trace_id_to_envelope", count, 2);
238
+ ByteView envelope = asBytes(rt, args[0]);
239
+ uint64_t traceId = asU64(rt, args[1]);
240
+
241
+ ApplyTraceIdResult result =
242
+ apply_trace_id_to_envelope(envelope.ptr, envelope.len, traceId);
243
+ if (result.error.code != 0) {
244
+ throwDeRecError(rt, result.error);
245
+ }
246
+ std::vector<uint8_t> bytes = takeBuffer(result.wire_bytes);
247
+ return toArrayBuffer(rt, bytes.data(), bytes.size());
248
+ }
249
+
250
+ /// `read_trace_id_from_envelope(envelope: ArrayBuffer) -> bigint`
251
+ jsi::Value readTraceId(jsi::Runtime& rt,
252
+ const jsi::Value&,
253
+ const jsi::Value* args,
254
+ size_t count) {
255
+ requireArgs(rt, "read_trace_id_from_envelope", count, 1);
256
+ ByteView envelope = asBytes(rt, args[0]);
257
+ ReadTraceIdResult result =
258
+ read_trace_id_from_envelope(envelope.ptr, envelope.len);
259
+ if (result.error.code != 0) {
260
+ throwDeRecError(rt, result.error);
261
+ }
262
+ return jsi::Value(rt, jsi::BigInt::fromUint64(rt, result.trace_id));
263
+ }
264
+
265
+ /// `create_contact_message(channelId: bigint, contactMode: number,
266
+ /// transportProtocol: ArrayBuffer, hasNonce: number, nonce: bigint)
267
+ /// -> { contact_wire_bytes, secret_key_material }`
268
+ jsi::Value createContactMessage(jsi::Runtime& rt,
269
+ const jsi::Value&,
270
+ const jsi::Value* args,
271
+ size_t count) {
272
+ requireArgs(rt, "create_contact_message", count, 5);
273
+ uint64_t channelId = asU64(rt, args[0]);
274
+ auto contactMode = static_cast<int32_t>(args[1].asNumber());
275
+ ByteView transportProtocol = asBytes(rt, args[2]);
276
+ auto hasNonce = static_cast<uint32_t>(args[3].asNumber());
277
+ uint64_t nonce = asU64(rt, args[4]);
278
+ CreateContactMessageResult result = create_contact_message(
279
+ channelId, contactMode, transportProtocol.ptr, transportProtocol.len,
280
+ hasNonce, nonce);
281
+ if (result.error.code != 0) {
282
+ throwDeRecError(rt, result.error);
283
+ }
284
+ std::vector<uint8_t> contactBytes = takeBuffer(result.contact_wire_bytes);
285
+ std::vector<uint8_t> keyMaterial = takeBuffer(result.secret_key_material);
286
+ auto payload = jsi::Object(rt);
287
+ payload.setProperty(rt, "contact_wire_bytes",
288
+ toArrayBuffer(rt, contactBytes.data(), contactBytes.size()));
289
+ payload.setProperty(rt, "secret_key_material",
290
+ toArrayBuffer(rt, keyMaterial.data(), keyMaterial.size()));
291
+ return jsi::Value(rt, payload);
292
+ }
293
+
294
+ /// `validate_contact_message(contactMessage: ArrayBuffer) -> undefined`
295
+ jsi::Value validateContactMessage(jsi::Runtime& rt,
296
+ const jsi::Value&,
297
+ const jsi::Value* args,
298
+ size_t count) {
299
+ requireArgs(rt, "validate_contact_message", count, 1);
300
+ ByteView contactMessage = asBytes(rt, args[0]);
301
+ DeRecError error =
302
+ validate_contact_message(contactMessage.ptr, contactMessage.len);
303
+ if (error.code != 0) {
304
+ throwDeRecError(rt, error);
305
+ }
306
+ return jsi::Value::undefined();
307
+ }
308
+
309
+ /// `encode_contact_message(contactJson: ArrayBuffer) -> ArrayBuffer`
310
+ jsi::Value encodeContactMessage(jsi::Runtime& rt,
311
+ const jsi::Value&,
312
+ const jsi::Value* args,
313
+ size_t count) {
314
+ requireArgs(rt, "encode_contact_message", count, 1);
315
+ ByteView contactJson = asBytes(rt, args[0]);
316
+ EncodeContactMessageResult result =
317
+ encode_contact_message(contactJson.ptr, contactJson.len);
318
+ if (result.error.code != 0) {
319
+ throwDeRecError(rt, result.error);
320
+ }
321
+ std::vector<uint8_t> bytes = takeBuffer(result.wire_bytes);
322
+ return toArrayBuffer(rt, bytes.data(), bytes.size());
323
+ }
324
+
325
+ /// `decode_contact_message(contactWireBytes: ArrayBuffer) -> ArrayBuffer`
326
+ jsi::Value decodeContactMessage(jsi::Runtime& rt,
327
+ const jsi::Value&,
328
+ const jsi::Value* args,
329
+ size_t count) {
330
+ requireArgs(rt, "decode_contact_message", count, 1);
331
+ ByteView contactWire = asBytes(rt, args[0]);
332
+ DecodeContactMessageResult result =
333
+ decode_contact_message(contactWire.ptr, contactWire.len);
334
+ if (result.error.code != 0) {
335
+ throwDeRecError(rt, result.error);
336
+ }
337
+ std::vector<uint8_t> bytes = takeBuffer(result.contact_json);
338
+ return toArrayBuffer(rt, bytes.data(), bytes.size());
339
+ }
340
+
341
+ /// `decode_message_json(kind: number, protoBytes: ArrayBuffer) -> ArrayBuffer`
342
+ ///
343
+ /// Turns the opaque `*_proto_bytes` an `extract_*` call returns into the JSON
344
+ /// mirror of the message. `kind` is a `DEREC_MESSAGE_KIND_*` value; the
345
+ /// binding forwards it as an opaque scalar and never interprets it.
346
+ jsi::Value decodeMessageJson(jsi::Runtime& rt,
347
+ const jsi::Value&,
348
+ const jsi::Value* args,
349
+ size_t count) {
350
+ requireArgs(rt, "decode_message_json", count, 2);
351
+ auto kind = static_cast<int32_t>(args[0].asNumber());
352
+ ByteView proto = asBytes(rt, args[1]);
353
+ DeRecMessageJsonResult result =
354
+ derec_decode_message_json(kind, proto.ptr, proto.len);
355
+ if (result.error.code != 0) {
356
+ throwDeRecError(rt, result.error);
357
+ }
358
+ std::vector<uint8_t> bytes = takeBuffer(result.bytes);
359
+ return toArrayBuffer(rt, bytes.data(), bytes.size());
360
+ }
361
+
362
+ /// `encode_message_json(kind: number, json: ArrayBuffer) -> ArrayBuffer`
363
+ ///
364
+ /// Inverse of `decode_message_json`, producing the protobuf bytes a
365
+ /// `produce_*` or `process_*` call expects.
366
+ jsi::Value encodeMessageJson(jsi::Runtime& rt,
367
+ const jsi::Value&,
368
+ const jsi::Value* args,
369
+ size_t count) {
370
+ requireArgs(rt, "encode_message_json", count, 2);
371
+ auto kind = static_cast<int32_t>(args[0].asNumber());
372
+ ByteView json = asBytes(rt, args[1]);
373
+ DeRecMessageJsonResult result =
374
+ derec_encode_message_json(kind, json.ptr, json.len);
375
+ if (result.error.code != 0) {
376
+ throwDeRecError(rt, result.error);
377
+ }
378
+ std::vector<uint8_t> bytes = takeBuffer(result.bytes);
379
+ return toArrayBuffer(rt, bytes.data(), bytes.size());
380
+ }
381
+
382
+ /// `produce_pair_request_message(senderKind: number, transportProtocol:
383
+ /// ArrayBuffer, contactMessage: ArrayBuffer, communicationInfo:
384
+ /// ArrayBuffer|null, parameterRange: ArrayBuffer|null) ->
385
+ /// { request_wire_bytes, initiator_contact_message_wire_bytes,
386
+ /// secret_key_material }`
387
+ jsi::Value producePairRequestMessage(jsi::Runtime& rt,
388
+ const jsi::Value&,
389
+ const jsi::Value* args,
390
+ size_t count) {
391
+ requireArgs(rt, "produce_pair_request_message", count, 5);
392
+ auto senderKind = static_cast<int32_t>(args[0].asNumber());
393
+ ByteView transportProtocol = asBytes(rt, args[1]);
394
+ ByteView contactMessage = asBytes(rt, args[2]);
395
+ ByteView communicationInfo = asBytes(rt, args[3]);
396
+ ByteView parameterRange = asBytes(rt, args[4]);
397
+ ProducePairRequestMessageResult result = produce_pair_request_message(
398
+ senderKind, transportProtocol.ptr, transportProtocol.len,
399
+ contactMessage.ptr, contactMessage.len, communicationInfo.ptr,
400
+ communicationInfo.len, parameterRange.ptr, parameterRange.len);
401
+ if (result.error.code != 0) {
402
+ throwDeRecError(rt, result.error);
403
+ }
404
+ std::vector<uint8_t> requestBytes = takeBuffer(result.request_wire_bytes);
405
+ std::vector<uint8_t> contactBytes =
406
+ takeBuffer(result.initiator_contact_message_wire_bytes);
407
+ std::vector<uint8_t> keyMaterial = takeBuffer(result.secret_key_material);
408
+ auto payload = jsi::Object(rt);
409
+ payload.setProperty(rt, "request_wire_bytes",
410
+ toArrayBuffer(rt, requestBytes.data(), requestBytes.size()));
411
+ payload.setProperty(rt, "initiator_contact_message_wire_bytes",
412
+ toArrayBuffer(rt, contactBytes.data(), contactBytes.size()));
413
+ payload.setProperty(rt, "secret_key_material",
414
+ toArrayBuffer(rt, keyMaterial.data(), keyMaterial.size()));
415
+ return jsi::Value(rt, payload);
416
+ }
417
+
418
+ /// `extract_pair_request(request: ArrayBuffer, secretKeyMaterial: ArrayBuffer)
419
+ /// -> { channel_id, request_proto_bytes }`
420
+ jsi::Value extractPairRequest(jsi::Runtime& rt,
421
+ const jsi::Value&,
422
+ const jsi::Value* args,
423
+ size_t count) {
424
+ requireArgs(rt, "extract_pair_request", count, 2);
425
+ ByteView request = asBytes(rt, args[0]);
426
+ ByteView secretKeyMaterial = asBytes(rt, args[1]);
427
+ ExtractPairRequestResult result = extract_pair_request(
428
+ request.ptr, request.len, secretKeyMaterial.ptr, secretKeyMaterial.len);
429
+ if (result.error.code != 0) {
430
+ throwDeRecError(rt, result.error);
431
+ }
432
+ std::vector<uint8_t> bytes = takeBuffer(result.request_proto_bytes);
433
+ auto payload = jsi::Object(rt);
434
+ payload.setProperty(rt, "channel_id",
435
+ jsi::Value(rt, jsi::BigInt::fromUint64(rt, result.channel_id)));
436
+ payload.setProperty(rt, "request_proto_bytes",
437
+ toArrayBuffer(rt, bytes.data(), bytes.size()));
438
+ return jsi::Value(rt, payload);
439
+ }
440
+
441
+ /// `produce_pair_response_message(channelId: bigint, requestProto:
442
+ /// ArrayBuffer, secretKeyMaterial: ArrayBuffer, communicationInfo:
443
+ /// ArrayBuffer|null, parameterRange: ArrayBuffer|null) ->
444
+ /// { response_wire_bytes, peer_transport_protocol, shared_key, channel_id }`
445
+ jsi::Value producePairResponseMessage(jsi::Runtime& rt,
446
+ const jsi::Value&,
447
+ const jsi::Value* args,
448
+ size_t count) {
449
+ requireArgs(rt, "produce_pair_response_message", count, 5);
450
+ uint64_t channelId = asU64(rt, args[0]);
451
+ ByteView requestProto = asBytes(rt, args[1]);
452
+ ByteView secretKeyMaterial = asBytes(rt, args[2]);
453
+ ByteView communicationInfo = asBytes(rt, args[3]);
454
+ ByteView parameterRange = asBytes(rt, args[4]);
455
+ ProducePairResponseMessageResult result = produce_pair_response_message(
456
+ channelId, requestProto.ptr, requestProto.len, secretKeyMaterial.ptr,
457
+ secretKeyMaterial.len, communicationInfo.ptr, communicationInfo.len,
458
+ parameterRange.ptr, parameterRange.len);
459
+ if (result.error.code != 0) {
460
+ throwDeRecError(rt, result.error);
461
+ }
462
+ std::vector<uint8_t> responseBytes = takeBuffer(result.response_wire_bytes);
463
+ std::vector<uint8_t> peerTransportProtocol =
464
+ takeBuffer(result.peer_transport_protocol);
465
+ std::vector<uint8_t> sharedKey = takeBuffer(result.shared_key);
466
+ auto payload = jsi::Object(rt);
467
+ payload.setProperty(rt, "response_wire_bytes",
468
+ toArrayBuffer(rt, responseBytes.data(), responseBytes.size()));
469
+ payload.setProperty(
470
+ rt, "peer_transport_protocol",
471
+ toArrayBuffer(rt, peerTransportProtocol.data(), peerTransportProtocol.size()));
472
+ payload.setProperty(rt, "shared_key",
473
+ toArrayBuffer(rt, sharedKey.data(), sharedKey.size()));
474
+ payload.setProperty(rt, "channel_id",
475
+ jsi::Value(rt, jsi::BigInt::fromUint64(rt, result.channel_id)));
476
+ return jsi::Value(rt, payload);
477
+ }
478
+
479
+ /// `extract_pair_response(response: ArrayBuffer, secretKeyMaterial:
480
+ /// ArrayBuffer) -> { channel_id, response_proto_bytes }`
481
+ jsi::Value extractPairResponse(jsi::Runtime& rt,
482
+ const jsi::Value&,
483
+ const jsi::Value* args,
484
+ size_t count) {
485
+ requireArgs(rt, "extract_pair_response", count, 2);
486
+ ByteView response = asBytes(rt, args[0]);
487
+ ByteView secretKeyMaterial = asBytes(rt, args[1]);
488
+ ExtractPairResponseResult result = extract_pair_response(
489
+ response.ptr, response.len, secretKeyMaterial.ptr, secretKeyMaterial.len);
490
+ if (result.error.code != 0) {
491
+ throwDeRecError(rt, result.error);
492
+ }
493
+ std::vector<uint8_t> bytes = takeBuffer(result.response_proto_bytes);
494
+ auto payload = jsi::Object(rt);
495
+ payload.setProperty(rt, "channel_id",
496
+ jsi::Value(rt, jsi::BigInt::fromUint64(rt, result.channel_id)));
497
+ payload.setProperty(rt, "response_proto_bytes",
498
+ toArrayBuffer(rt, bytes.data(), bytes.size()));
499
+ return jsi::Value(rt, payload);
500
+ }
501
+
502
+ /// `process_pair_response_message(contactMessage: ArrayBuffer, responseProto:
503
+ /// ArrayBuffer, secretKeyMaterial: ArrayBuffer) -> { shared_key,
504
+ /// channel_id }`
505
+ jsi::Value processPairResponseMessage(jsi::Runtime& rt,
506
+ const jsi::Value&,
507
+ const jsi::Value* args,
508
+ size_t count) {
509
+ requireArgs(rt, "process_pair_response_message", count, 3);
510
+ ByteView contactMessage = asBytes(rt, args[0]);
511
+ ByteView responseProto = asBytes(rt, args[1]);
512
+ ByteView secretKeyMaterial = asBytes(rt, args[2]);
513
+ ProcessPairResponseMessageResult result = process_pair_response_message(
514
+ contactMessage.ptr, contactMessage.len, responseProto.ptr,
515
+ responseProto.len, secretKeyMaterial.ptr, secretKeyMaterial.len);
516
+ if (result.error.code != 0) {
517
+ throwDeRecError(rt, result.error);
518
+ }
519
+ std::vector<uint8_t> sharedKey = takeBuffer(result.shared_key);
520
+ auto payload = jsi::Object(rt);
521
+ payload.setProperty(rt, "shared_key",
522
+ toArrayBuffer(rt, sharedKey.data(), sharedKey.size()));
523
+ payload.setProperty(rt, "channel_id",
524
+ jsi::Value(rt, jsi::BigInt::fromUint64(rt, result.channel_id)));
525
+ return jsi::Value(rt, payload);
526
+ }
527
+
528
+ /// `produce_pre_pair_request_message(transportProtocol: ArrayBuffer,
529
+ /// contactMessage: ArrayBuffer) -> ArrayBuffer`
530
+ jsi::Value producePrePairRequestMessage(jsi::Runtime& rt,
531
+ const jsi::Value&,
532
+ const jsi::Value* args,
533
+ size_t count) {
534
+ requireArgs(rt, "produce_pre_pair_request_message", count, 2);
535
+ ByteView transportProtocol = asBytes(rt, args[0]);
536
+ ByteView contactMessage = asBytes(rt, args[1]);
537
+ ProducePrePairRequestMessageResult result = produce_pre_pair_request_message(
538
+ transportProtocol.ptr, transportProtocol.len, contactMessage.ptr,
539
+ contactMessage.len);
540
+ if (result.error.code != 0) {
541
+ throwDeRecError(rt, result.error);
542
+ }
543
+ std::vector<uint8_t> bytes = takeBuffer(result.envelope_wire_bytes);
544
+ return toArrayBuffer(rt, bytes.data(), bytes.size());
545
+ }
546
+
547
+ /// `extract_pre_pair_request(envelope: ArrayBuffer) -> { channel_id,
548
+ /// request_proto_bytes }`
549
+ jsi::Value extractPrePairRequest(jsi::Runtime& rt,
550
+ const jsi::Value&,
551
+ const jsi::Value* args,
552
+ size_t count) {
553
+ requireArgs(rt, "extract_pre_pair_request", count, 1);
554
+ ByteView envelope = asBytes(rt, args[0]);
555
+ ExtractPrePairRequestResult result =
556
+ extract_pre_pair_request(envelope.ptr, envelope.len);
557
+ if (result.error.code != 0) {
558
+ throwDeRecError(rt, result.error);
559
+ }
560
+ std::vector<uint8_t> bytes = takeBuffer(result.request_proto_bytes);
561
+ auto payload = jsi::Object(rt);
562
+ payload.setProperty(rt, "channel_id",
563
+ jsi::Value(rt, jsi::BigInt::fromUint64(rt, result.channel_id)));
564
+ payload.setProperty(rt, "request_proto_bytes",
565
+ toArrayBuffer(rt, bytes.data(), bytes.size()));
566
+ return jsi::Value(rt, payload);
567
+ }
568
+
569
+ /// `produce_pre_pair_response_message(channelId: bigint, requestProto:
570
+ /// ArrayBuffer, secretKeyMaterial: ArrayBuffer) -> ArrayBuffer`
571
+ jsi::Value producePrePairResponseMessage(jsi::Runtime& rt,
572
+ const jsi::Value&,
573
+ const jsi::Value* args,
574
+ size_t count) {
575
+ requireArgs(rt, "produce_pre_pair_response_message", count, 3);
576
+ uint64_t channelId = asU64(rt, args[0]);
577
+ ByteView requestProto = asBytes(rt, args[1]);
578
+ ByteView secretKeyMaterial = asBytes(rt, args[2]);
579
+ ProducePrePairResponseMessageResult result = produce_pre_pair_response_message(
580
+ channelId, requestProto.ptr, requestProto.len, secretKeyMaterial.ptr,
581
+ secretKeyMaterial.len);
582
+ if (result.error.code != 0) {
583
+ throwDeRecError(rt, result.error);
584
+ }
585
+ std::vector<uint8_t> bytes = takeBuffer(result.envelope_wire_bytes);
586
+ return toArrayBuffer(rt, bytes.data(), bytes.size());
587
+ }
588
+
589
+ /// `extract_pre_pair_response(envelope: ArrayBuffer) -> { channel_id,
590
+ /// response_proto_bytes }`
591
+ jsi::Value extractPrePairResponse(jsi::Runtime& rt,
592
+ const jsi::Value&,
593
+ const jsi::Value* args,
594
+ size_t count) {
595
+ requireArgs(rt, "extract_pre_pair_response", count, 1);
596
+ ByteView envelope = asBytes(rt, args[0]);
597
+ ExtractPrePairResponseResult result =
598
+ extract_pre_pair_response(envelope.ptr, envelope.len);
599
+ if (result.error.code != 0) {
600
+ throwDeRecError(rt, result.error);
601
+ }
602
+ std::vector<uint8_t> bytes = takeBuffer(result.response_proto_bytes);
603
+ auto payload = jsi::Object(rt);
604
+ payload.setProperty(rt, "channel_id",
605
+ jsi::Value(rt, jsi::BigInt::fromUint64(rt, result.channel_id)));
606
+ payload.setProperty(rt, "response_proto_bytes",
607
+ toArrayBuffer(rt, bytes.data(), bytes.size()));
608
+ return jsi::Value(rt, payload);
609
+ }
610
+
611
+ /// `process_pre_pair_response_message(contactMessage: ArrayBuffer,
612
+ /// responseProto: ArrayBuffer) -> { mlkem_encapsulation_key,
613
+ /// ecies_public_key, nonce }`
614
+ jsi::Value processPrePairResponseMessage(jsi::Runtime& rt,
615
+ const jsi::Value&,
616
+ const jsi::Value* args,
617
+ size_t count) {
618
+ requireArgs(rt, "process_pre_pair_response_message", count, 2);
619
+ ByteView contactMessage = asBytes(rt, args[0]);
620
+ ByteView responseProto = asBytes(rt, args[1]);
621
+ ProcessPrePairResponseMessageResult result = process_pre_pair_response_message(
622
+ contactMessage.ptr, contactMessage.len, responseProto.ptr,
623
+ responseProto.len);
624
+ if (result.error.code != 0) {
625
+ throwDeRecError(rt, result.error);
626
+ }
627
+ std::vector<uint8_t> mlkemKey = takeBuffer(result.mlkem_encapsulation_key);
628
+ std::vector<uint8_t> eciesKey = takeBuffer(result.ecies_public_key);
629
+ auto payload = jsi::Object(rt);
630
+ payload.setProperty(rt, "mlkem_encapsulation_key",
631
+ toArrayBuffer(rt, mlkemKey.data(), mlkemKey.size()));
632
+ payload.setProperty(rt, "ecies_public_key",
633
+ toArrayBuffer(rt, eciesKey.data(), eciesKey.size()));
634
+ payload.setProperty(rt, "nonce",
635
+ jsi::Value(rt, jsi::BigInt::fromUint64(rt, result.nonce)));
636
+ return jsi::Value(rt, payload);
637
+ }
638
+
639
+ /// `produce_get_share_request_message(channelId: bigint, secretId: bigint,
640
+ /// version: number, sharedKey: ArrayBuffer, replyTo: ArrayBuffer|null)
641
+ /// -> ArrayBuffer`
642
+ jsi::Value produceGetShareRequestMessage(jsi::Runtime& rt,
643
+ const jsi::Value&,
644
+ const jsi::Value* args,
645
+ size_t count) {
646
+ requireArgs(rt, "produce_get_share_request_message", count, 5);
647
+ uint64_t channelId = asU64(rt, args[0]);
648
+ uint64_t secretId = asU64(rt, args[1]);
649
+ auto version = static_cast<uint32_t>(args[2].asNumber());
650
+ ByteView sharedKey = asBytes(rt, args[3]);
651
+ ByteView replyTo = asBytes(rt, args[4]);
652
+ ProduceGetShareRequestMessageResult result = produce_get_share_request_message(
653
+ channelId, secretId, version, sharedKey.ptr, sharedKey.len, replyTo.ptr,
654
+ replyTo.len);
655
+ if (result.error.code != 0) {
656
+ throwDeRecError(rt, result.error);
657
+ }
658
+ std::vector<uint8_t> bytes = takeBuffer(result.request_wire_bytes);
659
+ return toArrayBuffer(rt, bytes.data(), bytes.size());
660
+ }
661
+
662
+ /// `extract_get_share_request(request: ArrayBuffer, sharedKey: ArrayBuffer)
663
+ /// -> { channel_id, request_proto_bytes }`
664
+ jsi::Value extractGetShareRequest(jsi::Runtime& rt,
665
+ const jsi::Value&,
666
+ const jsi::Value* args,
667
+ size_t count) {
668
+ requireArgs(rt, "extract_get_share_request", count, 2);
669
+ ByteView request = asBytes(rt, args[0]);
670
+ ByteView sharedKey = asBytes(rt, args[1]);
671
+ ExtractGetShareRequestResult result = extract_get_share_request(
672
+ request.ptr, request.len, sharedKey.ptr, sharedKey.len);
673
+ if (result.error.code != 0) {
674
+ throwDeRecError(rt, result.error);
675
+ }
676
+ std::vector<uint8_t> bytes = takeBuffer(result.request_proto_bytes);
677
+ auto payload = jsi::Object(rt);
678
+ payload.setProperty(rt, "channel_id",
679
+ jsi::Value(rt, jsi::BigInt::fromUint64(rt, result.channel_id)));
680
+ payload.setProperty(rt, "request_proto_bytes",
681
+ toArrayBuffer(rt, bytes.data(), bytes.size()));
682
+ return jsi::Value(rt, payload);
683
+ }
684
+
685
+ /// `produce_get_share_response_message(channelId: bigint, requestProto:
686
+ /// ArrayBuffer, storedShareProto: ArrayBuffer, sharedKey: ArrayBuffer)
687
+ /// -> ArrayBuffer`
688
+ jsi::Value produceGetShareResponseMessage(jsi::Runtime& rt,
689
+ const jsi::Value&,
690
+ const jsi::Value* args,
691
+ size_t count) {
692
+ requireArgs(rt, "produce_get_share_response_message", count, 4);
693
+ uint64_t channelId = asU64(rt, args[0]);
694
+ ByteView requestProto = asBytes(rt, args[1]);
695
+ ByteView storedShareProto = asBytes(rt, args[2]);
696
+ ByteView sharedKey = asBytes(rt, args[3]);
697
+ ProduceGetShareResponseMessageResult result = produce_get_share_response_message(
698
+ channelId, requestProto.ptr, requestProto.len, storedShareProto.ptr,
699
+ storedShareProto.len, sharedKey.ptr, sharedKey.len);
700
+ if (result.error.code != 0) {
701
+ throwDeRecError(rt, result.error);
702
+ }
703
+ std::vector<uint8_t> bytes = takeBuffer(result.response_wire_bytes);
704
+ return toArrayBuffer(rt, bytes.data(), bytes.size());
705
+ }
706
+
707
+ /// `extract_get_share_response(response: ArrayBuffer, sharedKey: ArrayBuffer)
708
+ /// -> { channel_id, response_proto_bytes }`
709
+ jsi::Value extractGetShareResponse(jsi::Runtime& rt,
710
+ const jsi::Value&,
711
+ const jsi::Value* args,
712
+ size_t count) {
713
+ requireArgs(rt, "extract_get_share_response", count, 2);
714
+ ByteView response = asBytes(rt, args[0]);
715
+ ByteView sharedKey = asBytes(rt, args[1]);
716
+ ExtractGetShareResponseResult result = extract_get_share_response(
717
+ response.ptr, response.len, sharedKey.ptr, sharedKey.len);
718
+ if (result.error.code != 0) {
719
+ throwDeRecError(rt, result.error);
720
+ }
721
+ std::vector<uint8_t> bytes = takeBuffer(result.response_proto_bytes);
722
+ auto payload = jsi::Object(rt);
723
+ payload.setProperty(rt, "channel_id",
724
+ jsi::Value(rt, jsi::BigInt::fromUint64(rt, result.channel_id)));
725
+ payload.setProperty(rt, "response_proto_bytes",
726
+ toArrayBuffer(rt, bytes.data(), bytes.size()));
727
+ return jsi::Value(rt, payload);
728
+ }
729
+
730
+ /// `recover_from_share_responses(responses: ArrayBuffer, secretId: bigint,
731
+ /// version: number) -> ArrayBuffer`
732
+ jsi::Value recoverFromShareResponses(jsi::Runtime& rt,
733
+ const jsi::Value&,
734
+ const jsi::Value* args,
735
+ size_t count) {
736
+ requireArgs(rt, "recover_from_share_responses", count, 3);
737
+ ByteView responses = asBytes(rt, args[0]);
738
+ uint64_t secretId = asU64(rt, args[1]);
739
+ auto version = static_cast<uint32_t>(args[2].asNumber());
740
+ RecoverFromShareResponsesResult result = recover_from_share_responses(
741
+ responses.ptr, responses.len, secretId, version);
742
+ if (result.error.code != 0) {
743
+ throwDeRecError(rt, result.error);
744
+ }
745
+ std::vector<uint8_t> bytes = takeBuffer(result.secret_data);
746
+ return toArrayBuffer(rt, bytes.data(), bytes.size());
747
+ }
748
+
749
+ /// `protect_secret(secretId: bigint, secretData: ArrayBuffer, channels:
750
+ /// (bigint|number)[], threshold: number, version: number) -> ArrayBuffer`
751
+ jsi::Value protectSecret(jsi::Runtime& rt,
752
+ const jsi::Value&,
753
+ const jsi::Value* args,
754
+ size_t count) {
755
+ requireArgs(rt, "protect_secret", count, 5);
756
+ uint64_t secretId = asU64(rt, args[0]);
757
+ ByteView secretData = asBytes(rt, args[1]);
758
+ std::vector<uint64_t> channels = asU64Array(rt, args[2]);
759
+ auto threshold = static_cast<size_t>(args[3].asNumber());
760
+ auto version = static_cast<uint32_t>(args[4].asNumber());
761
+ ProtectSecretResult result = protect_secret(
762
+ secretId, secretData.ptr, secretData.len, channels.data(),
763
+ channels.size(), threshold, version);
764
+ if (result.error.code != 0) {
765
+ throwDeRecError(rt, result.error);
766
+ }
767
+ std::vector<uint8_t> bytes = takeBuffer(result.shares_wire_bytes);
768
+ return toArrayBuffer(rt, bytes.data(), bytes.size());
769
+ }
770
+
771
+ /// `produce_store_share_request_message(channelId: bigint, version: number,
772
+ /// secretId: bigint, committedShare: ArrayBuffer, keepList: number[],
773
+ /// description: ArrayBuffer, sharedKey: ArrayBuffer, replyTo:
774
+ /// ArrayBuffer|null) -> ArrayBuffer`
775
+ jsi::Value produceStoreShareRequestMessage(jsi::Runtime& rt,
776
+ const jsi::Value&,
777
+ const jsi::Value* args,
778
+ size_t count) {
779
+ requireArgs(rt, "produce_store_share_request_message", count, 8);
780
+ uint64_t channelId = asU64(rt, args[0]);
781
+ auto version = static_cast<uint32_t>(args[1].asNumber());
782
+ uint64_t secretId = asU64(rt, args[2]);
783
+ ByteView committedShare = asBytes(rt, args[3]);
784
+ std::vector<uint32_t> keepList = asU32Array(rt, args[4]);
785
+ ByteView description = asBytes(rt, args[5]);
786
+ ByteView sharedKey = asBytes(rt, args[6]);
787
+ ByteView replyTo = asBytes(rt, args[7]);
788
+ ProduceStoreShareRequestMessageResult result =
789
+ produce_store_share_request_message(
790
+ channelId, version, secretId, committedShare.ptr,
791
+ committedShare.len, keepList.data(), keepList.size(),
792
+ description.ptr, description.len, sharedKey.ptr, sharedKey.len,
793
+ replyTo.ptr, replyTo.len);
794
+ if (result.error.code != 0) {
795
+ throwDeRecError(rt, result.error);
796
+ }
797
+ std::vector<uint8_t> bytes = takeBuffer(result.wire_bytes);
798
+ return toArrayBuffer(rt, bytes.data(), bytes.size());
799
+ }
800
+
801
+ /// `extract_store_share_request(request: ArrayBuffer, sharedKey:
802
+ /// ArrayBuffer) -> { channel_id, request_proto_bytes }`
803
+ jsi::Value extractStoreShareRequest(jsi::Runtime& rt,
804
+ const jsi::Value&,
805
+ const jsi::Value* args,
806
+ size_t count) {
807
+ requireArgs(rt, "extract_store_share_request", count, 2);
808
+ ByteView request = asBytes(rt, args[0]);
809
+ ByteView sharedKey = asBytes(rt, args[1]);
810
+ ExtractStoreShareRequestResult result = extract_store_share_request(
811
+ request.ptr, request.len, sharedKey.ptr, sharedKey.len);
812
+ if (result.error.code != 0) {
813
+ throwDeRecError(rt, result.error);
814
+ }
815
+ std::vector<uint8_t> bytes = takeBuffer(result.request_proto_bytes);
816
+ auto payload = jsi::Object(rt);
817
+ payload.setProperty(rt, "channel_id",
818
+ jsi::Value(rt, jsi::BigInt::fromUint64(rt, result.channel_id)));
819
+ payload.setProperty(rt, "request_proto_bytes",
820
+ toArrayBuffer(rt, bytes.data(), bytes.size()));
821
+ return jsi::Value(rt, payload);
822
+ }
823
+
824
+ /// `produce_store_share_response_message(channelId: bigint, requestProto:
825
+ /// ArrayBuffer, sharedKey: ArrayBuffer) -> { wire_bytes,
826
+ /// committed_share_bytes, secret_id, version }`
827
+ jsi::Value produceStoreShareResponseMessage(jsi::Runtime& rt,
828
+ const jsi::Value&,
829
+ const jsi::Value* args,
830
+ size_t count) {
831
+ requireArgs(rt, "produce_store_share_response_message", count, 3);
832
+ uint64_t channelId = asU64(rt, args[0]);
833
+ ByteView requestProto = asBytes(rt, args[1]);
834
+ ByteView sharedKey = asBytes(rt, args[2]);
835
+ ProduceStoreShareResponseMessageResult result =
836
+ produce_store_share_response_message(channelId, requestProto.ptr,
837
+ requestProto.len, sharedKey.ptr,
838
+ sharedKey.len);
839
+ if (result.error.code != 0) {
840
+ throwDeRecError(rt, result.error);
841
+ }
842
+ std::vector<uint8_t> wireBytes = takeBuffer(result.wire_bytes);
843
+ std::vector<uint8_t> committedShareBytes =
844
+ takeBuffer(result.committed_share_bytes);
845
+ auto payload = jsi::Object(rt);
846
+ payload.setProperty(rt, "wire_bytes",
847
+ toArrayBuffer(rt, wireBytes.data(), wireBytes.size()));
848
+ payload.setProperty(
849
+ rt, "committed_share_bytes",
850
+ toArrayBuffer(rt, committedShareBytes.data(), committedShareBytes.size()));
851
+ payload.setProperty(rt, "secret_id",
852
+ jsi::Value(rt, jsi::BigInt::fromUint64(rt, result.secret_id)));
853
+ payload.setProperty(rt, "version",
854
+ jsi::Value(static_cast<double>(result.version)));
855
+ return jsi::Value(rt, payload);
856
+ }
857
+
858
+ /// `extract_store_share_response(response: ArrayBuffer, sharedKey:
859
+ /// ArrayBuffer) -> { channel_id, response_proto_bytes }`
860
+ jsi::Value extractStoreShareResponse(jsi::Runtime& rt,
861
+ const jsi::Value&,
862
+ const jsi::Value* args,
863
+ size_t count) {
864
+ requireArgs(rt, "extract_store_share_response", count, 2);
865
+ ByteView response = asBytes(rt, args[0]);
866
+ ByteView sharedKey = asBytes(rt, args[1]);
867
+ ExtractStoreShareResponseResult result = extract_store_share_response(
868
+ response.ptr, response.len, sharedKey.ptr, sharedKey.len);
869
+ if (result.error.code != 0) {
870
+ throwDeRecError(rt, result.error);
871
+ }
872
+ std::vector<uint8_t> bytes = takeBuffer(result.response_proto_bytes);
873
+ auto payload = jsi::Object(rt);
874
+ payload.setProperty(rt, "channel_id",
875
+ jsi::Value(rt, jsi::BigInt::fromUint64(rt, result.channel_id)));
876
+ payload.setProperty(rt, "response_proto_bytes",
877
+ toArrayBuffer(rt, bytes.data(), bytes.size()));
878
+ return jsi::Value(rt, payload);
879
+ }
880
+
881
+ /// `process_store_share_response_message(version: number, responseProto:
882
+ /// ArrayBuffer) -> undefined`
883
+ jsi::Value processStoreShareResponseMessage(jsi::Runtime& rt,
884
+ const jsi::Value&,
885
+ const jsi::Value* args,
886
+ size_t count) {
887
+ requireArgs(rt, "process_store_share_response_message", count, 2);
888
+ auto version = static_cast<uint32_t>(args[0].asNumber());
889
+ ByteView responseProto = asBytes(rt, args[1]);
890
+ ProcessStoreShareResponseMessageResult result =
891
+ process_store_share_response_message(version, responseProto.ptr,
892
+ responseProto.len);
893
+ if (result.error.code != 0) {
894
+ throwDeRecError(rt, result.error);
895
+ }
896
+ return jsi::Value::undefined();
897
+ }
898
+
899
+ /// `produce_unpair_request_message(channelId: bigint, memo: ArrayBuffer,
900
+ /// sharedKey: ArrayBuffer, replyTo: ArrayBuffer|null) -> ArrayBuffer`
901
+ jsi::Value produceUnpairRequestMessage(jsi::Runtime& rt,
902
+ const jsi::Value&,
903
+ const jsi::Value* args,
904
+ size_t count) {
905
+ requireArgs(rt, "produce_unpair_request_message", count, 4);
906
+ uint64_t channelId = asU64(rt, args[0]);
907
+ ByteView memo = asBytes(rt, args[1]);
908
+ ByteView sharedKey = asBytes(rt, args[2]);
909
+ ByteView replyTo = asBytes(rt, args[3]);
910
+ ProduceUnpairRequestMessageResult result = produce_unpair_request_message(
911
+ channelId, memo.ptr, memo.len, sharedKey.ptr, sharedKey.len,
912
+ replyTo.ptr, replyTo.len);
913
+ if (result.error.code != 0) {
914
+ throwDeRecError(rt, result.error);
915
+ }
916
+ std::vector<uint8_t> bytes = takeBuffer(result.request_wire_bytes);
917
+ return toArrayBuffer(rt, bytes.data(), bytes.size());
918
+ }
919
+
920
+ /// `extract_unpair_request(request: ArrayBuffer, sharedKey: ArrayBuffer) ->
921
+ /// { channel_id, memo, request_proto_bytes }`
922
+ jsi::Value extractUnpairRequest(jsi::Runtime& rt,
923
+ const jsi::Value&,
924
+ const jsi::Value* args,
925
+ size_t count) {
926
+ requireArgs(rt, "extract_unpair_request", count, 2);
927
+ ByteView request = asBytes(rt, args[0]);
928
+ ByteView sharedKey = asBytes(rt, args[1]);
929
+ ExtractUnpairRequestResult result = extract_unpair_request(
930
+ request.ptr, request.len, sharedKey.ptr, sharedKey.len);
931
+ if (result.error.code != 0) {
932
+ throwDeRecError(rt, result.error);
933
+ }
934
+ std::string memo = takeString(result.memo);
935
+ std::vector<uint8_t> bytes = takeBuffer(result.request_proto_bytes);
936
+ auto payload = jsi::Object(rt);
937
+ payload.setProperty(rt, "channel_id",
938
+ jsi::Value(rt, jsi::BigInt::fromUint64(rt, result.channel_id)));
939
+ payload.setProperty(rt, "memo", jsi::String::createFromUtf8(rt, memo));
940
+ payload.setProperty(rt, "request_proto_bytes",
941
+ toArrayBuffer(rt, bytes.data(), bytes.size()));
942
+ return jsi::Value(rt, payload);
943
+ }
944
+
945
+ /// `produce_unpair_response_message(channelId: bigint, sharedKey:
946
+ /// ArrayBuffer) -> ArrayBuffer`
947
+ jsi::Value produceUnpairResponseMessage(jsi::Runtime& rt,
948
+ const jsi::Value&,
949
+ const jsi::Value* args,
950
+ size_t count) {
951
+ requireArgs(rt, "produce_unpair_response_message", count, 2);
952
+ uint64_t channelId = asU64(rt, args[0]);
953
+ ByteView sharedKey = asBytes(rt, args[1]);
954
+ ProduceUnpairResponseMessageResult result =
955
+ produce_unpair_response_message(channelId, sharedKey.ptr, sharedKey.len);
956
+ if (result.error.code != 0) {
957
+ throwDeRecError(rt, result.error);
958
+ }
959
+ std::vector<uint8_t> bytes = takeBuffer(result.response_wire_bytes);
960
+ return toArrayBuffer(rt, bytes.data(), bytes.size());
961
+ }
962
+
963
+ /// `extract_unpair_response(response: ArrayBuffer, sharedKey: ArrayBuffer)
964
+ /// -> { channel_id, response_proto_bytes }`
965
+ jsi::Value extractUnpairResponse(jsi::Runtime& rt,
966
+ const jsi::Value&,
967
+ const jsi::Value* args,
968
+ size_t count) {
969
+ requireArgs(rt, "extract_unpair_response", count, 2);
970
+ ByteView response = asBytes(rt, args[0]);
971
+ ByteView sharedKey = asBytes(rt, args[1]);
972
+ ExtractUnpairResponseResult result = extract_unpair_response(
973
+ response.ptr, response.len, sharedKey.ptr, sharedKey.len);
974
+ if (result.error.code != 0) {
975
+ throwDeRecError(rt, result.error);
976
+ }
977
+ std::vector<uint8_t> bytes = takeBuffer(result.response_proto_bytes);
978
+ auto payload = jsi::Object(rt);
979
+ payload.setProperty(rt, "channel_id",
980
+ jsi::Value(rt, jsi::BigInt::fromUint64(rt, result.channel_id)));
981
+ payload.setProperty(rt, "response_proto_bytes",
982
+ toArrayBuffer(rt, bytes.data(), bytes.size()));
983
+ return jsi::Value(rt, payload);
984
+ }
985
+
986
+ /// `process_unpair_response_message(responseProto: ArrayBuffer) ->
987
+ /// undefined`
988
+ jsi::Value processUnpairResponseMessage(jsi::Runtime& rt,
989
+ const jsi::Value&,
990
+ const jsi::Value* args,
991
+ size_t count) {
992
+ requireArgs(rt, "process_unpair_response_message", count, 1);
993
+ ByteView responseProto = asBytes(rt, args[0]);
994
+ ProcessUnpairResponseResult result = process_unpair_response_message(
995
+ responseProto.ptr, responseProto.len);
996
+ if (result.error.code != 0) {
997
+ throwDeRecError(rt, result.error);
998
+ }
999
+ return jsi::Value::undefined();
1000
+ }
1001
+
1002
+ /// `produce_verify_share_request_message(channelId: bigint, secretId:
1003
+ /// bigint, version: number, sharedKey: ArrayBuffer, replyTo:
1004
+ /// ArrayBuffer|null) -> ArrayBuffer`
1005
+ jsi::Value produceVerifyShareRequestMessage(jsi::Runtime& rt,
1006
+ const jsi::Value&,
1007
+ const jsi::Value* args,
1008
+ size_t count) {
1009
+ requireArgs(rt, "produce_verify_share_request_message", count, 5);
1010
+ uint64_t channelId = asU64(rt, args[0]);
1011
+ uint64_t secretId = asU64(rt, args[1]);
1012
+ auto version = static_cast<uint32_t>(args[2].asNumber());
1013
+ ByteView sharedKey = asBytes(rt, args[3]);
1014
+ ByteView replyTo = asBytes(rt, args[4]);
1015
+ ProduceVerifyShareRequestMessageResult result =
1016
+ produce_verify_share_request_message(channelId, secretId, version,
1017
+ sharedKey.ptr, sharedKey.len,
1018
+ replyTo.ptr, replyTo.len);
1019
+ if (result.error.code != 0) {
1020
+ throwDeRecError(rt, result.error);
1021
+ }
1022
+ std::vector<uint8_t> bytes = takeBuffer(result.request_wire_bytes);
1023
+ return toArrayBuffer(rt, bytes.data(), bytes.size());
1024
+ }
1025
+
1026
+ /// `extract_verify_share_request(request: ArrayBuffer, sharedKey:
1027
+ /// ArrayBuffer) -> { channel_id, request_proto_bytes }`
1028
+ jsi::Value extractVerifyShareRequest(jsi::Runtime& rt,
1029
+ const jsi::Value&,
1030
+ const jsi::Value* args,
1031
+ size_t count) {
1032
+ requireArgs(rt, "extract_verify_share_request", count, 2);
1033
+ ByteView request = asBytes(rt, args[0]);
1034
+ ByteView sharedKey = asBytes(rt, args[1]);
1035
+ ExtractVerifyShareRequestResult result = extract_verify_share_request(
1036
+ request.ptr, request.len, sharedKey.ptr, sharedKey.len);
1037
+ if (result.error.code != 0) {
1038
+ throwDeRecError(rt, result.error);
1039
+ }
1040
+ std::vector<uint8_t> bytes = takeBuffer(result.request_proto_bytes);
1041
+ auto payload = jsi::Object(rt);
1042
+ payload.setProperty(rt, "channel_id",
1043
+ jsi::Value(rt, jsi::BigInt::fromUint64(rt, result.channel_id)));
1044
+ payload.setProperty(rt, "request_proto_bytes",
1045
+ toArrayBuffer(rt, bytes.data(), bytes.size()));
1046
+ return jsi::Value(rt, payload);
1047
+ }
1048
+
1049
+ /// `produce_verify_share_response_message(channelId: bigint, requestProto:
1050
+ /// ArrayBuffer, sharedKey: ArrayBuffer, shareContent: ArrayBuffer) ->
1051
+ /// ArrayBuffer`
1052
+ jsi::Value produceVerifyShareResponseMessage(jsi::Runtime& rt,
1053
+ const jsi::Value&,
1054
+ const jsi::Value* args,
1055
+ size_t count) {
1056
+ requireArgs(rt, "produce_verify_share_response_message", count, 4);
1057
+ uint64_t channelId = asU64(rt, args[0]);
1058
+ ByteView requestProto = asBytes(rt, args[1]);
1059
+ ByteView sharedKey = asBytes(rt, args[2]);
1060
+ ByteView shareContent = asBytes(rt, args[3]);
1061
+ ProduceVerifyShareResponseMessageResult result =
1062
+ produce_verify_share_response_message(
1063
+ channelId, requestProto.ptr, requestProto.len, sharedKey.ptr,
1064
+ sharedKey.len, shareContent.ptr, shareContent.len);
1065
+ if (result.error.code != 0) {
1066
+ throwDeRecError(rt, result.error);
1067
+ }
1068
+ std::vector<uint8_t> bytes = takeBuffer(result.response_wire_bytes);
1069
+ return toArrayBuffer(rt, bytes.data(), bytes.size());
1070
+ }
1071
+
1072
+ /// `extract_verify_share_response(response: ArrayBuffer, sharedKey:
1073
+ /// ArrayBuffer) -> { channel_id, response_proto_bytes }`
1074
+ jsi::Value extractVerifyShareResponse(jsi::Runtime& rt,
1075
+ const jsi::Value&,
1076
+ const jsi::Value* args,
1077
+ size_t count) {
1078
+ requireArgs(rt, "extract_verify_share_response", count, 2);
1079
+ ByteView response = asBytes(rt, args[0]);
1080
+ ByteView sharedKey = asBytes(rt, args[1]);
1081
+ ExtractVerifyShareResponseResult result = extract_verify_share_response(
1082
+ response.ptr, response.len, sharedKey.ptr, sharedKey.len);
1083
+ if (result.error.code != 0) {
1084
+ throwDeRecError(rt, result.error);
1085
+ }
1086
+ std::vector<uint8_t> bytes = takeBuffer(result.response_proto_bytes);
1087
+ auto payload = jsi::Object(rt);
1088
+ payload.setProperty(rt, "channel_id",
1089
+ jsi::Value(rt, jsi::BigInt::fromUint64(rt, result.channel_id)));
1090
+ payload.setProperty(rt, "response_proto_bytes",
1091
+ toArrayBuffer(rt, bytes.data(), bytes.size()));
1092
+ return jsi::Value(rt, payload);
1093
+ }
1094
+
1095
+ /// `process_verify_share_response_message(requestProto: ArrayBuffer,
1096
+ /// responseProto: ArrayBuffer, shareContent: ArrayBuffer) -> boolean`
1097
+ jsi::Value processVerifyShareResponseMessage(jsi::Runtime& rt,
1098
+ const jsi::Value&,
1099
+ const jsi::Value* args,
1100
+ size_t count) {
1101
+ requireArgs(rt, "process_verify_share_response_message", count, 3);
1102
+ ByteView requestProto = asBytes(rt, args[0]);
1103
+ ByteView responseProto = asBytes(rt, args[1]);
1104
+ ByteView shareContent = asBytes(rt, args[2]);
1105
+ VerifyShareResponseResult result = process_verify_share_response_message(
1106
+ requestProto.ptr, requestProto.len, responseProto.ptr,
1107
+ responseProto.len, shareContent.ptr, shareContent.len);
1108
+ if (result.error.code != 0) {
1109
+ throwDeRecError(rt, result.error);
1110
+ }
1111
+ return jsi::Value(static_cast<bool>(result.is_valid));
1112
+ }
1113
+
1114
+ void bind(jsi::Runtime& rt,
1115
+ jsi::Object& host,
1116
+ const char* name,
1117
+ size_t argCount,
1118
+ jsi::HostFunctionType body) {
1119
+ host.setProperty(rt, name,
1120
+ jsi::Function::createFromHostFunction(
1121
+ rt, jsi::PropNameID::forAscii(rt, name), argCount,
1122
+ std::move(body)));
1123
+ }
1124
+
1125
+ } // namespace
1126
+
1127
+ void installPrimitives(jsi::Runtime& rt, jsi::Object& host) {
1128
+ bind(rt, host, "produce_get_secret_ids_versions_request_message", 3,
1129
+ produceGetSecretIdsVersionsRequestMessage);
1130
+ bind(rt, host, "extract_get_secret_ids_versions_request", 2,
1131
+ extractGetSecretIdsVersionsRequest);
1132
+ bind(rt, host, "produce_get_secret_ids_versions_response_message", 3,
1133
+ produceGetSecretIdsVersionsResponseMessage);
1134
+ bind(rt, host, "extract_get_secret_ids_versions_response", 2,
1135
+ extractGetSecretIdsVersionsResponse);
1136
+ bind(rt, host, "process_get_secret_ids_versions_response_message", 1,
1137
+ processGetSecretIdsVersionsResponseMessage);
1138
+ bind(rt, host, "apply_trace_id_to_envelope", 2, applyTraceId);
1139
+ bind(rt, host, "read_trace_id_from_envelope", 1, readTraceId);
1140
+ bind(rt, host, "create_contact_message", 5, createContactMessage);
1141
+ bind(rt, host, "validate_contact_message", 1, validateContactMessage);
1142
+ bind(rt, host, "encode_contact_message", 1, encodeContactMessage);
1143
+ bind(rt, host, "decode_contact_message", 1, decodeContactMessage);
1144
+ bind(rt, host, "decode_message_json", 2, decodeMessageJson);
1145
+ bind(rt, host, "encode_message_json", 2, encodeMessageJson);
1146
+ bind(rt, host, "produce_pair_request_message", 5, producePairRequestMessage);
1147
+ bind(rt, host, "extract_pair_request", 2, extractPairRequest);
1148
+ bind(rt, host, "produce_pair_response_message", 5, producePairResponseMessage);
1149
+ bind(rt, host, "extract_pair_response", 2, extractPairResponse);
1150
+ bind(rt, host, "process_pair_response_message", 3, processPairResponseMessage);
1151
+ bind(rt, host, "produce_pre_pair_request_message", 2,
1152
+ producePrePairRequestMessage);
1153
+ bind(rt, host, "extract_pre_pair_request", 1, extractPrePairRequest);
1154
+ bind(rt, host, "produce_pre_pair_response_message", 3,
1155
+ producePrePairResponseMessage);
1156
+ bind(rt, host, "extract_pre_pair_response", 1, extractPrePairResponse);
1157
+ bind(rt, host, "process_pre_pair_response_message", 2,
1158
+ processPrePairResponseMessage);
1159
+ bind(rt, host, "produce_get_share_request_message", 5,
1160
+ produceGetShareRequestMessage);
1161
+ bind(rt, host, "extract_get_share_request", 2, extractGetShareRequest);
1162
+ bind(rt, host, "produce_get_share_response_message", 4,
1163
+ produceGetShareResponseMessage);
1164
+ bind(rt, host, "extract_get_share_response", 2, extractGetShareResponse);
1165
+ bind(rt, host, "recover_from_share_responses", 3, recoverFromShareResponses);
1166
+ bind(rt, host, "protect_secret", 5, protectSecret);
1167
+ bind(rt, host, "produce_store_share_request_message", 8,
1168
+ produceStoreShareRequestMessage);
1169
+ bind(rt, host, "extract_store_share_request", 2, extractStoreShareRequest);
1170
+ bind(rt, host, "produce_store_share_response_message", 3,
1171
+ produceStoreShareResponseMessage);
1172
+ bind(rt, host, "extract_store_share_response", 2, extractStoreShareResponse);
1173
+ bind(rt, host, "process_store_share_response_message", 2,
1174
+ processStoreShareResponseMessage);
1175
+ bind(rt, host, "produce_unpair_request_message", 4,
1176
+ produceUnpairRequestMessage);
1177
+ bind(rt, host, "extract_unpair_request", 2, extractUnpairRequest);
1178
+ bind(rt, host, "produce_unpair_response_message", 2,
1179
+ produceUnpairResponseMessage);
1180
+ bind(rt, host, "extract_unpair_response", 2, extractUnpairResponse);
1181
+ bind(rt, host, "process_unpair_response_message", 1,
1182
+ processUnpairResponseMessage);
1183
+ bind(rt, host, "produce_verify_share_request_message", 5,
1184
+ produceVerifyShareRequestMessage);
1185
+ bind(rt, host, "extract_verify_share_request", 2, extractVerifyShareRequest);
1186
+ bind(rt, host, "produce_verify_share_response_message", 4,
1187
+ produceVerifyShareResponseMessage);
1188
+ bind(rt, host, "extract_verify_share_response", 2, extractVerifyShareResponse);
1189
+ bind(rt, host, "process_verify_share_response_message", 3,
1190
+ processVerifyShareResponseMessage);
1191
+ }
1192
+
1193
+ } // namespace derec