/ src / tests / testvecs2h.py
testvecs2h.py
  1  #!/usr/bin/env python3
  2  
  3  import json, sys
  4  from itertools import zip_longest # for Python 3.x
  5  
  6  def split_by_n(iterable, n):
  7      return zip_longest(*[iter(iterable)]*n, fillvalue='')
  8  
  9  # src: ht
 10  vectors = """
 11  {
 12  	"groupDST": "48617368546f47726f75702d4f50524656312d002d72697374726574746f3235352d534841353132",
 13  	"hash": "SHA512",
 14  	"identifier": "ristretto255-SHA512",
 15  	"keyInfo": "74657374206b6579",
 16  	"mode": 0,
 17  	"seed": "a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3",
 18  	"skSm": "5ebcea5ee37023ccb9fc2d2019f9d7737be85591ae8652ffa9ef0f4d37063b0e",
 19  	"vectors": [
 20  	  {
 21  		"Batch": 1,
 22  		"Blind": "64d37aed22a27f5191de1c1d69fadb899d8862b58eb4220029e036ec4c1f6706",
 23  		"BlindedElement": "609a0ae68c15a3cf6903766461307e5c8bb2f95e7e6550e1ffa2dc99e412803c",
 24  		"EvaluationElement": "7ec6578ae5120958eb2db1745758ff379e77cb64fe77b0b2d8cc917ea0869c7e",
 25  		"Input": "00",
 26  		"Output": "527759c3d9366f277d8c6020418d96bb393ba2afb20ff90df23fb7708264e2f3ab9135e3bd69955851de4b1f9fe8a0973396719b7912ba9ee8aa7d0b5e24bcf6"
 27  	  },
 28  	  {
 29  		"Batch": 1,
 30  		"Blind": "64d37aed22a27f5191de1c1d69fadb899d8862b58eb4220029e036ec4c1f6706",
 31  		"BlindedElement": "da27ef466870f5f15296299850aa088629945a17d1f5b7f5ff043f76b3c06418",
 32  		"EvaluationElement": "b4cbf5a4f1eeda5a63ce7b77c7d23f461db3fcab0dd28e4e17cecb5c90d02c25",
 33  		"Input": "5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a",
 34  		"Output": "f4a74c9c592497375e796aa837e907b1a045d34306a749db9f34221f7e750cb4f2a6413a6bf6fa5e19ba6348eb673934a722a7ede2e7621306d18951e7cf2c73"
 35  	  }
 36  	]
 37  }
 38  """
 39  
 40  def toC(k, v):
 41    print(f"#define {k.lower()}_len {len(v)//2}")
 42    print(
 43        f"const uint8_t {k.lower()}[{k.lower()}_len] = {{\n   %s}};\n" % ",\n   ".join(
 44            (", ".join((c for c in line if c)) for line in split_by_n(
 45                (f"0x{x[0]}{x[1]}" for x in split_by_n(v,2))
 46                ,8))
 47        ))
 48  
 49  vex = json.loads(vectors)
 50  print("// this file has been automatically generated using testvecs2h.py")
 51  
 52  if sys.argv[1] == 'cfrg_oprf_test_vectors.h':
 53     # run this if there is a change in the values of the test vectors
 54     # ./testvecs2h.py >cfrg_oprf_test_vectors.h
 55  
 56     print("#ifndef cfrg_test_vectors_h\n#define cfrg_test_vectors_h\n")
 57     print("#include <stdint.h>\n")
 58  
 59     toC("sks", vex['skSm'])
 60  
 61     for tc in range(2):
 62         for k, v in vex['vectors'][tc].items():
 63             if k == "Batch": continue
 64             print(f"#define tc{tc}_{k.lower()}_len {len(v)//2}")
 65             print(
 66                 f"const uint8_t tc{tc}_{k.lower()}[tc{tc}_{k.lower()}_len] = {{\n   %s}};\n" % ",\n   ".join(
 67                     (", ".join((c for c in line if c)) for line in split_by_n(
 68                         (f"0x{x[0]}{x[1]}" for x in split_by_n(v,2))
 69                         ,8))
 70                 ))
 71  
 72  elif sys.argv[1] == 'cfrg_oprf_test_vector_decl.h':
 73     # only run this code below if there is a change in the keys of the test vectors
 74     # ./testvecs2h.py >cfrg_oprf_test_vector_decl.h
 75  
 76     print("#ifndef cfrg_test_vector_decl_h\n#define cfrg_test_vector_decl_h\n")
 77     print("#include <stdint.h>\n")
 78     for tc in range(2):
 79        for k, v in vex['vectors'][tc].items():
 80           if k == "Batch": continue
 81           print(f"#define tc{tc}_{k.lower()}_len {len(v)//2}")
 82           print(f"extern const uint8_t tc{tc}_{k.lower()}[tc{tc}_{k.lower()}_len];\n")
 83  else:
 84      sys.exit(-1)
 85  
 86  print("""
 87  #if(TC==0)
 88      #define input                 tc0_input
 89      #define input_len             tc0_input_len
 90      #define blind_registration    tc0_blind
 91      #define blind_login           tc0_blind
 92      #define blind_len             tc0_blind_len
 93      #define blinded_element       tc0_blindedelement
 94      #define blindedelement_len    tc0_blindedelement_len
 95      #define evaluationelement     tc0_evaluationelement
 96      #define evaluationelement_len tc0_evaluationelement_len
 97      #define output                tc0_output
 98      #define output_len            tc0_output_len
 99  #else
100      #define input                 tc1_input
101      #define input_len             tc1_input_len
102      #define blind_registration    tc1_blind
103      #define blind_login           tc1_blind
104      #define blind_len             tc1_blind_len
105      #define blinded_element       tc1_blindedelement
106      #define blindedelement_len    tc1_blindedelement_len
107      #define evaluationelement     tc1_evaluationelement
108      #define evaluationelement_len tc1_evaluationelement_len
109      #define output                tc1_output
110      #define output_len            tc1_output_len
111  #endif""")
112  print("#endif")