diff --git a/pom.xml b/pom.xml index 7819e0144bd1230b57904e0c34f1d4cf4a909d29..d9d6355f1f9cc2fd9381dd6e151f541cf7504115 100644 --- a/pom.xml +++ b/pom.xml @@ -6,7 +6,7 @@ <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> - <version>3.2.2</version> + <version>3.2.3</version> <relativePath/> </parent> @@ -53,14 +53,14 @@ <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> <!-- dependencies --> - <spring-boot.version>3.2.2</spring-boot.version> + <spring-boot.version>3.2.3</spring-boot.version> <springdoc.version>2.2.0</springdoc.version> <lombok.version>1.18.30</lombok.version> - <vc.version>1.7.0</vc.version> - <key-format.version>1.12.0</key-format.version> + <vc.version>1.9.0</vc.version> + <key-format.version>1.15.0</key-format.version> <did.version>1.11.0</did.version> - <ld-signatures.version>1.6.0</ld-signatures.version> - <uni-resolver.version>0.16.0</uni-resolver.version> + <ld-signatures.version>1.9.0</ld-signatures.version> + <uni-resolver.version>0.17.0</uni-resolver.version> <titanium.version>1.3.2</titanium.version> <caffeine.version>3.1.8</caffeine.version> <jose4j.version>0.9.3</jose4j.version> diff --git a/service/src/test/java/eu/xfsc/train/tcr/server/controller/ResolutionControllerTest.java b/service/src/test/java/eu/xfsc/train/tcr/server/controller/ResolutionControllerTest.java index dc71ef3764c3bc1a4db84612ea9c071fe0178c67..6050a2af226c6685c272d9ce58e31f90395ef060 100644 --- a/service/src/test/java/eu/xfsc/train/tcr/server/controller/ResolutionControllerTest.java +++ b/service/src/test/java/eu/xfsc/train/tcr/server/controller/ResolutionControllerTest.java @@ -63,7 +63,7 @@ public class ResolutionControllerTest { "serviceEndpoint":"https://ec.europa.eu/tools/lotl/eu-lotl.xml"}],"authentication":["did:web:essif.iao.fraunhofer.de#owner"],"assertionMethod":["did:web:essif.iao.fraunhofer.de#owner"]}"""; @Test - public void postResolveRequestShouldReturnEmptyVCResponse() throws Exception { + public void postResolveRequestShouldReturnErrorVCResponse() throws Exception { String did1 = "did:web:essif.trust-scheme.de"; ResolveRepresentationResult rrr = ResolveRepresentationResult.build(null, testDoc.getBytes(), null); @@ -94,7 +94,11 @@ public class ResolutionControllerTest { assertNotNull(result.getResolvedResults()); assertEquals(1, result.getResolvedResults().size()); assertEquals(did1, result.getResolvedResults().get(0).getDid()); + assertNotNull(result.getResolvedResults().get(0).getResolvedDoc()); + assertNotNull(result.getResolvedResults().get(0).getResolvedDoc().getDocument()); assertNull(result.getResolvedResults().get(0).getResolvedDoc().getEndpoints()); + assertNotNull(result.getResolvedResults().get(0).getError()); + assertEquals("did_error", result.getResolvedResults().get(0).getError().getCode()); } @Test @@ -152,7 +156,8 @@ public class ResolutionControllerTest { assertEquals(did, result.getResolvedResults().get(0).getDid()); assertNotNull(result.getResolvedResults().get(0).getResolvedDoc()); assertNotNull(result.getResolvedResults().get(0).getResolvedDoc().getDocument()); - //assertNull(result.getResolvedResults().get(0).getResolvedDoc().getEndpoints()); + assertNull(result.getResolvedResults().get(0).getResolvedDoc().getEndpoints()); + assertNull(result.getResolvedResults().get(0).getError()); } @Test diff --git a/service/src/test/java/eu/xfsc/train/tcr/server/service/TLResolverTest.java b/service/src/test/java/eu/xfsc/train/tcr/server/service/TLResolverTest.java index 5f01687b11c532b6f4b89e76399abd3e768522d5..d267f9fead8f249e3b6a6fb06ceb1f09ac4ae443 100644 --- a/service/src/test/java/eu/xfsc/train/tcr/server/service/TLResolverTest.java +++ b/service/src/test/java/eu/xfsc/train/tcr/server/service/TLResolverTest.java @@ -69,7 +69,7 @@ public class TLResolverTest { TrustServiceStatusList list = tlResolver.resolveTL(file.getCanonicalFile().toURI().toString()); checkTrustList(list, "bobs-burgers", "did:web:bobs-burgers.de"); - list = tlResolver.resolveTL("https://tspa.train1.xfsc.dev/tspa-service/tspa/v1/bob.trust.train1.xfsc.dev/trust-list"); + //list = tlResolver.resolveTL("https://tspa.train1.xfsc.dev/tspa-service/tspa/v1/bob.trust.train1.xfsc.dev/trust-list"); //assertNotNull(list); //checkTrustList(list, "bobs-burgers", "did:web:bobs-burgers.de"); } diff --git a/service/src/test/java/eu/xfsc/train/tcr/server/service/VCResolveTest.java b/service/src/test/java/eu/xfsc/train/tcr/server/service/VCResolveTest.java index 50c3150fbbdaad1bb2ec7aa24c7f2d373be6f692..50ee4bb4656af21485c9ec307d8b9bfa6ff666b7 100644 --- a/service/src/test/java/eu/xfsc/train/tcr/server/service/VCResolveTest.java +++ b/service/src/test/java/eu/xfsc/train/tcr/server/service/VCResolveTest.java @@ -1,7 +1,9 @@ package eu.xfsc.train.tcr.server.service; import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertNull; import static org.junit.jupiter.api.Assertions.assertTrue; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.eq; @@ -43,6 +45,8 @@ public class VCResolveTest { private static final String didWebEssif = "did:web:essif.iao.fraunhofer.de"; private static final String didJwkRsa = "did:jwk:eyJlIjoiQVFBQiIsImtpZCI6InNpZ25SU0EyMDQ4Iiwia3R5IjoiUlNBIiwibiI6IjhDUl8ySUJuSGlDcjVIY0kxcWh1dXpiRmdMRjFlSVI3dGM1NTF2WlN2ek1rTEtIVEpxeHVZR1BlVXp2U29ndWctTDJRQ2tpVWdmSjFZUzRFUmhrRFM2cVBJbFdMM1BGbkc4VjZQVWxoODZjTjgxWkhZdkhoUFYwUDdKT25UeGVKcTV1a1dFT0ctMUxrTmk5eGVnelRoMEVwV0w4NU5aUmJOYWJ0R0VqTUhqY04yak9NUldSYkE4OVdENVhOTExwdWUyNVlxbHcxOGZsbXNNRmh5dXk2YlVmanR2aXJ5SThwb0RLOVpXcGtPUjN6ejlNN0hpQXVyZ2NLSks5ODlEX0UzZ3d3S1FhQ21CbEJ4X3hESlJoVFB1bnJZUFBySHlpMExmaG5CeWgzcEJRMWhyelFLblZyX18zYkVwcE5abmRFLVhlWTY0VzNNaGUwa1RrREp2VXJndyJ9"; + + private static final String didSampleW3C = "https://example.com/issuer/123"; private static final String docWeb2VM = """ {"@context": ["https://www.w3.org/ns/did/v1", "https://w3id.org/security/suites/jws-2020/v1"], "id": "did:web:essif.iao.fraunhofer.de", "verificationMethod": [{"id": "did:web:essif.iao.fraunhofer.de#owner", "type": "JsonWebKey2020", @@ -101,6 +105,60 @@ public class VCResolveTest { } }"""; + private static final String docW3CSampleDid = """ + { + "@context": [ + "https://www.w3.org/ns/did/v1", + "https://w3id.org/security/suites/jws-2020/v1", + { + "@base": "https://example.com/issuer/123" + } + ], + "id": "https://example.com/issuer/123", + "verificationMethod": [ + { + "id": "#ovsDKYBjFemIy8DVhc-w2LSi8CvXMw2AYDzHj04yxkc", + "type": "JsonWebKey2020", + "controller": "https://example.com/issuer/123", + "publicKeyJwk": { + "kty": "OKP", + "crv": "Ed25519", + "x": "CV-aGlld3nVdgnhoZK0D36Wk-9aIMlZjZOK2XhPMnkQ" + } + } + ], + "assertionMethod": ["#ovsDKYBjFemIy8DVhc-w2LSi8CvXMw2AYDzHj04yxkc"] + }"""; + + private static final String docW3CSampleVC = """ + { + "@context": [ + "https://www.w3.org/2018/credentials/v1", + "https://www.w3.org/2018/credentials/examples/v1", + "https://w3id.org/security/suites/jws-2020/v1" + ], + "id": "http://example.gov/credentials/3732", + "type": ["VerifiableCredential", "UniversityDegreeCredential"], + "issuer": { + "id": "https://example.com/issuer/123" + }, + "issuanceDate": "2020-03-10T04:24:12.164Z", + "credentialSubject": { + "id": "did:example:456", + "degree": { + "type": "BachelorDegree", + "name": "Bachelor of Science and Arts" + } + }, + "proof": { + "type": "JsonWebSignature2020", + "created": "2019-12-11T03:50:55Z", + "jws": "eyJhbGciOiJFZERTQSIsImI2NCI6ZmFsc2UsImNyaXQiOlsiYjY0Il19..MJ5GwWRMsadCyLNXU_flgJtsS32584MydBxBuygps_cM0sbU3abTEOMyUvmLNcKOwOBE1MfDoB1_YY425W3sAg", + "proofPurpose": "assertionMethod", + "verificationMethod": "https://example.com/issuer/123#ovsDKYBjFemIy8DVhc-w2LSi8CvXMw2AYDzHj04yxkc" + } + }"""; + @Test public void testVCResolutionSigner() throws Exception { ResolveRepresentationResult rrr = ResolveRepresentationResult.build(null, docJwkRsa.getBytes(), null); @@ -110,9 +168,9 @@ public class VCResolveTest { docLoaderCache.put(uri, doc); assertNotNull(docLoaderCache.asMap().get(uri)); - VCResolveResult vcRes = didResolver.resolveVC("https://tspa.train1.xfsc.dev/tspa-service/tspa/v1/bob.trust.train1.xfsc.dev/vc", didJwkRsa); + VCResolveResult vcRes = didResolver.resolveVC(uri.toString(), didJwkRsa); assertEquals("https://tspa.train1.xfsc.dev/tspa-service/tspa/v1/bob.trust.train1.xfsc.dev/trust-list", vcRes.getTrustListUri()); - //assertTrue(vcRes.isVerified()); + assertFalse(vcRes.isVerified()); // because of the wrong signature from Signer } @@ -125,12 +183,11 @@ public class VCResolveTest { docLoaderCache.put(uri, doc); assertNotNull(docLoaderCache.asMap().get(uri)); - VCResolveResult vcRes = didResolver.resolveVC("https://tspa.train1.xfsc.dev/tspa-service/tspa/v1/alice.trust.train1.xfsc.dev/vc", didJwkRsa); + VCResolveResult vcRes = didResolver.resolveVC(uri.toString(), didJwkRsa); assertEquals("https://tspa.train1.xfsc.dev/tspa-service/tspa/v1/bob.trust.train1.xfsc.dev/trust-list", vcRes.getTrustListUri()); assertTrue(vcRes.isVerified()); } - @Test public void testVCResolutionFHWeb() throws Exception { ResolveRepresentationResult rrr = ResolveRepresentationResult.build(null, docWeb2VM.getBytes(), null); @@ -140,9 +197,23 @@ public class VCResolveTest { docLoaderCache.put(uri, doc); assertNotNull(docLoaderCache.asMap().get(uri)); - VCResolveResult vcRes = didResolver.resolveVC("https://tspa.train1.xfsc.dev/tspa-service/tspa/v1/bob.trust.train1.xfsc.dev/vc", didWebEssif); + VCResolveResult vcRes = didResolver.resolveVC(uri.toString(), didWebEssif); assertEquals("https://tspa.train1.xfsc.dev/tspa-service/tspa/v1/bob.trust.train1.xfsc.dev/trust-list", vcRes.getTrustListUri()); - //assertTrue(vcRes.isVerified()); + assertFalse(vcRes.isVerified()); // because of the wrong signature from Signer } + @Test + public void testVCResolutionW3C() throws Exception { + ResolveRepresentationResult rrr = ResolveRepresentationResult.build(null, docW3CSampleDid.getBytes(), null); + when(uniResolver.resolveRepresentation(eq(didSampleW3C), any())).thenReturn(rrr); + URI uri = new URI(didSampleW3C + "/vc"); + Document doc = JsonDocument.of(new StringReader(docW3CSampleVC)); + docLoaderCache.put(uri, doc); + assertNotNull(docLoaderCache.asMap().get(uri)); + + VCResolveResult vcRes = didResolver.resolveVC(uri.toString(), didSampleW3C); + assertNull(vcRes.getTrustListUri()); + assertTrue(vcRes.isVerified()); + } + }