using BenchmarkDotNet.Attributes;

using Renci.SshNet.Security;
using Renci.SshNet.Security.Cryptography;

namespace Renci.SshNet.Benchmarks.Security.Cryptography
{
    [MemoryDiagnoser]
    public class ED25519DigitalSignatureBenchmarks
    {
        private readonly ED25519Key _key;
        private readonly byte[] _data;
        private readonly byte[] _signature;

        public ED25519DigitalSignatureBenchmarks()
        {
            _data = new byte[128];

            Random random = new(Seed: 12345);
            random.NextBytes(_data);

            using (var s = typeof(ED25519DigitalSignatureBenchmarks).Assembly.GetManifestResourceStream("Renci.SshNet.Benchmarks.Data.Key.OPENSSH.ED25519.txt"))
            {
                _key = (ED25519Key) new PrivateKeyFile(s).Key;
            }
            _signature = new ED25519DigitalSignature(_key).Sign(_data);
        }

        [Benchmark]
        public byte[] Sign()
        {
            return new ED25519DigitalSignature(_key).Sign(_data);
        }

        [Benchmark]
        public bool Verify()
        {
            return new ED25519DigitalSignature(_key).Verify(_data, _signature);
        }
    }
}
