From ce63403cd8daf1deee087d6b77acddc238ea7086 Mon Sep 17 00:00:00 2001 From: Hjort Date: Mon, 19 Feb 2024 17:19:34 +0100 Subject: [PATCH 1/5] Add unqualified statements --- .../sdk/crypto/wallet/web3Id/Request.java | 4 ++-- .../web3Id/Statement/AtomicStatement.java | 5 ++--- .../wallet/web3Id/Statement/IdQualifier.java | 11 +++++++++++ .../web3Id/Statement/IdentityQualifier.java | 13 +++++++++++++ .../Statement/QualifiedRequestStatement.java | 12 ++++++++++++ .../web3Id/Statement/RequestStatement.java | 9 +++------ .../UnqualifiedRequestStatement.java | 19 +++++++++++++++++++ .../sdk/crypto/wallet/web3Id/Web3IdProof.java | 3 ++- .../wallet/web3Id/Web3IdProofInput.java | 5 +++-- 9 files changed, 67 insertions(+), 14 deletions(-) create mode 100644 concordium-sdk/src/main/java/com/concordium/sdk/crypto/wallet/web3Id/Statement/IdQualifier.java create mode 100644 concordium-sdk/src/main/java/com/concordium/sdk/crypto/wallet/web3Id/Statement/IdentityQualifier.java create mode 100644 concordium-sdk/src/main/java/com/concordium/sdk/crypto/wallet/web3Id/Statement/QualifiedRequestStatement.java create mode 100644 concordium-sdk/src/main/java/com/concordium/sdk/crypto/wallet/web3Id/Statement/UnqualifiedRequestStatement.java diff --git a/concordium-sdk/src/main/java/com/concordium/sdk/crypto/wallet/web3Id/Request.java b/concordium-sdk/src/main/java/com/concordium/sdk/crypto/wallet/web3Id/Request.java index 9d59b5edd..8aecedfd3 100644 --- a/concordium-sdk/src/main/java/com/concordium/sdk/crypto/wallet/web3Id/Request.java +++ b/concordium-sdk/src/main/java/com/concordium/sdk/crypto/wallet/web3Id/Request.java @@ -11,7 +11,7 @@ @Getter @Builder @Jacksonized -public class Request { +public class Request { private final String challenge; - private final List credentialStatements; + private final List credentialStatements; } diff --git a/concordium-sdk/src/main/java/com/concordium/sdk/crypto/wallet/web3Id/Statement/AtomicStatement.java b/concordium-sdk/src/main/java/com/concordium/sdk/crypto/wallet/web3Id/Statement/AtomicStatement.java index f0e545093..70aef40b8 100644 --- a/concordium-sdk/src/main/java/com/concordium/sdk/crypto/wallet/web3Id/Statement/AtomicStatement.java +++ b/concordium-sdk/src/main/java/com/concordium/sdk/crypto/wallet/web3Id/Statement/AtomicStatement.java @@ -4,15 +4,14 @@ import com.fasterxml.jackson.annotation.JsonSubTypes; import com.fasterxml.jackson.annotation.JsonSubTypes.Type; import com.fasterxml.jackson.annotation.JsonTypeInfo.As; +import com.fasterxml.jackson.annotation.JsonTypeInfo.Id; import com.fasterxml.jackson.annotation.JsonTypeInfo; -import static com.fasterxml.jackson.annotation.JsonTypeInfo.Id.NAME; - import com.concordium.sdk.crypto.wallet.identityobject.IdentityObject; import com.concordium.sdk.crypto.wallet.web3Id.CredentialAttribute; import com.concordium.sdk.responses.accountinfo.credential.AttributeType; -@JsonTypeInfo(use = NAME, include = As.PROPERTY, property = "type", visible = true) +@JsonTypeInfo(use = Id.NAME, include = As.PROPERTY, property = "type", visible = true) @JsonSubTypes ({@Type (value = RevealStatement.class), @Type (value = RangeStatement.class), @Type (value = MembershipStatement.class), @Type (value = NonMembershipStatement.class)}) public abstract class AtomicStatement { @JsonProperty("attributeTag") diff --git a/concordium-sdk/src/main/java/com/concordium/sdk/crypto/wallet/web3Id/Statement/IdQualifier.java b/concordium-sdk/src/main/java/com/concordium/sdk/crypto/wallet/web3Id/Statement/IdQualifier.java new file mode 100644 index 000000000..efa5d38a6 --- /dev/null +++ b/concordium-sdk/src/main/java/com/concordium/sdk/crypto/wallet/web3Id/Statement/IdQualifier.java @@ -0,0 +1,11 @@ +package com.concordium.sdk.crypto.wallet.web3Id.Statement; + +import com.fasterxml.jackson.annotation.JsonSubTypes; +import com.fasterxml.jackson.annotation.JsonSubTypes.Type; +import com.fasterxml.jackson.annotation.JsonTypeInfo; +import com.fasterxml.jackson.annotation.JsonTypeInfo.As; +import com.fasterxml.jackson.annotation.JsonTypeInfo.Id; + +@JsonTypeInfo(use = Id.NAME, include = As.PROPERTY, property = "type", visible = true) +@JsonSubTypes ({@Type (value = IdentityQualifier.class)}) +public class IdQualifier {} diff --git a/concordium-sdk/src/main/java/com/concordium/sdk/crypto/wallet/web3Id/Statement/IdentityQualifier.java b/concordium-sdk/src/main/java/com/concordium/sdk/crypto/wallet/web3Id/Statement/IdentityQualifier.java new file mode 100644 index 000000000..81cd08abc --- /dev/null +++ b/concordium-sdk/src/main/java/com/concordium/sdk/crypto/wallet/web3Id/Statement/IdentityQualifier.java @@ -0,0 +1,13 @@ +package com.concordium.sdk.crypto.wallet.web3Id.Statement; + +import java.util.List; + +import com.fasterxml.jackson.annotation.JsonTypeName; + +import lombok.Getter; + +@Getter +@JsonTypeName("cred") +public class IdentityQualifier extends IdQualifier { + private List issuers; +} diff --git a/concordium-sdk/src/main/java/com/concordium/sdk/crypto/wallet/web3Id/Statement/QualifiedRequestStatement.java b/concordium-sdk/src/main/java/com/concordium/sdk/crypto/wallet/web3Id/Statement/QualifiedRequestStatement.java new file mode 100644 index 000000000..ba116bbe0 --- /dev/null +++ b/concordium-sdk/src/main/java/com/concordium/sdk/crypto/wallet/web3Id/Statement/QualifiedRequestStatement.java @@ -0,0 +1,12 @@ +package com.concordium.sdk.crypto.wallet.web3Id.Statement; + +import lombok.Getter; +import lombok.experimental.SuperBuilder; +import lombok.extern.jackson.Jacksonized; + +@Getter +@SuperBuilder +@Jacksonized +public class QualifiedRequestStatement extends RequestStatement { + private String id; +} diff --git a/concordium-sdk/src/main/java/com/concordium/sdk/crypto/wallet/web3Id/Statement/RequestStatement.java b/concordium-sdk/src/main/java/com/concordium/sdk/crypto/wallet/web3Id/Statement/RequestStatement.java index 1503e48df..3ec25d967 100644 --- a/concordium-sdk/src/main/java/com/concordium/sdk/crypto/wallet/web3Id/Statement/RequestStatement.java +++ b/concordium-sdk/src/main/java/com/concordium/sdk/crypto/wallet/web3Id/Statement/RequestStatement.java @@ -5,15 +5,12 @@ import com.concordium.sdk.crypto.wallet.identityobject.IdentityObject; -import lombok.Builder; import lombok.Getter; -import lombok.extern.jackson.Jacksonized; +import lombok.experimental.SuperBuilder; +@SuperBuilder @Getter -@Builder -@Jacksonized -public class RequestStatement { - private String id; +public abstract class RequestStatement { private List type; private List statement; diff --git a/concordium-sdk/src/main/java/com/concordium/sdk/crypto/wallet/web3Id/Statement/UnqualifiedRequestStatement.java b/concordium-sdk/src/main/java/com/concordium/sdk/crypto/wallet/web3Id/Statement/UnqualifiedRequestStatement.java new file mode 100644 index 000000000..aeeeb3150 --- /dev/null +++ b/concordium-sdk/src/main/java/com/concordium/sdk/crypto/wallet/web3Id/Statement/UnqualifiedRequestStatement.java @@ -0,0 +1,19 @@ +package com.concordium.sdk.crypto.wallet.web3Id.Statement; + +import com.concordium.sdk.crypto.wallet.Network; + +import lombok.Getter; +import lombok.experimental.SuperBuilder; +import lombok.extern.jackson.Jacksonized; + +@Getter +@SuperBuilder +@Jacksonized +public class UnqualifiedRequestStatement extends RequestStatement { + private IdQualifier idQualifier; + + public QualifiedRequestStatement qualify(String credId, Network network) { + String did = "did:ccd:" + network.getValue().toLowerCase() + ":cred:" + credId; + return QualifiedRequestStatement.builder().id(did).statement(getStatement()).build(); + } +} diff --git a/concordium-sdk/src/main/java/com/concordium/sdk/crypto/wallet/web3Id/Web3IdProof.java b/concordium-sdk/src/main/java/com/concordium/sdk/crypto/wallet/web3Id/Web3IdProof.java index 4e0333361..88c20c6ff 100644 --- a/concordium-sdk/src/main/java/com/concordium/sdk/crypto/wallet/web3Id/Web3IdProof.java +++ b/concordium-sdk/src/main/java/com/concordium/sdk/crypto/wallet/web3Id/Web3IdProof.java @@ -3,6 +3,7 @@ import com.concordium.sdk.crypto.CryptoJniNative; import com.concordium.sdk.crypto.NativeResolver; import com.concordium.sdk.crypto.wallet.StringResult; +import com.concordium.sdk.crypto.wallet.web3Id.Statement.QualifiedRequestStatement; import com.concordium.sdk.exceptions.CryptoJniException; import com.concordium.sdk.serializing.JsonMapper; import com.fasterxml.jackson.core.JsonProcessingException; @@ -18,7 +19,7 @@ public class Web3IdProof { * @param input the input required to generate the Presentiation * @return a Presentation serialized as JSON */ - public static String getWeb3IdProof(Web3IdProofInput input) { + public static String getWeb3IdProof(Web3IdProofInput input) { StringResult result = null; try { String jsonStr = CryptoJniNative.createWeb3IdProof(JsonMapper.INSTANCE.writeValueAsString(input)); diff --git a/concordium-sdk/src/main/java/com/concordium/sdk/crypto/wallet/web3Id/Web3IdProofInput.java b/concordium-sdk/src/main/java/com/concordium/sdk/crypto/wallet/web3Id/Web3IdProofInput.java index f1d13284f..c6a23e42a 100644 --- a/concordium-sdk/src/main/java/com/concordium/sdk/crypto/wallet/web3Id/Web3IdProofInput.java +++ b/concordium-sdk/src/main/java/com/concordium/sdk/crypto/wallet/web3Id/Web3IdProofInput.java @@ -2,6 +2,7 @@ import java.util.List; +import com.concordium.sdk.crypto.wallet.web3Id.Statement.RequestStatement; import com.concordium.sdk.responses.cryptographicparameters.CryptographicParameters; import lombok.Builder; @@ -14,8 +15,8 @@ @Getter @Builder @Jacksonized -public class Web3IdProofInput { - private final Request request; +public class Web3IdProofInput { + private final Request request; private final List commitmentInputs; private final CryptographicParameters globalContext; } From 104a3151a6efb7c39a7c36a75990f5c14194587e Mon Sep 17 00:00:00 2001 From: Hjort Date: Tue, 20 Feb 2024 11:22:03 +0100 Subject: [PATCH 2/5] Add test + split Request into two classes --- .../{Request.java => QualifiedRequest.java} | 6 +-- .../wallet/web3Id/UnqualifiedRequest.java | 32 ++++++++++++++ .../sdk/crypto/wallet/web3Id/Web3IdProof.java | 3 +- .../wallet/web3Id/Web3IdProofInput.java | 5 +-- .../sdk/crypto/wallet/CredentialTest.java | 11 ----- .../sdk/crypto/wallet/web3Id/ProofTest.java | 14 +++---- .../wallet/web3Id/RequestStatementTest.java | 42 +++++++++++++++++-- .../wallet/web3Id/unqualifiedRequest.json | 19 +++++++++ 8 files changed, 102 insertions(+), 30 deletions(-) rename concordium-sdk/src/main/java/com/concordium/sdk/crypto/wallet/web3Id/{Request.java => QualifiedRequest.java} (54%) create mode 100644 concordium-sdk/src/main/java/com/concordium/sdk/crypto/wallet/web3Id/UnqualifiedRequest.java create mode 100644 concordium-sdk/src/test/testresources/wallet/web3Id/unqualifiedRequest.json diff --git a/concordium-sdk/src/main/java/com/concordium/sdk/crypto/wallet/web3Id/Request.java b/concordium-sdk/src/main/java/com/concordium/sdk/crypto/wallet/web3Id/QualifiedRequest.java similarity index 54% rename from concordium-sdk/src/main/java/com/concordium/sdk/crypto/wallet/web3Id/Request.java rename to concordium-sdk/src/main/java/com/concordium/sdk/crypto/wallet/web3Id/QualifiedRequest.java index 8aecedfd3..432f160c5 100644 --- a/concordium-sdk/src/main/java/com/concordium/sdk/crypto/wallet/web3Id/Request.java +++ b/concordium-sdk/src/main/java/com/concordium/sdk/crypto/wallet/web3Id/QualifiedRequest.java @@ -2,7 +2,7 @@ import java.util.List; -import com.concordium.sdk.crypto.wallet.web3Id.Statement.RequestStatement; +import com.concordium.sdk.crypto.wallet.web3Id.Statement.QualifiedRequestStatement; import lombok.Builder; import lombok.Getter; @@ -11,7 +11,7 @@ @Getter @Builder @Jacksonized -public class Request { +public class QualifiedRequest { private final String challenge; - private final List credentialStatements; + private final List credentialStatements; } diff --git a/concordium-sdk/src/main/java/com/concordium/sdk/crypto/wallet/web3Id/UnqualifiedRequest.java b/concordium-sdk/src/main/java/com/concordium/sdk/crypto/wallet/web3Id/UnqualifiedRequest.java new file mode 100644 index 000000000..1804beb76 --- /dev/null +++ b/concordium-sdk/src/main/java/com/concordium/sdk/crypto/wallet/web3Id/UnqualifiedRequest.java @@ -0,0 +1,32 @@ +package com.concordium.sdk.crypto.wallet.web3Id; + +import java.util.List; +import java.util.stream.Collector; +import java.util.stream.Collectors; +import java.util.stream.IntStream; + +import com.concordium.sdk.crypto.wallet.Network; +import com.concordium.sdk.crypto.wallet.web3Id.Statement.QualifiedRequestStatement; +import com.concordium.sdk.crypto.wallet.web3Id.Statement.UnqualifiedRequestStatement; + +import lombok.Builder; +import lombok.Getter; +import lombok.extern.jackson.Jacksonized; + +@Getter +@Builder +@Jacksonized +public class UnqualifiedRequest { + private final String challenge; + private final List credentialStatements; + + public QualifiedRequest qualify(List credIds, Network network) { + if (credIds.size() != credentialStatements.size()) { + throw new IllegalArgumentException("List of credIds must be same size as credentialStatements"); + } + List qualifiedStatements = IntStream.range(0, credentialStatements.size()) + .mapToObj(index -> credentialStatements.get(index).qualify(credIds.get(index), network)) + .collect(Collectors.toList()); + return QualifiedRequest.builder().challenge(challenge).credentialStatements(qualifiedStatements).build(); + } +} diff --git a/concordium-sdk/src/main/java/com/concordium/sdk/crypto/wallet/web3Id/Web3IdProof.java b/concordium-sdk/src/main/java/com/concordium/sdk/crypto/wallet/web3Id/Web3IdProof.java index 88c20c6ff..4e0333361 100644 --- a/concordium-sdk/src/main/java/com/concordium/sdk/crypto/wallet/web3Id/Web3IdProof.java +++ b/concordium-sdk/src/main/java/com/concordium/sdk/crypto/wallet/web3Id/Web3IdProof.java @@ -3,7 +3,6 @@ import com.concordium.sdk.crypto.CryptoJniNative; import com.concordium.sdk.crypto.NativeResolver; import com.concordium.sdk.crypto.wallet.StringResult; -import com.concordium.sdk.crypto.wallet.web3Id.Statement.QualifiedRequestStatement; import com.concordium.sdk.exceptions.CryptoJniException; import com.concordium.sdk.serializing.JsonMapper; import com.fasterxml.jackson.core.JsonProcessingException; @@ -19,7 +18,7 @@ public class Web3IdProof { * @param input the input required to generate the Presentiation * @return a Presentation serialized as JSON */ - public static String getWeb3IdProof(Web3IdProofInput input) { + public static String getWeb3IdProof(Web3IdProofInput input) { StringResult result = null; try { String jsonStr = CryptoJniNative.createWeb3IdProof(JsonMapper.INSTANCE.writeValueAsString(input)); diff --git a/concordium-sdk/src/main/java/com/concordium/sdk/crypto/wallet/web3Id/Web3IdProofInput.java b/concordium-sdk/src/main/java/com/concordium/sdk/crypto/wallet/web3Id/Web3IdProofInput.java index c6a23e42a..5384dcfe5 100644 --- a/concordium-sdk/src/main/java/com/concordium/sdk/crypto/wallet/web3Id/Web3IdProofInput.java +++ b/concordium-sdk/src/main/java/com/concordium/sdk/crypto/wallet/web3Id/Web3IdProofInput.java @@ -2,7 +2,6 @@ import java.util.List; -import com.concordium.sdk.crypto.wallet.web3Id.Statement.RequestStatement; import com.concordium.sdk.responses.cryptographicparameters.CryptographicParameters; import lombok.Builder; @@ -15,8 +14,8 @@ @Getter @Builder @Jacksonized -public class Web3IdProofInput { - private final Request request; +public class Web3IdProofInput { + private final QualifiedRequest request; private final List commitmentInputs; private final CryptographicParameters globalContext; } diff --git a/concordium-sdk/src/test/java/com/concordium/sdk/crypto/wallet/CredentialTest.java b/concordium-sdk/src/test/java/com/concordium/sdk/crypto/wallet/CredentialTest.java index 2c1ad91b3..e5dcba5e5 100644 --- a/concordium-sdk/src/test/java/com/concordium/sdk/crypto/wallet/CredentialTest.java +++ b/concordium-sdk/src/test/java/com/concordium/sdk/crypto/wallet/CredentialTest.java @@ -2,10 +2,6 @@ import static org.junit.Assert.assertTrue; -import java.io.IOException; -import java.nio.charset.Charset; -import java.nio.file.Files; -import java.nio.file.Paths; import java.util.Collections; import java.util.HashMap; import java.util.Map; @@ -17,17 +13,10 @@ import com.concordium.sdk.crypto.wallet.credential.CredentialDeploymentDetails; import com.concordium.sdk.crypto.wallet.credential.CredentialDeploymentSerializationContext; import com.concordium.sdk.crypto.wallet.credential.UnsignedCredentialDeploymentInfoWithRandomness; -import com.concordium.sdk.crypto.wallet.identityobject.IdentityObject; import com.concordium.sdk.responses.accountinfo.credential.AttributeType; -import com.concordium.sdk.responses.blocksummary.updates.queues.AnonymityRevokerInfo; -import com.concordium.sdk.responses.blocksummary.updates.queues.IdentityProviderInfo; -import com.concordium.sdk.responses.cryptographicparameters.CryptographicParameters; -import com.concordium.sdk.serializing.JsonMapper; import com.concordium.sdk.transactions.CredentialPublicKeys; import com.concordium.sdk.transactions.Expiry; import com.concordium.sdk.transactions.Index; -import com.fasterxml.jackson.databind.type.MapType; -import com.fasterxml.jackson.databind.type.TypeFactory; public class CredentialTest { diff --git a/concordium-sdk/src/test/java/com/concordium/sdk/crypto/wallet/web3Id/ProofTest.java b/concordium-sdk/src/test/java/com/concordium/sdk/crypto/wallet/web3Id/ProofTest.java index caabf2159..50e44189c 100644 --- a/concordium-sdk/src/test/java/com/concordium/sdk/crypto/wallet/web3Id/ProofTest.java +++ b/concordium-sdk/src/test/java/com/concordium/sdk/crypto/wallet/web3Id/ProofTest.java @@ -15,8 +15,8 @@ import com.concordium.sdk.crypto.wallet.web3Id.Statement.AtomicStatement; import com.concordium.sdk.crypto.wallet.web3Id.Statement.MembershipStatement; import com.concordium.sdk.crypto.wallet.web3Id.Statement.NonMembershipStatement; +import com.concordium.sdk.crypto.wallet.web3Id.Statement.QualifiedRequestStatement; import com.concordium.sdk.crypto.wallet.web3Id.Statement.RangeStatement; -import com.concordium.sdk.crypto.wallet.web3Id.Statement.RequestStatement; import com.concordium.sdk.crypto.wallet.web3Id.Statement.RevealStatement; import com.concordium.sdk.responses.accountinfo.credential.AttributeType; import com.concordium.sdk.serializing.JsonMapper; @@ -24,10 +24,10 @@ public class ProofTest { - static public Request loadRequest(String fileName) throws Exception { + static public QualifiedRequest loadRequest(String fileName) throws Exception { return JsonMapper.INSTANCE.readValue( FileHelpers.readFile("./src/test/testresources/wallet/web3Id/" + fileName, Charset.forName("UTF-8")), - Request.class + QualifiedRequest.class ); } @@ -40,11 +40,11 @@ public List loadCommitmentInputs(String fileName) throws Except @Test public void testCanParseRequest() throws Exception { - Request request = loadRequest("accountRequest.json"); + QualifiedRequest request = loadRequest("accountRequest.json"); assertEquals("beefbeefbeefbeefbeefbeefbeefbeefbeefbeefbeefbeefbeefbeefbeefbeef", request.getChallenge()); - RequestStatement credentialStatement = request.getCredentialStatements().get(0); + QualifiedRequestStatement credentialStatement = request.getCredentialStatements().get(0); assertEquals("did:ccd:testnet:cred:a88a8214fc7a7f11aeda54661b76a1fd7c67e15278b83a85ec92cb799ef0abaa3b7c61a7e90ea6bb108fa2ca1a3ba217", credentialStatement.getId()); Iterator iter = credentialStatement.getStatement().iterator(); @@ -113,11 +113,11 @@ public void testCanCreateProofForAccountCredential() throws Exception { @Test public void testCanParseWeb3IdRequest() throws Exception { - Request request = loadRequest("web3IdRequest.json"); + QualifiedRequest request = loadRequest("web3IdRequest.json"); assertEquals("5d50c6e18aca83e991af81e7d7e760f5dc753db7966dc19e9aa42f25aef1696b", request.getChallenge()); - RequestStatement credentialStatement = request.getCredentialStatements().get(0); + QualifiedRequestStatement credentialStatement = request.getCredentialStatements().get(0); assertEquals("did:ccd:testnet:sci:6105:0/credentialEntry/31163ba14e30b834f1e97b9544d86df94883fd4f2c77e1d1fac0b6189c9e7996", credentialStatement.getId()); List type = credentialStatement.getType(); diff --git a/concordium-sdk/src/test/java/com/concordium/sdk/crypto/wallet/web3Id/RequestStatementTest.java b/concordium-sdk/src/test/java/com/concordium/sdk/crypto/wallet/web3Id/RequestStatementTest.java index 79767e452..e625b359a 100644 --- a/concordium-sdk/src/test/java/com/concordium/sdk/crypto/wallet/web3Id/RequestStatementTest.java +++ b/concordium-sdk/src/test/java/com/concordium/sdk/crypto/wallet/web3Id/RequestStatementTest.java @@ -3,23 +3,39 @@ import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; +import java.nio.charset.Charset; +import java.util.ArrayList; +import java.util.Arrays; import java.util.List; import org.junit.Test; +import com.concordium.sdk.crypto.wallet.ConcordiumHdWallet; import com.concordium.sdk.crypto.wallet.FileHelpers; +import com.concordium.sdk.crypto.wallet.Network; import com.concordium.sdk.crypto.wallet.identityobject.IdentityObject; import com.concordium.sdk.crypto.wallet.web3Id.Statement.AtomicStatement; +import com.concordium.sdk.crypto.wallet.web3Id.Statement.QualifiedRequestStatement; import com.concordium.sdk.crypto.wallet.web3Id.Statement.RequestStatement; - +import com.concordium.sdk.crypto.wallet.web3Id.Statement.UnqualifiedRequestStatement; +import com.concordium.sdk.serializing.JsonMapper; public class RequestStatementTest { - + + static public UnqualifiedRequest loadUnqualifiedRequest(String fileName) throws Exception { + return JsonMapper.INSTANCE.readValue( + FileHelpers.readFile("./src/test/testresources/wallet/web3Id/" + fileName, Charset.forName("UTF-8")), + UnqualifiedRequest.class); + } + + private static String TEST_SEED = "efa5e27326f8fa0902e647b52449bf335b7b605adc387015ec903f41d95080eb71361cbc7fb78721dcd4f3926a337340aa1406df83332c44c1cdcfe100603860"; + @Test public void testCanIdentitySatisfyStatement() throws Exception { IdentityObject identityObject = FileHelpers.getIdentityObject(); - List statements = ProofTest.loadRequest("accountRequest.json").getCredentialStatements(); + List statements = ProofTest.loadRequest("accountRequest.json") + .getCredentialStatements(); RequestStatement requestStatement1 = statements.get(0); assertTrue(requestStatement1.canBeProvedBy(identityObject)); } @@ -28,11 +44,29 @@ public void testCanIdentitySatisfyStatement() throws Exception { public void testGetsUnsatisfiedStatement() throws Exception { IdentityObject identityObject = FileHelpers.getIdentityObject(); - List statements = ProofTest.loadRequest("accountRequestUnder18.json").getCredentialStatements(); + List statements = ProofTest.loadRequest("accountRequestUnder18.json") + .getCredentialStatements(); RequestStatement requestStatement1 = statements.get(0); List unsatisfied = requestStatement1.getUnsatisfiedStatements(identityObject); assertEquals(1, unsatisfied.size()); assertEquals("dob", unsatisfied.get(0).getAttributeTag()); assertEquals(requestStatement1.getStatement().get(0), unsatisfied.get(0)); } + + @Test + public void testCanQualifyStatement() throws Exception { + UnqualifiedRequest request = loadUnqualifiedRequest("unqualifiedRequest.json"); + + Network network = Network.MAINNET; + ConcordiumHdWallet wallet = ConcordiumHdWallet.fromHex(TEST_SEED, network); + // Parameters taken from ConcordiumHdWalletTest.testMainnetCredentialId + QualifiedRequest qualifiedRequest = request.qualify(Arrays.asList(wallet.getCredentialId(10, 50, 5, + "b14cbfe44a02c6b1f78711176d5f437295367aa4f2a8c2551ee10d25a03adc69d61a332a058971919dad7312e1fc94c5a8d45e64b6f917c540eee16c970c3d4b7f3caf48a7746284878e2ace21c82ea44bf84609834625be1f309988ac523fac")), + network); + QualifiedRequestStatement qualifiedStatement = qualifiedRequest.getCredentialStatements().get(0); + assertEquals( + "did:ccd:mainnet:cred:8a3a87f3f38a7a507d1e85dc02a92b8bcaa859f5cf56accb3c1bc7c40e1789b4933875a38dd4c0646ca3e940a02c42d8", + qualifiedStatement.getId()); + assertEquals(request.getCredentialStatements().get(0).getStatement(), qualifiedStatement.getStatement()); + } } diff --git a/concordium-sdk/src/test/testresources/wallet/web3Id/unqualifiedRequest.json b/concordium-sdk/src/test/testresources/wallet/web3Id/unqualifiedRequest.json new file mode 100644 index 000000000..9b3548c5f --- /dev/null +++ b/concordium-sdk/src/test/testresources/wallet/web3Id/unqualifiedRequest.json @@ -0,0 +1,19 @@ +{ + "challenge": "beefbeefbeefbeefbeefbeefbeefbeefbeefbeefbeefbeefbeefbeefbeefbeef", + "credentialStatements": [ + { + "statement": [ + { + "type": "RevealAttribute", + "attributeTag": "firstName" + } + ], + "idQualifier": { + "type": "cred", + "issuers": [ + 0 + ] + } + } + ] +} From 53032f74510e7ab338185ecdf5bbf1046cbe7c47 Mon Sep 17 00:00:00 2001 From: Hjort Date: Tue, 20 Feb 2024 15:20:09 +0100 Subject: [PATCH 3/5] Fixes/cleanup/add web3IdIssuer qualifier --- .../wallet/web3Id/Statement/IdQualifier.java | 21 +++++++-- .../UnqualifiedRequestStatement.java | 34 +++++++++++++-- .../Statement/Web3IdIssuerQualifier.java | 14 ++++++ .../wallet/web3Id/UnqualifiedRequest.java | 23 +++++----- .../wallet/web3Id/RequestStatementTest.java | 43 +++++++++++++------ .../wallet/web3Id/unqualifiedRequest.json | 12 ++++++ 6 files changed, 116 insertions(+), 31 deletions(-) create mode 100644 concordium-sdk/src/main/java/com/concordium/sdk/crypto/wallet/web3Id/Statement/Web3IdIssuerQualifier.java diff --git a/concordium-sdk/src/main/java/com/concordium/sdk/crypto/wallet/web3Id/Statement/IdQualifier.java b/concordium-sdk/src/main/java/com/concordium/sdk/crypto/wallet/web3Id/Statement/IdQualifier.java index efa5d38a6..701cce168 100644 --- a/concordium-sdk/src/main/java/com/concordium/sdk/crypto/wallet/web3Id/Statement/IdQualifier.java +++ b/concordium-sdk/src/main/java/com/concordium/sdk/crypto/wallet/web3Id/Statement/IdQualifier.java @@ -1,11 +1,26 @@ package com.concordium.sdk.crypto.wallet.web3Id.Statement; +import com.fasterxml.jackson.annotation.JsonProperty; import com.fasterxml.jackson.annotation.JsonSubTypes; import com.fasterxml.jackson.annotation.JsonSubTypes.Type; import com.fasterxml.jackson.annotation.JsonTypeInfo; +import com.fasterxml.jackson.annotation.JsonUnwrapped; import com.fasterxml.jackson.annotation.JsonTypeInfo.As; import com.fasterxml.jackson.annotation.JsonTypeInfo.Id; -@JsonTypeInfo(use = Id.NAME, include = As.PROPERTY, property = "type", visible = true) -@JsonSubTypes ({@Type (value = IdentityQualifier.class)}) -public class IdQualifier {} +import lombok.Getter; + +@Getter +@JsonTypeInfo(use = Id.NAME, include = As.EXISTING_PROPERTY, property = "type", visible = true) +@JsonSubTypes({ @Type(value = IdentityQualifier.class), @Type(value = Web3IdIssuerQualifier.class) }) +public class IdQualifier { + @JsonUnwrapped + QualifierType type; + + public enum QualifierType { + @JsonProperty("cred") + Credential, + @JsonProperty("sci") + SmartContract + } +} diff --git a/concordium-sdk/src/main/java/com/concordium/sdk/crypto/wallet/web3Id/Statement/UnqualifiedRequestStatement.java b/concordium-sdk/src/main/java/com/concordium/sdk/crypto/wallet/web3Id/Statement/UnqualifiedRequestStatement.java index aeeeb3150..d85641493 100644 --- a/concordium-sdk/src/main/java/com/concordium/sdk/crypto/wallet/web3Id/Statement/UnqualifiedRequestStatement.java +++ b/concordium-sdk/src/main/java/com/concordium/sdk/crypto/wallet/web3Id/Statement/UnqualifiedRequestStatement.java @@ -1,6 +1,11 @@ package com.concordium.sdk.crypto.wallet.web3Id.Statement; +import org.apache.commons.codec.binary.Hex; + +import com.concordium.sdk.crypto.ed25519.ED25519PublicKey; import com.concordium.sdk.crypto.wallet.Network; +import com.concordium.sdk.transactions.CredentialRegistrationId; +import com.concordium.sdk.types.ContractAddress; import lombok.Getter; import lombok.experimental.SuperBuilder; @@ -12,8 +17,31 @@ public class UnqualifiedRequestStatement extends RequestStatement { private IdQualifier idQualifier; - public QualifiedRequestStatement qualify(String credId, Network network) { - String did = "did:ccd:" + network.getValue().toLowerCase() + ":cred:" + credId; - return QualifiedRequestStatement.builder().id(did).statement(getStatement()).build(); + public QualifiedRequestStatement qualify(CredentialRegistrationId credId, Network network) { + if (!idQualifier.getType().equals(IdQualifier.QualifierType.Credential)) { + throw new IllegalArgumentException("Only an account statement may only be qualified using a credentialId"); + } + String did = "did:ccd:" + network.getValue().toLowerCase() + ":cred:" + credId.getEncoded(); + return QualifiedRequestStatement.builder().id(did).statement(getStatement()).build(); + } + + public QualifiedRequestStatement qualify(ContractAddress contract, ED25519PublicKey publicKey, Network network) { + if (!idQualifier.getType().equals(IdQualifier.QualifierType.SmartContract)) { + throw new IllegalArgumentException( + "Only an web3Id statement may only be qualified using a Contract Address"); + } + if (!((Web3IdIssuerQualifier) idQualifier).getIssuers().contains(contract)) { + throw new IllegalArgumentException("The Contract Address must be one specified in the qualifier"); + } + + String did = "did:ccd:" + + network.getValue().toLowerCase() + + ":sci:" + + contract.getIndex() + + ":" + + contract.getSubIndex() + + "/credentialEntry/" + + Hex.encodeHexString(publicKey.getRawBytes()); + return QualifiedRequestStatement.builder().id(did).statement(getStatement()).build(); } } diff --git a/concordium-sdk/src/main/java/com/concordium/sdk/crypto/wallet/web3Id/Statement/Web3IdIssuerQualifier.java b/concordium-sdk/src/main/java/com/concordium/sdk/crypto/wallet/web3Id/Statement/Web3IdIssuerQualifier.java new file mode 100644 index 000000000..c9eda9829 --- /dev/null +++ b/concordium-sdk/src/main/java/com/concordium/sdk/crypto/wallet/web3Id/Statement/Web3IdIssuerQualifier.java @@ -0,0 +1,14 @@ +package com.concordium.sdk.crypto.wallet.web3Id.Statement; + +import java.util.List; + +import com.concordium.sdk.types.ContractAddress; +import com.fasterxml.jackson.annotation.JsonTypeName; + +import lombok.Getter; + +@Getter +@JsonTypeName("sci") +public class Web3IdIssuerQualifier extends IdQualifier { + private List issuers; +} diff --git a/concordium-sdk/src/main/java/com/concordium/sdk/crypto/wallet/web3Id/UnqualifiedRequest.java b/concordium-sdk/src/main/java/com/concordium/sdk/crypto/wallet/web3Id/UnqualifiedRequest.java index 1804beb76..1f7a2188e 100644 --- a/concordium-sdk/src/main/java/com/concordium/sdk/crypto/wallet/web3Id/UnqualifiedRequest.java +++ b/concordium-sdk/src/main/java/com/concordium/sdk/crypto/wallet/web3Id/UnqualifiedRequest.java @@ -1,14 +1,9 @@ package com.concordium.sdk.crypto.wallet.web3Id; import java.util.List; -import java.util.stream.Collector; import java.util.stream.Collectors; -import java.util.stream.IntStream; - -import com.concordium.sdk.crypto.wallet.Network; import com.concordium.sdk.crypto.wallet.web3Id.Statement.QualifiedRequestStatement; import com.concordium.sdk.crypto.wallet.web3Id.Statement.UnqualifiedRequestStatement; - import lombok.Builder; import lombok.Getter; import lombok.extern.jackson.Jacksonized; @@ -20,13 +15,19 @@ public class UnqualifiedRequest { private final String challenge; private final List credentialStatements; - public QualifiedRequest qualify(List credIds, Network network) { - if (credIds.size() != credentialStatements.size()) { - throw new IllegalArgumentException("List of credIds must be same size as credentialStatements"); - } - List qualifiedStatements = IntStream.range(0, credentialStatements.size()) - .mapToObj(index -> credentialStatements.get(index).qualify(credIds.get(index), network)) + /** + * Creates a qualified request, that can be used to generate a presentation. + * @param qualifier function to qualify the individual request statements. + * @return a QualifiedRequest with the same challenge, and with the statements + * transformed using the qualifier. + */ + public QualifiedRequest qualify(Qualifier qualifier) { + List qualifiedStatements = credentialStatements.stream().map(qualifier::qualify) .collect(Collectors.toList()); return QualifiedRequest.builder().challenge(challenge).credentialStatements(qualifiedStatements).build(); } + + static interface Qualifier { + QualifiedRequestStatement qualify(UnqualifiedRequestStatement statement); + } } diff --git a/concordium-sdk/src/test/java/com/concordium/sdk/crypto/wallet/web3Id/RequestStatementTest.java b/concordium-sdk/src/test/java/com/concordium/sdk/crypto/wallet/web3Id/RequestStatementTest.java index e625b359a..a31d4da11 100644 --- a/concordium-sdk/src/test/java/com/concordium/sdk/crypto/wallet/web3Id/RequestStatementTest.java +++ b/concordium-sdk/src/test/java/com/concordium/sdk/crypto/wallet/web3Id/RequestStatementTest.java @@ -4,21 +4,21 @@ import static org.junit.Assert.assertTrue; import java.nio.charset.Charset; -import java.util.ArrayList; -import java.util.Arrays; import java.util.List; import org.junit.Test; -import com.concordium.sdk.crypto.wallet.ConcordiumHdWallet; +import com.concordium.sdk.crypto.ed25519.ED25519PublicKey; import com.concordium.sdk.crypto.wallet.FileHelpers; import com.concordium.sdk.crypto.wallet.Network; import com.concordium.sdk.crypto.wallet.identityobject.IdentityObject; import com.concordium.sdk.crypto.wallet.web3Id.Statement.AtomicStatement; +import com.concordium.sdk.crypto.wallet.web3Id.Statement.IdQualifier; import com.concordium.sdk.crypto.wallet.web3Id.Statement.QualifiedRequestStatement; import com.concordium.sdk.crypto.wallet.web3Id.Statement.RequestStatement; -import com.concordium.sdk.crypto.wallet.web3Id.Statement.UnqualifiedRequestStatement; import com.concordium.sdk.serializing.JsonMapper; +import com.concordium.sdk.transactions.CredentialRegistrationId; +import com.concordium.sdk.types.ContractAddress; public class RequestStatementTest { @@ -28,8 +28,6 @@ static public UnqualifiedRequest loadUnqualifiedRequest(String fileName) throws UnqualifiedRequest.class); } - private static String TEST_SEED = "efa5e27326f8fa0902e647b52449bf335b7b605adc387015ec903f41d95080eb71361cbc7fb78721dcd4f3926a337340aa1406df83332c44c1cdcfe100603860"; - @Test public void testCanIdentitySatisfyStatement() throws Exception { IdentityObject identityObject = FileHelpers.getIdentityObject(); @@ -55,18 +53,35 @@ public void testGetsUnsatisfiedStatement() throws Exception { @Test public void testCanQualifyStatement() throws Exception { + // Arrange UnqualifiedRequest request = loadUnqualifiedRequest("unqualifiedRequest.json"); Network network = Network.MAINNET; - ConcordiumHdWallet wallet = ConcordiumHdWallet.fromHex(TEST_SEED, network); - // Parameters taken from ConcordiumHdWalletTest.testMainnetCredentialId - QualifiedRequest qualifiedRequest = request.qualify(Arrays.asList(wallet.getCredentialId(10, 50, 5, - "b14cbfe44a02c6b1f78711176d5f437295367aa4f2a8c2551ee10d25a03adc69d61a332a058971919dad7312e1fc94c5a8d45e64b6f917c540eee16c970c3d4b7f3caf48a7746284878e2ace21c82ea44bf84609834625be1f309988ac523fac")), - network); - QualifiedRequestStatement qualifiedStatement = qualifiedRequest.getCredentialStatements().get(0); + CredentialRegistrationId credId = CredentialRegistrationId.from( + "8a3a87f3f38a7a507d1e85dc02a92b8bcaa859f5cf56accb3c1bc7c40e1789b4933875a38dd4c0646ca3e940a02c42d8"); + ContractAddress contractAddress = ContractAddress.from(1232, 3); + ED25519PublicKey publicKey = ED25519PublicKey + .from("16afdb3cb3568b5ad8f9a0fa3c741b065642de8c53e58f7920bf449e63ff2bf9"); + + // Act + QualifiedRequest qualifiedRequest = request.qualify(statement -> { + if (statement.getIdQualifier().getType().equals(IdQualifier.QualifierType.Credential)) { + return statement.qualify(credId, network); + } else { + return statement.qualify(contractAddress, publicKey, network); + } + }); + + // Assert + QualifiedRequestStatement qualifiedAccountStatement = qualifiedRequest.getCredentialStatements().get(0); assertEquals( "did:ccd:mainnet:cred:8a3a87f3f38a7a507d1e85dc02a92b8bcaa859f5cf56accb3c1bc7c40e1789b4933875a38dd4c0646ca3e940a02c42d8", - qualifiedStatement.getId()); - assertEquals(request.getCredentialStatements().get(0).getStatement(), qualifiedStatement.getStatement()); + qualifiedAccountStatement.getId()); + assertEquals(request.getCredentialStatements().get(0).getStatement(), qualifiedAccountStatement.getStatement()); + QualifiedRequestStatement qualifiedWeb3IdStatement = qualifiedRequest.getCredentialStatements().get(1); + assertEquals( + "did:ccd:mainnet:sci:1232:3/credentialEntry/16afdb3cb3568b5ad8f9a0fa3c741b065642de8c53e58f7920bf449e63ff2bf9", + qualifiedWeb3IdStatement.getId()); + assertEquals(request.getCredentialStatements().get(1).getStatement(), qualifiedWeb3IdStatement.getStatement()); } } diff --git a/concordium-sdk/src/test/testresources/wallet/web3Id/unqualifiedRequest.json b/concordium-sdk/src/test/testresources/wallet/web3Id/unqualifiedRequest.json index 9b3548c5f..15d1f7c9a 100644 --- a/concordium-sdk/src/test/testresources/wallet/web3Id/unqualifiedRequest.json +++ b/concordium-sdk/src/test/testresources/wallet/web3Id/unqualifiedRequest.json @@ -14,6 +14,18 @@ 0 ] } + }, + { + "statement": [ + { + "type": "RevealAttribute", + "attributeTag": "degreeName" + } + ], + "idQualifier": { + "type": "sci", + "issuers": [{"index": 100, "subindex": 0}, {"index": 1232, "subindex": 3}] + } } ] } From e169199ccfbf6ac4e042c4846408bd6ccfb21373 Mon Sep 17 00:00:00 2001 From: Hjort Date: Mon, 4 Mar 2024 13:17:42 +0100 Subject: [PATCH 4/5] Finish merge with main --- .../wallet/web3Id/Statement/IdQualifier.java | 11 ++------ .../Statement/QualifiedRequestStatement.java | 8 +++++- .../web3Id/Statement/RequestStatement.java | 5 +--- .../UnqualifiedRequestStatement.java | 25 ++++++++++--------- ...ava => VerifiableCredentialQualifier.java} | 2 +- .../did/Web3IssuerRequestIdentifier.java | 2 -- .../wallet/web3Id/RequestStatementTest.java | 8 +++--- 7 files changed, 28 insertions(+), 33 deletions(-) rename concordium-sdk/src/main/java/com/concordium/sdk/crypto/wallet/web3Id/Statement/{Web3IdIssuerQualifier.java => VerifiableCredentialQualifier.java} (81%) diff --git a/concordium-sdk/src/main/java/com/concordium/sdk/crypto/wallet/web3Id/Statement/IdQualifier.java b/concordium-sdk/src/main/java/com/concordium/sdk/crypto/wallet/web3Id/Statement/IdQualifier.java index 701cce168..de6c89fb2 100644 --- a/concordium-sdk/src/main/java/com/concordium/sdk/crypto/wallet/web3Id/Statement/IdQualifier.java +++ b/concordium-sdk/src/main/java/com/concordium/sdk/crypto/wallet/web3Id/Statement/IdQualifier.java @@ -12,15 +12,8 @@ @Getter @JsonTypeInfo(use = Id.NAME, include = As.EXISTING_PROPERTY, property = "type", visible = true) -@JsonSubTypes({ @Type(value = IdentityQualifier.class), @Type(value = Web3IdIssuerQualifier.class) }) +@JsonSubTypes({ @Type(value = IdentityQualifier.class), @Type(value = VerifiableCredentialQualifier.class) }) public class IdQualifier { @JsonUnwrapped - QualifierType type; - - public enum QualifierType { - @JsonProperty("cred") - Credential, - @JsonProperty("sci") - SmartContract - } + StatementType type; } diff --git a/concordium-sdk/src/main/java/com/concordium/sdk/crypto/wallet/web3Id/Statement/QualifiedRequestStatement.java b/concordium-sdk/src/main/java/com/concordium/sdk/crypto/wallet/web3Id/Statement/QualifiedRequestStatement.java index ba116bbe0..adaef019e 100644 --- a/concordium-sdk/src/main/java/com/concordium/sdk/crypto/wallet/web3Id/Statement/QualifiedRequestStatement.java +++ b/concordium-sdk/src/main/java/com/concordium/sdk/crypto/wallet/web3Id/Statement/QualifiedRequestStatement.java @@ -1,5 +1,7 @@ package com.concordium.sdk.crypto.wallet.web3Id.Statement; +import com.concordium.sdk.crypto.wallet.web3Id.Statement.did.RequestIdentifier; + import lombok.Getter; import lombok.experimental.SuperBuilder; import lombok.extern.jackson.Jacksonized; @@ -8,5 +10,9 @@ @SuperBuilder @Jacksonized public class QualifiedRequestStatement extends RequestStatement { - private String id; + private RequestIdentifier id; + + public StatementType getStatementType() { + return this.id.getType(); + } } diff --git a/concordium-sdk/src/main/java/com/concordium/sdk/crypto/wallet/web3Id/Statement/RequestStatement.java b/concordium-sdk/src/main/java/com/concordium/sdk/crypto/wallet/web3Id/Statement/RequestStatement.java index 51d3e05c2..6f6ee22d4 100644 --- a/concordium-sdk/src/main/java/com/concordium/sdk/crypto/wallet/web3Id/Statement/RequestStatement.java +++ b/concordium-sdk/src/main/java/com/concordium/sdk/crypto/wallet/web3Id/Statement/RequestStatement.java @@ -13,14 +13,11 @@ @SuperBuilder @Getter public abstract class RequestStatement { - private RequestIdentifier id; @JsonProperty("type") private List verifiableCredentialTypes; private List statement; - public StatementType getStatementType() { - return this.id.getType(); - } + public abstract StatementType getStatementType(); public List getUnsatisfiedStatements(IdentityObject identityObject) { if (!this.getStatementType().equals(StatementType.Credential)) { diff --git a/concordium-sdk/src/main/java/com/concordium/sdk/crypto/wallet/web3Id/Statement/UnqualifiedRequestStatement.java b/concordium-sdk/src/main/java/com/concordium/sdk/crypto/wallet/web3Id/Statement/UnqualifiedRequestStatement.java index d85641493..3b76d2a71 100644 --- a/concordium-sdk/src/main/java/com/concordium/sdk/crypto/wallet/web3Id/Statement/UnqualifiedRequestStatement.java +++ b/concordium-sdk/src/main/java/com/concordium/sdk/crypto/wallet/web3Id/Statement/UnqualifiedRequestStatement.java @@ -4,6 +4,9 @@ import com.concordium.sdk.crypto.ed25519.ED25519PublicKey; import com.concordium.sdk.crypto.wallet.Network; +import com.concordium.sdk.crypto.wallet.web3Id.Statement.did.AccountRequestIdentifier; +import com.concordium.sdk.crypto.wallet.web3Id.Statement.did.RequestIdentifier; +import com.concordium.sdk.crypto.wallet.web3Id.Statement.did.Web3IssuerRequestIdentifier; import com.concordium.sdk.transactions.CredentialRegistrationId; import com.concordium.sdk.types.ContractAddress; @@ -17,31 +20,29 @@ public class UnqualifiedRequestStatement extends RequestStatement { private IdQualifier idQualifier; + @Override + public StatementType getStatementType() { + return this.idQualifier.type; + } + public QualifiedRequestStatement qualify(CredentialRegistrationId credId, Network network) { - if (!idQualifier.getType().equals(IdQualifier.QualifierType.Credential)) { + if (!idQualifier.getType().equals(StatementType.Credential)) { throw new IllegalArgumentException("Only an account statement may only be qualified using a credentialId"); } - String did = "did:ccd:" + network.getValue().toLowerCase() + ":cred:" + credId.getEncoded(); + RequestIdentifier did = new AccountRequestIdentifier(network, credId); return QualifiedRequestStatement.builder().id(did).statement(getStatement()).build(); } public QualifiedRequestStatement qualify(ContractAddress contract, ED25519PublicKey publicKey, Network network) { - if (!idQualifier.getType().equals(IdQualifier.QualifierType.SmartContract)) { + if (!idQualifier.getType().equals(StatementType.SmartContract)) { throw new IllegalArgumentException( "Only an web3Id statement may only be qualified using a Contract Address"); } - if (!((Web3IdIssuerQualifier) idQualifier).getIssuers().contains(contract)) { + if (!((VerifiableCredentialQualifier) idQualifier).getIssuers().contains(contract)) { throw new IllegalArgumentException("The Contract Address must be one specified in the qualifier"); } - String did = "did:ccd:" + - network.getValue().toLowerCase() + - ":sci:" + - contract.getIndex() + - ":" + - contract.getSubIndex() + - "/credentialEntry/" + - Hex.encodeHexString(publicKey.getRawBytes()); + RequestIdentifier did = new Web3IssuerRequestIdentifier(network, contract, publicKey); return QualifiedRequestStatement.builder().id(did).statement(getStatement()).build(); } } diff --git a/concordium-sdk/src/main/java/com/concordium/sdk/crypto/wallet/web3Id/Statement/Web3IdIssuerQualifier.java b/concordium-sdk/src/main/java/com/concordium/sdk/crypto/wallet/web3Id/Statement/VerifiableCredentialQualifier.java similarity index 81% rename from concordium-sdk/src/main/java/com/concordium/sdk/crypto/wallet/web3Id/Statement/Web3IdIssuerQualifier.java rename to concordium-sdk/src/main/java/com/concordium/sdk/crypto/wallet/web3Id/Statement/VerifiableCredentialQualifier.java index c9eda9829..b1d2ef4ba 100644 --- a/concordium-sdk/src/main/java/com/concordium/sdk/crypto/wallet/web3Id/Statement/Web3IdIssuerQualifier.java +++ b/concordium-sdk/src/main/java/com/concordium/sdk/crypto/wallet/web3Id/Statement/VerifiableCredentialQualifier.java @@ -9,6 +9,6 @@ @Getter @JsonTypeName("sci") -public class Web3IdIssuerQualifier extends IdQualifier { +public class VerifiableCredentialQualifier extends IdQualifier { private List issuers; } diff --git a/concordium-sdk/src/main/java/com/concordium/sdk/crypto/wallet/web3Id/Statement/did/Web3IssuerRequestIdentifier.java b/concordium-sdk/src/main/java/com/concordium/sdk/crypto/wallet/web3Id/Statement/did/Web3IssuerRequestIdentifier.java index 1609dadba..4daa5ea5c 100644 --- a/concordium-sdk/src/main/java/com/concordium/sdk/crypto/wallet/web3Id/Statement/did/Web3IssuerRequestIdentifier.java +++ b/concordium-sdk/src/main/java/com/concordium/sdk/crypto/wallet/web3Id/Statement/did/Web3IssuerRequestIdentifier.java @@ -5,8 +5,6 @@ import javax.annotation.Nullable; -import org.apache.commons.codec.binary.Hex; - import com.concordium.sdk.crypto.ed25519.ED25519PublicKey; import com.concordium.sdk.crypto.wallet.Network; import com.concordium.sdk.crypto.wallet.web3Id.Statement.StatementType; diff --git a/concordium-sdk/src/test/java/com/concordium/sdk/crypto/wallet/web3Id/RequestStatementTest.java b/concordium-sdk/src/test/java/com/concordium/sdk/crypto/wallet/web3Id/RequestStatementTest.java index a31d4da11..9826fb03f 100644 --- a/concordium-sdk/src/test/java/com/concordium/sdk/crypto/wallet/web3Id/RequestStatementTest.java +++ b/concordium-sdk/src/test/java/com/concordium/sdk/crypto/wallet/web3Id/RequestStatementTest.java @@ -13,9 +13,9 @@ import com.concordium.sdk.crypto.wallet.Network; import com.concordium.sdk.crypto.wallet.identityobject.IdentityObject; import com.concordium.sdk.crypto.wallet.web3Id.Statement.AtomicStatement; -import com.concordium.sdk.crypto.wallet.web3Id.Statement.IdQualifier; import com.concordium.sdk.crypto.wallet.web3Id.Statement.QualifiedRequestStatement; import com.concordium.sdk.crypto.wallet.web3Id.Statement.RequestStatement; +import com.concordium.sdk.crypto.wallet.web3Id.Statement.StatementType; import com.concordium.sdk.serializing.JsonMapper; import com.concordium.sdk.transactions.CredentialRegistrationId; import com.concordium.sdk.types.ContractAddress; @@ -65,7 +65,7 @@ public void testCanQualifyStatement() throws Exception { // Act QualifiedRequest qualifiedRequest = request.qualify(statement -> { - if (statement.getIdQualifier().getType().equals(IdQualifier.QualifierType.Credential)) { + if (statement.getIdQualifier().getType().equals(StatementType.Credential)) { return statement.qualify(credId, network); } else { return statement.qualify(contractAddress, publicKey, network); @@ -76,12 +76,12 @@ public void testCanQualifyStatement() throws Exception { QualifiedRequestStatement qualifiedAccountStatement = qualifiedRequest.getCredentialStatements().get(0); assertEquals( "did:ccd:mainnet:cred:8a3a87f3f38a7a507d1e85dc02a92b8bcaa859f5cf56accb3c1bc7c40e1789b4933875a38dd4c0646ca3e940a02c42d8", - qualifiedAccountStatement.getId()); + qualifiedAccountStatement.getId().toString()); assertEquals(request.getCredentialStatements().get(0).getStatement(), qualifiedAccountStatement.getStatement()); QualifiedRequestStatement qualifiedWeb3IdStatement = qualifiedRequest.getCredentialStatements().get(1); assertEquals( "did:ccd:mainnet:sci:1232:3/credentialEntry/16afdb3cb3568b5ad8f9a0fa3c741b065642de8c53e58f7920bf449e63ff2bf9", - qualifiedWeb3IdStatement.getId()); + qualifiedWeb3IdStatement.getId().toString()); assertEquals(request.getCredentialStatements().get(1).getStatement(), qualifiedWeb3IdStatement.getStatement()); } } From 36dfa0adb753b2f74c375828621b77fe4ada1aa2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=B8ren=20Hjort?= <87635671+shjortConcordium@users.noreply.github.com> Date: Mon, 4 Mar 2024 13:23:05 +0100 Subject: [PATCH 5/5] Apply suggestions from code review MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Jakob Ørhøj <57264157+orhoj@users.noreply.github.com> --- .../wallet/web3Id/Statement/UnqualifiedRequestStatement.java | 4 ++-- .../sdk/crypto/wallet/web3Id/UnqualifiedRequest.java | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/concordium-sdk/src/main/java/com/concordium/sdk/crypto/wallet/web3Id/Statement/UnqualifiedRequestStatement.java b/concordium-sdk/src/main/java/com/concordium/sdk/crypto/wallet/web3Id/Statement/UnqualifiedRequestStatement.java index 3b76d2a71..846950b85 100644 --- a/concordium-sdk/src/main/java/com/concordium/sdk/crypto/wallet/web3Id/Statement/UnqualifiedRequestStatement.java +++ b/concordium-sdk/src/main/java/com/concordium/sdk/crypto/wallet/web3Id/Statement/UnqualifiedRequestStatement.java @@ -27,7 +27,7 @@ public StatementType getStatementType() { public QualifiedRequestStatement qualify(CredentialRegistrationId credId, Network network) { if (!idQualifier.getType().equals(StatementType.Credential)) { - throw new IllegalArgumentException("Only an account statement may only be qualified using a credentialId"); + throw new IllegalArgumentException("Only an account statement may be qualified using a credentialId"); } RequestIdentifier did = new AccountRequestIdentifier(network, credId); return QualifiedRequestStatement.builder().id(did).statement(getStatement()).build(); @@ -36,7 +36,7 @@ public QualifiedRequestStatement qualify(CredentialRegistrationId credId, Networ public QualifiedRequestStatement qualify(ContractAddress contract, ED25519PublicKey publicKey, Network network) { if (!idQualifier.getType().equals(StatementType.SmartContract)) { throw new IllegalArgumentException( - "Only an web3Id statement may only be qualified using a Contract Address"); + "Only a verifiable credential statement may be qualified using a Contract Address"); } if (!((VerifiableCredentialQualifier) idQualifier).getIssuers().contains(contract)) { throw new IllegalArgumentException("The Contract Address must be one specified in the qualifier"); diff --git a/concordium-sdk/src/main/java/com/concordium/sdk/crypto/wallet/web3Id/UnqualifiedRequest.java b/concordium-sdk/src/main/java/com/concordium/sdk/crypto/wallet/web3Id/UnqualifiedRequest.java index 1f7a2188e..b3aba7a2c 100644 --- a/concordium-sdk/src/main/java/com/concordium/sdk/crypto/wallet/web3Id/UnqualifiedRequest.java +++ b/concordium-sdk/src/main/java/com/concordium/sdk/crypto/wallet/web3Id/UnqualifiedRequest.java @@ -27,7 +27,7 @@ public QualifiedRequest qualify(Qualifier qualifier) { return QualifiedRequest.builder().challenge(challenge).credentialStatements(qualifiedStatements).build(); } - static interface Qualifier { + public static interface Qualifier { QualifiedRequestStatement qualify(UnqualifiedRequestStatement statement); } }