Skip to content

Signing v #7

@jannik-stacks

Description

@jannik-stacks

Question for Fireblocks:
For TransactionOperation.Raw signing with EcdsaSecp256K1, what are the possible values of signature.v in the signedMessages response? Is it
guaranteed to be 0/1, or can it be 27/28? Is this behavior contractual across API versions?

I doubt this is a concern now.
Otherwise it might be good to normalize the signature v byte.

concatSignature doesn't normalize currently, but concatSignerSignature does. Just making sure I'm not missing anything

    const vv = v >= 27 ? v - 27 : v;   // ← this normalization
this.fireblocksService.signTransaction(hash, vaultId)                                                                                            
    → this.fireblocksSigner.rawSign(hash, vaultId)
      → fireblocks.transactions.createTransaction({ operation: Raw, algorithm: EcdsaSecp256K1 })                                                   
      → polls until complete
      → returns txInfo.signedMessages[0].signature   // { fullSig, v }

So if Fireblocks returns v=27 for call site 3 (signer sig), it returns v=27 for call sites 1 and 2 (tx sig) too. Which means either:

  • Fireblocks always returns 0/1 — and the normalization in concatSignerSignature is defensive but never actually triggers
  • Fireblocks always returns 27/28 — and concatSignature is broken right now, but somehow transactions still work (which wouldn't make sense)
  • Fireblocks sometimes returns one or the other — unlikely for the same API/algorithm/vault

But maybe I'm missing something here 🙈

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions