// SignWithSigner signs the message of type sigType with s and writes the // signature to w. // If config is nil, sensible defaults will be used. func SignWithSigner(s packet.Signer, w io.Writer, message io.Reader, sigType packet.SignatureType, config *packet.Config) (err error) { keyId := s.KeyId() sig := new(packet.Signature) sig.SigType = sigType sig.PubKeyAlgo = s.PublicKeyAlgo() sig.Hash = config.Hash() sig.CreationTime = config.Now() sig.IssuerKeyId = &keyId s.Reset() wrapped := s.(hash.Hash) if sigType == packet.SigTypeText { wrapped = NewCanonicalTextHash(s) } io.Copy(wrapped, message) err = sig.Sign(s, nil, config) if err != nil { return } err = sig.Serialize(w) return }
func detachSign(w io.Writer, signer *Entity, message io.Reader, sigType packet.SignatureType, config *packet.Config) (err error) { signerSubkey, ok := signer.signingKey(config.Now()) if !ok { err = errors.InvalidArgumentError("no valid signing keys") return } if signerSubkey.PrivateKey == nil { return errors.InvalidArgumentError("signing key doesn't have a private key") } if signerSubkey.PrivateKey.Encrypted { return errors.InvalidArgumentError("signing key is encrypted") } sig := new(packet.Signature) sig.SigType = sigType sig.PubKeyAlgo = signerSubkey.PrivateKey.PubKeyAlgo sig.Hash = config.Hash() sig.CreationTime = config.Now() sig.IssuerKeyId = &signerSubkey.PrivateKey.KeyId h, wrappedHash, err := hashForSignature(sig.Hash, sig.SigType) if err != nil { return } io.Copy(wrappedHash, message) err = sig.Sign(h, signerSubkey.PrivateKey, config) if err != nil { return } return sig.Serialize(w) }
func (d *dashEscaper) Close() (err error) { if !d.atBeginningOfLine { if err = d.buffered.WriteByte(lf); err != nil { return } } sig := new(packet.Signature) sig.SigType = packet.SigTypeText sig.PubKeyAlgo = d.privateKey.PubKeyAlgo sig.Hash = d.hashType sig.CreationTime = d.config.Now() sig.IssuerKeyId = &d.privateKey.KeyId if err = sig.Sign(d.h, d.privateKey, d.config); err != nil { return } out, err := armor.Encode(d.buffered, "PGP SIGNATURE", nil) if err != nil { return } if err = sig.Serialize(out); err != nil { return } if err = out.Close(); err != nil { return } if err = d.buffered.Flush(); err != nil { return } return }