UNPKG

@sphereon/gx-compliance-client

Version:

<!--suppress HtmlDeprecatedAttribute --> <h1 align="center"> <br> <a href="https://www.sphereon.com"><img src="https://sphereon.com/content/themes/sphereon/assets/img/logo.svg" alt="Sphereon" width="400"></a> <br>Gaia-X Compliance client (Typescript

91 lines (75 loc) 2.91 kB
import { JWS } from '@transmute/jose-ld' import { JsonWebKey2020, WebCryptoKey } from '@transmute/web-crypto-key-pair' export { JsonWebKey2020 } /** * WARNING: * * This suite is made specifically to be interoperable with Gaia-X. Do not use this suite for other purposes, as the current Gaia-X implementation contains multiple errors and does not conform to JsonWebSignature2020. * If you do need regular JsonWebSignature2020 support, please configure the SphereonWebSignature2020 class when setting up the agent */ const getKeyPairForKtyAndCrv = (kty: string, crv: string) => { if (kty === 'RSA') { return WebCryptoKey } throw new Error(`getKeyPairForKtyAndCrv does not support: ${kty} and ${crv}`) } const getKeyPairForType = (k: any) => { if (k.type === 'JsonWebKey2020') { return getKeyPairForKtyAndCrv(k.publicKeyJwk.kty, k.publicKeyJwk.crv) } if (k.type === 'RSAVerificationKey2018') { return WebCryptoKey } throw new Error('getKeyPairForType does not support type: ' + k.type) } const getVerifier = async (k: any, options = { detached: true }) => { const { publicKeyJwk } = await k.export({ type: 'JsonWebKey2020' }) const { kty } = publicKeyJwk if (kty === 'RSA') { // @ts-ignore return JWS.createVerifier(k.verifier('RSA'), 'RS256', options) } throw new Error(`getVerifier does not support ${JSON.stringify(publicKeyJwk, null, 2)}`) } const getSigner = async (k: any, options = { detached: true }) => { const { publicKeyJwk } = await k.export({ type: 'JsonWebKey2020' }) const { kty } = publicKeyJwk if (kty === 'RSA') { // @ts-ignore return JWS.createSigner(k.signer('RSA'), 'RS256', options) } throw new Error(`getSigner does not support ${JSON.stringify(publicKeyJwk, null, 2)}`) } const applyJwa = async (k: any, options?: any) => { const verifier = options?.verifier !== undefined ? options.verifier : await getVerifier(k, options) k.verifier = () => verifier as any if (k.privateKey || options?.signer !== undefined) { const signer = options?.signer !== undefined ? options.signer : await getSigner(k, options) k.signer = () => signer as any } return k } // this is dirty... const useJwa = async (k: any, options?: any) => { // before mutation, annotate the apply function.... k.useJwa = async (options?: any) => { return applyJwa(k, options) } return applyJwa(k, options) } export class JsonWebKey { public id!: string public type!: string public controller!: string static from = async (k: JsonWebKey2020, options: any = { detached: true }) => { const KeyPair = getKeyPairForType(k) const kp = await KeyPair.from(k as any) let { detached, header, signer, verifier } = options if (detached === undefined) { detached = true } return useJwa(kp, { detached, header, signer, verifier }) } public signer!: () => any public verifier!: () => any }