Skip to content

Commit 9f7afc6

Browse files
authored
add recover addr from sig api (#903)
* add recover addr from sig api * HsmSM2Signature override ecrecover api * fix test failed and googleJavaFormat * rename related func name
1 parent a51ea4c commit 9f7afc6

File tree

7 files changed

+163
-0
lines changed

7 files changed

+163
-0
lines changed

src/main/java/org/fisco/bcos/sdk/v3/crypto/CryptoSuite.java

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -306,6 +306,28 @@ public boolean verify(final String publicKey, final byte[] message, final byte[]
306306
return this.signatureImpl.verify(publicKey, message, signature);
307307
}
308308

309+
/**
310+
* recover address from signature
311+
*
312+
* @param msgHash the message hash, must be a digest
313+
* @param signature the signature to be recovered
314+
* @return the public key whitch can verify signature.
315+
*/
316+
public String recoverAddress(final String msgHash, final SignatureResult signature) {
317+
return this.signatureImpl.recoverAddress(msgHash, signature);
318+
}
319+
320+
/**
321+
* recover address from signature
322+
*
323+
* @param msgHash the byte array type message hash, must be a digest
324+
* @param signature the byte array type signature to be recovered
325+
* @return the public key whitch can verify signature.
326+
*/
327+
public String recoverAddress(final byte[] msgHash, final SignatureResult signature) {
328+
return this.signatureImpl.recoverAddress(msgHash, signature);
329+
}
330+
309331
/**
310332
* Create key pair
311333
*

src/main/java/org/fisco/bcos/sdk/v3/crypto/signature/ECDSASignature.java

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
import com.webank.wedpr.crypto.NativeInterface;
1818
import org.fisco.bcos.sdk.v3.crypto.exceptions.SignatureException;
1919
import org.fisco.bcos.sdk.v3.crypto.keypair.CryptoKeyPair;
20+
import org.fisco.bcos.sdk.v3.crypto.keypair.ECDSAKeyPair;
2021
import org.fisco.bcos.sdk.v3.utils.Hex;
2122
import org.fisco.bcos.sdk.v3.utils.Numeric;
2223

@@ -88,4 +89,39 @@ public static boolean verifyMessage(String publicKey, String message, String sig
8889
}
8990
return verifyResult.booleanResult;
9091
}
92+
93+
@Override
94+
public String recoverAddress(final String msgHash, final SignatureResult signature) {
95+
return ecrecoverSignature(msgHash, signature);
96+
}
97+
98+
@Override
99+
public String recoverAddress(final byte[] msgHash, final SignatureResult signature) {
100+
return recoverAddress(Hex.toHexString(msgHash), signature);
101+
}
102+
103+
public static String ecrecoverSignature(String msgHash, SignatureResult signature) {
104+
String publicKey = getPubFromSignature(msgHash, signature);
105+
return ECDSAKeyPair.getAddressByPublicKey(publicKey);
106+
}
107+
108+
@Override
109+
public String recoverPublicKey(final String msgHash, final SignatureResult signature) {
110+
return getPubFromSignature(msgHash, signature);
111+
}
112+
113+
@Override
114+
public String recoverPublicKey(final byte[] msgHash, final SignatureResult signature) {
115+
return recoverPublicKey(Hex.toHexString(msgHash), signature);
116+
}
117+
118+
public static String getPubFromSignature(String msgHash, SignatureResult signature) {
119+
CryptoResult verifyResult =
120+
NativeInterface.secp256k1RecoverPublicKey(msgHash, signature.toString());
121+
if (verifyResult.wedprErrorMessage != null && !verifyResult.wedprErrorMessage.isEmpty()) {
122+
throw new SignatureException(
123+
"Recover public key failed:" + verifyResult.wedprErrorMessage);
124+
}
125+
return verifyResult.getPublicKey();
126+
}
91127
}

src/main/java/org/fisco/bcos/sdk/v3/crypto/signature/HsmSM2Signature.java

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -97,4 +97,33 @@ public boolean verifyMessage(String publicKey, String message, String signature)
9797
return false;
9898
}
9999
}
100+
101+
@Override
102+
public String recoverAddress(final String msgHash, final SignatureResult signature) {
103+
return ecrecoverSignature(msgHash, signature);
104+
}
105+
106+
@Override
107+
public String recoverAddress(final byte[] msgHash, final SignatureResult signature) {
108+
return recoverAddress(Hex.toHexString(msgHash), signature);
109+
}
110+
111+
public static String ecrecoverSignature(String msgHash, SignatureResult signature) {
112+
// String publicKey = getPubFromSignature(msgHash, signature);
113+
return "";
114+
}
115+
116+
@Override
117+
public String recoverPublicKey(final String msgHash, final SignatureResult signature) {
118+
return getPubFromSignature(msgHash, signature);
119+
}
120+
121+
@Override
122+
public String recoverPublicKey(final byte[] msgHash, final SignatureResult signature) {
123+
return recoverPublicKey(Hex.toHexString(msgHash), signature);
124+
}
125+
126+
public static String getPubFromSignature(String msgHash, SignatureResult signature) {
127+
return Hex.toHexString(signature.getPub());
128+
}
100129
}

src/main/java/org/fisco/bcos/sdk/v3/crypto/signature/SM2Signature.java

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
import com.webank.wedpr.crypto.NativeInterface;
1818
import org.fisco.bcos.sdk.v3.crypto.exceptions.SignatureException;
1919
import org.fisco.bcos.sdk.v3.crypto.keypair.CryptoKeyPair;
20+
import org.fisco.bcos.sdk.v3.crypto.keypair.SM2KeyPair;
2021
import org.fisco.bcos.sdk.v3.utils.Hex;
2122
import org.fisco.bcos.sdk.v3.utils.Numeric;
2223

@@ -74,4 +75,33 @@ public static boolean verifyMessage(String publicKey, String message, String sig
7475
}
7576
return verifyResult.booleanResult;
7677
}
78+
79+
@Override
80+
public String recoverAddress(final String msgHash, final SignatureResult signature) {
81+
return ecrecoverSignature(msgHash, signature);
82+
}
83+
84+
@Override
85+
public String recoverAddress(final byte[] msgHash, final SignatureResult signature) {
86+
return recoverAddress(Hex.toHexString(msgHash), signature);
87+
}
88+
89+
public static String ecrecoverSignature(String msgHash, SignatureResult signature) {
90+
String publicKey = getPubFromSignature(msgHash, signature);
91+
return SM2KeyPair.getAddressByPublicKey(publicKey);
92+
}
93+
94+
@Override
95+
public String recoverPublicKey(final String msgHash, final SignatureResult signature) {
96+
return getPubFromSignature(msgHash, signature);
97+
}
98+
99+
@Override
100+
public String recoverPublicKey(final byte[] msgHash, final SignatureResult signature) {
101+
return recoverPublicKey(Hex.toHexString(msgHash), signature);
102+
}
103+
104+
public static String getPubFromSignature(String msgHash, SignatureResult signature) {
105+
return Hex.toHexString(signature.getPub());
106+
}
77107
}

src/main/java/org/fisco/bcos/sdk/v3/crypto/signature/Signature.java

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,4 +64,40 @@ public interface Signature {
6464
* @return true/false
6565
*/
6666
boolean verify(final String publicKey, final byte[] message, final byte[] signature);
67+
68+
/**
69+
* recover address from signature
70+
*
71+
* @param msgHash the message hash, must be a digest
72+
* @param signature the signature to be recovered
73+
* @return the address who sign the msgHash.
74+
*/
75+
String recoverAddress(final String msgHash, final SignatureResult signature);
76+
77+
/**
78+
* recover address from signature
79+
*
80+
* @param msgHash the byte array type message hash, must be a digest
81+
* @param signature the byte array type signature to be recovered
82+
* @return the address who sign the msgHash.
83+
*/
84+
String recoverAddress(final byte[] msgHash, final SignatureResult signature);
85+
86+
/**
87+
* recover public from signature
88+
*
89+
* @param msgHash the message hash, must be a digest
90+
* @param signature the signature to be recovered
91+
* @return the public key which can verify signature.
92+
*/
93+
String recoverPublicKey(final String msgHash, final SignatureResult signature);
94+
95+
/**
96+
* recover address from signature
97+
*
98+
* @param msgHash the byte array type message hash, must be a digest
99+
* @param signature the byte array type signature to be recovered
100+
* @return the public key which can verify signature.
101+
*/
102+
String recoverPublicKey(final byte[] msgHash, final SignatureResult signature);
67103
}

src/main/java/org/fisco/bcos/sdk/v3/crypto/signature/SignatureResult.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,10 @@ public byte[] getS() {
6060
return this.s;
6161
}
6262

63+
public byte[] getPub() {
64+
return new byte[] {};
65+
}
66+
6367
public byte[] getSignatureBytes() {
6468
return this.signatureBytes;
6569
}

src/test/java/org/fisco/bcos/sdk/v3/test/crypto/SignatureTest.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -365,6 +365,8 @@ public void testECDSASignature(CryptoSuite cryptoSuite, CryptoKeyPair keyPair) {
365365
Assert.assertEquals(message, Hex.toHexString(messageBytes));
366366
// sign
367367
ECDSASignatureResult signatureResult = (ECDSASignatureResult) cryptoSuite.sign(message, keyPair);
368+
//ecrecover
369+
Assert.assertEquals(keyPair.getAddress(), cryptoSuite.recoverAddress(message, signatureResult));
368370
// verify
369371
Assert.assertTrue(
370372
cryptoSuite.verify(
@@ -376,6 +378,7 @@ public void testECDSASignature(CryptoSuite cryptoSuite, CryptoKeyPair keyPair) {
376378

377379
// new sign
378380
ECDSASignatureResult newSign = new ECDSASignatureResult(signatureResult.getV(), signatureResult.getR(), signatureResult.getS());
381+
Assert.assertEquals(keyPair.getAddress(), cryptoSuite.recoverAddress(message, newSign));
379382
Assert.assertTrue(
380383
cryptoSuite.verify(
381384
keyPair.getHexPublicKey(), message, newSign.convertToString()));
@@ -418,6 +421,8 @@ public void testSMSignature(CryptoSuite cryptoSuite, CryptoKeyPair keyPair) {
418421
Assert.assertEquals(message, Hex.toHexString(messageBytes));
419422
// sign
420423
SM2SignatureResult signatureResult = (SM2SignatureResult) cryptoSuite.sign(message, keyPair);
424+
//ecrecover
425+
Assert.assertEquals(keyPair.getAddress(), cryptoSuite.recoverAddress(message, signatureResult));
421426
// verify
422427
Assert.assertTrue(
423428
cryptoSuite.verify(
@@ -429,6 +434,7 @@ public void testSMSignature(CryptoSuite cryptoSuite, CryptoKeyPair keyPair) {
429434

430435
// new sign
431436
SM2SignatureResult newSign = new SM2SignatureResult(signatureResult.getPub(), signatureResult.getR(), signatureResult.getS());
437+
Assert.assertEquals(keyPair.getAddress(), cryptoSuite.recoverAddress(message, newSign));
432438
Assert.assertTrue(
433439
cryptoSuite.verify(
434440
keyPair.getHexPublicKey(), message, newSign.convertToString()));

0 commit comments

Comments
 (0)