@@ -219,22 +219,28 @@ func GetRequestSignature(req *http.Request, signatureName string) (string, error
219219 if err != nil {
220220 return "" , err
221221 }
222- ws , found := parsedMessage .components [* fromHeaderName ("signature" )]
222+ ws , found := parsedMessage .components [* fromDictHeader ("signature" , signatureName )]
223223 if ! found {
224- return "" , fmt .Errorf ("missing \" signature\" header" )
224+ return "" , fmt .Errorf ("missing \" signature\" header for \" %s\" " , signatureName )
225+ }
226+ if len (ws ) > 1 {
227+ return "" , fmt .Errorf ("more than one \" signature\" value for \" %s\" " , signatureName )
225228 }
226229 sigHeader := ws [0 ]
227- sigRaw , err := parseWantSignature (sigHeader , signatureName )
230+ sigRaw , err := parseWantSignature (sigHeader )
228231 if err != nil {
229232 return "" , err
230233 }
231234 return encodeBytes (sigRaw ), nil
232235}
233236
234237func messageKeyID (signatureName string , parsedMessage parsedMessage ) (keyID , alg string , err error ) {
235- si , found := parsedMessage .components [* fromHeaderName ("signature-input" )]
238+ si , found := parsedMessage .components [* fromDictHeader ("signature-input" , signatureName )]
236239 if ! found {
237- return "" , "" , fmt .Errorf ("missing \" signature-input\" header" )
240+ return "" , "" , fmt .Errorf ("missing \" signature-input\" header, or cannot find \" %s\" " , signatureName )
241+ }
242+ if len (si ) > 1 {
243+ return "" , "" , fmt .Errorf ("more than one \" signature-input\" for %s" , signatureName )
238244 }
239245 signatureInput := si [0 ]
240246 psi , err := parseSignatureInput (signatureInput , signatureName )
@@ -278,23 +284,29 @@ func VerifyResponse(signatureName string, verifier Verifier, res *http.Response)
278284}
279285
280286func verifyMessage (config VerifyConfig , name string , verifier Verifier , message parsedMessage , fields Fields ) error {
281- wsi , found := message .components [* fromHeaderName ("signature-input" )]
287+ wsi , found := message .components [* fromDictHeader ("signature-input" , name )]
282288 if ! found {
283- return fmt .Errorf ("missing \" signature-input\" header" )
289+ return fmt .Errorf ("missing \" signature-input\" header, or cannot find signature \" %s\" " , name )
290+ }
291+ if len (wsi ) > 1 {
292+ return fmt .Errorf ("multiple \" signature-header\" values for %s" , name )
284293 }
285294 wantSignatureInput := wsi [0 ]
286- ws , found := message .components [* fromHeaderName ("signature" )]
295+ ws , found := message .components [* fromDictHeader ("signature" , name )]
287296 if ! found {
288297 return fmt .Errorf ("missing \" signature\" header" )
289298 }
299+ if len (ws ) > 1 {
300+ return fmt .Errorf ("multiple \" signature\" values for %s" , name )
301+ }
290302 wantSignature := ws [0 ]
291- delete (message .components , * fromHeaderName ("signature-input" ))
292- delete (message .components , * fromHeaderName ("signature" ))
303+ delete (message .components , * fromDictHeader ("signature-input" , name ))
304+ delete (message .components , * fromDictHeader ("signature" , name ))
293305 err := validateFields (fields )
294306 if err != nil {
295307 return err
296308 }
297- wantSigRaw , err := parseWantSignature (wantSignature , name )
309+ wantSigRaw , err := parseWantSignature (wantSignature )
298310 if err != nil {
299311 return err
300312 }
@@ -386,83 +398,59 @@ type psiSignature struct {
386398 params map [string ]interface {}
387399}
388400
389- type parsedSignatureInput struct {
390- signatures []psiSignature
391- }
392-
393- func parseSignatureInput (input string , name string ) (* psiSignature , error ) {
394- psi := parsedSignatureInput {}
395- sigs , err := httpsfv .UnmarshalDictionary ([]string {input })
401+ func parseSignatureInput (input string , sigName string ) (* psiSignature , error ) {
402+ sigs , err := httpsfv .UnmarshalDictionary ([]string {sigName + "=" + input }) // yes this is a hack, there is no UnmarshalInnerList
396403 if err != nil {
397- return nil , fmt .Errorf ("could not parse Signature-Input as list : %w" , err )
404+ return nil , fmt .Errorf ("could not parse Signature-Input as dictionary : %w" , err )
398405 }
399- for _ , name := range sigs .Names () {
400- memberForName , ok := sigs .Get (name )
401- if ! ok {
402- return nil , fmt .Errorf ("could not parse Signature-Input for signature %s" , name )
403- }
404- fieldsList , ok := memberForName .(httpsfv.InnerList )
405- osp , err := httpsfv .Marshal (fieldsList ) // undocumented functionality
406- if err != nil {
407- return nil , fmt .Errorf ("could not marshal inner list: %w" , err )
408- }
406+ memberForName , _ := sigs .Get (sigName )
407+ fieldsList , ok := memberForName .(httpsfv.InnerList )
408+ osp , err := httpsfv .Marshal (fieldsList ) // undocumented functionality
409+ if err != nil {
410+ return nil , fmt .Errorf ("could not marshal inner list: %w" , err )
411+ }
412+ if ! ok {
413+ return nil , fmt .Errorf ("Signature-Input: signature %s does not have an inner list" , sigName )
414+ }
415+ var f Fields
416+ for _ , ff := range fieldsList .Items {
417+ fname , ok := ff .Value .(string )
409418 if ! ok {
410- return nil , fmt .Errorf ("Signature-Input: signature %s does not have an inner list" , name )
411- }
412- var f Fields
413- for _ , ff := range fieldsList .Items {
414- fname , ok := ff .Value .(string )
415- if ! ok {
416- return nil , fmt .Errorf ("Signature-Input: value is not a string" )
417- }
418- if ff .Params == nil || len (ff .Params .Names ()) == 0 {
419- f = append (f , * fromHeaderName (fname ))
420- } else {
421- if len (ff .Params .Names ()) > 1 {
422- return nil , fmt .Errorf ("more than one param for \" %s\" " , fname )
423- }
424- flagNames := ff .Params .Names ()
425- flagName := flagNames [0 ]
426- flagValue , _ := ff .Params .Get (flagName )
427- fv := flagValue .(string )
428- f = append (f , field {
429- name : fname ,
430- flagName : flagName ,
431- flagValue : fv ,
432- })
433- }
419+ return nil , fmt .Errorf ("Signature-Input: value is not a string" )
434420 }
435- params := map [string ]interface {}{}
436- ps := fieldsList .Params
437- for _ , p := range (* ps ).Names () {
438- pp , ok := ps .Get (p )
439- if ! ok {
440- return nil , fmt .Errorf ("could not read param \" %s\" " , p )
421+ if ff .Params == nil || len (ff .Params .Names ()) == 0 {
422+ f = append (f , * fromHeaderName (fname ))
423+ } else {
424+ if len (ff .Params .Names ()) > 1 {
425+ return nil , fmt .Errorf ("more than one param for \" %s\" " , fname )
441426 }
442- params [p ] = pp
427+ flagNames := ff .Params .Names ()
428+ flagName := flagNames [0 ]
429+ flagValue , _ := ff .Params .Get (flagName )
430+ fv := flagValue .(string )
431+ f = append (f , field {
432+ name : fname ,
433+ flagName : flagName ,
434+ flagValue : fv ,
435+ })
443436 }
444- psi .signatures = append (psi .signatures , psiSignature {name , osp , f , params })
445437 }
446- for _ , s := range psi .signatures {
447- if s .signatureName == name {
448- return & s , nil
438+ params := map [string ]interface {}{}
439+ ps := fieldsList .Params
440+ for _ , p := range (* ps ).Names () {
441+ pp , ok := ps .Get (p )
442+ if ! ok {
443+ return nil , fmt .Errorf ("could not read param \" %s\" " , p )
449444 }
445+ params [p ] = pp
450446 }
451- return nil , fmt . Errorf ( "couldn't find signature input for \" %s \" " , name )
447+ return & psiSignature { sigName , osp , f , params }, nil
452448}
453449
454- func parseWantSignature (wantSignature string , name string ) ([]byte , error ) {
455- parsedSignature , err := httpsfv .UnmarshalDictionary ([]string {wantSignature })
450+ func parseWantSignature (wantSignature string ) ([]byte , error ) {
451+ wantSigItem , err := httpsfv .UnmarshalItem ([]string {wantSignature })
456452 if err != nil {
457- return nil , fmt .Errorf ("could not parse signature field: %w" , err )
458- }
459- wantSigValue , found := parsedSignature .Get (name )
460- if ! found {
461- return nil , fmt .Errorf ("could not find signature \" %s\" " , name )
462- }
463- wantSigItem , ok := wantSigValue .(httpsfv.Item )
464- if ! ok {
465- return nil , fmt .Errorf ("unexpected value in signature field" )
453+ return nil , fmt .Errorf ("unexpected value in signature field: %s" , err )
466454 }
467455 wantSigRaw , ok := wantSigItem .Value .([]byte )
468456 if ! ok {
0 commit comments