Tor 0.4.9.0-alpha-dev
equix.h
1/* Copyright (c) 2020 tevador <tevador@gmail.com> */
2/* See LICENSE for licensing information */
3
4#ifndef EQUIX_H
5#define EQUIX_H
6
7#include <stdint.h>
8#include <stddef.h>
9
10/*
11 * The solver will return at most this many solutions.
12 */
13#define EQUIX_MAX_SOLS 8
14
15/*
16 * The number of indices.
17 */
18#define EQUIX_NUM_IDX 8
19
20/*
21 * 16-bit index.
22 */
23typedef uint16_t equix_idx;
24
25/*
26 * The solution.
27 */
28typedef struct equix_solution {
29 equix_idx idx[EQUIX_NUM_IDX];
31
32/*
33 * Extra informational flags returned by the solver
34 */
35typedef enum equix_solution_flags {
36 EQUIX_SOLVER_DID_USE_COMPILER = (1 << 0),
37} equix_solution_flags;
38
39/*
40 * Fixed size buffer containing up to EQUIX_MAX_SOLS solutions.
41 */
42typedef struct equix_solutions_buffer {
43 unsigned count;
44 equix_solution_flags flags;
45 equix_solution sols[EQUIX_MAX_SOLS];
47
48/*
49 * Result type for solve and verify operations
50 */
51typedef enum equix_result {
52 EQUIX_OK, /* Solution is valid */
53 EQUIX_FAIL_CHALLENGE, /* The challenge is invalid (the internal hash
54 function doesn't pass validation). */
55 EQUIX_FAIL_ORDER, /* Indices are not in the correct order. */
56 EQUIX_FAIL_PARTIAL_SUM, /* The partial sums of the hash values don't
57 have the required number of trailing zeroes. */
58 EQUIX_FAIL_FINAL_SUM, /* The hash values don't sum to zero. */
59 EQUIX_FAIL_COMPILE, /* Can't compile, and no fallback is enabled */
60 EQUIX_FAIL_NO_SOLVER, /* Solve requested on a context with no solver */
61 EQUIX_FAIL_INTERNAL, /* Internal error (bug) */
62} equix_result;
63
64/*
65 * Opaque struct that holds the Equi-X context
66 */
67typedef struct equix_ctx equix_ctx;
68
69/*
70 * Flags for context creation
71 */
72typedef enum equix_ctx_flags {
73 EQUIX_CTX_VERIFY = 0, /* Context for verification */
74 EQUIX_CTX_SOLVE = 1, /* Context for solving */
75 EQUIX_CTX_MUST_COMPILE = 2, /* Must compile internal hash function */
76 EQUIX_CTX_TRY_COMPILE = 4, /* Compile if possible */
77 EQUIX_CTX_HUGEPAGES = 8, /* Allocate solver memory using HugePages */
78} equix_ctx_flags;
79
80#if defined(_WIN32) || defined(__CYGWIN__)
81#define EQUIX_WIN
82#endif
83
84/* Shared/static library definitions */
85#ifdef EQUIX_WIN
86 #ifdef EQUIX_SHARED
87 #define EQUIX_API __declspec(dllexport)
88 #elif !defined(EQUIX_STATIC)
89 #define EQUIX_API __declspec(dllimport)
90 #else
91 #define EQUIX_API
92 #endif
93 #define EQUIX_PRIVATE
94#else
95 #ifdef EQUIX_SHARED
96 #define EQUIX_API __attribute__ ((visibility ("default")))
97 #else
98 #define EQUIX_API __attribute__ ((visibility ("hidden")))
99 #endif
100 #define EQUIX_PRIVATE __attribute__ ((visibility ("hidden")))
101#endif
102
103#ifdef __cplusplus
104extern "C" {
105#endif
106
107/*
108 * Allocate an Equi-X context.
109 *
110 * @param flags is the type of context to be created
111 *
112 * @return pointer to a newly created context. Returns NULL on memory
113 * allocation failure.
114 */
115EQUIX_API equix_ctx* equix_alloc(equix_ctx_flags flags);
116
117/*
118* Free an Equi-X a context.
119*
120* @param ctx is a pointer to the context
121*/
122EQUIX_API void equix_free(equix_ctx* ctx);
123
124/*
125 * Find Equi-X solutions for the given challenge.
126 *
127 * @param ctx pointer to an Equi-X context
128 * @param challenge pointer to the challenge data
129 * @param challenge_size size of the challenge
130 * @param output pointer to the output array where solutions will be
131 * stored
132 *
133 * @return On success, returns EQUIX_OK and sets output->count to the number
134 * of solutions found, with the solutions themselves written to the
135 * output buffer. If the challenge is unusable, returns
136 * EQUIX_FAIL_CHALLENGE. If the EQUIX_CTX_MUST_COMPILE flag is in use
137 * and the compiler fails, this can return EQUIX_FAIL_COMPILE.
138 */
139EQUIX_API equix_result equix_solve(
140 equix_ctx* ctx,
141 const void* challenge,
142 size_t challenge_size,
143 equix_solutions_buffer *output);
144
145/*
146 * Verify an Equi-X solution.
147 *
148 * @param ctx pointer to an Equi-X context
149 * @param challenge pointer to the challenge data
150 * @param challenge_size size of the challenge
151 * @param solution pointer to the solution to be verified
152 *
153 * @return Verification result. This can return EQUIX_OK or any of the
154 * EQUIX_FAIL_* error codes.
155 */
156EQUIX_API equix_result equix_verify(
157 equix_ctx* ctx,
158 const void* challenge,
159 size_t challenge_size,
160 const equix_solution* solution);
161
162#ifdef __cplusplus
163}
164#endif
165
166#endif