Skip to content

Commit ecb3e3d

Browse files
committed
ECDSA: blind signing operation
1 parent 7b4d6cf commit ecb3e3d

File tree

4 files changed

+34
-3
lines changed

4 files changed

+34
-3
lines changed

Diff for: ec/ecdsa.ml

+30-1
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,33 @@ let generate ~rng =
8282
let q = Scalar_mult.scalar_mult d Point.params_g in
8383
(d, q)
8484

85-
let sign ~key ?k msg =
85+
let blind mask =
86+
let inv a =
87+
let b = create () in
88+
inv b a;
89+
to_montgomery b b;
90+
b
91+
in
92+
let rec rng g =
93+
let r = Mirage_crypto_rng.generate ?g 32 in
94+
if not_zero r && smaller_n r then begin
95+
let ba = Cstruct.to_bigarray (Cstruct.rev r) in
96+
to_montgomery ba ba;
97+
Some (ba, inv ba)
98+
end else
99+
rng g
100+
in
101+
match mask with
102+
| `No -> None
103+
| `Yes -> rng None
104+
| `Yes_with g -> rng (Some g)
105+
106+
let sign ?(mask = `Yes) ~key ?k msg =
107+
(* blinding: literature: s = k^-1 * (m + r * priv_key) mod n
108+
we blind, similar to OpenSSL (https://github.com/openssl/openssl/commit/a3e9d5aa980f238805970f420adf5e903d35bf09):
109+
s = k^-1 * blind^-1 (blind * m + blind * r * priv_key) mod n
110+
*)
111+
let b = blind mask in
86112
let msg = padded msg in
87113
let e = Cstruct.to_bigarray (Cstruct.rev msg) in
88114
let g = K_gen_sha256.g ~key msg in
@@ -113,13 +139,16 @@ let sign ~key ?k msg =
113139
let rd = create () in
114140
let dmon = create () in
115141
to_montgomery dmon (Cstruct.to_bigarray (Scalar.to_cstruct key));
142+
(match b with None -> () | Some (b, _) -> mul dmon b dmon);
116143
mul rd r_mon dmon;
117144
let cmon = create () in
118145
let zmon = create () in
119146
to_montgomery zmon e;
147+
(match b with None -> () | Some (b, _) -> mul zmon b zmon);
120148
add cmon zmon rd;
121149
let smon = create () in
122150
mul smon kmon cmon;
151+
(match b with None -> () | Some (_, b') -> mul smon b' smon);
123152
let s = create () in
124153
from_montgomery s smon;
125154
let s = Cstruct.rev (Cstruct.of_bigarray s) in

Diff for: ec/mirage_crypto_ec.mli

+2-1
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,8 @@ module Dsa : sig
5252

5353
val generate : rng:(int -> Cstruct.t) -> priv * pub
5454

55-
val sign : key:priv -> ?k:Cstruct.t -> Cstruct.t -> Cstruct.t * Cstruct.t
55+
val sign : ?mask:[ `No | `Yes | `Yes_with of Mirage_crypto_rng.g ] ->
56+
key:priv -> ?k:Cstruct.t -> Cstruct.t -> Cstruct.t * Cstruct.t
5657

5758
val pub_of_priv : priv -> pub
5859

Diff for: tests/dune

+1-1
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@
5252
(test
5353
(name test_ec)
5454
(modules test_ec)
55-
(libraries alcotest mirage-crypto mirage-crypto-ec)
55+
(libraries alcotest mirage-crypto mirage-crypto-ec mirage-crypto-rng.unix)
5656
(package mirage-crypto-ec))
5757

5858
(test

Diff for: tests/test_ec.ml

+1
Original file line numberDiff line numberDiff line change
@@ -340,6 +340,7 @@ let ecdsa_rfc6979 =
340340
List.mapi (fun i c -> "RFC 6979 A.2.5 " ^ string_of_int i, `Quick, c) cases
341341

342342
let () =
343+
Mirage_crypto_rng_unix.initialize ();
343344
Alcotest.run "P256 EC"
344345
[
345346
("Key exchange", key_exchange);

0 commit comments

Comments
 (0)