ringqp

package
v0.1.5 Latest Latest
Warning

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

Go to latest
Published: Mar 8, 2023 License: Apache-2.0 Imports: 2 Imported by: 0

Documentation

Overview

Package ringqp is implements a wrapper for both the ringQ and ringP.

Index

Constants

This section is empty.

Variables

This section is empty.

Functions

This section is empty.

Types

type Poly

type Poly struct {
	Q, P *ring.Poly
}

Poly represents a polynomial in the ring of polynomial modulo Q*P. This type is simply the union type between two ring.Poly, each one containing the modulus Q and P coefficients of that polynomial. The modulus Q represent the ciphertext modulus and the modulus P the special primes for the RNS decomposition during homomorphic operations involving keys.

func (*Poly) Copy

func (p *Poly) Copy(other Poly)

Copy copies the coefficients of other on the target polynomial. This method simply calls the Copy method for each of its sub-polynomials.

func (*Poly) CopyNew

func (p *Poly) CopyNew() Poly

CopyNew creates an exact copy of the target polynomial.

func (*Poly) Decode64

func (p *Poly) Decode64(data []byte) (pt int, err error)

Decode64 decodes the input bytes on the target Poly. Writes on pre-allocated coefficients. Assumes that each coefficient is encoded on 8 bytes.

func (*Poly) Encode64

func (p *Poly) Encode64(data []byte) (pt int, err error)

Encode64 writes a Poly on the input data. Encodes each coefficient on 8 bytes.

func (*Poly) Equals

func (p *Poly) Equals(other Poly) (v bool)

Equals returns true if the receiver Poly is equal to the provided other Poly. This method checks for equality of its two sub-polynomials.

func (*Poly) LevelP

func (p *Poly) LevelP() int

LevelP returns the level of the polynomial modulo P. Returns -1 if the modulus P is absent.

func (*Poly) LevelQ

func (p *Poly) LevelQ() int

LevelQ returns the level of the polynomial modulo Q. Returns -1 if the modulus Q is absent.

func (*Poly) MarshalBinary

func (p *Poly) MarshalBinary() ([]byte, error)

func (*Poly) MarshalBinarySize64

func (p *Poly) MarshalBinarySize64() (dataLen int)

MarshalBinarySize64 returns the length in byte of the target Poly. Assumes that each coefficient uses 8 bytes.

func (*Poly) UnmarshalBinary

func (p *Poly) UnmarshalBinary(b []byte) error

type Ring

type Ring struct {
	RingQ, RingP *ring.Ring
}

Ring is a structure that implements the operation in the ring R_QP. This type is simply a union type between the two Ring types representing R_Q and R_P.

func (*Ring) AddLvl

func (r *Ring) AddLvl(levelQ, levelP int, p1, p2, p3 Poly)

AddLvl adds p1 to p2 coefficient-wise and writes the result on p3. The operation is performed at levelQ for the ringQ and levelP for the ringP.

func (*Ring) AddNoModLvl

func (r *Ring) AddNoModLvl(levelQ, levelP int, p1, p2, p3 Poly)

AddNoModLvl adds p1 to p2 coefficient-wise and writes the result on p3 without modular reduction. The operation is performed at levelQ for the ringQ and levelP for the ringP.

func (*Ring) CopyLvl

func (r *Ring) CopyLvl(levelQ, levelP int, p1, p2 Poly)

CopyLvl copies the values of p1 on p2. The operation is performed at levelQ for the ringQ and levelP for the ringP.

func (*Ring) EvalPolyScalar

func (r *Ring) EvalPolyScalar(pol []Poly, pt uint64, p3 Poly)

EvalPolyScalar evaluate the polynomial pol at pt and writes the result in p3

func (*Ring) ExtendBasisSmallNormAndCenter

func (r *Ring) ExtendBasisSmallNormAndCenter(polyInQ *ring.Poly, levelP int, polyOutQ, polyOutP *ring.Poly)

ExtendBasisSmallNormAndCenter extends a small-norm polynomial polQ in R_Q to a polynomial polQP in R_QP.

func (*Ring) InvMFormLvl

func (r *Ring) InvMFormLvl(levelQ, levelP int, p1, p2 Poly)

InvMFormLvl switches back p1 from the Montgomery domain to the conventional domain and writes the result on p2. The operation is performed at levelQ for the ringQ and levelP for the ringP.

func (*Ring) InvNTTLvl

func (r *Ring) InvNTTLvl(levelQ, levelP int, p1, p2 Poly)

InvNTTLvl computes the inverse-NTT of p1 and returns the result on p2. The operation is performed at levelQ for the ringQ and levelP for the ringP.

func (*Ring) Inverse

func (r *Ring) Inverse(scalar ring.RNSScalar)

Inverse computes the modular inverse of a scalar a expressed in a CRT decomposition. The inversion is done in-place and assumes that a is in Montgomery form.

func (*Ring) MFormLvl

func (r *Ring) MFormLvl(levelQ, levelP int, p1, p2 Poly)

MFormLvl switches p1 to the Montgomery domain and writes the result on p2. The operation is performed at levelQ for the ringQ and levelP for the ringP.

func (*Ring) MulCoeffsMontgomeryAndAddLvl

func (r *Ring) MulCoeffsMontgomeryAndAddLvl(levelQ, levelP int, p1, p2, p3 Poly)

MulCoeffsMontgomeryAndAddLvl multiplies p1 by p2 coefficient-wise with a Montgomery modular reduction and adds the result to p3. The operation is performed at levelQ for the ringQ and levelP for the ringP.

func (*Ring) MulCoeffsMontgomeryAndSubLvl

func (r *Ring) MulCoeffsMontgomeryAndSubLvl(levelQ, levelP int, p1, p2, p3 Poly)

MulCoeffsMontgomeryAndSubLvl multiplies p1 by p2 coefficient-wise with a Montgomery modular reduction and subtracts the result from p3. The operation is performed at levelQ for the ringQ and levelP for the ringP.

func (*Ring) MulCoeffsMontgomeryConstantAndAddNoModLvl

func (r *Ring) MulCoeffsMontgomeryConstantAndAddNoModLvl(levelQ, levelP int, p1, p2, p3 Poly)

MulCoeffsMontgomeryConstantAndAddNoModLvl multiplies p1 by p2 coefficient-wise with a constant-time Montgomery modular reduction and adds the result on p3. Result is within [0, 2q-1]

func (*Ring) MulCoeffsMontgomeryConstantAndSubNoModLvl

func (r *Ring) MulCoeffsMontgomeryConstantAndSubNoModLvl(levelQ, levelP int, p1, p2, p3 Poly)

MulCoeffsMontgomeryConstantAndSubNoModLvl multiplies p1 by p2 coefficient-wise with a Montgomery modular reduction and subtracts the result from p3. The operation is performed at levelQ for the ringQ and levelP for the ringP.

func (*Ring) MulCoeffsMontgomeryConstantLvl

func (r *Ring) MulCoeffsMontgomeryConstantLvl(levelQ, levelP int, p1, p2, p3 Poly)

MulCoeffsMontgomeryConstantLvl multiplies p1 by p2 coefficient-wise with a constant-time Montgomery modular reduction. The operation is performed at levelQ for the ringQ and levelP for the ringP. Result is within [0, 2q-1].

func (*Ring) MulCoeffsMontgomeryLvl

func (r *Ring) MulCoeffsMontgomeryLvl(levelQ, levelP int, p1, p2, p3 Poly)

MulCoeffsMontgomeryLvl multiplies p1 by p2 coefficient-wise with a Montgomery modular reduction. The operation is performed at levelQ for the ringQ and levelP for the ringP.

func (*Ring) MulRNSScalar

func (r *Ring) MulRNSScalar(s1, s2, sout ring.RNSScalar)

MulRNSScalar multiplies s1 and s2 and stores the result in sout.

func (*Ring) MulRNSScalarMontgomery

func (r *Ring) MulRNSScalarMontgomery(p Poly, scalar []uint64, pOut Poly)

MulRNSScalarMontgomery multiplies p with a scalar value expressed in the CRT decomposition. It assumes the scalar decomposition to be in Montgomery form.

func (*Ring) MulScalarLvl

func (r *Ring) MulScalarLvl(levelQ, levelP int, p1 Poly, scalar uint64, p2 Poly)

MulScalarLvl multiplies p1 by scalar and returns the result in p2.

func (*Ring) NTTLazyLvl

func (r *Ring) NTTLazyLvl(levelQ, levelP int, p1, p2 Poly)

NTTLazyLvl computes the NTT of p1 and returns the result on p2. The operation is performed at levelQ for the ringQ and levelP for the ringP. Output values are in the range [0, 2q-1].

func (*Ring) NTTLvl

func (r *Ring) NTTLvl(levelQ, levelP int, p1, p2 Poly)

NTTLvl computes the NTT of p1 and returns the result on p2. The operation is performed at levelQ for the ringQ and levelP for the ringP.

func (*Ring) NegLvl

func (r *Ring) NegLvl(levelQ, levelP int, p1, p2 Poly)

NegLvl negates p1 coefficient-wise and writes the result on p2. The operation is performed at levelQ for the ringQ and levelP for the ringP.

func (*Ring) NewPoly

func (r *Ring) NewPoly() Poly

NewPoly creates a new polynomial with all coefficients set to 0.

func (*Ring) NewPolyLvl

func (r *Ring) NewPolyLvl(levelQ, levelP int) Poly

NewPolyLvl creates a new polynomial with all coefficients set to 0.

func (*Ring) NewRNSScalar

func (r *Ring) NewRNSScalar() ring.RNSScalar

NewRNSScalar creates a new Scalar value (i.e., a degree-0 polynomial) in the RingQP.

func (*Ring) NewRNSScalarFromUInt64

func (r *Ring) NewRNSScalarFromUInt64(v uint64) ring.RNSScalar

NewRNSScalarFromUInt64 creates a new Scalar in the RingQP initialized with value v.

func (*Ring) PermuteNTTWithIndexAndAddNoModLvl

func (r *Ring) PermuteNTTWithIndexAndAddNoModLvl(levelQ, levelP int, p1 Poly, index []uint64, p2 Poly)

PermuteNTTWithIndexAndAddNoModLvl applies the automorphism X^{5^j} on p1 and adds the result on p2. Index of automorphism must be provided. Method is not in place. The operation is performed at levelQ for the ringQ and levelP for the ringP.

func (*Ring) PermuteNTTWithIndexLvl

func (r *Ring) PermuteNTTWithIndexLvl(levelQ, levelP int, p1 Poly, index []uint64, p2 Poly)

PermuteNTTWithIndexLvl applies the automorphism X^{5^j} on p1 and writes the result on p2. Index of automorphism must be provided. Method is not in place. The operation is performed at levelQ for the ringQ and levelP for the ringP.

func (*Ring) ReduceLvl

func (r *Ring) ReduceLvl(levelQ, levelP int, p1, p2 Poly)

ReduceLvl applies the modular reduction on the coefficients of p1 and returns the result on p2. The operation is performed at levelQ for the ringQ and levelP for the ringP.

func (*Ring) SubLvl

func (r *Ring) SubLvl(levelQ, levelP int, p1, p2, p3 Poly)

SubLvl subtracts p2 to p1 coefficient-wise and writes the result on p3. The operation is performed at levelQ for the ringQ and levelP for the ringP.

func (*Ring) SubRNSScalar

func (r *Ring) SubRNSScalar(s1, s2, sout ring.RNSScalar)

SubRNSScalar subtracts s2 to s1 and stores the result in sout.

type UniformSampler

type UniformSampler struct {
	// contains filtered or unexported fields
}

UniformSampler is a type for sampling polynomials in Ring.

func NewUniformSampler

func NewUniformSampler(prng utils.PRNG, r Ring) (s UniformSampler)

NewUniformSampler instantiates a new UniformSampler from a given PRNG.

func (UniformSampler) Read

func (s UniformSampler) Read(p Poly)

Read samples a new polynomial in Ring and stores it into p.

func (UniformSampler) ReadLvl

func (s UniformSampler) ReadLvl(levelQ, levelP int, p Poly)

ReadLvl samples a new polynomial in Ring and stores it into p.

func (UniformSampler) WithPRNG

func (s UniformSampler) WithPRNG(prng utils.PRNG) UniformSampler

Jump to

Keyboard shortcuts

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