github.com/cloudflare/circl@v1.5.0/pke/kyber/kyber768/internal/vec.go (about)

     1  // Code generated from kyber512/internal/vec.go by gen.go
     2  
     3  package internal
     4  
     5  import (
     6  	"github.com/cloudflare/circl/pke/kyber/internal/common"
     7  )
     8  
     9  // A vector of K polynomials
    10  type Vec [K]common.Poly
    11  
    12  // Samples v[i] from a centered binomial distribution with given η,
    13  // seed and nonce+i.
    14  //
    15  // Essentially CBD_η(PRF(seed, nonce+i)) from the specification.
    16  func (v *Vec) DeriveNoise(seed []byte, nonce uint8, eta int) {
    17  	for i := 0; i < K; i++ {
    18  		v[i].DeriveNoise(seed, nonce+uint8(i), eta)
    19  	}
    20  }
    21  
    22  // Sets p to the inner product of a and b using "pointwise" multiplication.
    23  //
    24  // See MulHat() and NTT() for a description of the multiplication.
    25  // Assumes a and b are in Montgomery form.  p will be in Montgomery form,
    26  // and its coefficients will be bounded in absolute value by 2kq.
    27  // If a and b are not in Montgomery form, then the action is the same
    28  // as "pointwise" multiplication followed by multiplying by R⁻¹, the inverse
    29  // of the Montgomery factor.
    30  func PolyDotHat(p *common.Poly, a, b *Vec) {
    31  	var t common.Poly
    32  	*p = common.Poly{} // set p to zero
    33  	for i := 0; i < K; i++ {
    34  		t.MulHat(&a[i], &b[i])
    35  		p.Add(&t, p)
    36  	}
    37  }
    38  
    39  // Almost normalizes coefficients in-place.
    40  //
    41  // Ensures each coefficient is in {0, …, q}.
    42  func (v *Vec) BarrettReduce() {
    43  	for i := 0; i < K; i++ {
    44  		v[i].BarrettReduce()
    45  	}
    46  }
    47  
    48  // Normalizes coefficients in-place.
    49  //
    50  // Ensures each coefficient is in {0, …, q-1}.
    51  func (v *Vec) Normalize() {
    52  	for i := 0; i < K; i++ {
    53  		v[i].Normalize()
    54  	}
    55  }
    56  
    57  // Applies in-place inverse NTT().  See Poly.InvNTT() for assumptions.
    58  func (v *Vec) InvNTT() {
    59  	for i := 0; i < K; i++ {
    60  		v[i].InvNTT()
    61  	}
    62  }
    63  
    64  // Applies in-place forward NTT().  See Poly.NTT() for assumptions.
    65  func (v *Vec) NTT() {
    66  	for i := 0; i < K; i++ {
    67  		v[i].NTT()
    68  	}
    69  }
    70  
    71  // Sets v to a + b.
    72  func (v *Vec) Add(a, b *Vec) {
    73  	for i := 0; i < K; i++ {
    74  		v[i].Add(&a[i], &b[i])
    75  	}
    76  }
    77  
    78  // Packs v into buf, which must be of length K*PolySize.
    79  func (v *Vec) Pack(buf []byte) {
    80  	for i := 0; i < K; i++ {
    81  		v[i].Pack(buf[common.PolySize*i:])
    82  	}
    83  }
    84  
    85  // Unpacks v from buf which must be of length K*PolySize.
    86  func (v *Vec) Unpack(buf []byte) {
    87  	for i := 0; i < K; i++ {
    88  		v[i].Unpack(buf[common.PolySize*i:])
    89  	}
    90  }
    91  
    92  // Writes Compress_q(v, d) to m.
    93  //
    94  // Assumes v is normalized and d is in {3, 4, 5, 10, 11}.
    95  func (v *Vec) CompressTo(m []byte, d int) {
    96  	size := compressedPolySize(d)
    97  	for i := 0; i < K; i++ {
    98  		v[i].CompressTo(m[size*i:], d)
    99  	}
   100  }
   101  
   102  // Set v to Decompress_q(m, 1).
   103  //
   104  // Assumes d is in {3, 4, 5, 10, 11}.  v will be normalized.
   105  func (v *Vec) Decompress(m []byte, d int) {
   106  	size := compressedPolySize(d)
   107  	for i := 0; i < K; i++ {
   108  		v[i].Decompress(m[size*i:], d)
   109  	}
   110  }
   111  
   112  // ⌈(256 d)/8⌉
   113  func compressedPolySize(d int) int {
   114  	switch d {
   115  	case 4:
   116  		return 128
   117  	case 5:
   118  		return 160
   119  	case 10:
   120  		return 320
   121  	case 11:
   122  		return 352
   123  	}
   124  	panic("unsupported d")
   125  }