From 92715a005b5537ffa8bb936b65ae546cda2f839e Mon Sep 17 00:00:00 2001 From: Vincent Bernardoff Date: Sat, 22 Sep 2018 18:33:24 +0700 Subject: [PATCH] Ledger: implement git-commit APDU --- src/lib_signer_backends/ledger.ml | 29 ++++++++++++++----- .../src/ledgerwallet_tezos.ml | 7 +++++ .../src/ledgerwallet_tezos.mli | 6 ++++ 3 files changed, 34 insertions(+), 8 deletions(-) diff --git a/src/lib_signer_backends/ledger.ml b/src/lib_signer_backends/ledger.ml index 9196cebce..810f2018c 100644 --- a/src/lib_signer_backends/ledger.ml +++ b/src/lib_signer_backends/ledger.ml @@ -139,14 +139,15 @@ module Ledger = struct type t = { device_info : Hidapi.device_info ; version : Ledgerwallet_tezos.Version.t ; + git_commit : string option ; of_curve : (Ledgerwallet_tezos.curve * (Signature.Public_key.t * Signature.Public_key_hash.t)) list ; of_pkh : (Signature.Public_key_hash.t * (Signature.Public_key.t * Ledgerwallet_tezos.curve)) list ; } - let create ~device_info ~version ~of_curve ~of_pkh = - { device_info ; version ; of_curve ; of_pkh } + let create ?git_commit ~device_info ~version ~of_curve ~of_pkh () = + { device_info ; version ; git_commit ; of_curve ; of_pkh } let curves { Ledgerwallet_tezos.Version.major ; minor ; patch ; _ } = let open Ledgerwallet_tezos in @@ -156,7 +157,7 @@ module Ledger = struct [ Ed25519 ; Secp256k1 ; Secp256r1 ] let of_hidapi ?pkh device_info h = - let find_ledgers version = + let find_ledgers ?git_commit version = fold_left_s begin fun (pkh_found, of_curve, of_pkh) curve -> get_public_key h curve [] >>|? fun pk -> let cur_pkh = Signature.Public_key.hash pk in @@ -167,9 +168,12 @@ module Ledger = struct end (false, [], []) (curves version) >>=? fun (pkh_found, of_curve, of_pkh) -> match pkh with - | None -> return (Some (create ~device_info ~version ~of_curve ~of_pkh)) + | None -> + return (Some (create ?git_commit ~device_info ~version + ~of_curve ~of_pkh ())) | Some _ when pkh_found -> - return (Some (create ~device_info ~version ~of_curve ~of_pkh)) + return (Some (create ?git_commit ~device_info ~version + ~of_curve ~of_pkh ())) | _ -> return None in let buf = Buffer.create 100 in @@ -194,7 +198,15 @@ module Ledger = struct device_info.Hidapi.path Ledgerwallet.Transport.pp_error e ; return None - | Ok version -> find_ledgers version + | Ok ({ major; minor; patch; _ } as version) -> + begin + if (major, minor, patch) >= (1, 4, 0) then + wrap_ledger_cmd (fun pp -> + Ledgerwallet_tezos.get_git_commit ~pp h) >>=? fun c -> + return_some c + else return_none + end >>=? fun git_commit -> + find_ledgers ?git_commit version end let find_ledgers ?pkh () = @@ -352,11 +364,12 @@ let commands = iter_s begin fun { Ledger.device_info = { Hidapi.path ; manufacturer_string ; product_string ; _ } ; - of_curve ; version ; _ } -> + of_curve ; version ; git_commit ; _ } -> let manufacturer = Option.unopt ~default:"(none)" manufacturer_string in let product = Option.unopt ~default:"(none)" product_string in - cctxt#message "Found a %a application running on %s %s at [%s]." + cctxt#message "Found a %a (commit %s) application running on %s %s at [%s]." Ledgerwallet_tezos.Version.pp version + (match git_commit with None -> "unknown" | Some c -> c) manufacturer product path >>= fun () -> let of_curve = List.rev of_curve in cctxt#message diff --git a/vendors/ocaml-ledger-wallet/src/ledgerwallet_tezos.ml b/vendors/ocaml-ledger-wallet/src/ledgerwallet_tezos.ml index 25b663edf..21d6c0115 100644 --- a/vendors/ocaml-ledger-wallet/src/ledgerwallet_tezos.ml +++ b/vendors/ocaml-ledger-wallet/src/ledgerwallet_tezos.ml @@ -55,6 +55,7 @@ end type ins = | Version + | Git_commit | Authorize_baking | Get_public_key | Prompt_public_key @@ -72,6 +73,7 @@ let int_of_ins = function | Sign_unsafe -> 0x05 | Reset_high_watermark -> 0x06 | Query_high_watermark -> 0x08 + | Git_commit -> 0x09 type curve = | Ed25519 @@ -91,6 +93,11 @@ let get_version ?pp ?buf h = Transport.apdu ~msg:"get_version" ?pp ?buf h apdu >>= Version.read +let get_git_commit ?pp ?buf h = + let apdu = Apdu.create (wrap_ins Git_commit) in + Transport.apdu ~msg:"get_git_commit" ?pp ?buf h apdu >>| + Cstruct.to_string + let write_path cs path = ListLabels.fold_left path ~init:cs ~f:begin fun cs i -> Cstruct.BE.set_uint32 cs 0 i ; diff --git a/vendors/ocaml-ledger-wallet/src/ledgerwallet_tezos.mli b/vendors/ocaml-ledger-wallet/src/ledgerwallet_tezos.mli index e28d18c00..fe51fcb8f 100644 --- a/vendors/ocaml-ledger-wallet/src/ledgerwallet_tezos.mli +++ b/vendors/ocaml-ledger-wallet/src/ledgerwallet_tezos.mli @@ -32,6 +32,12 @@ val get_version : (** [get_version ?pp ?buf ledger] is the version information of the Ledger app running at [ledger]. *) +val get_git_commit : + ?pp:Format.formatter -> ?buf:Cstruct.t -> + Hidapi.t -> (string, Transport.error) result +(** [get_git_commit ?pp ?buf ledger] is the git commit information of + the Ledger app running at [ledger]. *) + val get_public_key : ?prompt:bool -> ?pp:Format.formatter ->