From 9372506c45811ad50f82c0c031432b64f341cf64 Mon Sep 17 00:00:00 2001 From: swrup Date: Thu, 26 Feb 2026 16:20:20 +0100 Subject: [PATCH] better module for BytesXX --- src/api.ml | 30 +++++++++++++++++++++++++++++- src/pg.ml | 2 +- src/pg_type.ml | 2 +- src/signatures.ml | 34 +++++++++++++++++++++++++++++----- tools/offline_impl.ml | 6 +----- 5 files changed, 61 insertions(+), 13 deletions(-) diff --git a/src/api.ml b/src/api.ml index f6b87cc3..821aac27 100644 --- a/src/api.ml +++ b/src/api.ml @@ -62,6 +62,34 @@ module B32 = struct ~decode:B32.decode Caqti_type.string end +module Bytes32 = struct + include Signatures.Bytes32 + + let jsont = + let decode s = Result.bind (B32.decode s) of_octets in + let encode b = to_octets b |> B32.encode in + Jsont.of_of_string ~kind:"Bytes32" decode ~enc:encode + + let caqti = + Caqti_type.custom + ~encode:(fun v -> Ok (to_octets v)) + ~decode:of_octets Caqti_type.octets +end + +module Bytes64 = struct + include Signatures.Bytes64 + + let jsont = + let decode s = Result.bind (B32.decode s) of_octets in + let encode b = to_octets b |> B32.encode in + Jsont.of_of_string ~kind:"Bytes64" decode ~enc:encode + + let caqti = + Caqti_type.custom + ~encode:(fun v -> Ok (to_octets v)) + ~decode:of_octets Caqti_type.octets +end + (* TODO error response - use GANA error codes https://git.gnunet.org/gana.git/tree/gnu-taler-error-codes/registry.rec *) @@ -676,7 +704,7 @@ module DrainProfitsMessage = struct map ~kind:"DrainProfitsMessage" make |> mem "debit_account_section" Jsont.string ~enc:debit_account_section |> mem "credit_payto_uri" Jsont.string ~enc:credit_payto_uri - |> mem "wtid" B32.jsont ~enc:wtid + |> mem "wtid" Bytes32.jsont ~enc:wtid |> mem "master_sig" MasterDrainProfit.jsont ~enc:master_sig |> mem "date" Timestamp.jsont ~enc:date |> mem "amount" Amount.jsont ~enc:amount diff --git a/src/pg.ml b/src/pg.ml index 749d9d46..ee45ab99 100644 --- a/src/pg.ml +++ b/src/pg.ml @@ -290,7 +290,7 @@ let get_wire_accounts = let find_drain_profit = let req = - Caqti_type.(octets ->? drain_profit_message) + Caqti_type.(Bytes32.caqti ->? drain_profit_message) "SELECT wtid, account_section, payto_uri, trigger_date, (amount).*, \ master_sig FROM profit_drains WHERE wtid=$1" in diff --git a/src/pg_type.ml b/src/pg_type.ml index 57865968..032a64a2 100644 --- a/src/pg_type.ml +++ b/src/pg_type.ml @@ -265,7 +265,7 @@ let drain_profit_message = amount; master_sig; }) - Caqti_type.(t6 octets string string time amount master_sig) + Caqti_type.(t6 Bytes32.caqti string string time amount master_sig) let aml_officer_setup = let master_sig = Signatures.MasterAmlOfficerStatus.caqti in diff --git a/src/signatures.ml b/src/signatures.ml index 8fa4c5d3..af9c7b6a 100644 --- a/src/signatures.ml +++ b/src/signatures.ml @@ -33,16 +33,40 @@ open Aliases let size_of_int32 = 4 -module Bytes32 = struct - type t = string +module type BYTES = sig + type t - let bin = Bin.bytes 32 + val of_octets : string -> (t, string) result + val to_octets : t -> string + val bin : t Bin.t end -module Bytes64 = struct +module Bytes32 : BYTES = struct + let n = 32 + type t = string - let bin = Bin.bytes 64 + let of_octets s = + match String.length s = n with + | false -> Error "invalid bytes length" + | true -> Ok s + + let to_octets = Fun.id + let bin = Bin.bytes n +end + +module Bytes64 : BYTES = struct + let n = 64 + + type t = string + + let of_octets s = + match String.length s = n with + | false -> Error "invalid bytes length" + | true -> Ok s + + let to_octets = Fun.id + let bin = Bin.bytes n end module TransferSecretP = Bytes64 diff --git a/tools/offline_impl.ml b/tools/offline_impl.ml index cc681153..68e45ea7 100644 --- a/tools/offline_impl.ml +++ b/tools/offline_impl.ml @@ -411,11 +411,7 @@ let disable_wire ~output ~master_key ~payto_uri = let drain ~output ~master_key ~debit_account_section ~credit_payto_uri ~wtid ~date ~amount = let* key = read_master_key_file master_key in - let* () = - match String.length wtid = 32 with - | false -> Error "invalid wtid: must be 32 bytes" - | true -> Ok () - in + let* wtid = Api.Bytes32.of_octets wtid in let master_sig = let open Signatures.MasterDrainProfit in signf (EddsaSignature.sign ~key)