@@ -54,6 +54,9 @@ func Test_WrapHandler(t *testing.T) {
5454 }
5555
5656 verifier , err := NewHMACSHA256Verifier ("key" , bytes .Repeat ([]byte {0 }, 64 ), NewVerifyConfig (), * NewFields ())
57+ if err != nil {
58+ log .Fatal (err )
59+ }
5760 _ , err = VerifyResponse ("sig1" , * verifier , res )
5861 if err != nil {
5962 log .Fatal (err )
@@ -115,7 +118,7 @@ func ExampleWrapHandler_clientSigns() {
115118}
116119
117120func ExampleWrapHandler_serverSigns () {
118- // Callback to let the server locate its verification key and configuration
121+ // Callback to let the server locate its signing key and configuration
119122 fetchSigner := func (res http.Response , r * http.Request ) (string , * Signer ) {
120123 sigName := "sig1"
121124 signer , _ := NewHMACSHA256Signer ("key" , bytes .Repeat ([]byte {0 }, 64 ), nil ,
@@ -151,3 +154,115 @@ func ExampleWrapHandler_serverSigns() {
151154 fmt .Println ("verified: " , verified )
152155 // output: verified: true
153156}
157+
158+ // test various failures
159+ func TestWrapHandlerServerSigns (t * testing.T ) {
160+ serverSignsTestCase := func (t * testing.T , nilSigner , dontSignResponse , earlyExpires , noSigner , badKey , badAlgs bool , wantBody , wantStatus string ) {
161+ // Callback to let the server locate its signing key and configuration
162+ var signConfig * SignConfig
163+ if ! earlyExpires {
164+ signConfig = nil
165+ } else {
166+ signConfig = NewSignConfig ().SetExpires (2000 )
167+ }
168+ fetchSigner := func (res http.Response , r * http.Request ) (string , * Signer ) {
169+ sigName := "sig1"
170+ signer , _ := NewHMACSHA256Signer ("key" , bytes .Repeat ([]byte {0 }, 64 ), signConfig ,
171+ HeaderList ([]string {"@status" , "bar" , "date" }))
172+ return sigName , signer
173+ }
174+ badFetchSigner := func (res http.Response , r * http.Request ) (string , * Signer ) {
175+ return "just a name" , nil
176+ }
177+
178+ simpleHandler := func (w http.ResponseWriter , r * http.Request ) { // this handler gets wrapped
179+ w .WriteHeader (200 )
180+ w .Header ().Set ("bar" , "baz" )
181+ fmt .Fprintln (w , "Hello, client" )
182+ }
183+
184+ // Configure the wrapper and set it up
185+ var config * HandlerConfig
186+ if ! nilSigner {
187+ if ! noSigner {
188+ config = NewHandlerConfig ().SetVerifyRequest (false ).SetFetchSigner (fetchSigner )
189+ } else {
190+ config = NewHandlerConfig ().SetVerifyRequest (false ).SetFetchSigner (badFetchSigner )
191+ }
192+
193+ } else {
194+ config = NewHandlerConfig ().SetVerifyRequest (false ).SetFetchSigner (nil )
195+
196+ }
197+ if dontSignResponse {
198+ config = config .SetSignResponse (false )
199+ }
200+ ts := httptest .NewServer (WrapHandler (http .HandlerFunc (simpleHandler ), config ))
201+ defer ts .Close ()
202+
203+ // HTTP client code
204+ res , err := http .Get (ts .URL )
205+ if err != nil {
206+ log .Fatal (err )
207+ }
208+ body , err := io .ReadAll (res .Body )
209+ if err != nil {
210+ log .Fatal (err )
211+ }
212+ res .Body .Close ()
213+
214+ if string (body ) != wantBody {
215+ t .Errorf ("Status: got %s want %s" , string (body ), wantBody )
216+ }
217+ if res .Status != wantStatus {
218+ t .Errorf ("Status: got %s want %s" , res .Status , wantStatus )
219+ }
220+
221+ var key []byte
222+ if ! badKey {
223+ key = bytes .Repeat ([]byte {0 }, 64 )
224+ } else {
225+ key = bytes .Repeat ([]byte {3 }, 64 )
226+ }
227+ verifyConfig := NewVerifyConfig ()
228+ if badAlgs {
229+ verifyConfig = verifyConfig .SetAllowedAlgs ([]string {"zuzu" })
230+ }
231+ verifier , _ := NewHMACSHA256Verifier ("key" , key , verifyConfig , * NewFields ())
232+ verified , _ := VerifyResponse ("sig1" , * verifier , res )
233+
234+ if verified {
235+ t .Errorf ("surprise! Verification successful" )
236+ }
237+ }
238+ nilSigner := func (t * testing.T ) {
239+ serverSignsTestCase (t , true , false , false , false , false , false , "Failed to sign response: could not fetch a signer\n " ,
240+ "500 Internal Server Error" )
241+ }
242+ dontSignResponse := func (t * testing.T ) {
243+ serverSignsTestCase (t , false , true , false , false , false , false , "Hello, client\n " ,
244+ "200 OK" )
245+ }
246+ earlyExpires := func (t * testing.T ) {
247+ serverSignsTestCase (t , false , false , true , false , false , false , "Hello, client\n " ,
248+ "200 OK" )
249+ }
250+ noSigner := func (t * testing.T ) {
251+ serverSignsTestCase (t , false , false , false , true , false , false , "Failed to sign response: could not fetch a signer, check key ID\n " ,
252+ "500 Internal Server Error" )
253+ }
254+ badKey := func (t * testing.T ) {
255+ serverSignsTestCase (t , false , false , false , false , true , false , "Hello, client\n " ,
256+ "200 OK" )
257+ }
258+ badAlgs := func (t * testing.T ) {
259+ serverSignsTestCase (t , false , false , false , false , false , true , "Hello, client\n " ,
260+ "200 OK" )
261+ }
262+ t .Run ("nil signer" , nilSigner )
263+ t .Run ("don't sign response" , dontSignResponse )
264+ t .Run ("early expires field" , earlyExpires )
265+ t .Run ("bad fetch signer" , noSigner )
266+ t .Run ("wrong verification key" , badKey )
267+ t .Run ("failed algorithm check" , badAlgs )
268+ }
0 commit comments