From 6d73af2169656ea2e1687b0a91b7f43fd318464c Mon Sep 17 00:00:00 2001 From: swrup Date: Sat, 21 Mar 2026 09:50:04 +0100 Subject: [PATCH] [@@unboxed] type sig_ --- src/config.ml | 10 ++++++++- src/eddsa.ml | 54 ++++++++++++++++++++-------------------------- src/rsa.ml | 60 +++++++++++++++++++++++++-------------------------- 3 files changed, 61 insertions(+), 63 deletions(-) diff --git a/src/config.ml b/src/config.ml index 54d929f8..c7f23500 100644 --- a/src/config.ml +++ b/src/config.ml @@ -190,6 +190,14 @@ module Coin = struct let section_name = String.sub section.header 5 (String.length section.header - 5) in + let rsa_keysize s = + let nbits = int s in + let len = ((nbits - 1) / 8) + 1 in + if 8 * len <> nbits then + (* because of [kdf_mod_n] *) + invalid_arg "RSA keysize must be multiple of 8" + else nbits + in { section_name; value= get "value" |> amount; @@ -201,7 +209,7 @@ module Coin = struct fee_refresh= get "fee_refresh" |> amount; fee_refund= get "fee_refund" |> amount; cipher= (get "cipher" |> const_value "RSA" |> fun _s -> `RSA); - rsa_keysize= get "rsa_keysize" |> int; + rsa_keysize= get "rsa_keysize" |> rsa_keysize; age_restricted= ( get "age_restricted" |> yes_no |> function | `NO -> `NO diff --git a/src/eddsa.ml b/src/eddsa.ml index e97f22f6..9e7f2d6c 100644 --- a/src/eddsa.ml +++ b/src/eddsa.ml @@ -1,21 +1,19 @@ open Syntax +module Mirage_eddsa = Mirage_crypto_ec.Ed25519 -type priv = Mirage_crypto_ec.Ed25519.priv -type pub = Mirage_crypto_ec.Ed25519.pub +let pp_error = Mirage_crypto_ec.pp_error -(* transmitted as 64-bytes base32 - binary-encoded objects with just the R and S values *) -type sig_ = Sig of string +type priv = Mirage_eddsa.priv +type pub = Mirage_eddsa.pub +type sig_ = S of string [@@unboxed] -let generate = Mirage_crypto_ec.Ed25519.generate -let pub_of_priv = Mirage_crypto_ec.Ed25519.pub_of_priv -let priv_to_octets t = Mirage_crypto_ec.Ed25519.priv_to_octets t +let generate = Mirage_eddsa.generate +let pub_of_priv = Mirage_eddsa.pub_of_priv +let priv_to_octets t = Mirage_eddsa.priv_to_octets t let priv_of_octets t = - Mirage_crypto_ec.Ed25519.priv_of_octets t |> function - | Error err -> - let err = Fmt.str "%a" Mirage_crypto_ec.pp_error err in - Error err + Mirage_eddsa.priv_of_octets t |> function + | Error err -> Fmt.error "%a" pp_error err | Ok v -> Ok v let priv_bin = @@ -30,11 +28,11 @@ let priv_jsont = let to_b32 t = B32.encode (priv_to_octets t) in Jsont.of_of_string ~kind:"EddsaPrivateKey" of_b32 ~enc:to_b32 -let pub_to_octets t = Mirage_crypto_ec.Ed25519.pub_to_octets t +let pub_to_octets t = Mirage_eddsa.pub_to_octets t let pub_of_octets t = - Mirage_crypto_ec.Ed25519.pub_of_octets t |> function - | Error e -> Fmt.error "%a" Mirage_crypto_ec.pp_error e + Mirage_eddsa.pub_of_octets t |> function + | Error e -> Fmt.error "%a" pp_error e | Ok v -> Ok v let pub_bin = @@ -57,25 +55,19 @@ let pub_caqti = Caqti_type.octets let sign ~key s = - let sig_ = Mirage_crypto_ec.Ed25519.sign ~key s in - Sig sig_ + let sig_ = Mirage_eddsa.sign ~key s in + S sig_ -let verify ~key (Sig s) ~msg = - let b = Mirage_crypto_ec.Ed25519.verify ~key s ~msg in - match b with - | false -> Error "EddsaSignature verification: invalid signature" - | true -> Ok () +let verify ~key (S s) ~msg = + let b = Mirage_eddsa.verify ~key s ~msg in + match b with false -> Error "Eddsa verify: not valid" | true -> Ok () -let sig_to_octets (Sig s) = s - -let check_size s = - match String.length s = 64 with - | false -> Error "EddsaSignature of_octets: data is not 64 bytes." - | true -> Ok () +let sig_to_octets (S s) = s let sig_of_octets s = - let+ () = check_size s in - Sig s + match String.length s = 64 with + | false -> Error "Eddsa decode signature (binary): invalid data" + | true -> Ok (S s) let sig_bin = let sig_of_octets_exn t = sig_of_octets t |> Result.get_ok in @@ -86,7 +78,7 @@ let sig_jsont = let* s = B32.decode s in sig_of_octets s in - let sig_to_b32 (Sig s) = B32.encode s in + let sig_to_b32 (S s) = B32.encode s in Jsont.of_of_string ~kind:"EddsaSignature" sig_of_b32 ~enc:sig_to_b32 let sig_caqti = diff --git a/src/rsa.ml b/src/rsa.ml index f7da9a12..3cbd369f 100644 --- a/src/rsa.ml +++ b/src/rsa.ml @@ -1,4 +1,6 @@ open Syntax +module Mirage_rsa = Mirage_crypto_pk.Rsa +module Z_extra = Mirage_crypto_pk.Z_extra module Binary_format_rsa = struct (* RSA public key binary format @@ -11,7 +13,7 @@ module Binary_format_rsa = struct let z_array_to_octets (arr : Z.t array) = let nb = Array.length arr in - let bits_arr = Array.map Mirage_crypto_pk.Z_extra.to_octets_be arr in + let bits_arr = Array.map Z_extra.to_octets_be arr in let len_arr = Array.map String.length bits_arr in let len = (2 * nb) + Array.fold_left ( + ) 0 len_arr in let b = Bytes.make len '\x00' in @@ -47,49 +49,45 @@ module Binary_format_rsa = struct Array.init nb (fun i -> let len = len_arr.(i) in let s = String.sub s !pos len in - let z = Mirage_crypto_pk.Z_extra.of_octets_be s in + let z = Z_extra.of_octets_be s in pos := !pos + len; z) in Ok z_arr - let pub_to_octets ({ n; e } : Mirage_crypto_pk.Rsa.pub) = - z_array_to_octets [| n; e |] + let pub_to_octets ({ n; e } : Mirage_rsa.pub) = z_array_to_octets [| n; e |] 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 |> unwrap_msg in + let+ pub = Mirage_rsa.pub ~n ~e |> unwrap_msg in pub | _ -> assert false (* custom private key binary format <> than gcrypt *) - let priv_to_octets ({ e; d; n; p; q; dp; dq; q' } : Mirage_crypto_pk.Rsa.priv) - = + let priv_to_octets ({ e; d; n; p; q; dp; dq; q' } : Mirage_rsa.priv) = z_array_to_octets [| e; d; n; p; q; dp; dq; q' |] 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' |> unwrap_msg - in + let+ priv = Mirage_rsa.priv ~e ~d ~n ~p ~q ~dp ~dq ~q' |> unwrap_msg in priv | _ -> assert false end -type priv = Mirage_crypto_pk.Rsa.priv -type pub = Mirage_crypto_pk.Rsa.pub -type sig_ = Sig of string +type priv = Mirage_rsa.priv +type pub = Mirage_rsa.pub +type sig_ = S of string [@@unboxed] let generate ~bits () = - let priv = Mirage_crypto_pk.Rsa.generate ~bits () in - let pub = Mirage_crypto_pk.Rsa.pub_of_priv priv in + let priv = Mirage_rsa.generate ~bits () in + let pub = Mirage_rsa.pub_of_priv priv in (priv, pub) -let pub_of_priv = Mirage_crypto_pk.Rsa.pub_of_priv +let pub_of_priv = Mirage_rsa.pub_of_priv let priv_of_octets = Binary_format_rsa.priv_of_octets let priv_to_octets = Binary_format_rsa.priv_to_octets let pub_to_octets = Binary_format_rsa.pub_to_octets @@ -155,19 +153,19 @@ module Kdf = struct let kdf_mod_n ~n ~xts ~ikm ~ctx = let nbits = Z.numbits n in let len = ((nbits - 1) / 8) + 1 in - assert (8 * len = nbits); + if 8 * len <> nbits then invalid_arg "RSA keysize must be multiple of 8"; let rec go ctr = - (* cat ctx ctr_be *) - let ctx = + (* String.cat ctx ctr_be *) + let ctx_ctr = let ctx_len = String.length ctx in let b = Bytes.create (ctx_len + 2) in Bytes.blit_string ctx 0 b 0 ctx_len; Bytes.set_uint16_be b ctx_len ctr; Bytes.unsafe_to_string b in - let okm = kdf ~xts ~ikm ~ctx ~len in + let okm = kdf ~xts ~ikm ~ctx:ctx_ctr ~len in assert (String.length okm = len); - let r = Mirage_crypto_pk.Z_extra.of_octets_be okm in + let r = Z_extra.of_octets_be okm in if Z.gt r n then go (succ ctr) else r in go 0 @@ -195,10 +193,10 @@ let blind_msg pub ~bks msg = let bkey = rsa_blinding_key_derive pub bks in let r_e = Z.powm_sec bkey pub.e pub.n in let data_r_e = Z.rem (Z.mul data r_e) pub.n in - Mirage_crypto_pk.Z_extra.to_octets_be data_r_e + Z_extra.to_octets_be data_r_e -let unblind_sig pub ~bks (Sig bsig) = - let data = Mirage_crypto_pk.Z_extra.of_octets_be bsig in +let unblind_sig pub ~bks (S bsig) = + let data = Z_extra.of_octets_be bsig in let bkey = rsa_blinding_key_derive pub bks in let r_inv = try Z.invert bkey pub.n @@ -207,18 +205,18 @@ let unblind_sig pub ~bks (Sig bsig) = assert false in let data = Z.rem (Z.mul data r_inv) pub.n in - let sig_ = Mirage_crypto_pk.Z_extra.to_octets_be data in - Sig sig_ + let sig_ = Z_extra.to_octets_be data in + S sig_ -let verify ~key (Sig s) ~msg = +let verify ~key (S s) ~msg = let msg_fdh = rsa_full_domain_hash key msg in - let s1 = Mirage_crypto_pk.Z_extra.to_octets_be msg_fdh in - let s2 = Mirage_crypto_pk.Rsa.encrypt ~key s in + let s1 = Z_extra.to_octets_be msg_fdh in + let s2 = Mirage_rsa.encrypt ~key s in match Eqaf.equal s1 s2 with | false -> Fmt.error "RSA signature verification failed" | true -> Ok () (* decrypt <=> sign *) let sign ~key bmsg : sig_ = - let sig_ = Mirage_crypto_pk.Rsa.decrypt ~crt_hardening:true ~key bmsg in - Sig sig_ + let sig_ = Mirage_rsa.decrypt ~crt_hardening:true ~key bmsg in + S sig_