test: manual rsa

This commit is contained in:
Swrup 2025-10-03 15:33:40 +02:00
parent 062c34b8b7
commit 0baca6aff4
2 changed files with 60 additions and 7 deletions

View file

@ -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 -> ()