package keys import ( "crypto/ecdsa" "crypto/rand" "crypto/x509" "encoding/json" "encoding/pem" "errors" "io" . "gopkg.in/check.v1" ) const ecdsaKey = `-----BEGIN PUBLIC KEY----- MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEftgasQA68yvumeXZmcOTSIHKfbmx WT1oYuRF0Un3tKxnzip6xAYwlz0Dt96DUh+0P7BruHH2O6s4MiRR9/TuNw== -----END PUBLIC KEY----- ` type PKIXSuite struct{} var _ = Suite(&PKIXSuite{}) func (PKIXSuite) TestMarshalJSON(c *C) { block, _ := pem.Decode([]byte(ecdsaKey)) key, err := x509.ParsePKIXPublicKey(block.Bytes) c.Assert(err, IsNil) k := PKIXPublicKey{PublicKey: key} buf, err := json.Marshal(&k) c.Assert(err, IsNil) var val string err = json.Unmarshal(buf, &val) c.Assert(err, IsNil) c.Assert(val, Equals, ecdsaKey) } func (PKIXSuite) TestUnmarshalJSON(c *C) { buf, err := json.Marshal(ecdsaKey) c.Assert(err, IsNil) var k PKIXPublicKey err = json.Unmarshal(buf, &k) c.Assert(err, IsNil) c.Assert(k.PublicKey, FitsTypeOf, (*ecdsa.PublicKey)(nil)) } func (PKIXSuite) TestUnmarshalPKIX_TooLongContent(c *C) { randomSeed := make([]byte, MaxJSONKeySize) _, err := io.ReadFull(rand.Reader, randomSeed) c.Assert(err, IsNil) pemBytes := pem.EncodeToMemory(&pem.Block{ Type: "PUBLIC KEY", Bytes: randomSeed, }) tooLongPayload, err := json.Marshal(string(pemBytes)) c.Assert(err, IsNil) var k PKIXPublicKey err = json.Unmarshal(tooLongPayload, &k) c.Assert(errors.Is(err, io.ErrUnexpectedEOF), Equals, true) }