@@ -7,11 +7,15 @@ import com.htc.htcwalletsdk.Export.HtcWalletSdkManager
7
7
import com.htc.htcwalletsdk.Export.RESULT
8
8
import com.htc.htcwalletsdk.Native.Type.ByteArrayHolder
9
9
import com.htc.htcwalletsdk.Utils.GenericUtils
10
+ import org.kethereum.crypto.CURVE
10
11
import java.util.concurrent.atomic.AtomicBoolean
11
12
import org.kethereum.crypto.signedMessageToKey
13
+ import org.kethereum.extensions.toBigInteger
14
+ import org.kethereum.extensions.toBytesPadded
15
+ import org.kethereum.extensions.toHexStringZeroPadded
16
+ import org.kethereum.model.PUBLIC_KEY_SIZE
12
17
import org.kethereum.model.SignatureData
13
- import java.lang.NumberFormatException
14
- import java.security.SignatureException
18
+ import java.math.BigInteger
15
19
16
20
class ZkmaSdkHelper {
17
21
@@ -96,18 +100,33 @@ class ZkmaSdkHelper {
96
100
var verified = false
97
101
try {
98
102
val signature = GenericUtils .byteArrayToHex(signatureBytes)
103
+ Log .d(Utils .LOG_TAG , " signature: $signature " )
99
104
val r = signature.slice(0 .. 63 ).toBigInteger(16 )
100
105
val s = signature.slice(64 .. 127 ).toBigInteger(16 )
101
- val v = signature.slice(128 .. 129 ).toBigInteger()
106
+ val v = signature.slice(128 .. 129 ).toBigInteger(16 )
102
107
val signatureData = SignatureData (r, s, v)
103
- val msgPubKey = signedMessageToKey(message.toByteArray(), signatureData).key
108
+ val signedMsgBytes = message.toByteArray().let {
109
+ " \u0019 Ethereum Signed Message:\n ${it.size} " .toByteArray() + it
110
+ }
111
+ val msgPubKey = compressKey(signedMessageToKey(signedMsgBytes, signatureData).key)
112
+ val msgPubKeyHex = msgPubKey.toHexStringZeroPadded(66 , false )
113
+ Log .d(Utils .LOG_TAG , " msgPubKey: $msgPubKeyHex " )
104
114
val tzPubKey = zkmaManager.getSendPublicKey(uniqueId, 60 ).key
105
- .substringAfter(" 0x" ).toBigInteger(16 )
115
+ .toBigInteger(16 )
116
+ val tzPubKeyHex = tzPubKey.toHexStringZeroPadded(66 , false )
117
+ Log .d(Utils .LOG_TAG , " tzPubKey: $tzPubKeyHex " )
106
118
verified = tzPubKey == msgPubKey
107
119
} catch (e: Exception ) {
108
120
Log .e(Utils .LOG_TAG , e.message, e)
109
121
}
110
122
return verified
111
123
}
124
+
125
+ fun compressKey (publicKey : BigInteger ): BigInteger {
126
+ val ret = publicKey.toBytesPadded(PUBLIC_KEY_SIZE + 1 )
127
+ ret[0 ] = 4
128
+ val point = CURVE .decodePoint(ret)
129
+ return point.encoded(true ).toBigInteger()
130
+ }
112
131
}
113
132
}
0 commit comments