File tree 4 files changed +34
-3
lines changed
4 files changed +34
-3
lines changed Original file line number Diff line number Diff line change @@ -82,7 +82,33 @@ let generate ~rng =
82
82
let q = Scalar_mult. scalar_mult d Point. params_g in
83
83
(d, q)
84
84
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
86
112
let msg = padded msg in
87
113
let e = Cstruct. to_bigarray (Cstruct. rev msg) in
88
114
let g = K_gen_sha256. g ~key msg in
@@ -113,13 +139,16 @@ let sign ~key ?k msg =
113
139
let rd = create () in
114
140
let dmon = create () in
115
141
to_montgomery dmon (Cstruct. to_bigarray (Scalar. to_cstruct key));
142
+ (match b with None -> () | Some (b , _ ) -> mul dmon b dmon);
116
143
mul rd r_mon dmon;
117
144
let cmon = create () in
118
145
let zmon = create () in
119
146
to_montgomery zmon e;
147
+ (match b with None -> () | Some (b , _ ) -> mul zmon b zmon);
120
148
add cmon zmon rd;
121
149
let smon = create () in
122
150
mul smon kmon cmon;
151
+ (match b with None -> () | Some (_ , b' ) -> mul smon b' smon);
123
152
let s = create () in
124
153
from_montgomery s smon;
125
154
let s = Cstruct. rev (Cstruct. of_bigarray s) in
Original file line number Diff line number Diff line change @@ -52,7 +52,8 @@ module Dsa : sig
52
52
53
53
val generate : rng :(int -> Cstruct .t ) -> priv * pub
54
54
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
56
57
57
58
val pub_of_priv : priv -> pub
58
59
Original file line number Diff line number Diff line change 52
52
(test
53
53
(name test_ec)
54
54
(modules test_ec)
55
- (libraries alcotest mirage-crypto mirage-crypto-ec)
55
+ (libraries alcotest mirage-crypto mirage-crypto-ec mirage-crypto-rng.unix )
56
56
(package mirage-crypto-ec))
57
57
58
58
(test
Original file line number Diff line number Diff line change @@ -340,6 +340,7 @@ let ecdsa_rfc6979 =
340
340
List. mapi (fun i c -> " RFC 6979 A.2.5 " ^ string_of_int i, `Quick , c) cases
341
341
342
342
let () =
343
+ Mirage_crypto_rng_unix. initialize () ;
343
344
Alcotest. run " P256 EC"
344
345
[
345
346
(" Key exchange" , key_exchange);
You can’t perform that action at this time.
0 commit comments