purify
C++ Purify implementation with native circuit and BPP support
Loading...
Searching...
No Matches
uint.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#ifdef __cplusplus
16extern "C" {
17#endif
18
19/*
20 * Unless documented otherwise, helpers in this header do not support overlapping
21 * input and output storage.
22 */
23
24#define PURIFY_DECLARE_UINT_FUNCS(width, words) \
25 void purify_u##width##_set_zero(uint64_t out[words]); \
26 void purify_u##width##_set_u64(uint64_t out[words], uint64_t value); \
27 void purify_u##width##_from_bytes_be(uint64_t out[words], const unsigned char* data, size_t size); \
28 int purify_u##width##_is_zero(const uint64_t value[words]); \
29 int purify_u##width##_compare(const uint64_t lhs[words], const uint64_t rhs[words]); \
30 int purify_u##width##_try_add_small(uint64_t value[words], uint32_t addend); \
31 int purify_u##width##_try_mul_small(uint64_t value[words], uint32_t factor); \
32 int purify_u##width##_try_add(uint64_t value[words], const uint64_t addend[words]); \
33 int purify_u##width##_try_sub(uint64_t value[words], const uint64_t subtrahend[words]); \
34 size_t purify_u##width##_bit_length(const uint64_t value[words]); \
35 int purify_u##width##_bit(const uint64_t value[words], size_t index); \
36 int purify_u##width##_try_set_bit(uint64_t value[words], size_t index); \
37 void purify_u##width##_shifted_left(uint64_t out[words], const uint64_t value[words], size_t shift_bits); \
38 void purify_u##width##_shifted_right(uint64_t out[words], const uint64_t value[words], size_t shift_bits); \
39 void purify_u##width##_shift_right_one(uint64_t value[words]); \
40 void purify_u##width##_mask_bits(uint64_t value[words], size_t keep_bits); \
41 uint32_t purify_u##width##_divmod_small(uint64_t value[words], uint32_t divisor); \
42 void purify_u##width##_to_bytes_be(unsigned char out[words * 8], const uint64_t value[words])
43
47
48#undef PURIFY_DECLARE_UINT_FUNCS
49
50void purify_u320_widen_u256(uint64_t out[5], const uint64_t value[4]);
51void purify_u512_widen_u256(uint64_t out[8], const uint64_t value[4]);
52int purify_u256_try_narrow_u320(uint64_t out[4], const uint64_t value[5]);
53int purify_u256_try_narrow_u512(uint64_t out[4], const uint64_t value[8]);
54int purify_u512_try_divmod_same(uint64_t quotient[8], uint64_t remainder[8],
55 const uint64_t numerator[8], const uint64_t denominator[8]);
56/* Fixed-round masked long division intended for secret numerators and non-zero public denominators. */
57int purify_u512_try_divmod_same_consttime(uint64_t quotient[8], uint64_t remainder[8],
58 const uint64_t numerator[8], const uint64_t denominator[8]);
59void purify_u512_multiply_u256(uint64_t out[8], const uint64_t lhs[4], const uint64_t rhs[4]);
60
61#ifdef __cplusplus
62}
63#endif
int purify_u256_try_narrow_u512(uint64_t out[4], const uint64_t value[8])
Definition uint.c:183
void purify_u512_widen_u256(uint64_t out[8], const uint64_t value[4])
Definition uint.c:170
void purify_u320_widen_u256(uint64_t out[5], const uint64_t value[4])
Definition uint.c:165
void purify_u512_multiply_u256(uint64_t out[8], const uint64_t lhs[4], const uint64_t rhs[4])
Definition uint.c:263
int purify_u512_try_divmod_same(uint64_t quotient[8], uint64_t remainder[8], const uint64_t numerator[8], const uint64_t denominator[8])
Definition uint.c:194
int purify_u256_try_narrow_u320(uint64_t out[4], const uint64_t value[5])
Definition uint.c:175
int purify_u512_try_divmod_same_consttime(uint64_t quotient[8], uint64_t remainder[8], const uint64_t numerator[8], const uint64_t denominator[8])
Definition uint.c:235
#define PURIFY_DECLARE_UINT_FUNCS(width, words)
Definition uint.h:24