diff --git a/integration/integration_test.go b/integration/integration_test.go index 0708652a8b40ffee9e243ff1ed52555cd480c8b4..211e899caa995daba4211089ce802da6854fee71 100644 --- a/integration/integration_test.go +++ b/integration/integration_test.go @@ -122,6 +122,11 @@ func TestCreateCredentialProof(t *testing.T) { vc: []byte(credentialWithNumericalSubjectID), errMsg: "verifiable credential subject of unsupported format", }, + { + name: "presentation is given instead of credential", + vc: []byte(presentationWithSubjectID), + errMsg: "verifiable credential is not valid", + }, } for _, test := range tests { @@ -139,8 +144,6 @@ func TestCreateCredentialProof(t *testing.T) { verifiable.WithJSONLDDocumentLoader(loader), verifiable.WithDisabledProofCheck(), verifiable.WithStrictValidation(), - verifiable.WithJSONLDValidation(), - verifiable.WithJSONLDOnlyValidRDF(), ) require.NoError(t, err) assert.NotNil(t, vc) @@ -239,7 +242,7 @@ func TestCreatePresentationProof(t *testing.T) { errMsg string }{ { - name: "presentation with credentia subject id", + name: "presentation with credential subject id", vp: []byte(presentationWithSubjectID), }, { diff --git a/internal/service/signer/service.go b/internal/service/signer/service.go index b50a98497d750b3f7253d46953902ec127d912ea..b29c42b9bef9eccf07fff5ca2a61d7844be25dc1 100644 --- a/internal/service/signer/service.go +++ b/internal/service/signer/service.go @@ -147,6 +147,9 @@ func (s *Service) CredentialProof(ctx context.Context, req *signer.CredentialPro vc, err := s.parseCredential(req.Credential) if err != nil { logger.Error("error parsing verifiable credential", zap.Error(err)) + if strings.Contains(err.Error(), "JSON-LD doc has different structure after compaction") { + return nil, errors.New(errors.BadRequest, "JSON-LD doc has different structure after compaction: some attributes may not be described by schema") + } return nil, errors.New(errors.BadRequest, err.Error()) } @@ -196,10 +199,10 @@ func (s *Service) PresentationProof(ctx context.Context, req *signer.Presentatio ) if err != nil { logger.Error("error parsing verifiable presentation", zap.Error(err)) - if strings.Contains(err.Error(), "verifiable presentation is not valid") { - return nil, errors.New(errors.BadRequest, err.Error()) + if strings.Contains(err.Error(), "JSON-LD doc has different structure after compaction") { + return nil, errors.New(errors.BadRequest, "JSON-LD doc has different structure after compaction: some attributes may not be described by schema") } - return nil, err + return nil, errors.New(errors.BadRequest, err.Error()) } if len(vp.Credentials()) == 0 { @@ -223,6 +226,9 @@ func (s *Service) PresentationProof(ctx context.Context, req *signer.Presentatio _, err = s.parseCredential(credJSON) if err != nil { logger.Error("error validating credential", zap.Error(err)) + if strings.Contains(err.Error(), "JSON-LD doc has different structure after compaction") { + return nil, errors.New(errors.BadRequest, "JSON-LD doc has different structure after compaction: some attributes may not be described by schema") + } return nil, errors.New(errors.BadRequest, "error validating credential", err) } @@ -279,6 +285,9 @@ func (s *Service) VerifyCredential(ctx context.Context, req *signer.VerifyCreden vc, err := s.parseCredentialWithProof(req.Credential, fetcher.PublicKeyFetcher()) if err != nil { logger.Error("error verifying credential", zap.Error(err)) + if strings.Contains(err.Error(), "JSON-LD doc has different structure after compaction") { + return nil, errors.New(errors.BadRequest, "JSON-LD doc has different structure after compaction: some attributes may not be described by schema") + } return nil, errors.New(errors.BadRequest, err.Error()) } @@ -315,6 +324,9 @@ func (s *Service) VerifyPresentation(ctx context.Context, req *signer.VerifyPres ) if err != nil { logger.Error("error verifying presentation", zap.Error(err)) + if strings.Contains(err.Error(), "JSON-LD doc has different structure after compaction") { + return nil, errors.New(errors.BadRequest, "JSON-LD doc has different structure after compaction: some attributes may not be described by schema") + } return nil, errors.New(errors.BadRequest, err.Error()) } @@ -345,7 +357,10 @@ func (s *Service) VerifyPresentation(ctx context.Context, req *signer.VerifyPres _, err = s.parseCredential(credJSON) if err != nil { logger.Error("error validating credential", zap.Error(err)) - return nil, errors.New(errors.BadRequest, "error validating credential", err) + if strings.Contains(err.Error(), "JSON-LD doc has different structure after compaction") { + return nil, errors.New(errors.BadRequest, "JSON-LD doc has different structure after compaction: some attributes may not be described by schema") + } + return nil, errors.New(errors.BadRequest, err.Error()) } if err := validateCredentialSubject(cred["credentialSubject"]); err != nil { @@ -397,8 +412,6 @@ func (s *Service) parseCredential(vc []byte) (*verifiable.Credential, error) { vc, verifiable.WithJSONLDDocumentLoader(s.docLoader), verifiable.WithStrictValidation(), - verifiable.WithJSONLDValidation(), - verifiable.WithJSONLDOnlyValidRDF(), ) } @@ -411,7 +424,6 @@ func (s *Service) parseCredentialWithProof(vc []byte, fetcher verifiable.PublicK ), verifiable.WithJSONLDDocumentLoader(s.docLoader), verifiable.WithStrictValidation(), - verifiable.WithJSONLDValidation(), ) if err != nil { return nil, err diff --git a/internal/service/signer/service_test.go b/internal/service/signer/service_test.go index 829850973c848a1b095b86deb100d5f64db4a738..bd81d5002d153954855f7d37618c3cd87499fde6 100644 --- a/internal/service/signer/service_test.go +++ b/internal/service/signer/service_test.go @@ -11,6 +11,7 @@ import ( "github.com/hyperledger/aries-framework-go/pkg/doc/verifiable" "github.com/square/go-jose/v3" "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" "go.uber.org/zap" "code.vereign.com/gaiax/tsa/golib/errors" @@ -421,6 +422,7 @@ func TestService_PresentationProof(t *testing.T) { req: &goasigner.PresentationProofRequest{ Presentation: []byte(nonExistingPresentationContexts), }, + errkind: errors.BadRequest, errtext: "Dereferencing a URL did not result in a valid JSON-LD context", }, { @@ -562,29 +564,28 @@ func TestService_PresentationProof(t *testing.T) { t.Run(test.name, func(t *testing.T) { svc := signer.New(test.signer, "issuer", test.defaultKey, test.supportedKeys, http.DefaultClient, zap.NewNop()) res, err := svc.PresentationProof(context.Background(), test.req) - if err != nil { + if test.errtext != "" { + require.Error(t, err) assert.Nil(t, res) - assert.NotEmpty(t, test.errtext, err.Error()) if e, ok := err.(*errors.Error); ok { assert.Equal(t, test.errkind, e.Kind) assert.Contains(t, e.Message, test.errtext) } else { assert.Contains(t, err.Error(), test.errtext) } - } else { - assert.Empty(t, test.errtext) - assert.NotNil(t, res) + return + } - vp, ok := res.(*verifiable.Presentation) - assert.True(t, ok) + assert.NotNil(t, res) + vp, ok := res.(*verifiable.Presentation) + assert.True(t, ok) - assert.Equal(t, test.contexts, vp.Context) - assert.Equal(t, test.types, vp.Type) - assert.Equal(t, test.proofPurpose, vp.Proofs[0]["proofPurpose"]) - assert.Equal(t, test.proofType, vp.Proofs[0]["type"]) - assert.Equal(t, test.proofVerificationMethod, vp.Proofs[0]["verificationMethod"]) - assert.NotEmpty(t, vp.Proofs[0]["jws"]) - } + assert.Equal(t, test.contexts, vp.Context) + assert.Equal(t, test.types, vp.Type) + assert.Equal(t, test.proofPurpose, vp.Proofs[0]["proofPurpose"]) + assert.Equal(t, test.proofType, vp.Proofs[0]["type"]) + assert.Equal(t, test.proofVerificationMethod, vp.Proofs[0]["verificationMethod"]) + assert.NotEmpty(t, vp.Proofs[0]["jws"]) }) } } @@ -626,13 +627,16 @@ var invalidCredential = `{"invalid":"credential"}` //nolint:gosec var invalidCredentialContexts = `{ - "@context": ["https://www.w3.org/2018/credentials/v123"], - "credentialSubject": { - "hello": "world" - }, - "issuanceDate": "2022-06-02T17:24:05.032533+03:00", - "issuer": "https://example.com", - "type": "VerifiableCredential" + "@context": [ + "https://www.w3.org/2018/credentials/v1", + "https://adsklfhasefugaougyasdkfhaksjdhga.com/v1" + ], + "credentialSubject": { + "hello": "world" + }, + "issuanceDate": "2022-06-02T17:24:05.032533+03:00", + "issuer": "https://example.com", + "type": "VerifiableCredential" }` //nolint:gosec @@ -733,7 +737,7 @@ var invalidPresentationContexts = `{ var nonExistingPresentationContexts = `{ "@context": [ "https://www.w3.org/2018/credentials/v1", - "https://www.nonexistingschema.org" + "https://www.akdjsghadkljghadlkgjhadlkgjha.org" ], "id": "did:123", "type": "VerifiablePresentation",