UltrafastSecp256k1 3.68.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
65# define UFSECP_NOEXCEPT noexcept
66extern "C" {
67#else
68# define UFSECP_NOEXCEPT
69#endif
70
71/* ============================================================================
72 * GPU-specific error codes (start at 100 to avoid conflict with CPU codes)
73 * ============================================================================ */
74
75#define UFSECP_ERR_GPU_UNAVAILABLE 100
76#define UFSECP_ERR_GPU_DEVICE 101
77#define UFSECP_ERR_GPU_LAUNCH 102
78#define UFSECP_ERR_GPU_MEMORY 103
79#define UFSECP_ERR_GPU_UNSUPPORTED 104
80#define UFSECP_ERR_GPU_BACKEND 105
81#define UFSECP_ERR_GPU_QUEUE 106
83/* ============================================================================
84 * GPU backend identifiers
85 * ============================================================================ */
86
87#define UFSECP_GPU_BACKEND_NONE 0
88#define UFSECP_GPU_BACKEND_CUDA 1
89#define UFSECP_GPU_BACKEND_OPENCL 2
90#define UFSECP_GPU_BACKEND_METAL 3
91
92/* ============================================================================
93 * Opaque GPU context
94 * ============================================================================ */
95
97
98/* ============================================================================
99 * Backend & device discovery
100 * ============================================================================ */
101
104UFSECP_API uint32_t ufsecp_gpu_backend_count(uint32_t* backend_ids, uint32_t max_ids) UFSECP_NOEXCEPT;
105
107UFSECP_API const char* ufsecp_gpu_backend_name(uint32_t backend_id);
108
111
114
116typedef struct {
117 char name[128];
119 uint32_t compute_units;
120 uint32_t max_clock_mhz;
122 uint32_t backend_id;
123 uint32_t device_index;
125
128 uint32_t backend_id,
129 uint32_t device_index,
130 ufsecp_gpu_device_info_t* info_out);
131
132/* ============================================================================
133 * GPU context lifecycle
134 * ============================================================================ */
135
142 ufsecp_gpu_ctx** ctx_out,
143 uint32_t backend_id,
144 uint32_t device_index);
145
148
154
157
163
164/* ============================================================================
165 * First-wave GPU batch operations
166 * ============================================================================ */
167
178 ufsecp_gpu_ctx* ctx,
179 const uint8_t* scalars32,
180 size_t count,
181 uint8_t* out_pubkeys33);
182
196 ufsecp_gpu_ctx* ctx,
197 const uint8_t* msg_hashes32,
198 const uint8_t* pubkeys33,
199 const uint8_t* sigs64,
200 size_t count,
201 uint8_t* out_results);
202
215 ufsecp_gpu_ctx* ctx,
216 const uint8_t* msg_hashes32,
217 const uint8_t* pubkeys_x32,
218 const uint8_t* sigs64,
219 size_t count,
220 uint8_t* out_results);
221
234 ufsecp_gpu_ctx* ctx,
235 const uint8_t* privkeys32,
236 const uint8_t* peer_pubkeys33,
237 size_t count,
238 uint8_t* out_secrets32);
239
250 ufsecp_gpu_ctx* ctx,
251 const uint8_t* pubkeys33,
252 size_t count,
253 uint8_t* out_hash160);
254
267 ufsecp_gpu_ctx* ctx,
268 const uint8_t* scalars32,
269 const uint8_t* points33,
270 size_t n,
271 uint8_t* out_result33);
272
273/* ============================================================================
274 * GPU error string extension
275 * ============================================================================ */
276
297 ufsecp_gpu_ctx* ctx,
298 const uint8_t* z_i32,
299 const uint8_t* D_i33,
300 const uint8_t* E_i33,
301 const uint8_t* Y_i33,
302 const uint8_t* rho_i32,
303 const uint8_t* lambda_ie32,
304 const uint8_t* negate_R,
305 const uint8_t* negate_key,
306 size_t count,
307 uint8_t* out_results);
308
324 ufsecp_gpu_ctx* ctx,
325 const uint8_t* msg_hashes32,
326 const uint8_t* sigs64,
327 const int* recids,
328 size_t count,
329 uint8_t* out_pubkeys33,
330 uint8_t* out_valid);
331
335
336/* ============================================================================
337 * ZK proof batch operations (GPU)
338 * ============================================================================ */
339
357 ufsecp_gpu_ctx* ctx,
358 const uint8_t* proofs64,
359 const uint8_t* pubkeys65,
360 const uint8_t* messages32,
361 size_t count,
362 uint8_t* out_results);
363
383 ufsecp_gpu_ctx* ctx,
384 const uint8_t* proofs64,
385 const uint8_t* G_pts65,
386 const uint8_t* H_pts65,
387 const uint8_t* P_pts65,
388 const uint8_t* Q_pts65,
389 size_t count,
390 uint8_t* out_results);
391
409 ufsecp_gpu_ctx* ctx,
410 const uint8_t* proofs324,
411 const uint8_t* commitments65,
412 const uint8_t* H_generator65,
413 size_t count,
414 uint8_t* out_results);
415
416/* ============================================================================
417 * BIP-324 transport batch operations (GPU)
418 * ============================================================================ */
419
438 ufsecp_gpu_ctx* ctx,
439 const uint8_t* keys32,
440 const uint8_t* nonces12,
441 const uint8_t* plaintexts,
442 const uint32_t* sizes,
443 uint32_t max_payload,
444 size_t count,
445 uint8_t* wire_out);
446
464 ufsecp_gpu_ctx* ctx,
465 const uint8_t* keys32,
466 const uint8_t* nonces12,
467 const uint8_t* wire_in,
468 const uint32_t* sizes,
469 uint32_t max_payload,
470 size_t count,
471 uint8_t* plaintext_out,
472 uint8_t* out_valid);
473
474/* -- ECDSA SNARK witness batch (eprint 2025/695) ------------------------------ */
475
478#define UFSECP_ECDSA_SNARK_WITNESS_BYTES 760
479
495 ufsecp_gpu_ctx* ctx,
496 const uint8_t* msg_hashes32,
497 const uint8_t* pubkeys33,
498 const uint8_t* sigs64,
499 size_t count,
500 uint8_t* out_witnesses);
501
502/* -- BIP340 Schnorr SNARK witness batch --------------------------------------- */
503
506#define UFSECP_SCHNORR_SNARK_WITNESS_BYTES 472
507
522 ufsecp_gpu_ctx* ctx,
523 const uint8_t* msgs32,
524 const uint8_t* pubkeys_x32,
525 const uint8_t* sigs64,
526 size_t count,
527 uint8_t* out_witnesses);
528
529/* ============================================================================
530 * BIP-352 Silent Payment scanning (GPU + CPU plan utility)
531 * ============================================================================ */
532
535#define UFSECP_BIP352_SCAN_PLAN_BYTES 264
536
553 const uint8_t scan_privkey32[32],
554 uint8_t plan264_out[264]);
555
589 ufsecp_gpu_ctx* ctx,
590 const uint8_t scan_privkey32[32],
591 const uint8_t spend_pubkey33[33],
592 const uint8_t* tweak_pubkeys33,
593 size_t n_tweaks,
594 uint64_t* prefix64_out);
595
596#ifdef __cplusplus
597}
598#endif
599
600#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_NOEXCEPT
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 int ufsecp_gpu_is_ready(const ufsecp_gpu_ctx *ctx) UFSECP_NOEXCEPT
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)
#define UFSECP_NOEXCEPT
Definition ufsecp_gpu.h:68
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 ufsecp_error_t ufsecp_gpu_zk_schnorr_snark_witness_batch(ufsecp_gpu_ctx *ctx, const uint8_t *msgs32, const uint8_t *pubkeys_x32, const uint8_t *sigs64, size_t count, uint8_t *out_witnesses)
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 ufsecp_error_t ufsecp_gpu_bip352_scan_batch(ufsecp_gpu_ctx *ctx, const uint8_t scan_privkey32[32], const uint8_t spend_pubkey33[33], const uint8_t *tweak_pubkeys33, size_t n_tweaks, uint64_t *prefix64_out)
UFSECP_API ufsecp_error_t ufsecp_bip352_prepare_scan_plan(const uint8_t scan_privkey32[32], uint8_t plan264_out[264])
UFSECP_API uint32_t ufsecp_gpu_device_count(uint32_t backend_id) UFSECP_NOEXCEPT
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 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 uint32_t ufsecp_gpu_backend_count(uint32_t *backend_ids, uint32_t max_ids) UFSECP_NOEXCEPT
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)
UFSECP_API ufsecp_error_t ufsecp_gpu_zk_ecdsa_snark_witness_batch(ufsecp_gpu_ctx *ctx, const uint8_t *msg_hashes32, const uint8_t *pubkeys33, const uint8_t *sigs64, size_t count, uint8_t *out_witnesses)
struct ufsecp_gpu_ctx ufsecp_gpu_ctx
Definition ufsecp_gpu.h:96
#define UFSECP_API