@pinkparrot/qsafe-mayo-wasm 0.0.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (97) hide show
  1. package/.gitmodules +3 -0
  2. package/.vscode/launch.json +12 -0
  3. package/LICENSE +201 -0
  4. package/bridge/mayo1_bridge.c +26 -0
  5. package/bridge/mayo2_bridge.c +26 -0
  6. package/bridge/randombytes_inject.c +44 -0
  7. package/build_mayo1.ps1 +36 -0
  8. package/build_mayo2.ps1 +36 -0
  9. package/dist/mayo.browser.min.js +216 -0
  10. package/dist/mayo1.js +0 -0
  11. package/dist/mayo2.js +0 -0
  12. package/dist/mayo_api.js +139 -0
  13. package/dist/package.json +1 -0
  14. package/gitignore +2 -0
  15. package/index.mjs +1 -0
  16. package/mayo-c/.astylerc +16 -0
  17. package/mayo-c/.cmake/flags.cmake +45 -0
  18. package/mayo-c/.cmake/sanitizers.cmake +81 -0
  19. package/mayo-c/.cmake/target.cmake +71 -0
  20. package/mayo-c/.github/workflows/ci_clang.yml +61 -0
  21. package/mayo-c/.github/workflows/ci_gcc.yml +60 -0
  22. package/mayo-c/.github/workflows/cmake.yml +160 -0
  23. package/mayo-c/.github/workflows/macos_m1.yml +68 -0
  24. package/mayo-c/CMakeLists.txt +35 -0
  25. package/mayo-c/KAT/PQCsignKAT_24_MAYO_1.req +900 -0
  26. package/mayo-c/KAT/PQCsignKAT_24_MAYO_1.rsp +902 -0
  27. package/mayo-c/KAT/PQCsignKAT_24_MAYO_2.req +900 -0
  28. package/mayo-c/KAT/PQCsignKAT_24_MAYO_2.rsp +902 -0
  29. package/mayo-c/KAT/PQCsignKAT_32_MAYO_3.req +900 -0
  30. package/mayo-c/KAT/PQCsignKAT_32_MAYO_3.rsp +902 -0
  31. package/mayo-c/KAT/PQCsignKAT_40_MAYO_5.req +900 -0
  32. package/mayo-c/KAT/PQCsignKAT_40_MAYO_5.rsp +902 -0
  33. package/mayo-c/LICENSE +202 -0
  34. package/mayo-c/META/MAYO-1_META.yml +52 -0
  35. package/mayo-c/META/MAYO-2_META.yml +52 -0
  36. package/mayo-c/META/MAYO-3_META.yml +52 -0
  37. package/mayo-c/META/MAYO-5_META.yml +52 -0
  38. package/mayo-c/NOTICE +13 -0
  39. package/mayo-c/README.md +183 -0
  40. package/mayo-c/apps/CMakeLists.txt +31 -0
  41. package/mayo-c/apps/PQCgenKAT_sign.c +281 -0
  42. package/mayo-c/apps/example.c +151 -0
  43. package/mayo-c/apps/example_nistapi.c +124 -0
  44. package/mayo-c/include/mayo.h +442 -0
  45. package/mayo-c/include/mem.h +25 -0
  46. package/mayo-c/include/randombytes.h +31 -0
  47. package/mayo-c/scripts/contstants.py +141 -0
  48. package/mayo-c/scripts/find_irred_poly.sage +39 -0
  49. package/mayo-c/src/AVX2/arithmetic_common.h +159 -0
  50. package/mayo-c/src/AVX2/echelon_form.h +91 -0
  51. package/mayo-c/src/AVX2/echelon_form_loop.h +58 -0
  52. package/mayo-c/src/AVX2/shuffle_arithmetic.h +442 -0
  53. package/mayo-c/src/CMakeLists.txt +98 -0
  54. package/mayo-c/src/arithmetic.c +128 -0
  55. package/mayo-c/src/arithmetic.h +124 -0
  56. package/mayo-c/src/common/aes128ctr.c +293 -0
  57. package/mayo-c/src/common/aes_c.c +741 -0
  58. package/mayo-c/src/common/aes_ctr.h +32 -0
  59. package/mayo-c/src/common/aes_neon.c +201 -0
  60. package/mayo-c/src/common/debug_bench_tools.h +69 -0
  61. package/mayo-c/src/common/fips202.c +1093 -0
  62. package/mayo-c/src/common/fips202.h +12 -0
  63. package/mayo-c/src/common/mem.c +19 -0
  64. package/mayo-c/src/common/randombytes_ctrdrbg.c +141 -0
  65. package/mayo-c/src/common/randombytes_system.c +399 -0
  66. package/mayo-c/src/generic/arithmetic_dynamic.h +68 -0
  67. package/mayo-c/src/generic/arithmetic_fixed.h +84 -0
  68. package/mayo-c/src/generic/echelon_form.h +152 -0
  69. package/mayo-c/src/generic/ef_inner_loop.h +56 -0
  70. package/mayo-c/src/generic/generic_arithmetic.h +294 -0
  71. package/mayo-c/src/mayo.c +675 -0
  72. package/mayo-c/src/mayo_1/api.c +46 -0
  73. package/mayo-c/src/mayo_1/api.h +43 -0
  74. package/mayo-c/src/mayo_2/api.c +46 -0
  75. package/mayo-c/src/mayo_2/api.h +43 -0
  76. package/mayo-c/src/mayo_3/api.c +46 -0
  77. package/mayo-c/src/mayo_3/api.h +43 -0
  78. package/mayo-c/src/mayo_5/api.c +46 -0
  79. package/mayo-c/src/mayo_5/api.h +43 -0
  80. package/mayo-c/src/neon/arithmetic_common.h +132 -0
  81. package/mayo-c/src/neon/echelon_form.h +55 -0
  82. package/mayo-c/src/neon/echelon_form_loop.h +58 -0
  83. package/mayo-c/src/neon/shuffle_arithmetic.h +462 -0
  84. package/mayo-c/src/params.c +42 -0
  85. package/mayo-c/src/simple_arithmetic.h +138 -0
  86. package/mayo-c/test/CMakeLists.txt +51 -0
  87. package/mayo-c/test/bench.c +166 -0
  88. package/mayo-c/test/m1cycles.c +155 -0
  89. package/mayo-c/test/m1cycles.h +13 -0
  90. package/mayo-c/test/test_kat.c +271 -0
  91. package/mayo-c/test/test_mayo.c +139 -0
  92. package/mayo-c/test/test_sample_solution.c +75 -0
  93. package/mayo-c/test/test_various.c +680 -0
  94. package/package.json +39 -0
  95. package/publish.bat +22 -0
  96. package/readme.md +80 -0
  97. package/test/test.mjs +42 -0
@@ -0,0 +1,51 @@
1
+ # SPDX-License-Identifier: Apache-2.0
2
+
3
+ if (ENABLE_PARAMS_DYNAMIC)
4
+ add_executable(mayo_test_kat test_kat.c)
5
+ target_link_libraries(mayo_test_kat mayo_test)
6
+
7
+ add_executable(mayo_bench bench.c m1cycles.c)
8
+ target_link_libraries(mayo_bench mayo)
9
+
10
+ add_executable(mayo_test_scheme test_mayo.c)
11
+ target_link_libraries(mayo_test_scheme mayo)
12
+ target_include_directories(mayo_test_scheme PUBLIC ../src/common)
13
+
14
+ add_test(MAYO_1_KAT mayo_test_kat MAYO-1)
15
+ add_test(MAYO_2_KAT mayo_test_kat MAYO-2)
16
+ add_test(MAYO_3_KAT mayo_test_kat MAYO-3)
17
+ add_test(MAYO_5_KAT mayo_test_kat MAYO-5)
18
+ add_test(MAYO_1_SELFTEST mayo_test_scheme MAYO-1)
19
+ add_test(MAYO_2_SELFTEST mayo_test_scheme MAYO-2)
20
+ add_test(MAYO_3_SELFTEST mayo_test_scheme MAYO-3)
21
+ add_test(MAYO_5_SELFTEST mayo_test_scheme MAYO-5)
22
+ else()
23
+ FOREACH(MVARIANT ${MVARIANT_S})
24
+ string(TOLOWER ${MVARIANT} MVARIANT_LOWER)
25
+ add_executable(mayo_test_kat_${MVARIANT} test_kat.c)
26
+ target_link_libraries(mayo_test_kat_${MVARIANT} ${MVARIANT_LOWER}_test)
27
+
28
+ add_executable(mayo_bench_${MVARIANT} bench.c m1cycles.c)
29
+ target_link_libraries(mayo_bench_${MVARIANT} ${MVARIANT_LOWER})
30
+
31
+ add_executable(mayo_test_scheme_${MVARIANT} test_mayo.c)
32
+ target_link_libraries(mayo_test_scheme_${MVARIANT} ${MVARIANT_LOWER})
33
+ target_include_directories(mayo_test_scheme_${MVARIANT} PUBLIC ../src/common ${INC_PLATFORM})
34
+
35
+ add_executable(mayo_test_sample_solution_${MVARIANT} test_sample_solution.c)
36
+ target_link_libraries(mayo_test_sample_solution_${MVARIANT} ${MVARIANT_LOWER}_test_nistapi)
37
+ target_include_directories(mayo_test_sample_solution_${MVARIANT} PRIVATE ../include ../src/${MVARIANT_LOWER})
38
+
39
+ add_executable(mayo_test_various_${MVARIANT} test_various.c)
40
+ target_link_libraries(mayo_test_various_${MVARIANT} ${MVARIANT_LOWER})
41
+
42
+ target_include_directories(mayo_test_various_${MVARIANT} PUBLIC ../src/common ../src/generic ${INC_PLATFORM})
43
+
44
+ add_test(${MVARIANT}_KAT mayo_test_kat_${MVARIANT} ${MVARIANT})
45
+ add_test(${MVARIANT}_SELFTEST mayo_test_scheme_${MVARIANT} ${MVARIANT})
46
+ add_test(${MVARIANT}_VARIOUS mayo_test_various_${MVARIANT} ${MVARIANT})
47
+ add_test(${MVARIANT}_SAMPLE_SOLUTION mayo_test_sample_solution_${MVARIANT})
48
+ ENDFOREACH()
49
+
50
+ endif()
51
+
@@ -0,0 +1,166 @@
1
+ // SPDX-License-Identifier: Apache-2.0
2
+
3
+ #include <mayo.h>
4
+ #include <stdlib.h>
5
+ #include <string.h>
6
+ #include <stdio.h>
7
+ #include <inttypes.h>
8
+
9
+ #include "m1cycles.h"
10
+
11
+ #if (defined(TARGET_OS_UNIX) && (defined(TARGET_ARM) || defined(TARGET_ARM64)) || defined(TARGET_OTHER)) \
12
+ || (!defined(TARGET_OS_MAC) && defined(TARGET_ARM64))
13
+ #include <time.h>
14
+ #endif
15
+
16
+ static int bench_sig(const mayo_params_t *p, int runs, int csv);
17
+ static inline int64_t cpucycles(void);
18
+
19
+ int main(int argc, char *argv[]) {
20
+ int rc = 0;
21
+
22
+ #if defined(TARGET_OS_MAC) && defined(TARGET_ARM64)
23
+ setup_rdtsc();
24
+ #endif
25
+
26
+ #ifdef ENABLE_PARAMS_DYNAMIC
27
+ if (argc < 3) {
28
+ printf("Two arguments needed\n");
29
+ rc = 1;
30
+ goto end;
31
+ }
32
+ int runs = atoi(argv[2]);
33
+ if (!strcmp(argv[1], "MAYO-1")) {
34
+ rc = bench_sig(&MAYO_1, runs, 0);
35
+ } else if (!strcmp(argv[1], "MAYO-2")) {
36
+ rc = bench_sig(&MAYO_2, runs, 0);
37
+ } else if (!strcmp(argv[1], "MAYO-3")) {
38
+ rc = bench_sig(&MAYO_3, runs, 0);
39
+ } else if (!strcmp(argv[1], "MAYO-5")) {
40
+ rc = bench_sig(&MAYO_5, runs, 0);
41
+ }
42
+ #else
43
+ if (argc < 2) {
44
+ printf("One argument needed\n");
45
+ rc = 1;
46
+ goto end;
47
+ }
48
+ int runs = atoi(argv[1]);
49
+ rc = bench_sig(0, runs, 0);
50
+ #endif
51
+
52
+
53
+
54
+ end:
55
+ return rc;
56
+ }
57
+
58
+ #if (defined(TARGET_ARM) || defined(TARGET_S390X) || (defined(TARGET_ARM64) && defined(TARGET_OS_UNIX)))
59
+ #define BENCH_UNITS "nsec"
60
+ #else
61
+ #define BENCH_UNITS "cycles"
62
+ #endif
63
+
64
+ int cmpfunc (const void *a, const void *b) {
65
+ return ( *(uint64_t *)a - * (uint64_t *)b );
66
+ }
67
+
68
+ #define BENCH_CODE_1(r) \
69
+ cycles = 0; \
70
+ for (i = 0; i < (r); ++i) { \
71
+ cycles1 = cpucycles();
72
+
73
+ #define BENCH_CODE_2(name, csv) \
74
+ cycles2 = cpucycles(); \
75
+ if(i < LIST_SIZE) \
76
+ cycles_list[i] = (cycles2 - cycles1);\
77
+ cycles = cycles + (cycles2 - cycles1); \
78
+ } \
79
+ qsort(cycles_list, (runs < LIST_SIZE)? runs : LIST_SIZE, sizeof(uint64_t), cmpfunc);\
80
+ if (csv) \
81
+ printf("%2" PRId64 ",", cycles_list[(runs < LIST_SIZE)? runs/2 : LIST_SIZE/2]); \
82
+ else { \
83
+ printf(" %-20s-> median: %2" PRId64 ", average: %2" PRId64 " ", name, \
84
+ cycles_list[(runs < LIST_SIZE)? runs/2 : LIST_SIZE/2], (cycles / runs)); \
85
+ printf("%s\n", BENCH_UNITS); \
86
+ }
87
+
88
+ #define LIST_SIZE 10000
89
+
90
+ static int bench_sig(const mayo_params_t *p, int runs, int csv) {
91
+
92
+ int rc = 0;
93
+ int i;
94
+
95
+ int64_t cycles, cycles1, cycles2;
96
+ int64_t cycles_list[10000];
97
+
98
+ const int m_len = 32;
99
+
100
+ unsigned char *pk = calloc(PARAM_cpk_bytes(p), 1);
101
+ uint64_t *epk = calloc(1, sizeof(pk_t));
102
+ unsigned char *sk = calloc(PARAM_csk_bytes(p), 1);
103
+ sk_t *esk = calloc(1, sizeof(sk_t));
104
+ unsigned char *sig = calloc(PARAM_sig_bytes(p) + m_len, 1);
105
+ unsigned char *m = calloc(m_len, 1);
106
+ size_t len = PARAM_sig_bytes(p);
107
+
108
+ if (csv) {
109
+ printf("%s,", PARAM_name(p));
110
+ } else {
111
+ printf("Benchmarking %s\n", PARAM_name(p));
112
+ }
113
+
114
+ BENCH_CODE_1(runs);
115
+ mayo_keypair(p, pk, sk);
116
+ BENCH_CODE_2("mayo_keypair", csv);
117
+
118
+ BENCH_CODE_1(runs);
119
+ mayo_expand_sk(p, sk, esk);
120
+ BENCH_CODE_2("mayo_expand_sk", csv);
121
+
122
+ BENCH_CODE_1(runs);
123
+ mayo_expand_pk(p, pk, epk);
124
+ BENCH_CODE_2("mayo_expand_pk", csv);
125
+
126
+ BENCH_CODE_1(runs);
127
+ mayo_sign(p, sig, &len, m, m_len, sk);
128
+ BENCH_CODE_2("mayo_sign", csv);
129
+
130
+ len = 32;
131
+ BENCH_CODE_1(runs);
132
+ mayo_open(p, m, &len, sig, PARAM_sig_bytes(p), pk);
133
+ BENCH_CODE_2("mayo_verify", csv);
134
+
135
+ if (csv) {
136
+ printf("\n");
137
+ }
138
+
139
+ free(esk);
140
+ free(epk);
141
+ free(pk);
142
+ free(sk);
143
+ free(sig);
144
+ free(m);
145
+ return rc;
146
+ }
147
+
148
+ static inline int64_t cpucycles(void) {
149
+ #if (defined(TARGET_AMD64) || defined(TARGET_X86))
150
+ unsigned int hi, lo;
151
+
152
+ asm volatile ("rdtsc" : "=a" (lo), "=d"(hi));
153
+ return ((int64_t) lo) | (((int64_t) hi) << 32);
154
+ #elif (defined(TARGET_S390X))
155
+ uint64_t tod;
156
+ asm volatile("stckf %0\n" : "=Q" (tod) : : "cc");
157
+ return (tod * 1000 / 4096);
158
+ #elif (defined(TARGET_OS_MAC) && defined(TARGET_ARM64))
159
+ return rdtsc();
160
+ #else
161
+ struct timespec time;
162
+ clock_gettime(CLOCK_REALTIME, &time);
163
+ return (int64_t)(time.tv_sec * 1e9 + time.tv_nsec);
164
+ #endif
165
+ }
166
+
@@ -0,0 +1,155 @@
1
+ // SPDX-License-Identifier: Apache-2.0 and Public Domain
2
+
3
+ /*
4
+ * Modified from
5
+ * https://github.com/GMUCERG/PQC_NEON/blob/main/neon/kyber/m1cycles.c, Duc Tri Nguyen (CERG GMU)
6
+ * which was modified from M1
7
+ * https://gist.github.com/dougallj/5bafb113492047c865c0c8cfbc930155#file-m1_robsize-c-L390
8
+ */
9
+
10
+ #if defined(TARGET_OS_MAC) && defined(TARGET_ARM64)
11
+
12
+ #include <dlfcn.h>
13
+ #include <pthread.h>
14
+ #include <stdio.h>
15
+ #include <stdlib.h>
16
+ #include "m1cycles.h"
17
+
18
+ #define KPERF_LIST \
19
+ /* ret, name, params */ \
20
+ F(int, kpc_get_counting, void) \
21
+ F(int, kpc_force_all_ctrs_set, int) \
22
+ F(int, kpc_set_counting, uint32_t) \
23
+ F(int, kpc_set_thread_counting, uint32_t) \
24
+ F(int, kpc_set_config, uint32_t, void *) \
25
+ F(int, kpc_get_config, uint32_t, void *) \
26
+ F(int, kpc_set_period, uint32_t, void *) \
27
+ F(int, kpc_get_period, uint32_t, void *) \
28
+ F(uint32_t, kpc_get_counter_count, uint32_t) \
29
+ F(uint32_t, kpc_get_config_count, uint32_t) \
30
+ F(int, kperf_sample_get, int *) \
31
+ F(int, kpc_get_thread_counters, int, unsigned int, void *)
32
+
33
+ #define F(ret, name, ...) \
34
+ typedef ret name##proc(__VA_ARGS__); \
35
+ static name##proc *name;
36
+ KPERF_LIST
37
+ #undef F
38
+
39
+ #define CFGWORD_EL0A32EN_MASK (0x10000)
40
+ #define CFGWORD_EL0A64EN_MASK (0x20000)
41
+ #define CFGWORD_EL1EN_MASK (0x40000)
42
+ #define CFGWORD_EL3EN_MASK (0x80000)
43
+ #define CFGWORD_ALLMODES_MASK (0xf0000)
44
+
45
+ #define CPMU_NONE 0
46
+ #define CPMU_CORE_CYCLE 0x02
47
+ #define CPMU_INST_A64 0x8c
48
+ #define CPMU_INST_BRANCH 0x8d
49
+ #define CPMU_SYNC_DC_LOAD_MISS 0xbf
50
+ #define CPMU_SYNC_DC_STORE_MISS 0xc0
51
+ #define CPMU_SYNC_DTLB_MISS 0xc1
52
+ #define CPMU_SYNC_ST_HIT_YNGR_LD 0xc4
53
+ #define CPMU_SYNC_BR_ANY_MISP 0xcb
54
+ #define CPMU_FED_IC_MISS_DEM 0xd3
55
+ #define CPMU_FED_ITLB_MISS 0xd4
56
+
57
+ #define KPC_CLASS_FIXED (0)
58
+ #define KPC_CLASS_CONFIGURABLE (1)
59
+ #define KPC_CLASS_POWER (2)
60
+ #define KPC_CLASS_RAWPMU (3)
61
+ #define KPC_CLASS_FIXED_MASK (1u << KPC_CLASS_FIXED)
62
+ #define KPC_CLASS_CONFIGURABLE_MASK (1u << KPC_CLASS_CONFIGURABLE)
63
+ #define KPC_CLASS_POWER_MASK (1u << KPC_CLASS_POWER)
64
+ #define KPC_CLASS_RAWPMU_MASK (1u << KPC_CLASS_RAWPMU)
65
+
66
+ // COUNTERS_COUNT may vary
67
+ #define COUNTERS_COUNT 10
68
+ #define CONFIG_COUNT 8
69
+ #define KPC_MASK (KPC_CLASS_CONFIGURABLE_MASK | KPC_CLASS_FIXED_MASK)
70
+ uint64_t g_counters[COUNTERS_COUNT];
71
+ uint64_t g_config[COUNTERS_COUNT];
72
+
73
+ static void configure_rdtsc(void)
74
+ {
75
+ if (kpc_set_config(KPC_MASK, g_config))
76
+ {
77
+ printf("kpc_set_config failed\n");
78
+ return;
79
+ }
80
+
81
+ if (kpc_force_all_ctrs_set(1))
82
+ {
83
+ printf("kpc_force_all_ctrs_set failed\n");
84
+ return;
85
+ }
86
+
87
+ if (kpc_set_counting(KPC_MASK))
88
+ {
89
+ printf("kpc_set_counting failed\n");
90
+ return;
91
+ }
92
+
93
+ if (kpc_set_thread_counting(KPC_MASK))
94
+ {
95
+ printf("kpc_set_thread_counting failed\n");
96
+ return;
97
+ }
98
+ }
99
+
100
+ static void init_rdtsc(void)
101
+ {
102
+ void *kperf = dlopen(
103
+ "/System/Library/PrivateFrameworks/kperf.framework/Versions/A/kperf",
104
+ RTLD_LAZY);
105
+ if (!kperf)
106
+ {
107
+ printf("kperf = %p\n", kperf);
108
+ return;
109
+ }
110
+ #define F(ret, name, ...) \
111
+ name = (name##proc *)(dlsym(kperf, #name)); \
112
+ if (!name) \
113
+ { \
114
+ printf("%s = %p\n", #name, (void *)name); \
115
+ return; \
116
+ }
117
+ KPERF_LIST
118
+ #undef F
119
+
120
+ g_config[0] = CPMU_CORE_CYCLE | CFGWORD_EL0A64EN_MASK;
121
+
122
+ configure_rdtsc();
123
+ }
124
+
125
+ void setup_rdtsc(void)
126
+ {
127
+ int test_high_perf_cores = 1;
128
+
129
+ if (test_high_perf_cores)
130
+ {
131
+ pthread_set_qos_class_self_np(QOS_CLASS_USER_INTERACTIVE, 0);
132
+ }
133
+ else
134
+ {
135
+ pthread_set_qos_class_self_np(QOS_CLASS_BACKGROUND, 0);
136
+ }
137
+ init_rdtsc();
138
+ configure_rdtsc();
139
+ }
140
+
141
+ extern unsigned long long int rdtsc(void)
142
+ {
143
+ if (kpc_get_thread_counters(0, COUNTERS_COUNT, g_counters))
144
+ {
145
+ printf("kpc_get_thread_counters failed\n");
146
+ return 1;
147
+ }
148
+ return g_counters[2];
149
+ }
150
+
151
+ #endif
152
+
153
+
154
+
155
+
@@ -0,0 +1,13 @@
1
+ // SPDX-License-Identifier: Apache-2.0
2
+
3
+ #ifndef M1CYCLES_H
4
+ #define M1CYCLES_H
5
+
6
+ #ifdef TARGET_ARM64
7
+
8
+ void setup_rdtsc(void);
9
+ unsigned long long int rdtsc(void);
10
+
11
+ #endif
12
+
13
+ #endif
@@ -0,0 +1,271 @@
1
+ // SPDX-License-Identifier: Apache-2.0 and Unknown
2
+
3
+ /*
4
+ NIST-developed software is provided by NIST as a public service. You may use, copy, and distribute copies of the software in any medium, provided that you keep intact this entire notice. You may improve, modify, and create derivative works of the software or any portion of the software, and you may copy and distribute such modifications or works. Modified works should carry a notice stating that you changed the software and should note the date and nature of any such change. Please explicitly acknowledge the National Institute of Standards and Technology as the source of the software.
5
+
6
+ NIST-developed software is expressly provided "AS IS." NIST MAKES NO WARRANTY OF ANY KIND, EXPRESS, IMPLIED, IN FACT, OR ARISING BY OPERATION OF LAW, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, NON-INFRINGEMENT, AND DATA ACCURACY. NIST NEITHER REPRESENTS NOR WARRANTS THAT THE OPERATION OF THE SOFTWARE WILL BE UNINTERRUPTED OR ERROR-FREE, OR THAT ANY DEFECTS WILL BE CORRECTED. NIST DOES NOT WARRANT OR MAKE ANY REPRESENTATIONS REGARDING THE USE OF THE SOFTWARE OR THE RESULTS THEREOF, INCLUDING BUT NOT LIMITED TO THE CORRECTNESS, ACCURACY, RELIABILITY, OR USEFULNESS OF THE SOFTWARE.
7
+
8
+ You are solely responsible for determining the appropriateness of using and distributing the software and you assume all risks associated with its use, including but not limited to the risks and costs of program errors, compliance with applicable laws, damage to or loss of data, programs or equipment, and the unavailability or interruption of operation. This software is not intended to be used in any situation where a failure could cause risk of injury or damage to property. The software developed by NIST employees is not subject to copyright protection within the United States.
9
+ */
10
+
11
+ #include <stdio.h>
12
+ #include <stdlib.h>
13
+ #include <string.h>
14
+ #include <ctype.h>
15
+ #include <randombytes.h>
16
+ #include <mayo.h>
17
+
18
+ #define MAX_MARKER_LEN 50
19
+
20
+ #define KAT_SUCCESS 0
21
+ #define KAT_FILE_OPEN_ERROR -1
22
+ #define KAT_DATA_ERROR -3
23
+ #define KAT_CRYPTO_FAILURE -4
24
+ #define KAT_VERIFICATION_ERROR -5
25
+
26
+ static int FindMarker(FILE *infile, const char *marker);
27
+ static int ReadHex(FILE *infile, unsigned char *A, int Length, char *str);
28
+ static int test_sig_kat(const mayo_params_t *p);
29
+
30
+ int main(int argc, char *argv[]) {
31
+ int rc = 0;
32
+
33
+ #ifdef ENABLE_PARAMS_DYNAMIC
34
+ if (argc < 2) {
35
+ printf("One argument needed\n");
36
+ rc = 1;
37
+ goto end;
38
+ }
39
+
40
+ if (!strcmp(argv[1], "MAYO-1")) {
41
+ rc = test_sig_kat(&MAYO_1);
42
+ } else if (!strcmp(argv[1], "MAYO-2")) {
43
+ rc = test_sig_kat(&MAYO_2);
44
+ } else if (!strcmp(argv[1], "MAYO-3")) {
45
+ rc = test_sig_kat(&MAYO_3);
46
+ } else if (!strcmp(argv[1], "MAYO-5")) {
47
+ rc = test_sig_kat(&MAYO_5);
48
+ } else {
49
+ return -1;
50
+ }
51
+ end:
52
+ #else
53
+ rc = test_sig_kat(0);
54
+ #endif
55
+ return rc;
56
+ }
57
+
58
+ static int test_sig_kat(const mayo_params_t *p) {
59
+ unsigned char seed[48];
60
+ unsigned char *m, *sm, *m1, *sm_rsp;
61
+ size_t mlen, smlen, mlen1;
62
+ int count;
63
+ int done;
64
+ unsigned char pk[PARAM_cpk_bytes(p)], sk[PARAM_csk_bytes(p)];
65
+ int ret_val;
66
+
67
+ char fn_rsp[64];
68
+ FILE *fp_rsp;
69
+ unsigned char pk_rsp[PARAM_cpk_bytes(p)], sk_rsp[PARAM_csk_bytes(p)];
70
+
71
+ sprintf(fn_rsp, "../../KAT/PQCsignKAT_%d_%s.rsp", PARAM_csk_bytes(p), PARAM_name(p));
72
+ if ( (fp_rsp = fopen(fn_rsp, "r")) == NULL ) {
73
+ printf("Couldn't open <%s> for read\n", fn_rsp);
74
+ return KAT_FILE_OPEN_ERROR;
75
+ }
76
+
77
+ done = 0;
78
+ do {
79
+ if ( FindMarker(fp_rsp, "count = ") ) {
80
+ ret_val = fscanf(fp_rsp, "%d", &count);
81
+ } else {
82
+ done = 1;
83
+ break;
84
+ }
85
+
86
+ if ( !ReadHex(fp_rsp, seed, 48, "seed = ") ) {
87
+ printf("ERROR: unable to read 'seed' from <%s>\n", fn_rsp);
88
+ return KAT_DATA_ERROR;
89
+ }
90
+
91
+ randombytes_init(seed, NULL, 256);
92
+
93
+ if ( FindMarker(fp_rsp, "mlen = ") ) {
94
+ ret_val = fscanf(fp_rsp, "%zu", &mlen);
95
+ } else {
96
+ printf("ERROR: unable to read 'mlen' from <%s>\n", fn_rsp);
97
+ return KAT_DATA_ERROR;
98
+ }
99
+
100
+ m = (unsigned char *)calloc(mlen, sizeof(unsigned char));
101
+ m1 = (unsigned char *)calloc(mlen, sizeof(unsigned char));
102
+ sm = (unsigned char *)calloc(mlen + PARAM_sig_bytes(p), sizeof(unsigned char));
103
+ sm_rsp = (unsigned char *)calloc(mlen + PARAM_sig_bytes(p), sizeof(unsigned char));
104
+
105
+ if ( !ReadHex(fp_rsp, m, (int)mlen, "msg = ") ) {
106
+ printf("ERROR: unable to read 'msg' from <%s>\n", fn_rsp);
107
+ return KAT_DATA_ERROR;
108
+ }
109
+
110
+ // Generate the public/private keypair
111
+ if ( (ret_val = mayo_keypair(p, pk, sk)) != 0) {
112
+ printf("crypto_sign_keypair returned <%d>\n", ret_val);
113
+ return KAT_CRYPTO_FAILURE;
114
+ }
115
+ if ( !ReadHex(fp_rsp, pk_rsp, PARAM_cpk_bytes(p), "pk = ") ) {
116
+ printf("ERROR: unable to read 'pk' from <%s>\n", fn_rsp);
117
+ return KAT_DATA_ERROR;
118
+ }
119
+ if ( !ReadHex(fp_rsp, sk_rsp, PARAM_csk_bytes(p), "sk = ") ) {
120
+ printf("ERROR: unable to read 'sk' from <%s>\n", fn_rsp);
121
+ return KAT_DATA_ERROR;
122
+ }
123
+
124
+ if (memcmp(pk, pk_rsp, PARAM_cpk_bytes(p)) != 0) {
125
+ printf("ERROR: pk is different from <%s>\n", fn_rsp);
126
+ return KAT_VERIFICATION_ERROR;
127
+ }
128
+ if (memcmp(sk, sk_rsp, PARAM_csk_bytes(p)) != 0) {
129
+ printf("ERROR: sk is different from <%s>\n", fn_rsp);
130
+ return KAT_VERIFICATION_ERROR;
131
+ }
132
+
133
+ if ( (ret_val = mayo_sign(p, sm, &smlen, m, mlen, sk)) != 0) {
134
+ printf("crypto_sign returned <%d>\n", ret_val);
135
+ return KAT_CRYPTO_FAILURE;
136
+ }
137
+
138
+ if ( !ReadHex(fp_rsp, sm_rsp, smlen, "sm = ") ) {
139
+ printf("ERROR: unable to read 'sm' from <%s>\n", fn_rsp);
140
+ return KAT_DATA_ERROR;
141
+ }
142
+
143
+ if (memcmp(sm, sm_rsp, smlen) != 0) {
144
+ printf("ERROR: sm is different from <%s>\n", fn_rsp);
145
+ return KAT_VERIFICATION_ERROR;
146
+ }
147
+
148
+
149
+ if ( (ret_val = mayo_open(p, m1, &mlen1, sm, smlen, pk)) != 0) {
150
+ printf("crypto_sign_open returned <%d>\n", ret_val);
151
+ return KAT_CRYPTO_FAILURE;
152
+ }
153
+
154
+ if ( mlen != mlen1 ) {
155
+ printf("crypto_sign_open returned bad 'mlen': Got <%zu>, expected <%zu>\n", mlen1, mlen);
156
+ return KAT_CRYPTO_FAILURE;
157
+ }
158
+
159
+ if ( memcmp(m, m1, mlen) ) {
160
+ printf("crypto_sign_open returned bad 'm' value\n");
161
+ return KAT_CRYPTO_FAILURE;
162
+ }
163
+
164
+ free(m);
165
+ free(m1);
166
+ free(sm);
167
+ free(sm_rsp);
168
+
169
+ } while ( !done );
170
+
171
+ fclose(fp_rsp);
172
+
173
+ printf("Known Answer Tests PASSED. \n");
174
+ printf("\n\n");
175
+
176
+ return KAT_SUCCESS;
177
+ }
178
+
179
+
180
+ //
181
+ // ALLOW TO READ HEXADECIMAL ENTRY (KEYS, DATA, TEXT, etc.)
182
+ //
183
+ static int
184
+ FindMarker(FILE *infile, const char *marker) {
185
+ char line[MAX_MARKER_LEN];
186
+ int i, len;
187
+ int curr_line;
188
+
189
+ len = (int)strlen(marker);
190
+ if ( len > MAX_MARKER_LEN - 1 ) {
191
+ len = MAX_MARKER_LEN - 1;
192
+ }
193
+
194
+ for ( i = 0; i < len; i++ ) {
195
+ curr_line = fgetc(infile);
196
+ line[i] = curr_line;
197
+ if (curr_line == EOF ) {
198
+ return 0;
199
+ }
200
+ }
201
+ line[len] = '\0';
202
+
203
+ while ( 1 ) {
204
+ if ( !strncmp(line, marker, len) ) {
205
+ return 1;
206
+ }
207
+
208
+ for ( i = 0; i < len - 1; i++ ) {
209
+ line[i] = line[i + 1];
210
+ }
211
+ curr_line = fgetc(infile);
212
+ line[len - 1] = curr_line;
213
+ if (curr_line == EOF ) {
214
+ return 0;
215
+ }
216
+ line[len] = '\0';
217
+ }
218
+
219
+ // shouldn't get here
220
+ return 0;
221
+ }
222
+
223
+ //
224
+ // ALLOW TO READ HEXADECIMAL ENTRY (KEYS, DATA, TEXT, etc.)
225
+ //
226
+ static int
227
+ ReadHex(FILE *infile, unsigned char *A, int Length, char *str) {
228
+ int i, ch, started;
229
+ unsigned char ich;
230
+
231
+ if ( Length == 0 ) {
232
+ A[0] = 0x00;
233
+ return 1;
234
+ }
235
+ memset(A, 0x00, Length);
236
+ started = 0;
237
+ if ( FindMarker(infile, str) )
238
+ while ( (ch = fgetc(infile)) != EOF ) {
239
+ if ( !isxdigit(ch) ) {
240
+ if ( !started ) {
241
+ if ( ch == '\n' ) {
242
+ break;
243
+ } else {
244
+ continue;
245
+ }
246
+ } else {
247
+ break;
248
+ }
249
+ }
250
+ started = 1;
251
+ if ( (ch >= '0') && (ch <= '9') ) {
252
+ ich = ch - '0';
253
+ } else if ( (ch >= 'A') && (ch <= 'F') ) {
254
+ ich = ch - 'A' + 10;
255
+ } else if ( (ch >= 'a') && (ch <= 'f') ) {
256
+ ich = ch - 'a' + 10;
257
+ } else { // shouldn't ever get here
258
+ ich = 0;
259
+ }
260
+
261
+ for ( i = 0; i < Length - 1; i++ ) {
262
+ A[i] = (A[i] << 4) | (A[i + 1] >> 4);
263
+ }
264
+ A[Length - 1] = (A[Length - 1] << 4) | ich;
265
+ } else {
266
+ return 0;
267
+ }
268
+
269
+ return 1;
270
+ }
271
+