Skip to content

Commit 518276c

Browse files
committed
feat: upgrade tdf clients to rewrap v2 proto structure
1 parent 688c304 commit 518276c

File tree

3 files changed

+64
-14
lines changed

3 files changed

+64
-14
lines changed

lib/src/nanotdf/Client.ts

Lines changed: 22 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
1-
import * as base64 from '../encodings/base64.js';
1+
import { create, toJsonString } from '@bufbuild/protobuf';
2+
import { UnsignedRewrapRequest_WithPolicyRequestSchema, UnsignedRewrapRequestSchema } from '../platform/kas/kas_pb.js';
23
import { generateKeyPair, keyAgreement } from '../nanotdf-crypto/index.js';
34
import getHkdfSalt from './helpers/getHkdfSalt.js';
45
import DefaultParams from './models/DefaultParams.js';
@@ -246,18 +247,29 @@ export default class Client {
246247
throw new ConfigurationError('Signer key has not been set or generated');
247248
}
248249

249-
const requestBodyStr = JSON.stringify({
250-
algorithm: DefaultParams.defaultECAlgorithm,
251-
// nano keyAccess minimum, header is used for nano
252-
keyAccess: {
253-
type: Client.KEY_ACCESS_REMOTE,
254-
url: '',
255-
protocol: Client.KAS_PROTOCOL,
256-
header: base64.encodeArrayBuffer(nanoTdfHeader),
257-
},
250+
const unsignedRequest = create(UnsignedRewrapRequestSchema, {
258251
clientPublicKey: await cryptoPublicToPem(ephemeralKeyPair.publicKey),
252+
requests: [
253+
create(UnsignedRewrapRequest_WithPolicyRequestSchema, {
254+
keyAccessObjects: [
255+
{
256+
keyAccessObjectId: 'kao-0',
257+
keyAccessObject: {
258+
header: new Uint8Array(nanoTdfHeader),
259+
kasUrl: '',
260+
protocol: Client.KAS_PROTOCOL,
261+
// type: Client.KEY_ACCESS_REMOTE,
262+
},
263+
},
264+
],
265+
algorithm: DefaultParams.defaultECAlgorithm,
266+
// policy in nano is present within the header?
267+
}),
268+
],
259269
});
260270

271+
const requestBodyStr = toJsonString(UnsignedRewrapRequestSchema, unsignedRequest);
272+
261273
const jwtPayload = { requestBody: requestBodyStr };
262274

263275
const signedRequestToken = await reqSignature(jwtPayload, requestSignerKeyPair.privateKey, {

lib/tdf3/src/tdf.ts

Lines changed: 40 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,14 @@ import {
88
fetchWrappedKey,
99
publicKeyAlgorithmToJwa,
1010
} from '../../src/access.js';
11+
import { create, toJsonString } from '@bufbuild/protobuf';
12+
import {
13+
KeyAccessSchema,
14+
UnsignedRewrapRequestSchema,
15+
UnsignedRewrapRequest_WithPolicyRequestSchema,
16+
UnsignedRewrapRequest_WithPolicySchema,
17+
UnsignedRewrapRequest_WithKeyAccessObjectSchema,
18+
} from '../../src/platform/kas/kas_pb.js';
1119
import { type AuthProvider, reqSignature } from '../../src/auth/auth.js';
1220
import { allPool, anyPool } from '../../src/concurrency.js';
1321
import { base64, hex } from '../../src/encodings/index.js';
@@ -778,13 +786,41 @@ async function unwrapKey({
778786

779787
const clientPublicKey = ephemeralEncryptionKeys.publicKey;
780788

781-
const requestBodyStr = JSON.stringify({
782-
algorithm: 'RS256',
783-
keyAccess: keySplitInfo,
784-
policy: manifest.encryptionInformation.policy,
789+
// TODO: how to handle defaults here?
790+
// Convert keySplitInfo to protobuf KeyAccess
791+
const keyAccessProto = create(KeyAccessSchema, {
792+
keyType: keySplitInfo.type || '',
793+
kasUrl: keySplitInfo.url || '',
794+
protocol: keySplitInfo.protocol || '',
795+
wrappedKey: keySplitInfo.wrappedKey ? new Uint8Array(base64.decodeArrayBuffer(keySplitInfo.wrappedKey)) : new Uint8Array(),
796+
policyBinding: keySplitInfo.policyBinding,
797+
kid: keySplitInfo.kid || '',
798+
splitId: keySplitInfo.sid || '',
799+
encryptedMetadata: keySplitInfo.encryptedMetadata || '',
800+
});
801+
802+
// Create the protobuf request
803+
const unsignedRequest = create(UnsignedRewrapRequestSchema, {
785804
clientPublicKey,
805+
requests: [
806+
create(UnsignedRewrapRequest_WithPolicyRequestSchema, {
807+
keyAccessObjects: [
808+
create(UnsignedRewrapRequest_WithKeyAccessObjectSchema, {
809+
keyAccessObjectId: 'kao-0',
810+
keyAccessObject: keyAccessProto,
811+
}),
812+
],
813+
policy: create(UnsignedRewrapRequest_WithPolicySchema, {
814+
id: 'policy-0',
815+
body: manifest.encryptionInformation.policy,
816+
}),
817+
algorithm: 'RS256',
818+
}),
819+
],
786820
});
787821

822+
const requestBodyStr = toJsonString(UnsignedRewrapRequestSchema, unsignedRequest);
823+
788824
const jwtPayload = { requestBody: requestBodyStr };
789825
const signedRequestToken = await reqSignature(jwtPayload, dpopKeys.privateKey);
790826

web-app/src/App.tsx

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -353,6 +353,7 @@ function App() {
353353
const client = new OpenTDF({
354354
authProvider: oidcClient,
355355
defaultCreateOptions: {
356+
attributes: ['https://demo.com/attr/classification/value/secret'],
356357
defaultKASEndpoint: c.kas,
357358
},
358359
dpopKeys: oidcClient.getSigningKey(),
@@ -432,6 +433,7 @@ function App() {
432433
const client = new OpenTDF({
433434
authProvider: oidcClient,
434435
defaultReadOptions: {
436+
// fulfillableObligationFQNs: ['https://demo.com/obl/drm/value/watermark'],
435437
allowedKASEndpoints: [c.kas],
436438
},
437439
dpopKeys: oidcClient.getSigningKey(),

0 commit comments

Comments
 (0)