|  | 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) | 
|  | // 			} | 
|  | // 		} | 
|  | // 	} | 
|  | // } |