Skip to content

Commit

Permalink
Harden Bitcoin address validation (#725)
Browse files Browse the repository at this point in the history
#Refs: #715.
This PR adds additional validation of Bitcoin addresses for recovery and
redemption.
  • Loading branch information
lukasz-zimnoch authored Oct 25, 2023
2 parents adca21f + e030209 commit f5aff67
Show file tree
Hide file tree
Showing 2 changed files with 21 additions and 5 deletions.
15 changes: 12 additions & 3 deletions typescript/src/services/deposits/deposits-service.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ import {
BitcoinClient,
BitcoinHashUtils,
BitcoinLocktimeUtils,
BitcoinScriptUtils,
} from "../../lib/bitcoin"
import { Hex } from "../../lib/utils"
import { Deposit } from "./deposit"
Expand Down Expand Up @@ -80,9 +81,17 @@ export class DepositsService {

const bitcoinNetwork = await this.bitcoinClient.getNetwork()

// TODO: Only P2(W)PKH addresses can be used for recovery. The below conversion
// function ensures that but, it would be good to check it here as well
// in case the converter implementation changes.
const recoveryOutputScript = BitcoinAddressConverter.addressToOutputScript(
bitcoinRecoveryAddress,
bitcoinNetwork
)
if (
!BitcoinScriptUtils.isP2PKHScript(recoveryOutputScript) &&
!BitcoinScriptUtils.isP2WPKHScript(recoveryOutputScript)
) {
throw new Error("Bitcoin recovery address must be P2PKH or P2WPKH")
}

const refundPublicKeyHash = BitcoinAddressConverter.addressToPublicKeyHash(
bitcoinRecoveryAddress,
bitcoinNetwork
Expand Down
11 changes: 9 additions & 2 deletions typescript/src/services/redemptions/redemptions-service.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ import {
BitcoinAddressConverter,
BitcoinClient,
BitcoinNetwork,
BitcoinScriptUtils,
BitcoinTxOutput,
BitcoinUtxo,
} from "../../lib/bitcoin"
Expand Down Expand Up @@ -57,8 +58,14 @@ export class RedemptionsService {
bitcoinRedeemerAddress,
bitcoinNetwork
)

// TODO: Validate the given script is supported for redemption.
if (
!BitcoinScriptUtils.isP2PKHScript(redeemerOutputScript) &&
!BitcoinScriptUtils.isP2WPKHScript(redeemerOutputScript) &&
!BitcoinScriptUtils.isP2SHScript(redeemerOutputScript) &&
!BitcoinScriptUtils.isP2WSHScript(redeemerOutputScript)
) {
throw new Error("Redeemer output script must be of standard type")
}

const { walletPublicKey, mainUtxo } = await this.findWalletForRedemption(
redeemerOutputScript,
Expand Down

0 comments on commit f5aff67

Please sign in to comment.