@@ -390,14 +390,6 @@ func EncodeMultiWithHeader(w io.Writer, privateKeys []*packet.PrivateKey, config
390
390
}
391
391
392
392
hashType := config .Hash ()
393
- name := nameOfHash (hashType )
394
- if len (name ) == 0 {
395
- return nil , errors .UnsupportedError ("unknown hash type: " + strconv .Itoa (int (hashType )))
396
- }
397
-
398
- if ! hashType .Available () {
399
- return nil , errors .UnsupportedError ("unsupported hash type: " + strconv .Itoa (int (hashType )))
400
- }
401
393
402
394
var hashers []hash.Hash
403
395
var hashTypes []crypto.Hash
@@ -444,11 +436,8 @@ func EncodeMultiWithHeader(w io.Writer, privateKeys []*packet.PrivateKey, config
444
436
nonV6 := len (salts ) < len (hashers )
445
437
// Crypto refresh: Headers SHOULD NOT be emitted
446
438
if nonV6 { // Emit header if non v6 signatures are present for compatibility
447
- if _ , err = buffered .WriteString (fmt .Sprintf ("%s: %s" , hashHeader , name )); err != nil {
448
- return
449
- }
450
- if err = buffered .WriteByte (lf ); err != nil {
451
- return
439
+ if err := writeHashHeader (buffered , hashTypes ); err != nil {
440
+ return nil , err
452
441
}
453
442
}
454
443
if err = buffered .WriteByte (lf ); err != nil {
@@ -482,6 +471,40 @@ func (b *Block) VerifySignature(keyring openpgp.KeyRing, config *packet.Config)
482
471
return
483
472
}
484
473
474
+ // writeHashHeader writes the legacy cleartext hash header to buffered.
475
+ func writeHashHeader (buffered * bufio.Writer , hashTypes []crypto.Hash ) error {
476
+ seen := make (map [string ]bool , len (hashTypes ))
477
+ if _ , err := buffered .WriteString (fmt .Sprintf ("%s: " , hashHeader )); err != nil {
478
+ return err
479
+ }
480
+
481
+ for index , sigHashType := range hashTypes {
482
+ first := index == 0
483
+ name := nameOfHash (sigHashType )
484
+ if len (name ) == 0 {
485
+ return errors .UnsupportedError ("unknown hash type: " + strconv .Itoa (int (sigHashType )))
486
+ }
487
+
488
+ switch {
489
+ case ! seen [name ] && first :
490
+ if _ , err := buffered .WriteString (name ); err != nil {
491
+ return err
492
+ }
493
+ case ! seen [name ]:
494
+ if _ , err := buffered .WriteString (fmt .Sprintf (",%s" , name )); err != nil {
495
+ return err
496
+ }
497
+ }
498
+ seen [name ] = true
499
+ }
500
+
501
+ if err := buffered .WriteByte (lf ); err != nil {
502
+ return err
503
+ }
504
+
505
+ return nil
506
+ }
507
+
485
508
// nameOfHash returns the OpenPGP name for the given hash, or the empty string
486
509
// if the name isn't known. See RFC 4880, section 9.4.
487
510
func nameOfHash (h crypto.Hash ) string {
0 commit comments