// Copyright 2016 The Roughtime Authors.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//   http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License. */

// Modifications copyright 2023 Cloudflare, Inc. This file has been modified to
// allow the server config to indicate whether it supports IETF-Roughtime.

// Package config contains JSON structs for encoding information about
// Roughtime servers.
package config

// ServersJSON represents a JSON format for distributing information about
// Roughtime servers.
type ServersJSON struct {
	Servers []Server `json:"servers"`
}

// Server represents a Roughtime server in a JSON configuration.
type Server struct {
	Name string `json:"name"`
	// Version indicates whether the server is known to support the IETF
	// version ("IETF-Roughtime") or only the legacy version
	// ("Google-Roughtime"). If unspecified, then legacy should be assumed.
	Version string `json:"version"`
	// PublicKeyType specifies the type of the public key contained in
	// |PublicKey|. Normally this will be "ed25519" but implementations
	// should ignore entries with unknown key types.
	PublicKeyType string          `json:"publicKeyType"`
	PublicKey     []byte          `json:"publicKey"`
	Addresses     []ServerAddress `json:"addresses"`
}

// ServerAddress represents the address of a Roughtime server in a JSON
// configuration.
type ServerAddress struct {
	Protocol string `json:"protocol"`
	// Address contains a protocol specific address. For the protocol
	// "udp", the address has the form "host:port" where host is either a
	// DNS name, an IPv4 literal, or an IPv6 literal in square brackets.
	Address string `json:"address"`
}

// Chain represents a history of Roughtime queries where each provably follows
// the previous one.
type Chain struct {
	Links []Link `json:"links"`
}

// Link represents an entry in a Chain.
type Link struct {
	// PublicKeyType specifies the type of public key contained in
	// |PublicKey|. See the same field in |Server| for details.
	PublicKeyType string `json:"publicKeyType"`
	PublicKey     []byte `json:"serverPublicKey"`
	// NonceOrBlind contains either the full nonce (only for the first
	// |Link| in a |Chain|) or else contains a blind value that is combined
	// with the previous reply to make the next nonce. In either case, the
	// value is 64 bytes long.
	NonceOrBlind []byte `json:"nonceOrBlind"`
	// Reply contains the reply from the server.
	Reply []byte `json:"reply"`
}
