From 0baca6aff43124a20e21db6d9fa5b91a4c8233f4 Mon Sep 17 00:00:00 2001 From: Swrup Date: Fri, 3 Oct 2025 15:33:40 +0200 Subject: [PATCH] test: manual rsa --- src/management.ml | 60 +++++++++++++++++++++++++++++++++++++++++++++-- src/mte.ml | 7 ++---- 2 files changed, 60 insertions(+), 7 deletions(-) diff --git a/src/management.ml b/src/management.ml index 320efa92..699917d3 100644 --- a/src/management.ml +++ b/src/management.ml @@ -33,15 +33,17 @@ do we re-implement crypto or do we re-use secmodules with IPC on a Unix domain socket *) +(* type key = | Eddsa of Mirage_crypto_ec.Ed25519.(priv * pub) | Rsa of Mirage_crypto_pk.Rsa.(priv * pub) + *) let eddsa_online_key_device = let finally _key = () in Vif.Device.v ~name:"eddsa_online_key" ~finally [] @@ fun () -> (* [Mirage_crypto_rng_miou_unix.(initialize (module Pfortuna))] is already done by [Vif.run] *) - Eddsa (Mirage_crypto_ec.Ed25519.generate ()) + Mirage_crypto_ec.Ed25519.generate () let rsa_denomination_key_device = let finally _key = () in @@ -49,4 +51,58 @@ let rsa_denomination_key_device = let open Mirage_crypto_pk.Rsa in let rsa_keysize = 2048 in let priv = generate ~bits:rsa_keysize () in - Rsa (priv, pub_of_priv priv) + (priv, pub_of_priv priv) + +(* full-domain-hash ; not impl *) +let fdh m = Fun.id m + +let mod_inverse a n = + let open Z in + (* extended Euclidean algorithm: returns (g, x, y) s.t. ax + by = g = gcd(a,b) *) + let rec extended_gcd a b = + if equal b zero then (a, one, zero) + else + let q, r = ediv_rem a b in + let g, x1, y1 = extended_gcd b r in + (g, y1, sub x1 (mul q y1)) + in + (* modular inverse of a modulo n, if it exists *) + let mod_inverse a n = + let g, x, _ = extended_gcd a n in + if not (equal g one) then Fmt.failwith "no inverse" + else + (* normalize result into [0, n-1] *) + erem (add x n) n + in + mod_inverse a n + +let test = + let finally _key = () in + Vif.Device.v ~name:"test" ~finally + [ Vif.Device.value rsa_denomination_key_device ] + @@ fun (priv, pub) -> + let { e; n } : Mirage_crypto_pk.Rsa.pub = pub in + let d = priv.d in + (* client *) + let m = "uhuh ~~!" |> Z.of_bits in + let f = fdh m in + assert (Z.lt f n); + (* random blinding factor *) + (* should be in Z_n *) + let b = "qwertyuiop" |> Z.of_bits in + assert (Z.(lt (abs b) n)); + let b_inv = mod_inverse b n in + assert (Z.(equal Z.one (b * b_inv mod n))); + let f' = Z.(f * powm b e n mod n) in + Fmt.pr "@. ok step 1. @."; + (* server *) + let s' = Z.(powm f' d n) in + Fmt.pr "@. ok step 2. @."; + (* client *) + let s = Z.(s' * b_inv mod n) in + let m' = Z.(powm s e n) in + Fmt.pr "m : `%s`@." (Z.to_string m); + Fmt.pr "m': `%s`@." (Z.to_string m'); + let msg_txt = Z.to_bits m' in + Fmt.pr "msg_txt: `%s`@." msg_txt; + fun _key -> () diff --git a/src/mte.ml b/src/mte.ml index e0cca800..78adcbcb 100644 --- a/src/mte.ml +++ b/src/mte.ml @@ -122,11 +122,8 @@ let () = Miou_unix.run @@ fun () -> let env = () in let devices = - Vif.Devices. - [ - Management.eddsa_online_key_device - ; Management.rsa_denomination_key_device - ] + let open Management in + Vif.Devices.[ eddsa_online_key_device; rsa_denomination_key_device; test ] in let middlewares = Vif.Middlewares.[] in Vif.run ~cfg ~devices ~middlewares routes env