purify
C++ Purify implementation with native circuit and BPP support
Loading...
Searching...
No Matches
secp_bridge.h
Go to the documentation of this file.
1// Copyright (c) 2026 Judica, Inc.
2// Distributed under the MIT software license, see the accompanying
3// file COPYING or https://opensource.org/license/mit/.
4
10#pragma once
11
12#include <stddef.h>
13#include <stdint.h>
14
15#include "purify/secp_context.h"
16
17#ifdef __cplusplus
18extern "C" {
19#endif
20
22typedef struct purify_scalar {
23 uint64_t words[4];
25
27void purify_scalar_set_int(purify_scalar* out, unsigned int value);
29void purify_scalar_set_u64(purify_scalar* out, uint64_t value);
31void purify_scalar_set_b32(purify_scalar* out, const unsigned char input32[32], int* overflow);
33void purify_scalar_get_b32(unsigned char output32[32], const purify_scalar* value);
34
36int purify_scalar_is_zero(const purify_scalar* value);
38int purify_scalar_is_one(const purify_scalar* value);
40int purify_scalar_is_even(const purify_scalar* value);
42int purify_scalar_eq(const purify_scalar* lhs, const purify_scalar* rhs);
43
45void purify_scalar_negate(purify_scalar* out, const purify_scalar* value);
51int purify_scalar_add(purify_scalar* out, const purify_scalar* lhs, const purify_scalar* rhs);
53void purify_scalar_mul(purify_scalar* out, const purify_scalar* lhs, const purify_scalar* rhs);
55void purify_scalar_cmov(purify_scalar* dst, const purify_scalar* src, int flag);
56
63void purify_sha256(unsigned char output32[32], const unsigned char *data,
64 size_t data_len);
65
75int purify_sha256_many(unsigned char output32[32],
76 const unsigned char *const *items,
77 const size_t *item_lens,
78 size_t items_count);
79
88void purify_hmac_sha256(unsigned char output32[32],
89 const unsigned char* key, size_t key_len,
90 const unsigned char* data, size_t data_len);
91
99 unsigned char seckey32[32],
100 unsigned char xonly_pubkey32[32]);
101
109 unsigned char scalar32[32],
110 unsigned char xonly_nonce32[32]);
111
120 const unsigned char point33[33],
121 unsigned char xonly32[32],
122 int* parity_out);
123
126 const unsigned char xonly_pubkey32[32]);
127
135 const unsigned char sig64[64]);
136
145 unsigned char sig64[64],
146 const unsigned char* msg, size_t msglen,
147 const unsigned char seckey32[32],
148 const unsigned char nonce32[32]);
149
155 const unsigned char sig64[64],
156 const unsigned char* msg, size_t msglen,
157 const unsigned char xonly_pubkey32[32]);
158
159#ifdef __cplusplus
160}
161#endif
void purify_scalar_mul(purify_scalar *out, const purify_scalar *lhs, const purify_scalar *rhs)
Multiplies two scalars modulo the backend field.
int purify_scalar_is_zero(const purify_scalar *value)
Returns nonzero when the scalar is zero.
int purify_bip340_xonly_from_point(purify_secp_context *context, const unsigned char point33[33], unsigned char xonly32[32], int *parity_out)
Converts a compressed secp256k1 point into its x-only public key encoding.
int purify_bip340_key_from_seckey(purify_secp_context *context, unsigned char seckey32[32], unsigned char xonly_pubkey32[32])
Canonicalizes a valid secp256k1 secret key for BIP340 and derives its x-only public key.
int purify_scalar_add(purify_scalar *out, const purify_scalar *lhs, const purify_scalar *rhs)
Adds two scalars modulo the backend field.
int purify_bip340_nonce_from_scalar(purify_secp_context *context, unsigned char scalar32[32], unsigned char xonly_nonce32[32])
Canonicalizes a valid secp256k1 nonce scalar for BIP340 and derives its x-only public nonce.
void purify_scalar_set_int(purify_scalar *out, unsigned int value)
Initializes a scalar from an unsigned integer.
void purify_scalar_cmov(purify_scalar *dst, const purify_scalar *src, int flag)
Conditionally assigns src into dst when flag is nonzero.
int purify_bip340_sign_with_fixed_nonce(purify_secp_context *context, unsigned char sig64[64], const unsigned char *msg, size_t msglen, const unsigned char seckey32[32], const unsigned char nonce32[32])
Signs a message with a caller-supplied BIP340 nonce scalar.
int purify_scalar_is_even(const purify_scalar *value)
Returns nonzero when the scalar is even.
int purify_sha256_many(unsigned char output32[32], const unsigned char *const *items, const size_t *item_lens, size_t items_count)
Computes SHA-256 over a set of byte strings.
void purify_sha256(unsigned char output32[32], const unsigned char *data, size_t data_len)
Computes SHA-256 over a byte string.
int purify_scalar_is_one(const purify_scalar *value)
Returns nonzero when the scalar is one.
int purify_bip340_validate_signature(purify_secp_context *context, const unsigned char sig64[64])
Returns nonzero when the 64-byte BIP340 signature has a syntactically valid encoding.
void purify_scalar_inverse(purify_scalar *out, const purify_scalar *value)
Computes the multiplicative inverse of a scalar in constant time.
void purify_scalar_inverse_var(purify_scalar *out, const purify_scalar *value)
Computes the multiplicative inverse of a scalar.
int purify_bip340_validate_xonly_pubkey(purify_secp_context *context, const unsigned char xonly_pubkey32[32])
Returns nonzero when the x-only public key encoding parses successfully.
int purify_scalar_eq(const purify_scalar *lhs, const purify_scalar *rhs)
Returns nonzero when two scalars are equal.
void purify_scalar_negate(purify_scalar *out, const purify_scalar *value)
Computes the additive inverse of a scalar.
void purify_scalar_set_u64(purify_scalar *out, uint64_t value)
Initializes a scalar from a 64-bit unsigned integer.
void purify_hmac_sha256(unsigned char output32[32], const unsigned char *key, size_t key_len, const unsigned char *data, size_t data_len)
Computes HMAC-SHA256 over a byte string.
void purify_scalar_get_b32(unsigned char output32[32], const purify_scalar *value)
Serializes a scalar as 32 big-endian bytes.
int purify_bip340_verify(purify_secp_context *context, const unsigned char sig64[64], const unsigned char *msg, size_t msglen, const unsigned char xonly_pubkey32[32])
Verifies a BIP340 signature against a serialized x-only public key.
void purify_scalar_set_b32(purify_scalar *out, const unsigned char input32[32], int *overflow)
Parses a big-endian 32-byte scalar.
Shared public declaration of Purify's reusable secp256k1 context handle.
Opaque scalar storage compatible with secp256k1-zkp internal scalar storage.
Definition secp_bridge.h:22
uint64_t words[4]
Definition secp_bridge.h:23