package cose_test

import (
	"io"
	"testing"

	"google3/third_party/golang/github_com/veraison/go_cose/v/v0/cose"
)

func newSign1Message() *cose.Sign1Message {
	return &cose.Sign1Message{
		Headers: cose.Headers{
			Protected: cose.ProtectedHeader{
				cose.HeaderLabelAlgorithm: cose.AlgorithmES256,
			},
			Unprotected: cose.UnprotectedHeader{
				cose.HeaderLabelKeyID: 1,
			},
		},
		Payload:   make([]byte, 100),
		Signature: make([]byte, 32),
	}
}

type noSigner struct{}

func (noSigner) Algorithm() cose.Algorithm {
	return cose.AlgorithmES256
}

func (noSigner) Sign(_ io.Reader, digest []byte) ([]byte, error) {
	return digest, nil
}

func (noSigner) Verify(_, _ []byte) error {
	return nil
}

func BenchmarkSign1Message_MarshalCBOR(b *testing.B) {
	msg := newSign1Message()
	b.ReportAllocs()
	b.ResetTimer()
	for i := 0; i < b.N; i++ {
		_, err := msg.MarshalCBOR()
		if err != nil {
			b.Fatal(err)
		}
	}
}

func BenchmarkSign1Message_UnmarshalCBOR(b *testing.B) {
	data, err := newSign1Message().MarshalCBOR()
	if err != nil {
		b.Fatal(err)
	}
	b.ReportAllocs()
	b.ResetTimer()
	for i := 0; i < b.N; i++ {
		var m cose.Sign1Message
		err = m.UnmarshalCBOR(data)
		if err != nil {
			b.Fatal(err)
		}
	}
}

func BenchmarkSign1Message_Sign(b *testing.B) {
	msg := newSign1Message()
	b.ReportAllocs()
	b.ResetTimer()
	for i := 0; i < b.N; i++ {
		msg.Signature = nil
		err := msg.Sign(zeroSource{}, nil, noSigner{})
		if err != nil {
			b.Fatal(err)
		}
	}
}

func BenchmarkSign1Message_Verify(b *testing.B) {
	msg := newSign1Message()
	b.ReportAllocs()
	b.ResetTimer()
	for i := 0; i < b.N; i++ {
		err := msg.Verify(nil, noSigner{})
		if err != nil {
			b.Fatal(err)
		}
	}
}
