// Copyright 2023 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.

package mlkem

import 

const (
	// CiphertextSize1024 is the size of a ciphertext produced by the 1024-bit
	// variant of ML-KEM.
	CiphertextSize1024 = 1568

	// EncapsulationKeySize1024 is the size of an encapsulation key for the
	// 1024-bit variant of ML-KEM.
	EncapsulationKeySize1024 = 1568
)

// DecapsulationKey1024 is the secret key used to decapsulate a shared key
// from a ciphertext. It includes various precomputed values.
type DecapsulationKey1024 struct {
	key *mlkem.DecapsulationKey1024
}

// GenerateKey1024 generates a new decapsulation key, drawing random bytes from
// crypto/rand. The decapsulation key must be kept secret.
func () (*DecapsulationKey1024, error) {
	,  := mlkem.GenerateKey1024()
	if  != nil {
		return nil, 
	}

	return &DecapsulationKey1024{}, nil
}

// NewDecapsulationKey1024 parses a decapsulation key from a 64-byte seed in the
// "d || z" form. The seed must be uniformly random.
func ( []byte) (*DecapsulationKey1024, error) {
	,  := mlkem.NewDecapsulationKey1024()
	if  != nil {
		return nil, 
	}

	return &DecapsulationKey1024{}, nil
}

// Bytes returns the decapsulation key as a 64-byte seed in the "d || z" form.
//
// The decapsulation key must be kept secret.
func ( *DecapsulationKey1024) () []byte {
	return .key.Bytes()
}

// Decapsulate generates a shared key from a ciphertext and a decapsulation
// key. If the ciphertext is not valid, Decapsulate returns an error.
//
// The shared key must be kept secret.
func ( *DecapsulationKey1024) ( []byte) ( []byte,  error) {
	return .key.Decapsulate()
}

// EncapsulationKey returns the public encapsulation key necessary to produce
// ciphertexts.
func ( *DecapsulationKey1024) () *EncapsulationKey1024 {
	return &EncapsulationKey1024{.key.EncapsulationKey()}
}

// An EncapsulationKey1024 is the public key used to produce ciphertexts to be
// decapsulated by the corresponding DecapsulationKey1024.
type EncapsulationKey1024 struct {
	key *mlkem.EncapsulationKey1024
}

// NewEncapsulationKey1024 parses an encapsulation key from its encoded form. If
// the encapsulation key is not valid, NewEncapsulationKey1024 returns an error.
func ( []byte) (*EncapsulationKey1024, error) {
	,  := mlkem.NewEncapsulationKey1024()
	if  != nil {
		return nil, 
	}

	return &EncapsulationKey1024{}, nil
}

// Bytes returns the encapsulation key as a byte slice.
func ( *EncapsulationKey1024) () []byte {
	return .key.Bytes()
}

// Encapsulate generates a shared key and an associated ciphertext from an
// encapsulation key, drawing random bytes from crypto/rand.
//
// The shared key must be kept secret.
func ( *EncapsulationKey1024) () (,  []byte) {
	return .key.Encapsulate()
}