github.com/cloudflare/circl@v1.5.0/pke/kyber/templates/pkg.templ.go (about) 1 // +build ignore 2 // The previous line (and this one up to the warning below) is removed by the 3 // template generator. 4 5 // Code generated from pkg.templ.go. DO NOT EDIT. 6 7 // {{.Pkg}} implements the IND-CPA-secure Public Key Encryption 8 // scheme {{.Name}}.CPAPKE as submitted to round 3 of the NIST PQC competition 9 // and described in 10 // 11 // https://pq-crystals.org/kyber/data/kyber-specification-round3.pdf 12 package {{.Pkg}} 13 14 import ( 15 cryptoRand "crypto/rand" 16 "io" 17 18 "github.com/cloudflare/circl/kem" 19 "github.com/cloudflare/circl/pke/kyber/{{.Pkg}}/internal" 20 ) 21 22 const ( 23 // Size of seed for NewKeyFromSeed 24 KeySeedSize = internal.SeedSize 25 26 // Size of seed for EncryptTo 27 EncryptionSeedSize = internal.SeedSize 28 29 // Size of a packed PublicKey 30 PublicKeySize = internal.PublicKeySize 31 32 // Size of a packed PrivateKey 33 PrivateKeySize = internal.PrivateKeySize 34 35 // Size of a ciphertext 36 CiphertextSize = internal.CiphertextSize 37 38 // Size of a plaintext 39 PlaintextSize = internal.PlaintextSize 40 ) 41 42 // PublicKey is the type of {{.Name}}.CPAPKE public key 43 type PublicKey internal.PublicKey 44 45 // PrivateKey is the type of {{.Name}}.CPAPKE private key 46 type PrivateKey internal.PrivateKey 47 48 // GenerateKey generates a public/private key pair using entropy from rand. 49 // If rand is nil, crypto/rand.Reader will be used. 50 func GenerateKey(rand io.Reader) (*PublicKey, *PrivateKey, error) { 51 var seed [KeySeedSize]byte 52 if rand == nil { 53 rand = cryptoRand.Reader 54 } 55 _, err := io.ReadFull(rand, seed[:]) 56 if err != nil { 57 return nil, nil, err 58 } 59 pk, sk := internal.NewKeyFromSeed(seed[:]) 60 return (*PublicKey)(pk), (*PrivateKey)(sk), nil 61 } 62 63 // NewKeyFromSeed derives a public/private key pair using the given seed. 64 // 65 // Note: does not include the domain separation of ML-KEM (line 1, algorithm 13 66 // of FIPS 203). For that use NewKeyFromSeedMLKEM(). 67 // 68 // Panics if seed is not of length KeySeedSize. 69 func NewKeyFromSeed(seed []byte) (*PublicKey, *PrivateKey) { 70 if len(seed) != KeySeedSize { 71 panic("seed must be of length KeySeedSize") 72 } 73 pk, sk := internal.NewKeyFromSeed(seed) 74 return (*PublicKey)(pk), (*PrivateKey)(sk) 75 } 76 77 // NewKeyFromSeedMLKEM derives a public/private key pair using the given seed 78 // using the domain separation of ML-KEM. 79 // 80 // Panics if seed is not of length KeySeedSize. 81 func NewKeyFromSeedMLKEM(seed []byte) (*PublicKey, *PrivateKey) { 82 if len(seed) != KeySeedSize { 83 panic("seed must be of length KeySeedSize") 84 } 85 var seed2 [33]byte 86 copy(seed2[:32], seed) 87 seed2[32] = byte(internal.K) 88 pk, sk := internal.NewKeyFromSeed(seed2[:]) 89 return (*PublicKey)(pk), (*PrivateKey)(sk) 90 } 91 92 // EncryptTo encrypts message pt for the public key and writes the ciphertext 93 // to ct using randomness from seed. 94 // 95 // This function panics if the lengths of pt, seed, and ct are not 96 // PlaintextSize, EncryptionSeedSize, and CiphertextSize respectively. 97 func (pk *PublicKey) EncryptTo(ct []byte, pt []byte, seed []byte) { 98 if len(pt) != PlaintextSize { 99 panic("pt must be of length PlaintextSize") 100 } 101 if len(ct) != CiphertextSize { 102 panic("ct must be of length CiphertextSize") 103 } 104 if len(seed) != EncryptionSeedSize { 105 panic("seed must be of length EncryptionSeedSize") 106 } 107 (*internal.PublicKey)(pk).EncryptTo(ct, pt, seed) 108 } 109 110 // DecryptTo decrypts message ct for the private key and writes the 111 // plaintext to pt. 112 // 113 // This function panics if the lengths of ct and pt are not 114 // CiphertextSize and PlaintextSize respectively. 115 func (sk *PrivateKey) DecryptTo(pt []byte, ct []byte) { 116 if len(pt) != PlaintextSize { 117 panic("pt must be of length PlaintextSize") 118 } 119 if len(ct) != CiphertextSize { 120 panic("ct must be of length CiphertextSize") 121 } 122 (*internal.PrivateKey)(sk).DecryptTo(pt, ct) 123 } 124 125 // Packs pk into the given buffer. 126 // 127 // Panics if buf is not of length PublicKeySize. 128 func (pk *PublicKey) Pack(buf []byte) { 129 if len(buf) != PublicKeySize { 130 panic("buf must be of size PublicKeySize") 131 } 132 (*internal.PublicKey)(pk).Pack(buf) 133 } 134 135 // Packs sk into the given buffer. 136 // 137 // Panics if buf is not of length PrivateKeySize. 138 func (sk *PrivateKey) Pack(buf []byte) { 139 if len(buf) != PrivateKeySize { 140 panic("buf must be of size PrivateKeySize") 141 } 142 (*internal.PrivateKey)(sk).Pack(buf) 143 } 144 145 // Unpacks pk from the given buffer. 146 // 147 // Panics if buf is not of length PublicKeySize. 148 func (pk *PublicKey) Unpack(buf []byte) { 149 if len(buf) != PublicKeySize { 150 panic("buf must be of size PublicKeySize") 151 } 152 (*internal.PublicKey)(pk).Unpack(buf) 153 } 154 155 // Unpacks pk from the given buffer. 156 // 157 // Returns an error if the buffer is not of the right size, or the public 158 // key is not normalized. 159 func (pk *PublicKey) UnpackMLKEM(buf []byte) error { 160 if len(buf) != PublicKeySize { 161 return kem.ErrPubKeySize 162 } 163 return (*internal.PublicKey)(pk).UnpackMLKEM(buf) 164 } 165 166 // Unpacks sk from the given buffer. 167 // 168 // Panics if buf is not of length PrivateKeySize. 169 func (sk *PrivateKey) Unpack(buf []byte) { 170 if len(buf) != PrivateKeySize { 171 panic("buf must be of size PrivateKeySize") 172 } 173 (*internal.PrivateKey)(sk).Unpack(buf) 174 } 175 176 // Returns whether the two private keys are equal. 177 func (sk *PrivateKey) Equal(other *PrivateKey) bool { 178 return (*internal.PrivateKey)(sk).Equal((*internal.PrivateKey)(other)) 179 }