{"version":3,"file":"KmsKeyPair.mjs","names":[],"sources":["../../src/crypto/KmsKeyPair.ts"],"sourcesContent":["import { AgentContext } from '../agent'\nimport { CredoError } from '../error'\nimport { VerificationMethod } from '../modules/dids'\nimport { getPublicJwkFromVerificationMethod } from '../modules/dids/domain/key-type/keyDidMapping'\nimport { KeyManagementApi, PublicJwk } from '../modules/kms'\nimport type { LdKeyPairOptions } from '../modules/vc/linked-data-proofs/models/LdKeyPair'\nimport { LdKeyPair } from '../modules/vc/linked-data-proofs/models/LdKeyPair'\nimport { JsonTransformer, MessageValidator } from '../utils'\n\ninterface KmsKeyPairOptions extends LdKeyPairOptions {\n  publicJwk: PublicJwk\n}\n\nexport function createKmsKeyPairClass(agentContext: AgentContext) {\n  return class KmsKeyPair extends LdKeyPair {\n    public publicJwk: PublicJwk\n    public type = 'KmsKeyPair'\n\n    public constructor(options: KmsKeyPairOptions) {\n      super(options)\n      this.publicJwk = options.publicJwk\n    }\n\n    public static async generate(): Promise<KmsKeyPair> {\n      throw new Error('Not implemented')\n    }\n\n    public fingerprint(): string {\n      throw new Error('Method not implemented.')\n    }\n\n    public verifyFingerprint(_fingerprint: string): boolean {\n      throw new Error('Method not implemented.')\n    }\n\n    public static async from(verificationMethod: VerificationMethod): Promise<KmsKeyPair> {\n      const vMethod = JsonTransformer.fromJSON(verificationMethod, VerificationMethod)\n      MessageValidator.validateSync(vMethod)\n      const publicJwk = getPublicJwkFromVerificationMethod(vMethod)\n\n      return new KmsKeyPair({\n        id: vMethod.id,\n        controller: vMethod.controller,\n        publicJwk,\n      })\n    }\n\n    /**\n     * This method returns a wrapped wallet.sign method. The method is being wrapped so we can covert between Uint8Array and Buffer. This is to make it compatible with the external signature libraries.\n     */\n    public signer(): { sign: (data: { data: Uint8Array | Uint8Array[] }) => Promise<Uint8Array> } {\n      // wrap function for conversion\n      const wrappedSign = async (data: { data: Uint8Array | Uint8Array[] }): Promise<Uint8Array> => {\n        if (Array.isArray(data.data)) {\n          throw new CredoError('Signing array of data entries is not supported')\n        }\n        const kms = agentContext.dependencyManager.resolve(KeyManagementApi)\n\n        const result = await kms.sign({\n          data: data.data,\n          keyId: this.publicJwk.keyId,\n          algorithm: this.publicJwk.signatureAlgorithm,\n        })\n\n        return result.signature\n      }\n\n      return {\n        sign: wrappedSign.bind(this),\n      }\n    }\n\n    /**\n     * This method returns a wrapped wallet.verify method. The method is being wrapped so we can covert between Uint8Array and Buffer. This is to make it compatible with the external signature libraries.\n     */\n    public verifier(): {\n      verify: (data: { data: Uint8Array | Uint8Array[]; signature: Uint8Array }) => Promise<boolean>\n    } {\n      const wrappedVerify = async (data: {\n        data: Uint8Array | Uint8Array[]\n        signature: Uint8Array\n      }): Promise<boolean> => {\n        if (Array.isArray(data.data)) {\n          throw new CredoError('Verifying array of data entries is not supported')\n        }\n        const kms = agentContext.dependencyManager.resolve(KeyManagementApi)\n\n        const { verified } = await kms.verify({\n          data: data.data,\n          signature: data.signature,\n          key: {\n            publicJwk: this.publicJwk.toJson(),\n          },\n          algorithm: this.publicJwk.signatureAlgorithm,\n        })\n\n        return verified\n      }\n      return {\n        verify: wrappedVerify.bind(this),\n      }\n    }\n\n    public get publicKeyBuffer(): Uint8Array {\n      const publicKey = this.publicJwk.publicKey\n\n      if (publicKey.kty === 'RSA') {\n        throw new CredoError(`kty 'RSA' not supported for publicKeyBuffer`)\n      }\n\n      return publicKey.publicKey\n    }\n  }\n}\n"],"mappings":";;;;;;;;;;;;;AAaA,SAAgB,sBAAsB,cAA4B;CAChE,OAAO,MAAM,mBAAmB,UAAU;EAIxC,YAAmB,SAA4B;GAC7C,MAAM,OAAO;GAHf,KAAO,OAAO;GAIZ,KAAK,YAAY,QAAQ;EAC3B;EAEA,aAAoB,WAAgC;GAClD,MAAM,IAAI,MAAM,iBAAiB;EACnC;EAEA,cAA6B;GAC3B,MAAM,IAAI,MAAM,yBAAyB;EAC3C;EAEA,kBAAyB,cAA+B;GACtD,MAAM,IAAI,MAAM,yBAAyB;EAC3C;EAEA,aAAoB,KAAK,oBAA6D;GACpF,MAAM,UAAU,gBAAgB,SAAS,oBAAoB,kBAAkB;GAC/E,iBAAiB,aAAa,OAAO;GACrC,MAAM,YAAY,mCAAmC,OAAO;GAE5D,OAAO,IAAI,WAAW;IACpB,IAAI,QAAQ;IACZ,YAAY,QAAQ;IACpB;GACF,CAAC;EACH;;;;EAKA,SAA8F;GAE5F,MAAM,cAAc,OAAO,SAAmE;IAC5F,IAAI,MAAM,QAAQ,KAAK,IAAI,GACzB,MAAM,IAAI,WAAW,gDAAgD;IAUvE,QAAO,MARK,aAAa,kBAAkB,QAAQ,gBAE5B,CAAC,CAAC,KAAK;KAC5B,MAAM,KAAK;KACX,OAAO,KAAK,UAAU;KACtB,WAAW,KAAK,UAAU;IAC5B,CAAC,EAAA,CAEa;GAChB;GAEA,OAAO,EACL,MAAM,YAAY,KAAK,IAAI,EAC7B;EACF;;;;EAKA,WAEE;GACA,MAAM,gBAAgB,OAAO,SAGL;IACtB,IAAI,MAAM,QAAQ,KAAK,IAAI,GACzB,MAAM,IAAI,WAAW,kDAAkD;IAIzE,MAAM,EAAE,aAAa,MAFT,aAAa,kBAAkB,QAAQ,gBAEtB,CAAC,CAAC,OAAO;KACpC,MAAM,KAAK;KACX,WAAW,KAAK;KAChB,KAAK,EACH,WAAW,KAAK,UAAU,OAAO,EACnC;KACA,WAAW,KAAK,UAAU;IAC5B,CAAC;IAED,OAAO;GACT;GACA,OAAO,EACL,QAAQ,cAAc,KAAK,IAAI,EACjC;EACF;EAEA,IAAW,kBAA8B;GACvC,MAAM,YAAY,KAAK,UAAU;GAEjC,IAAI,UAAU,QAAQ,OACpB,MAAM,IAAI,WAAW,6CAA6C;GAGpE,OAAO,UAAU;EACnB;CACF;AACF"}