// 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.
//
////////////////////////////////////////////////////////////////////////////////

// Package cryptofmt provides constants and convenience methods that define the format of ciphertexts and signatures.
package cryptofmt

import (
	"encoding/binary"
	"fmt"

	tinkpb "github.com/google/tink/proto/tink_go_proto"
)

const (
	// NonRawPrefixSize is the prefix size of Tink and Legacy key types.
	NonRawPrefixSize = 5

	// LegacyPrefixSize is the prefix size of legacy key types.
	// The prefix starts with \x00 and followed by a 4-byte key id.
	LegacyPrefixSize = NonRawPrefixSize
	// LegacyStartByte is the first byte of the prefix of legacy key types.
	LegacyStartByte = byte(0)

	// TinkPrefixSize is the prefix size of Tink key types.
	// The prefix starts with \x01 and followed by a 4-byte key id.
	TinkPrefixSize = NonRawPrefixSize
	// TinkStartByte is the first byte of the prefix of Tink key types.
	TinkStartByte = byte(1)

	// RawPrefixSize is the prefix size of Raw key types.
	// Raw prefix is empty.
	RawPrefixSize = 0
	// RawPrefix is the empty prefix of Raw key types.
	RawPrefix = ""
)

/*
OutputPrefix generates the prefix of ciphertexts produced by the crypto primitive obtained from key.
The prefix can be either empty (for RAW-type prefix), or consists of a 1-byte indicator of the type
of the prefix, followed by 4 bytes of the key ID in big endian encoding.
*/
func OutputPrefix(key *tinkpb.Keyset_Key) (string, error) {
	switch key.OutputPrefixType {
	case tinkpb.OutputPrefixType_LEGACY, tinkpb.OutputPrefixType_CRUNCHY:
		return createOutputPrefix(LegacyPrefixSize, LegacyStartByte, key.KeyId), nil
	case tinkpb.OutputPrefixType_TINK:
		return createOutputPrefix(TinkPrefixSize, TinkStartByte, key.KeyId), nil
	case tinkpb.OutputPrefixType_RAW:
		return RawPrefix, nil
	default:
		return "", fmt.Errorf("crypto_format: unknown output prefix type")
	}
}

func createOutputPrefix(size int, startByte byte, keyID uint32) string {
	prefix := make([]byte, size)
	prefix[0] = startByte
	binary.BigEndian.PutUint32(prefix[1:], keyID)
	return string(prefix)
}
