...

Source file src/github.com/lestrrat-go/jwx/jws/message_test.go

Documentation: github.com/lestrrat-go/jwx/jws

     1  package jws_test
     2  
     3  import (
     4  	"testing"
     5  
     6  	"github.com/lestrrat-go/jwx/internal/base64"
     7  	"github.com/lestrrat-go/jwx/internal/json"
     8  	"github.com/lestrrat-go/jwx/jwa"
     9  	"github.com/lestrrat-go/jwx/jws"
    10  	"github.com/stretchr/testify/assert"
    11  )
    12  
    13  func TestMessage(t *testing.T) {
    14  	t.Run("JSON", func(t *testing.T) {
    15  		const src = `{
    16    "payload": "eyJpc3MiOiJqb2UiLA0KICJleHAiOjEzMDA4MTkzODAsDQogImh0dHA6Ly9leGFtcGxlLmNvbS9pc19yb290Ijp0cnVlfQ",
    17    "signatures": [
    18      {
    19        "header": {
    20          "kid": "2010-12-29"
    21        },
    22        "protected": "eyJhbGciOiJSUzI1NiJ9",
    23        "signature": "cC4hiUPoj9Eetdgtv3hF80EGrhuB__dzERat0XF9g2VtQgr9PJbu3XOiZj5RZmh7AAuHIm4Bh-0Qc_lF5YKt_O8W2Fp5jujGbds9uJdbF9CUAr7t1dnZcAcQjbKBYNX4BAynRFdiuB--f_nZLgrnbyTyWzO75vRK5h6xBArLIARNPvkSjtQBMHlb1L07Qe7K0GarZRmB_eSN9383LcOLn6_dO--xi12jzDwusC-eOkHWEsqtFZESc6BfI7noOPqvhJ1phCnvWh6IeYI2w9QOYEUipUTI8np6LbgGY9Fs98rqVt5AXLIhWkWywlVmtVrBp0igcN_IoypGlUPQGe77Rw"
    24      },
    25      {
    26        "header": {
    27          "kid": "e9bc097a-ce51-4036-9562-d2ade882db0d"
    28        },
    29        "protected": "eyJhbGciOiJFUzI1NiJ9",
    30        "signature": "DtEhU3ljbEg8L38VWAfUAqOyKAM6-Xx-F4GawxaepmXFCgfTjDxw5djxLa8ISlSApmWQxfKTUJqPP3-Kg6NU1Q"
    31      }
    32    ]
    33  }`
    34  
    35  		var m jws.Message
    36  		if !assert.NoError(t, json.Unmarshal([]byte(src), &m), `json.Unmarshal should succeed`) {
    37  			return
    38  		}
    39  
    40  		buf, err := json.MarshalIndent(m, "", "  ")
    41  		if !assert.NoError(t, err, `json.Marshal should succeed`) {
    42  			return
    43  		}
    44  
    45  		if !assert.Equal(t, src, string(buf), `roundtrip should match`) {
    46  			return
    47  		}
    48  	})
    49  	t.Run("Construction/Manipulation", func(t *testing.T) {
    50  		const payload = `eyJpc3MiOiJqb2UiLA0KICJleHAiOjEzMDA4MTkzODAsDQogImh0dHA6Ly9leGFtcGxlLmNvbS9pc19yb290Ijp0cnVlfQ`
    51  		const encodedSig1 = `cC4hiUPoj9Eetdgtv3hF80EGrhuB__dzERat0XF9g2VtQgr9PJbu3XOiZj5RZmh7AAuHIm4Bh-0Qc_lF5YKt_O8W2Fp5jujGbds9uJdbF9CUAr7t1dnZcAcQjbKBYNX4BAynRFdiuB--f_nZLgrnbyTyWzO75vRK5h6xBArLIARNPvkSjtQBMHlb1L07Qe7K0GarZRmB_eSN9383LcOLn6_dO--xi12jzDwusC-eOkHWEsqtFZESc6BfI7noOPqvhJ1phCnvWh6IeYI2w9QOYEUipUTI8np6LbgGY9Fs98rqVt5AXLIhWkWywlVmtVrBp0igcN_IoypGlUPQGe77Rw`
    52  		const encodedSig2 = "DtEhU3ljbEg8L38VWAfUAqOyKAM6-Xx-F4GawxaepmXFCgfTjDxw5djxLa8ISlSApmWQxfKTUJqPP3-Kg6NU1Q"
    53  
    54  		decodedPayload, err := base64.DecodeString(payload)
    55  		if !assert.NoError(t, err, `base64.DecodeString should succeed (payload)`) {
    56  			return
    57  		}
    58  
    59  		decodedSig1, err := base64.DecodeString(encodedSig1)
    60  		if !assert.NoError(t, err, `base64.DecodeString should succeed (sig1)`) {
    61  			return
    62  		}
    63  
    64  		decodedSig2, err := base64.DecodeString(encodedSig2)
    65  		if !assert.NoError(t, err, `base64.DecodeString should succeed (sig2)`) {
    66  			return
    67  		}
    68  
    69  		public1 := jws.NewHeaders()
    70  		_ = public1.Set(jws.AlgorithmKey, jwa.RS256)
    71  		protected1 := jws.NewHeaders()
    72  		_ = protected1.Set(jws.KeyIDKey, "2010-12-29")
    73  
    74  		public2 := jws.NewHeaders()
    75  		_ = public2.Set(jws.AlgorithmKey, jwa.ES256)
    76  		protected2 := jws.NewHeaders()
    77  		_ = protected2.Set(jws.KeyIDKey, "e9bc097a-ce51-4036-9562-d2ade882db0d")
    78  
    79  		m := jws.NewMessage().
    80  			SetPayload(decodedPayload).
    81  			AppendSignature(
    82  				jws.NewSignature().
    83  					SetSignature(decodedSig1).
    84  					SetProtectedHeaders(public1).
    85  					SetPublicHeaders(protected1),
    86  			).
    87  			AppendSignature(
    88  				jws.NewSignature().
    89  					SetSignature(decodedSig2).
    90  					SetProtectedHeaders(public2).
    91  					SetPublicHeaders(protected2),
    92  			)
    93  
    94  		const expected = `{
    95    "payload": "eyJpc3MiOiJqb2UiLA0KICJleHAiOjEzMDA4MTkzODAsDQogImh0dHA6Ly9leGFtcGxlLmNvbS9pc19yb290Ijp0cnVlfQ",
    96    "signatures": [
    97      {
    98        "header": {
    99          "kid": "2010-12-29"
   100        },
   101        "protected": "eyJhbGciOiJSUzI1NiJ9",
   102        "signature": "cC4hiUPoj9Eetdgtv3hF80EGrhuB__dzERat0XF9g2VtQgr9PJbu3XOiZj5RZmh7AAuHIm4Bh-0Qc_lF5YKt_O8W2Fp5jujGbds9uJdbF9CUAr7t1dnZcAcQjbKBYNX4BAynRFdiuB--f_nZLgrnbyTyWzO75vRK5h6xBArLIARNPvkSjtQBMHlb1L07Qe7K0GarZRmB_eSN9383LcOLn6_dO--xi12jzDwusC-eOkHWEsqtFZESc6BfI7noOPqvhJ1phCnvWh6IeYI2w9QOYEUipUTI8np6LbgGY9Fs98rqVt5AXLIhWkWywlVmtVrBp0igcN_IoypGlUPQGe77Rw"
   103      },
   104      {
   105        "header": {
   106          "kid": "e9bc097a-ce51-4036-9562-d2ade882db0d"
   107        },
   108        "protected": "eyJhbGciOiJFUzI1NiJ9",
   109        "signature": "DtEhU3ljbEg8L38VWAfUAqOyKAM6-Xx-F4GawxaepmXFCgfTjDxw5djxLa8ISlSApmWQxfKTUJqPP3-Kg6NU1Q"
   110      }
   111    ]
   112  }`
   113  
   114  		buf, err := json.MarshalIndent(m, "", "  ")
   115  		if !assert.NoError(t, err, `json.MarshalIndent should succeed`) {
   116  			return
   117  		}
   118  
   119  		if !assert.Equal(t, expected, string(buf), `output should match`) {
   120  			return
   121  		}
   122  	})
   123  }
   124  

View as plain text