// Code generated by github.com/atombender/go-jsonschema, DO NOT EDIT.

package wycheproof

import "encoding/json"
import "fmt"
import "reflect"
import "unicode/utf8"

type AeadTestGroup struct {
	// the IV size in bits
	IvSize int `json:"ivSize"`

	// the keySize in bits
	KeySize int `json:"keySize"`

	// Source corresponds to the JSON schema field "source".
	Source Source `json:"source"`

	// the expected size of the tag in bits
	TagSize int `json:"tagSize"`

	// Tests corresponds to the JSON schema field "tests".
	Tests []AeadTestVector `json:"tests"`

	// Type corresponds to the JSON schema field "type".
	Type AeadTestGroupType `json:"type"`
}

type AeadTestGroupType string

const AeadTestGroupTypeAeadTest AeadTestGroupType = "AeadTest"

var enumValues_AeadTestGroupType = []interface{}{
	"AeadTest",
}

// UnmarshalJSON implements json.Unmarshaler.
func (j *AeadTestGroupType) UnmarshalJSON(value []byte) error {
	var v string
	if err := json.Unmarshal(value, &v); err != nil {
		return err
	}
	var ok bool
	for _, expected := range enumValues_AeadTestGroupType {
		if reflect.DeepEqual(v, expected) {
			ok = true
			break
		}
	}
	if !ok {
		return fmt.Errorf("invalid value (expected one of %#v): %#v", enumValues_AeadTestGroupType, v)
	}
	*j = AeadTestGroupType(v)
	return nil
}

// UnmarshalJSON implements json.Unmarshaler.
func (j *AeadTestGroup) UnmarshalJSON(value []byte) error {
	var raw map[string]interface{}
	if err := json.Unmarshal(value, &raw); err != nil {
		return err
	}
	if _, ok := raw["ivSize"]; raw != nil && !ok {
		return fmt.Errorf("field ivSize in AeadTestGroup: required")
	}
	if _, ok := raw["keySize"]; raw != nil && !ok {
		return fmt.Errorf("field keySize in AeadTestGroup: required")
	}
	if _, ok := raw["source"]; raw != nil && !ok {
		return fmt.Errorf("field source in AeadTestGroup: required")
	}
	if _, ok := raw["tagSize"]; raw != nil && !ok {
		return fmt.Errorf("field tagSize in AeadTestGroup: required")
	}
	if _, ok := raw["tests"]; raw != nil && !ok {
		return fmt.Errorf("field tests in AeadTestGroup: required")
	}
	if _, ok := raw["type"]; raw != nil && !ok {
		return fmt.Errorf("field type in AeadTestGroup: required")
	}
	type Plain AeadTestGroup
	var plain Plain
	if err := json.Unmarshal(value, &plain); err != nil {
		return err
	}
	*j = AeadTestGroup(plain)
	return nil
}

type AeadTestSchemaV1Json struct {
	// the primitive tested in the test file
	Algorithm string `json:"algorithm"`

	// DEPRECATED: prefer "source" property in test group
	GeneratorVersion *string `json:"generatorVersion,omitempty,omitzero"`

	// additional documentation
	Header []string `json:"header"`

	// Notes corresponds to the JSON schema field "notes".
	Notes Notes `json:"notes"`

	// the number of test vectors in this test
	NumberOfTests int `json:"numberOfTests"`

	// Schema corresponds to the JSON schema field "schema".
	Schema AeadTestSchemaV1JsonSchema `json:"schema"`

	// TestGroups corresponds to the JSON schema field "testGroups".
	TestGroups []AeadTestGroup `json:"testGroups"`
}

type AeadTestSchemaV1JsonSchema string

const AeadTestSchemaV1JsonSchemaAeadTestSchemaV1Json AeadTestSchemaV1JsonSchema = "aead_test_schema_v1.json"

var enumValues_AeadTestSchemaV1JsonSchema = []interface{}{
	"aead_test_schema_v1.json",
}

// UnmarshalJSON implements json.Unmarshaler.
func (j *AeadTestSchemaV1JsonSchema) UnmarshalJSON(value []byte) error {
	var v string
	if err := json.Unmarshal(value, &v); err != nil {
		return err
	}
	var ok bool
	for _, expected := range enumValues_AeadTestSchemaV1JsonSchema {
		if reflect.DeepEqual(v, expected) {
			ok = true
			break
		}
	}
	if !ok {
		return fmt.Errorf("invalid value (expected one of %#v): %#v", enumValues_AeadTestSchemaV1JsonSchema, v)
	}
	*j = AeadTestSchemaV1JsonSchema(v)
	return nil
}

// UnmarshalJSON implements json.Unmarshaler.
func (j *AeadTestSchemaV1Json) UnmarshalJSON(value []byte) error {
	var raw map[string]interface{}
	if err := json.Unmarshal(value, &raw); err != nil {
		return err
	}
	if _, ok := raw["algorithm"]; raw != nil && !ok {
		return fmt.Errorf("field algorithm in AeadTestSchemaV1Json: required")
	}
	if _, ok := raw["header"]; raw != nil && !ok {
		return fmt.Errorf("field header in AeadTestSchemaV1Json: required")
	}
	if _, ok := raw["notes"]; raw != nil && !ok {
		return fmt.Errorf("field notes in AeadTestSchemaV1Json: required")
	}
	if _, ok := raw["numberOfTests"]; raw != nil && !ok {
		return fmt.Errorf("field numberOfTests in AeadTestSchemaV1Json: required")
	}
	if _, ok := raw["schema"]; raw != nil && !ok {
		return fmt.Errorf("field schema in AeadTestSchemaV1Json: required")
	}
	if _, ok := raw["testGroups"]; raw != nil && !ok {
		return fmt.Errorf("field testGroups in AeadTestSchemaV1Json: required")
	}
	type Plain AeadTestSchemaV1Json
	var plain Plain
	if err := json.Unmarshal(value, &plain); err != nil {
		return err
	}
	*j = AeadTestSchemaV1Json(plain)
	return nil
}

type AeadTestVector struct {
	// additional authenticated data
	Aad string `json:"aad"`

	// A brief description of the test case
	Comment string `json:"comment"`

	// the ciphertext (without iv and tag)
	Ct string `json:"ct"`

	// A list of flags
	Flags []string `json:"flags"`

	// the nonce
	Iv string `json:"iv"`

	// the key
	Key string `json:"key"`

	// the plaintext
	Msg string `json:"msg"`

	// Result corresponds to the JSON schema field "result".
	Result Result `json:"result"`

	// the authentication tag
	Tag string `json:"tag"`

	// Identifier of the test case
	TcId int `json:"tcId"`
}

// UnmarshalJSON implements json.Unmarshaler.
func (j *AeadTestVector) UnmarshalJSON(value []byte) error {
	var raw map[string]interface{}
	if err := json.Unmarshal(value, &raw); err != nil {
		return err
	}
	if _, ok := raw["aad"]; raw != nil && !ok {
		return fmt.Errorf("field aad in AeadTestVector: required")
	}
	if _, ok := raw["comment"]; raw != nil && !ok {
		return fmt.Errorf("field comment in AeadTestVector: required")
	}
	if _, ok := raw["ct"]; raw != nil && !ok {
		return fmt.Errorf("field ct in AeadTestVector: required")
	}
	if _, ok := raw["flags"]; raw != nil && !ok {
		return fmt.Errorf("field flags in AeadTestVector: required")
	}
	if _, ok := raw["iv"]; raw != nil && !ok {
		return fmt.Errorf("field iv in AeadTestVector: required")
	}
	if _, ok := raw["key"]; raw != nil && !ok {
		return fmt.Errorf("field key in AeadTestVector: required")
	}
	if _, ok := raw["msg"]; raw != nil && !ok {
		return fmt.Errorf("field msg in AeadTestVector: required")
	}
	if _, ok := raw["result"]; raw != nil && !ok {
		return fmt.Errorf("field result in AeadTestVector: required")
	}
	if _, ok := raw["tag"]; raw != nil && !ok {
		return fmt.Errorf("field tag in AeadTestVector: required")
	}
	if _, ok := raw["tcId"]; raw != nil && !ok {
		return fmt.Errorf("field tcId in AeadTestVector: required")
	}
	type Plain AeadTestVector
	var plain Plain
	if err := json.Unmarshal(value, &plain); err != nil {
		return err
	}
	*j = AeadTestVector(plain)
	return nil
}

type AsnSignatureTestVector struct {
	// A brief description of the test case
	Comment string `json:"comment"`

	// A list of flags
	Flags []string `json:"flags"`

	// The message to sign
	Msg string `json:"msg"`

	// Result corresponds to the JSON schema field "result".
	Result Result `json:"result"`

	// An ASN encoded signature for msg
	Sig string `json:"sig"`

	// Identifier of the test case
	TcId int `json:"tcId"`
}

// UnmarshalJSON implements json.Unmarshaler.
func (j *AsnSignatureTestVector) UnmarshalJSON(value []byte) error {
	var raw map[string]interface{}
	if err := json.Unmarshal(value, &raw); err != nil {
		return err
	}
	if _, ok := raw["comment"]; raw != nil && !ok {
		return fmt.Errorf("field comment in AsnSignatureTestVector: required")
	}
	if _, ok := raw["flags"]; raw != nil && !ok {
		return fmt.Errorf("field flags in AsnSignatureTestVector: required")
	}
	if _, ok := raw["msg"]; raw != nil && !ok {
		return fmt.Errorf("field msg in AsnSignatureTestVector: required")
	}
	if _, ok := raw["result"]; raw != nil && !ok {
		return fmt.Errorf("field result in AsnSignatureTestVector: required")
	}
	if _, ok := raw["sig"]; raw != nil && !ok {
		return fmt.Errorf("field sig in AsnSignatureTestVector: required")
	}
	if _, ok := raw["tcId"]; raw != nil && !ok {
		return fmt.Errorf("field tcId in AsnSignatureTestVector: required")
	}
	type Plain AsnSignatureTestVector
	var plain Plain
	if err := json.Unmarshal(value, &plain); err != nil {
		return err
	}
	*j = AsnSignatureTestVector(plain)
	return nil
}

type BlsAggregateVerifySchemaJson struct {
	// The primitive tested in the test file
	Algorithm string `json:"algorithm"`

	// Additional documentation
	Header []string `json:"header"`

	// Notes corresponds to the JSON schema field "notes".
	Notes Notes `json:"notes"`

	// The number of test vectors in this test
	NumberOfTests int `json:"numberOfTests"`

	// Schema corresponds to the JSON schema field "schema".
	Schema BlsAggregateVerifySchemaJsonSchema `json:"schema"`

	// TestGroups corresponds to the JSON schema field "testGroups".
	TestGroups []BlsAggregateVerifyTestGroup `json:"testGroups"`
}

type BlsAggregateVerifySchemaJsonSchema string

const BlsAggregateVerifySchemaJsonSchemaBlsAggregateVerifySchemaJson BlsAggregateVerifySchemaJsonSchema = "bls_aggregate_verify_schema.json"

var enumValues_BlsAggregateVerifySchemaJsonSchema = []interface{}{
	"bls_aggregate_verify_schema.json",
}

// UnmarshalJSON implements json.Unmarshaler.
func (j *BlsAggregateVerifySchemaJsonSchema) UnmarshalJSON(value []byte) error {
	var v string
	if err := json.Unmarshal(value, &v); err != nil {
		return err
	}
	var ok bool
	for _, expected := range enumValues_BlsAggregateVerifySchemaJsonSchema {
		if reflect.DeepEqual(v, expected) {
			ok = true
			break
		}
	}
	if !ok {
		return fmt.Errorf("invalid value (expected one of %#v): %#v", enumValues_BlsAggregateVerifySchemaJsonSchema, v)
	}
	*j = BlsAggregateVerifySchemaJsonSchema(v)
	return nil
}

// UnmarshalJSON implements json.Unmarshaler.
func (j *BlsAggregateVerifySchemaJson) UnmarshalJSON(value []byte) error {
	var raw map[string]interface{}
	if err := json.Unmarshal(value, &raw); err != nil {
		return err
	}
	if _, ok := raw["algorithm"]; raw != nil && !ok {
		return fmt.Errorf("field algorithm in BlsAggregateVerifySchemaJson: required")
	}
	if _, ok := raw["header"]; raw != nil && !ok {
		return fmt.Errorf("field header in BlsAggregateVerifySchemaJson: required")
	}
	if _, ok := raw["notes"]; raw != nil && !ok {
		return fmt.Errorf("field notes in BlsAggregateVerifySchemaJson: required")
	}
	if _, ok := raw["numberOfTests"]; raw != nil && !ok {
		return fmt.Errorf("field numberOfTests in BlsAggregateVerifySchemaJson: required")
	}
	if _, ok := raw["schema"]; raw != nil && !ok {
		return fmt.Errorf("field schema in BlsAggregateVerifySchemaJson: required")
	}
	if _, ok := raw["testGroups"]; raw != nil && !ok {
		return fmt.Errorf("field testGroups in BlsAggregateVerifySchemaJson: required")
	}
	type Plain BlsAggregateVerifySchemaJson
	var plain Plain
	if err := json.Unmarshal(value, &plain); err != nil {
		return err
	}
	*j = BlsAggregateVerifySchemaJson(plain)
	return nil
}

type BlsAggregateVerifyTestGroup struct {
	// The BLS ciphersuite identifier
	Ciphersuite string `json:"ciphersuite"`

	// Source corresponds to the JSON schema field "source".
	Source Source `json:"source"`

	// Tests corresponds to the JSON schema field "tests".
	Tests []BlsAggregateVerifyTestVector `json:"tests"`

	// Type corresponds to the JSON schema field "type".
	Type BlsAggregateVerifyTestGroupType `json:"type"`
}

type BlsAggregateVerifyTestGroupType string

const BlsAggregateVerifyTestGroupTypeBlsAggregateVerify BlsAggregateVerifyTestGroupType = "BlsAggregateVerify"

var enumValues_BlsAggregateVerifyTestGroupType = []interface{}{
	"BlsAggregateVerify",
}

// UnmarshalJSON implements json.Unmarshaler.
func (j *BlsAggregateVerifyTestGroupType) UnmarshalJSON(value []byte) error {
	var v string
	if err := json.Unmarshal(value, &v); err != nil {
		return err
	}
	var ok bool
	for _, expected := range enumValues_BlsAggregateVerifyTestGroupType {
		if reflect.DeepEqual(v, expected) {
			ok = true
			break
		}
	}
	if !ok {
		return fmt.Errorf("invalid value (expected one of %#v): %#v", enumValues_BlsAggregateVerifyTestGroupType, v)
	}
	*j = BlsAggregateVerifyTestGroupType(v)
	return nil
}

// UnmarshalJSON implements json.Unmarshaler.
func (j *BlsAggregateVerifyTestGroup) UnmarshalJSON(value []byte) error {
	var raw map[string]interface{}
	if err := json.Unmarshal(value, &raw); err != nil {
		return err
	}
	if _, ok := raw["ciphersuite"]; raw != nil && !ok {
		return fmt.Errorf("field ciphersuite in BlsAggregateVerifyTestGroup: required")
	}
	if _, ok := raw["source"]; raw != nil && !ok {
		return fmt.Errorf("field source in BlsAggregateVerifyTestGroup: required")
	}
	if _, ok := raw["tests"]; raw != nil && !ok {
		return fmt.Errorf("field tests in BlsAggregateVerifyTestGroup: required")
	}
	if _, ok := raw["type"]; raw != nil && !ok {
		return fmt.Errorf("field type in BlsAggregateVerifyTestGroup: required")
	}
	type Plain BlsAggregateVerifyTestGroup
	var plain Plain
	if err := json.Unmarshal(value, &plain); err != nil {
		return err
	}
	*j = BlsAggregateVerifyTestGroup(plain)
	return nil
}

type BlsAggregateVerifyTestVector struct {
	// A brief description of the test case
	Comment string `json:"comment"`

	// A list of flags
	Flags []string `json:"flags"`

	// The messages that were signed
	Messages []string `json:"messages"`

	// The compressed public keys
	Pubkeys []string `json:"pubkeys"`

	// Result corresponds to the JSON schema field "result".
	Result Result `json:"result"`

	// The aggregated BLS signature in compressed form
	Sig string `json:"sig"`

	// Identifier of the test case
	TcId int `json:"tcId"`
}

// UnmarshalJSON implements json.Unmarshaler.
func (j *BlsAggregateVerifyTestVector) UnmarshalJSON(value []byte) error {
	var raw map[string]interface{}
	if err := json.Unmarshal(value, &raw); err != nil {
		return err
	}
	if _, ok := raw["comment"]; raw != nil && !ok {
		return fmt.Errorf("field comment in BlsAggregateVerifyTestVector: required")
	}
	if _, ok := raw["flags"]; raw != nil && !ok {
		return fmt.Errorf("field flags in BlsAggregateVerifyTestVector: required")
	}
	if _, ok := raw["messages"]; raw != nil && !ok {
		return fmt.Errorf("field messages in BlsAggregateVerifyTestVector: required")
	}
	if _, ok := raw["pubkeys"]; raw != nil && !ok {
		return fmt.Errorf("field pubkeys in BlsAggregateVerifyTestVector: required")
	}
	if _, ok := raw["result"]; raw != nil && !ok {
		return fmt.Errorf("field result in BlsAggregateVerifyTestVector: required")
	}
	if _, ok := raw["sig"]; raw != nil && !ok {
		return fmt.Errorf("field sig in BlsAggregateVerifyTestVector: required")
	}
	if _, ok := raw["tcId"]; raw != nil && !ok {
		return fmt.Errorf("field tcId in BlsAggregateVerifyTestVector: required")
	}
	type Plain BlsAggregateVerifyTestVector
	var plain Plain
	if err := json.Unmarshal(value, &plain); err != nil {
		return err
	}
	*j = BlsAggregateVerifyTestVector(plain)
	return nil
}

type BlsHashToG2SchemaJson struct {
	// The primitive tested in the test file
	Algorithm string `json:"algorithm"`

	// Additional documentation
	Header []string `json:"header"`

	// Notes corresponds to the JSON schema field "notes".
	Notes Notes `json:"notes"`

	// The number of test vectors in this test
	NumberOfTests int `json:"numberOfTests"`

	// Schema corresponds to the JSON schema field "schema".
	Schema BlsHashToG2SchemaJsonSchema `json:"schema"`

	// TestGroups corresponds to the JSON schema field "testGroups".
	TestGroups []BlsHashToG2TestGroup `json:"testGroups"`
}

type BlsHashToG2SchemaJsonSchema string

const BlsHashToG2SchemaJsonSchemaBlsHashToG2SchemaJson BlsHashToG2SchemaJsonSchema = "bls_hash_to_g2_schema.json"

var enumValues_BlsHashToG2SchemaJsonSchema = []interface{}{
	"bls_hash_to_g2_schema.json",
}

// UnmarshalJSON implements json.Unmarshaler.
func (j *BlsHashToG2SchemaJsonSchema) UnmarshalJSON(value []byte) error {
	var v string
	if err := json.Unmarshal(value, &v); err != nil {
		return err
	}
	var ok bool
	for _, expected := range enumValues_BlsHashToG2SchemaJsonSchema {
		if reflect.DeepEqual(v, expected) {
			ok = true
			break
		}
	}
	if !ok {
		return fmt.Errorf("invalid value (expected one of %#v): %#v", enumValues_BlsHashToG2SchemaJsonSchema, v)
	}
	*j = BlsHashToG2SchemaJsonSchema(v)
	return nil
}

// UnmarshalJSON implements json.Unmarshaler.
func (j *BlsHashToG2SchemaJson) UnmarshalJSON(value []byte) error {
	var raw map[string]interface{}
	if err := json.Unmarshal(value, &raw); err != nil {
		return err
	}
	if _, ok := raw["algorithm"]; raw != nil && !ok {
		return fmt.Errorf("field algorithm in BlsHashToG2SchemaJson: required")
	}
	if _, ok := raw["header"]; raw != nil && !ok {
		return fmt.Errorf("field header in BlsHashToG2SchemaJson: required")
	}
	if _, ok := raw["notes"]; raw != nil && !ok {
		return fmt.Errorf("field notes in BlsHashToG2SchemaJson: required")
	}
	if _, ok := raw["numberOfTests"]; raw != nil && !ok {
		return fmt.Errorf("field numberOfTests in BlsHashToG2SchemaJson: required")
	}
	if _, ok := raw["schema"]; raw != nil && !ok {
		return fmt.Errorf("field schema in BlsHashToG2SchemaJson: required")
	}
	if _, ok := raw["testGroups"]; raw != nil && !ok {
		return fmt.Errorf("field testGroups in BlsHashToG2SchemaJson: required")
	}
	type Plain BlsHashToG2SchemaJson
	var plain Plain
	if err := json.Unmarshal(value, &plain); err != nil {
		return err
	}
	*j = BlsHashToG2SchemaJson(plain)
	return nil
}

type BlsHashToG2TestGroup struct {
	// The domain separation tag used for hash_to_curve
	Dst string `json:"dst"`

	// Source corresponds to the JSON schema field "source".
	Source Source `json:"source"`

	// Tests corresponds to the JSON schema field "tests".
	Tests []BlsHashToG2TestVector `json:"tests"`

	// Type corresponds to the JSON schema field "type".
	Type BlsHashToG2TestGroupType `json:"type"`
}

type BlsHashToG2TestGroupType string

const BlsHashToG2TestGroupTypeBlsHashToG2 BlsHashToG2TestGroupType = "BlsHashToG2"

var enumValues_BlsHashToG2TestGroupType = []interface{}{
	"BlsHashToG2",
}

// UnmarshalJSON implements json.Unmarshaler.
func (j *BlsHashToG2TestGroupType) UnmarshalJSON(value []byte) error {
	var v string
	if err := json.Unmarshal(value, &v); err != nil {
		return err
	}
	var ok bool
	for _, expected := range enumValues_BlsHashToG2TestGroupType {
		if reflect.DeepEqual(v, expected) {
			ok = true
			break
		}
	}
	if !ok {
		return fmt.Errorf("invalid value (expected one of %#v): %#v", enumValues_BlsHashToG2TestGroupType, v)
	}
	*j = BlsHashToG2TestGroupType(v)
	return nil
}

// UnmarshalJSON implements json.Unmarshaler.
func (j *BlsHashToG2TestGroup) UnmarshalJSON(value []byte) error {
	var raw map[string]interface{}
	if err := json.Unmarshal(value, &raw); err != nil {
		return err
	}
	if _, ok := raw["dst"]; raw != nil && !ok {
		return fmt.Errorf("field dst in BlsHashToG2TestGroup: required")
	}
	if _, ok := raw["source"]; raw != nil && !ok {
		return fmt.Errorf("field source in BlsHashToG2TestGroup: required")
	}
	if _, ok := raw["tests"]; raw != nil && !ok {
		return fmt.Errorf("field tests in BlsHashToG2TestGroup: required")
	}
	if _, ok := raw["type"]; raw != nil && !ok {
		return fmt.Errorf("field type in BlsHashToG2TestGroup: required")
	}
	type Plain BlsHashToG2TestGroup
	var plain Plain
	if err := json.Unmarshal(value, &plain); err != nil {
		return err
	}
	*j = BlsHashToG2TestGroup(plain)
	return nil
}

type BlsHashToG2TestVector struct {
	// A brief description of the test case
	Comment string `json:"comment"`

	// The expected hash-to-curve output point in compressed form
	Expected string `json:"expected"`

	// A list of flags
	Flags []string `json:"flags"`

	// The input message
	Msg string `json:"msg"`

	// Result corresponds to the JSON schema field "result".
	Result Result `json:"result"`

	// Identifier of the test case
	TcId int `json:"tcId"`
}

// UnmarshalJSON implements json.Unmarshaler.
func (j *BlsHashToG2TestVector) UnmarshalJSON(value []byte) error {
	var raw map[string]interface{}
	if err := json.Unmarshal(value, &raw); err != nil {
		return err
	}
	if _, ok := raw["comment"]; raw != nil && !ok {
		return fmt.Errorf("field comment in BlsHashToG2TestVector: required")
	}
	if _, ok := raw["expected"]; raw != nil && !ok {
		return fmt.Errorf("field expected in BlsHashToG2TestVector: required")
	}
	if _, ok := raw["flags"]; raw != nil && !ok {
		return fmt.Errorf("field flags in BlsHashToG2TestVector: required")
	}
	if _, ok := raw["msg"]; raw != nil && !ok {
		return fmt.Errorf("field msg in BlsHashToG2TestVector: required")
	}
	if _, ok := raw["result"]; raw != nil && !ok {
		return fmt.Errorf("field result in BlsHashToG2TestVector: required")
	}
	if _, ok := raw["tcId"]; raw != nil && !ok {
		return fmt.Errorf("field tcId in BlsHashToG2TestVector: required")
	}
	type Plain BlsHashToG2TestVector
	var plain Plain
	if err := json.Unmarshal(value, &plain); err != nil {
		return err
	}
	*j = BlsHashToG2TestVector(plain)
	return nil
}

type BlsPublicKey struct {
	// The group the public key belongs to
	Group BlsPublicKeyGroup `json:"group"`

	// The size of the public key in bytes
	KeySize int `json:"keySize"`

	// The compressed public key
	Pk string `json:"pk"`
}

type BlsPublicKeyGroup string

const BlsPublicKeyGroupG1 BlsPublicKeyGroup = "G1"
const BlsPublicKeyGroupG2 BlsPublicKeyGroup = "G2"

var enumValues_BlsPublicKeyGroup = []interface{}{
	"G1",
	"G2",
}

// UnmarshalJSON implements json.Unmarshaler.
func (j *BlsPublicKeyGroup) UnmarshalJSON(value []byte) error {
	var v string
	if err := json.Unmarshal(value, &v); err != nil {
		return err
	}
	var ok bool
	for _, expected := range enumValues_BlsPublicKeyGroup {
		if reflect.DeepEqual(v, expected) {
			ok = true
			break
		}
	}
	if !ok {
		return fmt.Errorf("invalid value (expected one of %#v): %#v", enumValues_BlsPublicKeyGroup, v)
	}
	*j = BlsPublicKeyGroup(v)
	return nil
}

// UnmarshalJSON implements json.Unmarshaler.
func (j *BlsPublicKey) UnmarshalJSON(value []byte) error {
	var raw map[string]interface{}
	if err := json.Unmarshal(value, &raw); err != nil {
		return err
	}
	if _, ok := raw["group"]; raw != nil && !ok {
		return fmt.Errorf("field group in BlsPublicKey: required")
	}
	if _, ok := raw["keySize"]; raw != nil && !ok {
		return fmt.Errorf("field keySize in BlsPublicKey: required")
	}
	if _, ok := raw["pk"]; raw != nil && !ok {
		return fmt.Errorf("field pk in BlsPublicKey: required")
	}
	type Plain BlsPublicKey
	var plain Plain
	if err := json.Unmarshal(value, &plain); err != nil {
		return err
	}
	*j = BlsPublicKey(plain)
	return nil
}

type BlsSigVerifySchemaJson struct {
	// The primitive tested in the test file
	Algorithm string `json:"algorithm"`

	// Additional documentation
	Header []string `json:"header"`

	// Notes corresponds to the JSON schema field "notes".
	Notes Notes `json:"notes"`

	// The number of test vectors in this test
	NumberOfTests int `json:"numberOfTests"`

	// Schema corresponds to the JSON schema field "schema".
	Schema BlsSigVerifySchemaJsonSchema `json:"schema"`

	// TestGroups corresponds to the JSON schema field "testGroups".
	TestGroups []BlsSigVerifyTestGroup `json:"testGroups"`
}

type BlsSigVerifySchemaJsonSchema string

const BlsSigVerifySchemaJsonSchemaBlsSigVerifySchemaJson BlsSigVerifySchemaJsonSchema = "bls_sig_verify_schema.json"

var enumValues_BlsSigVerifySchemaJsonSchema = []interface{}{
	"bls_sig_verify_schema.json",
}

// UnmarshalJSON implements json.Unmarshaler.
func (j *BlsSigVerifySchemaJsonSchema) UnmarshalJSON(value []byte) error {
	var v string
	if err := json.Unmarshal(value, &v); err != nil {
		return err
	}
	var ok bool
	for _, expected := range enumValues_BlsSigVerifySchemaJsonSchema {
		if reflect.DeepEqual(v, expected) {
			ok = true
			break
		}
	}
	if !ok {
		return fmt.Errorf("invalid value (expected one of %#v): %#v", enumValues_BlsSigVerifySchemaJsonSchema, v)
	}
	*j = BlsSigVerifySchemaJsonSchema(v)
	return nil
}

// UnmarshalJSON implements json.Unmarshaler.
func (j *BlsSigVerifySchemaJson) UnmarshalJSON(value []byte) error {
	var raw map[string]interface{}
	if err := json.Unmarshal(value, &raw); err != nil {
		return err
	}
	if _, ok := raw["algorithm"]; raw != nil && !ok {
		return fmt.Errorf("field algorithm in BlsSigVerifySchemaJson: required")
	}
	if _, ok := raw["header"]; raw != nil && !ok {
		return fmt.Errorf("field header in BlsSigVerifySchemaJson: required")
	}
	if _, ok := raw["notes"]; raw != nil && !ok {
		return fmt.Errorf("field notes in BlsSigVerifySchemaJson: required")
	}
	if _, ok := raw["numberOfTests"]; raw != nil && !ok {
		return fmt.Errorf("field numberOfTests in BlsSigVerifySchemaJson: required")
	}
	if _, ok := raw["schema"]; raw != nil && !ok {
		return fmt.Errorf("field schema in BlsSigVerifySchemaJson: required")
	}
	if _, ok := raw["testGroups"]; raw != nil && !ok {
		return fmt.Errorf("field testGroups in BlsSigVerifySchemaJson: required")
	}
	type Plain BlsSigVerifySchemaJson
	var plain Plain
	if err := json.Unmarshal(value, &plain); err != nil {
		return err
	}
	*j = BlsSigVerifySchemaJson(plain)
	return nil
}

type BlsSigVerifyTestGroup struct {
	// The BLS ciphersuite identifier, e.g.
	// BLS_SIG_BLS12381G2_XMD:SHA-256_SSWU_RO_NUL_
	Ciphersuite string `json:"ciphersuite"`

	// PublicKey corresponds to the JSON schema field "publicKey".
	PublicKey BlsPublicKey `json:"publicKey"`

	// Source corresponds to the JSON schema field "source".
	Source Source `json:"source"`

	// Tests corresponds to the JSON schema field "tests".
	Tests []SignatureTestVector `json:"tests"`

	// Type corresponds to the JSON schema field "type".
	Type BlsSigVerifyTestGroupType `json:"type"`
}

type BlsSigVerifyTestGroupType string

const BlsSigVerifyTestGroupTypeBlsSigVerify BlsSigVerifyTestGroupType = "BlsSigVerify"

var enumValues_BlsSigVerifyTestGroupType = []interface{}{
	"BlsSigVerify",
}

// UnmarshalJSON implements json.Unmarshaler.
func (j *BlsSigVerifyTestGroupType) UnmarshalJSON(value []byte) error {
	var v string
	if err := json.Unmarshal(value, &v); err != nil {
		return err
	}
	var ok bool
	for _, expected := range enumValues_BlsSigVerifyTestGroupType {
		if reflect.DeepEqual(v, expected) {
			ok = true
			break
		}
	}
	if !ok {
		return fmt.Errorf("invalid value (expected one of %#v): %#v", enumValues_BlsSigVerifyTestGroupType, v)
	}
	*j = BlsSigVerifyTestGroupType(v)
	return nil
}

// UnmarshalJSON implements json.Unmarshaler.
func (j *BlsSigVerifyTestGroup) UnmarshalJSON(value []byte) error {
	var raw map[string]interface{}
	if err := json.Unmarshal(value, &raw); err != nil {
		return err
	}
	if _, ok := raw["ciphersuite"]; raw != nil && !ok {
		return fmt.Errorf("field ciphersuite in BlsSigVerifyTestGroup: required")
	}
	if _, ok := raw["publicKey"]; raw != nil && !ok {
		return fmt.Errorf("field publicKey in BlsSigVerifyTestGroup: required")
	}
	if _, ok := raw["source"]; raw != nil && !ok {
		return fmt.Errorf("field source in BlsSigVerifyTestGroup: required")
	}
	if _, ok := raw["tests"]; raw != nil && !ok {
		return fmt.Errorf("field tests in BlsSigVerifyTestGroup: required")
	}
	if _, ok := raw["type"]; raw != nil && !ok {
		return fmt.Errorf("field type in BlsSigVerifyTestGroup: required")
	}
	type Plain BlsSigVerifyTestGroup
	var plain Plain
	if err := json.Unmarshal(value, &plain); err != nil {
		return err
	}
	*j = BlsSigVerifyTestGroup(plain)
	return nil
}

type DaeadTestGroup struct {
	// the keySize in bits
	KeySize int `json:"keySize"`

	// Source corresponds to the JSON schema field "source".
	Source Source `json:"source"`

	// Tests corresponds to the JSON schema field "tests".
	Tests []DaeadTestVector `json:"tests"`

	// Type corresponds to the JSON schema field "type".
	Type DaeadTestGroupType `json:"type"`
}

type DaeadTestGroupType string

const DaeadTestGroupTypeDaeadTest DaeadTestGroupType = "DaeadTest"

var enumValues_DaeadTestGroupType = []interface{}{
	"DaeadTest",
}

// UnmarshalJSON implements json.Unmarshaler.
func (j *DaeadTestGroupType) UnmarshalJSON(value []byte) error {
	var v string
	if err := json.Unmarshal(value, &v); err != nil {
		return err
	}
	var ok bool
	for _, expected := range enumValues_DaeadTestGroupType {
		if reflect.DeepEqual(v, expected) {
			ok = true
			break
		}
	}
	if !ok {
		return fmt.Errorf("invalid value (expected one of %#v): %#v", enumValues_DaeadTestGroupType, v)
	}
	*j = DaeadTestGroupType(v)
	return nil
}

// UnmarshalJSON implements json.Unmarshaler.
func (j *DaeadTestGroup) UnmarshalJSON(value []byte) error {
	var raw map[string]interface{}
	if err := json.Unmarshal(value, &raw); err != nil {
		return err
	}
	if _, ok := raw["keySize"]; raw != nil && !ok {
		return fmt.Errorf("field keySize in DaeadTestGroup: required")
	}
	if _, ok := raw["source"]; raw != nil && !ok {
		return fmt.Errorf("field source in DaeadTestGroup: required")
	}
	if _, ok := raw["tests"]; raw != nil && !ok {
		return fmt.Errorf("field tests in DaeadTestGroup: required")
	}
	if _, ok := raw["type"]; raw != nil && !ok {
		return fmt.Errorf("field type in DaeadTestGroup: required")
	}
	type Plain DaeadTestGroup
	var plain Plain
	if err := json.Unmarshal(value, &plain); err != nil {
		return err
	}
	*j = DaeadTestGroup(plain)
	return nil
}

type DaeadTestSchemaV1Json struct {
	// the primitive tested in the test file
	Algorithm string `json:"algorithm"`

	// DEPRECATED: prefer "source" property in test group
	GeneratorVersion *string `json:"generatorVersion,omitempty,omitzero"`

	// additional documentation
	Header []string `json:"header"`

	// Notes corresponds to the JSON schema field "notes".
	Notes Notes `json:"notes"`

	// the number of test vectors in this test
	NumberOfTests int `json:"numberOfTests"`

	// Schema corresponds to the JSON schema field "schema".
	Schema DaeadTestSchemaV1JsonSchema `json:"schema"`

	// TestGroups corresponds to the JSON schema field "testGroups".
	TestGroups []DaeadTestGroup `json:"testGroups"`
}

type DaeadTestSchemaV1JsonSchema string

const DaeadTestSchemaV1JsonSchemaDaeadTestSchemaV1Json DaeadTestSchemaV1JsonSchema = "daead_test_schema_v1.json"

var enumValues_DaeadTestSchemaV1JsonSchema = []interface{}{
	"daead_test_schema_v1.json",
}

// UnmarshalJSON implements json.Unmarshaler.
func (j *DaeadTestSchemaV1JsonSchema) UnmarshalJSON(value []byte) error {
	var v string
	if err := json.Unmarshal(value, &v); err != nil {
		return err
	}
	var ok bool
	for _, expected := range enumValues_DaeadTestSchemaV1JsonSchema {
		if reflect.DeepEqual(v, expected) {
			ok = true
			break
		}
	}
	if !ok {
		return fmt.Errorf("invalid value (expected one of %#v): %#v", enumValues_DaeadTestSchemaV1JsonSchema, v)
	}
	*j = DaeadTestSchemaV1JsonSchema(v)
	return nil
}

// UnmarshalJSON implements json.Unmarshaler.
func (j *DaeadTestSchemaV1Json) UnmarshalJSON(value []byte) error {
	var raw map[string]interface{}
	if err := json.Unmarshal(value, &raw); err != nil {
		return err
	}
	if _, ok := raw["algorithm"]; raw != nil && !ok {
		return fmt.Errorf("field algorithm in DaeadTestSchemaV1Json: required")
	}
	if _, ok := raw["header"]; raw != nil && !ok {
		return fmt.Errorf("field header in DaeadTestSchemaV1Json: required")
	}
	if _, ok := raw["notes"]; raw != nil && !ok {
		return fmt.Errorf("field notes in DaeadTestSchemaV1Json: required")
	}
	if _, ok := raw["numberOfTests"]; raw != nil && !ok {
		return fmt.Errorf("field numberOfTests in DaeadTestSchemaV1Json: required")
	}
	if _, ok := raw["schema"]; raw != nil && !ok {
		return fmt.Errorf("field schema in DaeadTestSchemaV1Json: required")
	}
	if _, ok := raw["testGroups"]; raw != nil && !ok {
		return fmt.Errorf("field testGroups in DaeadTestSchemaV1Json: required")
	}
	type Plain DaeadTestSchemaV1Json
	var plain Plain
	if err := json.Unmarshal(value, &plain); err != nil {
		return err
	}
	*j = DaeadTestSchemaV1Json(plain)
	return nil
}

type DaeadTestVector struct {
	// additional authenticated data
	Aad string `json:"aad"`

	// A brief description of the test case
	Comment string `json:"comment"`

	// the ciphertext including tag
	Ct string `json:"ct"`

	// A list of flags
	Flags []string `json:"flags,omitempty,omitzero"`

	// the key
	Key string `json:"key"`

	// the plaintext
	Msg string `json:"msg"`

	// Result corresponds to the JSON schema field "result".
	Result Result `json:"result"`

	// Identifier of the test case
	TcId int `json:"tcId"`
}

// UnmarshalJSON implements json.Unmarshaler.
func (j *DaeadTestVector) UnmarshalJSON(value []byte) error {
	var raw map[string]interface{}
	if err := json.Unmarshal(value, &raw); err != nil {
		return err
	}
	if _, ok := raw["aad"]; raw != nil && !ok {
		return fmt.Errorf("field aad in DaeadTestVector: required")
	}
	if _, ok := raw["comment"]; raw != nil && !ok {
		return fmt.Errorf("field comment in DaeadTestVector: required")
	}
	if _, ok := raw["ct"]; raw != nil && !ok {
		return fmt.Errorf("field ct in DaeadTestVector: required")
	}
	if _, ok := raw["key"]; raw != nil && !ok {
		return fmt.Errorf("field key in DaeadTestVector: required")
	}
	if _, ok := raw["msg"]; raw != nil && !ok {
		return fmt.Errorf("field msg in DaeadTestVector: required")
	}
	if _, ok := raw["result"]; raw != nil && !ok {
		return fmt.Errorf("field result in DaeadTestVector: required")
	}
	if _, ok := raw["tcId"]; raw != nil && !ok {
		return fmt.Errorf("field tcId in DaeadTestVector: required")
	}
	type Plain DaeadTestVector
	var plain Plain
	if err := json.Unmarshal(value, &plain); err != nil {
		return err
	}
	*j = DaeadTestVector(plain)
	return nil
}

type DsaP1363TestGroup struct {
	// unencoded EC public key
	PublicKey DsaPublicKey `json:"publicKey"`

	// DER encoded public key
	PublicKeyDer string `json:"publicKeyDer"`

	// Pem encoded public key
	PublicKeyPem string `json:"publicKeyPem"`

	// the hash function used for DSA
	Sha string `json:"sha"`

	// Source corresponds to the JSON schema field "source".
	Source Source `json:"source"`

	// Tests corresponds to the JSON schema field "tests".
	Tests []SignatureTestVector `json:"tests"`

	// Type corresponds to the JSON schema field "type".
	Type DsaP1363TestGroupType `json:"type"`
}

type DsaP1363TestGroupType string

const DsaP1363TestGroupTypeDsaP1363Verify DsaP1363TestGroupType = "DsaP1363Verify"

var enumValues_DsaP1363TestGroupType = []interface{}{
	"DsaP1363Verify",
}

// UnmarshalJSON implements json.Unmarshaler.
func (j *DsaP1363TestGroupType) UnmarshalJSON(value []byte) error {
	var v string
	if err := json.Unmarshal(value, &v); err != nil {
		return err
	}
	var ok bool
	for _, expected := range enumValues_DsaP1363TestGroupType {
		if reflect.DeepEqual(v, expected) {
			ok = true
			break
		}
	}
	if !ok {
		return fmt.Errorf("invalid value (expected one of %#v): %#v", enumValues_DsaP1363TestGroupType, v)
	}
	*j = DsaP1363TestGroupType(v)
	return nil
}

// UnmarshalJSON implements json.Unmarshaler.
func (j *DsaP1363TestGroup) UnmarshalJSON(value []byte) error {
	var raw map[string]interface{}
	if err := json.Unmarshal(value, &raw); err != nil {
		return err
	}
	if _, ok := raw["publicKey"]; raw != nil && !ok {
		return fmt.Errorf("field publicKey in DsaP1363TestGroup: required")
	}
	if _, ok := raw["publicKeyDer"]; raw != nil && !ok {
		return fmt.Errorf("field publicKeyDer in DsaP1363TestGroup: required")
	}
	if _, ok := raw["publicKeyPem"]; raw != nil && !ok {
		return fmt.Errorf("field publicKeyPem in DsaP1363TestGroup: required")
	}
	if _, ok := raw["sha"]; raw != nil && !ok {
		return fmt.Errorf("field sha in DsaP1363TestGroup: required")
	}
	if _, ok := raw["source"]; raw != nil && !ok {
		return fmt.Errorf("field source in DsaP1363TestGroup: required")
	}
	if _, ok := raw["tests"]; raw != nil && !ok {
		return fmt.Errorf("field tests in DsaP1363TestGroup: required")
	}
	if _, ok := raw["type"]; raw != nil && !ok {
		return fmt.Errorf("field type in DsaP1363TestGroup: required")
	}
	type Plain DsaP1363TestGroup
	var plain Plain
	if err := json.Unmarshal(value, &plain); err != nil {
		return err
	}
	*j = DsaP1363TestGroup(plain)
	return nil
}

type DsaP1363VerifySchemaV1Json struct {
	// the primitive tested in the test file
	Algorithm string `json:"algorithm"`

	// DEPRECATED: prefer "source" property in test group
	GeneratorVersion *string `json:"generatorVersion,omitempty,omitzero"`

	// additional documentation
	Header []string `json:"header"`

	// Notes corresponds to the JSON schema field "notes".
	Notes Notes `json:"notes"`

	// the number of test vectors in this test
	NumberOfTests int `json:"numberOfTests"`

	// Schema corresponds to the JSON schema field "schema".
	Schema DsaP1363VerifySchemaV1JsonSchema `json:"schema"`

	// TestGroups corresponds to the JSON schema field "testGroups".
	TestGroups []DsaP1363TestGroup `json:"testGroups"`
}

type DsaP1363VerifySchemaV1JsonSchema string

const DsaP1363VerifySchemaV1JsonSchemaDsaP1363VerifySchemaV1Json DsaP1363VerifySchemaV1JsonSchema = "dsa_p1363_verify_schema_v1.json"

var enumValues_DsaP1363VerifySchemaV1JsonSchema = []interface{}{
	"dsa_p1363_verify_schema_v1.json",
}

// UnmarshalJSON implements json.Unmarshaler.
func (j *DsaP1363VerifySchemaV1JsonSchema) UnmarshalJSON(value []byte) error {
	var v string
	if err := json.Unmarshal(value, &v); err != nil {
		return err
	}
	var ok bool
	for _, expected := range enumValues_DsaP1363VerifySchemaV1JsonSchema {
		if reflect.DeepEqual(v, expected) {
			ok = true
			break
		}
	}
	if !ok {
		return fmt.Errorf("invalid value (expected one of %#v): %#v", enumValues_DsaP1363VerifySchemaV1JsonSchema, v)
	}
	*j = DsaP1363VerifySchemaV1JsonSchema(v)
	return nil
}

// UnmarshalJSON implements json.Unmarshaler.
func (j *DsaP1363VerifySchemaV1Json) UnmarshalJSON(value []byte) error {
	var raw map[string]interface{}
	if err := json.Unmarshal(value, &raw); err != nil {
		return err
	}
	if _, ok := raw["algorithm"]; raw != nil && !ok {
		return fmt.Errorf("field algorithm in DsaP1363VerifySchemaV1Json: required")
	}
	if _, ok := raw["header"]; raw != nil && !ok {
		return fmt.Errorf("field header in DsaP1363VerifySchemaV1Json: required")
	}
	if _, ok := raw["notes"]; raw != nil && !ok {
		return fmt.Errorf("field notes in DsaP1363VerifySchemaV1Json: required")
	}
	if _, ok := raw["numberOfTests"]; raw != nil && !ok {
		return fmt.Errorf("field numberOfTests in DsaP1363VerifySchemaV1Json: required")
	}
	if _, ok := raw["schema"]; raw != nil && !ok {
		return fmt.Errorf("field schema in DsaP1363VerifySchemaV1Json: required")
	}
	if _, ok := raw["testGroups"]; raw != nil && !ok {
		return fmt.Errorf("field testGroups in DsaP1363VerifySchemaV1Json: required")
	}
	type Plain DsaP1363VerifySchemaV1Json
	var plain Plain
	if err := json.Unmarshal(value, &plain); err != nil {
		return err
	}
	*j = DsaP1363VerifySchemaV1Json(plain)
	return nil
}

type DsaPublicKey struct {
	// the generator of the multiplicative subgroup
	G string `json:"g"`

	// the key size in bits
	KeySize int `json:"keySize"`

	// the modulus p
	P string `json:"p"`

	// the order of the generator g
	Q string `json:"q"`

	// the key type
	Type DsaPublicKeyType `json:"type"`

	// the public key value
	Y string `json:"y"`
}

type DsaPublicKeyType string

const DsaPublicKeyTypeDsaPublicKey DsaPublicKeyType = "DsaPublicKey"

var enumValues_DsaPublicKeyType = []interface{}{
	"DsaPublicKey",
}

// UnmarshalJSON implements json.Unmarshaler.
func (j *DsaPublicKeyType) UnmarshalJSON(value []byte) error {
	var v string
	if err := json.Unmarshal(value, &v); err != nil {
		return err
	}
	var ok bool
	for _, expected := range enumValues_DsaPublicKeyType {
		if reflect.DeepEqual(v, expected) {
			ok = true
			break
		}
	}
	if !ok {
		return fmt.Errorf("invalid value (expected one of %#v): %#v", enumValues_DsaPublicKeyType, v)
	}
	*j = DsaPublicKeyType(v)
	return nil
}

// UnmarshalJSON implements json.Unmarshaler.
func (j *DsaPublicKey) UnmarshalJSON(value []byte) error {
	var raw map[string]interface{}
	if err := json.Unmarshal(value, &raw); err != nil {
		return err
	}
	if _, ok := raw["g"]; raw != nil && !ok {
		return fmt.Errorf("field g in DsaPublicKey: required")
	}
	if _, ok := raw["keySize"]; raw != nil && !ok {
		return fmt.Errorf("field keySize in DsaPublicKey: required")
	}
	if _, ok := raw["p"]; raw != nil && !ok {
		return fmt.Errorf("field p in DsaPublicKey: required")
	}
	if _, ok := raw["q"]; raw != nil && !ok {
		return fmt.Errorf("field q in DsaPublicKey: required")
	}
	if _, ok := raw["type"]; raw != nil && !ok {
		return fmt.Errorf("field type in DsaPublicKey: required")
	}
	if _, ok := raw["y"]; raw != nil && !ok {
		return fmt.Errorf("field y in DsaPublicKey: required")
	}
	type Plain DsaPublicKey
	var plain Plain
	if err := json.Unmarshal(value, &plain); err != nil {
		return err
	}
	*j = DsaPublicKey(plain)
	return nil
}

type DsaTestGroup struct {
	// unenocded DSA public key
	PublicKey DsaPublicKey `json:"publicKey"`

	// DER encoded public key
	PublicKeyDer string `json:"publicKeyDer"`

	// Pem encoded public key
	PublicKeyPem string `json:"publicKeyPem"`

	// the hash function used for DSA
	Sha string `json:"sha"`

	// Source corresponds to the JSON schema field "source".
	Source Source `json:"source"`

	// Tests corresponds to the JSON schema field "tests".
	Tests []AsnSignatureTestVector `json:"tests"`

	// Type corresponds to the JSON schema field "type".
	Type DsaTestGroupType `json:"type"`
}

type DsaTestGroupType string

const DsaTestGroupTypeDsaVerify DsaTestGroupType = "DsaVerify"

var enumValues_DsaTestGroupType = []interface{}{
	"DsaVerify",
}

// UnmarshalJSON implements json.Unmarshaler.
func (j *DsaTestGroupType) UnmarshalJSON(value []byte) error {
	var v string
	if err := json.Unmarshal(value, &v); err != nil {
		return err
	}
	var ok bool
	for _, expected := range enumValues_DsaTestGroupType {
		if reflect.DeepEqual(v, expected) {
			ok = true
			break
		}
	}
	if !ok {
		return fmt.Errorf("invalid value (expected one of %#v): %#v", enumValues_DsaTestGroupType, v)
	}
	*j = DsaTestGroupType(v)
	return nil
}

// UnmarshalJSON implements json.Unmarshaler.
func (j *DsaTestGroup) UnmarshalJSON(value []byte) error {
	var raw map[string]interface{}
	if err := json.Unmarshal(value, &raw); err != nil {
		return err
	}
	if _, ok := raw["publicKey"]; raw != nil && !ok {
		return fmt.Errorf("field publicKey in DsaTestGroup: required")
	}
	if _, ok := raw["publicKeyDer"]; raw != nil && !ok {
		return fmt.Errorf("field publicKeyDer in DsaTestGroup: required")
	}
	if _, ok := raw["publicKeyPem"]; raw != nil && !ok {
		return fmt.Errorf("field publicKeyPem in DsaTestGroup: required")
	}
	if _, ok := raw["sha"]; raw != nil && !ok {
		return fmt.Errorf("field sha in DsaTestGroup: required")
	}
	if _, ok := raw["source"]; raw != nil && !ok {
		return fmt.Errorf("field source in DsaTestGroup: required")
	}
	if _, ok := raw["tests"]; raw != nil && !ok {
		return fmt.Errorf("field tests in DsaTestGroup: required")
	}
	if _, ok := raw["type"]; raw != nil && !ok {
		return fmt.Errorf("field type in DsaTestGroup: required")
	}
	type Plain DsaTestGroup
	var plain Plain
	if err := json.Unmarshal(value, &plain); err != nil {
		return err
	}
	*j = DsaTestGroup(plain)
	return nil
}

type DsaVerifySchemaV1Json struct {
	// the primitive tested in the test file
	Algorithm string `json:"algorithm"`

	// DEPRECATED: prefer "source" property in test group
	GeneratorVersion *string `json:"generatorVersion,omitempty,omitzero"`

	// additional documentation
	Header []string `json:"header"`

	// Notes corresponds to the JSON schema field "notes".
	Notes Notes `json:"notes"`

	// the number of test vectors in this test
	NumberOfTests int `json:"numberOfTests"`

	// Schema corresponds to the JSON schema field "schema".
	Schema DsaVerifySchemaV1JsonSchema `json:"schema"`

	// TestGroups corresponds to the JSON schema field "testGroups".
	TestGroups []DsaTestGroup `json:"testGroups"`
}

type DsaVerifySchemaV1JsonSchema string

const DsaVerifySchemaV1JsonSchemaDsaVerifySchemaV1Json DsaVerifySchemaV1JsonSchema = "dsa_verify_schema_v1.json"

var enumValues_DsaVerifySchemaV1JsonSchema = []interface{}{
	"dsa_verify_schema_v1.json",
}

// UnmarshalJSON implements json.Unmarshaler.
func (j *DsaVerifySchemaV1JsonSchema) UnmarshalJSON(value []byte) error {
	var v string
	if err := json.Unmarshal(value, &v); err != nil {
		return err
	}
	var ok bool
	for _, expected := range enumValues_DsaVerifySchemaV1JsonSchema {
		if reflect.DeepEqual(v, expected) {
			ok = true
			break
		}
	}
	if !ok {
		return fmt.Errorf("invalid value (expected one of %#v): %#v", enumValues_DsaVerifySchemaV1JsonSchema, v)
	}
	*j = DsaVerifySchemaV1JsonSchema(v)
	return nil
}

// UnmarshalJSON implements json.Unmarshaler.
func (j *DsaVerifySchemaV1Json) UnmarshalJSON(value []byte) error {
	var raw map[string]interface{}
	if err := json.Unmarshal(value, &raw); err != nil {
		return err
	}
	if _, ok := raw["algorithm"]; raw != nil && !ok {
		return fmt.Errorf("field algorithm in DsaVerifySchemaV1Json: required")
	}
	if _, ok := raw["header"]; raw != nil && !ok {
		return fmt.Errorf("field header in DsaVerifySchemaV1Json: required")
	}
	if _, ok := raw["notes"]; raw != nil && !ok {
		return fmt.Errorf("field notes in DsaVerifySchemaV1Json: required")
	}
	if _, ok := raw["numberOfTests"]; raw != nil && !ok {
		return fmt.Errorf("field numberOfTests in DsaVerifySchemaV1Json: required")
	}
	if _, ok := raw["schema"]; raw != nil && !ok {
		return fmt.Errorf("field schema in DsaVerifySchemaV1Json: required")
	}
	if _, ok := raw["testGroups"]; raw != nil && !ok {
		return fmt.Errorf("field testGroups in DsaVerifySchemaV1Json: required")
	}
	type Plain DsaVerifySchemaV1Json
	var plain Plain
	if err := json.Unmarshal(value, &plain); err != nil {
		return err
	}
	*j = DsaVerifySchemaV1Json(plain)
	return nil
}

// A test for checking elliptic curve domain parameters.
type EcCurveTest struct {
	// Source corresponds to the JSON schema field "source".
	Source Source `json:"source"`

	// Tests corresponds to the JSON schema field "tests".
	Tests []EcCurveTestTestsElem `json:"tests"`

	// Type corresponds to the JSON schema field "type".
	Type EcCurveTestType `json:"type"`
}

type EcCurveTestSchemaJson struct {
	// Algorithm corresponds to the JSON schema field "algorithm".
	Algorithm EcCurveTestSchemaJsonAlgorithm `json:"algorithm"`

	// DEPRECATED: prefer "source" property in test group
	GeneratorVersion *string `json:"generatorVersion,omitempty,omitzero"`

	// additional documentation
	Header []string `json:"header"`

	// Notes corresponds to the JSON schema field "notes".
	Notes Notes `json:"notes"`

	// the number of test vectors in this test
	NumberOfTests int `json:"numberOfTests"`

	// Schema corresponds to the JSON schema field "schema".
	Schema EcCurveTestSchemaJsonSchema `json:"schema"`

	// TestGroups corresponds to the JSON schema field "testGroups".
	TestGroups []EcCurveTest `json:"testGroups"`
}

type EcCurveTestSchemaJsonAlgorithm string

const EcCurveTestSchemaJsonAlgorithmEcCurveTest EcCurveTestSchemaJsonAlgorithm = "EcCurveTest"

var enumValues_EcCurveTestSchemaJsonAlgorithm = []interface{}{
	"EcCurveTest",
}

// UnmarshalJSON implements json.Unmarshaler.
func (j *EcCurveTestSchemaJsonAlgorithm) UnmarshalJSON(value []byte) error {
	var v string
	if err := json.Unmarshal(value, &v); err != nil {
		return err
	}
	var ok bool
	for _, expected := range enumValues_EcCurveTestSchemaJsonAlgorithm {
		if reflect.DeepEqual(v, expected) {
			ok = true
			break
		}
	}
	if !ok {
		return fmt.Errorf("invalid value (expected one of %#v): %#v", enumValues_EcCurveTestSchemaJsonAlgorithm, v)
	}
	*j = EcCurveTestSchemaJsonAlgorithm(v)
	return nil
}

type EcCurveTestSchemaJsonSchema string

const EcCurveTestSchemaJsonSchemaEcCurveTestSchemaJson EcCurveTestSchemaJsonSchema = "ec_curve_test_schema.json"

var enumValues_EcCurveTestSchemaJsonSchema = []interface{}{
	"ec_curve_test_schema.json",
}

// UnmarshalJSON implements json.Unmarshaler.
func (j *EcCurveTestSchemaJsonSchema) UnmarshalJSON(value []byte) error {
	var v string
	if err := json.Unmarshal(value, &v); err != nil {
		return err
	}
	var ok bool
	for _, expected := range enumValues_EcCurveTestSchemaJsonSchema {
		if reflect.DeepEqual(v, expected) {
			ok = true
			break
		}
	}
	if !ok {
		return fmt.Errorf("invalid value (expected one of %#v): %#v", enumValues_EcCurveTestSchemaJsonSchema, v)
	}
	*j = EcCurveTestSchemaJsonSchema(v)
	return nil
}

// UnmarshalJSON implements json.Unmarshaler.
func (j *EcCurveTestSchemaJson) UnmarshalJSON(value []byte) error {
	var raw map[string]interface{}
	if err := json.Unmarshal(value, &raw); err != nil {
		return err
	}
	if _, ok := raw["algorithm"]; raw != nil && !ok {
		return fmt.Errorf("field algorithm in EcCurveTestSchemaJson: required")
	}
	if _, ok := raw["header"]; raw != nil && !ok {
		return fmt.Errorf("field header in EcCurveTestSchemaJson: required")
	}
	if _, ok := raw["notes"]; raw != nil && !ok {
		return fmt.Errorf("field notes in EcCurveTestSchemaJson: required")
	}
	if _, ok := raw["numberOfTests"]; raw != nil && !ok {
		return fmt.Errorf("field numberOfTests in EcCurveTestSchemaJson: required")
	}
	if _, ok := raw["schema"]; raw != nil && !ok {
		return fmt.Errorf("field schema in EcCurveTestSchemaJson: required")
	}
	if _, ok := raw["testGroups"]; raw != nil && !ok {
		return fmt.Errorf("field testGroups in EcCurveTestSchemaJson: required")
	}
	type Plain EcCurveTestSchemaJson
	var plain Plain
	if err := json.Unmarshal(value, &plain); err != nil {
		return err
	}
	*j = EcCurveTestSchemaJson(plain)
	return nil
}

type EcCurveTestTestsElem struct {
	// Coefficient a of the curve's Weierstrass equation
	A string `json:"a"`

	// Coefficient b of the curve's Weierstrass equation
	B string `json:"b"`

	// A brief description of the test case
	Comment *string `json:"comment,omitempty,omitzero"`

	// A list of flags
	Flags []string `json:"flags,omitempty,omitzero"`

	// x coordinate of the curve's generator
	Gx string `json:"gx"`

	// y coordinate of the curve's generator
	Gy string `json:"gy"`

	// Cofactor of the curve
	H int `json:"h"`

	// Order of the curve
	N string `json:"n"`

	// Name identifying the elliptic curve
	Name *string `json:"name,omitempty,omitzero"`

	// Object identifier of the ellptic curve
	Oid string `json:"oid"`

	// Prime identifying the field of definition
	P string `json:"p"`

	// Standard containing the domain parameters
	Ref *string `json:"ref,omitempty,omitzero"`

	// Result corresponds to the JSON schema field "result".
	Result Result `json:"result"`

	// Identifier of the test case
	TcId int `json:"tcId"`
}

// UnmarshalJSON implements json.Unmarshaler.
func (j *EcCurveTestTestsElem) UnmarshalJSON(value []byte) error {
	var raw map[string]interface{}
	if err := json.Unmarshal(value, &raw); err != nil {
		return err
	}
	if _, ok := raw["a"]; raw != nil && !ok {
		return fmt.Errorf("field a in EcCurveTestTestsElem: required")
	}
	if _, ok := raw["b"]; raw != nil && !ok {
		return fmt.Errorf("field b in EcCurveTestTestsElem: required")
	}
	if _, ok := raw["gx"]; raw != nil && !ok {
		return fmt.Errorf("field gx in EcCurveTestTestsElem: required")
	}
	if _, ok := raw["gy"]; raw != nil && !ok {
		return fmt.Errorf("field gy in EcCurveTestTestsElem: required")
	}
	if _, ok := raw["h"]; raw != nil && !ok {
		return fmt.Errorf("field h in EcCurveTestTestsElem: required")
	}
	if _, ok := raw["n"]; raw != nil && !ok {
		return fmt.Errorf("field n in EcCurveTestTestsElem: required")
	}
	if _, ok := raw["oid"]; raw != nil && !ok {
		return fmt.Errorf("field oid in EcCurveTestTestsElem: required")
	}
	if _, ok := raw["p"]; raw != nil && !ok {
		return fmt.Errorf("field p in EcCurveTestTestsElem: required")
	}
	if _, ok := raw["result"]; raw != nil && !ok {
		return fmt.Errorf("field result in EcCurveTestTestsElem: required")
	}
	if _, ok := raw["tcId"]; raw != nil && !ok {
		return fmt.Errorf("field tcId in EcCurveTestTestsElem: required")
	}
	type Plain EcCurveTestTestsElem
	var plain Plain
	if err := json.Unmarshal(value, &plain); err != nil {
		return err
	}
	*j = EcCurveTestTestsElem(plain)
	return nil
}

type EcCurveTestType string

const EcCurveTestTypeEcCurveTest EcCurveTestType = "EcCurveTest"

var enumValues_EcCurveTestType = []interface{}{
	"EcCurveTest",
}

// UnmarshalJSON implements json.Unmarshaler.
func (j *EcCurveTestType) UnmarshalJSON(value []byte) error {
	var v string
	if err := json.Unmarshal(value, &v); err != nil {
		return err
	}
	var ok bool
	for _, expected := range enumValues_EcCurveTestType {
		if reflect.DeepEqual(v, expected) {
			ok = true
			break
		}
	}
	if !ok {
		return fmt.Errorf("invalid value (expected one of %#v): %#v", enumValues_EcCurveTestType, v)
	}
	*j = EcCurveTestType(v)
	return nil
}

// UnmarshalJSON implements json.Unmarshaler.
func (j *EcCurveTest) UnmarshalJSON(value []byte) error {
	var raw map[string]interface{}
	if err := json.Unmarshal(value, &raw); err != nil {
		return err
	}
	if _, ok := raw["source"]; raw != nil && !ok {
		return fmt.Errorf("field source in EcCurveTest: required")
	}
	if _, ok := raw["tests"]; raw != nil && !ok {
		return fmt.Errorf("field tests in EcCurveTest: required")
	}
	if _, ok := raw["type"]; raw != nil && !ok {
		return fmt.Errorf("field type in EcCurveTest: required")
	}
	type Plain EcCurveTest
	var plain Plain
	if err := json.Unmarshal(value, &plain); err != nil {
		return err
	}
	*j = EcCurveTest(plain)
	return nil
}

type EcPublicKey struct {
	// the EC group used by this public key
	Curve string `json:"curve"`

	// the key size in bits
	KeySize int `json:"keySize"`

	// the key type
	Type EcPublicKeyType `json:"type"`

	// encoded public key point
	Uncompressed string `json:"uncompressed"`

	// the x-coordinate of the public key point
	Wx string `json:"wx"`

	// the y-coordinate of the public key point
	Wy string `json:"wy"`
}

type EcPublicKeyType string

const EcPublicKeyTypeEcPublicKey EcPublicKeyType = "EcPublicKey"

var enumValues_EcPublicKeyType = []interface{}{
	"EcPublicKey",
}

// UnmarshalJSON implements json.Unmarshaler.
func (j *EcPublicKeyType) UnmarshalJSON(value []byte) error {
	var v string
	if err := json.Unmarshal(value, &v); err != nil {
		return err
	}
	var ok bool
	for _, expected := range enumValues_EcPublicKeyType {
		if reflect.DeepEqual(v, expected) {
			ok = true
			break
		}
	}
	if !ok {
		return fmt.Errorf("invalid value (expected one of %#v): %#v", enumValues_EcPublicKeyType, v)
	}
	*j = EcPublicKeyType(v)
	return nil
}

// UnmarshalJSON implements json.Unmarshaler.
func (j *EcPublicKey) UnmarshalJSON(value []byte) error {
	var raw map[string]interface{}
	if err := json.Unmarshal(value, &raw); err != nil {
		return err
	}
	if _, ok := raw["curve"]; raw != nil && !ok {
		return fmt.Errorf("field curve in EcPublicKey: required")
	}
	if _, ok := raw["keySize"]; raw != nil && !ok {
		return fmt.Errorf("field keySize in EcPublicKey: required")
	}
	if _, ok := raw["type"]; raw != nil && !ok {
		return fmt.Errorf("field type in EcPublicKey: required")
	}
	if _, ok := raw["uncompressed"]; raw != nil && !ok {
		return fmt.Errorf("field uncompressed in EcPublicKey: required")
	}
	if _, ok := raw["wx"]; raw != nil && !ok {
		return fmt.Errorf("field wx in EcPublicKey: required")
	}
	if _, ok := raw["wy"]; raw != nil && !ok {
		return fmt.Errorf("field wy in EcPublicKey: required")
	}
	type Plain EcPublicKey
	var plain Plain
	if err := json.Unmarshal(value, &plain); err != nil {
		return err
	}
	*j = EcPublicKey(plain)
	return nil
}

type EcdhEcpointTestGroup struct {
	// the name of the curve
	Curve string `json:"curve"`

	// the encoding of the public key
	Encoding string `json:"encoding"`

	// Source corresponds to the JSON schema field "source".
	Source Source `json:"source"`

	// Tests corresponds to the JSON schema field "tests".
	Tests []EcdhEcpointTestVector `json:"tests"`

	// Type corresponds to the JSON schema field "type".
	Type EcdhEcpointTestGroupType `json:"type"`
}

type EcdhEcpointTestGroupType string

const EcdhEcpointTestGroupTypeEcdhEcpointTest EcdhEcpointTestGroupType = "EcdhEcpointTest"

var enumValues_EcdhEcpointTestGroupType = []interface{}{
	"EcdhEcpointTest",
}

// UnmarshalJSON implements json.Unmarshaler.
func (j *EcdhEcpointTestGroupType) UnmarshalJSON(value []byte) error {
	var v string
	if err := json.Unmarshal(value, &v); err != nil {
		return err
	}
	var ok bool
	for _, expected := range enumValues_EcdhEcpointTestGroupType {
		if reflect.DeepEqual(v, expected) {
			ok = true
			break
		}
	}
	if !ok {
		return fmt.Errorf("invalid value (expected one of %#v): %#v", enumValues_EcdhEcpointTestGroupType, v)
	}
	*j = EcdhEcpointTestGroupType(v)
	return nil
}

// UnmarshalJSON implements json.Unmarshaler.
func (j *EcdhEcpointTestGroup) UnmarshalJSON(value []byte) error {
	var raw map[string]interface{}
	if err := json.Unmarshal(value, &raw); err != nil {
		return err
	}
	if _, ok := raw["curve"]; raw != nil && !ok {
		return fmt.Errorf("field curve in EcdhEcpointTestGroup: required")
	}
	if _, ok := raw["encoding"]; raw != nil && !ok {
		return fmt.Errorf("field encoding in EcdhEcpointTestGroup: required")
	}
	if _, ok := raw["source"]; raw != nil && !ok {
		return fmt.Errorf("field source in EcdhEcpointTestGroup: required")
	}
	if _, ok := raw["tests"]; raw != nil && !ok {
		return fmt.Errorf("field tests in EcdhEcpointTestGroup: required")
	}
	if _, ok := raw["type"]; raw != nil && !ok {
		return fmt.Errorf("field type in EcdhEcpointTestGroup: required")
	}
	type Plain EcdhEcpointTestGroup
	var plain Plain
	if err := json.Unmarshal(value, &plain); err != nil {
		return err
	}
	*j = EcdhEcpointTestGroup(plain)
	return nil
}

type EcdhEcpointTestSchemaV1Json struct {
	// the primitive tested in the test file
	Algorithm string `json:"algorithm"`

	// DEPRECATED: prefer "source" property in test group
	GeneratorVersion *string `json:"generatorVersion,omitempty,omitzero"`

	// additional documentation
	Header []string `json:"header"`

	// Notes corresponds to the JSON schema field "notes".
	Notes Notes `json:"notes"`

	// the number of test vectors in this test
	NumberOfTests int `json:"numberOfTests"`

	// Schema corresponds to the JSON schema field "schema".
	Schema EcdhEcpointTestSchemaV1JsonSchema `json:"schema"`

	// TestGroups corresponds to the JSON schema field "testGroups".
	TestGroups []EcdhEcpointTestGroup `json:"testGroups"`
}

type EcdhEcpointTestSchemaV1JsonSchema string

const EcdhEcpointTestSchemaV1JsonSchemaEcdhEcpointTestSchemaV1Json EcdhEcpointTestSchemaV1JsonSchema = "ecdh_ecpoint_test_schema_v1.json"

var enumValues_EcdhEcpointTestSchemaV1JsonSchema = []interface{}{
	"ecdh_ecpoint_test_schema_v1.json",
}

// UnmarshalJSON implements json.Unmarshaler.
func (j *EcdhEcpointTestSchemaV1JsonSchema) UnmarshalJSON(value []byte) error {
	var v string
	if err := json.Unmarshal(value, &v); err != nil {
		return err
	}
	var ok bool
	for _, expected := range enumValues_EcdhEcpointTestSchemaV1JsonSchema {
		if reflect.DeepEqual(v, expected) {
			ok = true
			break
		}
	}
	if !ok {
		return fmt.Errorf("invalid value (expected one of %#v): %#v", enumValues_EcdhEcpointTestSchemaV1JsonSchema, v)
	}
	*j = EcdhEcpointTestSchemaV1JsonSchema(v)
	return nil
}

// UnmarshalJSON implements json.Unmarshaler.
func (j *EcdhEcpointTestSchemaV1Json) UnmarshalJSON(value []byte) error {
	var raw map[string]interface{}
	if err := json.Unmarshal(value, &raw); err != nil {
		return err
	}
	if _, ok := raw["algorithm"]; raw != nil && !ok {
		return fmt.Errorf("field algorithm in EcdhEcpointTestSchemaV1Json: required")
	}
	if _, ok := raw["header"]; raw != nil && !ok {
		return fmt.Errorf("field header in EcdhEcpointTestSchemaV1Json: required")
	}
	if _, ok := raw["notes"]; raw != nil && !ok {
		return fmt.Errorf("field notes in EcdhEcpointTestSchemaV1Json: required")
	}
	if _, ok := raw["numberOfTests"]; raw != nil && !ok {
		return fmt.Errorf("field numberOfTests in EcdhEcpointTestSchemaV1Json: required")
	}
	if _, ok := raw["schema"]; raw != nil && !ok {
		return fmt.Errorf("field schema in EcdhEcpointTestSchemaV1Json: required")
	}
	if _, ok := raw["testGroups"]; raw != nil && !ok {
		return fmt.Errorf("field testGroups in EcdhEcpointTestSchemaV1Json: required")
	}
	type Plain EcdhEcpointTestSchemaV1Json
	var plain Plain
	if err := json.Unmarshal(value, &plain); err != nil {
		return err
	}
	*j = EcdhEcpointTestSchemaV1Json(plain)
	return nil
}

type EcdhEcpointTestVector struct {
	// A brief description of the test case
	Comment string `json:"comment"`

	// A list of flags
	Flags []string `json:"flags"`

	// The private exponent
	Private string `json:"private"`

	// ASN encoded public point
	Public string `json:"public"`

	// Result corresponds to the JSON schema field "result".
	Result Result `json:"result"`

	// The shared secret key
	Shared string `json:"shared"`

	// Identifier of the test case
	TcId int `json:"tcId"`
}

// UnmarshalJSON implements json.Unmarshaler.
func (j *EcdhEcpointTestVector) UnmarshalJSON(value []byte) error {
	var raw map[string]interface{}
	if err := json.Unmarshal(value, &raw); err != nil {
		return err
	}
	if _, ok := raw["comment"]; raw != nil && !ok {
		return fmt.Errorf("field comment in EcdhEcpointTestVector: required")
	}
	if _, ok := raw["flags"]; raw != nil && !ok {
		return fmt.Errorf("field flags in EcdhEcpointTestVector: required")
	}
	if _, ok := raw["private"]; raw != nil && !ok {
		return fmt.Errorf("field private in EcdhEcpointTestVector: required")
	}
	if _, ok := raw["public"]; raw != nil && !ok {
		return fmt.Errorf("field public in EcdhEcpointTestVector: required")
	}
	if _, ok := raw["result"]; raw != nil && !ok {
		return fmt.Errorf("field result in EcdhEcpointTestVector: required")
	}
	if _, ok := raw["shared"]; raw != nil && !ok {
		return fmt.Errorf("field shared in EcdhEcpointTestVector: required")
	}
	if _, ok := raw["tcId"]; raw != nil && !ok {
		return fmt.Errorf("field tcId in EcdhEcpointTestVector: required")
	}
	type Plain EcdhEcpointTestVector
	var plain Plain
	if err := json.Unmarshal(value, &plain); err != nil {
		return err
	}
	*j = EcdhEcpointTestVector(plain)
	return nil
}

type EcdhPemTestGroup struct {
	// the name of the curve
	Curve string `json:"curve"`

	// the encoding of the public key
	Encoding string `json:"encoding"`

	// Source corresponds to the JSON schema field "source".
	Source Source `json:"source"`

	// Tests corresponds to the JSON schema field "tests".
	Tests []EcdhPemTestVector `json:"tests"`

	// Type corresponds to the JSON schema field "type".
	Type EcdhPemTestGroupType `json:"type"`
}

type EcdhPemTestGroupType string

const EcdhPemTestGroupTypeEcdhPemTest EcdhPemTestGroupType = "EcdhPemTest"

var enumValues_EcdhPemTestGroupType = []interface{}{
	"EcdhPemTest",
}

// UnmarshalJSON implements json.Unmarshaler.
func (j *EcdhPemTestGroupType) UnmarshalJSON(value []byte) error {
	var v string
	if err := json.Unmarshal(value, &v); err != nil {
		return err
	}
	var ok bool
	for _, expected := range enumValues_EcdhPemTestGroupType {
		if reflect.DeepEqual(v, expected) {
			ok = true
			break
		}
	}
	if !ok {
		return fmt.Errorf("invalid value (expected one of %#v): %#v", enumValues_EcdhPemTestGroupType, v)
	}
	*j = EcdhPemTestGroupType(v)
	return nil
}

// UnmarshalJSON implements json.Unmarshaler.
func (j *EcdhPemTestGroup) UnmarshalJSON(value []byte) error {
	var raw map[string]interface{}
	if err := json.Unmarshal(value, &raw); err != nil {
		return err
	}
	if _, ok := raw["curve"]; raw != nil && !ok {
		return fmt.Errorf("field curve in EcdhPemTestGroup: required")
	}
	if _, ok := raw["encoding"]; raw != nil && !ok {
		return fmt.Errorf("field encoding in EcdhPemTestGroup: required")
	}
	if _, ok := raw["source"]; raw != nil && !ok {
		return fmt.Errorf("field source in EcdhPemTestGroup: required")
	}
	if _, ok := raw["tests"]; raw != nil && !ok {
		return fmt.Errorf("field tests in EcdhPemTestGroup: required")
	}
	if _, ok := raw["type"]; raw != nil && !ok {
		return fmt.Errorf("field type in EcdhPemTestGroup: required")
	}
	type Plain EcdhPemTestGroup
	var plain Plain
	if err := json.Unmarshal(value, &plain); err != nil {
		return err
	}
	*j = EcdhPemTestGroup(plain)
	return nil
}

type EcdhPemTestSchemaV1Json struct {
	// the primitive tested in the test file
	Algorithm string `json:"algorithm"`

	// DEPRECATED: prefer "source" property in test group
	GeneratorVersion *string `json:"generatorVersion,omitempty,omitzero"`

	// additional documentation
	Header []string `json:"header"`

	// Notes corresponds to the JSON schema field "notes".
	Notes Notes `json:"notes"`

	// the number of test vectors in this test
	NumberOfTests int `json:"numberOfTests"`

	// Schema corresponds to the JSON schema field "schema".
	Schema EcdhPemTestSchemaV1JsonSchema `json:"schema"`

	// TestGroups corresponds to the JSON schema field "testGroups".
	TestGroups []EcdhPemTestGroup `json:"testGroups"`
}

type EcdhPemTestSchemaV1JsonSchema string

const EcdhPemTestSchemaV1JsonSchemaEcdhPemTestSchemaV1Json EcdhPemTestSchemaV1JsonSchema = "ecdh_pem_test_schema_v1.json"

var enumValues_EcdhPemTestSchemaV1JsonSchema = []interface{}{
	"ecdh_pem_test_schema_v1.json",
}

// UnmarshalJSON implements json.Unmarshaler.
func (j *EcdhPemTestSchemaV1JsonSchema) UnmarshalJSON(value []byte) error {
	var v string
	if err := json.Unmarshal(value, &v); err != nil {
		return err
	}
	var ok bool
	for _, expected := range enumValues_EcdhPemTestSchemaV1JsonSchema {
		if reflect.DeepEqual(v, expected) {
			ok = true
			break
		}
	}
	if !ok {
		return fmt.Errorf("invalid value (expected one of %#v): %#v", enumValues_EcdhPemTestSchemaV1JsonSchema, v)
	}
	*j = EcdhPemTestSchemaV1JsonSchema(v)
	return nil
}

// UnmarshalJSON implements json.Unmarshaler.
func (j *EcdhPemTestSchemaV1Json) UnmarshalJSON(value []byte) error {
	var raw map[string]interface{}
	if err := json.Unmarshal(value, &raw); err != nil {
		return err
	}
	if _, ok := raw["algorithm"]; raw != nil && !ok {
		return fmt.Errorf("field algorithm in EcdhPemTestSchemaV1Json: required")
	}
	if _, ok := raw["header"]; raw != nil && !ok {
		return fmt.Errorf("field header in EcdhPemTestSchemaV1Json: required")
	}
	if _, ok := raw["notes"]; raw != nil && !ok {
		return fmt.Errorf("field notes in EcdhPemTestSchemaV1Json: required")
	}
	if _, ok := raw["numberOfTests"]; raw != nil && !ok {
		return fmt.Errorf("field numberOfTests in EcdhPemTestSchemaV1Json: required")
	}
	if _, ok := raw["schema"]; raw != nil && !ok {
		return fmt.Errorf("field schema in EcdhPemTestSchemaV1Json: required")
	}
	if _, ok := raw["testGroups"]; raw != nil && !ok {
		return fmt.Errorf("field testGroups in EcdhPemTestSchemaV1Json: required")
	}
	type Plain EcdhPemTestSchemaV1Json
	var plain Plain
	if err := json.Unmarshal(value, &plain); err != nil {
		return err
	}
	*j = EcdhPemTestSchemaV1Json(plain)
	return nil
}

type EcdhPemTestVector struct {
	// A brief description of the test case
	Comment string `json:"comment"`

	// A list of flags
	Flags []string `json:"flags"`

	// Pem encoded private key
	Private string `json:"private"`

	// Pem encoded public key
	Public string `json:"public"`

	// Result corresponds to the JSON schema field "result".
	Result Result `json:"result"`

	// The shared secret key
	Shared string `json:"shared"`

	// Identifier of the test case
	TcId int `json:"tcId"`
}

// UnmarshalJSON implements json.Unmarshaler.
func (j *EcdhPemTestVector) UnmarshalJSON(value []byte) error {
	var raw map[string]interface{}
	if err := json.Unmarshal(value, &raw); err != nil {
		return err
	}
	if _, ok := raw["comment"]; raw != nil && !ok {
		return fmt.Errorf("field comment in EcdhPemTestVector: required")
	}
	if _, ok := raw["flags"]; raw != nil && !ok {
		return fmt.Errorf("field flags in EcdhPemTestVector: required")
	}
	if _, ok := raw["private"]; raw != nil && !ok {
		return fmt.Errorf("field private in EcdhPemTestVector: required")
	}
	if _, ok := raw["public"]; raw != nil && !ok {
		return fmt.Errorf("field public in EcdhPemTestVector: required")
	}
	if _, ok := raw["result"]; raw != nil && !ok {
		return fmt.Errorf("field result in EcdhPemTestVector: required")
	}
	if _, ok := raw["shared"]; raw != nil && !ok {
		return fmt.Errorf("field shared in EcdhPemTestVector: required")
	}
	if _, ok := raw["tcId"]; raw != nil && !ok {
		return fmt.Errorf("field tcId in EcdhPemTestVector: required")
	}
	type Plain EcdhPemTestVector
	var plain Plain
	if err := json.Unmarshal(value, &plain); err != nil {
		return err
	}
	*j = EcdhPemTestVector(plain)
	return nil
}

type EcdhTestGroup struct {
	// the name of the curve
	Curve string `json:"curve"`

	// the encoding of the public key
	Encoding string `json:"encoding"`

	// Source corresponds to the JSON schema field "source".
	Source Source `json:"source"`

	// Tests corresponds to the JSON schema field "tests".
	Tests []EcdhTestVector `json:"tests"`

	// Type corresponds to the JSON schema field "type".
	Type EcdhTestGroupType `json:"type"`
}

type EcdhTestGroupType string

const EcdhTestGroupTypeEcdhTest EcdhTestGroupType = "EcdhTest"

var enumValues_EcdhTestGroupType = []interface{}{
	"EcdhTest",
}

// UnmarshalJSON implements json.Unmarshaler.
func (j *EcdhTestGroupType) UnmarshalJSON(value []byte) error {
	var v string
	if err := json.Unmarshal(value, &v); err != nil {
		return err
	}
	var ok bool
	for _, expected := range enumValues_EcdhTestGroupType {
		if reflect.DeepEqual(v, expected) {
			ok = true
			break
		}
	}
	if !ok {
		return fmt.Errorf("invalid value (expected one of %#v): %#v", enumValues_EcdhTestGroupType, v)
	}
	*j = EcdhTestGroupType(v)
	return nil
}

// UnmarshalJSON implements json.Unmarshaler.
func (j *EcdhTestGroup) UnmarshalJSON(value []byte) error {
	var raw map[string]interface{}
	if err := json.Unmarshal(value, &raw); err != nil {
		return err
	}
	if _, ok := raw["curve"]; raw != nil && !ok {
		return fmt.Errorf("field curve in EcdhTestGroup: required")
	}
	if _, ok := raw["encoding"]; raw != nil && !ok {
		return fmt.Errorf("field encoding in EcdhTestGroup: required")
	}
	if _, ok := raw["source"]; raw != nil && !ok {
		return fmt.Errorf("field source in EcdhTestGroup: required")
	}
	if _, ok := raw["tests"]; raw != nil && !ok {
		return fmt.Errorf("field tests in EcdhTestGroup: required")
	}
	if _, ok := raw["type"]; raw != nil && !ok {
		return fmt.Errorf("field type in EcdhTestGroup: required")
	}
	type Plain EcdhTestGroup
	var plain Plain
	if err := json.Unmarshal(value, &plain); err != nil {
		return err
	}
	*j = EcdhTestGroup(plain)
	return nil
}

type EcdhTestSchemaV1Json struct {
	// the primitive tested in the test file
	Algorithm string `json:"algorithm"`

	// DEPRECATED: prefer "source" property in test group
	GeneratorVersion *string `json:"generatorVersion,omitempty,omitzero"`

	// additional documentation
	Header []string `json:"header"`

	// Notes corresponds to the JSON schema field "notes".
	Notes Notes `json:"notes"`

	// the number of test vectors in this test
	NumberOfTests int `json:"numberOfTests"`

	// Schema corresponds to the JSON schema field "schema".
	Schema EcdhTestSchemaV1JsonSchema `json:"schema"`

	// TestGroups corresponds to the JSON schema field "testGroups".
	TestGroups []EcdhTestGroup `json:"testGroups"`
}

type EcdhTestSchemaV1JsonSchema string

const EcdhTestSchemaV1JsonSchemaEcdhTestSchemaV1Json EcdhTestSchemaV1JsonSchema = "ecdh_test_schema_v1.json"

var enumValues_EcdhTestSchemaV1JsonSchema = []interface{}{
	"ecdh_test_schema_v1.json",
}

// UnmarshalJSON implements json.Unmarshaler.
func (j *EcdhTestSchemaV1JsonSchema) UnmarshalJSON(value []byte) error {
	var v string
	if err := json.Unmarshal(value, &v); err != nil {
		return err
	}
	var ok bool
	for _, expected := range enumValues_EcdhTestSchemaV1JsonSchema {
		if reflect.DeepEqual(v, expected) {
			ok = true
			break
		}
	}
	if !ok {
		return fmt.Errorf("invalid value (expected one of %#v): %#v", enumValues_EcdhTestSchemaV1JsonSchema, v)
	}
	*j = EcdhTestSchemaV1JsonSchema(v)
	return nil
}

// UnmarshalJSON implements json.Unmarshaler.
func (j *EcdhTestSchemaV1Json) UnmarshalJSON(value []byte) error {
	var raw map[string]interface{}
	if err := json.Unmarshal(value, &raw); err != nil {
		return err
	}
	if _, ok := raw["algorithm"]; raw != nil && !ok {
		return fmt.Errorf("field algorithm in EcdhTestSchemaV1Json: required")
	}
	if _, ok := raw["header"]; raw != nil && !ok {
		return fmt.Errorf("field header in EcdhTestSchemaV1Json: required")
	}
	if _, ok := raw["notes"]; raw != nil && !ok {
		return fmt.Errorf("field notes in EcdhTestSchemaV1Json: required")
	}
	if _, ok := raw["numberOfTests"]; raw != nil && !ok {
		return fmt.Errorf("field numberOfTests in EcdhTestSchemaV1Json: required")
	}
	if _, ok := raw["schema"]; raw != nil && !ok {
		return fmt.Errorf("field schema in EcdhTestSchemaV1Json: required")
	}
	if _, ok := raw["testGroups"]; raw != nil && !ok {
		return fmt.Errorf("field testGroups in EcdhTestSchemaV1Json: required")
	}
	type Plain EcdhTestSchemaV1Json
	var plain Plain
	if err := json.Unmarshal(value, &plain); err != nil {
		return err
	}
	*j = EcdhTestSchemaV1Json(plain)
	return nil
}

type EcdhTestVector struct {
	// A brief description of the test case
	Comment string `json:"comment"`

	// A list of flags
	Flags []string `json:"flags"`

	// the private key
	Private string `json:"private"`

	// Encoded public key
	Public string `json:"public"`

	// Result corresponds to the JSON schema field "result".
	Result Result `json:"result"`

	// The shared secret key
	Shared string `json:"shared"`

	// Identifier of the test case
	TcId int `json:"tcId"`
}

// UnmarshalJSON implements json.Unmarshaler.
func (j *EcdhTestVector) UnmarshalJSON(value []byte) error {
	var raw map[string]interface{}
	if err := json.Unmarshal(value, &raw); err != nil {
		return err
	}
	if _, ok := raw["comment"]; raw != nil && !ok {
		return fmt.Errorf("field comment in EcdhTestVector: required")
	}
	if _, ok := raw["flags"]; raw != nil && !ok {
		return fmt.Errorf("field flags in EcdhTestVector: required")
	}
	if _, ok := raw["private"]; raw != nil && !ok {
		return fmt.Errorf("field private in EcdhTestVector: required")
	}
	if _, ok := raw["public"]; raw != nil && !ok {
		return fmt.Errorf("field public in EcdhTestVector: required")
	}
	if _, ok := raw["result"]; raw != nil && !ok {
		return fmt.Errorf("field result in EcdhTestVector: required")
	}
	if _, ok := raw["shared"]; raw != nil && !ok {
		return fmt.Errorf("field shared in EcdhTestVector: required")
	}
	if _, ok := raw["tcId"]; raw != nil && !ok {
		return fmt.Errorf("field tcId in EcdhTestVector: required")
	}
	type Plain EcdhTestVector
	var plain Plain
	if err := json.Unmarshal(value, &plain); err != nil {
		return err
	}
	*j = EcdhTestVector(plain)
	return nil
}

type EcdhWebcryptoTestGroup struct {
	// the name of the curve
	Curve string `json:"curve"`

	// the encoding of the public key
	Encoding string `json:"encoding"`

	// Source corresponds to the JSON schema field "source".
	Source Source `json:"source"`

	// Tests corresponds to the JSON schema field "tests".
	Tests []EcdhWebcryptoTestVector `json:"tests"`

	// Type corresponds to the JSON schema field "type".
	Type EcdhWebcryptoTestGroupType `json:"type"`
}

type EcdhWebcryptoTestGroupType string

const EcdhWebcryptoTestGroupTypeEcdhWebcryptoTest EcdhWebcryptoTestGroupType = "EcdhWebcryptoTest"

var enumValues_EcdhWebcryptoTestGroupType = []interface{}{
	"EcdhWebcryptoTest",
}

// UnmarshalJSON implements json.Unmarshaler.
func (j *EcdhWebcryptoTestGroupType) UnmarshalJSON(value []byte) error {
	var v string
	if err := json.Unmarshal(value, &v); err != nil {
		return err
	}
	var ok bool
	for _, expected := range enumValues_EcdhWebcryptoTestGroupType {
		if reflect.DeepEqual(v, expected) {
			ok = true
			break
		}
	}
	if !ok {
		return fmt.Errorf("invalid value (expected one of %#v): %#v", enumValues_EcdhWebcryptoTestGroupType, v)
	}
	*j = EcdhWebcryptoTestGroupType(v)
	return nil
}

// UnmarshalJSON implements json.Unmarshaler.
func (j *EcdhWebcryptoTestGroup) UnmarshalJSON(value []byte) error {
	var raw map[string]interface{}
	if err := json.Unmarshal(value, &raw); err != nil {
		return err
	}
	if _, ok := raw["curve"]; raw != nil && !ok {
		return fmt.Errorf("field curve in EcdhWebcryptoTestGroup: required")
	}
	if _, ok := raw["encoding"]; raw != nil && !ok {
		return fmt.Errorf("field encoding in EcdhWebcryptoTestGroup: required")
	}
	if _, ok := raw["source"]; raw != nil && !ok {
		return fmt.Errorf("field source in EcdhWebcryptoTestGroup: required")
	}
	if _, ok := raw["tests"]; raw != nil && !ok {
		return fmt.Errorf("field tests in EcdhWebcryptoTestGroup: required")
	}
	if _, ok := raw["type"]; raw != nil && !ok {
		return fmt.Errorf("field type in EcdhWebcryptoTestGroup: required")
	}
	type Plain EcdhWebcryptoTestGroup
	var plain Plain
	if err := json.Unmarshal(value, &plain); err != nil {
		return err
	}
	*j = EcdhWebcryptoTestGroup(plain)
	return nil
}

type EcdhWebcryptoTestSchemaV1Json struct {
	// the primitive tested in the test file
	Algorithm string `json:"algorithm"`

	// DEPRECATED: prefer "source" property in test group
	GeneratorVersion *string `json:"generatorVersion,omitempty,omitzero"`

	// additional documentation
	Header []string `json:"header"`

	// Notes corresponds to the JSON schema field "notes".
	Notes Notes `json:"notes"`

	// the number of test vectors in this test
	NumberOfTests int `json:"numberOfTests"`

	// Schema corresponds to the JSON schema field "schema".
	Schema EcdhWebcryptoTestSchemaV1JsonSchema `json:"schema"`

	// TestGroups corresponds to the JSON schema field "testGroups".
	TestGroups []EcdhWebcryptoTestGroup `json:"testGroups"`
}

type EcdhWebcryptoTestSchemaV1JsonSchema string

const EcdhWebcryptoTestSchemaV1JsonSchemaEcdhWebcryptoTestSchemaV1Json EcdhWebcryptoTestSchemaV1JsonSchema = "ecdh_webcrypto_test_schema_v1.json"

var enumValues_EcdhWebcryptoTestSchemaV1JsonSchema = []interface{}{
	"ecdh_webcrypto_test_schema_v1.json",
}

// UnmarshalJSON implements json.Unmarshaler.
func (j *EcdhWebcryptoTestSchemaV1JsonSchema) UnmarshalJSON(value []byte) error {
	var v string
	if err := json.Unmarshal(value, &v); err != nil {
		return err
	}
	var ok bool
	for _, expected := range enumValues_EcdhWebcryptoTestSchemaV1JsonSchema {
		if reflect.DeepEqual(v, expected) {
			ok = true
			break
		}
	}
	if !ok {
		return fmt.Errorf("invalid value (expected one of %#v): %#v", enumValues_EcdhWebcryptoTestSchemaV1JsonSchema, v)
	}
	*j = EcdhWebcryptoTestSchemaV1JsonSchema(v)
	return nil
}

// UnmarshalJSON implements json.Unmarshaler.
func (j *EcdhWebcryptoTestSchemaV1Json) UnmarshalJSON(value []byte) error {
	var raw map[string]interface{}
	if err := json.Unmarshal(value, &raw); err != nil {
		return err
	}
	if _, ok := raw["algorithm"]; raw != nil && !ok {
		return fmt.Errorf("field algorithm in EcdhWebcryptoTestSchemaV1Json: required")
	}
	if _, ok := raw["header"]; raw != nil && !ok {
		return fmt.Errorf("field header in EcdhWebcryptoTestSchemaV1Json: required")
	}
	if _, ok := raw["notes"]; raw != nil && !ok {
		return fmt.Errorf("field notes in EcdhWebcryptoTestSchemaV1Json: required")
	}
	if _, ok := raw["numberOfTests"]; raw != nil && !ok {
		return fmt.Errorf("field numberOfTests in EcdhWebcryptoTestSchemaV1Json: required")
	}
	if _, ok := raw["schema"]; raw != nil && !ok {
		return fmt.Errorf("field schema in EcdhWebcryptoTestSchemaV1Json: required")
	}
	if _, ok := raw["testGroups"]; raw != nil && !ok {
		return fmt.Errorf("field testGroups in EcdhWebcryptoTestSchemaV1Json: required")
	}
	type Plain EcdhWebcryptoTestSchemaV1Json
	var plain Plain
	if err := json.Unmarshal(value, &plain); err != nil {
		return err
	}
	*j = EcdhWebcryptoTestSchemaV1Json(plain)
	return nil
}

type EcdhWebcryptoTestVector struct {
	// A brief description of the test case
	Comment string `json:"comment"`

	// A list of flags
	Flags []string `json:"flags"`

	// Private key in webcrypto format
	Private EcdhWebcryptoTestVectorPrivate `json:"private"`

	// Public key in webcrypto format
	Public EcdhWebcryptoTestVectorPublic `json:"public"`

	// Result corresponds to the JSON schema field "result".
	Result Result `json:"result"`

	// The shared secret key
	Shared string `json:"shared"`

	// Identifier of the test case
	TcId int `json:"tcId"`
}

// Private key in webcrypto format
type EcdhWebcryptoTestVectorPrivate map[string]interface{}

// Public key in webcrypto format
type EcdhWebcryptoTestVectorPublic map[string]interface{}

// UnmarshalJSON implements json.Unmarshaler.
func (j *EcdhWebcryptoTestVector) UnmarshalJSON(value []byte) error {
	var raw map[string]interface{}
	if err := json.Unmarshal(value, &raw); err != nil {
		return err
	}
	if _, ok := raw["comment"]; raw != nil && !ok {
		return fmt.Errorf("field comment in EcdhWebcryptoTestVector: required")
	}
	if _, ok := raw["flags"]; raw != nil && !ok {
		return fmt.Errorf("field flags in EcdhWebcryptoTestVector: required")
	}
	if _, ok := raw["private"]; raw != nil && !ok {
		return fmt.Errorf("field private in EcdhWebcryptoTestVector: required")
	}
	if _, ok := raw["public"]; raw != nil && !ok {
		return fmt.Errorf("field public in EcdhWebcryptoTestVector: required")
	}
	if _, ok := raw["result"]; raw != nil && !ok {
		return fmt.Errorf("field result in EcdhWebcryptoTestVector: required")
	}
	if _, ok := raw["shared"]; raw != nil && !ok {
		return fmt.Errorf("field shared in EcdhWebcryptoTestVector: required")
	}
	if _, ok := raw["tcId"]; raw != nil && !ok {
		return fmt.Errorf("field tcId in EcdhWebcryptoTestVector: required")
	}
	type Plain EcdhWebcryptoTestVector
	var plain Plain
	if err := json.Unmarshal(value, &plain); err != nil {
		return err
	}
	*j = EcdhWebcryptoTestVector(plain)
	return nil
}

type EcdsaP1363TestGroup struct {
	// unencoded EC public key
	PublicKey EcPublicKey `json:"publicKey"`

	// DER encoded public key
	PublicKeyDer string `json:"publicKeyDer"`

	// PublicKeyJwk corresponds to the JSON schema field "publicKeyJwk".
	PublicKeyJwk *JsonWebKey `json:"publicKeyJwk,omitempty,omitzero"`

	// Pem encoded public key
	PublicKeyPem string `json:"publicKeyPem"`

	// the hash function used for ECDSA
	Sha string `json:"sha"`

	// Source corresponds to the JSON schema field "source".
	Source Source `json:"source"`

	// Tests corresponds to the JSON schema field "tests".
	Tests []SignatureTestVector `json:"tests"`

	// Type corresponds to the JSON schema field "type".
	Type EcdsaP1363TestGroupType `json:"type"`
}

type EcdsaP1363TestGroupType string

const EcdsaP1363TestGroupTypeEcdsaP1363Verify EcdsaP1363TestGroupType = "EcdsaP1363Verify"

var enumValues_EcdsaP1363TestGroupType = []interface{}{
	"EcdsaP1363Verify",
}

// UnmarshalJSON implements json.Unmarshaler.
func (j *EcdsaP1363TestGroupType) UnmarshalJSON(value []byte) error {
	var v string
	if err := json.Unmarshal(value, &v); err != nil {
		return err
	}
	var ok bool
	for _, expected := range enumValues_EcdsaP1363TestGroupType {
		if reflect.DeepEqual(v, expected) {
			ok = true
			break
		}
	}
	if !ok {
		return fmt.Errorf("invalid value (expected one of %#v): %#v", enumValues_EcdsaP1363TestGroupType, v)
	}
	*j = EcdsaP1363TestGroupType(v)
	return nil
}

// UnmarshalJSON implements json.Unmarshaler.
func (j *EcdsaP1363TestGroup) UnmarshalJSON(value []byte) error {
	var raw map[string]interface{}
	if err := json.Unmarshal(value, &raw); err != nil {
		return err
	}
	if _, ok := raw["publicKey"]; raw != nil && !ok {
		return fmt.Errorf("field publicKey in EcdsaP1363TestGroup: required")
	}
	if _, ok := raw["publicKeyDer"]; raw != nil && !ok {
		return fmt.Errorf("field publicKeyDer in EcdsaP1363TestGroup: required")
	}
	if _, ok := raw["publicKeyPem"]; raw != nil && !ok {
		return fmt.Errorf("field publicKeyPem in EcdsaP1363TestGroup: required")
	}
	if _, ok := raw["sha"]; raw != nil && !ok {
		return fmt.Errorf("field sha in EcdsaP1363TestGroup: required")
	}
	if _, ok := raw["source"]; raw != nil && !ok {
		return fmt.Errorf("field source in EcdsaP1363TestGroup: required")
	}
	if _, ok := raw["tests"]; raw != nil && !ok {
		return fmt.Errorf("field tests in EcdsaP1363TestGroup: required")
	}
	if _, ok := raw["type"]; raw != nil && !ok {
		return fmt.Errorf("field type in EcdsaP1363TestGroup: required")
	}
	type Plain EcdsaP1363TestGroup
	var plain Plain
	if err := json.Unmarshal(value, &plain); err != nil {
		return err
	}
	*j = EcdsaP1363TestGroup(plain)
	return nil
}

type EcdsaP1363VerifySchemaV1Json struct {
	// the primitive tested in the test file
	Algorithm string `json:"algorithm"`

	// DEPRECATED: prefer "source" property in test group
	GeneratorVersion *string `json:"generatorVersion,omitempty,omitzero"`

	// additional documentation
	Header []string `json:"header"`

	// Notes corresponds to the JSON schema field "notes".
	Notes Notes `json:"notes"`

	// the number of test vectors in this test
	NumberOfTests int `json:"numberOfTests"`

	// Schema corresponds to the JSON schema field "schema".
	Schema EcdsaP1363VerifySchemaV1JsonSchema `json:"schema"`

	// TestGroups corresponds to the JSON schema field "testGroups".
	TestGroups []EcdsaP1363TestGroup `json:"testGroups"`
}

type EcdsaP1363VerifySchemaV1JsonSchema string

const EcdsaP1363VerifySchemaV1JsonSchemaEcdsaP1363VerifySchemaV1Json EcdsaP1363VerifySchemaV1JsonSchema = "ecdsa_p1363_verify_schema_v1.json"

var enumValues_EcdsaP1363VerifySchemaV1JsonSchema = []interface{}{
	"ecdsa_p1363_verify_schema_v1.json",
}

// UnmarshalJSON implements json.Unmarshaler.
func (j *EcdsaP1363VerifySchemaV1JsonSchema) UnmarshalJSON(value []byte) error {
	var v string
	if err := json.Unmarshal(value, &v); err != nil {
		return err
	}
	var ok bool
	for _, expected := range enumValues_EcdsaP1363VerifySchemaV1JsonSchema {
		if reflect.DeepEqual(v, expected) {
			ok = true
			break
		}
	}
	if !ok {
		return fmt.Errorf("invalid value (expected one of %#v): %#v", enumValues_EcdsaP1363VerifySchemaV1JsonSchema, v)
	}
	*j = EcdsaP1363VerifySchemaV1JsonSchema(v)
	return nil
}

// UnmarshalJSON implements json.Unmarshaler.
func (j *EcdsaP1363VerifySchemaV1Json) UnmarshalJSON(value []byte) error {
	var raw map[string]interface{}
	if err := json.Unmarshal(value, &raw); err != nil {
		return err
	}
	if _, ok := raw["algorithm"]; raw != nil && !ok {
		return fmt.Errorf("field algorithm in EcdsaP1363VerifySchemaV1Json: required")
	}
	if _, ok := raw["header"]; raw != nil && !ok {
		return fmt.Errorf("field header in EcdsaP1363VerifySchemaV1Json: required")
	}
	if _, ok := raw["notes"]; raw != nil && !ok {
		return fmt.Errorf("field notes in EcdsaP1363VerifySchemaV1Json: required")
	}
	if _, ok := raw["numberOfTests"]; raw != nil && !ok {
		return fmt.Errorf("field numberOfTests in EcdsaP1363VerifySchemaV1Json: required")
	}
	if _, ok := raw["schema"]; raw != nil && !ok {
		return fmt.Errorf("field schema in EcdsaP1363VerifySchemaV1Json: required")
	}
	if _, ok := raw["testGroups"]; raw != nil && !ok {
		return fmt.Errorf("field testGroups in EcdsaP1363VerifySchemaV1Json: required")
	}
	type Plain EcdsaP1363VerifySchemaV1Json
	var plain Plain
	if err := json.Unmarshal(value, &plain); err != nil {
		return err
	}
	*j = EcdsaP1363VerifySchemaV1Json(plain)
	return nil
}

type EcdsaTestGroup struct {
	// unencoded EC public key
	PublicKey EcPublicKey `json:"publicKey"`

	// DER encoded public key
	PublicKeyDer string `json:"publicKeyDer"`

	// Pem encoded public key
	PublicKeyPem string `json:"publicKeyPem"`

	// the hash function used for ECDSA
	Sha string `json:"sha"`

	// Source corresponds to the JSON schema field "source".
	Source Source `json:"source"`

	// Tests corresponds to the JSON schema field "tests".
	Tests []AsnSignatureTestVector `json:"tests"`

	// Type corresponds to the JSON schema field "type".
	Type EcdsaTestGroupType `json:"type"`
}

type EcdsaTestGroupType string

const EcdsaTestGroupTypeEcdsaVerify EcdsaTestGroupType = "EcdsaVerify"

var enumValues_EcdsaTestGroupType = []interface{}{
	"EcdsaVerify",
}

// UnmarshalJSON implements json.Unmarshaler.
func (j *EcdsaTestGroupType) UnmarshalJSON(value []byte) error {
	var v string
	if err := json.Unmarshal(value, &v); err != nil {
		return err
	}
	var ok bool
	for _, expected := range enumValues_EcdsaTestGroupType {
		if reflect.DeepEqual(v, expected) {
			ok = true
			break
		}
	}
	if !ok {
		return fmt.Errorf("invalid value (expected one of %#v): %#v", enumValues_EcdsaTestGroupType, v)
	}
	*j = EcdsaTestGroupType(v)
	return nil
}

// UnmarshalJSON implements json.Unmarshaler.
func (j *EcdsaTestGroup) UnmarshalJSON(value []byte) error {
	var raw map[string]interface{}
	if err := json.Unmarshal(value, &raw); err != nil {
		return err
	}
	if _, ok := raw["publicKey"]; raw != nil && !ok {
		return fmt.Errorf("field publicKey in EcdsaTestGroup: required")
	}
	if _, ok := raw["publicKeyDer"]; raw != nil && !ok {
		return fmt.Errorf("field publicKeyDer in EcdsaTestGroup: required")
	}
	if _, ok := raw["publicKeyPem"]; raw != nil && !ok {
		return fmt.Errorf("field publicKeyPem in EcdsaTestGroup: required")
	}
	if _, ok := raw["sha"]; raw != nil && !ok {
		return fmt.Errorf("field sha in EcdsaTestGroup: required")
	}
	if _, ok := raw["source"]; raw != nil && !ok {
		return fmt.Errorf("field source in EcdsaTestGroup: required")
	}
	if _, ok := raw["tests"]; raw != nil && !ok {
		return fmt.Errorf("field tests in EcdsaTestGroup: required")
	}
	if _, ok := raw["type"]; raw != nil && !ok {
		return fmt.Errorf("field type in EcdsaTestGroup: required")
	}
	type Plain EcdsaTestGroup
	var plain Plain
	if err := json.Unmarshal(value, &plain); err != nil {
		return err
	}
	*j = EcdsaTestGroup(plain)
	return nil
}

type EcdsaVerifySchemaV1Json struct {
	// the primitive tested in the test file
	Algorithm string `json:"algorithm"`

	// DEPRECATED: prefer "source" property in test group
	GeneratorVersion *string `json:"generatorVersion,omitempty,omitzero"`

	// additional documentation
	Header []string `json:"header"`

	// Notes corresponds to the JSON schema field "notes".
	Notes Notes `json:"notes"`

	// the number of test vectors in this test
	NumberOfTests int `json:"numberOfTests"`

	// Schema corresponds to the JSON schema field "schema".
	Schema EcdsaVerifySchemaV1JsonSchema `json:"schema"`

	// TestGroups corresponds to the JSON schema field "testGroups".
	TestGroups []EcdsaTestGroup `json:"testGroups"`
}

type EcdsaVerifySchemaV1JsonSchema string

const EcdsaVerifySchemaV1JsonSchemaEcdsaVerifySchemaV1Json EcdsaVerifySchemaV1JsonSchema = "ecdsa_verify_schema_v1.json"

var enumValues_EcdsaVerifySchemaV1JsonSchema = []interface{}{
	"ecdsa_verify_schema_v1.json",
}

// UnmarshalJSON implements json.Unmarshaler.
func (j *EcdsaVerifySchemaV1JsonSchema) UnmarshalJSON(value []byte) error {
	var v string
	if err := json.Unmarshal(value, &v); err != nil {
		return err
	}
	var ok bool
	for _, expected := range enumValues_EcdsaVerifySchemaV1JsonSchema {
		if reflect.DeepEqual(v, expected) {
			ok = true
			break
		}
	}
	if !ok {
		return fmt.Errorf("invalid value (expected one of %#v): %#v", enumValues_EcdsaVerifySchemaV1JsonSchema, v)
	}
	*j = EcdsaVerifySchemaV1JsonSchema(v)
	return nil
}

// UnmarshalJSON implements json.Unmarshaler.
func (j *EcdsaVerifySchemaV1Json) UnmarshalJSON(value []byte) error {
	var raw map[string]interface{}
	if err := json.Unmarshal(value, &raw); err != nil {
		return err
	}
	if _, ok := raw["algorithm"]; raw != nil && !ok {
		return fmt.Errorf("field algorithm in EcdsaVerifySchemaV1Json: required")
	}
	if _, ok := raw["header"]; raw != nil && !ok {
		return fmt.Errorf("field header in EcdsaVerifySchemaV1Json: required")
	}
	if _, ok := raw["notes"]; raw != nil && !ok {
		return fmt.Errorf("field notes in EcdsaVerifySchemaV1Json: required")
	}
	if _, ok := raw["numberOfTests"]; raw != nil && !ok {
		return fmt.Errorf("field numberOfTests in EcdsaVerifySchemaV1Json: required")
	}
	if _, ok := raw["schema"]; raw != nil && !ok {
		return fmt.Errorf("field schema in EcdsaVerifySchemaV1Json: required")
	}
	if _, ok := raw["testGroups"]; raw != nil && !ok {
		return fmt.Errorf("field testGroups in EcdsaVerifySchemaV1Json: required")
	}
	type Plain EcdsaVerifySchemaV1Json
	var plain Plain
	if err := json.Unmarshal(value, &plain); err != nil {
		return err
	}
	*j = EcdsaVerifySchemaV1Json(plain)
	return nil
}

type EddsaTestGroup struct {
	// PublicKey corresponds to the JSON schema field "publicKey".
	PublicKey PublicKey `json:"publicKey"`

	// Asn encoded public key
	PublicKeyDer string `json:"publicKeyDer"`

	// the public key in webcrypto format
	PublicKeyJwk *JsonWebKey `json:"publicKeyJwk,omitempty,omitzero"`

	// PEM encoded public key
	PublicKeyPem string `json:"publicKeyPem"`

	// Source corresponds to the JSON schema field "source".
	Source Source `json:"source"`

	// Tests corresponds to the JSON schema field "tests".
	Tests []SignatureTestVector `json:"tests"`

	// Type corresponds to the JSON schema field "type".
	Type EddsaTestGroupType `json:"type"`
}

type EddsaTestGroupType string

const EddsaTestGroupTypeEddsaVerify EddsaTestGroupType = "EddsaVerify"

var enumValues_EddsaTestGroupType = []interface{}{
	"EddsaVerify",
}

// UnmarshalJSON implements json.Unmarshaler.
func (j *EddsaTestGroupType) UnmarshalJSON(value []byte) error {
	var v string
	if err := json.Unmarshal(value, &v); err != nil {
		return err
	}
	var ok bool
	for _, expected := range enumValues_EddsaTestGroupType {
		if reflect.DeepEqual(v, expected) {
			ok = true
			break
		}
	}
	if !ok {
		return fmt.Errorf("invalid value (expected one of %#v): %#v", enumValues_EddsaTestGroupType, v)
	}
	*j = EddsaTestGroupType(v)
	return nil
}

// UnmarshalJSON implements json.Unmarshaler.
func (j *EddsaTestGroup) UnmarshalJSON(value []byte) error {
	var raw map[string]interface{}
	if err := json.Unmarshal(value, &raw); err != nil {
		return err
	}
	if _, ok := raw["publicKey"]; raw != nil && !ok {
		return fmt.Errorf("field publicKey in EddsaTestGroup: required")
	}
	if _, ok := raw["publicKeyDer"]; raw != nil && !ok {
		return fmt.Errorf("field publicKeyDer in EddsaTestGroup: required")
	}
	if _, ok := raw["publicKeyPem"]; raw != nil && !ok {
		return fmt.Errorf("field publicKeyPem in EddsaTestGroup: required")
	}
	if _, ok := raw["source"]; raw != nil && !ok {
		return fmt.Errorf("field source in EddsaTestGroup: required")
	}
	if _, ok := raw["tests"]; raw != nil && !ok {
		return fmt.Errorf("field tests in EddsaTestGroup: required")
	}
	if _, ok := raw["type"]; raw != nil && !ok {
		return fmt.Errorf("field type in EddsaTestGroup: required")
	}
	type Plain EddsaTestGroup
	var plain Plain
	if err := json.Unmarshal(value, &plain); err != nil {
		return err
	}
	*j = EddsaTestGroup(plain)
	return nil
}

type EddsaVerifySchemaV1Json struct {
	// the primitive tested in the test file
	Algorithm string `json:"algorithm"`

	// DEPRECATED: prefer "source" property in test group
	GeneratorVersion *string `json:"generatorVersion,omitempty,omitzero"`

	// additional documentation
	Header []string `json:"header"`

	// Notes corresponds to the JSON schema field "notes".
	Notes Notes `json:"notes"`

	// the number of test vectors in this test
	NumberOfTests int `json:"numberOfTests"`

	// Schema corresponds to the JSON schema field "schema".
	Schema EddsaVerifySchemaV1JsonSchema `json:"schema"`

	// TestGroups corresponds to the JSON schema field "testGroups".
	TestGroups []EddsaTestGroup `json:"testGroups"`
}

type EddsaVerifySchemaV1JsonSchema string

const EddsaVerifySchemaV1JsonSchemaEddsaVerifySchemaV1Json EddsaVerifySchemaV1JsonSchema = "eddsa_verify_schema_v1.json"

var enumValues_EddsaVerifySchemaV1JsonSchema = []interface{}{
	"eddsa_verify_schema_v1.json",
}

// UnmarshalJSON implements json.Unmarshaler.
func (j *EddsaVerifySchemaV1JsonSchema) UnmarshalJSON(value []byte) error {
	var v string
	if err := json.Unmarshal(value, &v); err != nil {
		return err
	}
	var ok bool
	for _, expected := range enumValues_EddsaVerifySchemaV1JsonSchema {
		if reflect.DeepEqual(v, expected) {
			ok = true
			break
		}
	}
	if !ok {
		return fmt.Errorf("invalid value (expected one of %#v): %#v", enumValues_EddsaVerifySchemaV1JsonSchema, v)
	}
	*j = EddsaVerifySchemaV1JsonSchema(v)
	return nil
}

// UnmarshalJSON implements json.Unmarshaler.
func (j *EddsaVerifySchemaV1Json) UnmarshalJSON(value []byte) error {
	var raw map[string]interface{}
	if err := json.Unmarshal(value, &raw); err != nil {
		return err
	}
	if _, ok := raw["algorithm"]; raw != nil && !ok {
		return fmt.Errorf("field algorithm in EddsaVerifySchemaV1Json: required")
	}
	if _, ok := raw["header"]; raw != nil && !ok {
		return fmt.Errorf("field header in EddsaVerifySchemaV1Json: required")
	}
	if _, ok := raw["notes"]; raw != nil && !ok {
		return fmt.Errorf("field notes in EddsaVerifySchemaV1Json: required")
	}
	if _, ok := raw["numberOfTests"]; raw != nil && !ok {
		return fmt.Errorf("field numberOfTests in EddsaVerifySchemaV1Json: required")
	}
	if _, ok := raw["schema"]; raw != nil && !ok {
		return fmt.Errorf("field schema in EddsaVerifySchemaV1Json: required")
	}
	if _, ok := raw["testGroups"]; raw != nil && !ok {
		return fmt.Errorf("field testGroups in EddsaVerifySchemaV1Json: required")
	}
	type Plain EddsaVerifySchemaV1Json
	var plain Plain
	if err := json.Unmarshal(value, &plain); err != nil {
		return err
	}
	*j = EddsaVerifySchemaV1Json(plain)
	return nil
}

type HkdfTestGroup struct {
	// the size of the ikm in bits
	KeySize int `json:"keySize"`

	// Source corresponds to the JSON schema field "source".
	Source Source `json:"source"`

	// Tests corresponds to the JSON schema field "tests".
	Tests []HkdfTestVector `json:"tests"`

	// Type corresponds to the JSON schema field "type".
	Type HkdfTestGroupType `json:"type"`
}

type HkdfTestGroupType string

const HkdfTestGroupTypeHkdfTest HkdfTestGroupType = "HkdfTest"

var enumValues_HkdfTestGroupType = []interface{}{
	"HkdfTest",
}

// UnmarshalJSON implements json.Unmarshaler.
func (j *HkdfTestGroupType) UnmarshalJSON(value []byte) error {
	var v string
	if err := json.Unmarshal(value, &v); err != nil {
		return err
	}
	var ok bool
	for _, expected := range enumValues_HkdfTestGroupType {
		if reflect.DeepEqual(v, expected) {
			ok = true
			break
		}
	}
	if !ok {
		return fmt.Errorf("invalid value (expected one of %#v): %#v", enumValues_HkdfTestGroupType, v)
	}
	*j = HkdfTestGroupType(v)
	return nil
}

// UnmarshalJSON implements json.Unmarshaler.
func (j *HkdfTestGroup) UnmarshalJSON(value []byte) error {
	var raw map[string]interface{}
	if err := json.Unmarshal(value, &raw); err != nil {
		return err
	}
	if _, ok := raw["keySize"]; raw != nil && !ok {
		return fmt.Errorf("field keySize in HkdfTestGroup: required")
	}
	if _, ok := raw["source"]; raw != nil && !ok {
		return fmt.Errorf("field source in HkdfTestGroup: required")
	}
	if _, ok := raw["tests"]; raw != nil && !ok {
		return fmt.Errorf("field tests in HkdfTestGroup: required")
	}
	if _, ok := raw["type"]; raw != nil && !ok {
		return fmt.Errorf("field type in HkdfTestGroup: required")
	}
	type Plain HkdfTestGroup
	var plain Plain
	if err := json.Unmarshal(value, &plain); err != nil {
		return err
	}
	*j = HkdfTestGroup(plain)
	return nil
}

type HkdfTestSchemaV1Json struct {
	// the primitive tested in the test file
	Algorithm string `json:"algorithm"`

	// DEPRECATED: prefer "source" property in test group
	GeneratorVersion *string `json:"generatorVersion,omitempty,omitzero"`

	// additional documentation
	Header []string `json:"header"`

	// Notes corresponds to the JSON schema field "notes".
	Notes Notes `json:"notes"`

	// the number of test vectors in this test
	NumberOfTests int `json:"numberOfTests"`

	// Schema corresponds to the JSON schema field "schema".
	Schema HkdfTestSchemaV1JsonSchema `json:"schema"`

	// TestGroups corresponds to the JSON schema field "testGroups".
	TestGroups []HkdfTestGroup `json:"testGroups"`
}

type HkdfTestSchemaV1JsonSchema string

const HkdfTestSchemaV1JsonSchemaHkdfTestSchemaV1Json HkdfTestSchemaV1JsonSchema = "hkdf_test_schema_v1.json"

var enumValues_HkdfTestSchemaV1JsonSchema = []interface{}{
	"hkdf_test_schema_v1.json",
}

// UnmarshalJSON implements json.Unmarshaler.
func (j *HkdfTestSchemaV1JsonSchema) UnmarshalJSON(value []byte) error {
	var v string
	if err := json.Unmarshal(value, &v); err != nil {
		return err
	}
	var ok bool
	for _, expected := range enumValues_HkdfTestSchemaV1JsonSchema {
		if reflect.DeepEqual(v, expected) {
			ok = true
			break
		}
	}
	if !ok {
		return fmt.Errorf("invalid value (expected one of %#v): %#v", enumValues_HkdfTestSchemaV1JsonSchema, v)
	}
	*j = HkdfTestSchemaV1JsonSchema(v)
	return nil
}

// UnmarshalJSON implements json.Unmarshaler.
func (j *HkdfTestSchemaV1Json) UnmarshalJSON(value []byte) error {
	var raw map[string]interface{}
	if err := json.Unmarshal(value, &raw); err != nil {
		return err
	}
	if _, ok := raw["algorithm"]; raw != nil && !ok {
		return fmt.Errorf("field algorithm in HkdfTestSchemaV1Json: required")
	}
	if _, ok := raw["header"]; raw != nil && !ok {
		return fmt.Errorf("field header in HkdfTestSchemaV1Json: required")
	}
	if _, ok := raw["notes"]; raw != nil && !ok {
		return fmt.Errorf("field notes in HkdfTestSchemaV1Json: required")
	}
	if _, ok := raw["numberOfTests"]; raw != nil && !ok {
		return fmt.Errorf("field numberOfTests in HkdfTestSchemaV1Json: required")
	}
	if _, ok := raw["schema"]; raw != nil && !ok {
		return fmt.Errorf("field schema in HkdfTestSchemaV1Json: required")
	}
	if _, ok := raw["testGroups"]; raw != nil && !ok {
		return fmt.Errorf("field testGroups in HkdfTestSchemaV1Json: required")
	}
	type Plain HkdfTestSchemaV1Json
	var plain Plain
	if err := json.Unmarshal(value, &plain); err != nil {
		return err
	}
	*j = HkdfTestSchemaV1Json(plain)
	return nil
}

type HkdfTestVector struct {
	// A brief description of the test case
	Comment string `json:"comment"`

	// A list of flags
	Flags []string `json:"flags"`

	// the key (input key material)
	Ikm string `json:"ikm"`

	// additional information used in the key derivation
	Info string `json:"info"`

	// the generated bytes (output key material)
	Okm string `json:"okm"`

	// Result corresponds to the JSON schema field "result".
	Result Result `json:"result"`

	// the salt for the key derivation
	Salt string `json:"salt"`

	// the size of the output in bytes
	Size int `json:"size"`

	// Identifier of the test case
	TcId int `json:"tcId"`
}

// UnmarshalJSON implements json.Unmarshaler.
func (j *HkdfTestVector) UnmarshalJSON(value []byte) error {
	var raw map[string]interface{}
	if err := json.Unmarshal(value, &raw); err != nil {
		return err
	}
	if _, ok := raw["comment"]; raw != nil && !ok {
		return fmt.Errorf("field comment in HkdfTestVector: required")
	}
	if _, ok := raw["flags"]; raw != nil && !ok {
		return fmt.Errorf("field flags in HkdfTestVector: required")
	}
	if _, ok := raw["ikm"]; raw != nil && !ok {
		return fmt.Errorf("field ikm in HkdfTestVector: required")
	}
	if _, ok := raw["info"]; raw != nil && !ok {
		return fmt.Errorf("field info in HkdfTestVector: required")
	}
	if _, ok := raw["okm"]; raw != nil && !ok {
		return fmt.Errorf("field okm in HkdfTestVector: required")
	}
	if _, ok := raw["result"]; raw != nil && !ok {
		return fmt.Errorf("field result in HkdfTestVector: required")
	}
	if _, ok := raw["salt"]; raw != nil && !ok {
		return fmt.Errorf("field salt in HkdfTestVector: required")
	}
	if _, ok := raw["size"]; raw != nil && !ok {
		return fmt.Errorf("field size in HkdfTestVector: required")
	}
	if _, ok := raw["tcId"]; raw != nil && !ok {
		return fmt.Errorf("field tcId in HkdfTestVector: required")
	}
	type Plain HkdfTestVector
	var plain Plain
	if err := json.Unmarshal(value, &plain); err != nil {
		return err
	}
	*j = HkdfTestVector(plain)
	return nil
}

type IndCpaTestGroup struct {
	// the IV size in bits
	IvSize int `json:"ivSize"`

	// the keySize in bits
	KeySize int `json:"keySize"`

	// Source corresponds to the JSON schema field "source".
	Source Source `json:"source"`

	// Tests corresponds to the JSON schema field "tests".
	Tests []IndCpaTestVector `json:"tests"`

	// Type corresponds to the JSON schema field "type".
	Type IndCpaTestGroupType `json:"type"`
}

type IndCpaTestGroupType string

const IndCpaTestGroupTypeIndCpaTest IndCpaTestGroupType = "IndCpaTest"

var enumValues_IndCpaTestGroupType = []interface{}{
	"IndCpaTest",
}

// UnmarshalJSON implements json.Unmarshaler.
func (j *IndCpaTestGroupType) UnmarshalJSON(value []byte) error {
	var v string
	if err := json.Unmarshal(value, &v); err != nil {
		return err
	}
	var ok bool
	for _, expected := range enumValues_IndCpaTestGroupType {
		if reflect.DeepEqual(v, expected) {
			ok = true
			break
		}
	}
	if !ok {
		return fmt.Errorf("invalid value (expected one of %#v): %#v", enumValues_IndCpaTestGroupType, v)
	}
	*j = IndCpaTestGroupType(v)
	return nil
}

// UnmarshalJSON implements json.Unmarshaler.
func (j *IndCpaTestGroup) UnmarshalJSON(value []byte) error {
	var raw map[string]interface{}
	if err := json.Unmarshal(value, &raw); err != nil {
		return err
	}
	if _, ok := raw["ivSize"]; raw != nil && !ok {
		return fmt.Errorf("field ivSize in IndCpaTestGroup: required")
	}
	if _, ok := raw["keySize"]; raw != nil && !ok {
		return fmt.Errorf("field keySize in IndCpaTestGroup: required")
	}
	if _, ok := raw["source"]; raw != nil && !ok {
		return fmt.Errorf("field source in IndCpaTestGroup: required")
	}
	if _, ok := raw["tests"]; raw != nil && !ok {
		return fmt.Errorf("field tests in IndCpaTestGroup: required")
	}
	if _, ok := raw["type"]; raw != nil && !ok {
		return fmt.Errorf("field type in IndCpaTestGroup: required")
	}
	type Plain IndCpaTestGroup
	var plain Plain
	if err := json.Unmarshal(value, &plain); err != nil {
		return err
	}
	*j = IndCpaTestGroup(plain)
	return nil
}

type IndCpaTestSchemaV1Json struct {
	// the primitive tested in the test file
	Algorithm string `json:"algorithm"`

	// DEPRECATED: prefer "source" property in test group
	GeneratorVersion *string `json:"generatorVersion,omitempty,omitzero"`

	// additional documentation
	Header []string `json:"header"`

	// Notes corresponds to the JSON schema field "notes".
	Notes Notes `json:"notes"`

	// the number of test vectors in this test
	NumberOfTests int `json:"numberOfTests"`

	// Schema corresponds to the JSON schema field "schema".
	Schema IndCpaTestSchemaV1JsonSchema `json:"schema"`

	// TestGroups corresponds to the JSON schema field "testGroups".
	TestGroups []IndCpaTestGroup `json:"testGroups"`
}

type IndCpaTestSchemaV1JsonSchema string

const IndCpaTestSchemaV1JsonSchemaIndCpaTestSchemaV1Json IndCpaTestSchemaV1JsonSchema = "ind_cpa_test_schema_v1.json"

var enumValues_IndCpaTestSchemaV1JsonSchema = []interface{}{
	"ind_cpa_test_schema_v1.json",
}

// UnmarshalJSON implements json.Unmarshaler.
func (j *IndCpaTestSchemaV1JsonSchema) UnmarshalJSON(value []byte) error {
	var v string
	if err := json.Unmarshal(value, &v); err != nil {
		return err
	}
	var ok bool
	for _, expected := range enumValues_IndCpaTestSchemaV1JsonSchema {
		if reflect.DeepEqual(v, expected) {
			ok = true
			break
		}
	}
	if !ok {
		return fmt.Errorf("invalid value (expected one of %#v): %#v", enumValues_IndCpaTestSchemaV1JsonSchema, v)
	}
	*j = IndCpaTestSchemaV1JsonSchema(v)
	return nil
}

// UnmarshalJSON implements json.Unmarshaler.
func (j *IndCpaTestSchemaV1Json) UnmarshalJSON(value []byte) error {
	var raw map[string]interface{}
	if err := json.Unmarshal(value, &raw); err != nil {
		return err
	}
	if _, ok := raw["algorithm"]; raw != nil && !ok {
		return fmt.Errorf("field algorithm in IndCpaTestSchemaV1Json: required")
	}
	if _, ok := raw["header"]; raw != nil && !ok {
		return fmt.Errorf("field header in IndCpaTestSchemaV1Json: required")
	}
	if _, ok := raw["notes"]; raw != nil && !ok {
		return fmt.Errorf("field notes in IndCpaTestSchemaV1Json: required")
	}
	if _, ok := raw["numberOfTests"]; raw != nil && !ok {
		return fmt.Errorf("field numberOfTests in IndCpaTestSchemaV1Json: required")
	}
	if _, ok := raw["schema"]; raw != nil && !ok {
		return fmt.Errorf("field schema in IndCpaTestSchemaV1Json: required")
	}
	if _, ok := raw["testGroups"]; raw != nil && !ok {
		return fmt.Errorf("field testGroups in IndCpaTestSchemaV1Json: required")
	}
	type Plain IndCpaTestSchemaV1Json
	var plain Plain
	if err := json.Unmarshal(value, &plain); err != nil {
		return err
	}
	*j = IndCpaTestSchemaV1Json(plain)
	return nil
}

type IndCpaTestVector struct {
	// A brief description of the test case
	Comment string `json:"comment"`

	// the raw ciphertext (without IV)
	Ct string `json:"ct"`

	// A list of flags
	Flags []string `json:"flags"`

	// the initialization vector
	Iv string `json:"iv"`

	// the key
	Key string `json:"key"`

	// the plaintext
	Msg string `json:"msg"`

	// Result corresponds to the JSON schema field "result".
	Result Result `json:"result"`

	// Identifier of the test case
	TcId int `json:"tcId"`
}

// UnmarshalJSON implements json.Unmarshaler.
func (j *IndCpaTestVector) UnmarshalJSON(value []byte) error {
	var raw map[string]interface{}
	if err := json.Unmarshal(value, &raw); err != nil {
		return err
	}
	if _, ok := raw["comment"]; raw != nil && !ok {
		return fmt.Errorf("field comment in IndCpaTestVector: required")
	}
	if _, ok := raw["ct"]; raw != nil && !ok {
		return fmt.Errorf("field ct in IndCpaTestVector: required")
	}
	if _, ok := raw["flags"]; raw != nil && !ok {
		return fmt.Errorf("field flags in IndCpaTestVector: required")
	}
	if _, ok := raw["iv"]; raw != nil && !ok {
		return fmt.Errorf("field iv in IndCpaTestVector: required")
	}
	if _, ok := raw["key"]; raw != nil && !ok {
		return fmt.Errorf("field key in IndCpaTestVector: required")
	}
	if _, ok := raw["msg"]; raw != nil && !ok {
		return fmt.Errorf("field msg in IndCpaTestVector: required")
	}
	if _, ok := raw["result"]; raw != nil && !ok {
		return fmt.Errorf("field result in IndCpaTestVector: required")
	}
	if _, ok := raw["tcId"]; raw != nil && !ok {
		return fmt.Errorf("field tcId in IndCpaTestVector: required")
	}
	type Plain IndCpaTestVector
	var plain Plain
	if err := json.Unmarshal(value, &plain); err != nil {
		return err
	}
	*j = IndCpaTestVector(plain)
	return nil
}

type JsonWebCryptoSchemaV1Json struct {
	// DEPRECATED: prefer "source" property in test group
	GeneratorVersion *string `json:"generatorVersion,omitempty,omitzero"`

	// additional documentation
	Header []string `json:"header"`

	// Notes corresponds to the JSON schema field "notes".
	Notes Notes `json:"notes"`

	// the number of test vectors in this test
	NumberOfTests int `json:"numberOfTests"`

	// Schema corresponds to the JSON schema field "schema".
	Schema JsonWebCryptoSchemaV1JsonSchema `json:"schema"`

	// TestGroups corresponds to the JSON schema field "testGroups".
	TestGroups []JsonWebCryptoTestGroup `json:"testGroups"`
}

type JsonWebCryptoSchemaV1JsonSchema string

const JsonWebCryptoSchemaV1JsonSchemaJsonWebCryptoSchemaV1Json JsonWebCryptoSchemaV1JsonSchema = "json_web_crypto_schema_v1.json"

var enumValues_JsonWebCryptoSchemaV1JsonSchema = []interface{}{
	"json_web_crypto_schema_v1.json",
}

// UnmarshalJSON implements json.Unmarshaler.
func (j *JsonWebCryptoSchemaV1JsonSchema) UnmarshalJSON(value []byte) error {
	var v string
	if err := json.Unmarshal(value, &v); err != nil {
		return err
	}
	var ok bool
	for _, expected := range enumValues_JsonWebCryptoSchemaV1JsonSchema {
		if reflect.DeepEqual(v, expected) {
			ok = true
			break
		}
	}
	if !ok {
		return fmt.Errorf("invalid value (expected one of %#v): %#v", enumValues_JsonWebCryptoSchemaV1JsonSchema, v)
	}
	*j = JsonWebCryptoSchemaV1JsonSchema(v)
	return nil
}

// UnmarshalJSON implements json.Unmarshaler.
func (j *JsonWebCryptoSchemaV1Json) UnmarshalJSON(value []byte) error {
	var raw map[string]interface{}
	if err := json.Unmarshal(value, &raw); err != nil {
		return err
	}
	if _, ok := raw["header"]; raw != nil && !ok {
		return fmt.Errorf("field header in JsonWebCryptoSchemaV1Json: required")
	}
	if _, ok := raw["notes"]; raw != nil && !ok {
		return fmt.Errorf("field notes in JsonWebCryptoSchemaV1Json: required")
	}
	if _, ok := raw["numberOfTests"]; raw != nil && !ok {
		return fmt.Errorf("field numberOfTests in JsonWebCryptoSchemaV1Json: required")
	}
	if _, ok := raw["schema"]; raw != nil && !ok {
		return fmt.Errorf("field schema in JsonWebCryptoSchemaV1Json: required")
	}
	if _, ok := raw["testGroups"]; raw != nil && !ok {
		return fmt.Errorf("field testGroups in JsonWebCryptoSchemaV1Json: required")
	}
	type Plain JsonWebCryptoSchemaV1Json
	var plain Plain
	if err := json.Unmarshal(value, &plain); err != nil {
		return err
	}
	*j = JsonWebCryptoSchemaV1Json(plain)
	return nil
}

type JsonWebCryptoTestGroup struct {
	// a description of what these tests have in common
	Comment *string `json:"comment,omitempty,omitzero"`

	// the private or secret key in webcrypto format
	Private JsonWebKeyOrKeyset `json:"private,omitempty,omitzero"`

	// [optional] the public key in webcrypto format
	Public JsonWebKeyOrKeyset `json:"public,omitempty,omitzero"`

	// Source corresponds to the JSON schema field "source".
	Source Source `json:"source"`

	// Tests corresponds to the JSON schema field "tests".
	Tests []JsonWebCryptoTestVector `json:"tests"`

	// Type corresponds to the JSON schema field "type".
	Type *JsonWebCryptoTestGroupType `json:"type,omitempty,omitzero"`
}

type JsonWebCryptoTestGroupType string

const JsonWebCryptoTestGroupTypeJsonWebCrypto JsonWebCryptoTestGroupType = "JsonWebCrypto"

var enumValues_JsonWebCryptoTestGroupType = []interface{}{
	"JsonWebCrypto",
}

// UnmarshalJSON implements json.Unmarshaler.
func (j *JsonWebCryptoTestGroupType) UnmarshalJSON(value []byte) error {
	var v string
	if err := json.Unmarshal(value, &v); err != nil {
		return err
	}
	var ok bool
	for _, expected := range enumValues_JsonWebCryptoTestGroupType {
		if reflect.DeepEqual(v, expected) {
			ok = true
			break
		}
	}
	if !ok {
		return fmt.Errorf("invalid value (expected one of %#v): %#v", enumValues_JsonWebCryptoTestGroupType, v)
	}
	*j = JsonWebCryptoTestGroupType(v)
	return nil
}

// UnmarshalJSON implements json.Unmarshaler.
func (j *JsonWebCryptoTestGroup) UnmarshalJSON(value []byte) error {
	var raw map[string]interface{}
	if err := json.Unmarshal(value, &raw); err != nil {
		return err
	}
	if _, ok := raw["source"]; raw != nil && !ok {
		return fmt.Errorf("field source in JsonWebCryptoTestGroup: required")
	}
	if _, ok := raw["tests"]; raw != nil && !ok {
		return fmt.Errorf("field tests in JsonWebCryptoTestGroup: required")
	}
	type Plain JsonWebCryptoTestGroup
	var plain Plain
	if err := json.Unmarshal(value, &plain); err != nil {
		return err
	}
	*j = JsonWebCryptoTestGroup(plain)
	return nil
}

type JsonWebCryptoTestVector struct {
	// A brief description of the test case
	Comment string `json:"comment"`

	// A list of flags
	Flags []string `json:"flags"`

	// The JSON Web Encryption
	Jwe interface{} `json:"jwe,omitempty,omitzero"`

	// The JSON Web Signature
	Jws interface{} `json:"jws,omitempty,omitzero"`

	// [optional] Plaintext
	Pt *string `json:"pt,omitempty,omitzero"`

	// Result corresponds to the JSON schema field "result".
	Result Result `json:"result"`

	// Identifier of the test case
	TcId int `json:"tcId"`
}

// UnmarshalJSON implements json.Unmarshaler.
func (j *JsonWebCryptoTestVector) UnmarshalJSON(value []byte) error {
	var raw map[string]interface{}
	if err := json.Unmarshal(value, &raw); err != nil {
		return err
	}
	if _, ok := raw["comment"]; raw != nil && !ok {
		return fmt.Errorf("field comment in JsonWebCryptoTestVector: required")
	}
	if _, ok := raw["flags"]; raw != nil && !ok {
		return fmt.Errorf("field flags in JsonWebCryptoTestVector: required")
	}
	if _, ok := raw["result"]; raw != nil && !ok {
		return fmt.Errorf("field result in JsonWebCryptoTestVector: required")
	}
	if _, ok := raw["tcId"]; raw != nil && !ok {
		return fmt.Errorf("field tcId in JsonWebCryptoTestVector: required")
	}
	type Plain JsonWebCryptoTestVector
	var plain Plain
	if err := json.Unmarshal(value, &plain); err != nil {
		return err
	}
	*j = JsonWebCryptoTestVector(plain)
	return nil
}

type JsonWebEncryptionSchemaV1Json struct {
	// DEPRECATED: prefer "source" property in test group
	GeneratorVersion *string `json:"generatorVersion,omitempty,omitzero"`

	// additional documentation
	Header []string `json:"header"`

	// Notes corresponds to the JSON schema field "notes".
	Notes Notes `json:"notes"`

	// the number of test vectors in this test
	NumberOfTests int `json:"numberOfTests"`

	// Schema corresponds to the JSON schema field "schema".
	Schema JsonWebEncryptionSchemaV1JsonSchema `json:"schema"`

	// TestGroups corresponds to the JSON schema field "testGroups".
	TestGroups []JsonWebEncryptionTestGroup `json:"testGroups"`
}

type JsonWebEncryptionSchemaV1JsonSchema string

const JsonWebEncryptionSchemaV1JsonSchemaJsonWebEncryptionSchemaV1Json JsonWebEncryptionSchemaV1JsonSchema = "json_web_encryption_schema_v1.json"

var enumValues_JsonWebEncryptionSchemaV1JsonSchema = []interface{}{
	"json_web_encryption_schema_v1.json",
}

// UnmarshalJSON implements json.Unmarshaler.
func (j *JsonWebEncryptionSchemaV1JsonSchema) UnmarshalJSON(value []byte) error {
	var v string
	if err := json.Unmarshal(value, &v); err != nil {
		return err
	}
	var ok bool
	for _, expected := range enumValues_JsonWebEncryptionSchemaV1JsonSchema {
		if reflect.DeepEqual(v, expected) {
			ok = true
			break
		}
	}
	if !ok {
		return fmt.Errorf("invalid value (expected one of %#v): %#v", enumValues_JsonWebEncryptionSchemaV1JsonSchema, v)
	}
	*j = JsonWebEncryptionSchemaV1JsonSchema(v)
	return nil
}

// UnmarshalJSON implements json.Unmarshaler.
func (j *JsonWebEncryptionSchemaV1Json) UnmarshalJSON(value []byte) error {
	var raw map[string]interface{}
	if err := json.Unmarshal(value, &raw); err != nil {
		return err
	}
	if _, ok := raw["header"]; raw != nil && !ok {
		return fmt.Errorf("field header in JsonWebEncryptionSchemaV1Json: required")
	}
	if _, ok := raw["notes"]; raw != nil && !ok {
		return fmt.Errorf("field notes in JsonWebEncryptionSchemaV1Json: required")
	}
	if _, ok := raw["numberOfTests"]; raw != nil && !ok {
		return fmt.Errorf("field numberOfTests in JsonWebEncryptionSchemaV1Json: required")
	}
	if _, ok := raw["schema"]; raw != nil && !ok {
		return fmt.Errorf("field schema in JsonWebEncryptionSchemaV1Json: required")
	}
	if _, ok := raw["testGroups"]; raw != nil && !ok {
		return fmt.Errorf("field testGroups in JsonWebEncryptionSchemaV1Json: required")
	}
	type Plain JsonWebEncryptionSchemaV1Json
	var plain Plain
	if err := json.Unmarshal(value, &plain); err != nil {
		return err
	}
	*j = JsonWebEncryptionSchemaV1Json(plain)
	return nil
}

type JsonWebEncryptionTestGroup struct {
	// a description of what these tests have in common
	Comment *string `json:"comment,omitempty,omitzero"`

	// the private key
	Private *JsonWebKey `json:"private,omitempty,omitzero"`

	// the [optional] public key
	Public *JsonWebKey `json:"public,omitempty,omitzero"`

	// Source corresponds to the JSON schema field "source".
	Source Source `json:"source"`

	// Tests corresponds to the JSON schema field "tests".
	Tests []JsonWebEncryptionTestVector `json:"tests"`

	// Type corresponds to the JSON schema field "type".
	Type *JsonWebEncryptionTestGroupType `json:"type,omitempty,omitzero"`
}

type JsonWebEncryptionTestGroupType string

const JsonWebEncryptionTestGroupTypeJsonWebEncryption JsonWebEncryptionTestGroupType = "JsonWebEncryption"

var enumValues_JsonWebEncryptionTestGroupType = []interface{}{
	"JsonWebEncryption",
}

// UnmarshalJSON implements json.Unmarshaler.
func (j *JsonWebEncryptionTestGroupType) UnmarshalJSON(value []byte) error {
	var v string
	if err := json.Unmarshal(value, &v); err != nil {
		return err
	}
	var ok bool
	for _, expected := range enumValues_JsonWebEncryptionTestGroupType {
		if reflect.DeepEqual(v, expected) {
			ok = true
			break
		}
	}
	if !ok {
		return fmt.Errorf("invalid value (expected one of %#v): %#v", enumValues_JsonWebEncryptionTestGroupType, v)
	}
	*j = JsonWebEncryptionTestGroupType(v)
	return nil
}

// UnmarshalJSON implements json.Unmarshaler.
func (j *JsonWebEncryptionTestGroup) UnmarshalJSON(value []byte) error {
	var raw map[string]interface{}
	if err := json.Unmarshal(value, &raw); err != nil {
		return err
	}
	if _, ok := raw["source"]; raw != nil && !ok {
		return fmt.Errorf("field source in JsonWebEncryptionTestGroup: required")
	}
	if _, ok := raw["tests"]; raw != nil && !ok {
		return fmt.Errorf("field tests in JsonWebEncryptionTestGroup: required")
	}
	type Plain JsonWebEncryptionTestGroup
	var plain Plain
	if err := json.Unmarshal(value, &plain); err != nil {
		return err
	}
	*j = JsonWebEncryptionTestGroup(plain)
	return nil
}

type JsonWebEncryptionTestVector struct {
	// A brief description of the test case
	Comment string `json:"comment"`

	// the content encryption algorithm
	Enc string `json:"enc"`

	// A list of flags
	Flags []string `json:"flags"`

	// The JSON Web Encryption in compact form
	Jwe string `json:"jwe"`

	// [optional] Plaintext
	Pt *string `json:"pt,omitempty,omitzero"`

	// Result corresponds to the JSON schema field "result".
	Result Result `json:"result"`

	// Identifier of the test case
	TcId int `json:"tcId"`
}

// UnmarshalJSON implements json.Unmarshaler.
func (j *JsonWebEncryptionTestVector) UnmarshalJSON(value []byte) error {
	var raw map[string]interface{}
	if err := json.Unmarshal(value, &raw); err != nil {
		return err
	}
	if _, ok := raw["comment"]; raw != nil && !ok {
		return fmt.Errorf("field comment in JsonWebEncryptionTestVector: required")
	}
	if _, ok := raw["enc"]; raw != nil && !ok {
		return fmt.Errorf("field enc in JsonWebEncryptionTestVector: required")
	}
	if _, ok := raw["flags"]; raw != nil && !ok {
		return fmt.Errorf("field flags in JsonWebEncryptionTestVector: required")
	}
	if _, ok := raw["jwe"]; raw != nil && !ok {
		return fmt.Errorf("field jwe in JsonWebEncryptionTestVector: required")
	}
	if _, ok := raw["result"]; raw != nil && !ok {
		return fmt.Errorf("field result in JsonWebEncryptionTestVector: required")
	}
	if _, ok := raw["tcId"]; raw != nil && !ok {
		return fmt.Errorf("field tcId in JsonWebEncryptionTestVector: required")
	}
	type Plain JsonWebEncryptionTestVector
	var plain Plain
	if err := json.Unmarshal(value, &plain); err != nil {
		return err
	}
	*j = JsonWebEncryptionTestVector(plain)
	return nil
}

// see https://tools.ietf.org/html/rfc7517#section-4 and
// https://tools.ietf.org/html/rfc7518#section-6
type JsonWebKey struct {
	// the encryption/signing algorithm to use
	Alg *string `json:"alg,omitempty,omitzero"`

	// which defined curve to use
	Crv *JsonWebKeyCrv `json:"crv,omitempty,omitzero"`

	// the private key value of an EC key or private exponent for RSA
	D *string `json:"d,omitempty,omitzero"`

	// the first factor Chinese Remainder Theorem exponent of an RSA key
	Dp *string `json:"dp,omitempty,omitzero"`

	// the second factor Chinese Remainder Theorem exponent of an RSA key
	Dq *string `json:"dq,omitempty,omitzero"`

	// the public exponent of an RSA key
	E *string `json:"e,omitempty,omitzero"`

	// the secret key value of an oct key
	K *string `json:"k,omitempty,omitzero"`

	// an alternative to use
	KeyOps []string `json:"key_ops,omitempty,omitzero"`

	// the ID of the key entry
	Kid *string `json:"kid,omitempty,omitzero"`

	// the family of algorithms the key belongs to
	Kty *JsonWebKeyKty `json:"kty,omitempty,omitzero"`

	// the public modulus of an RSA key
	N *string `json:"n,omitempty,omitzero"`

	// the first prime factgor of an RSA key
	P *string `json:"p,omitempty,omitzero"`

	// the second prime factor of an RSA key
	Q *string `json:"q,omitempty,omitzero"`

	// the first factor Chinese Remainder Theorem coefficient of an RSA key
	Qi *string `json:"qi,omitempty,omitzero"`

	// what type of crypto operation to perform
	Use *JsonWebKeyUse `json:"use,omitempty,omitzero"`

	// the x-coordinate of an EC key point
	X *string `json:"x,omitempty,omitzero"`

	// the y-coordinate of an EC key point
	Y *string `json:"y,omitempty,omitzero"`
}

type JsonWebKeyCrv string

const JsonWebKeyCrvEd25519 JsonWebKeyCrv = "Ed25519"
const JsonWebKeyCrvEd448 JsonWebKeyCrv = "Ed448"
const JsonWebKeyCrvP256 JsonWebKeyCrv = "P-256"
const JsonWebKeyCrvP256K JsonWebKeyCrv = "P-256K"
const JsonWebKeyCrvP384 JsonWebKeyCrv = "P-384"
const JsonWebKeyCrvP521 JsonWebKeyCrv = "P-521"
const JsonWebKeyCrvSecp256K1 JsonWebKeyCrv = "secp256k1"
const JsonWebKeyCrvX25519 JsonWebKeyCrv = "X25519"
const JsonWebKeyCrvX448 JsonWebKeyCrv = "X448"

var enumValues_JsonWebKeyCrv = []interface{}{
	"P-256",
	"P-256K",
	"P-384",
	"P-521",
	"secp256k1",
	"X448",
	"X25519",
	"Ed25519",
	"Ed448",
}

// UnmarshalJSON implements json.Unmarshaler.
func (j *JsonWebKeyCrv) UnmarshalJSON(value []byte) error {
	var v string
	if err := json.Unmarshal(value, &v); err != nil {
		return err
	}
	var ok bool
	for _, expected := range enumValues_JsonWebKeyCrv {
		if reflect.DeepEqual(v, expected) {
			ok = true
			break
		}
	}
	if !ok {
		return fmt.Errorf("invalid value (expected one of %#v): %#v", enumValues_JsonWebKeyCrv, v)
	}
	*j = JsonWebKeyCrv(v)
	return nil
}

type JsonWebKeyKty string

const JsonWebKeyKtyBlank JsonWebKeyKty = ""
const JsonWebKeyKtyEC JsonWebKeyKty = "EC"
const JsonWebKeyKtyOKP JsonWebKeyKty = "OKP"
const JsonWebKeyKtyOct JsonWebKeyKty = "oct"
const JsonWebKeyKtyRSA JsonWebKeyKty = "RSA"

var enumValues_JsonWebKeyKty = []interface{}{
	"",
	"oct",
	"EC",
	"RSA",
	"OKP",
}

// UnmarshalJSON implements json.Unmarshaler.
func (j *JsonWebKeyKty) UnmarshalJSON(value []byte) error {
	var v string
	if err := json.Unmarshal(value, &v); err != nil {
		return err
	}
	var ok bool
	for _, expected := range enumValues_JsonWebKeyKty {
		if reflect.DeepEqual(v, expected) {
			ok = true
			break
		}
	}
	if !ok {
		return fmt.Errorf("invalid value (expected one of %#v): %#v", enumValues_JsonWebKeyKty, v)
	}
	*j = JsonWebKeyKty(v)
	return nil
}

type JsonWebKeyOrKeyset interface{}

type JsonWebKeySchemaV1Json struct {
	// DEPRECATED: prefer "source" property in test group
	GeneratorVersion *string `json:"generatorVersion,omitempty,omitzero"`

	// additional documentation
	Header []string `json:"header"`

	// Notes corresponds to the JSON schema field "notes".
	Notes Notes `json:"notes"`

	// the number of test vectors in this test
	NumberOfTests int `json:"numberOfTests"`

	// Schema corresponds to the JSON schema field "schema".
	Schema JsonWebKeySchemaV1JsonSchema `json:"schema"`

	// TestGroups corresponds to the JSON schema field "testGroups".
	TestGroups []JsonWebKeyTestGroup `json:"testGroups"`
}

type JsonWebKeySchemaV1JsonSchema string

const JsonWebKeySchemaV1JsonSchemaJsonWebKeySchemaV1Json JsonWebKeySchemaV1JsonSchema = "json_web_key_schema_v1.json"

var enumValues_JsonWebKeySchemaV1JsonSchema = []interface{}{
	"json_web_key_schema_v1.json",
}

// UnmarshalJSON implements json.Unmarshaler.
func (j *JsonWebKeySchemaV1JsonSchema) UnmarshalJSON(value []byte) error {
	var v string
	if err := json.Unmarshal(value, &v); err != nil {
		return err
	}
	var ok bool
	for _, expected := range enumValues_JsonWebKeySchemaV1JsonSchema {
		if reflect.DeepEqual(v, expected) {
			ok = true
			break
		}
	}
	if !ok {
		return fmt.Errorf("invalid value (expected one of %#v): %#v", enumValues_JsonWebKeySchemaV1JsonSchema, v)
	}
	*j = JsonWebKeySchemaV1JsonSchema(v)
	return nil
}

// UnmarshalJSON implements json.Unmarshaler.
func (j *JsonWebKeySchemaV1Json) UnmarshalJSON(value []byte) error {
	var raw map[string]interface{}
	if err := json.Unmarshal(value, &raw); err != nil {
		return err
	}
	if _, ok := raw["header"]; raw != nil && !ok {
		return fmt.Errorf("field header in JsonWebKeySchemaV1Json: required")
	}
	if _, ok := raw["notes"]; raw != nil && !ok {
		return fmt.Errorf("field notes in JsonWebKeySchemaV1Json: required")
	}
	if _, ok := raw["numberOfTests"]; raw != nil && !ok {
		return fmt.Errorf("field numberOfTests in JsonWebKeySchemaV1Json: required")
	}
	if _, ok := raw["schema"]; raw != nil && !ok {
		return fmt.Errorf("field schema in JsonWebKeySchemaV1Json: required")
	}
	if _, ok := raw["testGroups"]; raw != nil && !ok {
		return fmt.Errorf("field testGroups in JsonWebKeySchemaV1Json: required")
	}
	type Plain JsonWebKeySchemaV1Json
	var plain Plain
	if err := json.Unmarshal(value, &plain); err != nil {
		return err
	}
	*j = JsonWebKeySchemaV1Json(plain)
	return nil
}

type JsonWebKeyTestGroup struct {
	// a description of what these tests have in common
	Comment *string `json:"comment,omitempty,omitzero"`

	// the private or secret keyset in webcrypto format
	Private *JsonWebKeyset `json:"private,omitempty,omitzero"`

	// the public keyset in webcrypto format
	Public *JsonWebKeyset `json:"public,omitempty,omitzero"`

	// Source corresponds to the JSON schema field "source".
	Source Source `json:"source"`

	// Tests corresponds to the JSON schema field "tests".
	Tests []JsonWebKeyTestVector `json:"tests"`

	// Type corresponds to the JSON schema field "type".
	Type *JsonWebKeyTestGroupType `json:"type,omitempty,omitzero"`
}

type JsonWebKeyTestGroupType string

const JsonWebKeyTestGroupTypeJsonWebKey JsonWebKeyTestGroupType = "JsonWebKey"

var enumValues_JsonWebKeyTestGroupType = []interface{}{
	"JsonWebKey",
}

// UnmarshalJSON implements json.Unmarshaler.
func (j *JsonWebKeyTestGroupType) UnmarshalJSON(value []byte) error {
	var v string
	if err := json.Unmarshal(value, &v); err != nil {
		return err
	}
	var ok bool
	for _, expected := range enumValues_JsonWebKeyTestGroupType {
		if reflect.DeepEqual(v, expected) {
			ok = true
			break
		}
	}
	if !ok {
		return fmt.Errorf("invalid value (expected one of %#v): %#v", enumValues_JsonWebKeyTestGroupType, v)
	}
	*j = JsonWebKeyTestGroupType(v)
	return nil
}

// UnmarshalJSON implements json.Unmarshaler.
func (j *JsonWebKeyTestGroup) UnmarshalJSON(value []byte) error {
	var raw map[string]interface{}
	if err := json.Unmarshal(value, &raw); err != nil {
		return err
	}
	if _, ok := raw["source"]; raw != nil && !ok {
		return fmt.Errorf("field source in JsonWebKeyTestGroup: required")
	}
	if _, ok := raw["tests"]; raw != nil && !ok {
		return fmt.Errorf("field tests in JsonWebKeyTestGroup: required")
	}
	type Plain JsonWebKeyTestGroup
	var plain Plain
	if err := json.Unmarshal(value, &plain); err != nil {
		return err
	}
	*j = JsonWebKeyTestGroup(plain)
	return nil
}

type JsonWebKeyTestVector struct {
	// A brief description of the test case
	Comment string `json:"comment"`

	// A list of flags
	Flags []string `json:"flags"`

	// The JSON Web Signature in compact form
	Jws string `json:"jws"`

	// Result corresponds to the JSON schema field "result".
	Result Result `json:"result"`

	// Identifier of the test case
	TcId int `json:"tcId"`
}

// UnmarshalJSON implements json.Unmarshaler.
func (j *JsonWebKeyTestVector) UnmarshalJSON(value []byte) error {
	var raw map[string]interface{}
	if err := json.Unmarshal(value, &raw); err != nil {
		return err
	}
	if _, ok := raw["comment"]; raw != nil && !ok {
		return fmt.Errorf("field comment in JsonWebKeyTestVector: required")
	}
	if _, ok := raw["flags"]; raw != nil && !ok {
		return fmt.Errorf("field flags in JsonWebKeyTestVector: required")
	}
	if _, ok := raw["jws"]; raw != nil && !ok {
		return fmt.Errorf("field jws in JsonWebKeyTestVector: required")
	}
	if _, ok := raw["result"]; raw != nil && !ok {
		return fmt.Errorf("field result in JsonWebKeyTestVector: required")
	}
	if _, ok := raw["tcId"]; raw != nil && !ok {
		return fmt.Errorf("field tcId in JsonWebKeyTestVector: required")
	}
	type Plain JsonWebKeyTestVector
	var plain Plain
	if err := json.Unmarshal(value, &plain); err != nil {
		return err
	}
	*j = JsonWebKeyTestVector(plain)
	return nil
}

type JsonWebKeyUse string

const JsonWebKeyUseEnc JsonWebKeyUse = "enc"
const JsonWebKeyUseSig JsonWebKeyUse = "sig"

var enumValues_JsonWebKeyUse = []interface{}{
	"sig",
	"enc",
}

// UnmarshalJSON implements json.Unmarshaler.
func (j *JsonWebKeyUse) UnmarshalJSON(value []byte) error {
	var v string
	if err := json.Unmarshal(value, &v); err != nil {
		return err
	}
	var ok bool
	for _, expected := range enumValues_JsonWebKeyUse {
		if reflect.DeepEqual(v, expected) {
			ok = true
			break
		}
	}
	if !ok {
		return fmt.Errorf("invalid value (expected one of %#v): %#v", enumValues_JsonWebKeyUse, v)
	}
	*j = JsonWebKeyUse(v)
	return nil
}

// see https://tools.ietf.org/html/rfc7517#section-5
type JsonWebKeyset struct {
	// Keys corresponds to the JSON schema field "keys".
	Keys []JsonWebKey `json:"keys,omitempty,omitzero"`
}

type JsonWebSignatureSchemaV1Json struct {
	// DEPRECATED: prefer "source" property in test group
	GeneratorVersion *string `json:"generatorVersion,omitempty,omitzero"`

	// additional documentation
	Header []string `json:"header"`

	// Notes corresponds to the JSON schema field "notes".
	Notes Notes `json:"notes"`

	// the number of test vectors in this test
	NumberOfTests int `json:"numberOfTests"`

	// Schema corresponds to the JSON schema field "schema".
	Schema JsonWebSignatureSchemaV1JsonSchema `json:"schema"`

	// TestGroups corresponds to the JSON schema field "testGroups".
	TestGroups []JsonWebSignatureTestGroup `json:"testGroups"`
}

type JsonWebSignatureSchemaV1JsonSchema string

const JsonWebSignatureSchemaV1JsonSchemaJsonWebSignatureSchemaV1Json JsonWebSignatureSchemaV1JsonSchema = "json_web_signature_schema_v1.json"

var enumValues_JsonWebSignatureSchemaV1JsonSchema = []interface{}{
	"json_web_signature_schema_v1.json",
}

// UnmarshalJSON implements json.Unmarshaler.
func (j *JsonWebSignatureSchemaV1JsonSchema) UnmarshalJSON(value []byte) error {
	var v string
	if err := json.Unmarshal(value, &v); err != nil {
		return err
	}
	var ok bool
	for _, expected := range enumValues_JsonWebSignatureSchemaV1JsonSchema {
		if reflect.DeepEqual(v, expected) {
			ok = true
			break
		}
	}
	if !ok {
		return fmt.Errorf("invalid value (expected one of %#v): %#v", enumValues_JsonWebSignatureSchemaV1JsonSchema, v)
	}
	*j = JsonWebSignatureSchemaV1JsonSchema(v)
	return nil
}

// UnmarshalJSON implements json.Unmarshaler.
func (j *JsonWebSignatureSchemaV1Json) UnmarshalJSON(value []byte) error {
	var raw map[string]interface{}
	if err := json.Unmarshal(value, &raw); err != nil {
		return err
	}
	if _, ok := raw["header"]; raw != nil && !ok {
		return fmt.Errorf("field header in JsonWebSignatureSchemaV1Json: required")
	}
	if _, ok := raw["notes"]; raw != nil && !ok {
		return fmt.Errorf("field notes in JsonWebSignatureSchemaV1Json: required")
	}
	if _, ok := raw["numberOfTests"]; raw != nil && !ok {
		return fmt.Errorf("field numberOfTests in JsonWebSignatureSchemaV1Json: required")
	}
	if _, ok := raw["schema"]; raw != nil && !ok {
		return fmt.Errorf("field schema in JsonWebSignatureSchemaV1Json: required")
	}
	if _, ok := raw["testGroups"]; raw != nil && !ok {
		return fmt.Errorf("field testGroups in JsonWebSignatureSchemaV1Json: required")
	}
	type Plain JsonWebSignatureSchemaV1Json
	var plain Plain
	if err := json.Unmarshal(value, &plain); err != nil {
		return err
	}
	*j = JsonWebSignatureSchemaV1Json(plain)
	return nil
}

type JsonWebSignatureTestGroup struct {
	// a description of what these tests have in common
	Comment *string `json:"comment,omitempty,omitzero"`

	// the private or secret key in webcrypto format
	Private *JsonWebKey `json:"private,omitempty,omitzero"`

	// [optional] the public key in webcrypto format
	Public *JsonWebKey `json:"public,omitempty,omitzero"`

	// Source corresponds to the JSON schema field "source".
	Source Source `json:"source"`

	// Tests corresponds to the JSON schema field "tests".
	Tests []JsonWebSignatureTestVector `json:"tests"`

	// Type corresponds to the JSON schema field "type".
	Type *JsonWebSignatureTestGroupType `json:"type,omitempty,omitzero"`
}

type JsonWebSignatureTestGroupType string

const JsonWebSignatureTestGroupTypeJsonWebSignature JsonWebSignatureTestGroupType = "JsonWebSignature"

var enumValues_JsonWebSignatureTestGroupType = []interface{}{
	"JsonWebSignature",
}

// UnmarshalJSON implements json.Unmarshaler.
func (j *JsonWebSignatureTestGroupType) UnmarshalJSON(value []byte) error {
	var v string
	if err := json.Unmarshal(value, &v); err != nil {
		return err
	}
	var ok bool
	for _, expected := range enumValues_JsonWebSignatureTestGroupType {
		if reflect.DeepEqual(v, expected) {
			ok = true
			break
		}
	}
	if !ok {
		return fmt.Errorf("invalid value (expected one of %#v): %#v", enumValues_JsonWebSignatureTestGroupType, v)
	}
	*j = JsonWebSignatureTestGroupType(v)
	return nil
}

// UnmarshalJSON implements json.Unmarshaler.
func (j *JsonWebSignatureTestGroup) UnmarshalJSON(value []byte) error {
	var raw map[string]interface{}
	if err := json.Unmarshal(value, &raw); err != nil {
		return err
	}
	if _, ok := raw["source"]; raw != nil && !ok {
		return fmt.Errorf("field source in JsonWebSignatureTestGroup: required")
	}
	if _, ok := raw["tests"]; raw != nil && !ok {
		return fmt.Errorf("field tests in JsonWebSignatureTestGroup: required")
	}
	type Plain JsonWebSignatureTestGroup
	var plain Plain
	if err := json.Unmarshal(value, &plain); err != nil {
		return err
	}
	*j = JsonWebSignatureTestGroup(plain)
	return nil
}

type JsonWebSignatureTestVector struct {
	// A brief description of the test case
	Comment string `json:"comment"`

	// A list of flags
	Flags []string `json:"flags"`

	// The JSON Web Signature in compact form
	Jws string `json:"jws"`

	// Result corresponds to the JSON schema field "result".
	Result Result `json:"result"`

	// Identifier of the test case
	TcId int `json:"tcId"`
}

// UnmarshalJSON implements json.Unmarshaler.
func (j *JsonWebSignatureTestVector) UnmarshalJSON(value []byte) error {
	var raw map[string]interface{}
	if err := json.Unmarshal(value, &raw); err != nil {
		return err
	}
	if _, ok := raw["comment"]; raw != nil && !ok {
		return fmt.Errorf("field comment in JsonWebSignatureTestVector: required")
	}
	if _, ok := raw["flags"]; raw != nil && !ok {
		return fmt.Errorf("field flags in JsonWebSignatureTestVector: required")
	}
	if _, ok := raw["jws"]; raw != nil && !ok {
		return fmt.Errorf("field jws in JsonWebSignatureTestVector: required")
	}
	if _, ok := raw["result"]; raw != nil && !ok {
		return fmt.Errorf("field result in JsonWebSignatureTestVector: required")
	}
	if _, ok := raw["tcId"]; raw != nil && !ok {
		return fmt.Errorf("field tcId in JsonWebSignatureTestVector: required")
	}
	type Plain JsonWebSignatureTestVector
	var plain Plain
	if err := json.Unmarshal(value, &plain); err != nil {
		return err
	}
	*j = JsonWebSignatureTestVector(plain)
	return nil
}

type KeywrapTestGroup struct {
	// the keySize in bits
	KeySize int `json:"keySize"`

	// Source corresponds to the JSON schema field "source".
	Source Source `json:"source"`

	// Tests corresponds to the JSON schema field "tests".
	Tests []KeywrapTestVector `json:"tests"`

	// Type corresponds to the JSON schema field "type".
	Type KeywrapTestGroupType `json:"type"`
}

type KeywrapTestGroupType string

const KeywrapTestGroupTypeKeywrapTest KeywrapTestGroupType = "KeywrapTest"

var enumValues_KeywrapTestGroupType = []interface{}{
	"KeywrapTest",
}

// UnmarshalJSON implements json.Unmarshaler.
func (j *KeywrapTestGroupType) UnmarshalJSON(value []byte) error {
	var v string
	if err := json.Unmarshal(value, &v); err != nil {
		return err
	}
	var ok bool
	for _, expected := range enumValues_KeywrapTestGroupType {
		if reflect.DeepEqual(v, expected) {
			ok = true
			break
		}
	}
	if !ok {
		return fmt.Errorf("invalid value (expected one of %#v): %#v", enumValues_KeywrapTestGroupType, v)
	}
	*j = KeywrapTestGroupType(v)
	return nil
}

// UnmarshalJSON implements json.Unmarshaler.
func (j *KeywrapTestGroup) UnmarshalJSON(value []byte) error {
	var raw map[string]interface{}
	if err := json.Unmarshal(value, &raw); err != nil {
		return err
	}
	if _, ok := raw["keySize"]; raw != nil && !ok {
		return fmt.Errorf("field keySize in KeywrapTestGroup: required")
	}
	if _, ok := raw["source"]; raw != nil && !ok {
		return fmt.Errorf("field source in KeywrapTestGroup: required")
	}
	if _, ok := raw["tests"]; raw != nil && !ok {
		return fmt.Errorf("field tests in KeywrapTestGroup: required")
	}
	if _, ok := raw["type"]; raw != nil && !ok {
		return fmt.Errorf("field type in KeywrapTestGroup: required")
	}
	type Plain KeywrapTestGroup
	var plain Plain
	if err := json.Unmarshal(value, &plain); err != nil {
		return err
	}
	*j = KeywrapTestGroup(plain)
	return nil
}

type KeywrapTestSchemaV1Json struct {
	// the primitive tested in the test file
	Algorithm string `json:"algorithm"`

	// DEPRECATED: prefer "source" property in test group
	GeneratorVersion *string `json:"generatorVersion,omitempty,omitzero"`

	// additional documentation
	Header []string `json:"header"`

	// Notes corresponds to the JSON schema field "notes".
	Notes Notes `json:"notes"`

	// the number of test vectors in this test
	NumberOfTests int `json:"numberOfTests"`

	// Schema corresponds to the JSON schema field "schema".
	Schema KeywrapTestSchemaV1JsonSchema `json:"schema"`

	// TestGroups corresponds to the JSON schema field "testGroups".
	TestGroups []KeywrapTestGroup `json:"testGroups"`
}

type KeywrapTestSchemaV1JsonSchema string

const KeywrapTestSchemaV1JsonSchemaKeywrapTestSchemaV1Json KeywrapTestSchemaV1JsonSchema = "keywrap_test_schema_v1.json"

var enumValues_KeywrapTestSchemaV1JsonSchema = []interface{}{
	"keywrap_test_schema_v1.json",
}

// UnmarshalJSON implements json.Unmarshaler.
func (j *KeywrapTestSchemaV1JsonSchema) UnmarshalJSON(value []byte) error {
	var v string
	if err := json.Unmarshal(value, &v); err != nil {
		return err
	}
	var ok bool
	for _, expected := range enumValues_KeywrapTestSchemaV1JsonSchema {
		if reflect.DeepEqual(v, expected) {
			ok = true
			break
		}
	}
	if !ok {
		return fmt.Errorf("invalid value (expected one of %#v): %#v", enumValues_KeywrapTestSchemaV1JsonSchema, v)
	}
	*j = KeywrapTestSchemaV1JsonSchema(v)
	return nil
}

// UnmarshalJSON implements json.Unmarshaler.
func (j *KeywrapTestSchemaV1Json) UnmarshalJSON(value []byte) error {
	var raw map[string]interface{}
	if err := json.Unmarshal(value, &raw); err != nil {
		return err
	}
	if _, ok := raw["algorithm"]; raw != nil && !ok {
		return fmt.Errorf("field algorithm in KeywrapTestSchemaV1Json: required")
	}
	if _, ok := raw["header"]; raw != nil && !ok {
		return fmt.Errorf("field header in KeywrapTestSchemaV1Json: required")
	}
	if _, ok := raw["notes"]; raw != nil && !ok {
		return fmt.Errorf("field notes in KeywrapTestSchemaV1Json: required")
	}
	if _, ok := raw["numberOfTests"]; raw != nil && !ok {
		return fmt.Errorf("field numberOfTests in KeywrapTestSchemaV1Json: required")
	}
	if _, ok := raw["schema"]; raw != nil && !ok {
		return fmt.Errorf("field schema in KeywrapTestSchemaV1Json: required")
	}
	if _, ok := raw["testGroups"]; raw != nil && !ok {
		return fmt.Errorf("field testGroups in KeywrapTestSchemaV1Json: required")
	}
	type Plain KeywrapTestSchemaV1Json
	var plain Plain
	if err := json.Unmarshal(value, &plain); err != nil {
		return err
	}
	*j = KeywrapTestSchemaV1Json(plain)
	return nil
}

type KeywrapTestVector struct {
	// A brief description of the test case
	Comment string `json:"comment"`

	// the wrapped key
	Ct string `json:"ct"`

	// A list of flags
	Flags []string `json:"flags"`

	// the wrapping key
	Key string `json:"key"`

	// the key bytes to wrap
	Msg string `json:"msg"`

	// Result corresponds to the JSON schema field "result".
	Result Result `json:"result"`

	// Identifier of the test case
	TcId int `json:"tcId"`
}

// UnmarshalJSON implements json.Unmarshaler.
func (j *KeywrapTestVector) UnmarshalJSON(value []byte) error {
	var raw map[string]interface{}
	if err := json.Unmarshal(value, &raw); err != nil {
		return err
	}
	if _, ok := raw["comment"]; raw != nil && !ok {
		return fmt.Errorf("field comment in KeywrapTestVector: required")
	}
	if _, ok := raw["ct"]; raw != nil && !ok {
		return fmt.Errorf("field ct in KeywrapTestVector: required")
	}
	if _, ok := raw["flags"]; raw != nil && !ok {
		return fmt.Errorf("field flags in KeywrapTestVector: required")
	}
	if _, ok := raw["key"]; raw != nil && !ok {
		return fmt.Errorf("field key in KeywrapTestVector: required")
	}
	if _, ok := raw["msg"]; raw != nil && !ok {
		return fmt.Errorf("field msg in KeywrapTestVector: required")
	}
	if _, ok := raw["result"]; raw != nil && !ok {
		return fmt.Errorf("field result in KeywrapTestVector: required")
	}
	if _, ok := raw["tcId"]; raw != nil && !ok {
		return fmt.Errorf("field tcId in KeywrapTestVector: required")
	}
	type Plain KeywrapTestVector
	var plain Plain
	if err := json.Unmarshal(value, &plain); err != nil {
		return err
	}
	*j = KeywrapTestVector(plain)
	return nil
}

// A test for ML-KEM decapsulation validation
type MLKEMDecapsTestGroup struct {
	// ParameterSet corresponds to the JSON schema field "parameterSet".
	ParameterSet MLKEMDecapsTestGroupParameterSet `json:"parameterSet"`

	// Source corresponds to the JSON schema field "source".
	Source Source `json:"source"`

	// Tests corresponds to the JSON schema field "tests".
	Tests []MLKEMDecapsTestGroupTestsElem `json:"tests"`

	// Test type for decapsulation validation
	Type MLKEMDecapsTestGroupType `json:"type"`
}

type MLKEMDecapsTestGroupParameterSet string

const MLKEMDecapsTestGroupParameterSetMLKEM1024 MLKEMDecapsTestGroupParameterSet = "ML-KEM-1024"
const MLKEMDecapsTestGroupParameterSetMLKEM512 MLKEMDecapsTestGroupParameterSet = "ML-KEM-512"
const MLKEMDecapsTestGroupParameterSetMLKEM768 MLKEMDecapsTestGroupParameterSet = "ML-KEM-768"

var enumValues_MLKEMDecapsTestGroupParameterSet = []interface{}{
	"ML-KEM-512",
	"ML-KEM-768",
	"ML-KEM-1024",
}

// UnmarshalJSON implements json.Unmarshaler.
func (j *MLKEMDecapsTestGroupParameterSet) UnmarshalJSON(value []byte) error {
	var v string
	if err := json.Unmarshal(value, &v); err != nil {
		return err
	}
	var ok bool
	for _, expected := range enumValues_MLKEMDecapsTestGroupParameterSet {
		if reflect.DeepEqual(v, expected) {
			ok = true
			break
		}
	}
	if !ok {
		return fmt.Errorf("invalid value (expected one of %#v): %#v", enumValues_MLKEMDecapsTestGroupParameterSet, v)
	}
	*j = MLKEMDecapsTestGroupParameterSet(v)
	return nil
}

type MLKEMDecapsTestGroupTestsElem struct {
	// An input ciphertext
	C string `json:"c"`

	// A brief description of the test case
	Comment *string `json:"comment,omitempty,omitzero"`

	// The full decapsulation key
	Dk string `json:"dk"`

	// A list of flags
	Flags []string `json:"flags"`

	// Result corresponds to the JSON schema field "result".
	Result Result `json:"result"`

	// Identifier of the test case
	TcId int `json:"tcId"`
}

// UnmarshalJSON implements json.Unmarshaler.
func (j *MLKEMDecapsTestGroupTestsElem) UnmarshalJSON(value []byte) error {
	var raw map[string]interface{}
	if err := json.Unmarshal(value, &raw); err != nil {
		return err
	}
	if _, ok := raw["c"]; raw != nil && !ok {
		return fmt.Errorf("field c in MLKEMDecapsTestGroupTestsElem: required")
	}
	if _, ok := raw["dk"]; raw != nil && !ok {
		return fmt.Errorf("field dk in MLKEMDecapsTestGroupTestsElem: required")
	}
	if _, ok := raw["flags"]; raw != nil && !ok {
		return fmt.Errorf("field flags in MLKEMDecapsTestGroupTestsElem: required")
	}
	if _, ok := raw["result"]; raw != nil && !ok {
		return fmt.Errorf("field result in MLKEMDecapsTestGroupTestsElem: required")
	}
	if _, ok := raw["tcId"]; raw != nil && !ok {
		return fmt.Errorf("field tcId in MLKEMDecapsTestGroupTestsElem: required")
	}
	type Plain MLKEMDecapsTestGroupTestsElem
	var plain Plain
	if err := json.Unmarshal(value, &plain); err != nil {
		return err
	}
	*j = MLKEMDecapsTestGroupTestsElem(plain)
	return nil
}

type MLKEMDecapsTestGroupType string

const MLKEMDecapsTestGroupTypeMLKEMDecapsValidationTest MLKEMDecapsTestGroupType = "MLKEMDecapsValidationTest"

var enumValues_MLKEMDecapsTestGroupType = []interface{}{
	"MLKEMDecapsValidationTest",
}

// UnmarshalJSON implements json.Unmarshaler.
func (j *MLKEMDecapsTestGroupType) UnmarshalJSON(value []byte) error {
	var v string
	if err := json.Unmarshal(value, &v); err != nil {
		return err
	}
	var ok bool
	for _, expected := range enumValues_MLKEMDecapsTestGroupType {
		if reflect.DeepEqual(v, expected) {
			ok = true
			break
		}
	}
	if !ok {
		return fmt.Errorf("invalid value (expected one of %#v): %#v", enumValues_MLKEMDecapsTestGroupType, v)
	}
	*j = MLKEMDecapsTestGroupType(v)
	return nil
}

// UnmarshalJSON implements json.Unmarshaler.
func (j *MLKEMDecapsTestGroup) UnmarshalJSON(value []byte) error {
	var raw map[string]interface{}
	if err := json.Unmarshal(value, &raw); err != nil {
		return err
	}
	if _, ok := raw["parameterSet"]; raw != nil && !ok {
		return fmt.Errorf("field parameterSet in MLKEMDecapsTestGroup: required")
	}
	if _, ok := raw["source"]; raw != nil && !ok {
		return fmt.Errorf("field source in MLKEMDecapsTestGroup: required")
	}
	if _, ok := raw["tests"]; raw != nil && !ok {
		return fmt.Errorf("field tests in MLKEMDecapsTestGroup: required")
	}
	if _, ok := raw["type"]; raw != nil && !ok {
		return fmt.Errorf("field type in MLKEMDecapsTestGroup: required")
	}
	type Plain MLKEMDecapsTestGroup
	var plain Plain
	if err := json.Unmarshal(value, &plain); err != nil {
		return err
	}
	*j = MLKEMDecapsTestGroup(plain)
	return nil
}

// A test for Encaps
type MLKEMEncapsTestGroup struct {
	// ParameterSet corresponds to the JSON schema field "parameterSet".
	ParameterSet MLKEMEncapsTestGroupParameterSet `json:"parameterSet"`

	// Source corresponds to the JSON schema field "source".
	Source Source `json:"source"`

	// Tests corresponds to the JSON schema field "tests".
	Tests []MLKEMEncapsTestGroupTestsElem `json:"tests"`

	// A legacy field, test files contain only one type per file
	Type *MLKEMEncapsTestGroupType `json:"type,omitempty,omitzero"`
}

type MLKEMEncapsTestGroupParameterSet string

const MLKEMEncapsTestGroupParameterSetMLKEM1024 MLKEMEncapsTestGroupParameterSet = "ML-KEM-1024"
const MLKEMEncapsTestGroupParameterSetMLKEM512 MLKEMEncapsTestGroupParameterSet = "ML-KEM-512"
const MLKEMEncapsTestGroupParameterSetMLKEM768 MLKEMEncapsTestGroupParameterSet = "ML-KEM-768"

var enumValues_MLKEMEncapsTestGroupParameterSet = []interface{}{
	"ML-KEM-512",
	"ML-KEM-768",
	"ML-KEM-1024",
}

// UnmarshalJSON implements json.Unmarshaler.
func (j *MLKEMEncapsTestGroupParameterSet) UnmarshalJSON(value []byte) error {
	var v string
	if err := json.Unmarshal(value, &v); err != nil {
		return err
	}
	var ok bool
	for _, expected := range enumValues_MLKEMEncapsTestGroupParameterSet {
		if reflect.DeepEqual(v, expected) {
			ok = true
			break
		}
	}
	if !ok {
		return fmt.Errorf("invalid value (expected one of %#v): %#v", enumValues_MLKEMEncapsTestGroupParameterSet, v)
	}
	*j = MLKEMEncapsTestGroupParameterSet(v)
	return nil
}

type MLKEMEncapsTestGroupTestsElem struct {
	// The output shared secret
	K string `json:"K"`

	// The output ciphertext
	C string `json:"c"`

	// A brief description of the test case
	Comment *string `json:"comment,omitempty,omitzero"`

	// The encapsulation key
	Ek string `json:"ek"`

	// A list of flags
	Flags []string `json:"flags"`

	// The ML-KEM.Encaps_internal m input, a 32-byte value
	M string `json:"m"`

	// Result corresponds to the JSON schema field "result".
	Result Result `json:"result"`

	// Identifier of the test case
	TcId int `json:"tcId"`
}

// UnmarshalJSON implements json.Unmarshaler.
func (j *MLKEMEncapsTestGroupTestsElem) UnmarshalJSON(value []byte) error {
	var raw map[string]interface{}
	if err := json.Unmarshal(value, &raw); err != nil {
		return err
	}
	if _, ok := raw["K"]; raw != nil && !ok {
		return fmt.Errorf("field K in MLKEMEncapsTestGroupTestsElem: required")
	}
	if _, ok := raw["c"]; raw != nil && !ok {
		return fmt.Errorf("field c in MLKEMEncapsTestGroupTestsElem: required")
	}
	if _, ok := raw["ek"]; raw != nil && !ok {
		return fmt.Errorf("field ek in MLKEMEncapsTestGroupTestsElem: required")
	}
	if _, ok := raw["flags"]; raw != nil && !ok {
		return fmt.Errorf("field flags in MLKEMEncapsTestGroupTestsElem: required")
	}
	if _, ok := raw["m"]; raw != nil && !ok {
		return fmt.Errorf("field m in MLKEMEncapsTestGroupTestsElem: required")
	}
	if _, ok := raw["result"]; raw != nil && !ok {
		return fmt.Errorf("field result in MLKEMEncapsTestGroupTestsElem: required")
	}
	if _, ok := raw["tcId"]; raw != nil && !ok {
		return fmt.Errorf("field tcId in MLKEMEncapsTestGroupTestsElem: required")
	}
	type Plain MLKEMEncapsTestGroupTestsElem
	var plain Plain
	if err := json.Unmarshal(value, &plain); err != nil {
		return err
	}
	if utf8.RuneCountInString(string(plain.M)) < 64 {
		return fmt.Errorf("field %s length: must be >= %d", "m", 64)
	}
	if utf8.RuneCountInString(string(plain.M)) > 64 {
		return fmt.Errorf("field %s length: must be <= %d", "m", 64)
	}
	*j = MLKEMEncapsTestGroupTestsElem(plain)
	return nil
}

type MLKEMEncapsTestGroupType string

const MLKEMEncapsTestGroupTypeMLKEMEncapsTest MLKEMEncapsTestGroupType = "MLKEMEncapsTest"

var enumValues_MLKEMEncapsTestGroupType = []interface{}{
	"MLKEMEncapsTest",
}

// UnmarshalJSON implements json.Unmarshaler.
func (j *MLKEMEncapsTestGroupType) UnmarshalJSON(value []byte) error {
	var v string
	if err := json.Unmarshal(value, &v); err != nil {
		return err
	}
	var ok bool
	for _, expected := range enumValues_MLKEMEncapsTestGroupType {
		if reflect.DeepEqual(v, expected) {
			ok = true
			break
		}
	}
	if !ok {
		return fmt.Errorf("invalid value (expected one of %#v): %#v", enumValues_MLKEMEncapsTestGroupType, v)
	}
	*j = MLKEMEncapsTestGroupType(v)
	return nil
}

// UnmarshalJSON implements json.Unmarshaler.
func (j *MLKEMEncapsTestGroup) UnmarshalJSON(value []byte) error {
	var raw map[string]interface{}
	if err := json.Unmarshal(value, &raw); err != nil {
		return err
	}
	if _, ok := raw["parameterSet"]; raw != nil && !ok {
		return fmt.Errorf("field parameterSet in MLKEMEncapsTestGroup: required")
	}
	if _, ok := raw["source"]; raw != nil && !ok {
		return fmt.Errorf("field source in MLKEMEncapsTestGroup: required")
	}
	if _, ok := raw["tests"]; raw != nil && !ok {
		return fmt.Errorf("field tests in MLKEMEncapsTestGroup: required")
	}
	type Plain MLKEMEncapsTestGroup
	var plain Plain
	if err := json.Unmarshal(value, &plain); err != nil {
		return err
	}
	*j = MLKEMEncapsTestGroup(plain)
	return nil
}

// A test for KeyGen using seed format
type MLKEMKeyGenTestGroup struct {
	// ParameterSet corresponds to the JSON schema field "parameterSet".
	ParameterSet MLKEMKeyGenTestGroupParameterSet `json:"parameterSet"`

	// Source corresponds to the JSON schema field "source".
	Source Source `json:"source"`

	// Tests corresponds to the JSON schema field "tests".
	Tests []MLKEMKeyGenTestGroupTestsElem `json:"tests"`

	// Type corresponds to the JSON schema field "type".
	Type MLKEMKeyGenTestGroupType `json:"type"`
}

type MLKEMKeyGenTestGroupParameterSet string

const MLKEMKeyGenTestGroupParameterSetMLKEM1024 MLKEMKeyGenTestGroupParameterSet = "ML-KEM-1024"
const MLKEMKeyGenTestGroupParameterSetMLKEM512 MLKEMKeyGenTestGroupParameterSet = "ML-KEM-512"
const MLKEMKeyGenTestGroupParameterSetMLKEM768 MLKEMKeyGenTestGroupParameterSet = "ML-KEM-768"

var enumValues_MLKEMKeyGenTestGroupParameterSet = []interface{}{
	"ML-KEM-512",
	"ML-KEM-768",
	"ML-KEM-1024",
}

// UnmarshalJSON implements json.Unmarshaler.
func (j *MLKEMKeyGenTestGroupParameterSet) UnmarshalJSON(value []byte) error {
	var v string
	if err := json.Unmarshal(value, &v); err != nil {
		return err
	}
	var ok bool
	for _, expected := range enumValues_MLKEMKeyGenTestGroupParameterSet {
		if reflect.DeepEqual(v, expected) {
			ok = true
			break
		}
	}
	if !ok {
		return fmt.Errorf("invalid value (expected one of %#v): %#v", enumValues_MLKEMKeyGenTestGroupParameterSet, v)
	}
	*j = MLKEMKeyGenTestGroupParameterSet(v)
	return nil
}

type MLKEMKeyGenTestGroupTestsElem struct {
	// A brief description of the test case
	Comment *string `json:"comment,omitempty,omitzero"`

	// The expected expanded decapsulation key
	Dk string `json:"dk"`

	// The expected encapsulation key
	Ek string `json:"ek"`

	// A list of flags
	Flags []string `json:"flags,omitempty,omitzero"`

	// Result corresponds to the JSON schema field "result".
	Result Result `json:"result"`

	// The d || z seed for key generation
	Seed string `json:"seed"`

	// Identifier of the test case
	TcId int `json:"tcId"`
}

// UnmarshalJSON implements json.Unmarshaler.
func (j *MLKEMKeyGenTestGroupTestsElem) UnmarshalJSON(value []byte) error {
	var raw map[string]interface{}
	if err := json.Unmarshal(value, &raw); err != nil {
		return err
	}
	if _, ok := raw["dk"]; raw != nil && !ok {
		return fmt.Errorf("field dk in MLKEMKeyGenTestGroupTestsElem: required")
	}
	if _, ok := raw["ek"]; raw != nil && !ok {
		return fmt.Errorf("field ek in MLKEMKeyGenTestGroupTestsElem: required")
	}
	if _, ok := raw["result"]; raw != nil && !ok {
		return fmt.Errorf("field result in MLKEMKeyGenTestGroupTestsElem: required")
	}
	if _, ok := raw["seed"]; raw != nil && !ok {
		return fmt.Errorf("field seed in MLKEMKeyGenTestGroupTestsElem: required")
	}
	if _, ok := raw["tcId"]; raw != nil && !ok {
		return fmt.Errorf("field tcId in MLKEMKeyGenTestGroupTestsElem: required")
	}
	type Plain MLKEMKeyGenTestGroupTestsElem
	var plain Plain
	if err := json.Unmarshal(value, &plain); err != nil {
		return err
	}
	*j = MLKEMKeyGenTestGroupTestsElem(plain)
	return nil
}

type MLKEMKeyGenTestGroupType string

const MLKEMKeyGenTestGroupTypeMLKEMKeyGen MLKEMKeyGenTestGroupType = "MLKEMKeyGen"

var enumValues_MLKEMKeyGenTestGroupType = []interface{}{
	"MLKEMKeyGen",
}

// UnmarshalJSON implements json.Unmarshaler.
func (j *MLKEMKeyGenTestGroupType) UnmarshalJSON(value []byte) error {
	var v string
	if err := json.Unmarshal(value, &v); err != nil {
		return err
	}
	var ok bool
	for _, expected := range enumValues_MLKEMKeyGenTestGroupType {
		if reflect.DeepEqual(v, expected) {
			ok = true
			break
		}
	}
	if !ok {
		return fmt.Errorf("invalid value (expected one of %#v): %#v", enumValues_MLKEMKeyGenTestGroupType, v)
	}
	*j = MLKEMKeyGenTestGroupType(v)
	return nil
}

// UnmarshalJSON implements json.Unmarshaler.
func (j *MLKEMKeyGenTestGroup) UnmarshalJSON(value []byte) error {
	var raw map[string]interface{}
	if err := json.Unmarshal(value, &raw); err != nil {
		return err
	}
	if _, ok := raw["parameterSet"]; raw != nil && !ok {
		return fmt.Errorf("field parameterSet in MLKEMKeyGenTestGroup: required")
	}
	if _, ok := raw["source"]; raw != nil && !ok {
		return fmt.Errorf("field source in MLKEMKeyGenTestGroup: required")
	}
	if _, ok := raw["tests"]; raw != nil && !ok {
		return fmt.Errorf("field tests in MLKEMKeyGenTestGroup: required")
	}
	if _, ok := raw["type"]; raw != nil && !ok {
		return fmt.Errorf("field type in MLKEMKeyGenTestGroup: required")
	}
	type Plain MLKEMKeyGenTestGroup
	var plain Plain
	if err := json.Unmarshal(value, &plain); err != nil {
		return err
	}
	*j = MLKEMKeyGenTestGroup(plain)
	return nil
}

// A test for KeyGen and/or Decaps
type MLKEMTestGroup struct {
	// ParameterSet corresponds to the JSON schema field "parameterSet".
	ParameterSet MLKEMTestGroupParameterSet `json:"parameterSet"`

	// Source corresponds to the JSON schema field "source".
	Source Source `json:"source"`

	// Tests corresponds to the JSON schema field "tests".
	Tests []MLKEMTestGroupTestsElem `json:"tests"`

	// A legacy field, test files contain only one type per file
	Type MLKEMTestGroupType `json:"type"`
}

type MLKEMTestGroupParameterSet string

const MLKEMTestGroupParameterSetMLKEM1024 MLKEMTestGroupParameterSet = "ML-KEM-1024"
const MLKEMTestGroupParameterSetMLKEM512 MLKEMTestGroupParameterSet = "ML-KEM-512"
const MLKEMTestGroupParameterSetMLKEM768 MLKEMTestGroupParameterSet = "ML-KEM-768"

var enumValues_MLKEMTestGroupParameterSet = []interface{}{
	"ML-KEM-512",
	"ML-KEM-768",
	"ML-KEM-1024",
}

// UnmarshalJSON implements json.Unmarshaler.
func (j *MLKEMTestGroupParameterSet) UnmarshalJSON(value []byte) error {
	var v string
	if err := json.Unmarshal(value, &v); err != nil {
		return err
	}
	var ok bool
	for _, expected := range enumValues_MLKEMTestGroupParameterSet {
		if reflect.DeepEqual(v, expected) {
			ok = true
			break
		}
	}
	if !ok {
		return fmt.Errorf("invalid value (expected one of %#v): %#v", enumValues_MLKEMTestGroupParameterSet, v)
	}
	*j = MLKEMTestGroupParameterSet(v)
	return nil
}

type MLKEMTestGroupTestsElem struct {
	// The output shared secret
	K string `json:"K"`

	// An input ciphertext
	C string `json:"c"`

	// A brief description of the test case
	Comment *string `json:"comment,omitempty,omitzero"`

	// The encapsulation key derived from the seed
	Ek *string `json:"ek,omitempty,omitzero"`

	// A list of flags
	Flags []string `json:"flags"`

	// Result corresponds to the JSON schema field "result".
	Result Result `json:"result"`

	// The d || z seed
	Seed string `json:"seed"`

	// Identifier of the test case
	TcId int `json:"tcId"`
}

// UnmarshalJSON implements json.Unmarshaler.
func (j *MLKEMTestGroupTestsElem) UnmarshalJSON(value []byte) error {
	var raw map[string]interface{}
	if err := json.Unmarshal(value, &raw); err != nil {
		return err
	}
	if _, ok := raw["K"]; raw != nil && !ok {
		return fmt.Errorf("field K in MLKEMTestGroupTestsElem: required")
	}
	if _, ok := raw["c"]; raw != nil && !ok {
		return fmt.Errorf("field c in MLKEMTestGroupTestsElem: required")
	}
	if _, ok := raw["flags"]; raw != nil && !ok {
		return fmt.Errorf("field flags in MLKEMTestGroupTestsElem: required")
	}
	if _, ok := raw["result"]; raw != nil && !ok {
		return fmt.Errorf("field result in MLKEMTestGroupTestsElem: required")
	}
	if _, ok := raw["seed"]; raw != nil && !ok {
		return fmt.Errorf("field seed in MLKEMTestGroupTestsElem: required")
	}
	if _, ok := raw["tcId"]; raw != nil && !ok {
		return fmt.Errorf("field tcId in MLKEMTestGroupTestsElem: required")
	}
	type Plain MLKEMTestGroupTestsElem
	var plain Plain
	if err := json.Unmarshal(value, &plain); err != nil {
		return err
	}
	*j = MLKEMTestGroupTestsElem(plain)
	return nil
}

type MLKEMTestGroupType string

const MLKEMTestGroupTypeMLKEMTest MLKEMTestGroupType = "MLKEMTest"

var enumValues_MLKEMTestGroupType = []interface{}{
	"MLKEMTest",
}

// UnmarshalJSON implements json.Unmarshaler.
func (j *MLKEMTestGroupType) UnmarshalJSON(value []byte) error {
	var v string
	if err := json.Unmarshal(value, &v); err != nil {
		return err
	}
	var ok bool
	for _, expected := range enumValues_MLKEMTestGroupType {
		if reflect.DeepEqual(v, expected) {
			ok = true
			break
		}
	}
	if !ok {
		return fmt.Errorf("invalid value (expected one of %#v): %#v", enumValues_MLKEMTestGroupType, v)
	}
	*j = MLKEMTestGroupType(v)
	return nil
}

// UnmarshalJSON implements json.Unmarshaler.
func (j *MLKEMTestGroup) UnmarshalJSON(value []byte) error {
	var raw map[string]interface{}
	if err := json.Unmarshal(value, &raw); err != nil {
		return err
	}
	if _, ok := raw["parameterSet"]; raw != nil && !ok {
		return fmt.Errorf("field parameterSet in MLKEMTestGroup: required")
	}
	if _, ok := raw["source"]; raw != nil && !ok {
		return fmt.Errorf("field source in MLKEMTestGroup: required")
	}
	if _, ok := raw["tests"]; raw != nil && !ok {
		return fmt.Errorf("field tests in MLKEMTestGroup: required")
	}
	if _, ok := raw["type"]; raw != nil && !ok {
		return fmt.Errorf("field type in MLKEMTestGroup: required")
	}
	type Plain MLKEMTestGroup
	var plain Plain
	if err := json.Unmarshal(value, &plain); err != nil {
		return err
	}
	*j = MLKEMTestGroup(plain)
	return nil
}

type MacTestGroup struct {
	// the keySize in bits
	KeySize int `json:"keySize"`

	// Source corresponds to the JSON schema field "source".
	Source Source `json:"source"`

	// the expected size of the tag in bits
	TagSize int `json:"tagSize"`

	// Tests corresponds to the JSON schema field "tests".
	Tests []MacTestVector `json:"tests"`

	// Type corresponds to the JSON schema field "type".
	Type MacTestGroupType `json:"type"`
}

type MacTestGroupType string

const MacTestGroupTypeMacTest MacTestGroupType = "MacTest"

var enumValues_MacTestGroupType = []interface{}{
	"MacTest",
}

// UnmarshalJSON implements json.Unmarshaler.
func (j *MacTestGroupType) UnmarshalJSON(value []byte) error {
	var v string
	if err := json.Unmarshal(value, &v); err != nil {
		return err
	}
	var ok bool
	for _, expected := range enumValues_MacTestGroupType {
		if reflect.DeepEqual(v, expected) {
			ok = true
			break
		}
	}
	if !ok {
		return fmt.Errorf("invalid value (expected one of %#v): %#v", enumValues_MacTestGroupType, v)
	}
	*j = MacTestGroupType(v)
	return nil
}

// UnmarshalJSON implements json.Unmarshaler.
func (j *MacTestGroup) UnmarshalJSON(value []byte) error {
	var raw map[string]interface{}
	if err := json.Unmarshal(value, &raw); err != nil {
		return err
	}
	if _, ok := raw["keySize"]; raw != nil && !ok {
		return fmt.Errorf("field keySize in MacTestGroup: required")
	}
	if _, ok := raw["source"]; raw != nil && !ok {
		return fmt.Errorf("field source in MacTestGroup: required")
	}
	if _, ok := raw["tagSize"]; raw != nil && !ok {
		return fmt.Errorf("field tagSize in MacTestGroup: required")
	}
	if _, ok := raw["tests"]; raw != nil && !ok {
		return fmt.Errorf("field tests in MacTestGroup: required")
	}
	if _, ok := raw["type"]; raw != nil && !ok {
		return fmt.Errorf("field type in MacTestGroup: required")
	}
	type Plain MacTestGroup
	var plain Plain
	if err := json.Unmarshal(value, &plain); err != nil {
		return err
	}
	*j = MacTestGroup(plain)
	return nil
}

type MacTestSchemaV1Json struct {
	// the primitive tested in the test file
	Algorithm string `json:"algorithm"`

	// DEPRECATED: prefer "source" property in test group
	GeneratorVersion *string `json:"generatorVersion,omitempty,omitzero"`

	// additional documentation
	Header []string `json:"header"`

	// Notes corresponds to the JSON schema field "notes".
	Notes Notes `json:"notes"`

	// the number of test vectors in this test
	NumberOfTests int `json:"numberOfTests"`

	// Schema corresponds to the JSON schema field "schema".
	Schema MacTestSchemaV1JsonSchema `json:"schema"`

	// TestGroups corresponds to the JSON schema field "testGroups".
	TestGroups []MacTestGroup `json:"testGroups"`
}

type MacTestSchemaV1JsonSchema string

const MacTestSchemaV1JsonSchemaMacTestSchemaV1Json MacTestSchemaV1JsonSchema = "mac_test_schema_v1.json"

var enumValues_MacTestSchemaV1JsonSchema = []interface{}{
	"mac_test_schema_v1.json",
}

// UnmarshalJSON implements json.Unmarshaler.
func (j *MacTestSchemaV1JsonSchema) UnmarshalJSON(value []byte) error {
	var v string
	if err := json.Unmarshal(value, &v); err != nil {
		return err
	}
	var ok bool
	for _, expected := range enumValues_MacTestSchemaV1JsonSchema {
		if reflect.DeepEqual(v, expected) {
			ok = true
			break
		}
	}
	if !ok {
		return fmt.Errorf("invalid value (expected one of %#v): %#v", enumValues_MacTestSchemaV1JsonSchema, v)
	}
	*j = MacTestSchemaV1JsonSchema(v)
	return nil
}

// UnmarshalJSON implements json.Unmarshaler.
func (j *MacTestSchemaV1Json) UnmarshalJSON(value []byte) error {
	var raw map[string]interface{}
	if err := json.Unmarshal(value, &raw); err != nil {
		return err
	}
	if _, ok := raw["algorithm"]; raw != nil && !ok {
		return fmt.Errorf("field algorithm in MacTestSchemaV1Json: required")
	}
	if _, ok := raw["header"]; raw != nil && !ok {
		return fmt.Errorf("field header in MacTestSchemaV1Json: required")
	}
	if _, ok := raw["notes"]; raw != nil && !ok {
		return fmt.Errorf("field notes in MacTestSchemaV1Json: required")
	}
	if _, ok := raw["numberOfTests"]; raw != nil && !ok {
		return fmt.Errorf("field numberOfTests in MacTestSchemaV1Json: required")
	}
	if _, ok := raw["schema"]; raw != nil && !ok {
		return fmt.Errorf("field schema in MacTestSchemaV1Json: required")
	}
	if _, ok := raw["testGroups"]; raw != nil && !ok {
		return fmt.Errorf("field testGroups in MacTestSchemaV1Json: required")
	}
	type Plain MacTestSchemaV1Json
	var plain Plain
	if err := json.Unmarshal(value, &plain); err != nil {
		return err
	}
	*j = MacTestSchemaV1Json(plain)
	return nil
}

type MacTestVector struct {
	// A brief description of the test case
	Comment string `json:"comment"`

	// A list of flags
	Flags []string `json:"flags"`

	// the key
	Key string `json:"key"`

	// the plaintext
	Msg string `json:"msg"`

	// Result corresponds to the JSON schema field "result".
	Result Result `json:"result"`

	// the authentication tag
	Tag string `json:"tag"`

	// Identifier of the test case
	TcId int `json:"tcId"`
}

// UnmarshalJSON implements json.Unmarshaler.
func (j *MacTestVector) UnmarshalJSON(value []byte) error {
	var raw map[string]interface{}
	if err := json.Unmarshal(value, &raw); err != nil {
		return err
	}
	if _, ok := raw["comment"]; raw != nil && !ok {
		return fmt.Errorf("field comment in MacTestVector: required")
	}
	if _, ok := raw["flags"]; raw != nil && !ok {
		return fmt.Errorf("field flags in MacTestVector: required")
	}
	if _, ok := raw["key"]; raw != nil && !ok {
		return fmt.Errorf("field key in MacTestVector: required")
	}
	if _, ok := raw["msg"]; raw != nil && !ok {
		return fmt.Errorf("field msg in MacTestVector: required")
	}
	if _, ok := raw["result"]; raw != nil && !ok {
		return fmt.Errorf("field result in MacTestVector: required")
	}
	if _, ok := raw["tag"]; raw != nil && !ok {
		return fmt.Errorf("field tag in MacTestVector: required")
	}
	if _, ok := raw["tcId"]; raw != nil && !ok {
		return fmt.Errorf("field tcId in MacTestVector: required")
	}
	type Plain MacTestVector
	var plain Plain
	if err := json.Unmarshal(value, &plain); err != nil {
		return err
	}
	*j = MacTestVector(plain)
	return nil
}

type MacWithIvTestGroup struct {
	// the IV size in bits
	IvSize int `json:"ivSize"`

	// the key size in bits
	KeySize int `json:"keySize"`

	// Source corresponds to the JSON schema field "source".
	Source Source `json:"source"`

	// the expected size of the tag in bits
	TagSize int `json:"tagSize"`

	// Tests corresponds to the JSON schema field "tests".
	Tests []MacWithIvTestVector `json:"tests"`

	// Type corresponds to the JSON schema field "type".
	Type MacWithIvTestGroupType `json:"type"`
}

type MacWithIvTestGroupType string

const MacWithIvTestGroupTypeMacWithIvTest MacWithIvTestGroupType = "MacWithIvTest"

var enumValues_MacWithIvTestGroupType = []interface{}{
	"MacWithIvTest",
}

// UnmarshalJSON implements json.Unmarshaler.
func (j *MacWithIvTestGroupType) UnmarshalJSON(value []byte) error {
	var v string
	if err := json.Unmarshal(value, &v); err != nil {
		return err
	}
	var ok bool
	for _, expected := range enumValues_MacWithIvTestGroupType {
		if reflect.DeepEqual(v, expected) {
			ok = true
			break
		}
	}
	if !ok {
		return fmt.Errorf("invalid value (expected one of %#v): %#v", enumValues_MacWithIvTestGroupType, v)
	}
	*j = MacWithIvTestGroupType(v)
	return nil
}

// UnmarshalJSON implements json.Unmarshaler.
func (j *MacWithIvTestGroup) UnmarshalJSON(value []byte) error {
	var raw map[string]interface{}
	if err := json.Unmarshal(value, &raw); err != nil {
		return err
	}
	if _, ok := raw["ivSize"]; raw != nil && !ok {
		return fmt.Errorf("field ivSize in MacWithIvTestGroup: required")
	}
	if _, ok := raw["keySize"]; raw != nil && !ok {
		return fmt.Errorf("field keySize in MacWithIvTestGroup: required")
	}
	if _, ok := raw["source"]; raw != nil && !ok {
		return fmt.Errorf("field source in MacWithIvTestGroup: required")
	}
	if _, ok := raw["tagSize"]; raw != nil && !ok {
		return fmt.Errorf("field tagSize in MacWithIvTestGroup: required")
	}
	if _, ok := raw["tests"]; raw != nil && !ok {
		return fmt.Errorf("field tests in MacWithIvTestGroup: required")
	}
	if _, ok := raw["type"]; raw != nil && !ok {
		return fmt.Errorf("field type in MacWithIvTestGroup: required")
	}
	type Plain MacWithIvTestGroup
	var plain Plain
	if err := json.Unmarshal(value, &plain); err != nil {
		return err
	}
	*j = MacWithIvTestGroup(plain)
	return nil
}

type MacWithIvTestSchemaV1Json struct {
	// the primitive tested in the test file
	Algorithm string `json:"algorithm"`

	// DEPRECATED: prefer "source" property in test group
	GeneratorVersion *string `json:"generatorVersion,omitempty,omitzero"`

	// additional documentation
	Header []string `json:"header"`

	// Notes corresponds to the JSON schema field "notes".
	Notes Notes `json:"notes"`

	// the number of test vectors in this test
	NumberOfTests int `json:"numberOfTests"`

	// Schema corresponds to the JSON schema field "schema".
	Schema MacWithIvTestSchemaV1JsonSchema `json:"schema"`

	// TestGroups corresponds to the JSON schema field "testGroups".
	TestGroups []MacWithIvTestGroup `json:"testGroups"`
}

type MacWithIvTestSchemaV1JsonSchema string

const MacWithIvTestSchemaV1JsonSchemaMacWithIvTestSchemaV1Json MacWithIvTestSchemaV1JsonSchema = "mac_with_iv_test_schema_v1.json"

var enumValues_MacWithIvTestSchemaV1JsonSchema = []interface{}{
	"mac_with_iv_test_schema_v1.json",
}

// UnmarshalJSON implements json.Unmarshaler.
func (j *MacWithIvTestSchemaV1JsonSchema) UnmarshalJSON(value []byte) error {
	var v string
	if err := json.Unmarshal(value, &v); err != nil {
		return err
	}
	var ok bool
	for _, expected := range enumValues_MacWithIvTestSchemaV1JsonSchema {
		if reflect.DeepEqual(v, expected) {
			ok = true
			break
		}
	}
	if !ok {
		return fmt.Errorf("invalid value (expected one of %#v): %#v", enumValues_MacWithIvTestSchemaV1JsonSchema, v)
	}
	*j = MacWithIvTestSchemaV1JsonSchema(v)
	return nil
}

// UnmarshalJSON implements json.Unmarshaler.
func (j *MacWithIvTestSchemaV1Json) UnmarshalJSON(value []byte) error {
	var raw map[string]interface{}
	if err := json.Unmarshal(value, &raw); err != nil {
		return err
	}
	if _, ok := raw["algorithm"]; raw != nil && !ok {
		return fmt.Errorf("field algorithm in MacWithIvTestSchemaV1Json: required")
	}
	if _, ok := raw["header"]; raw != nil && !ok {
		return fmt.Errorf("field header in MacWithIvTestSchemaV1Json: required")
	}
	if _, ok := raw["notes"]; raw != nil && !ok {
		return fmt.Errorf("field notes in MacWithIvTestSchemaV1Json: required")
	}
	if _, ok := raw["numberOfTests"]; raw != nil && !ok {
		return fmt.Errorf("field numberOfTests in MacWithIvTestSchemaV1Json: required")
	}
	if _, ok := raw["schema"]; raw != nil && !ok {
		return fmt.Errorf("field schema in MacWithIvTestSchemaV1Json: required")
	}
	if _, ok := raw["testGroups"]; raw != nil && !ok {
		return fmt.Errorf("field testGroups in MacWithIvTestSchemaV1Json: required")
	}
	type Plain MacWithIvTestSchemaV1Json
	var plain Plain
	if err := json.Unmarshal(value, &plain); err != nil {
		return err
	}
	*j = MacWithIvTestSchemaV1Json(plain)
	return nil
}

type MacWithIvTestVector struct {
	// A brief description of the test case
	Comment string `json:"comment"`

	// A list of flags
	Flags []string `json:"flags"`

	// the initialisation vector
	Iv string `json:"iv"`

	// the key
	Key string `json:"key"`

	// the plaintext
	Msg string `json:"msg"`

	// Result corresponds to the JSON schema field "result".
	Result Result `json:"result"`

	// the authentication tag
	Tag string `json:"tag"`

	// Identifier of the test case
	TcId int `json:"tcId"`
}

// UnmarshalJSON implements json.Unmarshaler.
func (j *MacWithIvTestVector) UnmarshalJSON(value []byte) error {
	var raw map[string]interface{}
	if err := json.Unmarshal(value, &raw); err != nil {
		return err
	}
	if _, ok := raw["comment"]; raw != nil && !ok {
		return fmt.Errorf("field comment in MacWithIvTestVector: required")
	}
	if _, ok := raw["flags"]; raw != nil && !ok {
		return fmt.Errorf("field flags in MacWithIvTestVector: required")
	}
	if _, ok := raw["iv"]; raw != nil && !ok {
		return fmt.Errorf("field iv in MacWithIvTestVector: required")
	}
	if _, ok := raw["key"]; raw != nil && !ok {
		return fmt.Errorf("field key in MacWithIvTestVector: required")
	}
	if _, ok := raw["msg"]; raw != nil && !ok {
		return fmt.Errorf("field msg in MacWithIvTestVector: required")
	}
	if _, ok := raw["result"]; raw != nil && !ok {
		return fmt.Errorf("field result in MacWithIvTestVector: required")
	}
	if _, ok := raw["tag"]; raw != nil && !ok {
		return fmt.Errorf("field tag in MacWithIvTestVector: required")
	}
	if _, ok := raw["tcId"]; raw != nil && !ok {
		return fmt.Errorf("field tcId in MacWithIvTestVector: required")
	}
	type Plain MacWithIvTestVector
	var plain Plain
	if err := json.Unmarshal(value, &plain); err != nil {
		return err
	}
	*j = MacWithIvTestVector(plain)
	return nil
}

type MlDsaSignNoSeedTestGroup struct {
	// Encoded ML-DSA private key
	PrivateKey string `json:"privateKey"`

	// Encoded ML-DSA public key derived from the private key, or null if the private
	// key is invalid
	PublicKey interface{} `json:"publicKey"`

	// Source corresponds to the JSON schema field "source".
	Source Source `json:"source"`

	// Tests corresponds to the JSON schema field "tests".
	Tests []MlDsaSignTestVector `json:"tests"`

	// Type corresponds to the JSON schema field "type".
	Type MlDsaSignNoSeedTestGroupType `json:"type"`
}

type MlDsaSignNoSeedTestGroupType string

const MlDsaSignNoSeedTestGroupTypeMlDsaSign MlDsaSignNoSeedTestGroupType = "MlDsaSign"

var enumValues_MlDsaSignNoSeedTestGroupType = []interface{}{
	"MlDsaSign",
}

// UnmarshalJSON implements json.Unmarshaler.
func (j *MlDsaSignNoSeedTestGroupType) UnmarshalJSON(value []byte) error {
	var v string
	if err := json.Unmarshal(value, &v); err != nil {
		return err
	}
	var ok bool
	for _, expected := range enumValues_MlDsaSignNoSeedTestGroupType {
		if reflect.DeepEqual(v, expected) {
			ok = true
			break
		}
	}
	if !ok {
		return fmt.Errorf("invalid value (expected one of %#v): %#v", enumValues_MlDsaSignNoSeedTestGroupType, v)
	}
	*j = MlDsaSignNoSeedTestGroupType(v)
	return nil
}

// UnmarshalJSON implements json.Unmarshaler.
func (j *MlDsaSignNoSeedTestGroup) UnmarshalJSON(value []byte) error {
	var raw map[string]interface{}
	if err := json.Unmarshal(value, &raw); err != nil {
		return err
	}
	if _, ok := raw["privateKey"]; raw != nil && !ok {
		return fmt.Errorf("field privateKey in MlDsaSignNoSeedTestGroup: required")
	}
	if _, ok := raw["publicKey"]; raw != nil && !ok {
		return fmt.Errorf("field publicKey in MlDsaSignNoSeedTestGroup: required")
	}
	if _, ok := raw["source"]; raw != nil && !ok {
		return fmt.Errorf("field source in MlDsaSignNoSeedTestGroup: required")
	}
	if _, ok := raw["tests"]; raw != nil && !ok {
		return fmt.Errorf("field tests in MlDsaSignNoSeedTestGroup: required")
	}
	if _, ok := raw["type"]; raw != nil && !ok {
		return fmt.Errorf("field type in MlDsaSignNoSeedTestGroup: required")
	}
	type Plain MlDsaSignNoSeedTestGroup
	var plain Plain
	if err := json.Unmarshal(value, &plain); err != nil {
		return err
	}
	*j = MlDsaSignNoSeedTestGroup(plain)
	return nil
}

type MlDsaSignTestGroup struct {
	// Private key as a DER-encoded PrivateKeyInfo, using the seed form
	PrivateKeyPkcs8 *string `json:"privateKeyPkcs8,omitempty,omitzero"`

	// 32-byte seed that generated the private key
	PrivateSeed string `json:"privateSeed"`

	// Encoded ML-DSA public key derived from the private seed, or null if the private
	// seed is invalid
	PublicKey interface{} `json:"publicKey"`

	// Source corresponds to the JSON schema field "source".
	Source Source `json:"source"`

	// Tests corresponds to the JSON schema field "tests".
	Tests []MlDsaSignTestVector `json:"tests"`

	// Type corresponds to the JSON schema field "type".
	Type MlDsaSignTestGroupType `json:"type"`
}

type MlDsaSignTestGroupType string

const MlDsaSignTestGroupTypeMlDsaSign MlDsaSignTestGroupType = "MlDsaSign"

var enumValues_MlDsaSignTestGroupType = []interface{}{
	"MlDsaSign",
}

// UnmarshalJSON implements json.Unmarshaler.
func (j *MlDsaSignTestGroupType) UnmarshalJSON(value []byte) error {
	var v string
	if err := json.Unmarshal(value, &v); err != nil {
		return err
	}
	var ok bool
	for _, expected := range enumValues_MlDsaSignTestGroupType {
		if reflect.DeepEqual(v, expected) {
			ok = true
			break
		}
	}
	if !ok {
		return fmt.Errorf("invalid value (expected one of %#v): %#v", enumValues_MlDsaSignTestGroupType, v)
	}
	*j = MlDsaSignTestGroupType(v)
	return nil
}

// UnmarshalJSON implements json.Unmarshaler.
func (j *MlDsaSignTestGroup) UnmarshalJSON(value []byte) error {
	var raw map[string]interface{}
	if err := json.Unmarshal(value, &raw); err != nil {
		return err
	}
	if _, ok := raw["privateSeed"]; raw != nil && !ok {
		return fmt.Errorf("field privateSeed in MlDsaSignTestGroup: required")
	}
	if _, ok := raw["publicKey"]; raw != nil && !ok {
		return fmt.Errorf("field publicKey in MlDsaSignTestGroup: required")
	}
	if _, ok := raw["source"]; raw != nil && !ok {
		return fmt.Errorf("field source in MlDsaSignTestGroup: required")
	}
	if _, ok := raw["tests"]; raw != nil && !ok {
		return fmt.Errorf("field tests in MlDsaSignTestGroup: required")
	}
	if _, ok := raw["type"]; raw != nil && !ok {
		return fmt.Errorf("field type in MlDsaSignTestGroup: required")
	}
	type Plain MlDsaSignTestGroup
	var plain Plain
	if err := json.Unmarshal(value, &plain); err != nil {
		return err
	}
	*j = MlDsaSignTestGroup(plain)
	return nil
}

type MlDsaSignTestVector interface{}

type MlDsaVerifyTestGroup struct {
	// Encoded ML-DSA public key
	PublicKey string `json:"publicKey"`

	// Public key as a DER-encoded SubjectPublicKeyInfo
	PublicKeyDer string `json:"publicKeyDer"`

	// Source corresponds to the JSON schema field "source".
	Source *Source `json:"source,omitempty,omitzero"`

	// Tests corresponds to the JSON schema field "tests".
	Tests []MlDsaVerifyTestVector `json:"tests"`

	// Type corresponds to the JSON schema field "type".
	Type MlDsaVerifyTestGroupType `json:"type"`
}

type MlDsaVerifyTestGroupType string

const MlDsaVerifyTestGroupTypeMlDsaVerify MlDsaVerifyTestGroupType = "MlDsaVerify"

var enumValues_MlDsaVerifyTestGroupType = []interface{}{
	"MlDsaVerify",
}

// UnmarshalJSON implements json.Unmarshaler.
func (j *MlDsaVerifyTestGroupType) UnmarshalJSON(value []byte) error {
	var v string
	if err := json.Unmarshal(value, &v); err != nil {
		return err
	}
	var ok bool
	for _, expected := range enumValues_MlDsaVerifyTestGroupType {
		if reflect.DeepEqual(v, expected) {
			ok = true
			break
		}
	}
	if !ok {
		return fmt.Errorf("invalid value (expected one of %#v): %#v", enumValues_MlDsaVerifyTestGroupType, v)
	}
	*j = MlDsaVerifyTestGroupType(v)
	return nil
}

// UnmarshalJSON implements json.Unmarshaler.
func (j *MlDsaVerifyTestGroup) UnmarshalJSON(value []byte) error {
	var raw map[string]interface{}
	if err := json.Unmarshal(value, &raw); err != nil {
		return err
	}
	if _, ok := raw["publicKey"]; raw != nil && !ok {
		return fmt.Errorf("field publicKey in MlDsaVerifyTestGroup: required")
	}
	if _, ok := raw["publicKeyDer"]; raw != nil && !ok {
		return fmt.Errorf("field publicKeyDer in MlDsaVerifyTestGroup: required")
	}
	if _, ok := raw["tests"]; raw != nil && !ok {
		return fmt.Errorf("field tests in MlDsaVerifyTestGroup: required")
	}
	if _, ok := raw["type"]; raw != nil && !ok {
		return fmt.Errorf("field type in MlDsaVerifyTestGroup: required")
	}
	type Plain MlDsaVerifyTestGroup
	var plain Plain
	if err := json.Unmarshal(value, &plain); err != nil {
		return err
	}
	*j = MlDsaVerifyTestGroup(plain)
	return nil
}

type MlDsaVerifyTestVector struct {
	// A brief description of the test case
	Comment string `json:"comment"`

	// [optional] The additional context string (empty if not provided)
	Ctx *string `json:"ctx,omitempty,omitzero"`

	// A list of flags
	Flags []string `json:"flags"`

	// The message to verify
	Msg string `json:"msg"`

	// Result corresponds to the JSON schema field "result".
	Result Result `json:"result"`

	// The encoded signature
	Sig string `json:"sig"`

	// Identifier of the test case
	TcId int `json:"tcId"`
}

// UnmarshalJSON implements json.Unmarshaler.
func (j *MlDsaVerifyTestVector) UnmarshalJSON(value []byte) error {
	var raw map[string]interface{}
	if err := json.Unmarshal(value, &raw); err != nil {
		return err
	}
	if _, ok := raw["comment"]; raw != nil && !ok {
		return fmt.Errorf("field comment in MlDsaVerifyTestVector: required")
	}
	if _, ok := raw["flags"]; raw != nil && !ok {
		return fmt.Errorf("field flags in MlDsaVerifyTestVector: required")
	}
	if _, ok := raw["msg"]; raw != nil && !ok {
		return fmt.Errorf("field msg in MlDsaVerifyTestVector: required")
	}
	if _, ok := raw["result"]; raw != nil && !ok {
		return fmt.Errorf("field result in MlDsaVerifyTestVector: required")
	}
	if _, ok := raw["sig"]; raw != nil && !ok {
		return fmt.Errorf("field sig in MlDsaVerifyTestVector: required")
	}
	if _, ok := raw["tcId"]; raw != nil && !ok {
		return fmt.Errorf("field tcId in MlDsaVerifyTestVector: required")
	}
	type Plain MlDsaVerifyTestVector
	var plain Plain
	if err := json.Unmarshal(value, &plain); err != nil {
		return err
	}
	*j = MlDsaVerifyTestVector(plain)
	return nil
}

type MldsaSignNoseedSchemaJson struct {
	// the primitive tested in the test file
	Algorithm string `json:"algorithm"`

	// additional documentation
	Header []string `json:"header"`

	// Notes corresponds to the JSON schema field "notes".
	Notes Notes `json:"notes"`

	// the number of test vectors in this test
	NumberOfTests int `json:"numberOfTests"`

	// Schema corresponds to the JSON schema field "schema".
	Schema MldsaSignNoseedSchemaJsonSchema `json:"schema"`

	// TestGroups corresponds to the JSON schema field "testGroups".
	TestGroups []MlDsaSignNoSeedTestGroup `json:"testGroups"`
}

type MldsaSignNoseedSchemaJsonSchema string

const MldsaSignNoseedSchemaJsonSchemaMldsaSignNoseedSchemaJson MldsaSignNoseedSchemaJsonSchema = "mldsa_sign_noseed_schema.json"

var enumValues_MldsaSignNoseedSchemaJsonSchema = []interface{}{
	"mldsa_sign_noseed_schema.json",
}

// UnmarshalJSON implements json.Unmarshaler.
func (j *MldsaSignNoseedSchemaJsonSchema) UnmarshalJSON(value []byte) error {
	var v string
	if err := json.Unmarshal(value, &v); err != nil {
		return err
	}
	var ok bool
	for _, expected := range enumValues_MldsaSignNoseedSchemaJsonSchema {
		if reflect.DeepEqual(v, expected) {
			ok = true
			break
		}
	}
	if !ok {
		return fmt.Errorf("invalid value (expected one of %#v): %#v", enumValues_MldsaSignNoseedSchemaJsonSchema, v)
	}
	*j = MldsaSignNoseedSchemaJsonSchema(v)
	return nil
}

// UnmarshalJSON implements json.Unmarshaler.
func (j *MldsaSignNoseedSchemaJson) UnmarshalJSON(value []byte) error {
	var raw map[string]interface{}
	if err := json.Unmarshal(value, &raw); err != nil {
		return err
	}
	if _, ok := raw["algorithm"]; raw != nil && !ok {
		return fmt.Errorf("field algorithm in MldsaSignNoseedSchemaJson: required")
	}
	if _, ok := raw["header"]; raw != nil && !ok {
		return fmt.Errorf("field header in MldsaSignNoseedSchemaJson: required")
	}
	if _, ok := raw["notes"]; raw != nil && !ok {
		return fmt.Errorf("field notes in MldsaSignNoseedSchemaJson: required")
	}
	if _, ok := raw["numberOfTests"]; raw != nil && !ok {
		return fmt.Errorf("field numberOfTests in MldsaSignNoseedSchemaJson: required")
	}
	if _, ok := raw["schema"]; raw != nil && !ok {
		return fmt.Errorf("field schema in MldsaSignNoseedSchemaJson: required")
	}
	if _, ok := raw["testGroups"]; raw != nil && !ok {
		return fmt.Errorf("field testGroups in MldsaSignNoseedSchemaJson: required")
	}
	type Plain MldsaSignNoseedSchemaJson
	var plain Plain
	if err := json.Unmarshal(value, &plain); err != nil {
		return err
	}
	*j = MldsaSignNoseedSchemaJson(plain)
	return nil
}

type MldsaSignSeedSchemaJson struct {
	// the primitive tested in the test file
	Algorithm string `json:"algorithm"`

	// additional documentation
	Header []string `json:"header"`

	// Notes corresponds to the JSON schema field "notes".
	Notes Notes `json:"notes"`

	// the number of test vectors in this test
	NumberOfTests int `json:"numberOfTests"`

	// Schema corresponds to the JSON schema field "schema".
	Schema MldsaSignSeedSchemaJsonSchema `json:"schema"`

	// TestGroups corresponds to the JSON schema field "testGroups".
	TestGroups []MlDsaSignTestGroup `json:"testGroups"`
}

type MldsaSignSeedSchemaJsonSchema string

const MldsaSignSeedSchemaJsonSchemaMldsaSignSeedSchemaJson MldsaSignSeedSchemaJsonSchema = "mldsa_sign_seed_schema.json"

var enumValues_MldsaSignSeedSchemaJsonSchema = []interface{}{
	"mldsa_sign_seed_schema.json",
}

// UnmarshalJSON implements json.Unmarshaler.
func (j *MldsaSignSeedSchemaJsonSchema) UnmarshalJSON(value []byte) error {
	var v string
	if err := json.Unmarshal(value, &v); err != nil {
		return err
	}
	var ok bool
	for _, expected := range enumValues_MldsaSignSeedSchemaJsonSchema {
		if reflect.DeepEqual(v, expected) {
			ok = true
			break
		}
	}
	if !ok {
		return fmt.Errorf("invalid value (expected one of %#v): %#v", enumValues_MldsaSignSeedSchemaJsonSchema, v)
	}
	*j = MldsaSignSeedSchemaJsonSchema(v)
	return nil
}

// UnmarshalJSON implements json.Unmarshaler.
func (j *MldsaSignSeedSchemaJson) UnmarshalJSON(value []byte) error {
	var raw map[string]interface{}
	if err := json.Unmarshal(value, &raw); err != nil {
		return err
	}
	if _, ok := raw["algorithm"]; raw != nil && !ok {
		return fmt.Errorf("field algorithm in MldsaSignSeedSchemaJson: required")
	}
	if _, ok := raw["header"]; raw != nil && !ok {
		return fmt.Errorf("field header in MldsaSignSeedSchemaJson: required")
	}
	if _, ok := raw["notes"]; raw != nil && !ok {
		return fmt.Errorf("field notes in MldsaSignSeedSchemaJson: required")
	}
	if _, ok := raw["numberOfTests"]; raw != nil && !ok {
		return fmt.Errorf("field numberOfTests in MldsaSignSeedSchemaJson: required")
	}
	if _, ok := raw["schema"]; raw != nil && !ok {
		return fmt.Errorf("field schema in MldsaSignSeedSchemaJson: required")
	}
	if _, ok := raw["testGroups"]; raw != nil && !ok {
		return fmt.Errorf("field testGroups in MldsaSignSeedSchemaJson: required")
	}
	type Plain MldsaSignSeedSchemaJson
	var plain Plain
	if err := json.Unmarshal(value, &plain); err != nil {
		return err
	}
	*j = MldsaSignSeedSchemaJson(plain)
	return nil
}

type MldsaVerifySchemaJson struct {
	// the primitive tested in the test file
	Algorithm string `json:"algorithm"`

	// DEPRECATED: prefer "source" property in test group
	GeneratorVersion *string `json:"generatorVersion,omitempty,omitzero"`

	// additional documentation
	Header []string `json:"header"`

	// Notes corresponds to the JSON schema field "notes".
	Notes Notes `json:"notes"`

	// the number of test vectors in this test
	NumberOfTests int `json:"numberOfTests"`

	// Schema corresponds to the JSON schema field "schema".
	Schema MldsaVerifySchemaJsonSchema `json:"schema"`

	// TestGroups corresponds to the JSON schema field "testGroups".
	TestGroups []MlDsaVerifyTestGroup `json:"testGroups"`
}

type MldsaVerifySchemaJsonSchema string

const MldsaVerifySchemaJsonSchemaMldsaVerifySchemaJson MldsaVerifySchemaJsonSchema = "mldsa_verify_schema.json"

var enumValues_MldsaVerifySchemaJsonSchema = []interface{}{
	"mldsa_verify_schema.json",
}

// UnmarshalJSON implements json.Unmarshaler.
func (j *MldsaVerifySchemaJsonSchema) UnmarshalJSON(value []byte) error {
	var v string
	if err := json.Unmarshal(value, &v); err != nil {
		return err
	}
	var ok bool
	for _, expected := range enumValues_MldsaVerifySchemaJsonSchema {
		if reflect.DeepEqual(v, expected) {
			ok = true
			break
		}
	}
	if !ok {
		return fmt.Errorf("invalid value (expected one of %#v): %#v", enumValues_MldsaVerifySchemaJsonSchema, v)
	}
	*j = MldsaVerifySchemaJsonSchema(v)
	return nil
}

// UnmarshalJSON implements json.Unmarshaler.
func (j *MldsaVerifySchemaJson) UnmarshalJSON(value []byte) error {
	var raw map[string]interface{}
	if err := json.Unmarshal(value, &raw); err != nil {
		return err
	}
	if _, ok := raw["algorithm"]; raw != nil && !ok {
		return fmt.Errorf("field algorithm in MldsaVerifySchemaJson: required")
	}
	if _, ok := raw["header"]; raw != nil && !ok {
		return fmt.Errorf("field header in MldsaVerifySchemaJson: required")
	}
	if _, ok := raw["notes"]; raw != nil && !ok {
		return fmt.Errorf("field notes in MldsaVerifySchemaJson: required")
	}
	if _, ok := raw["numberOfTests"]; raw != nil && !ok {
		return fmt.Errorf("field numberOfTests in MldsaVerifySchemaJson: required")
	}
	if _, ok := raw["schema"]; raw != nil && !ok {
		return fmt.Errorf("field schema in MldsaVerifySchemaJson: required")
	}
	if _, ok := raw["testGroups"]; raw != nil && !ok {
		return fmt.Errorf("field testGroups in MldsaVerifySchemaJson: required")
	}
	type Plain MldsaVerifySchemaJson
	var plain Plain
	if err := json.Unmarshal(value, &plain); err != nil {
		return err
	}
	*j = MldsaVerifySchemaJson(plain)
	return nil
}

type MlkemEncapsTestSchemaJson struct {
	// Algorithm corresponds to the JSON schema field "algorithm".
	Algorithm MlkemEncapsTestSchemaJsonAlgorithm `json:"algorithm"`

	// additional documentation
	Header []string `json:"header,omitempty,omitzero"`

	// Notes corresponds to the JSON schema field "notes".
	Notes Notes `json:"notes,omitempty,omitzero"`

	// the number of test vectors in this test
	NumberOfTests int `json:"numberOfTests"`

	// Schema corresponds to the JSON schema field "schema".
	Schema MlkemEncapsTestSchemaJsonSchema `json:"schema"`

	// TestGroups corresponds to the JSON schema field "testGroups".
	TestGroups []MLKEMEncapsTestGroup `json:"testGroups"`
}

type MlkemEncapsTestSchemaJsonAlgorithm string

const MlkemEncapsTestSchemaJsonAlgorithmMLKEM MlkemEncapsTestSchemaJsonAlgorithm = "ML-KEM"

var enumValues_MlkemEncapsTestSchemaJsonAlgorithm = []interface{}{
	"ML-KEM",
}

// UnmarshalJSON implements json.Unmarshaler.
func (j *MlkemEncapsTestSchemaJsonAlgorithm) UnmarshalJSON(value []byte) error {
	var v string
	if err := json.Unmarshal(value, &v); err != nil {
		return err
	}
	var ok bool
	for _, expected := range enumValues_MlkemEncapsTestSchemaJsonAlgorithm {
		if reflect.DeepEqual(v, expected) {
			ok = true
			break
		}
	}
	if !ok {
		return fmt.Errorf("invalid value (expected one of %#v): %#v", enumValues_MlkemEncapsTestSchemaJsonAlgorithm, v)
	}
	*j = MlkemEncapsTestSchemaJsonAlgorithm(v)
	return nil
}

type MlkemEncapsTestSchemaJsonSchema string

const MlkemEncapsTestSchemaJsonSchemaMlkemEncapsTestSchemaJson MlkemEncapsTestSchemaJsonSchema = "mlkem_encaps_test_schema.json"

var enumValues_MlkemEncapsTestSchemaJsonSchema = []interface{}{
	"mlkem_encaps_test_schema.json",
}

// UnmarshalJSON implements json.Unmarshaler.
func (j *MlkemEncapsTestSchemaJsonSchema) UnmarshalJSON(value []byte) error {
	var v string
	if err := json.Unmarshal(value, &v); err != nil {
		return err
	}
	var ok bool
	for _, expected := range enumValues_MlkemEncapsTestSchemaJsonSchema {
		if reflect.DeepEqual(v, expected) {
			ok = true
			break
		}
	}
	if !ok {
		return fmt.Errorf("invalid value (expected one of %#v): %#v", enumValues_MlkemEncapsTestSchemaJsonSchema, v)
	}
	*j = MlkemEncapsTestSchemaJsonSchema(v)
	return nil
}

// UnmarshalJSON implements json.Unmarshaler.
func (j *MlkemEncapsTestSchemaJson) UnmarshalJSON(value []byte) error {
	var raw map[string]interface{}
	if err := json.Unmarshal(value, &raw); err != nil {
		return err
	}
	if _, ok := raw["algorithm"]; raw != nil && !ok {
		return fmt.Errorf("field algorithm in MlkemEncapsTestSchemaJson: required")
	}
	if _, ok := raw["numberOfTests"]; raw != nil && !ok {
		return fmt.Errorf("field numberOfTests in MlkemEncapsTestSchemaJson: required")
	}
	if _, ok := raw["schema"]; raw != nil && !ok {
		return fmt.Errorf("field schema in MlkemEncapsTestSchemaJson: required")
	}
	if _, ok := raw["testGroups"]; raw != nil && !ok {
		return fmt.Errorf("field testGroups in MlkemEncapsTestSchemaJson: required")
	}
	type Plain MlkemEncapsTestSchemaJson
	var plain Plain
	if err := json.Unmarshal(value, &plain); err != nil {
		return err
	}
	*j = MlkemEncapsTestSchemaJson(plain)
	return nil
}

type MlkemKeygenSeedTestSchemaJson struct {
	// Algorithm corresponds to the JSON schema field "algorithm".
	Algorithm MlkemKeygenSeedTestSchemaJsonAlgorithm `json:"algorithm"`

	// additional documentation
	Header []string `json:"header,omitempty,omitzero"`

	// Notes corresponds to the JSON schema field "notes".
	Notes Notes `json:"notes,omitempty,omitzero"`

	// the number of test vectors in this test
	NumberOfTests int `json:"numberOfTests"`

	// Schema corresponds to the JSON schema field "schema".
	Schema MlkemKeygenSeedTestSchemaJsonSchema `json:"schema"`

	// TestGroups corresponds to the JSON schema field "testGroups".
	TestGroups []MLKEMKeyGenTestGroup `json:"testGroups"`
}

type MlkemKeygenSeedTestSchemaJsonAlgorithm string

const MlkemKeygenSeedTestSchemaJsonAlgorithmMLKEM MlkemKeygenSeedTestSchemaJsonAlgorithm = "ML-KEM"

var enumValues_MlkemKeygenSeedTestSchemaJsonAlgorithm = []interface{}{
	"ML-KEM",
}

// UnmarshalJSON implements json.Unmarshaler.
func (j *MlkemKeygenSeedTestSchemaJsonAlgorithm) UnmarshalJSON(value []byte) error {
	var v string
	if err := json.Unmarshal(value, &v); err != nil {
		return err
	}
	var ok bool
	for _, expected := range enumValues_MlkemKeygenSeedTestSchemaJsonAlgorithm {
		if reflect.DeepEqual(v, expected) {
			ok = true
			break
		}
	}
	if !ok {
		return fmt.Errorf("invalid value (expected one of %#v): %#v", enumValues_MlkemKeygenSeedTestSchemaJsonAlgorithm, v)
	}
	*j = MlkemKeygenSeedTestSchemaJsonAlgorithm(v)
	return nil
}

type MlkemKeygenSeedTestSchemaJsonSchema string

const MlkemKeygenSeedTestSchemaJsonSchemaMlkemKeygenSeedTestSchemaJson MlkemKeygenSeedTestSchemaJsonSchema = "mlkem_keygen_seed_test_schema.json"

var enumValues_MlkemKeygenSeedTestSchemaJsonSchema = []interface{}{
	"mlkem_keygen_seed_test_schema.json",
}

// UnmarshalJSON implements json.Unmarshaler.
func (j *MlkemKeygenSeedTestSchemaJsonSchema) UnmarshalJSON(value []byte) error {
	var v string
	if err := json.Unmarshal(value, &v); err != nil {
		return err
	}
	var ok bool
	for _, expected := range enumValues_MlkemKeygenSeedTestSchemaJsonSchema {
		if reflect.DeepEqual(v, expected) {
			ok = true
			break
		}
	}
	if !ok {
		return fmt.Errorf("invalid value (expected one of %#v): %#v", enumValues_MlkemKeygenSeedTestSchemaJsonSchema, v)
	}
	*j = MlkemKeygenSeedTestSchemaJsonSchema(v)
	return nil
}

// UnmarshalJSON implements json.Unmarshaler.
func (j *MlkemKeygenSeedTestSchemaJson) UnmarshalJSON(value []byte) error {
	var raw map[string]interface{}
	if err := json.Unmarshal(value, &raw); err != nil {
		return err
	}
	if _, ok := raw["algorithm"]; raw != nil && !ok {
		return fmt.Errorf("field algorithm in MlkemKeygenSeedTestSchemaJson: required")
	}
	if _, ok := raw["numberOfTests"]; raw != nil && !ok {
		return fmt.Errorf("field numberOfTests in MlkemKeygenSeedTestSchemaJson: required")
	}
	if _, ok := raw["schema"]; raw != nil && !ok {
		return fmt.Errorf("field schema in MlkemKeygenSeedTestSchemaJson: required")
	}
	if _, ok := raw["testGroups"]; raw != nil && !ok {
		return fmt.Errorf("field testGroups in MlkemKeygenSeedTestSchemaJson: required")
	}
	type Plain MlkemKeygenSeedTestSchemaJson
	var plain Plain
	if err := json.Unmarshal(value, &plain); err != nil {
		return err
	}
	*j = MlkemKeygenSeedTestSchemaJson(plain)
	return nil
}

type MlkemSemiExpandedDecapsTestSchemaJson struct {
	// Algorithm corresponds to the JSON schema field "algorithm".
	Algorithm MlkemSemiExpandedDecapsTestSchemaJsonAlgorithm `json:"algorithm"`

	// additional documentation
	Header []string `json:"header,omitempty,omitzero"`

	// Notes corresponds to the JSON schema field "notes".
	Notes Notes `json:"notes,omitempty,omitzero"`

	// the number of test vectors in this test
	NumberOfTests int `json:"numberOfTests"`

	// Schema corresponds to the JSON schema field "schema".
	Schema MlkemSemiExpandedDecapsTestSchemaJsonSchema `json:"schema"`

	// TestGroups corresponds to the JSON schema field "testGroups".
	TestGroups []MLKEMDecapsTestGroup `json:"testGroups"`
}

type MlkemSemiExpandedDecapsTestSchemaJsonAlgorithm string

const MlkemSemiExpandedDecapsTestSchemaJsonAlgorithmMLKEM MlkemSemiExpandedDecapsTestSchemaJsonAlgorithm = "ML-KEM"

var enumValues_MlkemSemiExpandedDecapsTestSchemaJsonAlgorithm = []interface{}{
	"ML-KEM",
}

// UnmarshalJSON implements json.Unmarshaler.
func (j *MlkemSemiExpandedDecapsTestSchemaJsonAlgorithm) UnmarshalJSON(value []byte) error {
	var v string
	if err := json.Unmarshal(value, &v); err != nil {
		return err
	}
	var ok bool
	for _, expected := range enumValues_MlkemSemiExpandedDecapsTestSchemaJsonAlgorithm {
		if reflect.DeepEqual(v, expected) {
			ok = true
			break
		}
	}
	if !ok {
		return fmt.Errorf("invalid value (expected one of %#v): %#v", enumValues_MlkemSemiExpandedDecapsTestSchemaJsonAlgorithm, v)
	}
	*j = MlkemSemiExpandedDecapsTestSchemaJsonAlgorithm(v)
	return nil
}

type MlkemSemiExpandedDecapsTestSchemaJsonSchema string

const MlkemSemiExpandedDecapsTestSchemaJsonSchemaMlkemSemiExpandedDecapsTestSchemaJson MlkemSemiExpandedDecapsTestSchemaJsonSchema = "mlkem_semi_expanded_decaps_test_schema.json"

var enumValues_MlkemSemiExpandedDecapsTestSchemaJsonSchema = []interface{}{
	"mlkem_semi_expanded_decaps_test_schema.json",
}

// UnmarshalJSON implements json.Unmarshaler.
func (j *MlkemSemiExpandedDecapsTestSchemaJsonSchema) UnmarshalJSON(value []byte) error {
	var v string
	if err := json.Unmarshal(value, &v); err != nil {
		return err
	}
	var ok bool
	for _, expected := range enumValues_MlkemSemiExpandedDecapsTestSchemaJsonSchema {
		if reflect.DeepEqual(v, expected) {
			ok = true
			break
		}
	}
	if !ok {
		return fmt.Errorf("invalid value (expected one of %#v): %#v", enumValues_MlkemSemiExpandedDecapsTestSchemaJsonSchema, v)
	}
	*j = MlkemSemiExpandedDecapsTestSchemaJsonSchema(v)
	return nil
}

// UnmarshalJSON implements json.Unmarshaler.
func (j *MlkemSemiExpandedDecapsTestSchemaJson) UnmarshalJSON(value []byte) error {
	var raw map[string]interface{}
	if err := json.Unmarshal(value, &raw); err != nil {
		return err
	}
	if _, ok := raw["algorithm"]; raw != nil && !ok {
		return fmt.Errorf("field algorithm in MlkemSemiExpandedDecapsTestSchemaJson: required")
	}
	if _, ok := raw["numberOfTests"]; raw != nil && !ok {
		return fmt.Errorf("field numberOfTests in MlkemSemiExpandedDecapsTestSchemaJson: required")
	}
	if _, ok := raw["schema"]; raw != nil && !ok {
		return fmt.Errorf("field schema in MlkemSemiExpandedDecapsTestSchemaJson: required")
	}
	if _, ok := raw["testGroups"]; raw != nil && !ok {
		return fmt.Errorf("field testGroups in MlkemSemiExpandedDecapsTestSchemaJson: required")
	}
	type Plain MlkemSemiExpandedDecapsTestSchemaJson
	var plain Plain
	if err := json.Unmarshal(value, &plain); err != nil {
		return err
	}
	*j = MlkemSemiExpandedDecapsTestSchemaJson(plain)
	return nil
}

type MlkemTestSchemaJson struct {
	// Algorithm corresponds to the JSON schema field "algorithm".
	Algorithm MlkemTestSchemaJsonAlgorithm `json:"algorithm"`

	// additional documentation
	Header []string `json:"header,omitempty,omitzero"`

	// Notes corresponds to the JSON schema field "notes".
	Notes Notes `json:"notes,omitempty,omitzero"`

	// the number of test vectors in this test
	NumberOfTests int `json:"numberOfTests"`

	// Schema corresponds to the JSON schema field "schema".
	Schema MlkemTestSchemaJsonSchema `json:"schema"`

	// TestGroups corresponds to the JSON schema field "testGroups".
	TestGroups []MLKEMTestGroup `json:"testGroups"`
}

type MlkemTestSchemaJsonAlgorithm string

const MlkemTestSchemaJsonAlgorithmMLKEM MlkemTestSchemaJsonAlgorithm = "ML-KEM"

var enumValues_MlkemTestSchemaJsonAlgorithm = []interface{}{
	"ML-KEM",
}

// UnmarshalJSON implements json.Unmarshaler.
func (j *MlkemTestSchemaJsonAlgorithm) UnmarshalJSON(value []byte) error {
	var v string
	if err := json.Unmarshal(value, &v); err != nil {
		return err
	}
	var ok bool
	for _, expected := range enumValues_MlkemTestSchemaJsonAlgorithm {
		if reflect.DeepEqual(v, expected) {
			ok = true
			break
		}
	}
	if !ok {
		return fmt.Errorf("invalid value (expected one of %#v): %#v", enumValues_MlkemTestSchemaJsonAlgorithm, v)
	}
	*j = MlkemTestSchemaJsonAlgorithm(v)
	return nil
}

type MlkemTestSchemaJsonSchema string

const MlkemTestSchemaJsonSchemaMlkemTestSchemaJson MlkemTestSchemaJsonSchema = "mlkem_test_schema.json"

var enumValues_MlkemTestSchemaJsonSchema = []interface{}{
	"mlkem_test_schema.json",
}

// UnmarshalJSON implements json.Unmarshaler.
func (j *MlkemTestSchemaJsonSchema) UnmarshalJSON(value []byte) error {
	var v string
	if err := json.Unmarshal(value, &v); err != nil {
		return err
	}
	var ok bool
	for _, expected := range enumValues_MlkemTestSchemaJsonSchema {
		if reflect.DeepEqual(v, expected) {
			ok = true
			break
		}
	}
	if !ok {
		return fmt.Errorf("invalid value (expected one of %#v): %#v", enumValues_MlkemTestSchemaJsonSchema, v)
	}
	*j = MlkemTestSchemaJsonSchema(v)
	return nil
}

// UnmarshalJSON implements json.Unmarshaler.
func (j *MlkemTestSchemaJson) UnmarshalJSON(value []byte) error {
	var raw map[string]interface{}
	if err := json.Unmarshal(value, &raw); err != nil {
		return err
	}
	if _, ok := raw["algorithm"]; raw != nil && !ok {
		return fmt.Errorf("field algorithm in MlkemTestSchemaJson: required")
	}
	if _, ok := raw["numberOfTests"]; raw != nil && !ok {
		return fmt.Errorf("field numberOfTests in MlkemTestSchemaJson: required")
	}
	if _, ok := raw["schema"]; raw != nil && !ok {
		return fmt.Errorf("field schema in MlkemTestSchemaJson: required")
	}
	if _, ok := raw["testGroups"]; raw != nil && !ok {
		return fmt.Errorf("field testGroups in MlkemTestSchemaJson: required")
	}
	type Plain MlkemTestSchemaJson
	var plain Plain
	if err := json.Unmarshal(value, &plain); err != nil {
		return err
	}
	*j = MlkemTestSchemaJson(plain)
	return nil
}

type NoteEntry struct {
	// The type of the bug tested for
	BugType string `json:"bugType"`

	// A list of potentially related CVEs
	Cves []string `json:"cves,omitempty,omitzero"`

	// A description of the flag
	Description *string `json:"description,omitempty,omitzero"`

	// The expected effect of failing the test vector
	Effect *string `json:"effect,omitempty,omitzero"`

	// A list of potentially related references
	Links []string `json:"links,omitempty,omitzero"`
}

// UnmarshalJSON implements json.Unmarshaler.
func (j *NoteEntry) UnmarshalJSON(value []byte) error {
	var raw map[string]interface{}
	if err := json.Unmarshal(value, &raw); err != nil {
		return err
	}
	if _, ok := raw["bugType"]; raw != nil && !ok {
		return fmt.Errorf("field bugType in NoteEntry: required")
	}
	type Plain NoteEntry
	var plain Plain
	if err := json.Unmarshal(value, &plain); err != nil {
		return err
	}
	*j = NoteEntry(plain)
	return nil
}

type Notes map[string]NoteEntry

type PbkdfTestGroup struct {
	// Source corresponds to the JSON schema field "source".
	Source *Source `json:"source,omitempty,omitzero"`

	// Tests corresponds to the JSON schema field "tests".
	Tests []PbkdfTestVector `json:"tests"`

	// Type corresponds to the JSON schema field "type".
	Type PbkdfTestGroupType `json:"type"`
}

type PbkdfTestGroupType string

const PbkdfTestGroupTypePbkdfTest PbkdfTestGroupType = "PbkdfTest"

var enumValues_PbkdfTestGroupType = []interface{}{
	"PbkdfTest",
}

// UnmarshalJSON implements json.Unmarshaler.
func (j *PbkdfTestGroupType) UnmarshalJSON(value []byte) error {
	var v string
	if err := json.Unmarshal(value, &v); err != nil {
		return err
	}
	var ok bool
	for _, expected := range enumValues_PbkdfTestGroupType {
		if reflect.DeepEqual(v, expected) {
			ok = true
			break
		}
	}
	if !ok {
		return fmt.Errorf("invalid value (expected one of %#v): %#v", enumValues_PbkdfTestGroupType, v)
	}
	*j = PbkdfTestGroupType(v)
	return nil
}

// UnmarshalJSON implements json.Unmarshaler.
func (j *PbkdfTestGroup) UnmarshalJSON(value []byte) error {
	var raw map[string]interface{}
	if err := json.Unmarshal(value, &raw); err != nil {
		return err
	}
	if _, ok := raw["tests"]; raw != nil && !ok {
		return fmt.Errorf("field tests in PbkdfTestGroup: required")
	}
	if _, ok := raw["type"]; raw != nil && !ok {
		return fmt.Errorf("field type in PbkdfTestGroup: required")
	}
	type Plain PbkdfTestGroup
	var plain Plain
	if err := json.Unmarshal(value, &plain); err != nil {
		return err
	}
	*j = PbkdfTestGroup(plain)
	return nil
}

type PbkdfTestSchemaJson struct {
	// Algorithm corresponds to the JSON schema field "algorithm".
	Algorithm PbkdfTestSchemaJsonAlgorithm `json:"algorithm"`

	// DEPRECATED: prefer "source" property in test group
	GeneratorVersion *string `json:"generatorVersion,omitempty,omitzero"`

	// Additional documentation
	Header []string `json:"header"`

	// Notes corresponds to the JSON schema field "notes".
	Notes Notes `json:"notes"`

	// The number of test vectors in this test
	NumberOfTests int `json:"numberOfTests"`

	// Schema corresponds to the JSON schema field "schema".
	Schema PbkdfTestSchemaJsonSchema `json:"schema"`

	// TestGroups corresponds to the JSON schema field "testGroups".
	TestGroups []PbkdfTestGroup `json:"testGroups"`
}

type PbkdfTestSchemaJsonAlgorithm string

const PbkdfTestSchemaJsonAlgorithmPBKDF2HMACSHA1 PbkdfTestSchemaJsonAlgorithm = "PBKDF2-HMACSHA1"
const PbkdfTestSchemaJsonAlgorithmPBKDF2HMACSHA224 PbkdfTestSchemaJsonAlgorithm = "PBKDF2-HMACSHA224"
const PbkdfTestSchemaJsonAlgorithmPBKDF2HMACSHA256 PbkdfTestSchemaJsonAlgorithm = "PBKDF2-HMACSHA256"
const PbkdfTestSchemaJsonAlgorithmPBKDF2HMACSHA384 PbkdfTestSchemaJsonAlgorithm = "PBKDF2-HMACSHA384"
const PbkdfTestSchemaJsonAlgorithmPBKDF2HMACSHA512 PbkdfTestSchemaJsonAlgorithm = "PBKDF2-HMACSHA512"

var enumValues_PbkdfTestSchemaJsonAlgorithm = []interface{}{
	"PBKDF2-HMACSHA1",
	"PBKDF2-HMACSHA224",
	"PBKDF2-HMACSHA256",
	"PBKDF2-HMACSHA384",
	"PBKDF2-HMACSHA512",
}

// UnmarshalJSON implements json.Unmarshaler.
func (j *PbkdfTestSchemaJsonAlgorithm) UnmarshalJSON(value []byte) error {
	var v string
	if err := json.Unmarshal(value, &v); err != nil {
		return err
	}
	var ok bool
	for _, expected := range enumValues_PbkdfTestSchemaJsonAlgorithm {
		if reflect.DeepEqual(v, expected) {
			ok = true
			break
		}
	}
	if !ok {
		return fmt.Errorf("invalid value (expected one of %#v): %#v", enumValues_PbkdfTestSchemaJsonAlgorithm, v)
	}
	*j = PbkdfTestSchemaJsonAlgorithm(v)
	return nil
}

type PbkdfTestSchemaJsonSchema string

const PbkdfTestSchemaJsonSchemaPbkdfTestSchemaJson PbkdfTestSchemaJsonSchema = "pbkdf_test_schema.json"

var enumValues_PbkdfTestSchemaJsonSchema = []interface{}{
	"pbkdf_test_schema.json",
}

// UnmarshalJSON implements json.Unmarshaler.
func (j *PbkdfTestSchemaJsonSchema) UnmarshalJSON(value []byte) error {
	var v string
	if err := json.Unmarshal(value, &v); err != nil {
		return err
	}
	var ok bool
	for _, expected := range enumValues_PbkdfTestSchemaJsonSchema {
		if reflect.DeepEqual(v, expected) {
			ok = true
			break
		}
	}
	if !ok {
		return fmt.Errorf("invalid value (expected one of %#v): %#v", enumValues_PbkdfTestSchemaJsonSchema, v)
	}
	*j = PbkdfTestSchemaJsonSchema(v)
	return nil
}

// UnmarshalJSON implements json.Unmarshaler.
func (j *PbkdfTestSchemaJson) UnmarshalJSON(value []byte) error {
	var raw map[string]interface{}
	if err := json.Unmarshal(value, &raw); err != nil {
		return err
	}
	if _, ok := raw["algorithm"]; raw != nil && !ok {
		return fmt.Errorf("field algorithm in PbkdfTestSchemaJson: required")
	}
	if _, ok := raw["header"]; raw != nil && !ok {
		return fmt.Errorf("field header in PbkdfTestSchemaJson: required")
	}
	if _, ok := raw["notes"]; raw != nil && !ok {
		return fmt.Errorf("field notes in PbkdfTestSchemaJson: required")
	}
	if _, ok := raw["numberOfTests"]; raw != nil && !ok {
		return fmt.Errorf("field numberOfTests in PbkdfTestSchemaJson: required")
	}
	if _, ok := raw["schema"]; raw != nil && !ok {
		return fmt.Errorf("field schema in PbkdfTestSchemaJson: required")
	}
	if _, ok := raw["testGroups"]; raw != nil && !ok {
		return fmt.Errorf("field testGroups in PbkdfTestSchemaJson: required")
	}
	type Plain PbkdfTestSchemaJson
	var plain Plain
	if err := json.Unmarshal(value, &plain); err != nil {
		return err
	}
	*j = PbkdfTestSchemaJson(plain)
	return nil
}

type PbkdfTestVector struct {
	// A brief description of the test case
	Comment string `json:"comment"`

	// The derived key
	Dk string `json:"dk"`

	// The length of the derived key in bytes
	DkLen int `json:"dkLen"`

	// A list of flags
	Flags []string `json:"flags"`

	// The number of iterations for the key derivation
	IterationCount int `json:"iterationCount"`

	// The password as a hex-encoded byte string
	Password string `json:"password"`

	// Result corresponds to the JSON schema field "result".
	Result Result `json:"result"`

	// The salt for the key derivation
	Salt string `json:"salt"`

	// Identifier of the test case
	TcId int `json:"tcId"`
}

// UnmarshalJSON implements json.Unmarshaler.
func (j *PbkdfTestVector) UnmarshalJSON(value []byte) error {
	var raw map[string]interface{}
	if err := json.Unmarshal(value, &raw); err != nil {
		return err
	}
	if _, ok := raw["comment"]; raw != nil && !ok {
		return fmt.Errorf("field comment in PbkdfTestVector: required")
	}
	if _, ok := raw["dk"]; raw != nil && !ok {
		return fmt.Errorf("field dk in PbkdfTestVector: required")
	}
	if _, ok := raw["dkLen"]; raw != nil && !ok {
		return fmt.Errorf("field dkLen in PbkdfTestVector: required")
	}
	if _, ok := raw["flags"]; raw != nil && !ok {
		return fmt.Errorf("field flags in PbkdfTestVector: required")
	}
	if _, ok := raw["iterationCount"]; raw != nil && !ok {
		return fmt.Errorf("field iterationCount in PbkdfTestVector: required")
	}
	if _, ok := raw["password"]; raw != nil && !ok {
		return fmt.Errorf("field password in PbkdfTestVector: required")
	}
	if _, ok := raw["result"]; raw != nil && !ok {
		return fmt.Errorf("field result in PbkdfTestVector: required")
	}
	if _, ok := raw["salt"]; raw != nil && !ok {
		return fmt.Errorf("field salt in PbkdfTestVector: required")
	}
	if _, ok := raw["tcId"]; raw != nil && !ok {
		return fmt.Errorf("field tcId in PbkdfTestVector: required")
	}
	type Plain PbkdfTestVector
	var plain Plain
	if err := json.Unmarshal(value, &plain); err != nil {
		return err
	}
	*j = PbkdfTestVector(plain)
	return nil
}

type PrimalityTestGroup struct {
	// Source corresponds to the JSON schema field "source".
	Source Source `json:"source"`

	// Tests corresponds to the JSON schema field "tests".
	Tests []PrimalityTestVector `json:"tests"`

	// Type corresponds to the JSON schema field "type".
	Type PrimalityTestGroupType `json:"type"`
}

type PrimalityTestGroupType string

const PrimalityTestGroupTypePrimalityTest PrimalityTestGroupType = "PrimalityTest"

var enumValues_PrimalityTestGroupType = []interface{}{
	"PrimalityTest",
}

// UnmarshalJSON implements json.Unmarshaler.
func (j *PrimalityTestGroupType) UnmarshalJSON(value []byte) error {
	var v string
	if err := json.Unmarshal(value, &v); err != nil {
		return err
	}
	var ok bool
	for _, expected := range enumValues_PrimalityTestGroupType {
		if reflect.DeepEqual(v, expected) {
			ok = true
			break
		}
	}
	if !ok {
		return fmt.Errorf("invalid value (expected one of %#v): %#v", enumValues_PrimalityTestGroupType, v)
	}
	*j = PrimalityTestGroupType(v)
	return nil
}

// UnmarshalJSON implements json.Unmarshaler.
func (j *PrimalityTestGroup) UnmarshalJSON(value []byte) error {
	var raw map[string]interface{}
	if err := json.Unmarshal(value, &raw); err != nil {
		return err
	}
	if _, ok := raw["source"]; raw != nil && !ok {
		return fmt.Errorf("field source in PrimalityTestGroup: required")
	}
	if _, ok := raw["tests"]; raw != nil && !ok {
		return fmt.Errorf("field tests in PrimalityTestGroup: required")
	}
	if _, ok := raw["type"]; raw != nil && !ok {
		return fmt.Errorf("field type in PrimalityTestGroup: required")
	}
	type Plain PrimalityTestGroup
	var plain Plain
	if err := json.Unmarshal(value, &plain); err != nil {
		return err
	}
	*j = PrimalityTestGroup(plain)
	return nil
}

type PrimalityTestSchemaV1Json struct {
	// the primitive tested in the test file
	Algorithm string `json:"algorithm"`

	// DEPRECATED: prefer "source" property in test group
	GeneratorVersion *string `json:"generatorVersion,omitempty,omitzero"`

	// additional documentation
	Header []string `json:"header"`

	// Notes corresponds to the JSON schema field "notes".
	Notes Notes `json:"notes"`

	// the number of test vectors in this test
	NumberOfTests int `json:"numberOfTests"`

	// Schema corresponds to the JSON schema field "schema".
	Schema PrimalityTestSchemaV1JsonSchema `json:"schema"`

	// TestGroups corresponds to the JSON schema field "testGroups".
	TestGroups []PrimalityTestGroup `json:"testGroups"`
}

type PrimalityTestSchemaV1JsonSchema string

const PrimalityTestSchemaV1JsonSchemaPrimalityTestSchemaV1Json PrimalityTestSchemaV1JsonSchema = "primality_test_schema_v1.json"

var enumValues_PrimalityTestSchemaV1JsonSchema = []interface{}{
	"primality_test_schema_v1.json",
}

// UnmarshalJSON implements json.Unmarshaler.
func (j *PrimalityTestSchemaV1JsonSchema) UnmarshalJSON(value []byte) error {
	var v string
	if err := json.Unmarshal(value, &v); err != nil {
		return err
	}
	var ok bool
	for _, expected := range enumValues_PrimalityTestSchemaV1JsonSchema {
		if reflect.DeepEqual(v, expected) {
			ok = true
			break
		}
	}
	if !ok {
		return fmt.Errorf("invalid value (expected one of %#v): %#v", enumValues_PrimalityTestSchemaV1JsonSchema, v)
	}
	*j = PrimalityTestSchemaV1JsonSchema(v)
	return nil
}

// UnmarshalJSON implements json.Unmarshaler.
func (j *PrimalityTestSchemaV1Json) UnmarshalJSON(value []byte) error {
	var raw map[string]interface{}
	if err := json.Unmarshal(value, &raw); err != nil {
		return err
	}
	if _, ok := raw["algorithm"]; raw != nil && !ok {
		return fmt.Errorf("field algorithm in PrimalityTestSchemaV1Json: required")
	}
	if _, ok := raw["header"]; raw != nil && !ok {
		return fmt.Errorf("field header in PrimalityTestSchemaV1Json: required")
	}
	if _, ok := raw["notes"]; raw != nil && !ok {
		return fmt.Errorf("field notes in PrimalityTestSchemaV1Json: required")
	}
	if _, ok := raw["numberOfTests"]; raw != nil && !ok {
		return fmt.Errorf("field numberOfTests in PrimalityTestSchemaV1Json: required")
	}
	if _, ok := raw["schema"]; raw != nil && !ok {
		return fmt.Errorf("field schema in PrimalityTestSchemaV1Json: required")
	}
	if _, ok := raw["testGroups"]; raw != nil && !ok {
		return fmt.Errorf("field testGroups in PrimalityTestSchemaV1Json: required")
	}
	type Plain PrimalityTestSchemaV1Json
	var plain Plain
	if err := json.Unmarshal(value, &plain); err != nil {
		return err
	}
	*j = PrimalityTestSchemaV1Json(plain)
	return nil
}

type PrimalityTestVector struct {
	// A brief description of the test case
	Comment string `json:"comment"`

	// A list of flags
	Flags []string `json:"flags"`

	// Result corresponds to the JSON schema field "result".
	Result Result `json:"result"`

	// Identifier of the test case
	TcId int `json:"tcId"`

	// the integer to test
	Value string `json:"value"`
}

// UnmarshalJSON implements json.Unmarshaler.
func (j *PrimalityTestVector) UnmarshalJSON(value []byte) error {
	var raw map[string]interface{}
	if err := json.Unmarshal(value, &raw); err != nil {
		return err
	}
	if _, ok := raw["comment"]; raw != nil && !ok {
		return fmt.Errorf("field comment in PrimalityTestVector: required")
	}
	if _, ok := raw["flags"]; raw != nil && !ok {
		return fmt.Errorf("field flags in PrimalityTestVector: required")
	}
	if _, ok := raw["result"]; raw != nil && !ok {
		return fmt.Errorf("field result in PrimalityTestVector: required")
	}
	if _, ok := raw["tcId"]; raw != nil && !ok {
		return fmt.Errorf("field tcId in PrimalityTestVector: required")
	}
	if _, ok := raw["value"]; raw != nil && !ok {
		return fmt.Errorf("field value in PrimalityTestVector: required")
	}
	type Plain PrimalityTestVector
	var plain Plain
	if err := json.Unmarshal(value, &plain); err != nil {
		return err
	}
	*j = PrimalityTestVector(plain)
	return nil
}

type PrivateKey struct {
	// Coefficient corresponds to the JSON schema field "coefficient".
	Coefficient *string `json:"coefficient,omitempty,omitzero"`

	// Exponent1 corresponds to the JSON schema field "exponent1".
	Exponent1 *string `json:"exponent1,omitempty,omitzero"`

	// Exponent2 corresponds to the JSON schema field "exponent2".
	Exponent2 *string `json:"exponent2,omitempty,omitzero"`

	// Modulus corresponds to the JSON schema field "modulus".
	Modulus string `json:"modulus"`

	// OtherPrimeInfos corresponds to the JSON schema field "otherPrimeInfos".
	OtherPrimeInfos [][]string `json:"otherPrimeInfos,omitempty,omitzero"`

	// Prime1 corresponds to the JSON schema field "prime1".
	Prime1 *string `json:"prime1,omitempty,omitzero"`

	// Prime2 corresponds to the JSON schema field "prime2".
	Prime2 *string `json:"prime2,omitempty,omitzero"`

	// PrivateExponent corresponds to the JSON schema field "privateExponent".
	PrivateExponent string `json:"privateExponent"`

	// PublicExponent corresponds to the JSON schema field "publicExponent".
	PublicExponent string `json:"publicExponent"`
}

// UnmarshalJSON implements json.Unmarshaler.
func (j *PrivateKey) UnmarshalJSON(value []byte) error {
	var raw map[string]interface{}
	if err := json.Unmarshal(value, &raw); err != nil {
		return err
	}
	if _, ok := raw["modulus"]; raw != nil && !ok {
		return fmt.Errorf("field modulus in PrivateKey: required")
	}
	if _, ok := raw["privateExponent"]; raw != nil && !ok {
		return fmt.Errorf("field privateExponent in PrivateKey: required")
	}
	if _, ok := raw["publicExponent"]; raw != nil && !ok {
		return fmt.Errorf("field publicExponent in PrivateKey: required")
	}
	type Plain PrivateKey
	var plain Plain
	if err := json.Unmarshal(value, &plain); err != nil {
		return err
	}
	*j = PrivateKey(plain)
	return nil
}

type PublicKey struct {
	// the name of the curve
	Curve string `json:"curve"`

	// the size of the key in bits
	KeySize int `json:"keySize"`

	// the public key
	Pk string `json:"pk"`

	// Type corresponds to the JSON schema field "type".
	Type PublicKeyType `json:"type"`
}

type PublicKeyType string

const PublicKeyTypeECDSAPublicKey PublicKeyType = "ECDSAPublicKey"
const PublicKeyTypeEDDSAPublicKey PublicKeyType = "EDDSAPublicKey"

var enumValues_PublicKeyType = []interface{}{
	"ECDSAPublicKey",
	"EDDSAPublicKey",
}

// UnmarshalJSON implements json.Unmarshaler.
func (j *PublicKeyType) UnmarshalJSON(value []byte) error {
	var v string
	if err := json.Unmarshal(value, &v); err != nil {
		return err
	}
	var ok bool
	for _, expected := range enumValues_PublicKeyType {
		if reflect.DeepEqual(v, expected) {
			ok = true
			break
		}
	}
	if !ok {
		return fmt.Errorf("invalid value (expected one of %#v): %#v", enumValues_PublicKeyType, v)
	}
	*j = PublicKeyType(v)
	return nil
}

// UnmarshalJSON implements json.Unmarshaler.
func (j *PublicKey) UnmarshalJSON(value []byte) error {
	var raw map[string]interface{}
	if err := json.Unmarshal(value, &raw); err != nil {
		return err
	}
	if _, ok := raw["curve"]; raw != nil && !ok {
		return fmt.Errorf("field curve in PublicKey: required")
	}
	if _, ok := raw["keySize"]; raw != nil && !ok {
		return fmt.Errorf("field keySize in PublicKey: required")
	}
	if _, ok := raw["pk"]; raw != nil && !ok {
		return fmt.Errorf("field pk in PublicKey: required")
	}
	if _, ok := raw["type"]; raw != nil && !ok {
		return fmt.Errorf("field type in PublicKey: required")
	}
	type Plain PublicKey
	var plain Plain
	if err := json.Unmarshal(value, &plain); err != nil {
		return err
	}
	*j = PublicKey(plain)
	return nil
}

// Recipient specific information Section 7.2.1 of RFC 7516
type Recipient struct {
	// EncryptedKey corresponds to the JSON schema field "encrypted_key".
	EncryptedKey *string `json:"encrypted_key,omitempty,omitzero"`

	// header information that is not integrity protected
	Header RecipientHeader `json:"header,omitempty,omitzero"`
}

// header information that is not integrity protected
type RecipientHeader map[string]interface{}

type Result string

const ResultAcceptable Result = "acceptable"
const ResultInvalid Result = "invalid"
const ResultValid Result = "valid"

var enumValues_Result = []interface{}{
	"valid",
	"invalid",
	"acceptable",
}

// UnmarshalJSON implements json.Unmarshaler.
func (j *Result) UnmarshalJSON(value []byte) error {
	var v string
	if err := json.Unmarshal(value, &v); err != nil {
		return err
	}
	var ok bool
	for _, expected := range enumValues_Result {
		if reflect.DeepEqual(v, expected) {
			ok = true
			break
		}
	}
	if !ok {
		return fmt.Errorf("invalid value (expected one of %#v): %#v", enumValues_Result, v)
	}
	*j = Result(v)
	return nil
}

type RsaesOaepDecryptSchemaV1Json struct {
	// the primitive tested in the test file
	Algorithm string `json:"algorithm"`

	// DEPRECATED: prefer "source" property in test group
	GeneratorVersion *string `json:"generatorVersion,omitempty,omitzero"`

	// additional documentation
	Header []string `json:"header"`

	// Notes corresponds to the JSON schema field "notes".
	Notes Notes `json:"notes"`

	// the number of test vectors in this test
	NumberOfTests int `json:"numberOfTests"`

	// Schema corresponds to the JSON schema field "schema".
	Schema RsaesOaepDecryptSchemaV1JsonSchema `json:"schema"`

	// TestGroups corresponds to the JSON schema field "testGroups".
	TestGroups []RsaesOaepTestGroup `json:"testGroups"`
}

type RsaesOaepDecryptSchemaV1JsonSchema string

const RsaesOaepDecryptSchemaV1JsonSchemaRsaesOaepDecryptSchemaV1Json RsaesOaepDecryptSchemaV1JsonSchema = "rsaes_oaep_decrypt_schema_v1.json"

var enumValues_RsaesOaepDecryptSchemaV1JsonSchema = []interface{}{
	"rsaes_oaep_decrypt_schema_v1.json",
}

// UnmarshalJSON implements json.Unmarshaler.
func (j *RsaesOaepDecryptSchemaV1JsonSchema) UnmarshalJSON(value []byte) error {
	var v string
	if err := json.Unmarshal(value, &v); err != nil {
		return err
	}
	var ok bool
	for _, expected := range enumValues_RsaesOaepDecryptSchemaV1JsonSchema {
		if reflect.DeepEqual(v, expected) {
			ok = true
			break
		}
	}
	if !ok {
		return fmt.Errorf("invalid value (expected one of %#v): %#v", enumValues_RsaesOaepDecryptSchemaV1JsonSchema, v)
	}
	*j = RsaesOaepDecryptSchemaV1JsonSchema(v)
	return nil
}

// UnmarshalJSON implements json.Unmarshaler.
func (j *RsaesOaepDecryptSchemaV1Json) UnmarshalJSON(value []byte) error {
	var raw map[string]interface{}
	if err := json.Unmarshal(value, &raw); err != nil {
		return err
	}
	if _, ok := raw["algorithm"]; raw != nil && !ok {
		return fmt.Errorf("field algorithm in RsaesOaepDecryptSchemaV1Json: required")
	}
	if _, ok := raw["header"]; raw != nil && !ok {
		return fmt.Errorf("field header in RsaesOaepDecryptSchemaV1Json: required")
	}
	if _, ok := raw["notes"]; raw != nil && !ok {
		return fmt.Errorf("field notes in RsaesOaepDecryptSchemaV1Json: required")
	}
	if _, ok := raw["numberOfTests"]; raw != nil && !ok {
		return fmt.Errorf("field numberOfTests in RsaesOaepDecryptSchemaV1Json: required")
	}
	if _, ok := raw["schema"]; raw != nil && !ok {
		return fmt.Errorf("field schema in RsaesOaepDecryptSchemaV1Json: required")
	}
	if _, ok := raw["testGroups"]; raw != nil && !ok {
		return fmt.Errorf("field testGroups in RsaesOaepDecryptSchemaV1Json: required")
	}
	type Plain RsaesOaepDecryptSchemaV1Json
	var plain Plain
	if err := json.Unmarshal(value, &plain); err != nil {
		return err
	}
	*j = RsaesOaepDecryptSchemaV1Json(plain)
	return nil
}

type RsaesOaepTestGroup struct {
	// the keySize in bits
	KeySize int `json:"keySize"`

	// the message generating function (e.g. MGF1)
	Mgf string `json:"mgf"`

	// The hash function used for the message generating function.
	MgfSha string `json:"mgfSha"`

	// PrivateKey corresponds to the JSON schema field "privateKey".
	PrivateKey PrivateKey `json:"privateKey"`

	// PrivateKeyJwk corresponds to the JSON schema field "privateKeyJwk".
	PrivateKeyJwk *JsonWebKey `json:"privateKeyJwk,omitempty,omitzero"`

	// Pem encoded private key
	PrivateKeyPem string `json:"privateKeyPem"`

	// Pkcs 8 encoded private key.
	PrivateKeyPkcs8 string `json:"privateKeyPkcs8"`

	// The hash function for hashing the label.
	Sha string `json:"sha"`

	// Source corresponds to the JSON schema field "source".
	Source Source `json:"source"`

	// Tests corresponds to the JSON schema field "tests".
	Tests []RsaesOaepTestVector `json:"tests"`

	// Type corresponds to the JSON schema field "type".
	Type RsaesOaepTestGroupType `json:"type"`
}

type RsaesOaepTestGroupType string

const RsaesOaepTestGroupTypeRsaesOaepDecrypt RsaesOaepTestGroupType = "RsaesOaepDecrypt"

var enumValues_RsaesOaepTestGroupType = []interface{}{
	"RsaesOaepDecrypt",
}

// UnmarshalJSON implements json.Unmarshaler.
func (j *RsaesOaepTestGroupType) UnmarshalJSON(value []byte) error {
	var v string
	if err := json.Unmarshal(value, &v); err != nil {
		return err
	}
	var ok bool
	for _, expected := range enumValues_RsaesOaepTestGroupType {
		if reflect.DeepEqual(v, expected) {
			ok = true
			break
		}
	}
	if !ok {
		return fmt.Errorf("invalid value (expected one of %#v): %#v", enumValues_RsaesOaepTestGroupType, v)
	}
	*j = RsaesOaepTestGroupType(v)
	return nil
}

// UnmarshalJSON implements json.Unmarshaler.
func (j *RsaesOaepTestGroup) UnmarshalJSON(value []byte) error {
	var raw map[string]interface{}
	if err := json.Unmarshal(value, &raw); err != nil {
		return err
	}
	if _, ok := raw["keySize"]; raw != nil && !ok {
		return fmt.Errorf("field keySize in RsaesOaepTestGroup: required")
	}
	if _, ok := raw["mgf"]; raw != nil && !ok {
		return fmt.Errorf("field mgf in RsaesOaepTestGroup: required")
	}
	if _, ok := raw["mgfSha"]; raw != nil && !ok {
		return fmt.Errorf("field mgfSha in RsaesOaepTestGroup: required")
	}
	if _, ok := raw["privateKey"]; raw != nil && !ok {
		return fmt.Errorf("field privateKey in RsaesOaepTestGroup: required")
	}
	if _, ok := raw["privateKeyPem"]; raw != nil && !ok {
		return fmt.Errorf("field privateKeyPem in RsaesOaepTestGroup: required")
	}
	if _, ok := raw["privateKeyPkcs8"]; raw != nil && !ok {
		return fmt.Errorf("field privateKeyPkcs8 in RsaesOaepTestGroup: required")
	}
	if _, ok := raw["sha"]; raw != nil && !ok {
		return fmt.Errorf("field sha in RsaesOaepTestGroup: required")
	}
	if _, ok := raw["source"]; raw != nil && !ok {
		return fmt.Errorf("field source in RsaesOaepTestGroup: required")
	}
	if _, ok := raw["tests"]; raw != nil && !ok {
		return fmt.Errorf("field tests in RsaesOaepTestGroup: required")
	}
	if _, ok := raw["type"]; raw != nil && !ok {
		return fmt.Errorf("field type in RsaesOaepTestGroup: required")
	}
	type Plain RsaesOaepTestGroup
	var plain Plain
	if err := json.Unmarshal(value, &plain); err != nil {
		return err
	}
	*j = RsaesOaepTestGroup(plain)
	return nil
}

type RsaesOaepTestVector struct {
	// A brief description of the test case
	Comment string `json:"comment"`

	// An encryption of msg
	Ct string `json:"ct"`

	// A list of flags
	Flags []string `json:"flags"`

	// The label used for the encryption
	Label string `json:"label"`

	// The encrypted message
	Msg string `json:"msg"`

	// Result corresponds to the JSON schema field "result".
	Result Result `json:"result"`

	// Identifier of the test case
	TcId int `json:"tcId"`
}

// UnmarshalJSON implements json.Unmarshaler.
func (j *RsaesOaepTestVector) UnmarshalJSON(value []byte) error {
	var raw map[string]interface{}
	if err := json.Unmarshal(value, &raw); err != nil {
		return err
	}
	if _, ok := raw["comment"]; raw != nil && !ok {
		return fmt.Errorf("field comment in RsaesOaepTestVector: required")
	}
	if _, ok := raw["ct"]; raw != nil && !ok {
		return fmt.Errorf("field ct in RsaesOaepTestVector: required")
	}
	if _, ok := raw["flags"]; raw != nil && !ok {
		return fmt.Errorf("field flags in RsaesOaepTestVector: required")
	}
	if _, ok := raw["label"]; raw != nil && !ok {
		return fmt.Errorf("field label in RsaesOaepTestVector: required")
	}
	if _, ok := raw["msg"]; raw != nil && !ok {
		return fmt.Errorf("field msg in RsaesOaepTestVector: required")
	}
	if _, ok := raw["result"]; raw != nil && !ok {
		return fmt.Errorf("field result in RsaesOaepTestVector: required")
	}
	if _, ok := raw["tcId"]; raw != nil && !ok {
		return fmt.Errorf("field tcId in RsaesOaepTestVector: required")
	}
	type Plain RsaesOaepTestVector
	var plain Plain
	if err := json.Unmarshal(value, &plain); err != nil {
		return err
	}
	*j = RsaesOaepTestVector(plain)
	return nil
}

type RsaesPkcs1DecryptSchemaV1Json struct {
	// the primitive tested in the test file
	Algorithm string `json:"algorithm"`

	// DEPRECATED: prefer "source" property in test group
	GeneratorVersion *string `json:"generatorVersion,omitempty,omitzero"`

	// additional documentation
	Header []string `json:"header"`

	// Notes corresponds to the JSON schema field "notes".
	Notes Notes `json:"notes"`

	// the number of test vectors in this test
	NumberOfTests int `json:"numberOfTests"`

	// Schema corresponds to the JSON schema field "schema".
	Schema RsaesPkcs1DecryptSchemaV1JsonSchema `json:"schema"`

	// TestGroups corresponds to the JSON schema field "testGroups".
	TestGroups []RsaesPkcs1TestGroup `json:"testGroups"`
}

type RsaesPkcs1DecryptSchemaV1JsonSchema string

const RsaesPkcs1DecryptSchemaV1JsonSchemaRsaesPkcs1DecryptSchemaV1Json RsaesPkcs1DecryptSchemaV1JsonSchema = "rsaes_pkcs1_decrypt_schema_v1.json"

var enumValues_RsaesPkcs1DecryptSchemaV1JsonSchema = []interface{}{
	"rsaes_pkcs1_decrypt_schema_v1.json",
}

// UnmarshalJSON implements json.Unmarshaler.
func (j *RsaesPkcs1DecryptSchemaV1JsonSchema) UnmarshalJSON(value []byte) error {
	var v string
	if err := json.Unmarshal(value, &v); err != nil {
		return err
	}
	var ok bool
	for _, expected := range enumValues_RsaesPkcs1DecryptSchemaV1JsonSchema {
		if reflect.DeepEqual(v, expected) {
			ok = true
			break
		}
	}
	if !ok {
		return fmt.Errorf("invalid value (expected one of %#v): %#v", enumValues_RsaesPkcs1DecryptSchemaV1JsonSchema, v)
	}
	*j = RsaesPkcs1DecryptSchemaV1JsonSchema(v)
	return nil
}

// UnmarshalJSON implements json.Unmarshaler.
func (j *RsaesPkcs1DecryptSchemaV1Json) UnmarshalJSON(value []byte) error {
	var raw map[string]interface{}
	if err := json.Unmarshal(value, &raw); err != nil {
		return err
	}
	if _, ok := raw["algorithm"]; raw != nil && !ok {
		return fmt.Errorf("field algorithm in RsaesPkcs1DecryptSchemaV1Json: required")
	}
	if _, ok := raw["header"]; raw != nil && !ok {
		return fmt.Errorf("field header in RsaesPkcs1DecryptSchemaV1Json: required")
	}
	if _, ok := raw["notes"]; raw != nil && !ok {
		return fmt.Errorf("field notes in RsaesPkcs1DecryptSchemaV1Json: required")
	}
	if _, ok := raw["numberOfTests"]; raw != nil && !ok {
		return fmt.Errorf("field numberOfTests in RsaesPkcs1DecryptSchemaV1Json: required")
	}
	if _, ok := raw["schema"]; raw != nil && !ok {
		return fmt.Errorf("field schema in RsaesPkcs1DecryptSchemaV1Json: required")
	}
	if _, ok := raw["testGroups"]; raw != nil && !ok {
		return fmt.Errorf("field testGroups in RsaesPkcs1DecryptSchemaV1Json: required")
	}
	type Plain RsaesPkcs1DecryptSchemaV1Json
	var plain Plain
	if err := json.Unmarshal(value, &plain); err != nil {
		return err
	}
	*j = RsaesPkcs1DecryptSchemaV1Json(plain)
	return nil
}

type RsaesPkcs1TestGroup struct {
	// The size of the key in bits
	KeySize int `json:"keySize"`

	// PrivateKey corresponds to the JSON schema field "privateKey".
	PrivateKey PrivateKey `json:"privateKey"`

	// JWK encoded private key
	PrivateKeyJwk *JsonWebKey `json:"privateKeyJwk,omitempty,omitzero"`

	// Pem encoded private key
	PrivateKeyPem string `json:"privateKeyPem"`

	// Pkcs 8 encoded private key.
	PrivateKeyPkcs8 string `json:"privateKeyPkcs8"`

	// Source corresponds to the JSON schema field "source".
	Source Source `json:"source"`

	// Tests corresponds to the JSON schema field "tests".
	Tests []RsaesPkcs1TestVector `json:"tests"`

	// Type corresponds to the JSON schema field "type".
	Type RsaesPkcs1TestGroupType `json:"type"`
}

type RsaesPkcs1TestGroupType string

const RsaesPkcs1TestGroupTypeRsaesPkcs1Decrypt RsaesPkcs1TestGroupType = "RsaesPkcs1Decrypt"

var enumValues_RsaesPkcs1TestGroupType = []interface{}{
	"RsaesPkcs1Decrypt",
}

// UnmarshalJSON implements json.Unmarshaler.
func (j *RsaesPkcs1TestGroupType) UnmarshalJSON(value []byte) error {
	var v string
	if err := json.Unmarshal(value, &v); err != nil {
		return err
	}
	var ok bool
	for _, expected := range enumValues_RsaesPkcs1TestGroupType {
		if reflect.DeepEqual(v, expected) {
			ok = true
			break
		}
	}
	if !ok {
		return fmt.Errorf("invalid value (expected one of %#v): %#v", enumValues_RsaesPkcs1TestGroupType, v)
	}
	*j = RsaesPkcs1TestGroupType(v)
	return nil
}

// UnmarshalJSON implements json.Unmarshaler.
func (j *RsaesPkcs1TestGroup) UnmarshalJSON(value []byte) error {
	var raw map[string]interface{}
	if err := json.Unmarshal(value, &raw); err != nil {
		return err
	}
	if _, ok := raw["keySize"]; raw != nil && !ok {
		return fmt.Errorf("field keySize in RsaesPkcs1TestGroup: required")
	}
	if _, ok := raw["privateKey"]; raw != nil && !ok {
		return fmt.Errorf("field privateKey in RsaesPkcs1TestGroup: required")
	}
	if _, ok := raw["privateKeyPem"]; raw != nil && !ok {
		return fmt.Errorf("field privateKeyPem in RsaesPkcs1TestGroup: required")
	}
	if _, ok := raw["privateKeyPkcs8"]; raw != nil && !ok {
		return fmt.Errorf("field privateKeyPkcs8 in RsaesPkcs1TestGroup: required")
	}
	if _, ok := raw["source"]; raw != nil && !ok {
		return fmt.Errorf("field source in RsaesPkcs1TestGroup: required")
	}
	if _, ok := raw["tests"]; raw != nil && !ok {
		return fmt.Errorf("field tests in RsaesPkcs1TestGroup: required")
	}
	if _, ok := raw["type"]; raw != nil && !ok {
		return fmt.Errorf("field type in RsaesPkcs1TestGroup: required")
	}
	type Plain RsaesPkcs1TestGroup
	var plain Plain
	if err := json.Unmarshal(value, &plain); err != nil {
		return err
	}
	*j = RsaesPkcs1TestGroup(plain)
	return nil
}

type RsaesPkcs1TestVector struct {
	// A brief description of the test case
	Comment string `json:"comment"`

	// An encryption of msg
	Ct string `json:"ct"`

	// A list of flags
	Flags []string `json:"flags"`

	// The encrypted message
	Msg string `json:"msg"`

	// Result corresponds to the JSON schema field "result".
	Result Result `json:"result"`

	// Identifier of the test case
	TcId int `json:"tcId"`
}

// UnmarshalJSON implements json.Unmarshaler.
func (j *RsaesPkcs1TestVector) UnmarshalJSON(value []byte) error {
	var raw map[string]interface{}
	if err := json.Unmarshal(value, &raw); err != nil {
		return err
	}
	if _, ok := raw["comment"]; raw != nil && !ok {
		return fmt.Errorf("field comment in RsaesPkcs1TestVector: required")
	}
	if _, ok := raw["ct"]; raw != nil && !ok {
		return fmt.Errorf("field ct in RsaesPkcs1TestVector: required")
	}
	if _, ok := raw["flags"]; raw != nil && !ok {
		return fmt.Errorf("field flags in RsaesPkcs1TestVector: required")
	}
	if _, ok := raw["msg"]; raw != nil && !ok {
		return fmt.Errorf("field msg in RsaesPkcs1TestVector: required")
	}
	if _, ok := raw["result"]; raw != nil && !ok {
		return fmt.Errorf("field result in RsaesPkcs1TestVector: required")
	}
	if _, ok := raw["tcId"]; raw != nil && !ok {
		return fmt.Errorf("field tcId in RsaesPkcs1TestVector: required")
	}
	type Plain RsaesPkcs1TestVector
	var plain Plain
	if err := json.Unmarshal(value, &plain); err != nil {
		return err
	}
	*j = RsaesPkcs1TestVector(plain)
	return nil
}

type RsassaPkcs1GenTestGroup struct {
	// DER encoding of the sequence [n, e]
	KeyAsn string `json:"keyAsn"`

	// DER encoding of the public key
	KeyDer string `json:"keyDer"`

	// [Optional] Private key in JWK format
	KeyJwk *JsonWebKey `json:"keyJwk,omitempty,omitzero"`

	// Pem encoded public key
	KeyPem string `json:"keyPem"`

	// the size of the modulus in bits
	KeySize int `json:"keySize"`

	// PrivateKey corresponds to the JSON schema field "privateKey".
	PrivateKey PrivateKey `json:"privateKey"`

	// [Optional] Private key in JWK format
	PrivateKeyJwk *JsonWebKey `json:"privateKeyJwk,omitempty,omitzero"`

	// Pem encoded private key
	PrivateKeyPem string `json:"privateKeyPem"`

	// DER encoding of the PKCS8 private key
	PrivateKeyPkcs8 string `json:"privateKeyPkcs8"`

	// the hash function used for the message
	Sha string `json:"sha"`

	// Source corresponds to the JSON schema field "source".
	Source Source `json:"source"`

	// Tests corresponds to the JSON schema field "tests".
	Tests []SignatureTestVector `json:"tests"`

	// Type corresponds to the JSON schema field "type".
	Type RsassaPkcs1GenTestGroupType `json:"type"`
}

type RsassaPkcs1GenTestGroupType string

const RsassaPkcs1GenTestGroupTypeRsassaPkcs1Generate RsassaPkcs1GenTestGroupType = "RsassaPkcs1Generate"

var enumValues_RsassaPkcs1GenTestGroupType = []interface{}{
	"RsassaPkcs1Generate",
}

// UnmarshalJSON implements json.Unmarshaler.
func (j *RsassaPkcs1GenTestGroupType) UnmarshalJSON(value []byte) error {
	var v string
	if err := json.Unmarshal(value, &v); err != nil {
		return err
	}
	var ok bool
	for _, expected := range enumValues_RsassaPkcs1GenTestGroupType {
		if reflect.DeepEqual(v, expected) {
			ok = true
			break
		}
	}
	if !ok {
		return fmt.Errorf("invalid value (expected one of %#v): %#v", enumValues_RsassaPkcs1GenTestGroupType, v)
	}
	*j = RsassaPkcs1GenTestGroupType(v)
	return nil
}

// UnmarshalJSON implements json.Unmarshaler.
func (j *RsassaPkcs1GenTestGroup) UnmarshalJSON(value []byte) error {
	var raw map[string]interface{}
	if err := json.Unmarshal(value, &raw); err != nil {
		return err
	}
	if _, ok := raw["keyAsn"]; raw != nil && !ok {
		return fmt.Errorf("field keyAsn in RsassaPkcs1GenTestGroup: required")
	}
	if _, ok := raw["keyDer"]; raw != nil && !ok {
		return fmt.Errorf("field keyDer in RsassaPkcs1GenTestGroup: required")
	}
	if _, ok := raw["keyPem"]; raw != nil && !ok {
		return fmt.Errorf("field keyPem in RsassaPkcs1GenTestGroup: required")
	}
	if _, ok := raw["keySize"]; raw != nil && !ok {
		return fmt.Errorf("field keySize in RsassaPkcs1GenTestGroup: required")
	}
	if _, ok := raw["privateKey"]; raw != nil && !ok {
		return fmt.Errorf("field privateKey in RsassaPkcs1GenTestGroup: required")
	}
	if _, ok := raw["privateKeyPem"]; raw != nil && !ok {
		return fmt.Errorf("field privateKeyPem in RsassaPkcs1GenTestGroup: required")
	}
	if _, ok := raw["privateKeyPkcs8"]; raw != nil && !ok {
		return fmt.Errorf("field privateKeyPkcs8 in RsassaPkcs1GenTestGroup: required")
	}
	if _, ok := raw["sha"]; raw != nil && !ok {
		return fmt.Errorf("field sha in RsassaPkcs1GenTestGroup: required")
	}
	if _, ok := raw["source"]; raw != nil && !ok {
		return fmt.Errorf("field source in RsassaPkcs1GenTestGroup: required")
	}
	if _, ok := raw["tests"]; raw != nil && !ok {
		return fmt.Errorf("field tests in RsassaPkcs1GenTestGroup: required")
	}
	if _, ok := raw["type"]; raw != nil && !ok {
		return fmt.Errorf("field type in RsassaPkcs1GenTestGroup: required")
	}
	type Plain RsassaPkcs1GenTestGroup
	var plain Plain
	if err := json.Unmarshal(value, &plain); err != nil {
		return err
	}
	*j = RsassaPkcs1GenTestGroup(plain)
	return nil
}

type RsassaPkcs1GenerateSchemaV1Json struct {
	// the primitive tested in the test file
	Algorithm string `json:"algorithm"`

	// additional documentation
	Header []string `json:"header"`

	// Notes corresponds to the JSON schema field "notes".
	Notes Notes `json:"notes"`

	// the number of test vectors in this test
	NumberOfTests int `json:"numberOfTests"`

	// Schema corresponds to the JSON schema field "schema".
	Schema RsassaPkcs1GenerateSchemaV1JsonSchema `json:"schema"`

	// TestGroups corresponds to the JSON schema field "testGroups".
	TestGroups []RsassaPkcs1GenTestGroup `json:"testGroups"`
}

type RsassaPkcs1GenerateSchemaV1JsonSchema string

const RsassaPkcs1GenerateSchemaV1JsonSchemaRsassaPkcs1GenerateSchemaV1Json RsassaPkcs1GenerateSchemaV1JsonSchema = "rsassa_pkcs1_generate_schema_v1.json"

var enumValues_RsassaPkcs1GenerateSchemaV1JsonSchema = []interface{}{
	"rsassa_pkcs1_generate_schema_v1.json",
}

// UnmarshalJSON implements json.Unmarshaler.
func (j *RsassaPkcs1GenerateSchemaV1JsonSchema) UnmarshalJSON(value []byte) error {
	var v string
	if err := json.Unmarshal(value, &v); err != nil {
		return err
	}
	var ok bool
	for _, expected := range enumValues_RsassaPkcs1GenerateSchemaV1JsonSchema {
		if reflect.DeepEqual(v, expected) {
			ok = true
			break
		}
	}
	if !ok {
		return fmt.Errorf("invalid value (expected one of %#v): %#v", enumValues_RsassaPkcs1GenerateSchemaV1JsonSchema, v)
	}
	*j = RsassaPkcs1GenerateSchemaV1JsonSchema(v)
	return nil
}

// UnmarshalJSON implements json.Unmarshaler.
func (j *RsassaPkcs1GenerateSchemaV1Json) UnmarshalJSON(value []byte) error {
	var raw map[string]interface{}
	if err := json.Unmarshal(value, &raw); err != nil {
		return err
	}
	if _, ok := raw["algorithm"]; raw != nil && !ok {
		return fmt.Errorf("field algorithm in RsassaPkcs1GenerateSchemaV1Json: required")
	}
	if _, ok := raw["header"]; raw != nil && !ok {
		return fmt.Errorf("field header in RsassaPkcs1GenerateSchemaV1Json: required")
	}
	if _, ok := raw["notes"]; raw != nil && !ok {
		return fmt.Errorf("field notes in RsassaPkcs1GenerateSchemaV1Json: required")
	}
	if _, ok := raw["numberOfTests"]; raw != nil && !ok {
		return fmt.Errorf("field numberOfTests in RsassaPkcs1GenerateSchemaV1Json: required")
	}
	if _, ok := raw["schema"]; raw != nil && !ok {
		return fmt.Errorf("field schema in RsassaPkcs1GenerateSchemaV1Json: required")
	}
	if _, ok := raw["testGroups"]; raw != nil && !ok {
		return fmt.Errorf("field testGroups in RsassaPkcs1GenerateSchemaV1Json: required")
	}
	type Plain RsassaPkcs1GenerateSchemaV1Json
	var plain Plain
	if err := json.Unmarshal(value, &plain); err != nil {
		return err
	}
	*j = RsassaPkcs1GenerateSchemaV1Json(plain)
	return nil
}

type RsassaPkcs1TestGroup struct {
	// KeyJwk corresponds to the JSON schema field "keyJwk".
	KeyJwk *JsonWebKey `json:"keyJwk,omitempty,omitzero"`

	// the size of the modulus in bits
	KeySize int `json:"keySize"`

	// PublicKey corresponds to the JSON schema field "publicKey".
	PublicKey RsassaPkcs1TestGroupPublicKey `json:"publicKey"`

	// ASN encoding of the sequence [n, e]
	PublicKeyAsn string `json:"publicKeyAsn"`

	// ASN encoding of the public key
	PublicKeyDer string `json:"publicKeyDer"`

	// Pem encoded public key
	PublicKeyPem string `json:"publicKeyPem"`

	// the hash function used for the message
	Sha string `json:"sha"`

	// Source corresponds to the JSON schema field "source".
	Source Source `json:"source"`

	// Tests corresponds to the JSON schema field "tests".
	Tests []SignatureTestVector `json:"tests"`

	// Type corresponds to the JSON schema field "type".
	Type RsassaPkcs1TestGroupType `json:"type"`
}

type RsassaPkcs1TestGroupPublicKey struct {
	// The modulus of the key
	Modulus string `json:"modulus"`

	// The public exponent
	PublicExponent string `json:"publicExponent"`
}

// UnmarshalJSON implements json.Unmarshaler.
func (j *RsassaPkcs1TestGroupPublicKey) UnmarshalJSON(value []byte) error {
	var raw map[string]interface{}
	if err := json.Unmarshal(value, &raw); err != nil {
		return err
	}
	if _, ok := raw["modulus"]; raw != nil && !ok {
		return fmt.Errorf("field modulus in RsassaPkcs1TestGroupPublicKey: required")
	}
	if _, ok := raw["publicExponent"]; raw != nil && !ok {
		return fmt.Errorf("field publicExponent in RsassaPkcs1TestGroupPublicKey: required")
	}
	type Plain RsassaPkcs1TestGroupPublicKey
	var plain Plain
	if err := json.Unmarshal(value, &plain); err != nil {
		return err
	}
	*j = RsassaPkcs1TestGroupPublicKey(plain)
	return nil
}

type RsassaPkcs1TestGroupType string

const RsassaPkcs1TestGroupTypeRsassaPkcs1Verify RsassaPkcs1TestGroupType = "RsassaPkcs1Verify"

var enumValues_RsassaPkcs1TestGroupType = []interface{}{
	"RsassaPkcs1Verify",
}

// UnmarshalJSON implements json.Unmarshaler.
func (j *RsassaPkcs1TestGroupType) UnmarshalJSON(value []byte) error {
	var v string
	if err := json.Unmarshal(value, &v); err != nil {
		return err
	}
	var ok bool
	for _, expected := range enumValues_RsassaPkcs1TestGroupType {
		if reflect.DeepEqual(v, expected) {
			ok = true
			break
		}
	}
	if !ok {
		return fmt.Errorf("invalid value (expected one of %#v): %#v", enumValues_RsassaPkcs1TestGroupType, v)
	}
	*j = RsassaPkcs1TestGroupType(v)
	return nil
}

// UnmarshalJSON implements json.Unmarshaler.
func (j *RsassaPkcs1TestGroup) UnmarshalJSON(value []byte) error {
	var raw map[string]interface{}
	if err := json.Unmarshal(value, &raw); err != nil {
		return err
	}
	if _, ok := raw["keySize"]; raw != nil && !ok {
		return fmt.Errorf("field keySize in RsassaPkcs1TestGroup: required")
	}
	if _, ok := raw["publicKey"]; raw != nil && !ok {
		return fmt.Errorf("field publicKey in RsassaPkcs1TestGroup: required")
	}
	if _, ok := raw["publicKeyAsn"]; raw != nil && !ok {
		return fmt.Errorf("field publicKeyAsn in RsassaPkcs1TestGroup: required")
	}
	if _, ok := raw["publicKeyDer"]; raw != nil && !ok {
		return fmt.Errorf("field publicKeyDer in RsassaPkcs1TestGroup: required")
	}
	if _, ok := raw["publicKeyPem"]; raw != nil && !ok {
		return fmt.Errorf("field publicKeyPem in RsassaPkcs1TestGroup: required")
	}
	if _, ok := raw["sha"]; raw != nil && !ok {
		return fmt.Errorf("field sha in RsassaPkcs1TestGroup: required")
	}
	if _, ok := raw["source"]; raw != nil && !ok {
		return fmt.Errorf("field source in RsassaPkcs1TestGroup: required")
	}
	if _, ok := raw["tests"]; raw != nil && !ok {
		return fmt.Errorf("field tests in RsassaPkcs1TestGroup: required")
	}
	if _, ok := raw["type"]; raw != nil && !ok {
		return fmt.Errorf("field type in RsassaPkcs1TestGroup: required")
	}
	type Plain RsassaPkcs1TestGroup
	var plain Plain
	if err := json.Unmarshal(value, &plain); err != nil {
		return err
	}
	*j = RsassaPkcs1TestGroup(plain)
	return nil
}

type RsassaPkcs1VerifySchemaV1Json struct {
	// the primitive tested in the test file
	Algorithm string `json:"algorithm"`

	// DEPRECATED: prefer "source" property in test group
	GeneratorVersion *string `json:"generatorVersion,omitempty,omitzero"`

	// additional documentation
	Header []string `json:"header"`

	// Notes corresponds to the JSON schema field "notes".
	Notes Notes `json:"notes"`

	// the number of test vectors in this test
	NumberOfTests int `json:"numberOfTests"`

	// Schema corresponds to the JSON schema field "schema".
	Schema RsassaPkcs1VerifySchemaV1JsonSchema `json:"schema"`

	// TestGroups corresponds to the JSON schema field "testGroups".
	TestGroups []RsassaPkcs1TestGroup `json:"testGroups"`
}

type RsassaPkcs1VerifySchemaV1JsonSchema string

const RsassaPkcs1VerifySchemaV1JsonSchemaRsassaPkcs1VerifySchemaV1Json RsassaPkcs1VerifySchemaV1JsonSchema = "rsassa_pkcs1_verify_schema_v1.json"

var enumValues_RsassaPkcs1VerifySchemaV1JsonSchema = []interface{}{
	"rsassa_pkcs1_verify_schema_v1.json",
}

// UnmarshalJSON implements json.Unmarshaler.
func (j *RsassaPkcs1VerifySchemaV1JsonSchema) UnmarshalJSON(value []byte) error {
	var v string
	if err := json.Unmarshal(value, &v); err != nil {
		return err
	}
	var ok bool
	for _, expected := range enumValues_RsassaPkcs1VerifySchemaV1JsonSchema {
		if reflect.DeepEqual(v, expected) {
			ok = true
			break
		}
	}
	if !ok {
		return fmt.Errorf("invalid value (expected one of %#v): %#v", enumValues_RsassaPkcs1VerifySchemaV1JsonSchema, v)
	}
	*j = RsassaPkcs1VerifySchemaV1JsonSchema(v)
	return nil
}

// UnmarshalJSON implements json.Unmarshaler.
func (j *RsassaPkcs1VerifySchemaV1Json) UnmarshalJSON(value []byte) error {
	var raw map[string]interface{}
	if err := json.Unmarshal(value, &raw); err != nil {
		return err
	}
	if _, ok := raw["algorithm"]; raw != nil && !ok {
		return fmt.Errorf("field algorithm in RsassaPkcs1VerifySchemaV1Json: required")
	}
	if _, ok := raw["header"]; raw != nil && !ok {
		return fmt.Errorf("field header in RsassaPkcs1VerifySchemaV1Json: required")
	}
	if _, ok := raw["notes"]; raw != nil && !ok {
		return fmt.Errorf("field notes in RsassaPkcs1VerifySchemaV1Json: required")
	}
	if _, ok := raw["numberOfTests"]; raw != nil && !ok {
		return fmt.Errorf("field numberOfTests in RsassaPkcs1VerifySchemaV1Json: required")
	}
	if _, ok := raw["schema"]; raw != nil && !ok {
		return fmt.Errorf("field schema in RsassaPkcs1VerifySchemaV1Json: required")
	}
	if _, ok := raw["testGroups"]; raw != nil && !ok {
		return fmt.Errorf("field testGroups in RsassaPkcs1VerifySchemaV1Json: required")
	}
	type Plain RsassaPkcs1VerifySchemaV1Json
	var plain Plain
	if err := json.Unmarshal(value, &plain); err != nil {
		return err
	}
	*j = RsassaPkcs1VerifySchemaV1Json(plain)
	return nil
}

type RsassaPssTestGroup struct {
	// the size of the modulus in bits
	KeySize int `json:"keySize"`

	// the message generating function (e.g. MGF1)
	Mgf string `json:"mgf"`

	// The hash function used for the message generating function.
	MgfSha string `json:"mgfSha"`

	// PublicKey corresponds to the JSON schema field "publicKey".
	PublicKey RsassaPssTestGroupPublicKey `json:"publicKey"`

	// ASN encoding of the sequence [n, e]
	PublicKeyAsn string `json:"publicKeyAsn"`

	// ASN encoding of the public key
	PublicKeyDer string `json:"publicKeyDer"`

	// PublicKeyJwk corresponds to the JSON schema field "publicKeyJwk".
	PublicKeyJwk *JsonWebKey `json:"publicKeyJwk,omitempty,omitzero"`

	// Pem encoded public key
	PublicKeyPem string `json:"publicKeyPem"`

	// The salt length
	SLen int `json:"sLen"`

	// The hash function for hashing the message.
	Sha string `json:"sha"`

	// Source corresponds to the JSON schema field "source".
	Source Source `json:"source"`

	// Tests corresponds to the JSON schema field "tests".
	Tests []RsassaPssTestVector `json:"tests"`

	// Type corresponds to the JSON schema field "type".
	Type RsassaPssTestGroupType `json:"type"`
}

type RsassaPssTestGroupPublicKey struct {
	// The modulus of the key
	Modulus string `json:"modulus"`

	// The public exponent
	PublicExponent string `json:"publicExponent"`
}

// UnmarshalJSON implements json.Unmarshaler.
func (j *RsassaPssTestGroupPublicKey) UnmarshalJSON(value []byte) error {
	var raw map[string]interface{}
	if err := json.Unmarshal(value, &raw); err != nil {
		return err
	}
	if _, ok := raw["modulus"]; raw != nil && !ok {
		return fmt.Errorf("field modulus in RsassaPssTestGroupPublicKey: required")
	}
	if _, ok := raw["publicExponent"]; raw != nil && !ok {
		return fmt.Errorf("field publicExponent in RsassaPssTestGroupPublicKey: required")
	}
	type Plain RsassaPssTestGroupPublicKey
	var plain Plain
	if err := json.Unmarshal(value, &plain); err != nil {
		return err
	}
	*j = RsassaPssTestGroupPublicKey(plain)
	return nil
}

type RsassaPssTestGroupType string

const RsassaPssTestGroupTypeRsassaPssVerify RsassaPssTestGroupType = "RsassaPssVerify"

var enumValues_RsassaPssTestGroupType = []interface{}{
	"RsassaPssVerify",
}

// UnmarshalJSON implements json.Unmarshaler.
func (j *RsassaPssTestGroupType) UnmarshalJSON(value []byte) error {
	var v string
	if err := json.Unmarshal(value, &v); err != nil {
		return err
	}
	var ok bool
	for _, expected := range enumValues_RsassaPssTestGroupType {
		if reflect.DeepEqual(v, expected) {
			ok = true
			break
		}
	}
	if !ok {
		return fmt.Errorf("invalid value (expected one of %#v): %#v", enumValues_RsassaPssTestGroupType, v)
	}
	*j = RsassaPssTestGroupType(v)
	return nil
}

// UnmarshalJSON implements json.Unmarshaler.
func (j *RsassaPssTestGroup) UnmarshalJSON(value []byte) error {
	var raw map[string]interface{}
	if err := json.Unmarshal(value, &raw); err != nil {
		return err
	}
	if _, ok := raw["keySize"]; raw != nil && !ok {
		return fmt.Errorf("field keySize in RsassaPssTestGroup: required")
	}
	if _, ok := raw["mgf"]; raw != nil && !ok {
		return fmt.Errorf("field mgf in RsassaPssTestGroup: required")
	}
	if _, ok := raw["mgfSha"]; raw != nil && !ok {
		return fmt.Errorf("field mgfSha in RsassaPssTestGroup: required")
	}
	if _, ok := raw["publicKey"]; raw != nil && !ok {
		return fmt.Errorf("field publicKey in RsassaPssTestGroup: required")
	}
	if _, ok := raw["publicKeyAsn"]; raw != nil && !ok {
		return fmt.Errorf("field publicKeyAsn in RsassaPssTestGroup: required")
	}
	if _, ok := raw["publicKeyDer"]; raw != nil && !ok {
		return fmt.Errorf("field publicKeyDer in RsassaPssTestGroup: required")
	}
	if _, ok := raw["publicKeyPem"]; raw != nil && !ok {
		return fmt.Errorf("field publicKeyPem in RsassaPssTestGroup: required")
	}
	if _, ok := raw["sLen"]; raw != nil && !ok {
		return fmt.Errorf("field sLen in RsassaPssTestGroup: required")
	}
	if _, ok := raw["sha"]; raw != nil && !ok {
		return fmt.Errorf("field sha in RsassaPssTestGroup: required")
	}
	if _, ok := raw["source"]; raw != nil && !ok {
		return fmt.Errorf("field source in RsassaPssTestGroup: required")
	}
	if _, ok := raw["tests"]; raw != nil && !ok {
		return fmt.Errorf("field tests in RsassaPssTestGroup: required")
	}
	if _, ok := raw["type"]; raw != nil && !ok {
		return fmt.Errorf("field type in RsassaPssTestGroup: required")
	}
	type Plain RsassaPssTestGroup
	var plain Plain
	if err := json.Unmarshal(value, &plain); err != nil {
		return err
	}
	*j = RsassaPssTestGroup(plain)
	return nil
}

type RsassaPssTestVector struct {
	// A brief description of the test case
	Comment string `json:"comment"`

	// A list of flags
	Flags []string `json:"flags"`

	// The message to sign
	Msg string `json:"msg"`

	// Result corresponds to the JSON schema field "result".
	Result Result `json:"result"`

	// a signature for msg
	Sig string `json:"sig"`

	// Identifier of the test case
	TcId int `json:"tcId"`
}

// UnmarshalJSON implements json.Unmarshaler.
func (j *RsassaPssTestVector) UnmarshalJSON(value []byte) error {
	var raw map[string]interface{}
	if err := json.Unmarshal(value, &raw); err != nil {
		return err
	}
	if _, ok := raw["comment"]; raw != nil && !ok {
		return fmt.Errorf("field comment in RsassaPssTestVector: required")
	}
	if _, ok := raw["flags"]; raw != nil && !ok {
		return fmt.Errorf("field flags in RsassaPssTestVector: required")
	}
	if _, ok := raw["msg"]; raw != nil && !ok {
		return fmt.Errorf("field msg in RsassaPssTestVector: required")
	}
	if _, ok := raw["result"]; raw != nil && !ok {
		return fmt.Errorf("field result in RsassaPssTestVector: required")
	}
	if _, ok := raw["sig"]; raw != nil && !ok {
		return fmt.Errorf("field sig in RsassaPssTestVector: required")
	}
	if _, ok := raw["tcId"]; raw != nil && !ok {
		return fmt.Errorf("field tcId in RsassaPssTestVector: required")
	}
	type Plain RsassaPssTestVector
	var plain Plain
	if err := json.Unmarshal(value, &plain); err != nil {
		return err
	}
	*j = RsassaPssTestVector(plain)
	return nil
}

type RsassaPssVerifySchemaV1Json struct {
	// the primitive tested in the test file
	Algorithm string `json:"algorithm"`

	// DEPRECATED: prefer "source" property in test group
	GeneratorVersion *string `json:"generatorVersion,omitempty,omitzero"`

	// additional documentation
	Header []string `json:"header"`

	// Notes corresponds to the JSON schema field "notes".
	Notes Notes `json:"notes"`

	// the number of test vectors in this test
	NumberOfTests int `json:"numberOfTests"`

	// Schema corresponds to the JSON schema field "schema".
	Schema RsassaPssVerifySchemaV1JsonSchema `json:"schema"`

	// TestGroups corresponds to the JSON schema field "testGroups".
	TestGroups []RsassaPssTestGroup `json:"testGroups"`
}

type RsassaPssVerifySchemaV1JsonSchema string

const RsassaPssVerifySchemaV1JsonSchemaRsassaPssVerifySchemaV1Json RsassaPssVerifySchemaV1JsonSchema = "rsassa_pss_verify_schema_v1.json"

var enumValues_RsassaPssVerifySchemaV1JsonSchema = []interface{}{
	"rsassa_pss_verify_schema_v1.json",
}

// UnmarshalJSON implements json.Unmarshaler.
func (j *RsassaPssVerifySchemaV1JsonSchema) UnmarshalJSON(value []byte) error {
	var v string
	if err := json.Unmarshal(value, &v); err != nil {
		return err
	}
	var ok bool
	for _, expected := range enumValues_RsassaPssVerifySchemaV1JsonSchema {
		if reflect.DeepEqual(v, expected) {
			ok = true
			break
		}
	}
	if !ok {
		return fmt.Errorf("invalid value (expected one of %#v): %#v", enumValues_RsassaPssVerifySchemaV1JsonSchema, v)
	}
	*j = RsassaPssVerifySchemaV1JsonSchema(v)
	return nil
}

// UnmarshalJSON implements json.Unmarshaler.
func (j *RsassaPssVerifySchemaV1Json) UnmarshalJSON(value []byte) error {
	var raw map[string]interface{}
	if err := json.Unmarshal(value, &raw); err != nil {
		return err
	}
	if _, ok := raw["algorithm"]; raw != nil && !ok {
		return fmt.Errorf("field algorithm in RsassaPssVerifySchemaV1Json: required")
	}
	if _, ok := raw["header"]; raw != nil && !ok {
		return fmt.Errorf("field header in RsassaPssVerifySchemaV1Json: required")
	}
	if _, ok := raw["notes"]; raw != nil && !ok {
		return fmt.Errorf("field notes in RsassaPssVerifySchemaV1Json: required")
	}
	if _, ok := raw["numberOfTests"]; raw != nil && !ok {
		return fmt.Errorf("field numberOfTests in RsassaPssVerifySchemaV1Json: required")
	}
	if _, ok := raw["schema"]; raw != nil && !ok {
		return fmt.Errorf("field schema in RsassaPssVerifySchemaV1Json: required")
	}
	if _, ok := raw["testGroups"]; raw != nil && !ok {
		return fmt.Errorf("field testGroups in RsassaPssVerifySchemaV1Json: required")
	}
	type Plain RsassaPssVerifySchemaV1Json
	var plain Plain
	if err := json.Unmarshal(value, &plain); err != nil {
		return err
	}
	*j = RsassaPssVerifySchemaV1Json(plain)
	return nil
}

type SignatureTestVector struct {
	// A brief description of the test case
	Comment string `json:"comment"`

	// A list of flags
	Flags []string `json:"flags"`

	// The message to sign
	Msg string `json:"msg"`

	// Result corresponds to the JSON schema field "result".
	Result Result `json:"result"`

	// A signature for msg
	Sig string `json:"sig"`

	// Identifier of the test case
	TcId int `json:"tcId"`
}

// UnmarshalJSON implements json.Unmarshaler.
func (j *SignatureTestVector) UnmarshalJSON(value []byte) error {
	var raw map[string]interface{}
	if err := json.Unmarshal(value, &raw); err != nil {
		return err
	}
	if _, ok := raw["comment"]; raw != nil && !ok {
		return fmt.Errorf("field comment in SignatureTestVector: required")
	}
	if _, ok := raw["flags"]; raw != nil && !ok {
		return fmt.Errorf("field flags in SignatureTestVector: required")
	}
	if _, ok := raw["msg"]; raw != nil && !ok {
		return fmt.Errorf("field msg in SignatureTestVector: required")
	}
	if _, ok := raw["result"]; raw != nil && !ok {
		return fmt.Errorf("field result in SignatureTestVector: required")
	}
	if _, ok := raw["sig"]; raw != nil && !ok {
		return fmt.Errorf("field sig in SignatureTestVector: required")
	}
	if _, ok := raw["tcId"]; raw != nil && !ok {
		return fmt.Errorf("field tcId in SignatureTestVector: required")
	}
	type Plain SignatureTestVector
	var plain Plain
	if err := json.Unmarshal(value, &plain); err != nil {
		return err
	}
	*j = SignatureTestVector(plain)
	return nil
}

type Source struct {
	// Name corresponds to the JSON schema field "name".
	Name string `json:"name"`

	// Version corresponds to the JSON schema field "version".
	Version string `json:"version"`
}

// UnmarshalJSON implements json.Unmarshaler.
func (j *Source) UnmarshalJSON(value []byte) error {
	var raw map[string]interface{}
	if err := json.Unmarshal(value, &raw); err != nil {
		return err
	}
	if _, ok := raw["name"]; raw != nil && !ok {
		return fmt.Errorf("field name in Source: required")
	}
	if _, ok := raw["version"]; raw != nil && !ok {
		return fmt.Errorf("field version in Source: required")
	}
	type Plain Source
	var plain Plain
	if err := json.Unmarshal(value, &plain); err != nil {
		return err
	}
	if utf8.RuneCountInString(string(plain.Name)) < 1 {
		return fmt.Errorf("field %s length: must be >= %d", "name", 1)
	}
	if utf8.RuneCountInString(string(plain.Version)) < 1 {
		return fmt.Errorf("field %s length: must be >= %d", "version", 1)
	}
	*j = Source(plain)
	return nil
}

type XdhAsnCompSchemaV1Json struct {
	// the primitive tested in the test file
	Algorithm string `json:"algorithm"`

	// DEPRECATED: prefer "source" property in test group
	GeneratorVersion *string `json:"generatorVersion,omitempty,omitzero"`

	// additional documentation
	Header []string `json:"header"`

	// Notes corresponds to the JSON schema field "notes".
	Notes Notes `json:"notes"`

	// the number of test vectors in this test
	NumberOfTests int `json:"numberOfTests"`

	// Schema corresponds to the JSON schema field "schema".
	Schema XdhAsnCompSchemaV1JsonSchema `json:"schema"`

	// TestGroups corresponds to the JSON schema field "testGroups".
	TestGroups []XdhAsnTestGroup `json:"testGroups"`
}

type XdhAsnCompSchemaV1JsonSchema string

const XdhAsnCompSchemaV1JsonSchemaXdhAsnCompSchemaV1Json XdhAsnCompSchemaV1JsonSchema = "xdh_asn_comp_schema_v1.json"

var enumValues_XdhAsnCompSchemaV1JsonSchema = []interface{}{
	"xdh_asn_comp_schema_v1.json",
}

// UnmarshalJSON implements json.Unmarshaler.
func (j *XdhAsnCompSchemaV1JsonSchema) UnmarshalJSON(value []byte) error {
	var v string
	if err := json.Unmarshal(value, &v); err != nil {
		return err
	}
	var ok bool
	for _, expected := range enumValues_XdhAsnCompSchemaV1JsonSchema {
		if reflect.DeepEqual(v, expected) {
			ok = true
			break
		}
	}
	if !ok {
		return fmt.Errorf("invalid value (expected one of %#v): %#v", enumValues_XdhAsnCompSchemaV1JsonSchema, v)
	}
	*j = XdhAsnCompSchemaV1JsonSchema(v)
	return nil
}

// UnmarshalJSON implements json.Unmarshaler.
func (j *XdhAsnCompSchemaV1Json) UnmarshalJSON(value []byte) error {
	var raw map[string]interface{}
	if err := json.Unmarshal(value, &raw); err != nil {
		return err
	}
	if _, ok := raw["algorithm"]; raw != nil && !ok {
		return fmt.Errorf("field algorithm in XdhAsnCompSchemaV1Json: required")
	}
	if _, ok := raw["header"]; raw != nil && !ok {
		return fmt.Errorf("field header in XdhAsnCompSchemaV1Json: required")
	}
	if _, ok := raw["notes"]; raw != nil && !ok {
		return fmt.Errorf("field notes in XdhAsnCompSchemaV1Json: required")
	}
	if _, ok := raw["numberOfTests"]; raw != nil && !ok {
		return fmt.Errorf("field numberOfTests in XdhAsnCompSchemaV1Json: required")
	}
	if _, ok := raw["schema"]; raw != nil && !ok {
		return fmt.Errorf("field schema in XdhAsnCompSchemaV1Json: required")
	}
	if _, ok := raw["testGroups"]; raw != nil && !ok {
		return fmt.Errorf("field testGroups in XdhAsnCompSchemaV1Json: required")
	}
	type Plain XdhAsnCompSchemaV1Json
	var plain Plain
	if err := json.Unmarshal(value, &plain); err != nil {
		return err
	}
	*j = XdhAsnCompSchemaV1Json(plain)
	return nil
}

type XdhAsnTestGroup struct {
	// the name of the curve
	Curve string `json:"curve"`

	// Source corresponds to the JSON schema field "source".
	Source Source `json:"source"`

	// Tests corresponds to the JSON schema field "tests".
	Tests []XdhAsnTestVector `json:"tests"`

	// Type corresponds to the JSON schema field "type".
	Type XdhAsnTestGroupType `json:"type"`
}

type XdhAsnTestGroupType string

const XdhAsnTestGroupTypeXdhAsnComp XdhAsnTestGroupType = "XdhAsnComp"

var enumValues_XdhAsnTestGroupType = []interface{}{
	"XdhAsnComp",
}

// UnmarshalJSON implements json.Unmarshaler.
func (j *XdhAsnTestGroupType) UnmarshalJSON(value []byte) error {
	var v string
	if err := json.Unmarshal(value, &v); err != nil {
		return err
	}
	var ok bool
	for _, expected := range enumValues_XdhAsnTestGroupType {
		if reflect.DeepEqual(v, expected) {
			ok = true
			break
		}
	}
	if !ok {
		return fmt.Errorf("invalid value (expected one of %#v): %#v", enumValues_XdhAsnTestGroupType, v)
	}
	*j = XdhAsnTestGroupType(v)
	return nil
}

// UnmarshalJSON implements json.Unmarshaler.
func (j *XdhAsnTestGroup) UnmarshalJSON(value []byte) error {
	var raw map[string]interface{}
	if err := json.Unmarshal(value, &raw); err != nil {
		return err
	}
	if _, ok := raw["curve"]; raw != nil && !ok {
		return fmt.Errorf("field curve in XdhAsnTestGroup: required")
	}
	if _, ok := raw["source"]; raw != nil && !ok {
		return fmt.Errorf("field source in XdhAsnTestGroup: required")
	}
	if _, ok := raw["tests"]; raw != nil && !ok {
		return fmt.Errorf("field tests in XdhAsnTestGroup: required")
	}
	if _, ok := raw["type"]; raw != nil && !ok {
		return fmt.Errorf("field type in XdhAsnTestGroup: required")
	}
	type Plain XdhAsnTestGroup
	var plain Plain
	if err := json.Unmarshal(value, &plain); err != nil {
		return err
	}
	*j = XdhAsnTestGroup(plain)
	return nil
}

type XdhAsnTestVector struct {
	// A brief description of the test case
	Comment string `json:"comment"`

	// A list of flags
	Flags []string `json:"flags"`

	// PKCS #8 encoded private key
	Private string `json:"private"`

	// X.509 encoded the public key
	Public string `json:"public"`

	// Result corresponds to the JSON schema field "result".
	Result Result `json:"result"`

	// the shared secret
	Shared string `json:"shared"`

	// Identifier of the test case
	TcId int `json:"tcId"`
}

// UnmarshalJSON implements json.Unmarshaler.
func (j *XdhAsnTestVector) UnmarshalJSON(value []byte) error {
	var raw map[string]interface{}
	if err := json.Unmarshal(value, &raw); err != nil {
		return err
	}
	if _, ok := raw["comment"]; raw != nil && !ok {
		return fmt.Errorf("field comment in XdhAsnTestVector: required")
	}
	if _, ok := raw["flags"]; raw != nil && !ok {
		return fmt.Errorf("field flags in XdhAsnTestVector: required")
	}
	if _, ok := raw["private"]; raw != nil && !ok {
		return fmt.Errorf("field private in XdhAsnTestVector: required")
	}
	if _, ok := raw["public"]; raw != nil && !ok {
		return fmt.Errorf("field public in XdhAsnTestVector: required")
	}
	if _, ok := raw["result"]; raw != nil && !ok {
		return fmt.Errorf("field result in XdhAsnTestVector: required")
	}
	if _, ok := raw["shared"]; raw != nil && !ok {
		return fmt.Errorf("field shared in XdhAsnTestVector: required")
	}
	if _, ok := raw["tcId"]; raw != nil && !ok {
		return fmt.Errorf("field tcId in XdhAsnTestVector: required")
	}
	type Plain XdhAsnTestVector
	var plain Plain
	if err := json.Unmarshal(value, &plain); err != nil {
		return err
	}
	*j = XdhAsnTestVector(plain)
	return nil
}

type XdhCompSchemaV1Json struct {
	// the primitive tested in the test file
	Algorithm string `json:"algorithm"`

	// DEPRECATED: prefer "source" property in test group
	GeneratorVersion *string `json:"generatorVersion,omitempty,omitzero"`

	// additional documentation
	Header []string `json:"header"`

	// Notes corresponds to the JSON schema field "notes".
	Notes Notes `json:"notes"`

	// the number of test vectors in this test
	NumberOfTests int `json:"numberOfTests"`

	// Schema corresponds to the JSON schema field "schema".
	Schema XdhCompSchemaV1JsonSchema `json:"schema"`

	// TestGroups corresponds to the JSON schema field "testGroups".
	TestGroups []XdhTestGroup `json:"testGroups"`
}

type XdhCompSchemaV1JsonSchema string

const XdhCompSchemaV1JsonSchemaXdhCompSchemaV1Json XdhCompSchemaV1JsonSchema = "xdh_comp_schema_v1.json"

var enumValues_XdhCompSchemaV1JsonSchema = []interface{}{
	"xdh_comp_schema_v1.json",
}

// UnmarshalJSON implements json.Unmarshaler.
func (j *XdhCompSchemaV1JsonSchema) UnmarshalJSON(value []byte) error {
	var v string
	if err := json.Unmarshal(value, &v); err != nil {
		return err
	}
	var ok bool
	for _, expected := range enumValues_XdhCompSchemaV1JsonSchema {
		if reflect.DeepEqual(v, expected) {
			ok = true
			break
		}
	}
	if !ok {
		return fmt.Errorf("invalid value (expected one of %#v): %#v", enumValues_XdhCompSchemaV1JsonSchema, v)
	}
	*j = XdhCompSchemaV1JsonSchema(v)
	return nil
}

// UnmarshalJSON implements json.Unmarshaler.
func (j *XdhCompSchemaV1Json) UnmarshalJSON(value []byte) error {
	var raw map[string]interface{}
	if err := json.Unmarshal(value, &raw); err != nil {
		return err
	}
	if _, ok := raw["algorithm"]; raw != nil && !ok {
		return fmt.Errorf("field algorithm in XdhCompSchemaV1Json: required")
	}
	if _, ok := raw["header"]; raw != nil && !ok {
		return fmt.Errorf("field header in XdhCompSchemaV1Json: required")
	}
	if _, ok := raw["notes"]; raw != nil && !ok {
		return fmt.Errorf("field notes in XdhCompSchemaV1Json: required")
	}
	if _, ok := raw["numberOfTests"]; raw != nil && !ok {
		return fmt.Errorf("field numberOfTests in XdhCompSchemaV1Json: required")
	}
	if _, ok := raw["schema"]; raw != nil && !ok {
		return fmt.Errorf("field schema in XdhCompSchemaV1Json: required")
	}
	if _, ok := raw["testGroups"]; raw != nil && !ok {
		return fmt.Errorf("field testGroups in XdhCompSchemaV1Json: required")
	}
	type Plain XdhCompSchemaV1Json
	var plain Plain
	if err := json.Unmarshal(value, &plain); err != nil {
		return err
	}
	*j = XdhCompSchemaV1Json(plain)
	return nil
}

type XdhJwkCompSchemaV1Json struct {
	// the primitive tested in the test file
	Algorithm string `json:"algorithm"`

	// DEPRECATED: prefer "source" property in test group
	GeneratorVersion *string `json:"generatorVersion,omitempty,omitzero"`

	// additional documentation
	Header []string `json:"header"`

	// Notes corresponds to the JSON schema field "notes".
	Notes Notes `json:"notes"`

	// the number of test vectors in this test
	NumberOfTests int `json:"numberOfTests"`

	// Schema corresponds to the JSON schema field "schema".
	Schema XdhJwkCompSchemaV1JsonSchema `json:"schema"`

	// TestGroups corresponds to the JSON schema field "testGroups".
	TestGroups []XdhJwkTestGroup `json:"testGroups"`
}

type XdhJwkCompSchemaV1JsonSchema string

const XdhJwkCompSchemaV1JsonSchemaXdhJwkCompSchemaV1Json XdhJwkCompSchemaV1JsonSchema = "xdh_jwk_comp_schema_v1.json"

var enumValues_XdhJwkCompSchemaV1JsonSchema = []interface{}{
	"xdh_jwk_comp_schema_v1.json",
}

// UnmarshalJSON implements json.Unmarshaler.
func (j *XdhJwkCompSchemaV1JsonSchema) UnmarshalJSON(value []byte) error {
	var v string
	if err := json.Unmarshal(value, &v); err != nil {
		return err
	}
	var ok bool
	for _, expected := range enumValues_XdhJwkCompSchemaV1JsonSchema {
		if reflect.DeepEqual(v, expected) {
			ok = true
			break
		}
	}
	if !ok {
		return fmt.Errorf("invalid value (expected one of %#v): %#v", enumValues_XdhJwkCompSchemaV1JsonSchema, v)
	}
	*j = XdhJwkCompSchemaV1JsonSchema(v)
	return nil
}

// UnmarshalJSON implements json.Unmarshaler.
func (j *XdhJwkCompSchemaV1Json) UnmarshalJSON(value []byte) error {
	var raw map[string]interface{}
	if err := json.Unmarshal(value, &raw); err != nil {
		return err
	}
	if _, ok := raw["algorithm"]; raw != nil && !ok {
		return fmt.Errorf("field algorithm in XdhJwkCompSchemaV1Json: required")
	}
	if _, ok := raw["header"]; raw != nil && !ok {
		return fmt.Errorf("field header in XdhJwkCompSchemaV1Json: required")
	}
	if _, ok := raw["notes"]; raw != nil && !ok {
		return fmt.Errorf("field notes in XdhJwkCompSchemaV1Json: required")
	}
	if _, ok := raw["numberOfTests"]; raw != nil && !ok {
		return fmt.Errorf("field numberOfTests in XdhJwkCompSchemaV1Json: required")
	}
	if _, ok := raw["schema"]; raw != nil && !ok {
		return fmt.Errorf("field schema in XdhJwkCompSchemaV1Json: required")
	}
	if _, ok := raw["testGroups"]; raw != nil && !ok {
		return fmt.Errorf("field testGroups in XdhJwkCompSchemaV1Json: required")
	}
	type Plain XdhJwkCompSchemaV1Json
	var plain Plain
	if err := json.Unmarshal(value, &plain); err != nil {
		return err
	}
	*j = XdhJwkCompSchemaV1Json(plain)
	return nil
}

type XdhJwkTestGroup struct {
	// the name of the curve
	Curve string `json:"curve"`

	// Source corresponds to the JSON schema field "source".
	Source Source `json:"source"`

	// Tests corresponds to the JSON schema field "tests".
	Tests []XdhJwkTestVector `json:"tests"`

	// Type corresponds to the JSON schema field "type".
	Type XdhJwkTestGroupType `json:"type"`
}

type XdhJwkTestGroupType string

const XdhJwkTestGroupTypeXdhJwkComp XdhJwkTestGroupType = "XdhJwkComp"

var enumValues_XdhJwkTestGroupType = []interface{}{
	"XdhJwkComp",
}

// UnmarshalJSON implements json.Unmarshaler.
func (j *XdhJwkTestGroupType) UnmarshalJSON(value []byte) error {
	var v string
	if err := json.Unmarshal(value, &v); err != nil {
		return err
	}
	var ok bool
	for _, expected := range enumValues_XdhJwkTestGroupType {
		if reflect.DeepEqual(v, expected) {
			ok = true
			break
		}
	}
	if !ok {
		return fmt.Errorf("invalid value (expected one of %#v): %#v", enumValues_XdhJwkTestGroupType, v)
	}
	*j = XdhJwkTestGroupType(v)
	return nil
}

// UnmarshalJSON implements json.Unmarshaler.
func (j *XdhJwkTestGroup) UnmarshalJSON(value []byte) error {
	var raw map[string]interface{}
	if err := json.Unmarshal(value, &raw); err != nil {
		return err
	}
	if _, ok := raw["curve"]; raw != nil && !ok {
		return fmt.Errorf("field curve in XdhJwkTestGroup: required")
	}
	if _, ok := raw["source"]; raw != nil && !ok {
		return fmt.Errorf("field source in XdhJwkTestGroup: required")
	}
	if _, ok := raw["tests"]; raw != nil && !ok {
		return fmt.Errorf("field tests in XdhJwkTestGroup: required")
	}
	if _, ok := raw["type"]; raw != nil && !ok {
		return fmt.Errorf("field type in XdhJwkTestGroup: required")
	}
	type Plain XdhJwkTestGroup
	var plain Plain
	if err := json.Unmarshal(value, &plain); err != nil {
		return err
	}
	*j = XdhJwkTestGroup(plain)
	return nil
}

type XdhJwkTestVector struct {
	// A brief description of the test case
	Comment string `json:"comment"`

	// A list of flags
	Flags []string `json:"flags"`

	// the private key in jwk format
	Private JsonWebKey `json:"private"`

	// the public key in jwk format
	Public JsonWebKey `json:"public"`

	// Result corresponds to the JSON schema field "result".
	Result Result `json:"result"`

	// the shared secret
	Shared string `json:"shared"`

	// Identifier of the test case
	TcId int `json:"tcId"`
}

// UnmarshalJSON implements json.Unmarshaler.
func (j *XdhJwkTestVector) UnmarshalJSON(value []byte) error {
	var raw map[string]interface{}
	if err := json.Unmarshal(value, &raw); err != nil {
		return err
	}
	if _, ok := raw["comment"]; raw != nil && !ok {
		return fmt.Errorf("field comment in XdhJwkTestVector: required")
	}
	if _, ok := raw["flags"]; raw != nil && !ok {
		return fmt.Errorf("field flags in XdhJwkTestVector: required")
	}
	if _, ok := raw["private"]; raw != nil && !ok {
		return fmt.Errorf("field private in XdhJwkTestVector: required")
	}
	if _, ok := raw["public"]; raw != nil && !ok {
		return fmt.Errorf("field public in XdhJwkTestVector: required")
	}
	if _, ok := raw["result"]; raw != nil && !ok {
		return fmt.Errorf("field result in XdhJwkTestVector: required")
	}
	if _, ok := raw["shared"]; raw != nil && !ok {
		return fmt.Errorf("field shared in XdhJwkTestVector: required")
	}
	if _, ok := raw["tcId"]; raw != nil && !ok {
		return fmt.Errorf("field tcId in XdhJwkTestVector: required")
	}
	type Plain XdhJwkTestVector
	var plain Plain
	if err := json.Unmarshal(value, &plain); err != nil {
		return err
	}
	*j = XdhJwkTestVector(plain)
	return nil
}

type XdhPemCompSchemaV1Json struct {
	// the primitive tested in the test file
	Algorithm string `json:"algorithm"`

	// DEPRECATED: prefer "source" property in test group
	GeneratorVersion *string `json:"generatorVersion,omitempty,omitzero"`

	// additional documentation
	Header []string `json:"header"`

	// Notes corresponds to the JSON schema field "notes".
	Notes Notes `json:"notes"`

	// the number of test vectors in this test
	NumberOfTests int `json:"numberOfTests"`

	// Schema corresponds to the JSON schema field "schema".
	Schema XdhPemCompSchemaV1JsonSchema `json:"schema"`

	// TestGroups corresponds to the JSON schema field "testGroups".
	TestGroups []XdhPemTestGroup `json:"testGroups"`
}

type XdhPemCompSchemaV1JsonSchema string

const XdhPemCompSchemaV1JsonSchemaXdhPemCompSchemaV1Json XdhPemCompSchemaV1JsonSchema = "xdh_pem_comp_schema_v1.json"

var enumValues_XdhPemCompSchemaV1JsonSchema = []interface{}{
	"xdh_pem_comp_schema_v1.json",
}

// UnmarshalJSON implements json.Unmarshaler.
func (j *XdhPemCompSchemaV1JsonSchema) UnmarshalJSON(value []byte) error {
	var v string
	if err := json.Unmarshal(value, &v); err != nil {
		return err
	}
	var ok bool
	for _, expected := range enumValues_XdhPemCompSchemaV1JsonSchema {
		if reflect.DeepEqual(v, expected) {
			ok = true
			break
		}
	}
	if !ok {
		return fmt.Errorf("invalid value (expected one of %#v): %#v", enumValues_XdhPemCompSchemaV1JsonSchema, v)
	}
	*j = XdhPemCompSchemaV1JsonSchema(v)
	return nil
}

// UnmarshalJSON implements json.Unmarshaler.
func (j *XdhPemCompSchemaV1Json) UnmarshalJSON(value []byte) error {
	var raw map[string]interface{}
	if err := json.Unmarshal(value, &raw); err != nil {
		return err
	}
	if _, ok := raw["algorithm"]; raw != nil && !ok {
		return fmt.Errorf("field algorithm in XdhPemCompSchemaV1Json: required")
	}
	if _, ok := raw["header"]; raw != nil && !ok {
		return fmt.Errorf("field header in XdhPemCompSchemaV1Json: required")
	}
	if _, ok := raw["notes"]; raw != nil && !ok {
		return fmt.Errorf("field notes in XdhPemCompSchemaV1Json: required")
	}
	if _, ok := raw["numberOfTests"]; raw != nil && !ok {
		return fmt.Errorf("field numberOfTests in XdhPemCompSchemaV1Json: required")
	}
	if _, ok := raw["schema"]; raw != nil && !ok {
		return fmt.Errorf("field schema in XdhPemCompSchemaV1Json: required")
	}
	if _, ok := raw["testGroups"]; raw != nil && !ok {
		return fmt.Errorf("field testGroups in XdhPemCompSchemaV1Json: required")
	}
	type Plain XdhPemCompSchemaV1Json
	var plain Plain
	if err := json.Unmarshal(value, &plain); err != nil {
		return err
	}
	*j = XdhPemCompSchemaV1Json(plain)
	return nil
}

type XdhPemTestGroup struct {
	// the name of the curve
	Curve string `json:"curve"`

	// Source corresponds to the JSON schema field "source".
	Source Source `json:"source"`

	// Tests corresponds to the JSON schema field "tests".
	Tests []XdhPemTestVector `json:"tests"`

	// Type corresponds to the JSON schema field "type".
	Type XdhPemTestGroupType `json:"type"`
}

type XdhPemTestGroupType string

const XdhPemTestGroupTypeXdhPemComp XdhPemTestGroupType = "XdhPemComp"

var enumValues_XdhPemTestGroupType = []interface{}{
	"XdhPemComp",
}

// UnmarshalJSON implements json.Unmarshaler.
func (j *XdhPemTestGroupType) UnmarshalJSON(value []byte) error {
	var v string
	if err := json.Unmarshal(value, &v); err != nil {
		return err
	}
	var ok bool
	for _, expected := range enumValues_XdhPemTestGroupType {
		if reflect.DeepEqual(v, expected) {
			ok = true
			break
		}
	}
	if !ok {
		return fmt.Errorf("invalid value (expected one of %#v): %#v", enumValues_XdhPemTestGroupType, v)
	}
	*j = XdhPemTestGroupType(v)
	return nil
}

// UnmarshalJSON implements json.Unmarshaler.
func (j *XdhPemTestGroup) UnmarshalJSON(value []byte) error {
	var raw map[string]interface{}
	if err := json.Unmarshal(value, &raw); err != nil {
		return err
	}
	if _, ok := raw["curve"]; raw != nil && !ok {
		return fmt.Errorf("field curve in XdhPemTestGroup: required")
	}
	if _, ok := raw["source"]; raw != nil && !ok {
		return fmt.Errorf("field source in XdhPemTestGroup: required")
	}
	if _, ok := raw["tests"]; raw != nil && !ok {
		return fmt.Errorf("field tests in XdhPemTestGroup: required")
	}
	if _, ok := raw["type"]; raw != nil && !ok {
		return fmt.Errorf("field type in XdhPemTestGroup: required")
	}
	type Plain XdhPemTestGroup
	var plain Plain
	if err := json.Unmarshal(value, &plain); err != nil {
		return err
	}
	*j = XdhPemTestGroup(plain)
	return nil
}

type XdhPemTestVector struct {
	// A brief description of the test case
	Comment string `json:"comment"`

	// A list of flags
	Flags []string `json:"flags"`

	// a raw private key
	Private string `json:"private"`

	// PEM encoded public key
	Public string `json:"public"`

	// Result corresponds to the JSON schema field "result".
	Result Result `json:"result"`

	// the shared secret
	Shared string `json:"shared"`

	// Identifier of the test case
	TcId int `json:"tcId"`
}

// UnmarshalJSON implements json.Unmarshaler.
func (j *XdhPemTestVector) UnmarshalJSON(value []byte) error {
	var raw map[string]interface{}
	if err := json.Unmarshal(value, &raw); err != nil {
		return err
	}
	if _, ok := raw["comment"]; raw != nil && !ok {
		return fmt.Errorf("field comment in XdhPemTestVector: required")
	}
	if _, ok := raw["flags"]; raw != nil && !ok {
		return fmt.Errorf("field flags in XdhPemTestVector: required")
	}
	if _, ok := raw["private"]; raw != nil && !ok {
		return fmt.Errorf("field private in XdhPemTestVector: required")
	}
	if _, ok := raw["public"]; raw != nil && !ok {
		return fmt.Errorf("field public in XdhPemTestVector: required")
	}
	if _, ok := raw["result"]; raw != nil && !ok {
		return fmt.Errorf("field result in XdhPemTestVector: required")
	}
	if _, ok := raw["shared"]; raw != nil && !ok {
		return fmt.Errorf("field shared in XdhPemTestVector: required")
	}
	if _, ok := raw["tcId"]; raw != nil && !ok {
		return fmt.Errorf("field tcId in XdhPemTestVector: required")
	}
	type Plain XdhPemTestVector
	var plain Plain
	if err := json.Unmarshal(value, &plain); err != nil {
		return err
	}
	*j = XdhPemTestVector(plain)
	return nil
}

type XdhTestGroup struct {
	// the name of the curve
	Curve string `json:"curve"`

	// Source corresponds to the JSON schema field "source".
	Source Source `json:"source"`

	// Tests corresponds to the JSON schema field "tests".
	Tests []XdhTestVector `json:"tests"`

	// Type corresponds to the JSON schema field "type".
	Type XdhTestGroupType `json:"type"`
}

type XdhTestGroupType string

const XdhTestGroupTypeXdhComp XdhTestGroupType = "XdhComp"

var enumValues_XdhTestGroupType = []interface{}{
	"XdhComp",
}

// UnmarshalJSON implements json.Unmarshaler.
func (j *XdhTestGroupType) UnmarshalJSON(value []byte) error {
	var v string
	if err := json.Unmarshal(value, &v); err != nil {
		return err
	}
	var ok bool
	for _, expected := range enumValues_XdhTestGroupType {
		if reflect.DeepEqual(v, expected) {
			ok = true
			break
		}
	}
	if !ok {
		return fmt.Errorf("invalid value (expected one of %#v): %#v", enumValues_XdhTestGroupType, v)
	}
	*j = XdhTestGroupType(v)
	return nil
}

// UnmarshalJSON implements json.Unmarshaler.
func (j *XdhTestGroup) UnmarshalJSON(value []byte) error {
	var raw map[string]interface{}
	if err := json.Unmarshal(value, &raw); err != nil {
		return err
	}
	if _, ok := raw["curve"]; raw != nil && !ok {
		return fmt.Errorf("field curve in XdhTestGroup: required")
	}
	if _, ok := raw["source"]; raw != nil && !ok {
		return fmt.Errorf("field source in XdhTestGroup: required")
	}
	if _, ok := raw["tests"]; raw != nil && !ok {
		return fmt.Errorf("field tests in XdhTestGroup: required")
	}
	if _, ok := raw["type"]; raw != nil && !ok {
		return fmt.Errorf("field type in XdhTestGroup: required")
	}
	type Plain XdhTestGroup
	var plain Plain
	if err := json.Unmarshal(value, &plain); err != nil {
		return err
	}
	*j = XdhTestGroup(plain)
	return nil
}

type XdhTestVector struct {
	// A brief description of the test case
	Comment string `json:"comment"`

	// A list of flags
	Flags []string `json:"flags"`

	// the raw bytes of private key
	Private string `json:"private"`

	// the raw bytes of the public key
	Public string `json:"public"`

	// Result corresponds to the JSON schema field "result".
	Result Result `json:"result"`

	// the shared secret
	Shared string `json:"shared"`

	// Identifier of the test case
	TcId int `json:"tcId"`
}

// UnmarshalJSON implements json.Unmarshaler.
func (j *XdhTestVector) UnmarshalJSON(value []byte) error {
	var raw map[string]interface{}
	if err := json.Unmarshal(value, &raw); err != nil {
		return err
	}
	if _, ok := raw["comment"]; raw != nil && !ok {
		return fmt.Errorf("field comment in XdhTestVector: required")
	}
	if _, ok := raw["flags"]; raw != nil && !ok {
		return fmt.Errorf("field flags in XdhTestVector: required")
	}
	if _, ok := raw["private"]; raw != nil && !ok {
		return fmt.Errorf("field private in XdhTestVector: required")
	}
	if _, ok := raw["public"]; raw != nil && !ok {
		return fmt.Errorf("field public in XdhTestVector: required")
	}
	if _, ok := raw["result"]; raw != nil && !ok {
		return fmt.Errorf("field result in XdhTestVector: required")
	}
	if _, ok := raw["shared"]; raw != nil && !ok {
		return fmt.Errorf("field shared in XdhTestVector: required")
	}
	if _, ok := raw["tcId"]; raw != nil && !ok {
		return fmt.Errorf("field tcId in XdhTestVector: required")
	}
	type Plain XdhTestVector
	var plain Plain
	if err := json.Unmarshal(value, &plain); err != nil {
		return err
	}
	*j = XdhTestVector(plain)
	return nil
}
