Skip to content

Commit 0262c27

Browse files
committed
fix: Retry Identity Workflow
1 parent 94bf7ce commit 0262c27

File tree

11 files changed

+249
-119
lines changed

11 files changed

+249
-119
lines changed

js-src/Builder.ts

Lines changed: 2 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -12,13 +12,13 @@
1212
// each license.
1313

1414
const neon = require("./index.node");
15-
import { IdentityAssertionSigner } from "./IdentityAssertion";
1615
import type {
1716
BuilderInterface,
1817
CallbackSignerInterface,
1918
ClaimVersion,
2019
DestinationAsset,
2120
FileAsset,
21+
IdentityAssertionSignerInterface,
2222
JsCallbackSignerConfig,
2323
LocalSignerInterface,
2424
ManifestAssertionKind,
@@ -142,7 +142,7 @@ export class Builder implements BuilderInterface {
142142
}
143143

144144
async signAsync(
145-
signer: CallbackSignerInterface,
145+
signer: CallbackSignerInterface | IdentityAssertionSignerInterface,
146146
input: SourceAsset,
147147
output: DestinationAsset,
148148
): Promise<Buffer> {
@@ -167,32 +167,6 @@ export class Builder implements BuilderInterface {
167167
});
168168
}
169169

170-
async identitySignAsync(
171-
signer: IdentityAssertionSigner,
172-
input: SourceAsset,
173-
output: DestinationAsset,
174-
): Promise<Buffer> {
175-
return neon.builderIdentitySignAsync
176-
.call(this.builder, signer.signer(), input, output)
177-
.then((result: Buffer | { manifest: Buffer; signedAsset: Buffer }) => {
178-
// output is a buffer and result is the manifest and the signed asset.
179-
if ("buffer" in output) {
180-
if ("signedAsset" in result && "manifest" in result) {
181-
output.buffer = result.signedAsset;
182-
return result.manifest;
183-
} else {
184-
throw new Error("Unexpected result for DestinationBuffer");
185-
}
186-
} else {
187-
// output is a file and result is the bytes of the manifest.
188-
return result as Buffer;
189-
}
190-
})
191-
.catch((error: Error) => {
192-
throw error;
193-
});
194-
}
195-
196170
getManifestDefinition(): Manifest {
197171
return JSON.parse(neon.builderManifestDefinition.call(this.builder));
198172
}

js-src/IdentityAssertion.spec.ts

Lines changed: 6 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ import { Builder } from "./Builder";
1919
import {
2020
IdentityAssertionBuilder,
2121
IdentityAssertionSigner,
22+
CallbackCredentialHolder,
2223
} from "./IdentityAssertion";
2324
import type {
2425
JsCallbackSignerConfig,
@@ -29,7 +30,6 @@ import type { Manifest } from "@contentauth/c2pa-types";
2930
import * as fs from "fs-extra";
3031
import * as crypto from "crypto";
3132

32-
// TODO: move to a separate test file
3333
class TestSigner {
3434
private privateKey: crypto.KeyObject;
3535

@@ -123,17 +123,7 @@ describe("IdentityAssertionBuilder", () => {
123123
tsaUrl: undefined,
124124
tsaHeaders: undefined,
125125
tsaBody: undefined,
126-
directCoseHandling: false,
127-
};
128-
129-
const cawgConfig: JsCallbackSignerConfig = {
130-
alg: "ed25519" as SigningAlg,
131-
certs: [cawgPublicKey],
132-
reserveSize: 10000,
133-
tsaUrl: undefined,
134-
tsaHeaders: undefined,
135-
tsaBody: undefined,
136-
directCoseHandling: false,
126+
directCoseHandling: true,
137127
};
138128

139129
// Create signers
@@ -143,8 +133,9 @@ describe("IdentityAssertionBuilder", () => {
143133
c2paConfig,
144134
c2paTestSigner.sign,
145135
);
146-
const cawgSigner = CallbackSigner.newSigner(
147-
cawgConfig,
136+
const cawgSigner = CallbackCredentialHolder.newCallbackCredentialHolder(
137+
10000,
138+
"cawg.x509.cose",
148139
cawgTestSigner.sign,
149140
);
150141

@@ -179,7 +170,7 @@ describe("IdentityAssertionBuilder", () => {
179170
iaSigner.addIdentityAssertion(iab);
180171

181172
// Sign the manifest (standard async flow)
182-
await builder.signAsync(iaSigner, source, dest);
173+
await builder.signAsync(iaSigner.signer(), source, dest);
183174

184175
// Verify the manifest
185176
const reader = await Reader.fromAsset({

js-src/IdentityAssertion.ts

Lines changed: 47 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,9 +13,11 @@
1313

1414
const neon = require("./index.node");
1515
import type {
16+
CallbackCredentialHolderInterface,
1617
CallbackSignerInterface,
1718
IdentityAssertionBuilderInterface,
1819
IdentityAssertionSignerInterface,
20+
SignerPayload,
1921
} from "./types";
2022

2123
export class IdentityAssertionBuilder
@@ -24,7 +26,7 @@ export class IdentityAssertionBuilder
2426
constructor(private _builder: IdentityAssertionBuilderInterface) {}
2527

2628
static async identityBuilderForCredentialHolder(
27-
credentialHolder: CallbackSignerInterface,
29+
credentialHolder: CallbackCredentialHolderInterface,
2830
): Promise<IdentityAssertionBuilder> {
2931
const builder = neon.identityBuilderForCredentialHolder(
3032
credentialHolder.signer(),
@@ -71,3 +73,47 @@ export class IdentityAssertionSigner
7173
return this._signer;
7274
}
7375
}
76+
77+
export class CallbackCredentialHolder
78+
implements CallbackCredentialHolderInterface
79+
{
80+
constructor(
81+
private callbackCredentialHolder: CallbackCredentialHolderInterface,
82+
) {}
83+
84+
signer(): CallbackCredentialHolderInterface {
85+
return this.callbackCredentialHolder;
86+
}
87+
88+
static newCallbackCredentialHolder(
89+
reserveSize: number,
90+
sigType: string,
91+
callback: (signerPayload: SignerPayload) => Promise<Buffer>,
92+
) {
93+
const credentialHolder = neon.newCallbackCredentialHolder(
94+
reserveSize,
95+
sigType,
96+
callback,
97+
);
98+
return new CallbackCredentialHolder(credentialHolder);
99+
}
100+
101+
async sign(payload: SignerPayload): Promise<Buffer> {
102+
return neon.callbackSignerSignPayload.call(
103+
this.callbackCredentialHolder,
104+
payload,
105+
);
106+
}
107+
108+
reserveSize(): number {
109+
return neon.callbackCredentialHolderReserveSize.call(
110+
this.callbackCredentialHolder,
111+
);
112+
}
113+
114+
sigType(): string {
115+
return neon.callbackCredentialHolderSigType.call(
116+
this.callbackCredentialHolder,
117+
);
118+
}
119+
}

js-src/Signer.ts

Lines changed: 0 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -14,10 +14,8 @@
1414
const neon = require("./index.node");
1515
import type {
1616
CallbackSignerInterface,
17-
CallbackCredentialHolderInterface,
1817
JsCallbackSignerConfig,
1918
LocalSignerInterface,
20-
SignerPayload,
2119
SigningAlg,
2220
} from "./types";
2321

@@ -101,40 +99,3 @@ export class CallbackSigner implements CallbackSignerInterface {
10199
return neon.callbackSignerTimeAuthorityUrl.call(this.callbackSigner);
102100
}
103101
}
104-
105-
export class CallbackCredentialHolder
106-
implements CallbackCredentialHolderInterface
107-
{
108-
constructor(
109-
private callbackCredentialHolder: CallbackSignerInterface,
110-
) {}
111-
112-
signer(): CallbackSignerInterface {
113-
return this.callbackCredentialHolder;
114-
}
115-
116-
static newSigner(
117-
config: JsCallbackSignerConfig,
118-
callback: (data: Buffer) => Promise<Buffer>,
119-
) {
120-
// Convert the config object to a JsBox<CallbackSignerConfig>
121-
const configBox = neon.callbackSignerConfigFromJs(config);
122-
const signer = neon.callbackSignerFromConfig(configBox, callback);
123-
return new CallbackCredentialHolder(signer);
124-
}
125-
126-
async sign(payload: SignerPayload): Promise<Buffer> {
127-
return neon.callbackSignerSignPayload.call(
128-
this.callbackCredentialHolder,
129-
payload,
130-
);
131-
}
132-
133-
reserveSize(): number {
134-
return neon.callbackSignerReserveSize.call(this.callbackCredentialHolder);
135-
}
136-
137-
sigType(): string {
138-
return "cawg.x509.cose";
139-
}
140-
}

js-src/index.node.d.ts

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -131,12 +131,19 @@ declare module "index.node" {
131131
identityAssertionBuilder: IdentityAssertionBuilderInterface,
132132
): void;
133133
export function identityBuilderForCredentialHolder(
134-
credentialHolder: CallbackSignerInterface,
134+
credentialHolder: CallbackCredentialHolderInterface,
135135
): IdentityAssertionBuilderInterface;
136136
export function identityBuilderAddReferencedAssertions(
137-
referenced_assertions: Array<string>,
137+
referencedAssertions: Array<string>,
138138
): void;
139139
export function identityBuilderAddRoles(roles: Array<string>): void;
140+
export function newCallbackCredentialHolder(
141+
reserveSize: number,
142+
sigType: string,
143+
callback: (signerPayload: SignerPayload) => Promise<Buffer>,
144+
): CallbackCredentialHolderInterface;
145+
export function callbackCredentialHolderReserveSize(): number;
146+
export function callbackCredentialHolderSigType(): string;
140147

141148
// Trustmark
142149
export function trustmarkNew(

js-src/types.d.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -125,7 +125,7 @@ export interface CallbackCredentialHolderInterface {
125125
sigType(): string;
126126
reserveSize(): number;
127127
sign(payload: SignerPayload): Promise<Buffer>;
128-
signer(): CallbackSignerInterface;
128+
signer(): CallbackCredentialHolderInterface;
129129
}
130130

131131
/**
@@ -310,6 +310,8 @@ export interface IdentityAssertionSignerInterface {
310310
addIdentityAssertion(
311311
identityAssertionBuilder: IdentityAssertionBuilderInterface,
312312
): void;
313+
314+
signer(): IdentityAssertionSignerInterface;
313315
}
314316

315317
export interface IdentityAssertionBuilderInterface {

src/lib.rs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ mod settings;
2020
mod utils;
2121

2222
pub mod neon_builder;
23+
pub mod neon_credential_holder;
2324
pub mod neon_identity_assertion_builder;
2425
pub mod neon_identity_assertion_signer;
2526
pub mod neon_reader;
@@ -152,6 +153,10 @@ fn main(mut cx: ModuleContext) -> NeonResult<()> {
152153
"identityBuilderAddRoles",
153154
neon_identity_assertion_builder::NeonIdentityAssertionBuilder::add_roles,
154155
)?;
156+
cx.export_function(
157+
"callbackCredentialHolderFromConfig",
158+
neon_credential_holder::NeonCallbackCredentialHolder::from_js,
159+
)?;
155160

156161
// Trustmark
157162
cx.export_function(

0 commit comments

Comments
 (0)