Documentation
¶
Index ¶
- Constants
- Variables
- func BitsToRepresent(n uint) int
- func Configs() iter.Seq2[int, CONFIG_IDENT]
- func Contains(slice []int, elem int) bool
- func FP_DOUBLE_PREC[T FP_ELEM, P FP_PREC](input T) P
- func Flatten(matrix [][]byte) []byte
- func MatrixMultiplicationByte(matrix [][]byte, vector []byte) ([]byte, error)
- func MultiplyVectorMatrix(vector []byte, matrix [][]byte) []byte
- func RoundUp(amount, roundAmt uint) uint
- func ScalarVecMulByte(vec []byte, scalar byte) []byte
- func Sum(slice []int) int
- func TransposeByteMatrix(matrix [][]byte) [][]byte
- func Unflatten(matrix []byte, t int) [][]byte
- type CONFIG_IDENT
- type CROSS
- func (c *CROSS[T, P]) BuildTree(seed, salt []byte) [][]byte
- func (c *CROSS[T, P]) CSPRNG(seed []byte, output_len int, dsc uint16) []byte
- func (c *CROSS[T, P]) CSPRNG_fp_mat(seed []byte) []P
- func (c *CROSS[T, P]) CSPRNG_fp_mat_prime(state sha3.ShakeHash) []P
- func (c *CROSS[T, P]) CSPRNG_fp_vec(seed []byte) []byte
- func (c *CROSS[T, P]) CSPRNG_fp_vec_chall_1(seed []byte) []T
- func (c *CROSS[T, P]) CSPRNG_fp_vec_prime(state sha3.ShakeHash) []T
- func (c *CROSS[T, P]) CSPRNG_fz_inf_w(seed []byte) []byte
- func (c *CROSS[T, P]) CSPRNG_fz_inf_w_prime(state sha3.ShakeHash) ([]byte, sha3.ShakeHash)
- func (c *CROSS[T, P]) CSPRNG_fz_mat(seed []byte) ([]byte, sha3.ShakeHash)
- func (c *CROSS[T, P]) CSPRNG_fz_vec(seed []byte) []byte
- func (c *CROSS[T, P]) CSPRNG_fz_vec_prime(state sha3.ShakeHash) ([]byte, sha3.ShakeHash)
- func (c *CROSS[T, P]) CSPRNG_init(seed []byte, dsc uint16) sha3.ShakeHash
- func (c *CROSS[T, P]) CSPRNG_prime(seed []byte, output_len int, dsc uint16) ([]byte, sha3.ShakeHash)
- func (c *CROSS[T, P]) CSPRNG_state(state sha3.ShakeHash, output_len int) ([]byte, sha3.ShakeHash)
- func (c *CROSS[T, P]) ComputeMerkleTree(commitments [][]byte) [][]byte
- func (c *CROSS[T, P]) Convert_restr_vec_to_fp(in []byte) []T
- func (c *CROSS[T, P]) DenselyPackedFpSynSize() uint
- func (c *CROSS[T, P]) DenselyPackedFpVecSize() int
- func (c *CROSS[T, P]) DenselyPackedFzRSDPGVecSize() int
- func (c *CROSS[T, P]) DenselyPackedFzVecSize() int
- func (c *CROSS[T, P]) Expand_digest_to_fixed_weight(digest []byte) []bool
- func (c *CROSS[T, P]) FPRED_DOUBLE(x P) P
- func (c *CROSS[T, P]) FPRED_OPPOSITE(x P) P
- func (c *CROSS[T, P]) FPRED_SINGLE(x P) P
- func (c *CROSS[T, P]) FP_DOUBLE_ZERO_NORM(x P) P
- func (c *CROSS[T, P]) FP_ELEM_CMOV(bit T, trueV, falseV uint16) uint32
- func (c *CROSS[T, P]) FZRED_DOUBLE(x T) T
- func (c *CROSS[T, P]) FZRED_OPPOSITE(x T) T
- func (c *CROSS[T, P]) FZRED_SINGLE(x T) T
- func (c *CROSS[T, P]) FZ_DOUBLE_ZERO_NORM(x int) int
- func (c *CROSS[T, P]) Fp_dz_norm(s []T) []T
- func (c *CROSS[T, P]) Fp_dz_norm_synd(s []T) []T
- func (c *CROSS[T, P]) Fp_synd_minus_fp_vec_scaled(y_prime_H []T, chall_1 T, s []T) []T
- func (c *CROSS[T, P]) Fp_vec_by_fp_matrix(e, V_tr []P) []T
- func (c *CROSS[T, P]) Fp_vec_by_fp_vec_pointwise(a, b []T) []P
- func (c *CROSS[T, P]) Fp_vec_by_restr_vec_scaled(e, u_prime []T, chall_1 T) []T
- func (c *CROSS[T, P]) Fz_dz_norm_m(v []byte) []byte
- func (c *CROSS[T, P]) Fz_dz_norm_n(v []byte) []byte
- func (c *CROSS[T, P]) Fz_inf_w_by_fz_matrix(fz_vec_e, W_mat []byte) []byte
- func (c *CROSS[T, P]) Fz_vec_sub_m(a, b []byte) []byte
- func (c *CROSS[T, P]) Fz_vec_sub_n(a []byte, b []byte) []byte
- func (c *CROSS[T, P]) GetLevelOfNode(node_index int) int
- func (c *CROSS[T, P]) Is_fz_vec_in_restr_group_m(in []byte) bool
- func (c *CROSS[T, P]) Is_fz_vec_in_restr_group_n(in []byte) bool
- func (c *CROSS[T, P]) Leaves(tree [][]byte) [][]byte
- func (c *CROSS[T, P]) LeftChild(node_index, level int) int
- func (c *CROSS[T, P]) Pack_fp_syn(s []T) []byte
- func (c *CROSS[T, P]) Pack_fp_vec(in []T) []byte
- func (c *CROSS[T, P]) Pack_fz_rsdpg_vec(in []T) []byte
- func (c *CROSS[T, P]) Pack_fz_vec(input []T) []byte
- func (c *CROSS[T, P]) Parent(node_index, level int) int
- func (c *CROSS[T, P]) ParentIndex(index int) []byte
- func (c *CROSS[T, P]) RESTR_TO_VAL(x T) P
- func (c *CROSS[T, P]) RebuildLeaves(path [][]byte, salt []byte, chall_2 []bool) ([][]byte, bool)
- func (c *CROSS[T, P]) RecomputeRoot(cmt_0, proof [][]byte, chall_2 []bool) ([]byte, bool)
- func (c *CROSS[T, P]) Restr_vec_by_fp_matrix(e_bar []byte, V_tr []P) []T
- func (c *CROSS[T, P]) SeedLeaves(seed, salt []byte) [][]byte
- func (c *CROSS[T, P]) SeedPath(seed, salt []byte, chall_2 []bool) [][]byte
- func (c *CROSS[T, P]) Sibling(node_index, level int) int
- func (c *CROSS[T, P]) TreeProof(commitments [][]byte, chall_2 []bool) [][]byte
- func (c *CROSS[T, P]) TreeRoot(commitments [][]byte) []byte
- func (c *CROSS[T, P]) Unpack_fp_syn(s []byte) ([]T, bool)
- func (c *CROSS[T, P]) Unpack_fp_vec(vec []byte) ([]T, bool)
- func (c *CROSS[T, P]) Unpack_fz_rsdp_g_vec(vec []byte) ([]byte, bool)
- func (c *CROSS[T, P]) Unpack_fz_vec(vec []byte) ([]byte, bool)
- type FP_ELEM
- type FP_PREC
- type Params
- type ProtocolData
- type SchemeData
- type ShakeParams
- type TreeParams
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 FP_DOUBLE_PREC ¶
func MultiplyVectorMatrix ¶
func ScalarVecMulByte ¶
func TransposeByteMatrix ¶
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]) CSPRNG_fp_mat ¶
func (*CROSS[T, P]) CSPRNG_fp_mat_prime ¶
func (*CROSS[T, P]) CSPRNG_fp_vec ¶
func (*CROSS[T, P]) CSPRNG_fp_vec_chall_1 ¶
func (*CROSS[T, P]) CSPRNG_fp_vec_prime ¶
func (*CROSS[T, P]) CSPRNG_fz_inf_w ¶
func (*CROSS[T, P]) CSPRNG_fz_inf_w_prime ¶
func (*CROSS[T, P]) CSPRNG_fz_mat ¶
func (*CROSS[T, P]) CSPRNG_fz_vec ¶
func (*CROSS[T, P]) CSPRNG_fz_vec_prime ¶
func (*CROSS[T, P]) CSPRNG_init ¶
func (*CROSS[T, P]) CSPRNG_prime ¶
func (*CROSS[T, P]) CSPRNG_state ¶
func (*CROSS[T, P]) ComputeMerkleTree ¶
func (*CROSS[T, P]) Convert_restr_vec_to_fp ¶
func (*CROSS[T, P]) DenselyPackedFpSynSize ¶
func (*CROSS[T, P]) DenselyPackedFpVecSize ¶
func (*CROSS[T, P]) DenselyPackedFzRSDPGVecSize ¶
func (*CROSS[T, P]) DenselyPackedFzVecSize ¶
func (*CROSS[T, P]) Expand_digest_to_fixed_weight ¶
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 (*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 (*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 (*CROSS[T, P]) Fz_dz_norm_n ¶
func (*CROSS[T, P]) Fz_inf_w_by_fz_matrix ¶
func (*CROSS[T, P]) Fz_vec_sub_m ¶
func (*CROSS[T, P]) GetLevelOfNode ¶
func (*CROSS[T, P]) Is_fz_vec_in_restr_group_m ¶
func (*CROSS[T, P]) Is_fz_vec_in_restr_group_n ¶
func (*CROSS[T, P]) Pack_fp_syn ¶
func (*CROSS[T, P]) Pack_fp_vec ¶
func (*CROSS[T, P]) Pack_fz_rsdpg_vec ¶
func (*CROSS[T, P]) Pack_fz_vec ¶
func (*CROSS[T, P]) ParentIndex ¶
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 (*CROSS[T, P]) RecomputeRoot ¶
func (*CROSS[T, P]) Restr_vec_by_fp_matrix ¶
func (*CROSS[T, P]) SeedLeaves ¶
func (*CROSS[T, P]) Unpack_fp_syn ¶
func (*CROSS[T, P]) Unpack_fp_vec ¶
func (*CROSS[T, P]) Unpack_fz_rsdp_g_vec ¶
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 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)
Click to show internal directories.
Click to hide internal directories.