func()

in pipe/file.go [384:437]


func (p *fileProducer) initCrypterWriter(filename string, writer io.WriteCloser) (io.WriteCloser, error) {
	if len(p.cfg.Encryption.PublicKey) == 0 {
		return nil, fmt.Errorf("public key is empty. required for producing encrypted stream")
	}
	block, err := armor.Decode(bytes.NewReader([]byte(p.cfg.Encryption.PublicKey)))
	if log.E(err) {
		return nil, err
	}

	if block.Type != openpgp.PublicKeyType {
		return nil, fmt.Errorf("expected public key. got:%s", block.Type)
	}

	encEntity, err := openpgp.ReadEntity(packet.NewReader(block.Body))
	if log.E(err) {
		return nil, err
	}

	block, err = armor.Decode(bytes.NewReader([]byte(p.cfg.Encryption.SigningKey)))
	if log.E(err) {
		return nil, err
	}

	if block.Type != openpgp.PrivateKeyType {
		return nil, fmt.Errorf("expected private key. got:%s", block.Type)
	}

	signEntity, err := openpgp.ReadEntity(packet.NewReader(block.Body))
	if log.E(err) {
		return nil, err
	}

	err = signEntity.PrivateKey.Decrypt([]byte(signKeyPw))
	log.Debugf("signKeyPw %v", err)
	if log.E(err) {
		return nil, err
	}

	log.Debugf("pubKey:  %x", encEntity.PrimaryKey.Fingerprint)
	log.Debugf("signKey: %x", signEntity.PrimaryKey.Fingerprint)

	hints := &openpgp.FileHints{
		IsBinary: true,
		FileName: filename,
		ModTime:  time.Now(),
	}

	writer, err = openpgp.Encrypt(writer, []*openpgp.Entity{encEntity}, signEntity, hints, nil)
	if log.E(err) {
		return nil, err
	}

	return writer, nil
}