diff --git a/Cargo.lock b/Cargo.lock index 9bfac05..9258837 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -72,7 +72,7 @@ dependencies = [ "cfg-if", "once_cell", "version_check", - "zerocopy", + "zerocopy 0.7.35", ] [[package]] @@ -107,9 +107,9 @@ checksum = "4b46cbb362ab8752921c97e041f5e366ee6297bd428a31275b9fcf1e380f7299" [[package]] name = "anstyle" -version = "1.0.7" +version = "1.0.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "038dfcf04a5feb68e9c60b21c9625a54c2c0616e79b72b0fd87075a056ae1d1b" +checksum = "1bec1de6f59aedf83baf9ff929c98f2ad654b97c9510f4e70cf6f661d49fd5b1" [[package]] name = "anyhow" @@ -504,6 +504,17 @@ dependencies = [ "sha2 0.9.9", ] +[[package]] +name = "bstr" +version = "1.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "40723b8fb387abc38f4f4a37c09073622e41dd12327033091ef8950659e6dc0c" +dependencies = [ + "memchr", + "regex-automata", + "serde", +] + [[package]] name = "bumpalo" version = "3.16.0" @@ -527,14 +538,14 @@ dependencies = [ [[package]] name = "bytes" -version = "1.6.1" +version = "1.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a12916984aab3fa6e39d655a33e09c0071eb36d6ab3aea5c2d78551f1df6d952" +checksum = "fca2be1d5c43812bae364ee3f30b3afcb7877cf59f4aeb94c66f313a41d2fac9" [[package]] name = "c2pa" version = "0.32.7" -source = "git+https://github.com/vaultie/c2pa-rs#57260254ddef6f6c211cbd1e9c6e8dbaadd52d8d" +source = "git+https://github.com/vaultie/c2pa-rs#c63ef749919d637f695482788c6db44db84baf8e" dependencies = [ "asn1-rs", "async-generic", @@ -563,6 +574,7 @@ dependencies = [ "js-sys", "lazy_static", "log", + "lopdf", "memchr", "mp4", "multibase 0.9.1", @@ -647,9 +659,9 @@ dependencies = [ [[package]] name = "cc" -version = "1.1.6" +version = "1.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2aba8f4e9906c7ce3c73463f62a7f0c65183ada1a2d47e397cc8810827f9694f" +checksum = "26a5c3fd7bfa1ce3897a3a3501d362b2d87b7f2583ebcb4a949ec25911025cbc" [[package]] name = "cfg-if" @@ -749,18 +761,18 @@ dependencies = [ [[package]] name = "clap" -version = "4.5.10" +version = "4.5.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f6b81fb3c84f5563d509c59b5a48d935f689e993afa90fe39047f05adef9142" +checksum = "35723e6a11662c2afb578bcf0b88bf6ea8e21282a953428f240574fcc3a2b5b3" dependencies = [ "clap_builder", ] [[package]] name = "clap_builder" -version = "4.5.10" +version = "4.5.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ca6706fd5224857d9ac5eb9355f6683563cc0541c7cd9d014043b57cbec78ac" +checksum = "49eb96cbfa7cfa35017b7cd548c75b14c3118c98b423041d70562665e07fb0fa" dependencies = [ "anstyle", "clap_lex", @@ -768,9 +780,9 @@ dependencies = [ [[package]] name = "clap_lex" -version = "0.7.1" +version = "0.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4b82cf0babdbd58558212896d1a4272303a57bdb245c2bf1147185fb45640e70" +checksum = "1462739cb27611015575c0c11df5df7601141071f07518d56fcc1be504cbec97" [[package]] name = "clear_on_drop" @@ -810,7 +822,7 @@ dependencies = [ "rust-ini", "serde", "serde_json", - "toml 0.8.15", + "toml 0.8.17", ] [[package]] @@ -2474,6 +2486,12 @@ version = "0.2.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4ec2a862134d2a7d32d7983ddcdd1c4923530833c9f2ea1a44fc5fa473989058" +[[package]] +name = "linked-hash-map" +version = "0.5.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0717cef1bc8b636c6e1c1bbdefc09e6322da8a9321966e8928ef80d20f7f770f" + [[package]] name = "linux-raw-sys" version = "0.4.14" @@ -2518,6 +2536,35 @@ version = "0.4.22" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a7a70ba024b9dc04c27ea2f0c0548feb474ec5c54bba33a7f72f873a39d07b24" +[[package]] +name = "lopdf" +version = "0.33.0" +source = "git+https://github.com/vaultie/lopdf#948794f8e49972eb31ae07f8bbac876788657910" +dependencies = [ + "chrono", + "encoding_rs", + "flate2", + "indexmap 2.2.6", + "itoa", + "linked-hash-map", + "log", + "md-5", + "pom", + "rayon", + "time", + "weezl", +] + +[[package]] +name = "md-5" +version = "0.10.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d89e7ee0cfbedfc4da3340218492196241d89eefb6dab27de5df917a6d2e78cf" +dependencies = [ + "cfg-if", + "digest 0.10.7", +] + [[package]] name = "memchr" version = "2.7.4" @@ -3043,6 +3090,15 @@ dependencies = [ "universal-hash", ] +[[package]] +name = "pom" +version = "3.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c972d8f86e943ad532d0b04e8965a749ad1d18bb981a9c7b3ae72fe7fd7744b" +dependencies = [ + "bstr", +] + [[package]] name = "powerfmt" version = "0.2.0" @@ -3051,9 +3107,12 @@ checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" [[package]] name = "ppv-lite86" -version = "0.2.17" +version = "0.2.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de" +checksum = "dee4364d9f3b902ef14fab8a1ddffb783a1cb6b4bba3bfc1fa3922732c7de97f" +dependencies = [ + "zerocopy 0.6.6", +] [[package]] name = "pretty_dtoa" @@ -3737,21 +3796,22 @@ dependencies = [ [[package]] name = "serde_json" -version = "1.0.120" +version = "1.0.121" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4e0d21c9a8cae1235ad58a00c11cb40d4b1e5c784f1ef2c537876ed6ffd8b7c5" +checksum = "4ab380d7d9f22ef3f21ad3e6c1ebe8e4fc7a2000ccba2e4d71fc96f15b2cb609" dependencies = [ "indexmap 2.2.6", "itoa", + "memchr", "ryu", "serde", ] [[package]] name = "serde_spanned" -version = "0.6.6" +version = "0.6.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "79e674e01f999af37c49f70a6ede167a8a60b2503e56c5599532a65baa5969a0" +checksum = "eb5b1b31579f3811bf615c144393417496f152e12ac8b7663bf664f4a815306d" dependencies = [ "serde", ] @@ -4553,9 +4613,9 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "tokio" -version = "1.39.1" +version = "1.39.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d040ac2b29ab03b09d4129c2f5bbd012a3ac2f79d38ff506a4bf8dd34b0eac8a" +checksum = "daa4fb1bc778bd6f04cbfc4bb2d06a7396a8f299dc33ea1900cedaa316f467b1" dependencies = [ "backtrace", "bytes", @@ -4612,9 +4672,9 @@ dependencies = [ [[package]] name = "toml" -version = "0.8.15" +version = "0.8.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ac2caab0bf757388c6c0ae23b3293fdb463fee59434529014f85e3263b995c28" +checksum = "7a44eede9b727419af8095cb2d72fab15487a541f54647ad4414b34096ee4631" dependencies = [ "serde", "serde_spanned", @@ -4624,18 +4684,18 @@ dependencies = [ [[package]] name = "toml_datetime" -version = "0.6.6" +version = "0.6.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4badfd56924ae69bcc9039335b2e017639ce3f9b001c393c1b2d1ef846ce2cbf" +checksum = "0dd7358ecb8fc2f8d014bf86f6f638ce72ba252a2c3a2572f2a795f1d23efb41" dependencies = [ "serde", ] [[package]] name = "toml_edit" -version = "0.22.16" +version = "0.22.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "278f3d518e152219c994ce877758516bca5e118eaed6996192a774fb9fbf0788" +checksum = "1490595c74d930da779e944f5ba2ecdf538af67df1a9848cbd156af43c1b7cf0" dependencies = [ "indexmap 2.2.6", "serde", @@ -4827,9 +4887,9 @@ dependencies = [ [[package]] name = "version_check" -version = "0.9.4" +version = "0.9.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" +checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" [[package]] name = "walkdir" @@ -4947,6 +5007,12 @@ dependencies = [ "rustls-pki-types", ] +[[package]] +name = "weezl" +version = "0.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "53a85b86a771b1c87058196170769dd264f66c0782acf1ae6cc51bfd64b39082" + [[package]] name = "winapi" version = "0.3.9" @@ -5128,9 +5194,9 @@ checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" [[package]] name = "winnow" -version = "0.6.15" +version = "0.6.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "557404e450152cd6795bb558bca69e43c585055f4606e3bcae5894fc6dac9ba0" +checksum = "b480ae9340fc261e6be3e95a1ba86d54ae3f9171132a73ce8d4bbaf68339507c" dependencies = [ "memchr", ] @@ -5206,13 +5272,34 @@ dependencies = [ "time", ] +[[package]] +name = "zerocopy" +version = "0.6.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "854e949ac82d619ee9a14c66a1b674ac730422372ccb759ce0c39cabcf2bf8e6" +dependencies = [ + "byteorder", + "zerocopy-derive 0.6.6", +] + [[package]] name = "zerocopy" version = "0.7.35" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1b9b4fd18abc82b8136838da5d50bae7bdea537c574d8dc1a34ed098d6c166f0" dependencies = [ - "zerocopy-derive", + "zerocopy-derive 0.7.35", +] + +[[package]] +name = "zerocopy-derive" +version = "0.6.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "125139de3f6b9d625c39e2efdd73d41bdac468ccd556556440e322be0e1bbd91" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.72", ] [[package]] diff --git a/crates/teddybear-c2pa/Cargo.toml b/crates/teddybear-c2pa/Cargo.toml index 96e48fc..6785904 100644 --- a/crates/teddybear-c2pa/Cargo.toml +++ b/crates/teddybear-c2pa/Cargo.toml @@ -7,5 +7,5 @@ repository.workspace = true categories.workspace = true [dependencies] -c2pa = { git = "https://github.com/vaultie/c2pa-rs", features = ["unstable_api"] } +c2pa = { git = "https://github.com/vaultie/c2pa-rs", features = ["pdf", "unstable_api"] } ed25519-dalek = { workspace = true } diff --git a/nix/data/blank.pdf b/nix/data/blank.pdf new file mode 100644 index 0000000..8be670a Binary files /dev/null and b/nix/data/blank.pdf differ diff --git a/nix/node-testing.nix b/nix/node-testing.nix index aebddd6..258f86f 100644 --- a/nix/node-testing.nix +++ b/nix/node-testing.nix @@ -31,6 +31,8 @@ stdenvNoCC.mkDerivation { hash = "sha256-tpipFiATKzL4Q7dtB+0wLygdDPoAp5bF6X095Xk++GI="; }; + placeholderPdf = ./data/blank.pdf; + certificate = ./data/crt.der; postPatch = '' diff --git a/tests/src/c2pa.test.ts b/tests/src/c2pa.test.ts index 448a8b2..edcfd1c 100644 --- a/tests/src/c2pa.test.ts +++ b/tests/src/c2pa.test.ts @@ -3,17 +3,40 @@ import { readFileSync } from 'fs' import { describe, it } from 'vitest' const image = readFileSync(process.env.placeholderImage!) +const pdf = readFileSync(process.env.placeholderPdf!) const certificate = readFileSync(process.env.certificate!) describe('can execute C2PA operations', () => { - it('can sign a C2PA manifest', async () => { + it('can sign an image', async () => { // This key should correspond to the certificate private key const keyBytes = Buffer.from('5ff5e2393a44256abe197c82742366ff2f998f6822980e726f8fd16d6bd07eb1', 'hex') const key = await PrivateEd25519.fromBytes(new Uint8Array(keyBytes)) key.embedC2PAManifest(new Uint8Array(certificate), new Uint8Array(image), 'image/jpeg', { - title: 'Hello World', + title: 'Test Image', + assertions: [ + { + label: 'stds.schema-org.CreativeWork', + data: { + '@context': 'http://schema.org/', + '@type': 'CreativeWork', + url: 'https://example.com' + }, + kind: 'Json' + } + ] + }) + }) + + it('can sign a PDF file', async () => { + // This key should correspond to the certificate private key + const keyBytes = Buffer.from('5ff5e2393a44256abe197c82742366ff2f998f6822980e726f8fd16d6bd07eb1', 'hex') + + const key = await PrivateEd25519.fromBytes(new Uint8Array(keyBytes)) + + key.embedC2PAManifest(new Uint8Array(certificate), new Uint8Array(pdf), 'application/pdf', { + title: 'Test PDF', assertions: [ { label: 'stds.schema-org.CreativeWork', @@ -24,9 +47,6 @@ describe('can execute C2PA operations', () => { }, kind: 'Json' } - ], - claim_generator_info: [ - { name: 'Teddybear' } ] }) })