···317317 if compress then
318318 let out = Bytes.create (P.byte_length + 1) in
319319 let ident =
320320- 2 + (String.get_uint8 buf ((P.byte_length * 2) - 1)) land 1
320320+ 2 + (String.get_uint8 buf (P.byte_length * 2)) land 1
321321 in
322322 Bytes.unsafe_blit_string buf 1 out 1 P.byte_length;
323323 Bytes.set_uint8 out 0 ident;
···388388 let y_struct2 = rev_string y_struct2 in
389389 let ident = String.get_uint8 pk 0 in
390390 let signY =
391391- 2 + (String.get_uint8 y_struct (P.byte_length - 2)) land 1
391391+ 2 + (String.get_uint8 y_struct (P.byte_length - 1)) land 1
392392 in
393393 let res = if Int.equal signY ident then y_struct else y_struct2 in
394394 let out = Bytes.create ((P.byte_length * 2) + 1) in
+19-41
tests/test_ec.ml
···216216 "ECDSA verify", `Quick, ecdsa_verify ;
217217]
218218219219+let pub_key_compression (module Dsa:Mirage_crypto_ec.Dsa) () =
220220+ for _ = 1 to 20 do
221221+ let _, pub = Dsa.generate () in
222222+ let compressed = Dsa.pub_to_octets ~compress:true pub in
223223+ let decompressed = Dsa.pub_of_octets compressed in
224224+ match decompressed with
225225+ | Ok decompressed ->
226226+ let p1 = Dsa.pub_to_octets pub in
227227+ let p2 = Dsa.pub_to_octets decompressed in
228228+ Alcotest.(check string __LOC__ p1 p2);
229229+ let prefix = String.get_uint8 compressed 0 in
230230+ let expected = 2 + String.(get_uint8 p1 (length p1 - 1)) land 1 in
231231+ Alcotest.(check int __LOC__ expected prefix);
232232+ | Error e -> Alcotest.failf "%a" pp_error e
233233+ done
234234+219235let ecdsa_rfc6979_p256 =
220236 (* A.2.5 - P 256 *)
221237 let priv, pub =
···236252 in
237253 Alcotest.(check bool __LOC__ true pub_eq)
238254 | Error _ -> Alcotest.fail "bad public key"
239239- in
240240- let pub_key_compression () =
241241- let _, pub = P256.Dsa.generate () in
242242- let compressed = P256.Dsa.pub_to_octets ~compress:true pub in
243243- let decompressed = P256.Dsa.pub_of_octets compressed in
244244- let comparison = match decompressed with
245245- | Ok decompressed ->
246246- let p1 = P256.Dsa.pub_to_octets pub in
247247- let p2 = P256.Dsa.pub_to_octets decompressed in
248248- String.equal p1 p2
249249- | Error _ -> false in
250250- Alcotest.(check bool __LOC__ true comparison)
251255 in
252256 let case (type a) (hash : a Digestif.hash) ~message ~k ~r ~s () =
253257 let msg =
···310314 ~s:"39AF9F15DE0DB8D97E72719C74820D304CE5226E32DEDAE67519E840D1194E55" ;
311315 ] in
312316 ("public key matches", `Quick, pub_rfc) ::
313313- ("public key compression and decompression", `Quick, pub_key_compression) ::
317317+ ("public key compression and decompression", `Quick, (pub_key_compression (module P256.Dsa))) ::
314318 List.mapi (fun i c -> "RFC 6979 A.2.5 " ^ string_of_int i, `Quick, c) cases
315319316320let ecdsa_rfc6979_p384 =
···334338 Alcotest.(check bool __LOC__ true pub_eq)
335339 | Error _ -> Alcotest.fail "bad public key"
336340 in
337337- let pub_key_compression () =
338338- let _, pub = P384.Dsa.generate () in
339339- let compressed = P384.Dsa.pub_to_octets ~compress:true pub in
340340- let decompressed = P384.Dsa.pub_of_octets compressed in
341341- let comparison = match decompressed with
342342- | Ok decompressed ->
343343- let p1 = P384.Dsa.pub_to_octets pub in
344344- let p2 = P384.Dsa.pub_to_octets decompressed in
345345- String.equal p1 p2
346346- | Error _ -> false
347347- in
348348- Alcotest.(check bool __LOC__ true comparison)
349349- in
350341 let case (type a) (hash : a Digestif.hash) ~message ~k ~r ~s () =
351342 let msg =
352343 let h = Digestif.(digest_string hash message |> to_raw_string hash) in
···447438 4A2092CD3792E0159AD9CEE37659C736"
448439 ] in
449440 ("public key matches", `Quick, pub_rfc) ::
450450- ("public key compression and decompression", `Quick, pub_key_compression) ::
441441+ ("public key compression and decompression", `Quick, pub_key_compression (module P384.Dsa)) ::
451442 List.mapi (fun i c -> "RFC 6979 A.2.6 " ^ string_of_int i, `Quick, c) cases
452443453444let ecdsa_rfc6979_p521 =
···482473 Alcotest.(check bool __LOC__ true pub_eq)
483474 | Error _ -> Alcotest.fail "bad public key"
484475 in
485485- let pub_key_compression () =
486486- let _, pub = P521.Dsa.generate () in
487487- let compressed = P521.Dsa.pub_to_octets ~compress:true pub in
488488- let decompressed = P521.Dsa.pub_of_octets compressed in
489489- let comparison = match decompressed with
490490- | Ok decompressed ->
491491- let p1 = P521.Dsa.pub_to_octets pub in
492492- let p2 = P521.Dsa.pub_to_octets decompressed in
493493- String.equal p1 p2
494494- | Error _ -> false
495495- in
496496- Alcotest.(check bool __LOC__ true comparison)
497497- in
498476 let case (type a) (hash : a Digestif.hash) ~message ~k ~r ~s () =
499477 let msg = Digestif.(digest_string hash message |> to_raw_string hash)
500478 and k = of_h k
···625603626604 ] in
627605 ("public key matches", `Quick, pub_rfc) ::
628628- ("public key compression and decompression", `Quick, pub_key_compression) ::
606606+ ("public key compression and decompression", `Quick, pub_key_compression (module P521.Dsa)) ::
629607 List.mapi (fun i c -> "RFC 6979 A.2.7 " ^ string_of_int i, `Quick, c) cases
630608631609let x25519 () =