WACI DIDComm

Tipos de mensaje

El protocolo define distintos flujos de mensajes dependendiendo de si se quiere emitir una credencial o presentar una credencial. Estos mensajes se distinguen en pasos segun la especificacion WACI-DIDComm Interop Profile.

Compartir en redes

Paso Emisión                        Presentación

1 Out of band                          Out of band

2 Propose Credential              Propose Presentation

3 Offer Credential                    Request Presentation

4 Request Credential              Present Proof

5 Ack                                        Ack Presentation

 

El servicio WACIInterpreter se encarga de tomar el mensaje, interpretar si es de tipo WACI y ademas que flujo pertenece para responder con el mesaje oportuno.

1. Instala

npm i @quarkid/waci

2. Instancia

const waci = new WACIInterpreter();

3. Interpreta el mensaje

waci.isWACIMessage(messageToCheck);

messageToCheck puede ser cualquier tipo de mensaje, si no tiene la estructura de una mensaje de WACI lo descarta.

Para que sea de tipo WACI debe tener la siguiente estructura:

type WACIMessage = { type: WACIMessageType; id: string; from: string; to?: string[]; body?: any; pthid?: string; thid?: string; attachments?: any[]; };

4. Procesa el mensaje

waci.processMessage(WACIMessage[])

processMessage se encarga de recibir un mensaje WACI y delegar su interpretacion al handler que corresponda al tipo de mensaje que sea.

5. Set Up For

El WACIInterpreter tiene un metodo llamado setUpFor para definir el flujo correspondiente al intercambio de credenciales.

new WACIInterpreter().setUpFor<Actor>(params: InputCallbacks[Actor], actor: Actor);

Requiere la definicion del Actor ya que el flujo de WACI cambia dependiendo de los actores.

enum Actor { Holder = "holder", Issuer = "issuer", Verifier = "verifier", }

Luego se deben configurara distintos tipos de callbacks segun se quiera emitir, presentar o verificar una credencial.

Por ejemplo para la verificación de una credencial se deberia instanciar de la siguiente manera:

waci.setUpFor( { getPresentationDefinition: (): any => { return [credentialModel]; }, verifyCredential: async (credential: any): Promise<boolean> => { console.log('Credential', JSON.stringify(credential, null, 2)); const vcVerifierService = new VCVerifierService({ didDocumentResolver: didResolver.resolveDid, }); const verifier = await vcVerifierService.verify(credential, { name: 'assertionMethod', }); console.log('verifiers', JSON.stringify(verifier, null, 2)); return verifier.result; }, } Actor.Verifier)