UltrafastSecp256k1 3.50.0
Ultra high-performance secp256k1 elliptic curve cryptography library
Loading...
Searching...
No Matches
ufsecp_gpu.h
Go to the documentation of this file.
1/* ============================================================================
2 * UltrafastSecp256k1 -- GPU Acceleration C ABI
3 * ============================================================================
4 *
5 * Backend-neutral C ABI for GPU-accelerated batch secp256k1 operations.
6 *
7 * ## Design principles
8 *
9 * 1. Opaque GPU context (`ufsecp_gpu_ctx*`) -- backend, device, queue state.
10 * 2. Every function returns `ufsecp_error_t` (0 = OK).
11 * 3. Backend-neutral: CUDA / OpenCL / Metal are implementation details.
12 * 4. No internal GPU types leak -- all I/O is `uint8_t[]` with fixed strides.
13 * 5. Thread safety: each gpu_ctx is single-thread. Create one per thread or
14 * protect externally.
15 * 6. On the stable public GPU C ABI declared in this header, most operations
16 * are PUBLIC-DATA ONLY. ECDH and BIP-324 AEAD encrypt/decrypt are
17 * secret-bearing and documented as such.
18 *
19 * ## Feature maturity
20 *
21 * This header defines the stable GPU API surface. The stable batch-op
22 * surface currently includes 13 backend-neutral operations: 8 core ops
23 * (generator_mul, ECDSA verify, Schnorr verify, ECDH, Hash160, MSM,
24 * FROST partial verify, ecrecover) plus 5 extended ZK/BIP-324 ops.
25 * Internal kernels, benchmarks, or backend test code may cover broader
26 * primitives; that does not by itself make those primitives part of the
27 * stable production GPU ABI.
28 *
29 * CUDA -- all 13 stable GPU batch ops implemented
30 * OpenCL -- all 13 stable GPU batch ops implemented
31 * Metal -- all 13 stable GPU batch ops implemented
32 *
33 * Operations that a backend does not implement return
34 * UFSECP_ERR_GPU_UNSUPPORTED (104). This is no longer expected for the
35 * stable 13-op GPU C ABI on compiled CUDA/OpenCL/Metal backends.
36 *
37 * Guarantees:
38 * - Discovery + lifecycle functions work on all compiled backends.
39 * - Per-item results for batch ops are well-defined even on partial failure.
40 * - ECDH is the only secret-bearing GPU operation. All others are public-data.
41 * - ABI layout (function signatures, strides, error codes) is stable.
42 * - Backend additions do not break existing calling code.
43 *
44 * ## Memory
45 *
46 * Caller owns all input/output buffers. Library manages device memory
47 * internally and copies results back on return.
48 *
49 * ## Batch layout
50 *
51 * All batch inputs/outputs use flat contiguous arrays with fixed per-item
52 * strides documented in each function.
53 *
54 * ============================================================================ */
55#ifndef UFSECP_GPU_H
56#define UFSECP_GPU_H
57
58#include "ufsecp_version.h"
59#include "ufsecp_error.h"
60
61#include <stddef.h>
62#include <stdint.h>
63
64#ifdef __cplusplus
65extern "C" {
66#endif
67
68/* ============================================================================
69 * GPU-specific error codes (start at 100 to avoid conflict with CPU codes)
70 * ============================================================================ */
71
72#define UFSECP_ERR_GPU_UNAVAILABLE 100
73#define UFSECP_ERR_GPU_DEVICE 101
74#define UFSECP_ERR_GPU_LAUNCH 102
75#define UFSECP_ERR_GPU_MEMORY 103
76#define UFSECP_ERR_GPU_UNSUPPORTED 104
77#define UFSECP_ERR_GPU_BACKEND 105
78#define UFSECP_ERR_GPU_QUEUE 106
80/* ============================================================================
81 * GPU backend identifiers
82 * ============================================================================ */
83
84#define UFSECP_GPU_BACKEND_NONE 0
85#define UFSECP_GPU_BACKEND_CUDA 1
86#define UFSECP_GPU_BACKEND_OPENCL 2
87#define UFSECP_GPU_BACKEND_METAL 3
88
89/* ============================================================================
90 * Opaque GPU context
91 * ============================================================================ */
92
94
95/* ============================================================================
96 * Backend & device discovery
97 * ============================================================================ */
98
101UFSECP_API uint32_t ufsecp_gpu_backend_count(uint32_t* backend_ids, uint32_t max_ids);
102
104UFSECP_API const char* ufsecp_gpu_backend_name(uint32_t backend_id);
105
108
111
113typedef struct {
114 char name[128];
116 uint32_t compute_units;
117 uint32_t max_clock_mhz;
119 uint32_t backend_id;
120 uint32_t device_index;
122
125 uint32_t backend_id,
126 uint32_t device_index,
127 ufsecp_gpu_device_info_t* info_out);
128
129/* ============================================================================
130 * GPU context lifecycle
131 * ============================================================================ */
132
139 ufsecp_gpu_ctx** ctx_out,
140 uint32_t backend_id,
141 uint32_t device_index);
142
145
148
154
155/* ============================================================================
156 * First-wave GPU batch operations
157 * ============================================================================ */
158
169 ufsecp_gpu_ctx* ctx,
170 const uint8_t* scalars32,
171 size_t count,
172 uint8_t* out_pubkeys33);
173
187 ufsecp_gpu_ctx* ctx,
188 const uint8_t* msg_hashes32,
189 const uint8_t* pubkeys33,
190 const uint8_t* sigs64,
191 size_t count,
192 uint8_t* out_results);
193
206 ufsecp_gpu_ctx* ctx,
207 const uint8_t* msg_hashes32,
208 const uint8_t* pubkeys_x32,
209 const uint8_t* sigs64,
210 size_t count,
211 uint8_t* out_results);
212
225 ufsecp_gpu_ctx* ctx,
226 const uint8_t* privkeys32,
227 const uint8_t* peer_pubkeys33,
228 size_t count,
229 uint8_t* out_secrets32);
230
241 ufsecp_gpu_ctx* ctx,
242 const uint8_t* pubkeys33,
243 size_t count,
244 uint8_t* out_hash160);
245
258 ufsecp_gpu_ctx* ctx,
259 const uint8_t* scalars32,
260 const uint8_t* points33,
261 size_t n,
262 uint8_t* out_result33);
263
264/* ============================================================================
265 * GPU error string extension
266 * ============================================================================ */
267
288 ufsecp_gpu_ctx* ctx,
289 const uint8_t* z_i32,
290 const uint8_t* D_i33,
291 const uint8_t* E_i33,
292 const uint8_t* Y_i33,
293 const uint8_t* rho_i32,
294 const uint8_t* lambda_ie32,
295 const uint8_t* negate_R,
296 const uint8_t* negate_key,
297 size_t count,
298 uint8_t* out_results);
299
315 ufsecp_gpu_ctx* ctx,
316 const uint8_t* msg_hashes32,
317 const uint8_t* sigs64,
318 const int* recids,
319 size_t count,
320 uint8_t* out_pubkeys33,
321 uint8_t* out_valid);
322
326
327/* ============================================================================
328 * ZK proof batch operations (GPU)
329 * ============================================================================ */
330
348 ufsecp_gpu_ctx* ctx,
349 const uint8_t* proofs64,
350 const uint8_t* pubkeys65,
351 const uint8_t* messages32,
352 size_t count,
353 uint8_t* out_results);
354
374 ufsecp_gpu_ctx* ctx,
375 const uint8_t* proofs64,
376 const uint8_t* G_pts65,
377 const uint8_t* H_pts65,
378 const uint8_t* P_pts65,
379 const uint8_t* Q_pts65,
380 size_t count,
381 uint8_t* out_results);
382
400 ufsecp_gpu_ctx* ctx,
401 const uint8_t* proofs324,
402 const uint8_t* commitments65,
403 const uint8_t* H_generator65,
404 size_t count,
405 uint8_t* out_results);
406
407/* ============================================================================
408 * BIP-324 transport batch operations (GPU)
409 * ============================================================================ */
410
429 ufsecp_gpu_ctx* ctx,
430 const uint8_t* keys32,
431 const uint8_t* nonces12,
432 const uint8_t* plaintexts,
433 const uint32_t* sizes,
434 uint32_t max_payload,
435 size_t count,
436 uint8_t* wire_out);
437
455 ufsecp_gpu_ctx* ctx,
456 const uint8_t* keys32,
457 const uint8_t* nonces12,
458 const uint8_t* wire_in,
459 const uint32_t* sizes,
460 uint32_t max_payload,
461 size_t count,
462 uint8_t* plaintext_out,
463 uint8_t* out_valid);
464
465#ifdef __cplusplus
466}
467#endif
468
469#endif /* UFSECP_GPU_H */
int ufsecp_error_t
UFSECP_API ufsecp_error_t ufsecp_gpu_last_error(const ufsecp_gpu_ctx *ctx)
UFSECP_API ufsecp_error_t ufsecp_gpu_ecdh_batch(ufsecp_gpu_ctx *ctx, const uint8_t *privkeys32, const uint8_t *peer_pubkeys33, size_t count, uint8_t *out_secrets32)
UFSECP_API int ufsecp_gpu_is_available(uint32_t backend_id)
UFSECP_API ufsecp_error_t ufsecp_gpu_zk_knowledge_verify_batch(ufsecp_gpu_ctx *ctx, const uint8_t *proofs64, const uint8_t *pubkeys65, const uint8_t *messages32, size_t count, uint8_t *out_results)
UFSECP_API ufsecp_error_t ufsecp_gpu_bip324_aead_encrypt_batch(ufsecp_gpu_ctx *ctx, const uint8_t *keys32, const uint8_t *nonces12, const uint8_t *plaintexts, const uint32_t *sizes, uint32_t max_payload, size_t count, uint8_t *wire_out)
UFSECP_API ufsecp_error_t ufsecp_gpu_frost_verify_partial_batch(ufsecp_gpu_ctx *ctx, const uint8_t *z_i32, const uint8_t *D_i33, const uint8_t *E_i33, const uint8_t *Y_i33, const uint8_t *rho_i32, const uint8_t *lambda_ie32, const uint8_t *negate_R, const uint8_t *negate_key, size_t count, uint8_t *out_results)
UFSECP_API ufsecp_error_t ufsecp_gpu_bip324_aead_decrypt_batch(ufsecp_gpu_ctx *ctx, const uint8_t *keys32, const uint8_t *nonces12, const uint8_t *wire_in, const uint32_t *sizes, uint32_t max_payload, size_t count, uint8_t *plaintext_out, uint8_t *out_valid)
UFSECP_API const char * ufsecp_gpu_last_error_msg(const ufsecp_gpu_ctx *ctx)
UFSECP_API ufsecp_error_t ufsecp_gpu_ecdsa_verify_batch(ufsecp_gpu_ctx *ctx, const uint8_t *msg_hashes32, const uint8_t *pubkeys33, const uint8_t *sigs64, size_t count, uint8_t *out_results)
UFSECP_API ufsecp_error_t ufsecp_gpu_generator_mul_batch(ufsecp_gpu_ctx *ctx, const uint8_t *scalars32, size_t count, uint8_t *out_pubkeys33)
UFSECP_API uint32_t ufsecp_gpu_backend_count(uint32_t *backend_ids, uint32_t max_ids)
UFSECP_API ufsecp_error_t ufsecp_gpu_ctx_create(ufsecp_gpu_ctx **ctx_out, uint32_t backend_id, uint32_t device_index)
UFSECP_API ufsecp_error_t ufsecp_gpu_ecrecover_batch(ufsecp_gpu_ctx *ctx, const uint8_t *msg_hashes32, const uint8_t *sigs64, const int *recids, size_t count, uint8_t *out_pubkeys33, uint8_t *out_valid)
UFSECP_API ufsecp_error_t ufsecp_gpu_zk_dleq_verify_batch(ufsecp_gpu_ctx *ctx, const uint8_t *proofs64, const uint8_t *G_pts65, const uint8_t *H_pts65, const uint8_t *P_pts65, const uint8_t *Q_pts65, size_t count, uint8_t *out_results)
UFSECP_API const char * ufsecp_gpu_backend_name(uint32_t backend_id)
UFSECP_API ufsecp_error_t ufsecp_gpu_schnorr_verify_batch(ufsecp_gpu_ctx *ctx, const uint8_t *msg_hashes32, const uint8_t *pubkeys_x32, const uint8_t *sigs64, size_t count, uint8_t *out_results)
UFSECP_API ufsecp_error_t ufsecp_gpu_hash160_pubkey_batch(ufsecp_gpu_ctx *ctx, const uint8_t *pubkeys33, size_t count, uint8_t *out_hash160)
UFSECP_API uint32_t ufsecp_gpu_device_count(uint32_t backend_id)
UFSECP_API const char * ufsecp_gpu_error_str(ufsecp_error_t err)
UFSECP_API ufsecp_error_t ufsecp_gpu_msm(ufsecp_gpu_ctx *ctx, const uint8_t *scalars32, const uint8_t *points33, size_t n, uint8_t *out_result33)
UFSECP_API ufsecp_error_t ufsecp_gpu_bulletproof_verify_batch(ufsecp_gpu_ctx *ctx, const uint8_t *proofs324, const uint8_t *commitments65, const uint8_t *H_generator65, size_t count, uint8_t *out_results)
UFSECP_API void ufsecp_gpu_ctx_destroy(ufsecp_gpu_ctx *ctx)
UFSECP_API ufsecp_error_t ufsecp_gpu_device_info(uint32_t backend_id, uint32_t device_index, ufsecp_gpu_device_info_t *info_out)
#define UFSECP_API