@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
75 lines (68 loc) • 3.13 kB
text/typescript
import { DIDDocument, IIdentifier, IService } from '@veramo/core'
import { ExportFileResult, GXRequiredContext, IImportDIDArg } from '../types'
import { privateKeyHexFromPEM, publicKeyHexFromPEM, x5cToPemCertChain } from '@sphereon/ssi-sdk-did-utils'
import { exportToDIDDocument } from '../utils'
import fs from 'fs'
import { TKeyType } from '@veramo/core/src/types/IIdentifier'
export class DID {
public static async createDIDFromX509(
{ domain, privateKeyPEM, certificatePEM, certificateChainPEM, certificateChainURL, kms, kid }: IImportDIDArg,
context: GXRequiredContext
): Promise<IIdentifier> {
const x509 = {
cn: domain,
certificatePEM,
certificateChainPEM,
privateKeyPEM,
certificateChainURL,
}
const privateKeyHex = privateKeyHexFromPEM(privateKeyPEM)
const meta = { x509 }
const kidResult = kid ? kid : publicKeyHexFromPEM(privateKeyPEM)
const controllerKeyId = kidResult //kid ? (kidResult.includes(domain) ? kidResult : `${domain}#${kid}`) : `${domain}#JWK2020-RSA`
return await context.agent.didManagerImport({
did: `did:web:${domain}`,
provider: 'did:web',
alias: domain,
keys: [{ kid: kid ? kid : kidResult, privateKeyHex, type: 'RSA' as TKeyType, meta, kms: kms ? kms : 'local' }],
controllerKeyId,
})
}
public static async exportDocument(
{ domain, services }: { domain: string; services?: IService[] },
context: GXRequiredContext
): Promise<DIDDocument> {
const id = await context.agent.didManagerGet({ did: `did:web:${domain}` })
return await exportToDIDDocument(id, { services })
}
public static async exportToPath(
{ domain, services, path }: { domain: string; path?: string; services?: IService[] },
context: GXRequiredContext
): Promise<ExportFileResult[]> {
const id = await context.agent.didManagerGet({ did: `did:web:${domain}` })
// we go through the agent from the context
const doc = await context.agent.exportDIDDocument({ domain, services })
const basePath = path ? `./${path.replace('.well-known', '')}/${domain}` : `./exported/${domain}`
const exports: ExportFileResult[] = []
const didPath = `${basePath}/.well-known/did.json`
exports.push({ file: 'did.json', path: didPath })
fs.mkdirSync(`${basePath}/.well-known`, { recursive: true })
fs.writeFileSync(didPath, JSON.stringify(doc, null, 2))
id.keys.forEach((key) => {
if (key.type !== ('RSA' as TKeyType)) {
return
}
if (key.meta?.x509?.x5u && key.meta?.x509?.x5c) {
const x5cPath = `${basePath}/${key.meta.x509.x5u.replace(/https?:\/\/[^/]+\//, '')}`
const file = x5cPath.split('\\').pop()!.split('/').pop()!
fs.mkdirSync(x5cPath.replace(file, ''), { recursive: true })
if (!file) {
throw Error(`Could not deduce path for x5 ca chain from x5u URL ${key.meta.x509.x5u}`)
}
fs.writeFileSync(x5cPath, key.meta.certChainPEM ? key.meta.certChainPEM : x5cToPemCertChain(key.meta.x509.x5c))
exports.push({ file, path: x5cPath })
}
})
return exports
}
}