Raw File
test_secp256k1_affine.ml
(*****************************************************************************)
(*                                                                           *)
(* Copyright (c) 2021 Danny Willems <be.danny.willems@gmail.com>             *)
(* Copyright (c) 2023 Nomadic Labs, <contact@nomadic-labs.com>               *)
(*                                                                           *)
(* Permission is hereby granted, free of charge, to any person obtaining a   *)
(* copy of this software and associated documentation files (the "Software"),*)
(* to deal in the Software without restriction, including without limitation *)
(* the rights to use, copy, modify, merge, publish, distribute, sublicense,  *)
(* and/or sell copies of the Software, and to permit persons to whom the     *)
(* Software is furnished to do so, subject to the following conditions:      *)
(*                                                                           *)
(* The above copyright notice and this permission notice shall be included   *)
(* in all copies or substantial portions of the Software.                    *)
(*                                                                           *)
(* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR*)
(* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,  *)
(* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL   *)
(* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER*)
(* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING   *)
(* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER       *)
(* DEALINGS IN THE SOFTWARE.                                                 *)
(*                                                                           *)
(*****************************************************************************)

(** Testing
    -------
    Component:    lib_mec
    Invocation:   dune exec src/lib_mec/test/main.exe \
                  -- --file test_secp256k1_affine.ml
    Subject:      Test lib mec
*)

module Secp256k1ValueGeneration =
  Mec.Curve.Utils.PBT.MakeValueGeneration (Mec.Curve.Secp256k1.Affine)
module Secp256k1Equality =
  Mec.Curve.Utils.PBT.MakeEquality (Mec.Curve.Secp256k1.Affine)
module Secp256k1ECProperties =
  Mec.Curve.Utils.PBT.MakeECProperties (Mec.Curve.Secp256k1.Affine)
module CompressedRepresentation =
  Mec.Curve.Utils.PBT.MakeCompressedSerialisationAffine
    (Mec.Curve.Secp256k1.Affine)

let test_vectors () =
  (* http://point-at-infinity.org/ecc/nisttv *)
  let vectors =
    [
      ( "79BE667EF9DCBBAC55A06295CE870B07029BFCDB2DCE28D959F2815B16F81798",
        "483ADA7726A3C4655DA4FBFC0E1108A8FD17B448A68554199C47D08FFB10D4B8" );
      ( "C6047F9441ED7D6D3045406E95C07CD85C778E4B8CEF3CA7ABAC09B95C709EE5",
        "1AE168FEA63DC339A3C58419466CEAEEF7F632653266D0E1236431A950CFE52A" );
      ( "F9308A019258C31049344F85F89D5229B531C845836F99B08601F113BCE036F9",
        "388F7B0F632DE8140FE337E62A37F3566500A99934C2231B6CB9FD7584B8E672" );
      ( "E493DBF1C10D80F3581E4904930B1404CC6C13900EE0758474FA94ABE8C4CD13",
        "51ED993EA0D455B75642E2098EA51448D967AE33BFBDFE40CFE97BDC47739922" );
      ( "2F8BDE4D1A07209355B4A7250A5C5128E88B84BDDC619AB7CBA8D569B240EFE4",
        "D8AC222636E5E3D6D4DBA9DDA6C9C426F788271BAB0D6840DCA87D3AA6AC62D6" );
      ( "FFF97BD5755EEEA420453A14355235D382F6472F8568A18B2F057A1460297556",
        "AE12777AACFBB620F3BE96017F45C560DE80F0F6518FE4A03C870C36B075F297" );
      ( "5CBDF0646E5DB4EAA398F365F2EA7A0E3D419B7E0330E39CE92BDDEDCAC4F9BC",
        "6AEBCA40BA255960A3178D6D861A54DBA813D0B813FDE7B5A5082628087264DA" );
      ( "2F01E5E15CCA351DAFF3843FB70F3C2F0A1BDD05E5AF888A67784EF3E10A2A01",
        "5C4DA8A741539949293D082A132D13B4C2E213D6BA5B7617B5DA2CB76CBDE904" );
      ( "ACD484E2F0C7F65309AD178A9F559ABDE09796974C57E714C35F110DFC27CCBE",
        "CC338921B0A7D9FD64380971763B61E9ADD888A4375F8E0F05CC262AC64F9C37" );
      ( "A0434D9E47F3C86235477C7B1AE6AE5D3442D49B1943C2B752A68E2A47E247C7",
        "893ABA425419BC27A3B6C7E693A24C696F794C2ED877A1593CBEE53B037368D7" );
      ( "774AE7F858A9411E5EF4246B70C65AAC5649980BE5C17891BBEC17895DA008CB",
        "D984A032EB6B5E190243DD56D7B7B365372DB1E2DFF9D6A8301D74C9C953C61B" );
      ( "A6B594B38FB3E77C6EDF78161FADE2041F4E09FD8497DB776E546C41567FEB3C",
        "71444009192228730CD8237A490FEBA2AFE3D27D7CC1136BC97E439D13330D55" );
      ( "2B4EA0A797A443D293EF5CFF444F4979F06ACFEBD7E86D277475656138385B6C",
        "7A17643FC86BA26C4CBCF7C4A5E379ECE5FE09F3AFD9689C4A8F37AA1A3F60B5" );
    ]
  in
  let bytes =
    List.map
      (fun (x, y) ->
        Bytes.concat
          Bytes.empty
          (List.map
             (fun x ->
               Mec.Curve.Secp256k1.Affine.Base.to_bytes
                 (Mec.Curve.Secp256k1.Affine.Base.of_z (Z.of_string_base 16 x)))
             [x; y]))
      vectors
  in
  List.iter
    (fun bytes -> assert (Mec.Curve.Secp256k1.Affine.check_bytes bytes))
    bytes

let () =
  let open Alcotest in
  run
    ~__FILE__
    "secp256k1 affine coordinates"
    [
      ("Vectors", [Alcotest.test_case "test vectors" `Quick test_vectors]);
      Secp256k1ValueGeneration.get_tests ();
      Secp256k1Equality.get_tests ();
      Secp256k1ECProperties.get_tests ();
      CompressedRepresentation.get_tests ();
    ]
back to top