fix: join community with keycard (#15635)

* fix: keycard signature add 27
* fix: hash message before signing on keycard
This commit is contained in:
Igor Sirotin 2024-07-19 16:17:46 +01:00 committed by GitHub
parent c3761ebd61
commit 3202413501
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
3 changed files with 16 additions and 3 deletions

View File

@ -15,6 +15,7 @@ import app_service/service/keycard/service as keycard_service
import app_service/common/types
import app/modules/shared_modules/keycard_popup/io_interface as keycard_shared_module
import app_service/service/network/network_item
import ../../../../backend/general as status_general
const UNIQUE_COMMUNITIES_MODULE_AUTH_IDENTIFIER* = "CommunitiesModule-Authentication"
const UNIQUE_COMMUNITIES_MODULE_SIGNING_IDENTIFIER* = "CommunitiesModule-Signing"
@ -466,9 +467,10 @@ proc runSignFlow(self: Controller, pin, path, dataToSign: string) =
self.keycardService.startSignFlow(path, dataToSign, pin)
proc runSigningOnKeycard*(self: Controller, keyUid: string, path: string, dataToSign: string, pin: string) =
var finalDataToSign = dataToSign
var finalDataToSign = status_general.hashMessageForSigning(dataToSign)
if finalDataToSign.startsWith("0x"):
finalDataToSign = finalDataToSign[2..^1]
if pin.len == 0:
let data = SharedKeycarModuleSigningArgs(uniqueIdentifier: UNIQUE_COMMUNITIES_MODULE_SIGNING_IDENTIFIER,
keyUid: keyUid,

View File

@ -732,10 +732,12 @@ method onDataSigned*(self: Module, keyUid: string, path: string, r: string, s: s
# being here is not an error
return
let vFixed = toLower(uint8(parseUint(v) + 27).toHex())
for address, details in self.joiningCommunityDetails.addressesToShare.pairs:
if details.keyUid != keyUid or details.path != path:
continue
self.joiningCommunityDetails.addressesToShare[address].signature = "0x" & r & s & v
self.joiningCommunityDetails.addressesToShare[address].signature = "0x" & r & s & vFixed
break
self.signSharedAddressesForKeypair(keyUid, pin)

View File

@ -85,3 +85,12 @@ proc backupData*(): RpcResponse[JsonNode] =
proc parseSharedUrl*(url: string): RpcResponse[JsonNode] =
result = callPrivateRPC("parseSharedURL".prefix, %*[url])
proc hashMessageForSigning*(message: string): string =
try:
let response = status_go.hashMessage(message)
let jsonResponse = parseJson(response)
return jsonResponse{"result"}.getStr()
except Exception as e:
error "hashMessage: failed to parse json response", error = e.msg
return ""