@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
113 lines (93 loc) • 3.6 kB
text/typescript
import { CredentialPayload, DIDDocument, IAgentContext, IKey, PresentationPayload, TKeyType, VerifiableCredential } from '@veramo/core'
import { RequiredAgentMethods } from '@sphereon/ssi-sdk-vc-handler-ld-local'
import { SphereonLdSignature } from '@sphereon/ssi-sdk-vc-handler-ld-local/dist/ld-suites'
import * as u8a from 'uint8arrays'
import { encodeJoseBlob } from '@veramo/utils'
import { JsonWebKey } from './gx-impl/JsonWebKeyWithRSASupport'
import { JsonWebSignature } from './gx-impl/JsonWebSignatureWithRSASupport'
/**
* 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
*/
export class GXJsonWebSignature2020 extends SphereonLdSignature {
getSupportedVerificationType(): 'JsonWebKey2020' {
return 'JsonWebKey2020'
}
getSupportedVeramoKeyType(): TKeyType {
return 'RSA'
}
async getSuiteForSigning(key: IKey, issuerDid: string, verificationMethodId: string, context: IAgentContext<RequiredAgentMethods>): Promise<any> {
const controller = issuerDid
// DID Key ID
let id = verificationMethodId
const alg = 'RS256'
const signer = {
// returns a JWS detached
sign: async (args: { data: string }): Promise<string> => {
const header = {
alg,
b64: false,
crit: ['b64'],
}
const headerString = encodeJoseBlob(header)
const dataBuffer = u8a.fromString(args.data, 'utf-8')
const messageBuffer = u8a.concat([u8a.fromString(`${headerString}.`, 'utf-8'), dataBuffer])
const messageString = u8a.toString(messageBuffer, 'base64') //will be decoded to bytes in the keyManagerSign, hence the base64 arg to the method below
const signature = await context.agent.keyManagerSign({
keyRef: key.kid,
algorithm: alg,
data: messageString,
encoding: 'base64',
}) // returns base64url signature
return `${headerString}..${signature}`
},
}
const publicKeyJwk = key.meta?.publicKeyJwk
? key.meta.publicKeyJwk
: {
kty: 'OKP',
crv: 'Ed25519',
x: u8a.toString(u8a.fromString(key.publicKeyHex, 'hex'), 'base64url'),
}
const verificationKey = await JsonWebKey.from(
{
id: id,
type: this.getSupportedVerificationType(),
controller: controller,
publicKeyJwk,
},
{ signer, verifier: false }
)
// verificationKey.signer = () => signer
const suite = new JsonWebSignature({
key: verificationKey,
})
return suite
}
getSuiteForVerification(): any {
const verifier = {
// returns a JWS detached
verify: async (args: { data: Uint8Array; signature: Uint8Array }): Promise<boolean> => {
return true
},
}
return new JsonWebSignature({ verifier })
}
preSigningCredModification(credential: CredentialPayload): void {
// do nothing
}
preSigningPresModification(presentation: PresentationPayload): void {
// do nothing
}
preDidResolutionModification(didUrl: string, didDoc: DIDDocument): void {
// do nothing
}
getContext(): string {
return 'https://w3id.org/security/suites/jws-2020/v1'
}
preVerificationCredModification(credential: VerifiableCredential): void {
// do nothing
}
}