@succinctlabs/react-native-zcam1 0.2.5

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 (139) hide show
  1. package/README.md +61 -0
  2. package/Zcam1Sdk.podspec +157 -0
  3. package/app.plugin.js +11 -0
  4. package/cpp/generated/zcam1_c2pa_utils.cpp +4091 -0
  5. package/cpp/generated/zcam1_c2pa_utils.hpp +367 -0
  6. package/cpp/generated/zcam1_certs_utils.cpp +1799 -0
  7. package/cpp/generated/zcam1_certs_utils.hpp +72 -0
  8. package/cpp/generated/zcam1_verify_utils.cpp +1857 -0
  9. package/cpp/generated/zcam1_verify_utils.hpp +79 -0
  10. package/cpp/proving/generated/zcam1_proving_utils.cpp +3661 -0
  11. package/cpp/proving/generated/zcam1_proving_utils.hpp +275 -0
  12. package/cpp/proving/zcam1-proving.cpp +16 -0
  13. package/cpp/proving/zcam1-proving.h +15 -0
  14. package/cpp/zcam1-sdk.cpp +20 -0
  15. package/cpp/zcam1-sdk.h +15 -0
  16. package/ios/Zcam1Camera.swift +2945 -0
  17. package/ios/Zcam1CameraFilmStyle.swift +191 -0
  18. package/ios/Zcam1CameraViewManager.m +86 -0
  19. package/ios/Zcam1Capture.h +13 -0
  20. package/ios/Zcam1Capture.mm +500 -0
  21. package/ios/Zcam1DepthData.swift +417 -0
  22. package/ios/Zcam1Sdk.h +16 -0
  23. package/ios/Zcam1Sdk.mm +66 -0
  24. package/ios/proving/Zcam1Proving.h +16 -0
  25. package/ios/proving/Zcam1Proving.mm +66 -0
  26. package/lib/module/NativeZcam1Capture.js +12 -0
  27. package/lib/module/NativeZcam1Capture.js.map +1 -0
  28. package/lib/module/NativeZcam1Sdk.js +7 -0
  29. package/lib/module/NativeZcam1Sdk.js.map +1 -0
  30. package/lib/module/bindings.js +51 -0
  31. package/lib/module/bindings.js.map +1 -0
  32. package/lib/module/camera.js +522 -0
  33. package/lib/module/camera.js.map +1 -0
  34. package/lib/module/capture.js +120 -0
  35. package/lib/module/capture.js.map +1 -0
  36. package/lib/module/common.js +35 -0
  37. package/lib/module/common.js.map +1 -0
  38. package/lib/module/generated/zcam1_c2pa_utils-ffi.js +43 -0
  39. package/lib/module/generated/zcam1_c2pa_utils-ffi.js.map +1 -0
  40. package/lib/module/generated/zcam1_c2pa_utils.js +1202 -0
  41. package/lib/module/generated/zcam1_c2pa_utils.js.map +1 -0
  42. package/lib/module/generated/zcam1_certs_utils-ffi.js +43 -0
  43. package/lib/module/generated/zcam1_certs_utils-ffi.js.map +1 -0
  44. package/lib/module/generated/zcam1_certs_utils.js +399 -0
  45. package/lib/module/generated/zcam1_certs_utils.js.map +1 -0
  46. package/lib/module/generated/zcam1_proving_utils-ffi.js +43 -0
  47. package/lib/module/generated/zcam1_proving_utils-ffi.js.map +1 -0
  48. package/lib/module/generated/zcam1_proving_utils.js +515 -0
  49. package/lib/module/generated/zcam1_proving_utils.js.map +1 -0
  50. package/lib/module/generated/zcam1_verify_utils-ffi.js +43 -0
  51. package/lib/module/generated/zcam1_verify_utils-ffi.js.map +1 -0
  52. package/lib/module/generated/zcam1_verify_utils.js +252 -0
  53. package/lib/module/generated/zcam1_verify_utils.js.map +1 -0
  54. package/lib/module/index.js +31 -0
  55. package/lib/module/index.js.map +1 -0
  56. package/lib/module/package.json +1 -0
  57. package/lib/module/picker.js +222 -0
  58. package/lib/module/picker.js.map +1 -0
  59. package/lib/module/proving/NativeZcam1Proving.js +7 -0
  60. package/lib/module/proving/NativeZcam1Proving.js.map +1 -0
  61. package/lib/module/proving/bindings.js +46 -0
  62. package/lib/module/proving/bindings.js.map +1 -0
  63. package/lib/module/proving/index.js +5 -0
  64. package/lib/module/proving/index.js.map +1 -0
  65. package/lib/module/proving/prove.js +346 -0
  66. package/lib/module/proving/prove.js.map +1 -0
  67. package/lib/module/utils.js +27 -0
  68. package/lib/module/utils.js.map +1 -0
  69. package/lib/module/verify.js +82 -0
  70. package/lib/module/verify.js.map +1 -0
  71. package/lib/typescript/package.json +1 -0
  72. package/lib/typescript/src/NativeZcam1Capture.d.ts +280 -0
  73. package/lib/typescript/src/NativeZcam1Capture.d.ts.map +1 -0
  74. package/lib/typescript/src/NativeZcam1Sdk.d.ts +8 -0
  75. package/lib/typescript/src/NativeZcam1Sdk.d.ts.map +1 -0
  76. package/lib/typescript/src/bindings.d.ts +14 -0
  77. package/lib/typescript/src/bindings.d.ts.map +1 -0
  78. package/lib/typescript/src/camera.d.ts +300 -0
  79. package/lib/typescript/src/camera.d.ts.map +1 -0
  80. package/lib/typescript/src/capture.d.ts +59 -0
  81. package/lib/typescript/src/capture.d.ts.map +1 -0
  82. package/lib/typescript/src/common.d.ts +10 -0
  83. package/lib/typescript/src/common.d.ts.map +1 -0
  84. package/lib/typescript/src/generated/zcam1_c2pa_utils-ffi.d.ts +175 -0
  85. package/lib/typescript/src/generated/zcam1_c2pa_utils-ffi.d.ts.map +1 -0
  86. package/lib/typescript/src/generated/zcam1_c2pa_utils.d.ts +811 -0
  87. package/lib/typescript/src/generated/zcam1_c2pa_utils.d.ts.map +1 -0
  88. package/lib/typescript/src/generated/zcam1_certs_utils-ffi.d.ts +82 -0
  89. package/lib/typescript/src/generated/zcam1_certs_utils-ffi.d.ts.map +1 -0
  90. package/lib/typescript/src/generated/zcam1_certs_utils.d.ts +413 -0
  91. package/lib/typescript/src/generated/zcam1_certs_utils.d.ts.map +1 -0
  92. package/lib/typescript/src/generated/zcam1_proving_utils-ffi.d.ts +153 -0
  93. package/lib/typescript/src/generated/zcam1_proving_utils-ffi.d.ts.map +1 -0
  94. package/lib/typescript/src/generated/zcam1_proving_utils.d.ts +321 -0
  95. package/lib/typescript/src/generated/zcam1_proving_utils.d.ts.map +1 -0
  96. package/lib/typescript/src/generated/zcam1_verify_utils-ffi.d.ts +84 -0
  97. package/lib/typescript/src/generated/zcam1_verify_utils-ffi.d.ts.map +1 -0
  98. package/lib/typescript/src/generated/zcam1_verify_utils.d.ts +286 -0
  99. package/lib/typescript/src/generated/zcam1_verify_utils.d.ts.map +1 -0
  100. package/lib/typescript/src/index.d.ts +29 -0
  101. package/lib/typescript/src/index.d.ts.map +1 -0
  102. package/lib/typescript/src/picker.d.ts +103 -0
  103. package/lib/typescript/src/picker.d.ts.map +1 -0
  104. package/lib/typescript/src/proving/NativeZcam1Proving.d.ts +8 -0
  105. package/lib/typescript/src/proving/NativeZcam1Proving.d.ts.map +1 -0
  106. package/lib/typescript/src/proving/bindings.d.ts +8 -0
  107. package/lib/typescript/src/proving/bindings.d.ts.map +1 -0
  108. package/lib/typescript/src/proving/index.d.ts +3 -0
  109. package/lib/typescript/src/proving/index.d.ts.map +1 -0
  110. package/lib/typescript/src/proving/prove.d.ts +74 -0
  111. package/lib/typescript/src/proving/prove.d.ts.map +1 -0
  112. package/lib/typescript/src/utils.d.ts +2 -0
  113. package/lib/typescript/src/utils.d.ts.map +1 -0
  114. package/lib/typescript/src/verify.d.ts +45 -0
  115. package/lib/typescript/src/verify.d.ts.map +1 -0
  116. package/package.json +118 -0
  117. package/src/NativeZcam1Capture.ts +335 -0
  118. package/src/NativeZcam1Sdk.ts +10 -0
  119. package/src/bindings.tsx +49 -0
  120. package/src/camera.tsx +705 -0
  121. package/src/capture.tsx +165 -0
  122. package/src/common.tsx +46 -0
  123. package/src/generated/zcam1_c2pa_utils-ffi.ts +456 -0
  124. package/src/generated/zcam1_c2pa_utils.ts +1866 -0
  125. package/src/generated/zcam1_certs_utils-ffi.ts +187 -0
  126. package/src/generated/zcam1_certs_utils.ts +549 -0
  127. package/src/generated/zcam1_proving_utils-ffi.ts +374 -0
  128. package/src/generated/zcam1_proving_utils.ts +804 -0
  129. package/src/generated/zcam1_verify_utils-ffi.ts +196 -0
  130. package/src/generated/zcam1_verify_utils.ts +372 -0
  131. package/src/index.ts +73 -0
  132. package/src/picker.tsx +342 -0
  133. package/src/proving/NativeZcam1Proving.ts +10 -0
  134. package/src/proving/bindings.tsx +50 -0
  135. package/src/proving/index.ts +8 -0
  136. package/src/proving/prove.tsx +492 -0
  137. package/src/utils.ts +38 -0
  138. package/src/verify.tsx +119 -0
  139. package/turbo.json +27 -0
@@ -0,0 +1,346 @@
1
+ "use strict";
2
+
3
+ import { base64 } from "@scure/base";
4
+ import React, { createContext, useContext, useEffect, useMemo, useReducer, useRef, useState } from "react";
5
+ import { Dirs, Util } from "react-native-file-access";
6
+ import { buildSelfSignedCertificate, formatFromPath, ManifestEditor } from "../bindings.js";
7
+ import { getContentPublicKey, getSecureEnclaveKeyId } from "../common.js";
8
+ import { FulfillmentStatus, IosProvingClient, ProverNetworkMode } from "./bindings.js";
9
+ import { jsx as _jsx } from "react/jsx-runtime";
10
+ export { ProverNetworkMode } from "./bindings.js";
11
+
12
+ /**
13
+ * Configuration settings for backend communication.
14
+ */
15
+
16
+ /**
17
+ * Creates a `ProvingClient` (non-React helper).
18
+ *
19
+ * Note: If the proofs are generated on the same app where the photos are captured,
20
+ * call the initDevice() function from `react-native-zcam1-capture` instead of
21
+ * this one.
22
+ */
23
+ async function createProvingClient(settings, onInitialized, onProofRequest) {
24
+ let certChainPem;
25
+ let client;
26
+ const contentPublicKey = await getContentPublicKey();
27
+ if (contentPublicKey.kty !== "EC") {
28
+ throw "Only EC public keys are supported";
29
+ }
30
+ const contentKeyId = getSecureEnclaveKeyId(contentPublicKey);
31
+ if (settings.certChain && "pem" in settings.certChain) {
32
+ certChainPem = settings.certChain.pem;
33
+ } else {
34
+ console.warn("[ZCAM1] Using a self signed certificate");
35
+ certChainPem = buildSelfSignedCertificate(contentPublicKey, settings.certChain);
36
+ }
37
+ if (settings.privateKey) {
38
+ const proverNetworkMode = settings.proverNetworkMode ?? ProverNetworkMode.Mainnet;
39
+ client = new IosProvingClient(settings.privateKey, onInitialized, proverNetworkMode);
40
+ } else {
41
+ client = IosProvingClient.mock(onInitialized);
42
+ }
43
+ return new ProvingClient(client, contentKeyId, certChainPem, settings.production, onProofRequest);
44
+ }
45
+ function provingTasksReducer(state, action) {
46
+ switch (action.type) {
47
+ case "reset":
48
+ return {};
49
+ case "requested":
50
+ return {
51
+ ...state,
52
+ [action.requestId]: {
53
+ photoPath: action.photoPath,
54
+ createdAtMs: Date.now()
55
+ }
56
+ };
57
+ case "removed":
58
+ {
59
+ if (!(action.requestId in state)) return state;
60
+ const {
61
+ [action.requestId]: _,
62
+ ...rest
63
+ } = state;
64
+ return rest;
65
+ }
66
+ default:
67
+ return state;
68
+ }
69
+ }
70
+ const ProverContext = /*#__PURE__*/createContext(null);
71
+ export function ProverProvider({
72
+ children,
73
+ settings,
74
+ onFulfilled,
75
+ onUnfulfillable
76
+ }) {
77
+ const [provingClient, setProvingClient] = useState(null);
78
+ const [isInitializing, setIsInitializing] = useState(false);
79
+ const [error, setError] = useState(null);
80
+ const [provingTasks, dispatchProvingTasks] = useReducer(provingTasksReducer, {});
81
+ const provingTasksRef = useRef({});
82
+
83
+ // Keep a ref to the latest tasks so async callbacks don't read stale state.
84
+ useEffect(() => {
85
+ provingTasksRef.current = provingTasks;
86
+ }, [provingTasks]);
87
+ const dispatchProvingTasksSync = action => {
88
+ provingTasksRef.current = provingTasksReducer(provingTasksRef.current, action);
89
+ dispatchProvingTasks(action);
90
+ };
91
+ const provingTasksCount = useMemo(() => Object.keys(provingTasks).length, [provingTasks]);
92
+
93
+ // Initialize proving client
94
+ useEffect(() => {
95
+ let cancelled = false;
96
+ setIsInitializing(true);
97
+ setError(null);
98
+ setProvingClient(null);
99
+ dispatchProvingTasksSync({
100
+ type: "reset"
101
+ });
102
+ (async () => {
103
+ try {
104
+ const provingClient = await createProvingClient(settings, {
105
+ initialized: () => {
106
+ if (cancelled) return;
107
+ setProvingClient(provingClient);
108
+ setIsInitializing(false);
109
+ }
110
+ }, (requestId, photoPath) => {
111
+ dispatchProvingTasksSync({
112
+ type: "requested",
113
+ requestId,
114
+ photoPath
115
+ });
116
+ });
117
+ } catch (e) {
118
+ if (cancelled) return;
119
+ setError(e);
120
+ }
121
+ })();
122
+ return () => {
123
+ cancelled = true;
124
+ };
125
+ }, [settings]);
126
+
127
+ // Poll the proving client to keep task statuses fresh.
128
+ useEffect(() => {
129
+ if (!provingClient) return;
130
+ let cancelled = false;
131
+ let inFlight = false;
132
+ const pollOnce = async () => {
133
+ if (cancelled) return;
134
+ if (inFlight) return;
135
+ const entries = Object.entries(provingTasksRef.current);
136
+ if (entries.length === 0) return;
137
+ inFlight = true;
138
+ try {
139
+ const results = await Promise.allSettled(entries.map(async ([requestId]) => {
140
+ const status = await provingClient.getProofStatus(requestId);
141
+ return {
142
+ requestId,
143
+ status
144
+ };
145
+ }));
146
+ if (cancelled) return;
147
+ for (const r of results) {
148
+ if (r.status !== "fulfilled") continue;
149
+ const {
150
+ requestId,
151
+ status
152
+ } = r.value;
153
+ const task = provingTasksRef.current[requestId];
154
+ if (!task) continue;
155
+ if (status.fulfillmentStatus === FulfillmentStatus.Fulfilled) {
156
+ dispatchProvingTasksSync({
157
+ type: "removed",
158
+ requestId
159
+ });
160
+ if (onFulfilled) {
161
+ if (!status.proof) {
162
+ console.warn("[ZCAM1] Fulfilled proof request returned no proof bytes", requestId);
163
+ } else {
164
+ onFulfilled(requestId, task.photoPath, status.proof, provingClient);
165
+ }
166
+ }
167
+ } else if (status.fulfillmentStatus === FulfillmentStatus.Unfulfillable) {
168
+ dispatchProvingTasksSync({
169
+ type: "removed",
170
+ requestId
171
+ });
172
+ if (onUnfulfillable) {
173
+ onUnfulfillable(requestId);
174
+ }
175
+ }
176
+ }
177
+ } catch (e) {
178
+ if (!cancelled) {
179
+ console.error("[ZCAM1] ProvingTasksProvider polling failed", e);
180
+ }
181
+ } finally {
182
+ inFlight = false;
183
+ }
184
+ };
185
+
186
+ // Kick off once immediately, then poll on an interval.
187
+ void pollOnce();
188
+ const intervalId = setInterval(() => {
189
+ void pollOnce();
190
+ }, 1000);
191
+ return () => {
192
+ cancelled = true;
193
+ clearInterval(intervalId);
194
+ };
195
+ }, [provingClient, onFulfilled, onUnfulfillable]);
196
+ const value = useMemo(() => ({
197
+ provingClient,
198
+ provingTasks,
199
+ provingTasksCount,
200
+ isInitializing,
201
+ error
202
+ }), [provingClient, provingTasks, provingTasksCount, isInitializing, error]);
203
+ return /*#__PURE__*/_jsx(ProverContext.Provider, {
204
+ value: value,
205
+ children: children
206
+ });
207
+ }
208
+ export function useProver() {
209
+ const ctx = useContext(ProverContext);
210
+ if (!ctx) {
211
+ throw new Error("useProver must be used within a ProverProvider");
212
+ }
213
+ return ctx;
214
+ }
215
+ export function useProofRequestStatus(requestId) {
216
+ const [fulfillementStatus, setFulfillementStatus] = useState(FulfillmentStatus.UnspecifiedFulfillmentStatus);
217
+ const [proof, setProof] = useState(undefined);
218
+ const {
219
+ provingClient,
220
+ isInitializing,
221
+ error
222
+ } = useProver();
223
+ useEffect(() => {
224
+ let cancelled = false;
225
+
226
+ // Reset per-request state when inputs change.
227
+ setFulfillementStatus(FulfillmentStatus.UnspecifiedFulfillmentStatus);
228
+ setProof(undefined);
229
+ const sleep = ms => new Promise(r => setTimeout(r, ms));
230
+ (async () => {
231
+ if (!provingClient) return;
232
+ if (!requestId) return;
233
+ if (cancelled) return;
234
+ while (!cancelled) {
235
+ const status = await provingClient.getProofStatus(requestId);
236
+ if (cancelled) return;
237
+ setFulfillementStatus(status.fulfillmentStatus);
238
+ if (status.fulfillmentStatus === FulfillmentStatus.Unfulfillable) {
239
+ setProof(undefined);
240
+ return;
241
+ }
242
+ if (status.fulfillmentStatus === FulfillmentStatus.Fulfilled) {
243
+ // Depending on how your backend behaves, proof should be present on Fulfilled.
244
+ if (!status.proof) {
245
+ throw new Error("Fulfilled proof request returned no proof bytes");
246
+ }
247
+ setProof(status.proof);
248
+ return;
249
+ }
250
+ await sleep(1000);
251
+ }
252
+ })().catch(e => {
253
+ if (!cancelled) {
254
+ console.error("[ZCAM1] useProofRequestStatus failed", e);
255
+ }
256
+ });
257
+ return () => {
258
+ cancelled = true;
259
+ };
260
+ }, [provingClient, requestId]);
261
+ return {
262
+ isInitializing,
263
+ error,
264
+ fulfillementStatus,
265
+ proof
266
+ };
267
+ }
268
+ export class ProvingClient {
269
+ constructor(client, contentKeyId, certChainPem, production, onProofRequest) {
270
+ this.client = client;
271
+ this.contentKeyId = contentKeyId;
272
+ this.certChainPem = certChainPem;
273
+ this.production = production;
274
+ this.onProofRequest = onProofRequest;
275
+ }
276
+
277
+ /**
278
+ * Embeds a cryptographic proof into an image file by modifying its C2PA manifest.
279
+ * @param originalPath - Path to the original image file
280
+ * @param deviceInfo - Device information for signing
281
+ * @param settings - Configuration settings for proof generation
282
+ * @returns Request ID for polling proof status
283
+ */
284
+ async requestProof(originalPath) {
285
+ originalPath = originalPath.replace("file://", "");
286
+ const format = formatFromPath(originalPath);
287
+ if (format === undefined) {
288
+ throw new Error(`Unsupported file format: ${originalPath}`);
289
+ }
290
+ const requestId = await this.client.requestProof(originalPath, format, {
291
+ appAttestProduction: this.production
292
+ });
293
+ if (this.onProofRequest) {
294
+ this.onProofRequest(requestId, originalPath);
295
+ }
296
+ return requestId;
297
+ }
298
+ async getProofStatus(requestId) {
299
+ return await this.client.getProofStatus(requestId);
300
+ }
301
+
302
+ /**
303
+ * Embeds a cryptographic proof into an image file by modifying its C2PA manifest.
304
+ * @param originalPath - Path to the original image file
305
+ * @param deviceInfo - Device information for signing
306
+ * @param settings - Configuration settings for proof generation
307
+ * @returns Path to the new file with embedded proof
308
+ */
309
+ async embedProof(originalPath, proof) {
310
+ originalPath = originalPath.replace("file://", "");
311
+ const format = formatFromPath(originalPath);
312
+ const ext = Util.extname(originalPath);
313
+ if (format === undefined) {
314
+ throw new Error(`Unsupported file format: ${originalPath}`);
315
+ }
316
+ const manifestEditor = ManifestEditor.fromManifest(originalPath, this.contentKeyId.buffer, this.certChainPem);
317
+ const vkHash = this.client.vkHash();
318
+
319
+ // Include the proof to the C2PA manifest
320
+ manifestEditor.addAssertion("succinct.proof", JSON.stringify({
321
+ data: base64.encode(new Uint8Array(proof)),
322
+ vk_hash: vkHash
323
+ }));
324
+ const destinationPath = Dirs.CacheDir + `/zcam-${Date.now()}-${Math.random().toString(36).slice(2, 10)}.${ext}`;
325
+
326
+ // Embed the manifest to the photo
327
+ await manifestEditor.embedManifestToFile(destinationPath, format);
328
+ return destinationPath;
329
+ }
330
+ async waitAndEmbedProof(originalPath) {
331
+ const requestId = await this.requestProof(originalPath);
332
+ console.log(`Request ID: ${requestId}`);
333
+ const sleep = ms => new Promise(r => setTimeout(r, ms));
334
+ while (true) {
335
+ const status = await this.getProofStatus(requestId);
336
+ if (status.fulfillmentStatus === FulfillmentStatus.Unfulfillable) {
337
+ throw new Error("The proof is unfulfillable");
338
+ }
339
+ if (status.fulfillmentStatus === FulfillmentStatus.Fulfilled) {
340
+ return this.embedProof(originalPath, status.proof);
341
+ }
342
+ await sleep(1000);
343
+ }
344
+ }
345
+ }
346
+ //# sourceMappingURL=prove.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["base64","React","createContext","useContext","useEffect","useMemo","useReducer","useRef","useState","Dirs","Util","buildSelfSignedCertificate","formatFromPath","ManifestEditor","getContentPublicKey","getSecureEnclaveKeyId","FulfillmentStatus","IosProvingClient","ProverNetworkMode","jsx","_jsx","createProvingClient","settings","onInitialized","onProofRequest","certChainPem","client","contentPublicKey","kty","contentKeyId","certChain","pem","console","warn","privateKey","proverNetworkMode","Mainnet","mock","ProvingClient","production","provingTasksReducer","state","action","type","requestId","photoPath","createdAtMs","Date","now","_","rest","ProverContext","ProverProvider","children","onFulfilled","onUnfulfillable","provingClient","setProvingClient","isInitializing","setIsInitializing","error","setError","provingTasks","dispatchProvingTasks","provingTasksRef","current","dispatchProvingTasksSync","provingTasksCount","Object","keys","length","cancelled","initialized","e","inFlight","pollOnce","entries","results","Promise","allSettled","map","status","getProofStatus","r","value","task","fulfillmentStatus","Fulfilled","proof","Unfulfillable","intervalId","setInterval","clearInterval","Provider","useProver","ctx","Error","useProofRequestStatus","fulfillementStatus","setFulfillementStatus","UnspecifiedFulfillmentStatus","setProof","undefined","sleep","ms","setTimeout","catch","constructor","requestProof","originalPath","replace","format","appAttestProduction","embedProof","ext","extname","manifestEditor","fromManifest","buffer","vkHash","addAssertion","JSON","stringify","data","encode","Uint8Array","vk_hash","destinationPath","CacheDir","Math","random","toString","slice","embedManifestToFile","waitAndEmbedProof","log"],"sourceRoot":"../../../src","sources":["proving/prove.tsx"],"mappings":"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","ignoreList":[]}
@@ -0,0 +1,27 @@
1
+ "use strict";
2
+
3
+ import { sha256 } from "@noble/hashes/sha2.js";
4
+ import { generateHardwareSignatureWithAssertion } from "@pagopa/io-react-native-integrity";
5
+ import { base64 } from "@scure/base";
6
+ function stringToArray(s) {
7
+ return new TextEncoder().encode(s);
8
+ }
9
+ export async function generateAppAttestAssertion(dataHash, normalizedMetadata, deviceKeyId) {
10
+ let assertion;
11
+ const metadataBytes = stringToArray(normalizedMetadata);
12
+ try {
13
+ assertion = await generateHardwareSignatureWithAssertion(base64.encode(new Uint8Array(dataHash)) + "|" + base64.encode(sha256(metadataBytes)), deviceKeyId);
14
+ } catch (error) {
15
+ const err = error;
16
+ if (err?.code === "-1" || err?.message?.includes("UNSUPPORTED_SERVICE")) {
17
+ console.warn("[ZCAMs] Running in simulator - using mock attestation. This is for development only.");
18
+ // Use a mock attestation for simulator testing
19
+ // In production, this would need to be rejected by the backend
20
+ assertion = `SIMULATOR_MOCK_${deviceKeyId}_${Date.now()}`;
21
+ } else {
22
+ throw error;
23
+ }
24
+ }
25
+ return assertion;
26
+ }
27
+ //# sourceMappingURL=utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["sha256","generateHardwareSignatureWithAssertion","base64","stringToArray","s","TextEncoder","encode","generateAppAttestAssertion","dataHash","normalizedMetadata","deviceKeyId","assertion","metadataBytes","Uint8Array","error","err","code","message","includes","console","warn","Date","now"],"sourceRoot":"../../src","sources":["utils.ts"],"mappings":";;AAAA,SAASA,MAAM,QAAQ,uBAAuB;AAC9C,SAASC,sCAAsC,QAAQ,mCAAmC;AAC1F,SAASC,MAAM,QAAQ,aAAa;AAEpC,SAASC,aAAaA,CAACC,CAAS,EAAc;EAC5C,OAAO,IAAIC,WAAW,CAAC,CAAC,CAACC,MAAM,CAACF,CAAC,CAAC;AACpC;AAEA,OAAO,eAAeG,0BAA0BA,CAC9CC,QAAqB,EACrBC,kBAA0B,EAC1BC,WAAmB,EACF;EACjB,IAAIC,SAAiB;EAErB,MAAMC,aAAa,GAAGT,aAAa,CAACM,kBAAkB,CAAC;EAEvD,IAAI;IACFE,SAAS,GAAG,MAAMV,sCAAsC,CACtDC,MAAM,CAACI,MAAM,CAAC,IAAIO,UAAU,CAACL,QAAQ,CAAC,CAAC,GAAG,GAAG,GAAGN,MAAM,CAACI,MAAM,CAACN,MAAM,CAACY,aAAa,CAAC,CAAC,EACpFF,WACF,CAAC;EACH,CAAC,CAAC,OAAOI,KAAc,EAAE;IACvB,MAAMC,GAAG,GAAGD,KAAwD;IACpE,IAAIC,GAAG,EAAEC,IAAI,KAAK,IAAI,IAAID,GAAG,EAAEE,OAAO,EAAEC,QAAQ,CAAC,qBAAqB,CAAC,EAAE;MACvEC,OAAO,CAACC,IAAI,CACV,sFACF,CAAC;MACD;MACA;MACAT,SAAS,GAAG,kBAAkBD,WAAW,IAAIW,IAAI,CAACC,GAAG,CAAC,CAAC,EAAE;IAC3D,CAAC,MAAM;MACL,MAAMR,KAAK;IACb;EACF;EAEA,OAAOH,SAAS;AAClB","ignoreList":[]}
@@ -0,0 +1,82 @@
1
+ "use strict";
2
+
3
+ import { utf8ToBytes } from "@noble/hashes/utils.js";
4
+ import { base64 } from "@scure/base";
5
+ import { computeHash, extractManifest, verifyBindingsFromManifest, verifyGroth16 } from "./bindings.js";
6
+
7
+ /**
8
+ * Capture metadata extracted from the C2PA manifest.
9
+ * Contains device info and camera settings at capture time.
10
+ */
11
+
12
+ export const APPLE_ROOT_CERT = "MIICITCCAaegAwIBAgIQC/O+DvHN0uD7jG5yH2IXmDAKBggqhkjOPQQDAzBSMSYwJAYDVQQDDB1BcHBsZSBBcHAgQXR0ZXN0YXRpb24gUm9vdCBDQTETMBEGA1UECgwKQXBwbGUgSW5jLjETMBEGA1UECAwKQ2FsaWZvcm5pYTAeFw0yMDAzMTgxODMyNTNaFw00NTAzMTUwMDAwMDBaMFIxJjAkBgNVBAMMHUFwcGxlIEFwcCBBdHRlc3RhdGlvbiBSb290IENBMRMwEQYDVQQKDApBcHBsZSBJbmMuMRMwEQYDVQQIDApDYWxpZm9ybmlhMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAERTHhmLW07ATaFQIEVwTtT4dyctdhNbJhFs/Ii2FdCgAHGbpphY3+d8qjuDngIN3WVhQUBHAoMeQ/cLiP1sOUtgjqK9auYen1mMEvRq9Sk3Jm5X8U62H+xTD3FE9TgS41o0IwQDAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBSskRBTM72+aEH/pwyp5frq5eWKoTAOBgNVHQ8BAf8EBAMCAQYwCgYIKoZIzj0EAwMDaAAwZQIwQgFGnByvsiVbpTKwSga0kP0e8EeDS4+sQmTvb7vn53O5+FRXgeLhpJ06ysC5PrOyAjEAp5U4xDgEgllF7En3VcE3iexZZtKeYnpqtijVoyFraWVIyd/dganmrduC1bmTBGwD";
13
+
14
+ /**
15
+ * Represents a file with a C2PA manifest that can be verified for authenticity.
16
+ */
17
+ export class VerifiableFile {
18
+ /**
19
+ * Creates a VerifiableFile instance by extracting the C2PA manifest from the file.
20
+ * @param path - Path to the file to verify
21
+ */
22
+ constructor(path) {
23
+ const store = extractManifest(path);
24
+ this.path = path;
25
+ this.activeManifest = store.activeManifest();
26
+ }
27
+
28
+ /**
29
+ * Verifies the manifest's bindings (e.g., App Attest).
30
+ */
31
+ verifyBindings(appAttestProduction) {
32
+ if (this.hash === undefined) {
33
+ this.hash = computeHash(this.path);
34
+ }
35
+ return verifyBindingsFromManifest(this.activeManifest.bindings(), this.activeManifest.captureMetadataAction(), this.hash, appAttestProduction);
36
+ }
37
+
38
+ /**
39
+ * Verifies the cryptographic proof embedded in the C2PA manifest.
40
+ * @returns True if the proof is valid, false otherwise
41
+ */
42
+ verifyProof(appId) {
43
+ return verifyProofFromManifest(this.activeManifest, this.path, appId);
44
+ }
45
+
46
+ /**
47
+ * Returns the file's content hash as recorded in the active C2PA manifest.
48
+ * @returns The manifest data hash (base64-encoded string)
49
+ */
50
+ dataHash() {
51
+ if (this.hash === undefined) {
52
+ this.hash = computeHash(this.path);
53
+ }
54
+ return base64.encode(new Uint8Array(this.hash));
55
+ }
56
+
57
+ /**
58
+ * Returns the capture metadata from the C2PA manifest.
59
+ * Contains device info and camera settings recorded at capture time.
60
+ * @returns The capture metadata, or null if not present
61
+ */
62
+ captureMetadata() {
63
+ const actionJson = this.activeManifest.captureMetadataAction();
64
+ if (!actionJson) return null;
65
+ return JSON.parse(actionJson);
66
+ }
67
+ }
68
+ function verifyProofFromManifest(activeManifest, path, appId) {
69
+ const proof = activeManifest.proof();
70
+ if (proof === undefined) {
71
+ throw new Error("The proof was not found in the manifest");
72
+ }
73
+ const hash = new Uint8Array(computeHash(path));
74
+ const appIdBytes = utf8ToBytes(appId);
75
+ const appleRootCert = utf8ToBytes(APPLE_ROOT_CERT);
76
+ const publicInputs = new Uint8Array(hash.length + appIdBytes.length + appleRootCert.length);
77
+ publicInputs.set(hash);
78
+ publicInputs.set(appIdBytes, hash.length);
79
+ publicInputs.set(appleRootCert, hash.length + appIdBytes.length);
80
+ return verifyGroth16(base64.decode(proof.data).buffer, publicInputs.buffer, proof.vkHash);
81
+ }
82
+ //# sourceMappingURL=verify.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["utf8ToBytes","base64","computeHash","extractManifest","verifyBindingsFromManifest","verifyGroth16","APPLE_ROOT_CERT","VerifiableFile","constructor","path","store","activeManifest","verifyBindings","appAttestProduction","hash","undefined","bindings","captureMetadataAction","verifyProof","appId","verifyProofFromManifest","dataHash","encode","Uint8Array","captureMetadata","actionJson","JSON","parse","proof","Error","appIdBytes","appleRootCert","publicInputs","length","set","decode","data","buffer","vkHash"],"sourceRoot":"../../src","sources":["verify.tsx"],"mappings":"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","ignoreList":[]}
@@ -0,0 +1 @@
1
+ {"type":"module"}