1313
1414/* eslint-disable @typescript-eslint/no-non-null-assertion */
1515
16- import { CallbackSigner } from "./Signer" ;
17- import { Reader } from "./Reader" ;
18- import { Builder } from "./Builder" ;
19- import {
20- IdentityAssertionBuilder ,
21- IdentityAssertionSigner ,
22- CallbackCredentialHolder ,
23- } from "./IdentityAssertion" ;
16+ // Note: We will dynamically import modules after establishing mocks
2417import type {
2518 JsCallbackSignerConfig ,
2619 DestinationBufferAsset ,
2720 SigningAlg ,
21+ SignerPayload ,
2822} from "./types" ;
2923import type { Manifest } from "@contentauth/c2pa-types" ;
3024import * as fs from "fs-extra" ;
3125import * as crypto from "crypto" ;
26+ import { encode } from "cbor2" ;
3227
3328class TestSigner {
3429 private privateKey : crypto . KeyObject ;
@@ -41,7 +36,19 @@ class TestSigner {
4136 }
4237
4338 sign = async ( bytes : Buffer ) : Promise < Buffer > => {
44- return crypto . sign ( null , bytes , this . privateKey ) ;
39+ const sign = crypto . createSign ( "SHA256" ) ;
40+ sign . update ( bytes ) ;
41+ sign . end ( ) ;
42+ return sign . sign ( this . privateKey ) ;
43+ } ;
44+ }
45+
46+ class TestCawgSigner {
47+ constructor ( private manifestSigner : TestSigner ) { }
48+
49+ sign = async ( payload : SignerPayload ) : Promise < Buffer > => {
50+ const cborBytes = Buffer . from ( encode ( payload ) ) ;
51+ return this . manifestSigner . sign ( cborBytes ) ;
4552 } ;
4653}
4754
@@ -103,17 +110,20 @@ describe("IdentityAssertionBuilder", () => {
103110 } ;
104111
105112 it ( "should build an Identity Assertion Signer" , async ( ) => {
113+ const { CallbackSigner } = await import ( "./Signer" ) ;
114+ const { Reader } = await import ( "./Reader" ) ;
115+ const { Builder } = await import ( "./Builder" ) ;
116+ const {
117+ IdentityAssertionBuilder,
118+ IdentityAssertionSigner,
119+ CallbackCredentialHolder,
120+ } = await import ( "./IdentityAssertion" ) ;
106121 // Read certificate files once
107122 const c2paPrivateKey = await fs . readFile (
108123 "./tests/fixtures/certs/es256.pem" ,
109124 ) ;
110125 const c2paPublicKey = await fs . readFile ( "./tests/fixtures/certs/es256.pub" ) ;
111- const cawgPrivateKey = await fs . readFile (
112- "./tests/fixtures/certs/ed25519.pem" ,
113- ) ;
114- const cawgPublicKey = await fs . readFile (
115- "./tests/fixtures/certs/ed25519.pub" ,
116- ) ;
126+ // Use the same signer for both C2PA manifest and COSE signing
117127
118128 // Create signer configurations
119129 const c2paConfig : JsCallbackSignerConfig = {
@@ -128,11 +138,11 @@ describe("IdentityAssertionBuilder", () => {
128138
129139 // Create signers
130140 const c2paTestSigner = new TestSigner ( c2paPrivateKey ) ;
131- const cawgTestSigner = new TestSigner ( cawgPrivateKey ) ;
132141 const c2paSigner = CallbackSigner . newSigner (
133142 c2paConfig ,
134143 c2paTestSigner . sign ,
135144 ) ;
145+ const cawgTestSigner = new TestCawgSigner ( c2paTestSigner ) ;
136146 const cawgSigner = CallbackCredentialHolder . newCallbackCredentialHolder (
137147 10000 ,
138148 "cawg.x509.cose" ,
@@ -164,13 +174,13 @@ describe("IdentityAssertionBuilder", () => {
164174 const iaSigner = IdentityAssertionSigner . new ( c2paSigner . signer ( ) ) ;
165175 const iab =
166176 await IdentityAssertionBuilder . identityBuilderForCredentialHolder (
167- cawgSigner . signer ( ) ,
177+ cawgSigner ,
168178 ) ;
169179 iab . addReferencedAssertions ( [ "cawg.training-mining" ] ) ;
170180 iaSigner . addIdentityAssertion ( iab ) ;
171181
172182 // Sign the manifest (standard async flow)
173- await builder . signAsync ( iaSigner . signer ( ) , source , dest ) ;
183+ await builder . signAsync ( iaSigner , source , dest ) ;
174184
175185 // Verify the manifest
176186 const reader = await Reader . fromAsset ( {
0 commit comments