From f8ef92b67e1a593ddf751c5c2b8cb75f9660e62c Mon Sep 17 00:00:00 2001 From: swrup Date: Sun, 7 Dec 2025 06:29:06 +0100 Subject: [PATCH] + less failwith --- src/crypto.ml | 12 +++++------- src/data_file.ml | 22 ++++++++++------------ src/pg.ml | 2 +- src/util.ml | 42 ++++++++++++++++++------------------------ test/test.ml | 7 +++---- 5 files changed, 37 insertions(+), 48 deletions(-) diff --git a/src/crypto.ml b/src/crypto.ml index 2c5ae619..7f56a119 100644 --- a/src/crypto.ml +++ b/src/crypto.ml @@ -62,10 +62,8 @@ module EddsaSignature : sig end = struct (* TODO key format endianess issue? *) - (* EdDSA signatures are transmitted as 64-bytes base32 - binary-encoded objects with just the R and S values (base32_ binary-only). - - They are signature over a c-struct like `TALER_xxxPS` + with a purpose *) + (* transmitted as 64-bytes base32 + binary-encoded objects with just the R and S values *) type t = string let to_octets t = t @@ -108,8 +106,7 @@ module RsaPublicKey = struct let of_b32 s = let open Syntax in let* s = B32.decode s in - let v = Util.Bin_rsa.pub_of_octets s in - let+ v = Rsa.pub ~n:v.n ~e:v.e |> unwrap_err_msg in + let+ v = of_octets s in v let to_b32 t = B32.encode (to_octets t) @@ -128,7 +125,8 @@ module RsaPrivateKey = struct let of_b32 s = let open Syntax in let* s = B32.decode s in - Ok (of_octets s) + let+ v = of_octets s in + v let to_b32 t = B32.encode (to_octets t) let jsont = Jsont.of_of_string ~kind:"RsaPrivateKey" of_b32 ~enc:to_b32 diff --git a/src/data_file.ml b/src/data_file.ml index 125f6f9a..eb2f0701 100644 --- a/src/data_file.ml +++ b/src/data_file.ml @@ -10,22 +10,15 @@ let read fname = let+ content = File.read fname in Some content -let read_eddsa fname = - let+ content_opt = read fname in - Option.map EddsaPrivateKey.of_octets content_opt - -let read_rsa fname = - let+ content_opt = read fname in - Option.map RsaPrivateKey.of_octets content_opt - let write_eddsa fname priv = EddsaPrivateKey.to_octets priv |> File.write fname let write_rsa fname priv = RsaPrivateKey.to_octets priv |> File.write fname let load_signkey conn fname = - let* opt = read_eddsa fname in + let* opt = read fname in match opt with | None -> Ok None - | Some priv -> ( + | Some data -> ( + let priv = EddsaPrivateKey.of_octets data in let pub = EddsaPrivateKey.pub_of_priv priv in let* opt = Pg.lookup_signing_key conn pub in match opt with @@ -44,10 +37,15 @@ let load_signkey conn fname = Ok (Some v)) let load_denom conn ~section_name fname = - let* opt = read_rsa fname in + let* opt = read fname in match opt with | None -> Ok None - | Some priv -> ( + | Some data -> ( + let* priv = + RsaPrivateKey.of_octets data |> function + | Error e -> Error (`Msg e) + | Ok v -> Ok v + in let pub = RsaPrivateKey.pub_of_priv priv in let h_pub = Bin_type.DenominationHash.hash (RsaPublicKey.to_octets pub) in let* opt = Pg.lookup_denomination_key conn h_pub in diff --git a/src/pg.ml b/src/pg.ml index 073498a0..dd45b369 100644 --- a/src/pg.ml +++ b/src/pg.ml @@ -31,7 +31,7 @@ module Caqti_type = struct let open RsaPublicKey in custom ~encode:(fun v -> Ok (to_octets v)) - ~decode:(fun v -> Ok (of_octets v)) + ~decode:(fun v -> of_octets v) octets let eddsa_public : EddsaPublicKey.t t = diff --git a/src/util.ml b/src/util.ml index 52691564..31be5ef4 100644 --- a/src/util.ml +++ b/src/util.ml @@ -31,8 +31,6 @@ module Bin_rsa = struct let bits = Z.to_bits z in rev_string (String.length bits) bits - let check = function false -> Error (`Msg "invalid data") | true -> Ok () - let z_array_to_octets (arr : Z.t array) = let nb = Array.length arr in let bits_arr = Array.map z_to_bits_be arr in @@ -53,6 +51,10 @@ module Bin_rsa = struct bits_arr; Bytes.unsafe_to_string b + let check = function + | false -> Error "rsa of_octets error, invalid data" + | true -> Ok () + let z_array_of_octets ~nb s = let s_len = String.length s in let* () = check (s_len > 2 * nb) in @@ -83,34 +85,26 @@ module Bin_rsa = struct z_array_to_octets [| n; e |] let pub_of_octets s = - let pub_of_octets s = - let* arr = z_array_of_octets ~nb:2 s in - match arr with - | [| n; e |] -> - let* pub = Mirage_crypto_pk.Rsa.pub ~n ~e in - Ok pub - | _ -> assert false - in - match pub_of_octets s with - | Error (`Msg e) -> Fmt.failwith "rsa pub_of_octets failure: %s@." e - | Ok v -> v + let* arr = z_array_of_octets ~nb:2 s in + match arr with + | [| n; e |] -> + let+ pub = Mirage_crypto_pk.Rsa.pub ~n ~e |> unwrap_err_msg in + pub + | _ -> assert false let priv_to_octets ({ e; d; n; p; q; dp; dq; q' } : Mirage_crypto_pk.Rsa.priv) = z_array_to_octets [| e; d; n; p; q; dp; dq; q' |] let priv_of_octets s = - let priv_of_octets s = - let* arr = z_array_of_octets ~nb:8 s in - match arr with - | [| e; d; n; p; q; dp; dq; q' |] -> - let* priv = Mirage_crypto_pk.Rsa.priv ~e ~d ~n ~p ~q ~dp ~dq ~q' in - Ok priv - | _ -> assert false - in - match priv_of_octets s with - | Error (`Msg e) -> Fmt.failwith "rsa priv_of_octets failure: %s@." e - | Ok v -> v + let* arr = z_array_of_octets ~nb:8 s in + match arr with + | [| e; d; n; p; q; dp; dq; q' |] -> + let+ priv = + Mirage_crypto_pk.Rsa.priv ~e ~d ~n ~p ~q ~dp ~dq ~q' |> unwrap_err_msg + in + priv + | _ -> assert false end module Log_reporter = struct diff --git a/test/test.ml b/test/test.ml index 4377e198..03831efc 100644 --- a/test/test.ml +++ b/test/test.ml @@ -1,22 +1,21 @@ let () = Mirage_crypto_rng_unix.use_default () +let get_ok = function Error e -> failwith e | Ok v -> v let () = let priv = Mirage_crypto_pk.Rsa.generate ~bits:2048 () in let pub = Mirage_crypto_pk.Rsa.pub_of_priv priv in let () = let open Crypto.RsaPrivateKey in - let priv' = priv |> to_octets |> of_octets in + let priv' = priv |> to_octets |> of_octets |> get_ok in assert (to_octets priv = to_octets priv') in let () = let open Crypto.RsaPublicKey in - let pub' = pub |> to_octets |> of_octets in + let pub' = pub |> to_octets |> of_octets |> get_ok in assert (to_octets pub = to_octets pub') in () -let get_ok = function Error e -> failwith e | Ok v -> v - let () = let open Api in let check jsont s =