Skip to content

Commit 94467d8

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

File tree

4 files changed

+39
-4
lines changed

4 files changed

+39
-4
lines changed

Diff for: ec/ecdsa.ml

+35-2
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,36 @@ 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 rec rng g =
87+
let r = Mirage_crypto_rng.generate ?g 32 in
88+
if not_zero r && smaller_n r then begin
89+
let ba = Cstruct.to_bigarray (Cstruct.rev r) in
90+
to_montgomery ba ba;
91+
ba
92+
end else
93+
rng g
94+
in
95+
let a =
96+
match mask with
97+
| `No ->
98+
let o = create () in
99+
one o;
100+
o
101+
| `Yes -> rng None
102+
| `Yes_with g -> rng (Some g)
103+
in
104+
let b = create () in
105+
inv b a;
106+
to_montgomery b b;
107+
a, b
108+
109+
let sign ?(mask = `Yes) ~key ?k msg =
110+
(* blinding: literature: s = k^-1 * (m + r * priv_key) mod n
111+
we blind, similar to OpenSSL (https://github.com/openssl/openssl/commit/a3e9d5aa980f238805970f420adf5e903d35bf09):
112+
s = k^-1 * blind^-1 (blind * m + blind * r * priv_key) mod n
113+
*)
114+
let b, b' = blind mask in
86115
let msg = padded msg in
87116
let e = Cstruct.to_bigarray (Cstruct.rev msg) in
88117
let g = K_gen_sha256.g ~key msg in
@@ -113,13 +142,17 @@ let sign ~key ?k msg =
113142
let rd = create () in
114143
let dmon = create () in
115144
to_montgomery dmon (Cstruct.to_bigarray (Scalar.to_cstruct key));
116-
mul rd r_mon dmon;
145+
let dmon' = create () in
146+
mul dmon' b dmon;
147+
mul rd r_mon dmon';
117148
let cmon = create () in
118149
let zmon = create () in
119150
to_montgomery zmon e;
151+
mul zmon b zmon;
120152
add cmon zmon rd;
121153
let smon = create () in
122154
mul smon kmon cmon;
155+
mul smon b' smon;
123156
let s = create () in
124157
from_montgomery s smon;
125158
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)