Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Decoded credential always wants a hasher function for sd-jwt #145

Open
cre8 opened this issue Apr 3, 2024 · 2 comments
Open

Decoded credential always wants a hasher function for sd-jwt #145

cre8 opened this issue Apr 3, 2024 · 2 comments

Comments

@cre8
Copy link
Contributor

cre8 commented Apr 3, 2024

  • I'm submitting a ...
    [x] bug report
    [ ] feature request
    [ ] question about the decisions made in the repository
    [ ] question about how to use this project

  • Summary
    According to the note here you need to decode the sd-jwt in case the hasher function is async (which is in my canse since its executed in the browser via webcrypto). So I am decoding the list of credentials like this:

const vcs: SdJwtDecodedVerifiableCredential[] = [];
      for (const credential of credentials) {
        const decoded = await CredentialMapper.decodeSdJwtVcAsync(
          credential.value,
          getHasher()
        );
        vcs.push(decoded);
      }      
      const pex = new PresentationExchange({        
        allVerifiableCredentials: vcs,
      });

But then I am running in this error Hasher must be provided when creating a presentation with an SD-JWT VC. After logging the credentials and the conditions I get this:

{"compactSdJwtVc":"eyJ0eXAiOiJ2YytzZC1qd3QiLCJhbGciOiJFZERTQSJ9.eyJpYXQiOjE3MTIwOTI0NzU1MjUsImlzcyI6Iklzc3VlciIsInZjdCI6IklkZW50aXR5IiwianRpIjoiNzE2OTBiOTItYjI1My00OGFiLThlNjctMjFkYzAzN2I2YWY0IiwiY25mIjp7ImtpZCI6ImRpZDpqd2s6ZXlKcmRIa2lPaUpGUXlJc0luZ2lPaUpCY1hSQmMzVlFRMnN5WVd4cmNVazBaRkZpVUdaQlpHWnRNMHN5TFRZdGNVbE9WRVJ5YUZoaFJFazBJaXdpZVNJNklsaEJVVWh2UzBWdGVHWnRiVkZXUldoQ0xVcFlVMXBMV0VWa1JHSjVha3BpVEZacE5WbGxRMEZvVHpBaUxDSmpjbllpT2lKUUxUSTFOaUo5IzAifSwiX3NkIjpbIkdEdEIweTg5ZzRmMzJBeUhzU2F4N0pHbDA2VkhlV2IxZVozZXloZ0dsN0UiLCJsdW5zQjJ5a3pQVEowd0NKYlZndlpaV3BsUUktOFpnRW1QNjV2X1o5N1IwIl0sIl9zZF9hbGciOiJTSEEtMjU2In0.wmwlrsfXYa-B15yPRTjCulWNBeWLHxIjVynKN0UgIBatzGcmloWENCVBSLPYt1xc-o0ueYyemKDa8icOaPPu1w~WyJhZmE3Mzg2OTMzOTJlOTE3IiwicHJlbmFtZSIsIk1pcmtvIl0~WyI1NzcxYjhiMDA5YzMxMzMzIiwic3VybmFtZSIsIk1vbGxpayJd~","decodedPayload":{"iat":1712092475525,"iss":"Issuer","vct":"Identity","jti":"71690b92-b253-48ab-8e67-21dc037b6af4","cnf":{"kid":"did:jwk:eyJrdHkiOiJFQyIsIngiOiJBcXRBc3VQQ2syYWxrcUk0ZFFiUGZBZGZtM0syLTYtcUlOVERyaFhhREk0IiwieSI6IlhBUUhvS0VteGZtbVFWRWhCLUpYU1pLWEVkRGJ5akpiTFZpNVllQ0FoTzAiLCJjcnYiOiJQLTI1NiJ9#0"},"prename":"Mirko","surname":"Mollik"},"disclosures":[{"decoded":["afa738693392e917","prename","Mirko"],"digest":"GDtB0y89g4f32AyHsSax7JGl06VHeWb1eZ3eyhgGl7E","encoded":"WyJhZmE3Mzg2OTMzOTJlOTE3IiwicHJlbmFtZSIsIk1pcmtvIl0"},{"decoded":["5771b8b009c31333","surname","Mollik"],"digest":"lunsB2ykzPTJ0wCJbVgvZZWplQI-8ZgEmP65v_Z97R0","encoded":"WyI1NzcxYjhiMDA5YzMxMzMzIiwic3VybmFtZSIsIk1vbGxpayJd"}],"signedPayload":{"iat":1712092475525,"iss":"Issuer","vct":"Identity","jti":"71690b92-b253-48ab-8e67-21dc037b6af4","cnf":{"kid":"did:jwk:eyJrdHkiOiJFQyIsIngiOiJBcXRBc3VQQ2syYWxrcUk0ZFFiUGZBZGZtM0syLTYtcUlOVERyaFhhREk0IiwieSI6IlhBUUhvS0VteGZtbVFWRWhCLUpYU1pLWEVkRGJ5akpiTFZpNVllQ0FoTzAiLCJjcnYiOiJQLTI1NiJ9#0"},"_sd":["GDtB0y89g4f32AyHsSax7JGl06VHeWb1eZ3eyhgGl7E","lunsB2ykzPTJ0wCJbVgvZZWplQI-8ZgEmP65v_Z97R0"],"_sd_alg":"SHA-256"}}

isdecoded true
isEncoded false

So is the intention of if (credentials.some((c) => CredentialMapper.isSdJwtDecodedCredential(c) || CredentialMapper.isSdJwtEncoded(c))) { to only get the sd-jwt-vc credentials, the error seems to be here.

To avoid the hash call in the function, we need to pass the pre calculated sdHash in the SdJwtDecodedVerifiableCredential object.

Or we just make the hasher call async since PresentationExchange.findValidPresentationDefinitions is already async :)

@TimoGlastra
Copy link
Contributor

Hmm yeah that's a good one. as mentioned in the other issue, I'm fine with making things async 👍

Passing the sdHash is getting very complex, and in that case it'd be better to construct the KB-JWT outside of the PEX library

@cre8
Copy link
Contributor Author

cre8 commented Apr 4, 2024

In case we can solve issue #147 by passing an async hash function, we can calculate everything inside the pex function and do not need changes like in this issue. So when the other issue is resolved, we can close this one

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants