Skip to content
This repository was archived by the owner on Apr 22, 2025. It is now read-only.

Commit 5721b15

Browse files
adecaroSaad Karim
authored andcommitted
[FAB-6843] Integrating Signing Identity
This change-set does the following: - It integrates the SigningIdentity interface in the TransactionContext class. A SigningIdentity represents the capability of user to sign messages. Indeed, a SigningIdentity instance can be obtanied from an instance of the User interface. This will simplify the integration of different signing algorithms like those offered by idemix. Change-Id: I78eed75938601d42586ac4988040d92896d73e76 Signed-off-by: Angelo De Caro <adc@zurich.ibm.com> Signed-off-by: Manu Drijvers <mdr@zurich.ibm.com> Signed-off-by: Rafa Torres <rtm@zurich.ibm.com>
1 parent 814bf79 commit 5721b15

31 files changed

+318
-176
lines changed

src/main/java/org/hyperledger/fabric/sdk/Channel.java

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -107,6 +107,7 @@
107107
import org.hyperledger.fabric.sdk.helper.Config;
108108
import org.hyperledger.fabric.sdk.helper.DiagnosticFileDumper;
109109
import org.hyperledger.fabric.sdk.helper.Utils;
110+
import org.hyperledger.fabric.sdk.identity.IdentityFactory;
110111
import org.hyperledger.fabric.sdk.security.certgen.TLSCertificateBuilder;
111112
import org.hyperledger.fabric.sdk.security.certgen.TLSCertificateKeyPair;
112113
import org.hyperledger.fabric.sdk.transaction.GetConfigBlockBuilder;
@@ -2243,13 +2244,15 @@ public Collection<ProposalResponse> sendUpgradeProposal(UpgradeProposalRequest u
22432244
}
22442245
}
22452246

2246-
private SignedProposal getSignedProposal(TransactionContext transactionContext, FabricProposal.Proposal proposal) throws CryptoException {
2247+
private SignedProposal getSignedProposal(TransactionContext transactionContext, FabricProposal.Proposal proposal) throws CryptoException, InvalidArgumentException {
22472248

2248-
return SignedProposal.newBuilder()
2249+
SignedProposal sp;
2250+
sp = SignedProposal.newBuilder()
22492251
.setProposalBytes(proposal.toByteString())
22502252
.setSignature(transactionContext.signByteString(proposal.toByteArray()))
22512253
.build();
22522254

2255+
return sp;
22532256
}
22542257

22552258
private void checkChannelState() throws InvalidArgumentException {
@@ -4461,11 +4464,11 @@ private String getRespData(BroadcastResponse resp) {
44614464

44624465
}
44634466

4464-
private Envelope createTransactionEnvelope(Payload transactionPayload, User user) throws CryptoException {
4467+
private Envelope createTransactionEnvelope(Payload transactionPayload, User user) throws CryptoException, InvalidArgumentException {
44654468

44664469
return Envelope.newBuilder()
44674470
.setPayload(transactionPayload.toByteString())
4468-
.setSignature(ByteString.copyFrom(client.getCryptoSuite().sign(user.getEnrollment().getKey(), transactionPayload.toByteArray())))
4471+
.setSignature(ByteString.copyFrom(IdentityFactory.getSigningIdentity(client.getCryptoSuite(), user).sign(transactionPayload.toByteArray())))
44694472
.build();
44704473

44714474
}

src/main/java/org/hyperledger/fabric/sdk/EventHub.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -290,7 +290,7 @@ public void onCompleted() {
290290
sender = events.chat(eventStreamLocal);
291291
try {
292292
blockListen(transactionContext);
293-
} catch (CryptoException e) {
293+
} catch (Exception e) {
294294
throw new EventHubException(e);
295295
}
296296

@@ -338,7 +338,7 @@ private void reconnect() throws EventHubException {
338338

339339
}
340340

341-
private void blockListen(TransactionContext transactionContext) throws CryptoException {
341+
private void blockListen(TransactionContext transactionContext) throws CryptoException, InvalidArgumentException {
342342

343343
this.transactionContext = transactionContext;
344344

src/main/java/org/hyperledger/fabric/sdk/NetworkConfig.java

Lines changed: 20 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
import java.io.InputStream;
2121
import java.io.Reader;
2222
import java.io.StringReader;
23+
import java.lang.reflect.InvocationTargetException;
2324
import java.security.PrivateKey;
2425
import java.util.ArrayList;
2526
import java.util.Collection;
@@ -52,8 +53,13 @@
5253
import org.bouncycastle.openssl.jcajce.JcaPEMKeyConverter;
5354
import org.hyperledger.fabric.sdk.Channel.PeerOptions;
5455
import org.hyperledger.fabric.sdk.Peer.PeerRole;
56+
import org.hyperledger.fabric.sdk.exception.CryptoException;
5557
import org.hyperledger.fabric.sdk.exception.InvalidArgumentException;
5658
import org.hyperledger.fabric.sdk.exception.NetworkConfigurationException;
59+
import org.hyperledger.fabric.sdk.identity.SigningIdentity;
60+
import org.hyperledger.fabric.sdk.identity.X509Enrollment;
61+
import org.hyperledger.fabric.sdk.identity.X509SigningIdentity;
62+
import org.hyperledger.fabric.sdk.security.CryptoSuite;
5763
import org.yaml.snakeyaml.Yaml;
5864

5965
import static java.lang.String.format;
@@ -851,18 +857,12 @@ private OrgInfo createOrg(String orgName, JsonObject jsonOrg, Map<String, JsonOb
851857

852858
final PrivateKey privateKeyFinal = privateKey;
853859

854-
org.peerAdmin = new UserInfo(mspId, "PeerAdmin_" + mspId + "_" + orgName, null);
855-
org.peerAdmin.setEnrollment(new Enrollment() {
856-
@Override
857-
public PrivateKey getKey() {
858-
return privateKeyFinal;
859-
}
860-
861-
@Override
862-
public String getCert() {
863-
return signedCert;
864-
}
865-
});
860+
try {
861+
org.peerAdmin = new UserInfo(CryptoSuite.Factory.getCryptoSuite(), mspId, "PeerAdmin_" + mspId + "_" + orgName, null);
862+
} catch (Exception e) {
863+
throw new NetworkConfigurationException(e.getMessage(), e);
864+
}
865+
org.peerAdmin.setEnrollment(new X509Enrollment(privateKeyFinal, signedCert));
866866

867867
}
868868

@@ -932,7 +932,11 @@ private CAInfo createCA(String name, JsonObject jsonCA, OrgInfo org) throws Netw
932932
for (JsonObject reg : registrars) {
933933
enrollId = getJsonValueAsString(reg.get("enrollId"));
934934
enrollSecret = getJsonValueAsString(reg.get("enrollSecret"));
935-
regUsers.add(new UserInfo(org.mspId, enrollId, enrollSecret));
935+
try {
936+
regUsers.add(new UserInfo(CryptoSuite.Factory.getCryptoSuite(), org.mspId, enrollId, enrollSecret));
937+
} catch (Exception e) {
938+
throw new NetworkConfigurationException(e.getMessage(), e);
939+
}
936940
}
937941
}
938942

@@ -1132,6 +1136,7 @@ public void setName(String name) {
11321136
private String account;
11331137
private String affiliation;
11341138
private Enrollment enrollment;
1139+
private CryptoSuite suite;
11351140

11361141
public void setEnrollSecret(String enrollSecret) {
11371142
this.enrollSecret = enrollSecret;
@@ -1161,7 +1166,8 @@ public void setEnrollment(Enrollment enrollment) {
11611166
this.enrollment = enrollment;
11621167
}
11631168

1164-
UserInfo(String mspid, String name, String enrollSecret) {
1169+
UserInfo(CryptoSuite suite, String mspid, String name, String enrollSecret) {
1170+
this.suite = suite;
11651171
this.name = name;
11661172
this.enrollSecret = enrollSecret;
11671173
this.mspid = mspid;

src/main/java/org/hyperledger/fabric/sdk/PeerEventServiceClient.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -392,7 +392,7 @@ void peerVent(TransactionContext transactionContext) throws TransactionException
392392

393393
clientTLSCertificateDigest);
394394
connectEnvelope(envelope);
395-
} catch (CryptoException e) {
395+
} catch (Exception e) {
396396
throw new TransactionException(e);
397397
}
398398

src/main/java/org/hyperledger/fabric/sdk/User.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818

1919
import org.hyperledger.fabric.sdk.exception.InvalidArgumentException;
2020
import org.hyperledger.fabric.sdk.helper.Utils;
21+
import org.hyperledger.fabric.sdk.identity.SigningIdentity;
2122

2223
import static java.lang.String.format;
2324

src/main/java/org/hyperledger/fabric/sdk/idemix/IdemixCredential.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -174,4 +174,4 @@ Idemix.Credential toProto() {
174174

175175
return builder.build();
176176
}
177-
}
177+
}
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
package org.hyperledger.fabric.sdk.identity;
2+
3+
import java.security.KeyPair;
4+
import java.security.PrivateKey;
5+
6+
import org.hyperledger.fabric.sdk.Enrollment;
7+
8+
public class IdemixEnrollment implements Enrollment {
9+
10+
private KeyPair key;
11+
private String cert;
12+
13+
public IdemixEnrollment(KeyPair signingKeyPair, String signedPem) {
14+
this.key = signingKeyPair;
15+
this.cert = signedPem;
16+
}
17+
18+
public PrivateKey getKey() {
19+
return key.getPrivate();
20+
}
21+
22+
public String getCert() {
23+
return cert;
24+
}
25+
26+
}
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
package org.hyperledger.fabric.sdk.identity;
2+
3+
import org.hyperledger.fabric.sdk.Enrollment;
4+
import org.hyperledger.fabric.sdk.User;
5+
import org.hyperledger.fabric.sdk.security.CryptoSuite;
6+
7+
public class IdentityFactory {
8+
private IdentityFactory() {
9+
// private constructor for utility class
10+
}
11+
12+
public static SigningIdentity getSigningIdentity(CryptoSuite cryptoSuite, User user) {
13+
Enrollment enrollment = user.getEnrollment();
14+
15+
if (enrollment instanceof X509Enrollment) {
16+
return new X509SigningIdentity(cryptoSuite, user);
17+
}
18+
19+
throw new IllegalStateException("Invalid enrollment. Expected X509Enrollment. " + enrollment);
20+
}
21+
22+
}
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
package org.hyperledger.fabric.sdk.identity;
2+
3+
import java.io.Serializable;
4+
import java.security.KeyPair;
5+
import java.security.PrivateKey;
6+
7+
import org.hyperledger.fabric.sdk.Enrollment;
8+
9+
public class X509Enrollment implements Enrollment, Serializable {
10+
11+
private PrivateKey key;
12+
private String cert;
13+
14+
public X509Enrollment(KeyPair signingKeyPair, String signedPem) {
15+
key = signingKeyPair.getPrivate();
16+
this.cert = signedPem;
17+
}
18+
19+
public X509Enrollment(PrivateKey key, String signedPem) {
20+
this.key = key;
21+
this.cert = signedPem;
22+
}
23+
24+
public PrivateKey getKey() {
25+
return key;
26+
}
27+
28+
public String getCert() {
29+
return cert;
30+
}
31+
32+
}
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
package org.hyperledger.fabric.sdk.identity;
2+
3+
import org.hyperledger.fabric.protos.msp.Identities;
4+
import org.hyperledger.fabric.sdk.User;
5+
import org.hyperledger.fabric.sdk.transaction.ProtoUtils;
6+
7+
public class X509Identity implements Identity {
8+
9+
protected User user;
10+
11+
public X509Identity(User user) {
12+
if (user == null) {
13+
throw new IllegalArgumentException("User is null");
14+
}
15+
if (user.getEnrollment() == null) {
16+
throw new IllegalArgumentException("user.getEnrollment() is null");
17+
}
18+
if (user.getEnrollment().getCert() == null) {
19+
throw new IllegalArgumentException("user.getEnrollment().getCert() is null");
20+
}
21+
22+
this.user = user;
23+
}
24+
25+
@Override
26+
public Identities.SerializedIdentity createSerializedIdentity() {
27+
return ProtoUtils.createSerializedIdentity(user);
28+
}
29+
}

0 commit comments

Comments
 (0)