diff --git a/Sources/WalletConnectRelay/PackageConfig.json b/Sources/WalletConnectRelay/PackageConfig.json index e01fd4d43..803999dce 100644 --- a/Sources/WalletConnectRelay/PackageConfig.json +++ b/Sources/WalletConnectRelay/PackageConfig.json @@ -1 +1 @@ -{"version": "1.19.1"} +{"version": "1.19.2"} diff --git a/Sources/WalletConnectSign/Auth/Types/AuthPayload.swift b/Sources/WalletConnectSign/Auth/Types/AuthPayload.swift index 8edab5317..bca5ec3fa 100644 --- a/Sources/WalletConnectSign/Auth/Types/AuthPayload.swift +++ b/Sources/WalletConnectSign/Auth/Types/AuthPayload.swift @@ -43,7 +43,7 @@ public struct AuthPayload: Codable, Equatable { } - init(requestParams: AuthRequestParams, iat: String) { + public init(requestParams: AuthRequestParams, iat: String) { self.type = "eip4361" self.chains = requestParams.chains self.domain = requestParams.domain diff --git a/Sources/WalletConnectSign/Sign/SignClient.swift b/Sources/WalletConnectSign/Sign/SignClient.swift index 5694955c3..35b7941ce 100644 --- a/Sources/WalletConnectSign/Sign/SignClient.swift +++ b/Sources/WalletConnectSign/Sign/SignClient.swift @@ -193,6 +193,7 @@ public final class SignClient: SignClientProtocol { private let linkSessionRequestSubscriber: LinkSessionRequestSubscriber private let sessionResponderDispatcher: SessionResponderDispatcher private let linkSessionRequestResponseSubscriber: LinkSessionRequestResponseSubscriber + private let messageVerifier: MessageVerifier private var publishers = Set() @@ -231,7 +232,8 @@ public final class SignClient: SignClientProtocol { linkSessionRequestSubscriber: LinkSessionRequestSubscriber, sessionResponderDispatcher: SessionResponderDispatcher, linkSessionRequestResponseSubscriber: LinkSessionRequestResponseSubscriber, - authenticateTransportTypeSwitcher: AuthenticateTransportTypeSwitcher + authenticateTransportTypeSwitcher: AuthenticateTransportTypeSwitcher, + messageVerifier: MessageVerifier ) { self.logger = logger self.networkingClient = networkingClient @@ -267,6 +269,7 @@ public final class SignClient: SignClientProtocol { self.sessionResponderDispatcher = sessionResponderDispatcher self.linkSessionRequestResponseSubscriber = linkSessionRequestResponseSubscriber self.authenticateTransportTypeSwitcher = authenticateTransportTypeSwitcher + self.messageVerifier = messageVerifier setUpConnectionObserving() setUpEnginesCallbacks() @@ -374,11 +377,6 @@ public final class SignClient: SignClientProtocol { return try pendingRequestsProvider.getPendingRequests() } - public func formatAuthMessage(payload: AuthPayload, account: Account) throws -> String { - let cacaoPayload = try CacaoPayloadBuilder.makeCacaoPayload(authPayload: payload, account: account) - return try SIWEFromCacaoPayloadFormatter().formatMessage(from: cacaoPayload) - } - public func buildSignedAuthObject(authPayload: AuthPayload, signature: CacaoSignature, account: Account) throws -> AuthObject { try CacaosBuilder.makeCacao(authPayload: authPayload, signature: signature, account: account) } @@ -387,6 +385,17 @@ public final class SignClient: SignClientProtocol { try AuthPayloadBuilder.build(payload: payload, supportedEVMChains: supportedEVMChains, supportedMethods: supportedMethods) } + // MARK: - SIWE + + public func formatAuthMessage(payload: AuthPayload, account: Account) throws -> String { + let cacaoPayload = try CacaoPayloadBuilder.makeCacaoPayload(authPayload: payload, account: account) + return try SIWEFromCacaoPayloadFormatter().formatMessage(from: cacaoPayload) + } + + public func verifySIWE(signature: String, message: String, address: String, chainId: String) async throws { + try await messageVerifier.verify(signature: signature, message: message, address: address, chainId: chainId) + } + //----------------------------------------------------------------------------------- /// For a wallet to approve a session proposal. @@ -590,3 +599,4 @@ public final class SignClient: SignClientProtocol { }.store(in: &publishers) } } + diff --git a/Sources/WalletConnectSign/Sign/SignClientFactory.swift b/Sources/WalletConnectSign/Sign/SignClientFactory.swift index f1fa294ea..4acff725c 100644 --- a/Sources/WalletConnectSign/Sign/SignClientFactory.swift +++ b/Sources/WalletConnectSign/Sign/SignClientFactory.swift @@ -178,7 +178,8 @@ public struct SignClientFactory { linkSessionRequestSubscriber: linkSessionRequestSubscriber, sessionResponderDispatcher: sessionResponderDispatcher, linkSessionRequestResponseSubscriber: linkSessionRequestResponseSubscriber, - authenticateTransportTypeSwitcher: authenticateTransportTypeSwitcher + authenticateTransportTypeSwitcher: authenticateTransportTypeSwitcher, + messageVerifier: signatureVerifier ) return client } diff --git a/Sources/WalletConnectSigner/Verifier/MessageVerifier.swift b/Sources/WalletConnectSigner/Verifier/MessageVerifier.swift index 12b82b40e..d1a9680a6 100644 --- a/Sources/WalletConnectSigner/Verifier/MessageVerifier.swift +++ b/Sources/WalletConnectSigner/Verifier/MessageVerifier.swift @@ -15,8 +15,8 @@ public struct MessageVerifier { } public func verify(signature: CacaoSignature, - message: String, - account: Account + message: String, + account: Account ) async throws { try await self.verify( signature: signature, @@ -27,9 +27,9 @@ public struct MessageVerifier { } public func verify(signature: CacaoSignature, - message: String, - address: String, - chainId: String + message: String, + address: String, + chainId: String ) async throws { guard let messageData = message.data(using: .utf8) else { @@ -54,4 +54,34 @@ public struct MessageVerifier { ) } } + + public func verify(signature: String, + message: String, + address: String, + chainId: String + ) async throws { + + guard let messageData = message.data(using: .utf8) else { + throw Errors.utf8EncodingFailed + } + let signatureData = Data(hex: signature) + + let prefixedMessage = messageData.prefixed + + do { + try await eip191Verifier.verify( + signature: signatureData, + message: prefixedMessage, + address: address + ) + } catch { + // If eip191 verification fails, try eip1271 verification + try await eip1271Verifier.verify( + signature: signatureData, + message: prefixedMessage, + address: address, + chainId: chainId + ) + } + } }