@svta/cml-c2pa 1.1.1 → 1.1.3
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/README.md +45 -34
- package/dist/index.d.ts.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
# @svta/cml-c2pa
|
|
2
2
|
|
|
3
|
-
C2PA (Coalition for Content Provenance and Authenticity) live video validation for BMFF
|
|
3
|
+
C2PA (Coalition for Content Provenance and Authenticity) live video validation for BMFF and MP4 containers.
|
|
4
4
|
|
|
5
|
-
|
|
5
|
+
Supported C2PA segment validation methods:
|
|
6
6
|
|
|
7
|
-
- **§19.3 Per-segment C2PA Manifest Box**: each segment embeds a full C2PA manifest with COSE signature
|
|
8
|
-
- **§19.4 Verifiable Segment Info (VSI/EMSG)**: the init segment
|
|
9
|
-
- **§15.12.2 / §18.6 VOD Merkle**: for
|
|
7
|
+
- **§19.3 Per-segment C2PA Manifest Box**: each segment embeds a full C2PA manifest with a COSE signature
|
|
8
|
+
- **§19.4 Verifiable Segment Info (VSI/EMSG)**: the init segment contains the manifest and the session keys. Each media segment contains a small signed EMSG box
|
|
9
|
+
- **§15.12.2 / §18.6 VOD Merkle**: for VOD assets in fragmented MP4, the init manifest stores one Merkle tree row per track. Each media segment contains its own leaf hash and proof
|
|
10
10
|
|
|
11
11
|
|
|
12
12
|
## Installation
|
|
@@ -17,7 +17,7 @@ npm i @svta/cml-c2pa
|
|
|
17
17
|
|
|
18
18
|
> **Note:** `@svta/cml-iso-bmff`, `@svta/cml-utils`, and `cbor-x` are peer dependencies. Most package managers install them automatically, but you may need to add them explicitly.
|
|
19
19
|
|
|
20
|
-
> **Note:** This library uses the [Web Crypto API](https://developer.mozilla.org/en-US/docs/Web/API/Web_Crypto_API) (`crypto.subtle`)
|
|
20
|
+
> **Note:** This library uses the [Web Crypto API](https://developer.mozilla.org/en-US/docs/Web/API/Web_Crypto_API) (`crypto.subtle`) to verify COSE signatures and compute BMFF hashes. In Node.js 20+, `crypto.subtle` is available globally. In browsers, it requires a [secure context](https://developer.mozilla.org/en-US/docs/Web/Security/Secure_Contexts) (HTTPS or `localhost`).
|
|
21
21
|
|
|
22
22
|
## Usage
|
|
23
23
|
|
|
@@ -27,20 +27,23 @@ npm i @svta/cml-c2pa
|
|
|
27
27
|
import { validateC2paManifestBoxSegment } from '@svta/cml-c2pa'
|
|
28
28
|
import type { ManifestBoxValidationState } from '@svta/cml-c2pa'
|
|
29
29
|
|
|
30
|
-
|
|
31
|
-
let
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
bytes
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
30
|
+
async function validateManifestBoxStream(segmentUrls: string[]): Promise<void> {
|
|
31
|
+
let lastManifestId: string | null = null
|
|
32
|
+
let state: ManifestBoxValidationState | undefined
|
|
33
|
+
|
|
34
|
+
for (const segmentUrl of segmentUrls) {
|
|
35
|
+
const response = await fetch(segmentUrl)
|
|
36
|
+
const bytes = new Uint8Array(await response.arrayBuffer())
|
|
37
|
+
const { result, nextManifestId, nextState } = await validateC2paManifestBoxSegment(
|
|
38
|
+
bytes,
|
|
39
|
+
lastManifestId,
|
|
40
|
+
state,
|
|
41
|
+
)
|
|
42
|
+
lastManifestId = nextManifestId
|
|
43
|
+
state = nextState
|
|
44
|
+
|
|
45
|
+
console.log(result.isValid, result.errorCodes)
|
|
46
|
+
}
|
|
44
47
|
}
|
|
45
48
|
```
|
|
46
49
|
|
|
@@ -49,11 +52,15 @@ for (const segmentUrl of segmentUrls) {
|
|
|
49
52
|
```typescript
|
|
50
53
|
import { validateC2paInitSegment, validateC2paSegment } from '@svta/cml-c2pa'
|
|
51
54
|
|
|
52
|
-
|
|
53
|
-
const
|
|
55
|
+
async function validateVsiSegment(initUrl: string, segmentUrl: string): Promise<void> {
|
|
56
|
+
const initResponse = await fetch(initUrl)
|
|
57
|
+
const init = await validateC2paInitSegment(new Uint8Array(await initResponse.arrayBuffer()))
|
|
54
58
|
|
|
55
|
-
const
|
|
56
|
-
const
|
|
59
|
+
const segmentResponse = await fetch(segmentUrl)
|
|
60
|
+
const segmentBytes = new Uint8Array(await segmentResponse.arrayBuffer())
|
|
61
|
+
const validated = await validateC2paSegment(segmentBytes, init.sessionKeys)
|
|
62
|
+
console.log(validated?.result.isValid)
|
|
63
|
+
}
|
|
57
64
|
```
|
|
58
65
|
|
|
59
66
|
### VOD Merkle method (init segment + media segments)
|
|
@@ -61,22 +68,26 @@ const validated = await validateC2paSegment(segmentBytes, init.sessionKeys)
|
|
|
61
68
|
```typescript
|
|
62
69
|
import { validateC2paInitSegment, validateC2paMerkleSegment } from '@svta/cml-c2pa'
|
|
63
70
|
|
|
64
|
-
|
|
65
|
-
const
|
|
71
|
+
async function validateMerkleSegment(initUrl: string, segmentUrl: string): Promise<void> {
|
|
72
|
+
const initResponse = await fetch(initUrl)
|
|
73
|
+
const init = await validateC2paInitSegment(new Uint8Array(await initResponse.arrayBuffer()))
|
|
66
74
|
|
|
67
|
-
const
|
|
68
|
-
const
|
|
75
|
+
const segmentResponse = await fetch(segmentUrl)
|
|
76
|
+
const segmentBytes = new Uint8Array(await segmentResponse.arrayBuffer())
|
|
77
|
+
const { result } = await validateC2paMerkleSegment(segmentBytes, init.merkleMaps)
|
|
78
|
+
console.log(result.isValid, result.errorCodes)
|
|
79
|
+
}
|
|
69
80
|
```
|
|
70
81
|
|
|
71
82
|
## Docs
|
|
72
83
|
|
|
73
|
-
- [VSI/EMSG Validation](https://github.com/streaming-video-technology-alliance/common-media-library/blob/main/libs/c2pa/docs/vsi-validation.md)
|
|
74
|
-
- [Manifest Box Validation](https://github.com/streaming-video-technology-alliance/common-media-library/blob/main/libs/c2pa/docs/manifest-box-validation.md)
|
|
75
|
-
- [VOD Merkle Validation](https://github.com/streaming-video-technology-alliance/common-media-library/blob/main/libs/c2pa/docs/merkle-validation.md)
|
|
76
|
-
- [Results and Error Codes](https://github.com/streaming-video-technology-alliance/common-media-library/blob/main/libs/c2pa/docs/results-and-error-codes.md)
|
|
84
|
+
- [VSI/EMSG Validation](https://github.com/streaming-video-technology-alliance/common-media-library/blob/main/libs/c2pa/docs/vsi-validation.md) (§19.4)
|
|
85
|
+
- [Manifest Box Validation](https://github.com/streaming-video-technology-alliance/common-media-library/blob/main/libs/c2pa/docs/manifest-box-validation.md) (§19.3)
|
|
86
|
+
- [VOD Merkle Validation](https://github.com/streaming-video-technology-alliance/common-media-library/blob/main/libs/c2pa/docs/merkle-validation.md) (§15.12.2 / §18.6)
|
|
87
|
+
- [Results and Error Codes](https://github.com/streaming-video-technology-alliance/common-media-library/blob/main/libs/c2pa/docs/results-and-error-codes.md)
|
|
77
88
|
|
|
78
89
|
## References
|
|
79
90
|
|
|
80
91
|
- [C2PA Specification v2.3](https://c2pa.org/specifications/specifications/2.3/specs/C2PA_Specification.html)
|
|
81
|
-
- [JUMBF
|
|
82
|
-
- [COSE
|
|
92
|
+
- [JUMBF (JPEG Universal Metadata Box Format), ISO 19566-5](https://www.iso.org/standard/84635.html)
|
|
93
|
+
- [COSE, RFC 9052](https://www.rfc-editor.org/rfc/rfc9052)
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","names":[],"sources":["../src/C2paAssertion.ts","../src/C2paSignatureInfo.ts","../src/C2paManifest.ts","../src/C2paStatusCode.ts","../src/cose/CoseKeyJwk.ts","../src/LiveVideoStatusCode.ts","../src/bmff/BmffHashExclusion.ts","../src/merkle/MerkleSegmentValidation.ts","../src/init/InitSegmentValidation.ts","../src/init/validateC2paInitSegment.ts","../src/vsi/SequenceState.ts","../src/segment/SegmentValidation.ts","../src/segment/validateC2paSegment.ts","../src/manifestbox/ManifestBoxValidation.ts","../src/manifestbox/validateC2paManifestBoxSegment.ts","../src/merkle/validateC2paMerkleSegment.ts"],"sourcesContent":[],"mappings":";;;;;;;AAKA;;KAAY,aAAA;;ECAZ,SAAY,IAAA,EAAA,OAAA;;;;;;;ADAZ;;KCAY,iBAAA;;EAAZ,SAAY,aAAA,EAAA,MAAA,GAAA,IAAA;;;;;ADAZ;;;;ACAY,KCGA,YAAA,GDHA;;;;ECGZ,SAAY,aAAA,EAIa,iBAAA;gCACM;;;;;;AFR/B;;;;ACAA;;;;ACGY,cCIC,cDAY,EAAA;;;;ECAzB,SAAa,iBAAA,EAAA,mBAAA;EAoBb;;;;EC1BA;;;;ACMA,CAAA;AA0BA;;;;AChCA;AAcY,KHYA,cAAA,GAAiB,OGVH,CAAA,OHUkB,cGVlB,CAAA;;;;;;ANjB1B;;;KICY,UAAA;EHDZ,SAAY,GAAA,EAAA,MAAA;;;;ACGZ,CAAA;;;;;AFHA;;;;ACAA;;;;ACGY,cGIC,mBHAY,EAAA;;;;ECAzB,SAAa,gBAAA,EAAA,4BAAA;EAoBb;;;;AC1BA;;;;ECMA;EA0BA,SAAY,yBAAA,EAAA,oCAAsB;;;;EChClC,SAAY,kBAAA,EAAA,8BAEK;AAYjB,CAAA;;;;ACXA;;AAKoB,KFwBR,mBAAA,GAAsB,OExBd,CAAA,OFwB6B,mBExB7B,CAAA;;;;;;APTpB;;;KMCY,kBAAA;ELDZ,SAAY,MAAA,EAAA,MAAA;kBKGK;;;AJAjB;;;;ACIA;AAoBA;;;KGZY,iBAAA;EFdZ,SAAY,KAAA,EAAA,MAAA;2BEgBc;;;;ANjB1B;;;;ACAA;KMIY,SAAA;;;ELDZ,SAAY,KAAA,EAAA,MAAA;4BKKe;qBACP;;EJFpB,SAAa,UAAA,EAAA,SIIkB,iBJJlB,EAAA;EAoBb,SAAY,gBAAA,EAAA,MAAgC;;;;AC1B5C;;;;ACMA;AA0BA;;;;AChCY,KCyBA,kBAAA,GDzBA;EAcZ,SAAY,aAAA,ECYa,WDVC,CAAA,MAAA,EAAA,MAAA,CAAA;;;;ACb1B;;;AAO+B,KAwBnB,uBAAA,GAxBmB;EAAA,SAAA,QAAA,EAAA,MAAA,GAAA,IAAA;EAe/B,SAAY,WAAA,EAAA,MAAA,GAAA,IAAA;EASZ,SAAY,OAAA,EAAA,OAAA;iCAIoB,sBAAsB;;;;;;ANvCtD;;;;ACGA;;KMMY,mBAAA;;ELFZ,SAAa,GAAA,EKIE,ULJF;EAoBb,SAAY,iBAAA,EAAA,MAAgC;;;;AC1B5C;;;;ACMA;AA0BA;;KGTY,qBAAA;qBACQ;EFxBpB,SAAY,WAAA,EEyBW,UFzBX,GAEK,IAAA;EAYjB,SAAY,UAAA,EAAA,MAAA,GAAA,
|
|
1
|
+
{"version":3,"file":"index.d.ts","names":[],"sources":["../src/C2paAssertion.ts","../src/C2paSignatureInfo.ts","../src/C2paManifest.ts","../src/C2paStatusCode.ts","../src/cose/CoseKeyJwk.ts","../src/LiveVideoStatusCode.ts","../src/bmff/BmffHashExclusion.ts","../src/merkle/MerkleSegmentValidation.ts","../src/init/InitSegmentValidation.ts","../src/init/validateC2paInitSegment.ts","../src/vsi/SequenceState.ts","../src/segment/SegmentValidation.ts","../src/segment/validateC2paSegment.ts","../src/manifestbox/ManifestBoxValidation.ts","../src/manifestbox/validateC2paManifestBoxSegment.ts","../src/merkle/validateC2paMerkleSegment.ts"],"sourcesContent":[],"mappings":"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"}
|