Skip to content

Commit a8defdf

Browse files
author
Yao Hsu
committed
Verify Ethereum message signature
1 parent 5624544 commit a8defdf

File tree

4 files changed

+45
-1
lines changed

4 files changed

+45
-1
lines changed

app/build.gradle

+3
Original file line numberDiff line numberDiff line change
@@ -58,4 +58,7 @@ dependencies {
5858

5959
implementation 'com.google.code.gson:gson:2.8.6'
6060
implementation(name:'HtcWalletSDK-Htc_partner1-release', ext:'aar')
61+
implementation 'com.github.komputing.kethereum:model:0.82.4'
62+
implementation 'com.github.komputing.kethereum:crypto:0.82.4'
63+
implementation 'com.github.komputing.kethereum:crypto_impl_spongycastle:0.82.4'
6164
}

app/src/main/java/com/htc/zion/demoapp/FirstFragment.kt

+11-1
Original file line numberDiff line numberDiff line change
@@ -104,8 +104,9 @@ class FirstFragment : Fragment() {
104104
val photoData = EthereumJsonTemplate(Message(bitmapHash))
105105
Log.i(LOG_TAG, "EthereumJson=$photoData")
106106
val sig = ByteArrayHolder()
107+
val uniqueId = Utils.getZkmaSdkUniqueId(this.requireContext())
107108
val result = ZkmaSdkHelper.signMessage(
108-
Utils.getZkmaSdkUniqueId(this.requireContext()),
109+
uniqueId,
109110
COIN_TYPE_ETHEREUM,
110111
Gson().toJson(photoData),
111112
sig
@@ -114,6 +115,15 @@ class FirstFragment : Fragment() {
114115
LOG_TAG,
115116
"signMessage(), result=$result, sig=${sig.byteArray.toString()}"
116117
)
118+
val verified = ZkmaSdkHelper.verifyEthMsgSignature(
119+
uniqueId,
120+
bitmapHash,
121+
sig.byteArray
122+
)
123+
Log.i(
124+
LOG_TAG,
125+
"verifyEthMsgSignature(), verified=$verified"
126+
)
117127
}
118128
}
119129
}

app/src/main/java/com/htc/zion/demoapp/ZkmaSdkHelper.kt

+30
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,12 @@ import androidx.annotation.WorkerThread
66
import com.htc.htcwalletsdk.Export.HtcWalletSdkManager
77
import com.htc.htcwalletsdk.Export.RESULT
88
import com.htc.htcwalletsdk.Native.Type.ByteArrayHolder
9+
import com.htc.htcwalletsdk.Utils.GenericUtils
910
import java.util.concurrent.atomic.AtomicBoolean
11+
import org.kethereum.crypto.signedMessageToKey
12+
import org.kethereum.model.SignatureData
13+
import java.lang.NumberFormatException
14+
import java.security.SignatureException
1015

1116
class ZkmaSdkHelper {
1217

@@ -79,5 +84,30 @@ class ZkmaSdkHelper {
7984
if (!zkmaSdkInited.get()) throw RuntimeException("ZKMA not initialized!")
8085
return zkmaManager.signMessage(uniqueId, coinType, strJson, byteArrayHolder)
8186
}
87+
88+
@WorkerThread
89+
@Synchronized
90+
fun verifyEthMsgSignature(
91+
uniqueId: Long,
92+
message: String,
93+
signatureBytes: ByteArray
94+
): Boolean {
95+
if (!zkmaSdkInited.get()) throw RuntimeException("ZKMA not initialized!")
96+
var verified = false
97+
try {
98+
val signature = GenericUtils.byteArrayToHex(signatureBytes)
99+
val r = signature.slice(0..63).toBigInteger(16)
100+
val s = signature.slice(64..127).toBigInteger(16)
101+
val v = signature.slice(128..129).toBigInteger()
102+
val signatureData = SignatureData(r, s, v)
103+
val msgPubKey = signedMessageToKey(message.toByteArray(), signatureData).key
104+
val tzPubKey = zkmaManager.getSendPublicKey(uniqueId, 60).key
105+
.substringAfter("0x").toBigInteger(16)
106+
verified = tzPubKey == msgPubKey
107+
} catch (e: Exception) {
108+
Log.e(Utils.LOG_TAG, e.message, e)
109+
}
110+
return verified
111+
}
82112
}
83113
}

build.gradle

+1
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ allprojects {
1818
repositories {
1919
google()
2020
jcenter()
21+
maven { url 'https://jitpack.io' }
2122
}
2223
}
2324

0 commit comments

Comments
 (0)