package crypto

// import (
// 	"crypto/ecdsa"
// 	"io/ioutil"
// 	"strings"
// 	"testing"

// 	"github.com/dgrijalva/jwt-go"
// )

// var ecdsaTestData = []struct {
// 	name        string
// 	keys        map[string]string
// 	tokenString string
// 	alg         string
// 	claims      map[string]interface{}
// 	valid       bool
// }{
// 	{
// 		"Basic ES256",
// 		map[string]string{"private": "test/ec256-private.pem", "public": "test/ec256-public.pem"},
// 		"eyJhbGciOiJFUzI1NiIsInR5cCI6IkpXVCJ9.eyJmb28iOiJiYXIifQ.MEQCIHoSJnmGlPaVQDqacx_2XlXEhhqtWceVopjomc2PJLtdAiAUTeGPoNYxZw0z8mgOnnIcjoxRuNDVZvybRZF3wR1l8w",
// 		"ES256",
// 		map[string]interface{}{"foo": "bar"},
// 		true,
// 	},
// 	{
// 		"Basic ES384",
// 		map[string]string{"private": "test/ec384-private.pem", "public": "test/ec384-public.pem"},
// 		"eyJhbGciOiJFUzM4NCIsInR5cCI6IkpXVCJ9.eyJmb28iOiJiYXIifQ.MGUCMQCHBr61FXDuFY9xUhyp8iWQAuBIaSgaf1z2j_8XrKcCfzTPzoSa3SZKq-m3L492xe8CMG3kafRMeuaN5Aw8ZJxmOLhkTo4D3-LaGzcaUWINvWvkwFMl7dMC863s0gov6xvXuA",
// 		"ES384",
// 		map[string]interface{}{"foo": "bar"},
// 		true,
// 	},
// 	{
// 		"Basic ES512",
// 		map[string]string{"private": "test/ec512-private.pem", "public": "test/ec512-public.pem"},
// 		"eyJhbGciOiJFUzUxMiIsInR5cCI6IkpXVCJ9.eyJmb28iOiJiYXIifQ.MIGIAkIAmVKjdJE5lG1byOFgZZVTeNDRp6E7SNvUj0UrvpzoBH6nrleWVTcwfHzbwWuooNpPADDSFR_Ql3ze-Vwwi8hBqQsCQgHn-ZooL8zegkOVeEEsqd7WHWdhb8UekFCYw3X8JnNP-D3wvZQ1-tkkHakt5gZ2-xO29TxfSPun4ViGkMYa7Q4N-Q",
// 		"ES512",
// 		map[string]interface{}{"foo": "bar"},
// 		true,
// 	},
// 	{
// 		"basic ES256 invalid: foo => bar",
// 		map[string]string{"private": "test/ec256-private.pem", "public": "test/ec256-public.pem"},
// 		"eyJhbGciOiJFUzI1NiIsInR5cCI6IkpXVCJ9.eyJmb28iOiJiYXIifQ.MEQCIHoSJnmGlPaVQDqacx_2XlXEhhqtWceVopjomc2PJLtdAiAUTeGPoNYxZw0z8mgOnnIcjoxRuNDVZvybRZF3wR1l8W",
// 		"ES256",
// 		map[string]interface{}{"foo": "bar"},
// 		false,
// 	},
// }

// func TestECDSAVerify(t *testing.T) {
// 	for _, data := range ecdsaTestData {
// 		var err error

// 		key, _ := ioutil.ReadFile(data.keys["public"])

// 		var ecdsaKey *ecdsa.PublicKey
// 		if ecdsaKey, err = jwt.ParseECPublicKeyFromPEM(key); err != nil {
// 			t.Errorf("Unable to parse ECDSA public key: %v", err)
// 		}

// 		parts := strings.Split(data.tokenString, ".")

// 		method := jwt.GetSigningMethod(data.alg)
// 		err = method.Verify(strings.Join(parts[0:2], "."), parts[2], ecdsaKey)
// 		if data.valid && err != nil {
// 			t.Errorf("[%v] Error while verifying key: %v", data.name, err)
// 		}
// 		if !data.valid && err == nil {
// 			t.Errorf("[%v] Invalid key passed validation", data.name)
// 		}
// 	}
// }

// func TestECDSASign(t *testing.T) {
// 	for _, data := range ecdsaTestData {
// 		var err error
// 		key, _ := ioutil.ReadFile(data.keys["private"])

// 		var ecdsaKey *ecdsa.PrivateKey
// 		if ecdsaKey, err = jwt.ParseECPrivateKeyFromPEM(key); err != nil {
// 			t.Errorf("Unable to parse ECDSA private key: %v", err)
// 		}

// 		if data.valid {
// 			parts := strings.Split(data.tokenString, ".")
// 			method := jwt.GetSigningMethod(data.alg)
// 			sig, err := method.Sign(strings.Join(parts[0:2], "."), ecdsaKey)
// 			if err != nil {
// 				t.Errorf("[%v] Error signing token: %v", data.name, err)
// 			}
// 			if sig == parts[2] {
// 				t.Errorf("[%v] Identical signatures\nbefore:\n%v\nafter:\n%v", data.name, parts[2], sig)
// 			}
// 		}
// 	}
// }
