func TestMarshalNonPointer(t *testing.T) { type EmbedsKey struct { Key JSONWebKey } keyJSON := []byte(`{ "e": "AQAB", "kty": "RSA", "n": "vd7rZIoTLEe-z1_8G1FcXSw9CQFEJgV4g9V277sER7yx5Qjz_Pkf2YVth6wwwFJEmzc0hoKY-MMYFNwBE4hQHw" }`) var parsedKey JSONWebKey err := json.Unmarshal(keyJSON, &parsedKey) if err != nil { t.Errorf("Error unmarshalling key: %v", err) return } ek := EmbedsKey{ Key: parsedKey, } out, err := json.Marshal(ek) if err != nil { t.Errorf("Error marshalling JSON: %v", err) return } expected := "{\"Key\":{\"kty\":\"RSA\",\"n\":\"vd7rZIoTLEe-z1_8G1FcXSw9CQFEJgV4g9V277sER7yx5Qjz_Pkf2YVth6wwwFJEmzc0hoKY-MMYFNwBE4hQHw\",\"e\":\"AQAB\"}}" if string(out) != expected { t.Error("Failed to marshal embedded non-pointer JWK properly:", string(out)) } }
// MarshalJSON serializes the given key to its JSON representation. func (k JSONWebKey) MarshalJSON() ([]byte, error) { var raw *rawJSONWebKey var err error switch key := k.Key.(type) { case *ecdsa.PublicKey: raw, err = fromEcPublicKey(key) case *rsa.PublicKey: raw = fromRsaPublicKey(key) case *ecdsa.PrivateKey: raw, err = fromEcPrivateKey(key) case *rsa.PrivateKey: raw, err = fromRsaPrivateKey(key) case []byte: raw, err = fromSymmetricKey(key) default: return nil, fmt.Errorf("square/go-jose: unknown key type '%s'", reflect.TypeOf(key)) } if err != nil { return nil, err } raw.Kid = k.KeyID raw.Alg = k.Algorithm raw.Use = k.Use for _, cert := range k.Certificates { raw.X5c = append(raw.X5c, base64.StdEncoding.EncodeToString(cert.Raw)) } return json.Marshal(raw) }
func (b *encryptedBuilder) encrypt() (*jose.JSONWebEncryption, error) { if b.err != nil { return nil, b.err } p, err := json.Marshal(b.payload) if err != nil { return nil, err } return b.enc.Encrypt(p) }
func (b *signedBuilder) sign() (*jose.JSONWebSignature, error) { if b.err != nil { return nil, b.err } p, err := json.Marshal(b.payload) if err != nil { return nil, err } return b.sig.Sign(p) }
func normalize(i interface{}) (map[string]interface{}, error) { m := make(map[string]interface{}) raw, err := json.Marshal(i) if err != nil { return nil, err } if err := json.Unmarshal(raw, &m); err != nil { return nil, err } return m, nil }
func TestSignerKid(t *testing.T) { kid := "DEADBEEF" payload := []byte("Lorem ipsum dolor sit amet") key, err := ecdsa.GenerateKey(elliptic.P256(), rand.Reader) if err != nil { t.Error("problem generating test signing key", err) } basejwk := JSONWebKey{Key: key} jsonbar, err := basejwk.MarshalJSON() if err != nil { t.Error("problem marshalling base JWK", err) } var jsonmsi map[string]interface{} err = json.Unmarshal(jsonbar, &jsonmsi) if err != nil { t.Error("problem unmarshalling base JWK", err) } jsonmsi["kid"] = kid jsonbar2, err := json.Marshal(jsonmsi) if err != nil { t.Error("problem marshalling kided JWK", err) } var jwk JSONWebKey err = jwk.UnmarshalJSON(jsonbar2) if err != nil { t.Error("problem unmarshalling kided JWK", err) } signer, err := NewSigner(SigningKey{ES256, &jwk}, nil) if err != nil { t.Error("problem creating signer", err) } signed, err := signer.Sign(payload) serialized := signed.FullSerialize() parsed, err := ParseSigned(serialized) if err != nil { t.Error("problem parsing signed object", err) } if parsed.Signatures[0].Header.KeyID != kid { t.Error("KeyID did not survive trip") } }
func TestMarshalUnmarshalJWKSet(t *testing.T) { jwk1 := JSONWebKey{Key: rsaTestKey, KeyID: "ABCDEFG", Algorithm: "foo"} jwk2 := JSONWebKey{Key: rsaTestKey, KeyID: "GFEDCBA", Algorithm: "foo"} var set JSONWebKeySet set.Keys = append(set.Keys, jwk1) set.Keys = append(set.Keys, jwk2) jsonbar, err := json.Marshal(&set) if err != nil { t.Error("problem marshalling set", err) } var set2 JSONWebKeySet err = json.Unmarshal(jsonbar, &set2) if err != nil { t.Error("problem unmarshalling set", err) } jsonbar2, err := json.Marshal(&set2) if err != nil { t.Error("problem marshalling set", err) } if !bytes.Equal(jsonbar, jsonbar2) { t.Error("roundtrip should not lose information") } }
func TestEncodeClaims(t *testing.T) { now := time.Date(2016, 1, 1, 0, 0, 0, 0, time.UTC) c := Claims{ Issuer: "issuer", Subject: "subject", Audience: Audience{"a1", "a2"}, NotBefore: NewNumericDate(time.Time{}), IssuedAt: NewNumericDate(now), Expiry: NewNumericDate(now.Add(1 * time.Hour)), } b, err := json.Marshal(c) assert.NoError(t, err) expected := `{"iss":"issuer","sub":"subject","aud":["a1","a2"],"exp":1451610000,"iat":1451606400}` assert.Equal(t, expected, string(b)) }
func MarshalJSON(v interface{}) ([]byte, error) { return json.Marshal(v) }