Files
zeekay eaf864890e feat: release v7.0.0 with GPU acceleration and module update
- Update module path to github.com/luxfi/lattice/v7
- Add GPU acceleration with Metal (macOS) and CUDA backends
- Enhance threshold FHE operations
- Revert to vanilla Apache 2.0 license (remove tfhe)
- Update Go version to 1.25.5
- Merge upstream lattigo improvements
2025-12-30 15:37:37 -08:00

69 lines
1.7 KiB
Go

package bootstrapping
import (
"github.com/luxfi/lattice/v7/core/rlwe"
"github.com/luxfi/lattice/v7/schemes/ckks"
"github.com/luxfi/lattice/v7/utils/bignum"
)
// SecretKeyBootstrapper is an implementation of the [rlwe.Bootstrapping] interface that
// uses the secret-key to decrypt and re-encrypt the bootstrapped ciphertext.
type SecretKeyBootstrapper struct {
ckks.Parameters
*ckks.Encoder
*rlwe.Decryptor
*rlwe.Encryptor
sk *rlwe.SecretKey
Counter int // records the number of bootstrapping
MinLevel int
}
func NewSecretKeyBootstrapper(params ckks.Parameters, sk *rlwe.SecretKey) *SecretKeyBootstrapper {
return &SecretKeyBootstrapper{
Parameters: params,
Encoder: ckks.NewEncoder(params),
Decryptor: rlwe.NewDecryptor(params, sk),
Encryptor: rlwe.NewEncryptor(params, sk),
sk: sk,
}
}
func (d *SecretKeyBootstrapper) Bootstrap(ct *rlwe.Ciphertext) (*rlwe.Ciphertext, error) {
values := make([]*bignum.Complex, 1<<ct.LogDimensions.Cols)
if err := d.Decode(d.DecryptNew(ct), values); err != nil {
return nil, err
}
pt := ckks.NewPlaintext(d.Parameters, d.MaxLevel())
pt.MetaData = ct.MetaData
pt.Scale = d.Parameters.DefaultScale()
if err := d.Encode(values, pt); err != nil {
return nil, err
}
ct.Resize(1, d.MaxLevel())
d.Counter++
return ct, d.Encrypt(pt, ct)
}
func (d SecretKeyBootstrapper) BootstrapMany(cts []rlwe.Ciphertext) ([]rlwe.Ciphertext, error) {
for i := range cts {
ct, err := d.Bootstrap(&cts[i])
if err != nil {
return nil, err
}
cts[i] = *ct
}
return cts, nil
}
func (d SecretKeyBootstrapper) Depth() int {
return 0
}
func (d SecretKeyBootstrapper) MinimumInputLevel() int {
return d.MinLevel
}
func (d SecretKeyBootstrapper) OutputLevel() int {
return d.MaxLevel()
}