Skip to content

Commit d156ab6

Browse files
committed
feat: encryption and decryption schema typing
1 parent bf0ea0b commit d156ab6

File tree

4 files changed

+129
-64
lines changed

4 files changed

+129
-64
lines changed

packages/lit-node-client-nodejs/src/lib/lit-node-client-nodejs.ts

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -64,11 +64,11 @@ import {
6464
} from '@lit-protocol/misc-browser';
6565
import { nacl } from '@lit-protocol/nacl';
6666
import { LitNodeClientConfigSchema } from '@lit-protocol/schemas';
67+
import { ILitResource, ISessionCapabilityObject } from '@lit-protocol/types';
6768
import {
6869
uint8arrayFromString,
6970
uint8arrayToString,
7071
} from '@lit-protocol/uint8arrays';
71-
import { ILitResource, ISessionCapabilityObject } from '@lit-protocol/types';
7272

7373
import { encodeCode } from './helpers/encode-code';
7474
import { getBlsSignatures } from './helpers/get-bls-signatures';
@@ -1441,8 +1441,7 @@ export class LitNodeClientNodeJs
14411441
*
14421442
*/
14431443
decrypt = async (params: DecryptRequest): Promise<DecryptResponse> => {
1444-
const { sessionSigs, authSig, chain, ciphertext, dataToEncryptHash } =
1445-
params;
1444+
const { chain, ciphertext, dataToEncryptHash } = params;
14461445

14471446
// ========== Validate Params ==========
14481447
// -- validate if it's ready
@@ -1527,7 +1526,8 @@ export class LitNodeClientNodeJs
15271526
const requestId = this._getNewRequestId();
15281527
const nodePromises = this.getNodePromises((url: string) => {
15291528
// -- if session key is available, use it
1530-
const authSigToSend = sessionSigs ? sessionSigs[url] : authSig;
1529+
const authSigToSend =
1530+
'sessionSigs' in params ? params.sessionSigs[url] : params.authSig;
15311531

15321532
if (!authSigToSend) {
15331533
throw new InvalidArgumentException(
@@ -1794,7 +1794,7 @@ export class LitNodeClientNodeJs
17941794

17951795
// ========== Extract shares from response data ==========
17961796
// -- 1. combine signed data as a list, and get the signatures from it
1797-
let curveType = responseData[0]?.curveType;
1797+
const curveType = responseData[0]?.curveType;
17981798

17991799
if (curveType === 'ECDSA') {
18001800
throw new Error(

packages/misc/src/lib/params-validators.ts

Lines changed: 22 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -30,9 +30,9 @@ import {
3030
EvmContractConditions,
3131
GetSignedTokenRequest,
3232
JsonExecutionSdkParams,
33-
SessionSigsOrAuthSig,
3433
SolRpcConditions,
3534
UnifiedAccessControlConditions,
35+
ChainedSessionSigsOrAuthSig,
3636
} from '@lit-protocol/types';
3737

3838
import { checkIfAuthSigRequiresChainParam, checkType, is, log } from './misc';
@@ -456,9 +456,7 @@ class FileValidator implements ParamsValidator {
456456
}
457457
}
458458

459-
export interface AuthMaterialValidatorProps extends SessionSigsOrAuthSig {
460-
chain?: string;
461-
}
459+
export type AuthMaterialValidatorProps = ChainedSessionSigsOrAuthSig;
462460

463461
class AuthMaterialValidator implements ParamsValidator {
464462
private readonly fnName: string;
@@ -476,15 +474,16 @@ class AuthMaterialValidator implements ParamsValidator {
476474
}
477475

478476
validate(): IEither<void> {
479-
const { authSig, sessionSigs } = this.authMaterial;
480-
481-
if (authSig && !is(authSig, 'Object', 'authSig', this.fnName))
477+
if (
478+
'authSig' in this.authMaterial &&
479+
!is(this.authMaterial.authSig, 'Object', 'authSig', this.fnName)
480+
)
482481
return ELeft(
483482
new InvalidParamType(
484483
{
485484
info: {
486485
param: 'authSig',
487-
value: authSig,
486+
value: this.authMaterial.authSig,
488487
functionName: this.fnName,
489488
},
490489
},
@@ -507,9 +506,9 @@ class AuthMaterialValidator implements ParamsValidator {
507506
);
508507

509508
if (
510-
authSig &&
509+
'authSig' in this.authMaterial &&
511510
!checkIfAuthSigRequiresChainParam(
512-
authSig,
511+
this.authMaterial.authSig,
513512
this.authMaterial.chain,
514513
this.fnName
515514
)
@@ -519,7 +518,7 @@ class AuthMaterialValidator implements ParamsValidator {
519518
{
520519
info: {
521520
param: 'authSig',
522-
value: authSig,
521+
value: this.authMaterial.authSig,
523522
functionName: this.fnName,
524523
},
525524
},
@@ -528,43 +527,47 @@ class AuthMaterialValidator implements ParamsValidator {
528527
);
529528
}
530529

531-
if (sessionSigs && !is(sessionSigs, 'Object', 'sessionSigs', this.fnName))
530+
if (
531+
'sessionSigs' in this.authMaterial &&
532+
!is(this.authMaterial.sessionSigs, 'Object', 'sessionSigs', this.fnName)
533+
)
532534
return ELeft(
533535
new InvalidParamType(
534536
{
535537
info: {
536538
param: 'sessionSigs',
537-
value: sessionSigs,
539+
value: this.authMaterial.sessionSigs,
538540
functionName: this.fnName,
539541
},
540542
},
541543
'sessionSigs is not an object'
542544
)
543545
);
544546

545-
if (!sessionSigs && !authSig)
547+
if (
548+
!('sessionSigs' in this.authMaterial) &&
549+
!('authSig' in this.authMaterial)
550+
)
546551
return ELeft(
547552
new InvalidArgumentException(
548553
{
549554
info: {
550555
functionName: this.fnName,
551-
sessionSigs,
552-
authSig,
556+
authMaterial: this.authMaterial,
553557
},
554558
},
555559
'You must pass either authSig or sessionSigs'
556560
)
557561
);
558562

559563
// -- validate: if sessionSig and authSig exists
560-
if (sessionSigs && authSig)
564+
if ('sessionSigs' in this.authMaterial && 'authSig' in this.authMaterial)
561565
return ELeft(
562566
new InvalidArgumentException(
563567
{
564568
info: {
565569
functionName: this.fnName,
566-
sessionSigs,
567-
authSig,
570+
authMaterial: this.authMaterial,
568571
},
569572
},
570573
'You cannot have both authSig and sessionSigs'

packages/schemas/src/lib/schemas.ts

Lines changed: 85 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -669,39 +669,112 @@ export const EncryptSdkParamsSchema =
669669
});
670670

671671
/**
672-
* This interface is mainly used for access control conditions & decrypt requests.
672+
* These schemas are mainly used for access control conditions & decrypt requests.
673673
* For signing operations such as executeJs and pkpSign, only sessionSigs is used.
674674
*/
675-
export const SessionSigsOrAuthSigSchema = z.object({
676-
// TODO pretty sure this has to be one OR the other but at least one is required
675+
const SessionSigsAuthenticationSchema = z.object({
677676
/**
678677
* the session signatures to use to authorize the user with the nodes
679678
*/
680-
sessionSigs: SessionSigsSchema.optional(),
679+
sessionSigs: SessionSigsSchema,
680+
});
681+
const AuthSigAuthenticationSchema = z.object({
681682
/**
682683
* This is a bare authSig generated client side by the user. It can only be used for access control conditions/encrypt/decrypt operations. It CANNOT be used for signing operation.
683684
*/
684-
authSig: AuthSigSchema.optional(),
685+
authSig: AuthSigSchema,
685686
});
687+
export const SessionSigsOrAuthSigSchema = z.union([
688+
SessionSigsAuthenticationSchema,
689+
AuthSigAuthenticationSchema,
690+
]);
686691

687-
export const DecryptRequestBaseSchema = SessionSigsOrAuthSigSchema.merge(
688-
MultipleAccessControlConditionsSchema
689-
).extend({
692+
const ChainedSchema = z.object({
690693
/**
691-
* The chain name of the chain that this contract is deployed on. See LIT_CHAINS for currently supported chains.
694+
* The chain name of the chain that will be used. See LIT_CHAINS for currently supported chains.
692695
*/
693696
chain: ChainSchema,
694697
});
695698

696-
export const DecryptRequestSchema = EncryptResponseSchema.merge(
697-
DecryptRequestBaseSchema
698-
).extend({});
699+
export const ChainedSessionSigsOrAuthSigSchema = z.union([
700+
SessionSigsAuthenticationSchema.merge(ChainedSchema.partial()),
701+
AuthSigAuthenticationSchema.merge(ChainedSchema.partial()),
702+
]);
703+
704+
const ChainMultipleAccessControlConditionsSchema =
705+
MultipleAccessControlConditionsSchema.merge(ChainedSchema);
706+
const SessionSigsDecryptRequestBaseSchema =
707+
ChainMultipleAccessControlConditionsSchema.merge(
708+
SessionSigsAuthenticationSchema
709+
);
710+
const AuthSigDecryptRequestBaseSchema =
711+
ChainMultipleAccessControlConditionsSchema.merge(AuthSigAuthenticationSchema);
712+
export const DecryptRequestBaseSchema = z.union([
713+
SessionSigsDecryptRequestBaseSchema,
714+
AuthSigDecryptRequestBaseSchema,
715+
]);
716+
717+
export const DecryptRequestSchema = z.union([
718+
EncryptResponseSchema.merge(SessionSigsDecryptRequestBaseSchema),
719+
EncryptResponseSchema.merge(AuthSigDecryptRequestBaseSchema),
720+
]);
699721

700722
export const DecryptResponseSchema = z.object({
701723
// The decrypted data as a Uint8Array
702724
decryptedData: z.instanceof(Uint8Array),
703725
});
704726

727+
const EncryptRequestBaseSchema = z.object({
728+
// The data to encrypt as a Uint8Array
729+
dataToEncrypt: z.instanceof(Uint8Array),
730+
});
731+
const SessionSigsEncryptRequestBaseSchema = EncryptRequestBaseSchema.merge(
732+
SessionSigsDecryptRequestBaseSchema
733+
);
734+
const AuthSigEncryptRequestBaseSchema = EncryptRequestBaseSchema.merge(
735+
AuthSigDecryptRequestBaseSchema
736+
);
737+
export const EncryptRequestSchema = z.union([
738+
SessionSigsEncryptRequestBaseSchema,
739+
AuthSigEncryptRequestBaseSchema,
740+
]);
741+
742+
export const EncryptUint8ArrayRequestSchema =
743+
MultipleAccessControlConditionsSchema.extend({
744+
/**
745+
* The uint8array that you wish to encrypt
746+
*/
747+
dataToEncrypt: z.instanceof(Uint8Array),
748+
});
749+
750+
export const EncryptStringRequestSchema =
751+
MultipleAccessControlConditionsSchema.extend({
752+
/**
753+
* The string that you wish to encrypt
754+
*/
755+
dataToEncrypt: z.string(),
756+
});
757+
758+
export const EncryptFileRequestSchema =
759+
MultipleAccessControlConditionsSchema.extend({
760+
file: z.union([z.instanceof(File), z.instanceof(Blob)]),
761+
});
762+
763+
const EncryptToJsonPayloadBaseSchema = z.object({
764+
ciphertext: z.string(),
765+
dataToEncryptHash: z.string(),
766+
dataType: z.enum(['string', 'file'] as const),
767+
});
768+
const SessionSigsEncryptToJsonPayloadSchema =
769+
EncryptToJsonPayloadBaseSchema.merge(SessionSigsDecryptRequestBaseSchema);
770+
const AuthSigEncryptToJsonPayloadSchema = EncryptToJsonPayloadBaseSchema.merge(
771+
AuthSigDecryptRequestBaseSchema
772+
);
773+
export const EncryptToJsonPayloadSchema = z.union([
774+
SessionSigsEncryptToJsonPayloadSchema,
775+
AuthSigEncryptToJsonPayloadSchema,
776+
]);
777+
705778
export const SuccessNodePromisesSchema = z.object({
706779
success: z.literal(true),
707780
values: z.array(z.any()), // TODO add back generics

packages/types/src/lib/interfaces.ts

Lines changed: 17 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,12 @@ import {
4545
JsonExecutionRequestSchema,
4646
NodeCommandResponseSchema,
4747
CallRequestSchema,
48+
EncryptUint8ArrayRequestSchema,
49+
EncryptRequestSchema,
50+
EncryptStringRequestSchema,
51+
EncryptFileRequestSchema,
52+
EncryptToJsonPayloadSchema,
53+
ChainedSessionSigsOrAuthSigSchema,
4854
} from '@lit-protocol/schemas';
4955

5056
import { ILitNodeClient } from './ILitNodeClient';
@@ -55,7 +61,6 @@ import {
5561
Chain,
5662
EvmContractConditions,
5763
IRelayAuthStatus,
58-
JsonRequest,
5964
ResponseStrategy,
6065
SolRpcConditions,
6166
SymmetricKey,
@@ -356,36 +361,26 @@ export interface JsonExecutionRequestTargetNode extends JsonExecutionRequest {
356361

357362
export type JsonExecutionRequest = z.infer<typeof JsonExecutionRequestSchema>;
358363

364+
export type ChainedSessionSigsOrAuthSig = z.infer<
365+
typeof ChainedSessionSigsOrAuthSigSchema
366+
>;
367+
359368
export type SessionSigsOrAuthSig = z.infer<typeof SessionSigsOrAuthSigSchema>;
360369

361370
export type DecryptRequestBase = z.infer<typeof DecryptRequestBaseSchema>;
362371
export type EncryptSdkParams = z.infer<typeof EncryptSdkParamsSchema>;
363372

364-
export interface EncryptRequest extends DecryptRequestBase {
365-
// The data that you wish to encrypt as a Uint8Array
366-
dataToEncrypt: Uint8Array;
367-
}
373+
export type EncryptRequest = z.infer<typeof EncryptRequestSchema>;
368374

369375
export type EncryptResponse = z.infer<typeof EncryptResponseSchema>;
370376

371-
export interface EncryptUint8ArrayRequest
372-
extends MultipleAccessControlConditions {
373-
/**
374-
* The uint8array that you wish to encrypt
375-
*/
376-
dataToEncrypt: Uint8Array;
377-
}
377+
export type EncryptUint8ArrayRequest = z.infer<
378+
typeof EncryptUint8ArrayRequestSchema
379+
>;
378380

379-
export interface EncryptStringRequest extends MultipleAccessControlConditions {
380-
/**
381-
* String that you wish to encrypt
382-
*/
383-
dataToEncrypt: string;
384-
}
381+
export type EncryptStringRequest = z.infer<typeof EncryptStringRequestSchema>;
385382

386-
export interface EncryptFileRequest extends DecryptRequestBase {
387-
file: AcceptedFileType;
388-
}
383+
export type EncryptFileRequest = z.infer<typeof EncryptFileRequestSchema>;
389384

390385
export type DecryptRequest = z.infer<typeof DecryptRequestSchema>;
391386

@@ -603,13 +598,7 @@ export interface EncryptToJsonProps extends MultipleAccessControlConditions {
603598
litNodeClient: ILitNodeClient;
604599
}
605600

606-
export type EncryptToJsonDataType = 'string' | 'file';
607-
608-
export interface EncryptToJsonPayload extends DecryptRequestBase {
609-
ciphertext: string;
610-
dataToEncryptHash: string;
611-
dataType: EncryptToJsonDataType;
612-
}
601+
export type EncryptToJsonPayload = z.infer<typeof EncryptToJsonPayloadSchema>;
613602

614603
export interface DecryptFromJsonProps {
615604
// the session signatures to use to authorize the user with the nodes

0 commit comments

Comments
 (0)