common

package
v1.0.0 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Jun 15, 2025 License: CC0-1.0 Imports: 6 Imported by: 0

Documentation

Index

Constants

View Source
const (
	RESTR_G_TABLE  uint64 = 0x0140201008040201
	RESTR_G_GEN           = 16
	RESTR_G_GEN_1  uint16 = uint16(RESTR_G_GEN)
	RESTR_G_GEN_2  uint16 = 256
	RESTR_G_GEN_4  uint16 = 384
	RESTR_G_GEN_8  uint16 = 355
	RESTR_G_GEN_16 uint16 = 302
	RESTR_G_GEN_32 uint16 = 93
	RESTR_G_GEN_64 uint16 = 505
)
View Source
const (
	RSDP_NAME   = "RSDP"
	RSDP_G_NAME = "RSDP-G"
)
View Source
const (
	VARIANT_MASK   = 0b00100000
	VARIANT_RSDP   = 0
	VARIANT_RSDP_G = 32
)
View Source
const (
	LEVEL_MASK = 0b00000111
	LEVEL_1    = 1
	LEVEL_3    = 3
	LEVEL_5    = 5
)
View Source
const (
	NO_TYPE_MASK  CONFIG_IDENT = 0b00100111
	TYPE_MASK     CONFIG_IDENT = 0b00011000
	TYPE_SMALL                 = 8
	TYPE_BALANCED              = 16
	TYPE_FAST                  = 24
)
View Source
const (
	RSDP_PARAM_P = 127
	RSDP_PARAM_Z = 7

	RSDP_G_PARAM_P = 509
	RSDP_G_PARAM_Z = 127
)

Variables

View Source
var RSDP_1_BASIS = ProtocolData{
	SchemeData: SchemeData{
		Csprng: SCHEME_1_BASIS.Csprng,
		Lambda: SCHEME_1_BASIS.Lambda,
		Params: Params{
			P: RSDP_PARAM_P, Z: RSDP_PARAM_Z,
			N: 127, K: 76,
		},
	},
	G: 2,
}
View Source
var RSDP_3_BASIS = ProtocolData{
	SchemeData: SchemeData{
		Csprng: SCHEME_3_BASIS.Csprng,
		Lambda: SCHEME_3_BASIS.Lambda,
		Params: Params{
			P: RSDP_PARAM_P, Z: RSDP_PARAM_Z,
			N: 187, K: 111,
		},
	},
	G: 2,
}
View Source
var RSDP_5_BASIS = ProtocolData{
	SchemeData: SchemeData{
		Csprng: SCHEME_5_BASIS.Csprng,
		Lambda: SCHEME_5_BASIS.Lambda,
		Params: Params{
			P: RSDP_PARAM_P, Z: RSDP_PARAM_Z,
			N: 251, K: 150,
		},
	},
	G: 2,
}
View Source
var RSDP_G_1_BASIS = ProtocolData{
	SchemeData: SchemeData{
		Csprng: SCHEME_1_BASIS.Csprng,
		Lambda: SCHEME_1_BASIS.Lambda,
		Params: Params{
			P: RSDP_G_PARAM_P, Z: RSDP_G_PARAM_Z,
			N: 55, K: 36, M: 25,
		},
	},
	G: 16,
}
View Source
var RSDP_G_3_BASIS = ProtocolData{
	SchemeData: SchemeData{
		Csprng: SCHEME_3_BASIS.Csprng,
		Lambda: SCHEME_3_BASIS.Lambda,
		Params: Params{
			P: RSDP_G_PARAM_P, Z: RSDP_G_PARAM_Z,
			N: 79, K: 48, M: 40,
		},
	},
	G: 16,
}
View Source
var RSDP_G_5_BASIS = ProtocolData{
	SchemeData: SchemeData{
		Csprng: SCHEME_5_BASIS.Csprng,
		Lambda: SCHEME_5_BASIS.Lambda,
		Params: Params{
			P: RSDP_G_PARAM_P, Z: RSDP_G_PARAM_Z,
			N: 106, K: 69, M: 48,
		},
	},
	G: 16,
}
View Source
var SCHEME_1_BASIS = SchemeData{
	Csprng: "SHAKE128-256",
	Lambda: 128,
}
View Source
var SCHEME_3_BASIS = SchemeData{
	Csprng: "SHAKE256-384",
	Lambda: 192,
}
View Source
var SCHEME_5_BASIS = SchemeData{
	Csprng: "SHAKE256-512",
	Lambda: 256,
}

Functions

func BitsToRepresent

func BitsToRepresent(n uint) int

func Configs

func Configs() iter.Seq2[int, CONFIG_IDENT]

func Contains

func Contains(slice []int, elem int) bool

func FP_DOUBLE_PREC

func FP_DOUBLE_PREC[T FP_ELEM, P FP_PREC](input T) P

func Flatten

func Flatten(matrix [][]byte) []byte

func MatrixMultiplicationByte

func MatrixMultiplicationByte(matrix [][]byte, vector []byte) ([]byte, error)

func MultiplyVectorMatrix

func MultiplyVectorMatrix(vector []byte, matrix [][]byte) []byte

func RoundUp

func RoundUp(amount, roundAmt uint) uint

func ScalarVecMulByte

func ScalarVecMulByte(vec []byte, scalar byte) []byte

func Sum

func Sum(slice []int) int

Insert auxiliary functions here

func TransposeByteMatrix

func TransposeByteMatrix(matrix [][]byte) [][]byte

func Unflatten

func Unflatten(matrix []byte, t int) [][]byte

TODO: Implement this function

Types

type CONFIG_IDENT

type CONFIG_IDENT uint8
const (
	RSDP_1          CONFIG_IDENT = VARIANT_RSDP + LEVEL_1
	RSDP_1_SMALL    CONFIG_IDENT = VARIANT_RSDP + LEVEL_1 + TYPE_SMALL
	RSDP_1_BALANCED CONFIG_IDENT = VARIANT_RSDP + LEVEL_1 + TYPE_BALANCED
	RSDP_1_FAST     CONFIG_IDENT = VARIANT_RSDP + LEVEL_1 + TYPE_FAST
	RSDP_3          CONFIG_IDENT = VARIANT_RSDP + LEVEL_3
	RSDP_3_SMALL    CONFIG_IDENT = VARIANT_RSDP + LEVEL_3 + TYPE_SMALL
	RSDP_3_BALANCED CONFIG_IDENT = VARIANT_RSDP + LEVEL_3 + TYPE_BALANCED
	RSDP_3_FAST     CONFIG_IDENT = VARIANT_RSDP + LEVEL_3 + TYPE_FAST
	RSDP_5          CONFIG_IDENT = VARIANT_RSDP + LEVEL_5
	RSDP_5_SMALL    CONFIG_IDENT = VARIANT_RSDP + LEVEL_5 + TYPE_SMALL
	RSDP_5_BALANCED CONFIG_IDENT = VARIANT_RSDP + LEVEL_5 + TYPE_BALANCED
	RSDP_5_FAST     CONFIG_IDENT = VARIANT_RSDP + LEVEL_5 + TYPE_FAST

	RSDP_G_1          CONFIG_IDENT = VARIANT_RSDP_G + LEVEL_1
	RSDP_G_1_SMALL    CONFIG_IDENT = VARIANT_RSDP_G + LEVEL_1 + TYPE_SMALL
	RSDP_G_1_BALANCED CONFIG_IDENT = VARIANT_RSDP_G + LEVEL_1 + TYPE_BALANCED
	RSDP_G_1_FAST     CONFIG_IDENT = VARIANT_RSDP_G + LEVEL_1 + TYPE_FAST
	RSDP_G_3          CONFIG_IDENT = VARIANT_RSDP_G + LEVEL_3
	RSDP_G_3_SMALL    CONFIG_IDENT = VARIANT_RSDP_G + LEVEL_3 + TYPE_SMALL
	RSDP_G_3_BALANCED CONFIG_IDENT = VARIANT_RSDP_G + LEVEL_3 + TYPE_BALANCED
	RSDP_G_3_FAST     CONFIG_IDENT = VARIANT_RSDP_G + LEVEL_3 + TYPE_FAST
	RSDP_G_5          CONFIG_IDENT = VARIANT_RSDP_G + LEVEL_5
	RSDP_G_5_SMALL    CONFIG_IDENT = VARIANT_RSDP_G + LEVEL_5 + TYPE_SMALL
	RSDP_G_5_BALANCED CONFIG_IDENT = VARIANT_RSDP_G + LEVEL_5 + TYPE_BALANCED
	RSDP_G_5_FAST     CONFIG_IDENT = VARIANT_RSDP_G + LEVEL_5 + TYPE_FAST
)

type CROSS

type CROSS[T FP_ELEM, P FP_PREC] struct {
	ProtocolData ProtocolData
	TreeParams   TreeParams
}

func (*CROSS[T, P]) BuildTree

func (c *CROSS[T, P]) BuildTree(seed, salt []byte) [][]byte

func (*CROSS[T, P]) CSPRNG

func (c *CROSS[T, P]) CSPRNG(seed []byte, output_len int, dsc uint16) []byte

func (*CROSS[T, P]) CSPRNG_fp_mat

func (c *CROSS[T, P]) CSPRNG_fp_mat(seed []byte) []P

func (*CROSS[T, P]) CSPRNG_fp_mat_prime

func (c *CROSS[T, P]) CSPRNG_fp_mat_prime(state sha3.ShakeHash) []P

func (*CROSS[T, P]) CSPRNG_fp_vec

func (c *CROSS[T, P]) CSPRNG_fp_vec(seed []byte) []byte

func (*CROSS[T, P]) CSPRNG_fp_vec_chall_1

func (c *CROSS[T, P]) CSPRNG_fp_vec_chall_1(seed []byte) []T

func (*CROSS[T, P]) CSPRNG_fp_vec_prime

func (c *CROSS[T, P]) CSPRNG_fp_vec_prime(state sha3.ShakeHash) []T

func (*CROSS[T, P]) CSPRNG_fz_inf_w

func (c *CROSS[T, P]) CSPRNG_fz_inf_w(seed []byte) []byte

func (*CROSS[T, P]) CSPRNG_fz_inf_w_prime

func (c *CROSS[T, P]) CSPRNG_fz_inf_w_prime(state sha3.ShakeHash) ([]byte, sha3.ShakeHash)

func (*CROSS[T, P]) CSPRNG_fz_mat

func (c *CROSS[T, P]) CSPRNG_fz_mat(seed []byte) ([]byte, sha3.ShakeHash)

func (*CROSS[T, P]) CSPRNG_fz_vec

func (c *CROSS[T, P]) CSPRNG_fz_vec(seed []byte) []byte

func (*CROSS[T, P]) CSPRNG_fz_vec_prime

func (c *CROSS[T, P]) CSPRNG_fz_vec_prime(state sha3.ShakeHash) ([]byte, sha3.ShakeHash)

func (*CROSS[T, P]) CSPRNG_init

func (c *CROSS[T, P]) CSPRNG_init(seed []byte, dsc uint16) sha3.ShakeHash

func (*CROSS[T, P]) CSPRNG_prime

func (c *CROSS[T, P]) CSPRNG_prime(seed []byte, output_len int, dsc uint16) ([]byte, sha3.ShakeHash)

func (*CROSS[T, P]) CSPRNG_state

func (c *CROSS[T, P]) CSPRNG_state(state sha3.ShakeHash, output_len int) ([]byte, sha3.ShakeHash)

func (*CROSS[T, P]) ComputeMerkleTree

func (c *CROSS[T, P]) ComputeMerkleTree(commitments [][]byte) [][]byte

func (*CROSS[T, P]) Convert_restr_vec_to_fp

func (c *CROSS[T, P]) Convert_restr_vec_to_fp(in []byte) []T

func (*CROSS[T, P]) DenselyPackedFpSynSize

func (c *CROSS[T, P]) DenselyPackedFpSynSize() uint

func (*CROSS[T, P]) DenselyPackedFpVecSize

func (c *CROSS[T, P]) DenselyPackedFpVecSize() int

func (*CROSS[T, P]) DenselyPackedFzRSDPGVecSize

func (c *CROSS[T, P]) DenselyPackedFzRSDPGVecSize() int

func (*CROSS[T, P]) DenselyPackedFzVecSize

func (c *CROSS[T, P]) DenselyPackedFzVecSize() int

func (*CROSS[T, P]) Expand_digest_to_fixed_weight

func (c *CROSS[T, P]) Expand_digest_to_fixed_weight(digest []byte) []bool

func (*CROSS[T, P]) FPRED_DOUBLE

func (c *CROSS[T, P]) FPRED_DOUBLE(x P) P

func (*CROSS[T, P]) FPRED_OPPOSITE

func (c *CROSS[T, P]) FPRED_OPPOSITE(x P) P

func (*CROSS[T, P]) FPRED_SINGLE

func (c *CROSS[T, P]) FPRED_SINGLE(x P) P

func (*CROSS[T, P]) FP_DOUBLE_ZERO_NORM

func (c *CROSS[T, P]) FP_DOUBLE_ZERO_NORM(x P) P

func (*CROSS[T, P]) FP_ELEM_CMOV

func (c *CROSS[T, P]) FP_ELEM_CMOV(bit T, trueV, falseV uint16) uint32

func (*CROSS[T, P]) FZRED_DOUBLE

func (c *CROSS[T, P]) FZRED_DOUBLE(x T) T

func (*CROSS[T, P]) FZRED_OPPOSITE

func (c *CROSS[T, P]) FZRED_OPPOSITE(x T) T

func (*CROSS[T, P]) FZRED_SINGLE

func (c *CROSS[T, P]) FZRED_SINGLE(x T) T

func (*CROSS[T, P]) FZ_DOUBLE_ZERO_NORM

func (c *CROSS[T, P]) FZ_DOUBLE_ZERO_NORM(x int) int

func (*CROSS[T, P]) Fp_dz_norm

func (c *CROSS[T, P]) Fp_dz_norm(s []T) []T

func (*CROSS[T, P]) Fp_dz_norm_synd

func (c *CROSS[T, P]) Fp_dz_norm_synd(s []T) []T

func (*CROSS[T, P]) Fp_synd_minus_fp_vec_scaled

func (c *CROSS[T, P]) Fp_synd_minus_fp_vec_scaled(y_prime_H []T, chall_1 T, s []T) []T

func (*CROSS[T, P]) Fp_vec_by_fp_matrix

func (c *CROSS[T, P]) Fp_vec_by_fp_matrix(e, V_tr []P) []T
 Original version
	func (c *CROSS[T, P]) Fp_vec_by_fp_matrix(e, V_tr []T) []T {
			result := make([]T, c.ProtocolData.N-c.ProtocolData.K)
			copy(result, e[c.ProtocolData.K:])
			for i := 0; i < c.ProtocolData.K; i++ {
				e_i := FP_DOUBLE_PREC[T, P](e[i])
				for j := 0; j < c.ProtocolData.N-c.ProtocolData.K; j++ {
					result[j] = T(c.FPRED_DOUBLE(FP_DOUBLE_PREC[T, P](result[j]) + e_i*FP_DOUBLE_PREC[T, P](V_tr[i * (c.ProtocolData.N - c.ProtocolData.K)+j])))
				}
			}

			return result
		}

	Optimized version but fails tests
func (c *CROSS[T, P]) Fp_vec_by_fp_matrix(e, V_tr []T) []T {
	result := make([]T, c.ProtocolData.N-c.ProtocolData.K)
	copy(result, e[c.ProtocolData.K:])

	// Precompute values outside the loop that don't change
	nMinusK := c.ProtocolData.N - c.ProtocolData.K
	var wg sync.WaitGroup

	for i := 0; i < c.ProtocolData.K; i++ {
		// Using a closure to capture 'i' and pass it to the goroutine
		wg.Add(1)
		go func(i int) {
			defer wg.Done()
			e_i := FP_DOUBLE_PREC[T, P](e[i])

			// We calculate the base index once per iteration of i to avoid redundant multiplication
			baseIdx := i * nMinusK
			for j := 0; j < nMinusK; j++ {
				// Fetch value from V_tr and apply the computation
				VtrValue := FP_DOUBLE_PREC[T, P](V_tr[baseIdx+j])
				result[j] = T(c.FPRED_DOUBLE(FP_DOUBLE_PREC[T, P](result[j]) + e_i*VtrValue))
			}
		}(i)
	}
	wg.Wait()

	return result
}
func (c *CROSS[T, P]) Fp_vec_by_fp_matrix(e, V_tr []T) []T {
	result := make([]T, c.ProtocolData.N-c.ProtocolData.K)
	first_val := (c.ProtocolData.N - c.ProtocolData.K)
	copy(result, e[c.ProtocolData.K:])
	for i := 0; i < c.ProtocolData.K; i++ {
		idx := i * first_val
		e_i := FP_DOUBLE_PREC[T, P](e[i])
		for j := 0; j < first_val; j++ {
			result[j] = T(c.FPRED_DOUBLE(FP_DOUBLE_PREC[T, P](result[j]) + e_i*FP_DOUBLE_PREC[T, P](V_tr[idx+j])))
		}
	}

	return result
}

func (*CROSS[T, P]) Fp_vec_by_fp_vec_pointwise

func (c *CROSS[T, P]) Fp_vec_by_fp_vec_pointwise(a, b []T) []P

func (*CROSS[T, P]) Fp_vec_by_restr_vec_scaled

func (c *CROSS[T, P]) Fp_vec_by_restr_vec_scaled(e, u_prime []T, chall_1 T) []T

func (*CROSS[T, P]) Fz_dz_norm_m

func (c *CROSS[T, P]) Fz_dz_norm_m(v []byte) []byte

func (*CROSS[T, P]) Fz_dz_norm_n

func (c *CROSS[T, P]) Fz_dz_norm_n(v []byte) []byte

func (*CROSS[T, P]) Fz_inf_w_by_fz_matrix

func (c *CROSS[T, P]) Fz_inf_w_by_fz_matrix(fz_vec_e, W_mat []byte) []byte

func (*CROSS[T, P]) Fz_vec_sub_m

func (c *CROSS[T, P]) Fz_vec_sub_m(a, b []byte) []byte

func (*CROSS[T, P]) Fz_vec_sub_n

func (c *CROSS[T, P]) Fz_vec_sub_n(a []byte, b []byte) []byte

func (*CROSS[T, P]) GetLevelOfNode

func (c *CROSS[T, P]) GetLevelOfNode(node_index int) int

func (*CROSS[T, P]) Is_fz_vec_in_restr_group_m

func (c *CROSS[T, P]) Is_fz_vec_in_restr_group_m(in []byte) bool

func (*CROSS[T, P]) Is_fz_vec_in_restr_group_n

func (c *CROSS[T, P]) Is_fz_vec_in_restr_group_n(in []byte) bool

func (*CROSS[T, P]) Leaves

func (c *CROSS[T, P]) Leaves(tree [][]byte) [][]byte

func (*CROSS[T, P]) LeftChild

func (c *CROSS[T, P]) LeftChild(node_index, level int) int

func (*CROSS[T, P]) Pack_fp_syn

func (c *CROSS[T, P]) Pack_fp_syn(s []T) []byte

func (*CROSS[T, P]) Pack_fp_vec

func (c *CROSS[T, P]) Pack_fp_vec(in []T) []byte

func (*CROSS[T, P]) Pack_fz_rsdpg_vec

func (c *CROSS[T, P]) Pack_fz_rsdpg_vec(in []T) []byte

func (*CROSS[T, P]) Pack_fz_vec

func (c *CROSS[T, P]) Pack_fz_vec(input []T) []byte

func (*CROSS[T, P]) Parent

func (c *CROSS[T, P]) Parent(node_index, level int) int

func (*CROSS[T, P]) ParentIndex

func (c *CROSS[T, P]) ParentIndex(index int) []byte

func (*CROSS[T, P]) RESTR_TO_VAL

func (c *CROSS[T, P]) RESTR_TO_VAL(x T) P

Might be returning uint16 instead of 8 in RSDP

func (*CROSS[T, P]) RebuildLeaves

func (c *CROSS[T, P]) RebuildLeaves(path [][]byte, salt []byte, chall_2 []bool) ([][]byte, bool)

func (*CROSS[T, P]) RecomputeRoot

func (c *CROSS[T, P]) RecomputeRoot(cmt_0, proof [][]byte, chall_2 []bool) ([]byte, bool)

func (*CROSS[T, P]) Restr_vec_by_fp_matrix

func (c *CROSS[T, P]) Restr_vec_by_fp_matrix(e_bar []byte, V_tr []P) []T

func (*CROSS[T, P]) SeedLeaves

func (c *CROSS[T, P]) SeedLeaves(seed, salt []byte) [][]byte

func (*CROSS[T, P]) SeedPath

func (c *CROSS[T, P]) SeedPath(seed, salt []byte, chall_2 []bool) [][]byte

func (*CROSS[T, P]) Sibling

func (c *CROSS[T, P]) Sibling(node_index, level int) int

func (*CROSS[T, P]) TreeProof

func (c *CROSS[T, P]) TreeProof(commitments [][]byte, chall_2 []bool) [][]byte

func (*CROSS[T, P]) TreeRoot

func (c *CROSS[T, P]) TreeRoot(commitments [][]byte) []byte

func (*CROSS[T, P]) Unpack_fp_syn

func (c *CROSS[T, P]) Unpack_fp_syn(s []byte) ([]T, bool)

func (*CROSS[T, P]) Unpack_fp_vec

func (c *CROSS[T, P]) Unpack_fp_vec(vec []byte) ([]T, bool)

func (*CROSS[T, P]) Unpack_fz_rsdp_g_vec

func (c *CROSS[T, P]) Unpack_fz_rsdp_g_vec(vec []byte) ([]byte, bool)

func (*CROSS[T, P]) Unpack_fz_vec

func (c *CROSS[T, P]) Unpack_fz_vec(vec []byte) ([]byte, bool)

type FP_ELEM

type FP_ELEM interface {
	uint8 | uint16
}

type FP_PREC

type FP_PREC interface {
	uint16 | uint32
}

type Params

type Params struct {
	P int
	Z int
	N int
	K int
	M int
}

type ProtocolData

type ProtocolData struct {
	T int
	W int
	G int
	SchemeData
	ShakeParams
}

func GetProtocolConfig

func GetProtocolConfig(config CONFIG_IDENT) (ProtocolData, error)

type SchemeData

type SchemeData struct {
	Config CONFIG_IDENT
	Csprng string
	Lambda int
	Params
}

func (SchemeData) IsGVariant

func (s SchemeData) IsGVariant() bool

func (SchemeData) IsLevel

func (s SchemeData) IsLevel(types ...uint8) bool

func (SchemeData) IsType

func (s SchemeData) IsType(types ...uint8) bool

func (SchemeData) Level

func (s SchemeData) Level() uint

func (SchemeData) Type

func (s SchemeData) Type() uint

func (SchemeData) Variant

func (s SchemeData) Variant() uint

type ShakeParams

type ShakeParams struct {
	BITS_N_FP_CT_RNG           int
	BITS_CHALL_1_FPSTAR_CT_RNG int
	BITS_V_CT_RNG              int
	BITS_W_CT_RNG              int
	BITS_N_FZ_CT_RNG           int
	BITS_M_FZ_CT_RNG           int
	BITS_CWSTR_RNG             int
	TREE_NODES_TO_STORE        int
}

type TreeParams

type TreeParams struct {
	NPL         []int // Nodes per level
	LPL         []int // Leaves per level
	Off         []int // Offsets for parent/child computation
	LSI         []int // Leaves start indices
	NCL         []int // Number of consecutive leaves
	Total_nodes int   // Total number of nodes in tree
}

func GetTreeParams

func GetTreeParams(config CONFIG_IDENT) (TreeParams, error)

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL