126 lines
2.8 KiB
Go
126 lines
2.8 KiB
Go
// Code generated from kyber512/internal/vec.go by gen.go
|
|
|
|
package internal
|
|
|
|
import (
|
|
"github.com/cloudflare/circl/pke/kyber/internal/common"
|
|
)
|
|
|
|
// A vector of K polynomials
|
|
type Vec [K]common.Poly
|
|
|
|
// Samples v[i] from a centered binomial distribution with given η,
|
|
// seed and nonce+i.
|
|
//
|
|
// Essentially CBD_η(PRF(seed, nonce+i)) from the specification.
|
|
func (v *Vec) DeriveNoise(seed []byte, nonce uint8, eta int) {
|
|
for i := 0; i < K; i++ {
|
|
v[i].DeriveNoise(seed, nonce+uint8(i), eta)
|
|
}
|
|
}
|
|
|
|
// Sets p to the inner product of a and b using "pointwise" multiplication.
|
|
//
|
|
// See MulHat() and NTT() for a description of the multiplication.
|
|
// Assumes a and b are in Montgomery form. p will be in Montgomery form,
|
|
// and its coefficients will be bounded in absolute value by 2kq.
|
|
// If a and b are not in Montgomery form, then the action is the same
|
|
// as "pointwise" multiplication followed by multiplying by R⁻¹, the inverse
|
|
// of the Montgomery factor.
|
|
func PolyDotHat(p *common.Poly, a, b *Vec) {
|
|
var t common.Poly
|
|
*p = common.Poly{} // set p to zero
|
|
for i := 0; i < K; i++ {
|
|
t.MulHat(&a[i], &b[i])
|
|
p.Add(&t, p)
|
|
}
|
|
}
|
|
|
|
// Almost normalizes coefficients in-place.
|
|
//
|
|
// Ensures each coefficient is in {0, …, q}.
|
|
func (v *Vec) BarrettReduce() {
|
|
for i := 0; i < K; i++ {
|
|
v[i].BarrettReduce()
|
|
}
|
|
}
|
|
|
|
// Normalizes coefficients in-place.
|
|
//
|
|
// Ensures each coefficient is in {0, …, q-1}.
|
|
func (v *Vec) Normalize() {
|
|
for i := 0; i < K; i++ {
|
|
v[i].Normalize()
|
|
}
|
|
}
|
|
|
|
// Applies in-place inverse NTT(). See Poly.InvNTT() for assumptions.
|
|
func (v *Vec) InvNTT() {
|
|
for i := 0; i < K; i++ {
|
|
v[i].InvNTT()
|
|
}
|
|
}
|
|
|
|
// Applies in-place forward NTT(). See Poly.NTT() for assumptions.
|
|
func (v *Vec) NTT() {
|
|
for i := 0; i < K; i++ {
|
|
v[i].NTT()
|
|
}
|
|
}
|
|
|
|
// Sets v to a + b.
|
|
func (v *Vec) Add(a, b *Vec) {
|
|
for i := 0; i < K; i++ {
|
|
v[i].Add(&a[i], &b[i])
|
|
}
|
|
}
|
|
|
|
// Packs v into buf, which must be of length K*PolySize.
|
|
func (v *Vec) Pack(buf []byte) {
|
|
for i := 0; i < K; i++ {
|
|
v[i].Pack(buf[common.PolySize*i:])
|
|
}
|
|
}
|
|
|
|
// Unpacks v from buf which must be of length K*PolySize.
|
|
func (v *Vec) Unpack(buf []byte) {
|
|
for i := 0; i < K; i++ {
|
|
v[i].Unpack(buf[common.PolySize*i:])
|
|
}
|
|
}
|
|
|
|
// Writes Compress_q(v, d) to m.
|
|
//
|
|
// Assumes v is normalized and d is in {3, 4, 5, 10, 11}.
|
|
func (v *Vec) CompressTo(m []byte, d int) {
|
|
size := compressedPolySize(d)
|
|
for i := 0; i < K; i++ {
|
|
v[i].CompressTo(m[size*i:], d)
|
|
}
|
|
}
|
|
|
|
// Set v to Decompress_q(m, 1).
|
|
//
|
|
// Assumes d is in {3, 4, 5, 10, 11}. v will be normalized.
|
|
func (v *Vec) Decompress(m []byte, d int) {
|
|
size := compressedPolySize(d)
|
|
for i := 0; i < K; i++ {
|
|
v[i].Decompress(m[size*i:], d)
|
|
}
|
|
}
|
|
|
|
// ⌈(256 d)/8⌉
|
|
func compressedPolySize(d int) int {
|
|
switch d {
|
|
case 4:
|
|
return 128
|
|
case 5:
|
|
return 160
|
|
case 10:
|
|
return 320
|
|
case 11:
|
|
return 352
|
|
}
|
|
panic("unsupported d")
|
|
}
|