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")