File tree 4 files changed +39
-4
lines changed
4 files changed +39
-4
lines changed Original file line number Diff line number Diff line change @@ -82,7 +82,36 @@ 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 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
86
115
let msg = padded msg in
87
116
let e = Cstruct. to_bigarray (Cstruct. rev msg) in
88
117
let g = K_gen_sha256. g ~key msg in
@@ -113,13 +142,17 @@ let sign ~key ?k msg =
113
142
let rd = create () in
114
143
let dmon = create () in
115
144
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';
117
148
let cmon = create () in
118
149
let zmon = create () in
119
150
to_montgomery zmon e;
151
+ mul zmon b zmon;
120
152
add cmon zmon rd;
121
153
let smon = create () in
122
154
mul smon kmon cmon;
155
+ mul smon b' smon;
123
156
let s = create () in
124
157
from_montgomery s smon;
125
158
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