Skip to content

Commit

Permalink
add recover addr from sig api (#903)
Browse files Browse the repository at this point in the history
* add recover addr from sig api

* HsmSM2Signature override ecrecover api

* fix test failed and googleJavaFormat

* rename related func name
  • Loading branch information
Mojicode authored Mar 13, 2024
1 parent a51ea4c commit 9f7afc6
Show file tree
Hide file tree
Showing 7 changed files with 163 additions and 0 deletions.
22 changes: 22 additions & 0 deletions src/main/java/org/fisco/bcos/sdk/v3/crypto/CryptoSuite.java
Original file line number Diff line number Diff line change
Expand Up @@ -306,6 +306,28 @@ public boolean verify(final String publicKey, final byte[] message, final byte[]
return this.signatureImpl.verify(publicKey, message, signature);
}

/**
* recover address from signature
*
* @param msgHash the message hash, must be a digest
* @param signature the signature to be recovered
* @return the public key whitch can verify signature.
*/
public String recoverAddress(final String msgHash, final SignatureResult signature) {
return this.signatureImpl.recoverAddress(msgHash, signature);
}

/**
* recover address from signature
*
* @param msgHash the byte array type message hash, must be a digest
* @param signature the byte array type signature to be recovered
* @return the public key whitch can verify signature.
*/
public String recoverAddress(final byte[] msgHash, final SignatureResult signature) {
return this.signatureImpl.recoverAddress(msgHash, signature);
}

/**
* Create key pair
*
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@
import com.webank.wedpr.crypto.NativeInterface;
import org.fisco.bcos.sdk.v3.crypto.exceptions.SignatureException;
import org.fisco.bcos.sdk.v3.crypto.keypair.CryptoKeyPair;
import org.fisco.bcos.sdk.v3.crypto.keypair.ECDSAKeyPair;
import org.fisco.bcos.sdk.v3.utils.Hex;
import org.fisco.bcos.sdk.v3.utils.Numeric;

Expand Down Expand Up @@ -88,4 +89,39 @@ public static boolean verifyMessage(String publicKey, String message, String sig
}
return verifyResult.booleanResult;
}

@Override
public String recoverAddress(final String msgHash, final SignatureResult signature) {
return ecrecoverSignature(msgHash, signature);
}

@Override
public String recoverAddress(final byte[] msgHash, final SignatureResult signature) {
return recoverAddress(Hex.toHexString(msgHash), signature);
}

public static String ecrecoverSignature(String msgHash, SignatureResult signature) {
String publicKey = getPubFromSignature(msgHash, signature);
return ECDSAKeyPair.getAddressByPublicKey(publicKey);
}

@Override
public String recoverPublicKey(final String msgHash, final SignatureResult signature) {
return getPubFromSignature(msgHash, signature);
}

@Override
public String recoverPublicKey(final byte[] msgHash, final SignatureResult signature) {
return recoverPublicKey(Hex.toHexString(msgHash), signature);
}

public static String getPubFromSignature(String msgHash, SignatureResult signature) {
CryptoResult verifyResult =
NativeInterface.secp256k1RecoverPublicKey(msgHash, signature.toString());
if (verifyResult.wedprErrorMessage != null && !verifyResult.wedprErrorMessage.isEmpty()) {
throw new SignatureException(
"Recover public key failed:" + verifyResult.wedprErrorMessage);
}
return verifyResult.getPublicKey();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -97,4 +97,33 @@ public boolean verifyMessage(String publicKey, String message, String signature)
return false;
}
}

@Override
public String recoverAddress(final String msgHash, final SignatureResult signature) {
return ecrecoverSignature(msgHash, signature);
}

@Override
public String recoverAddress(final byte[] msgHash, final SignatureResult signature) {
return recoverAddress(Hex.toHexString(msgHash), signature);
}

public static String ecrecoverSignature(String msgHash, SignatureResult signature) {
// String publicKey = getPubFromSignature(msgHash, signature);
return "";
}

@Override
public String recoverPublicKey(final String msgHash, final SignatureResult signature) {
return getPubFromSignature(msgHash, signature);
}

@Override
public String recoverPublicKey(final byte[] msgHash, final SignatureResult signature) {
return recoverPublicKey(Hex.toHexString(msgHash), signature);
}

public static String getPubFromSignature(String msgHash, SignatureResult signature) {
return Hex.toHexString(signature.getPub());
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@
import com.webank.wedpr.crypto.NativeInterface;
import org.fisco.bcos.sdk.v3.crypto.exceptions.SignatureException;
import org.fisco.bcos.sdk.v3.crypto.keypair.CryptoKeyPair;
import org.fisco.bcos.sdk.v3.crypto.keypair.SM2KeyPair;
import org.fisco.bcos.sdk.v3.utils.Hex;
import org.fisco.bcos.sdk.v3.utils.Numeric;

Expand Down Expand Up @@ -74,4 +75,33 @@ public static boolean verifyMessage(String publicKey, String message, String sig
}
return verifyResult.booleanResult;
}

@Override
public String recoverAddress(final String msgHash, final SignatureResult signature) {
return ecrecoverSignature(msgHash, signature);
}

@Override
public String recoverAddress(final byte[] msgHash, final SignatureResult signature) {
return recoverAddress(Hex.toHexString(msgHash), signature);
}

public static String ecrecoverSignature(String msgHash, SignatureResult signature) {
String publicKey = getPubFromSignature(msgHash, signature);
return SM2KeyPair.getAddressByPublicKey(publicKey);
}

@Override
public String recoverPublicKey(final String msgHash, final SignatureResult signature) {
return getPubFromSignature(msgHash, signature);
}

@Override
public String recoverPublicKey(final byte[] msgHash, final SignatureResult signature) {
return recoverPublicKey(Hex.toHexString(msgHash), signature);
}

public static String getPubFromSignature(String msgHash, SignatureResult signature) {
return Hex.toHexString(signature.getPub());
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -64,4 +64,40 @@ public interface Signature {
* @return true/false
*/
boolean verify(final String publicKey, final byte[] message, final byte[] signature);

/**
* recover address from signature
*
* @param msgHash the message hash, must be a digest
* @param signature the signature to be recovered
* @return the address who sign the msgHash.
*/
String recoverAddress(final String msgHash, final SignatureResult signature);

/**
* recover address from signature
*
* @param msgHash the byte array type message hash, must be a digest
* @param signature the byte array type signature to be recovered
* @return the address who sign the msgHash.
*/
String recoverAddress(final byte[] msgHash, final SignatureResult signature);

/**
* recover public from signature
*
* @param msgHash the message hash, must be a digest
* @param signature the signature to be recovered
* @return the public key which can verify signature.
*/
String recoverPublicKey(final String msgHash, final SignatureResult signature);

/**
* recover address from signature
*
* @param msgHash the byte array type message hash, must be a digest
* @param signature the byte array type signature to be recovered
* @return the public key which can verify signature.
*/
String recoverPublicKey(final byte[] msgHash, final SignatureResult signature);
}
Original file line number Diff line number Diff line change
Expand Up @@ -60,6 +60,10 @@ public byte[] getS() {
return this.s;
}

public byte[] getPub() {
return new byte[] {};
}

public byte[] getSignatureBytes() {
return this.signatureBytes;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -365,6 +365,8 @@ public void testECDSASignature(CryptoSuite cryptoSuite, CryptoKeyPair keyPair) {
Assert.assertEquals(message, Hex.toHexString(messageBytes));
// sign
ECDSASignatureResult signatureResult = (ECDSASignatureResult) cryptoSuite.sign(message, keyPair);
//ecrecover
Assert.assertEquals(keyPair.getAddress(), cryptoSuite.recoverAddress(message, signatureResult));
// verify
Assert.assertTrue(
cryptoSuite.verify(
Expand All @@ -376,6 +378,7 @@ public void testECDSASignature(CryptoSuite cryptoSuite, CryptoKeyPair keyPair) {

// new sign
ECDSASignatureResult newSign = new ECDSASignatureResult(signatureResult.getV(), signatureResult.getR(), signatureResult.getS());
Assert.assertEquals(keyPair.getAddress(), cryptoSuite.recoverAddress(message, newSign));
Assert.assertTrue(
cryptoSuite.verify(
keyPair.getHexPublicKey(), message, newSign.convertToString()));
Expand Down Expand Up @@ -418,6 +421,8 @@ public void testSMSignature(CryptoSuite cryptoSuite, CryptoKeyPair keyPair) {
Assert.assertEquals(message, Hex.toHexString(messageBytes));
// sign
SM2SignatureResult signatureResult = (SM2SignatureResult) cryptoSuite.sign(message, keyPair);
//ecrecover
Assert.assertEquals(keyPair.getAddress(), cryptoSuite.recoverAddress(message, signatureResult));
// verify
Assert.assertTrue(
cryptoSuite.verify(
Expand All @@ -429,6 +434,7 @@ public void testSMSignature(CryptoSuite cryptoSuite, CryptoKeyPair keyPair) {

// new sign
SM2SignatureResult newSign = new SM2SignatureResult(signatureResult.getPub(), signatureResult.getR(), signatureResult.getS());
Assert.assertEquals(keyPair.getAddress(), cryptoSuite.recoverAddress(message, newSign));
Assert.assertTrue(
cryptoSuite.verify(
keyPair.getHexPublicKey(), message, newSign.convertToString()));
Expand Down

0 comments on commit 9f7afc6

Please sign in to comment.